1 /*
2 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
4 */
5
6 #pragma ident "%Z%%M% %I% %E% SMI"
7
8 #ifndef PORT_AFTER_H
9 #define PORT_AFTER_H
10 #include "os_version.h"
11
12 #undef HAVE_SA_LEN
13 #define USE_POSIX
14 #define POSIX_SIGNALS
15 #define NETREAD_BROKEN
16 #define USE_WAITPID
17 #define HAVE_FCHMOD
18 #define NEED_PSELECT
19 #define SETGRENT_VOID
20 #define SETPWENT_VOID
21 #define SIOCGIFCONF_ADDR
22 #define IP_OPT_BUF_SIZE 40
23 #define HAVE_CHROOT
24 #define CAN_CHANGE_ID
25 #define POSIX_GETPWNAM_R
26 #define POSIX_GETPWUID_R
27 #define POSIX_GETGRGID_R
28 #define POSIX_GETGRNAM_R
29 #define NEED_SECURE_DIRECTORY
30 #define HAVE_DEV_RANDOM
31 #define NO_MSG_CONTROL
32
33 #define PORT_NONBLOCK O_NONBLOCK
34 #define PORT_WOULDBLK EWOULDBLOCK
35 #define WAIT_T int
36 #ifndef SUNW_LIBNSL
37 #define INADDR_NONE 0xffffffff
38 #endif
39
40 #include <sys/types.h>
41 #include <sys/socket.h>
42 #include <sys/param.h>
43 #if (!defined(BSD)) || (BSD < 199306)
44 #include <sys/bitypes.h>
45 #endif
46 #include <sys/time.h>
47
48 #ifndef MIN
49 #define MIN(x, y) ((x > y) ?y :x)
50 #endif
51 #ifndef MAX
52 #define MAX(x, y) ((x > y) ?x :y)
53 #endif
54
55 /*
56 * We need to know the IPv6 address family number even on IPv4-only systems.
57 * Note that this is NOT a protocol constant, and that if the system has its
58 * own AF_INET6, different from ours below, all of BIND's libraries and
59 * executables will need to be recompiled after the system <sys/socket.h>
60 * has had this type added. The type number below is correct on most BSD-
61 * derived systems for which AF_INET6 is defined.
62 */
63 #ifndef AF_INET6
64 #define AF_INET6 24
65 #endif
66
67 #ifndef PF_INET6
68 #define PF_INET6 AF_INET6
69 #endif
70 #include <port_ipv6.h>
71
72 #ifndef HAS_INET6_STRUCTS
73 /* Replace with structure from later rev of O/S if known. */
74 struct in6_addr {
75 u_int8_t s6_addr[16];
76 };
77
78 /* Replace with structure from later rev of O/S if known. */
79 struct sockaddr_in6 {
80 #ifdef HAVE_SA_LEN
81 u_int8_t sin6_len; /* length of this struct */
82 u_int8_t sin6_family; /* AF_INET6 */
83 #else
84 u_int16_t sin6_family; /* AF_INET6 */
85 #endif
86 u_int16_t sin6_port; /* transport layer port # */
87 u_int32_t sin6_flowinfo; /* IPv6 flow information */
88 struct in6_addr sin6_addr; /* IPv6 address */
89 u_int32_t sin6_scope_id; /* set of interfaces for a scope */
90 };
91
92 #ifndef IN6ADDR_ANY_INIT
93 #define IN6ADDR_ANY_INIT {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}
94 #endif
95 #ifndef IN6ADDR_LOOPBACK_INIT
96 #define IN6ADDR_LOOPBACK_INIT {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}}
97 #endif
98 #endif /* HAS_INET6_STRUCTS */
99
100 #if defined(NEED_SOCKADDR_STORAGE) || !defined(HAS_INET6_STRUCTS)
101 #define __SS_MAXSIZE 128
102 #define __SS_ALLIGSIZE (sizeof (long))
103
104 struct sockaddr_storage {
105 #ifdef HAVE_SA_LEN
106 u_int8_t ss_len; /* address length */
107 u_int8_t ss_family; /* address family */
108 char __ss_pad1[__SS_ALLIGSIZE - 2 * sizeof (u_int8_t)];
109 long __ss_align;
110 char __ss_pad2[__SS_MAXSIZE - 2 * __SS_ALLIGSIZE];
111 #else
112 u_int16_t ss_family; /* address family */
113 char __ss_pad1[__SS_ALLIGSIZE - sizeof (u_int16_t)];
114 long __ss_align;
115 char __ss_pad2[__SS_MAXSIZE - 2 * __SS_ALLIGSIZE];
116 #endif
117 };
118 #endif
119
120
121 #if !defined(HAS_INET6_STRUCTS) || defined(NEED_IN6ADDR_ANY)
122 #define in6addr_any isc_in6addr_any
123 extern const struct in6_addr in6addr_any;
124 #endif
125
126 #ifndef IN6_ARE_ADDR_EQUAL
127 #define IN6_ARE_ADDR_EQUAL(a, b) \
128 (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof (struct in6_addr)) == 0)
129 #endif
130
131 #ifndef IN6_IS_ADDR_UNSPECIFIED
132 #define IN6_IS_ADDR_UNSPECIFIED(a) \
133 IN6_ARE_ADDR_EQUAL(a, &in6addr_any)
134 #endif
135
136 #ifndef IN6_IS_ADDR_LOOPBACK
137 extern const struct in6_addr isc_in6addr_loopback;
138 #define IN6_IS_ADDR_LOOPBACK(a) \
139 IN6_ARE_ADDR_EQUAL(a, &isc_in6addr_loopback)
140 #endif
141
142 #ifndef IN6_IS_ADDR_V4COMPAT
143 #define IN6_IS_ADDR_V4COMPAT(a) \
144 ((a)->s6_addr[0] == 0x00 && (a)->s6_addr[1] == 0x00 && \
145 (a)->s6_addr[2] == 0x00 && (a)->s6_addr[3] == 0x00 && \
146 (a)->s6_addr[4] == 0x00 && (a)->s6_addr[5] == 0x00 && \
147 (a)->s6_addr[6] == 0x00 && (a)->s6_addr[7] == 0x00 && \
148 (a)->s6_addr[8] == 0x00 && (a)->s6_addr[9] == 0x00 && \
149 (a)->s6_addr[10] == 0x00 && (a)->s6_addr[11] == 0x00 && \
150 ((a)->s6_addr[12] != 0x00 || (a)->s6_addr[13] != 0x00 || \
151 (a)->s6_addr[14] != 0x00 || \
152 ((a)->s6_addr[15] != 0x00 && (a)->s6_addr[15] != 1)))
153 #endif
154
155 #ifndef IN6_IS_ADDR_V4MAPPED
156 #define IN6_IS_ADDR_V4MAPPED(a) \
157 ((a)->s6_addr[0] == 0x00 && (a)->s6_addr[1] == 0x00 && \
158 (a)->s6_addr[2] == 0x00 && (a)->s6_addr[3] == 0x00 && \
159 (a)->s6_addr[4] == 0x00 && (a)->s6_addr[5] == 0x00 && \
160 (a)->s6_addr[6] == 0x00 && (a)->s6_addr[7] == 0x00 && \
161 (a)->s6_addr[8] == 0x00 && (a)->s6_addr[9] == 0x00 && \
162 (a)->s6_addr[10] == 0xff && (a)->s6_addr[11] == 0xff)
163 #endif
164
165 #ifndef IN6_IS_ADDR_SITELOCAL
166 #define IN6_IS_ADDR_SITELOCAL(a) \
167 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
168 #endif
169
170 #ifndef IN6_IS_ADDR_LINKLOCAL
171 #define IN6_IS_ADDR_LINKLOCAL(a) \
172 (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
173 #endif
174
175 #ifndef IN6_IS_ADDR_MULTICAST
176 #define IN6_IS_ADDR_MULTICAST(a) ((a)->s6_addr[0] == 0xff)
177 #endif
178
179 #ifndef __IPV6_ADDR_MC_SCOPE
180 #define __IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f)
181 #endif
182
183 #ifndef __IPV6_ADDR_SCOPE_SITELOCAL
184 #define __IPV6_ADDR_SCOPE_SITELOCAL 0x05
185 #endif
186
187 #ifndef __IPV6_ADDR_SCOPE_ORGLOCAL
188 #define __IPV6_ADDR_SCOPE_ORGLOCAL 0x08
189 #endif
190
191 #ifndef IN6_IS_ADDR_MC_SITELOCAL
192 #define IN6_IS_ADDR_MC_SITELOCAL(a) \
193 (IN6_IS_ADDR_MULTICAST(a) && \
194 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_SITELOCAL))
195 #endif
196
197 #ifndef IN6_IS_ADDR_MC_ORGLOCAL
198 #define IN6_IS_ADDR_MC_ORGLOCAL(a) \
199 (IN6_IS_ADDR_MULTICAST(a) && \
200 (__IPV6_ADDR_MC_SCOPE(a) == __IPV6_ADDR_SCOPE_ORGLOCAL))
201 #endif
202
203 #ifndef INET6_ADDRSTRLEN
204 #define INET6_ADDRSTRLEN 46
205 #endif
206
207 /*
208 * Prior to 2.6, Solaris needs a prototype for gethostname().
209 */
210 #if (OS_MAJOR == 5 && OS_MINOR < 6)
211 extern int gethostname(char *, size_t);
212 #endif
213 /*
214 * gethostid() was not available until 2.5
215 * setsockopt(SO_REUSEADDR) fails on unix domain sockets before 2.5
216 * use ioctl(FIONBIO) rather than fcntl() calls to set/clear non-blocking i/o.
217 */
218 #if (OS_MAJOR == 5 && OS_MINOR < 5)
219 #define GET_HOST_ID_MISSING
220 #define NO_UNIX_REUSEADDR
221 #define USE_FIONBIO_IOCTL
222 #endif
223
224 #define NEED_STRSEP
225 extern char *strsep(char **, const char *);
226
227 #define NEED_DAEMON
228 int daemon(int nochdir, int noclose);
229
230 /*
231 * Solaris defines this in <netdb.h> instead of in <sys/param.h>. We don't
232 * define it in our <netdb.h>, so we define it here.
233 */
234 #ifndef MAXHOSTNAMELEN
235 #define MAXHOSTNAMELEN 256
236 #endif
237
238 /*
239 * Solaris 2.5 and later have getrlimit(), setrlimit() and getrusage().
240 */
241 #if (OS_MAJOR > 5 || (OS_MAJOR == 5 && OS_MINOR >= 5))
242 #include <sys/resource.h>
243 #define HAVE_GETRUSAGE
244 #define RLIMIT_TYPE rlim_t
245 #define RLIMIT_FILE_INFINITY
246 #endif
247
248 #include <resolv_mt.h>
249 #include <netdb_private.h>
250 #include <inet_private.h>
251 #include <ctype.h>
252 #include <sunw_dst_init.h>
253 #include <sunw_irs_init.h>
254
255 #ifdef ORIGINAL_ISC_CODE
256 const char *isc_strerror(int errnum);
257 #define strerror isc_strerror
258 #endif
259
260 #ifndef ISC_FACILITY
261 #define ISC_FACILITY LOG_DAEMON
262 #endif
263
264 /* res_mkquery.c refers explicitly to __putlong and __putshort */
265 #define __putlong putlong
266 #define __putshort putshort
267
268 /*
269 * If one wanted to use isc__gettimeofday for Solaris, they would
270 * need to define NEED_GETTIMEOFDAY (common/bsd/gettimeofday.c),
271 * which is not defined for Solaris. Hence there is no reason to
272 * change the current definition of gettimeofday which currently
273 * comes from libc and we comment the following out.
274 */
275 #ifdef ORIGINAL_ISC_CODE
276 int isc__gettimeofday(struct timeval *, struct timezone *);
277 #define gettimeofday isc__gettimeofday
278 #endif
279
280 /*
281 * Solaris 8 has if_nametoindex().
282 */
283 #if (OS_MAJOR > 5 || (OS_MAJOR == 5 && OS_MINOR >= 8))
284 #define USE_IFNAMELINKID
285 #endif
286
287 #define UNUSED(x) (x) = (x)
288 #define DE_CONST(konst, var) \
289 do { \
290 union { const void *k; void *v; } _u; \
291 _u.k = konst; \
292 var = _u.v; \
293 } while (0)
294
295 #ifndef ALIGN
296 #if (OS_MAJOR == 5 && OS_MINOR > 8)
297 #define ALIGN(x) (((uintptr_t)(x) + (sizeof(char*) - 1UL)) & ~(sizeof(char*) - 1UL))
298 #else
299 #define ALIGN(x) (((unsigned long)(x) + (sizeof(char*) - 1UL)) & ~(sizeof(char*) - 1UL))
300 #endif
301 #endif
302
303 #endif /* ! PORT_AFTER_H */