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 */