1 /*
2  * Copyright (c) 2001, 2003  Motoyuki Kasahara
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  * 3. Neither the name of the project nor the names of its contributors
13  *    may be used to endorse or promote products derived from this software
14  *    without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #ifndef DUMMYIN6_H
30 #define DUMMYIN6_H
31 
32 #ifdef HAVE_CONFIG_H
33 #include "config.h"
34 #endif
35 
36 #include <sys/types.h>
37 #include <sys/socket.h>
38 #include <netinet/in.h>
39 #include <netdb.h>
40 
41 #ifndef AF_INET6
42 #define AF_INET6 (AF_INET + 1)
43 #endif
44 
45 #ifndef PF_INET6
46 #define PF_INET6 (PF_INET + 1)
47 #endif
48 
49 #ifndef AF_UNSPEC
50 #define AF_UNSPEC AF_INET
51 #endif
52 
53 #ifndef PF_UNSPEC
54 #define PF_UNSPEC PF_INET
55 #endif
56 
57 #ifndef INET6_ADDRSTRLEN
58 #define INET6_ADDRSTRLEN	46
59 #endif
60 
61 #ifndef INET_ADDRSTRLEN
62 #define INET_ADDRSTRLEN		16
63 #endif
64 
65 #ifndef HAVE_STRUCT_IN6_ADDR
66 struct in6_addr {
67     unsigned char	s6_addr[16];
68 };
69 #endif
70 
71 #ifndef HAVE_STRUCT_SOCKADDR_IN6
72 struct sockaddr_in6 {
73     sa_family_t		sin6_family;
74     in_port_t		sin6_port;
75     unsigned long	sin6_flowinfo;
76     struct in6_addr	sin6_addr;
77     unsigned long	sin6_scope_id;
78 };
79 #endif
80 
81 #if !defined(HAVE_STRUCT_SOCKADDR_STORAGE) && !defined(sockaddr_storage)
82 #define sockaddr_storage sockaddr_in
83 #endif
84 
85 #ifndef IN6ADDR_ANY_DECLARED
86 extern const struct in6_addr in6addr_any;
87 #endif
88 
89 #ifndef IN6ADDR_LOOPBACK_DECLARED
90 extern const struct in6_addr in6addr_loopback;
91 #endif
92 
93 #ifndef IN6ADDR_ANY_INIT
94 #define IN6ADDR_ANY_INIT \
95 	{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
96 	  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
97 #endif
98 
99 #ifndef IN6ADDR_LOOPBACK_INIT
100 #define IN6ADDR_LOOPBACK_INIT \
101 	{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
102 	  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}
103 #endif
104 
105 #ifndef IN6_IS_ADDR_UNSPECIFIED
106 #define IN6_IS_ADDR_UNSPECIFIED(a) \
107 	(   (a)->s6_addr[ 0] == 0 && (a)->s6_addr[ 1] == 0 \
108 	 && (a)->s6_addr[ 2] == 0 && (a)->s6_addr[ 3] == 0 \
109 	 && (a)->s6_addr[ 4] == 0 && (a)->s6_addr[ 5] == 0 \
110 	 && (a)->s6_addr[ 6] == 0 && (a)->s6_addr[ 7] == 0 \
111 	 && (a)->s6_addr[ 8] == 0 && (a)->s6_addr[ 9] == 0 \
112 	 && (a)->s6_addr[10] == 0 && (a)->s6_addr[11] == 0 \
113 	 && (a)->s6_addr[12] == 0 && (a)->s6_addr[13] == 0 \
114 	 && (a)->s6_addr[14] == 0 && (a)->s6_addr[15] == 0)
115 #endif
116 
117 #ifndef IN6_IS_ADDR_LOOPBACK
118 #define IN6_IS_ADDR_LOOPBACK(a) \
119 	(   (a)->s6_addr[ 0] == 0 && (a)->s6_addr[ 1] == 0 \
120 	 && (a)->s6_addr[ 2] == 0 && (a)->s6_addr[ 3] == 0 \
121 	 && (a)->s6_addr[ 4] == 0 && (a)->s6_addr[ 5] == 0 \
122 	 && (a)->s6_addr[ 6] == 0 && (a)->s6_addr[ 7] == 0 \
123 	 && (a)->s6_addr[ 8] == 0 && (a)->s6_addr[ 9] == 0 \
124 	 && (a)->s6_addr[10] == 0 && (a)->s6_addr[11] == 0 \
125 	 && (a)->s6_addr[12] == 0 && (a)->s6_addr[13] == 0 \
126 	 && (a)->s6_addr[14] == 0 && (a)->s6_addr[15] == 1)
127 #endif
128 
129 #ifndef IN6_IS_ADDR_MULTICAST
130 #define IN6_IS_ADDR_MULTICAST(a) \
131 	((a)->s6_addr[0] == 0xff)
132 #endif
133 
134 #ifndef IN6_IS_ADDR_LINKLOCAL
135 #define IN6_IS_ADDR_LINKLOCAL(a) \
136 	(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
137 #endif
138 
139 #ifndef IN6_IS_ADDR_SITELOCAL
140 #define IN6_IS_ADDR_SITELOCAL(a) \
141 	(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
142 #endif
143 
144 #ifndef IN6_IS_ADDR_V4MAPPED
145 #define IN6_IS_ADDR_V4MAPPED(a) \
146 	(   (a)->s6_addr[ 0] == 0    && (a)->s6_addr[ 1] == 0 \
147 	 && (a)->s6_addr[ 2] == 0    && (a)->s6_addr[ 3] == 0 \
148 	 && (a)->s6_addr[ 4] == 0    && (a)->s6_addr[ 5] == 0 \
149 	 && (a)->s6_addr[ 6] == 0    && (a)->s6_addr[ 7] == 0 \
150 	 && (a)->s6_addr[ 8] == 0    && (a)->s6_addr[ 9] == 0 \
151 	 && (a)->s6_addr[10] == 0xff && (a)->s6_addr[11] == 0xff)
152 #endif
153 
154 #ifndef IN6_IS_ADDR_V4COMPAT
155 #define IN6_IS_ADDR_V4COMPAT(a) \
156 	(   (a)->s6_addr[ 0] == 0 && (a)->s6_addr[ 1] == 0 \
157 	 && (a)->s6_addr[ 2] == 0 && (a)->s6_addr[ 3] == 0 \
158 	 && (a)->s6_addr[ 4] == 0 && (a)->s6_addr[ 5] == 0 \
159 	 && (a)->s6_addr[ 6] == 0 && (a)->s6_addr[ 7] == 0 \
160 	 && (a)->s6_addr[ 8] == 0 && (a)->s6_addr[ 9] == 0 \
161 	 && (a)->s6_addr[10] == 0 && (a)->s6_addr[11] == 0 \
162 	 && ((a)->s6_addr[12] != 0 || (a)->s6_addr[13] != 0 \
163 	     || (a)->s6_addr[14] != 0 \
164 	     || ((a)->s6_addr[15] != 0 && (a)->s6_addr[15] != 1)))
165 #endif
166 
167 #endif /* not DUMMYIN6_H */
168