1 /* $NetBSD: sys_defs.h,v 1.14 2023/12/23 20:30:46 christos Exp $ */ 2 3 #ifndef _SYS_DEFS_H_INCLUDED_ 4 #define _SYS_DEFS_H_INCLUDED_ 5 6 /*++ 7 /* NAME 8 /* sys_defs 3h 9 /* SUMMARY 10 /* portability header 11 /* SYNOPSIS 12 /* #include <sys_defs.h> 13 /* DESCRIPTION 14 /* .nf 15 16 /* 17 * Specific platforms. Major release numbers differ for a good reason. So be 18 * a good girl, plan for the future, and at least include the major release 19 * number in the system type (for example, SUNOS5 or FREEBSD2). The system 20 * type is determined by the makedefs shell script in the top-level 21 * directory. Adding support for a new system type means updating the 22 * makedefs script, and adding a section below for the new system. 23 */ 24 #ifdef SUNOS5 25 #define _SVID_GETTOD /* Solaris 2.5, XSH4.2 versus SVID */ 26 #endif 27 #include <sys/types.h> 28 29 /* 30 * 4.4BSD and close derivatives. 31 */ 32 #if defined(FREEBSD2) || defined(FREEBSD3) || defined(FREEBSD4) \ 33 || defined(FREEBSD5) || defined(FREEBSD6) || defined(FREEBSD7) \ 34 || defined(FREEBSD8) || defined(FREEBSD9) || defined(FREEBSD10) \ 35 || defined(FREEBSD11) || defined(FREEBSD12) || defined(FREEBSD13) \ 36 || defined(FREEBSD14) \ 37 || defined(BSDI2) || defined(BSDI3) || defined(BSDI4) \ 38 || defined(OPENBSD2) || defined(OPENBSD3) || defined(OPENBSD4) \ 39 || defined(OPENBSD5) || defined(OPENBSD6) || defined(OPENBSD7) \ 40 || defined(NETBSD1) || defined(NETBSD2) || defined(NETBSD3) \ 41 || defined(NETBSD4) || defined(NETBSD5) || defined(NETBSD6) \ 42 || defined(NETBSD7) | defined(NETBSD8) || defined(NETBSD9) \ 43 || defined(NETBSD10) \ 44 || defined(EKKOBSD1) || defined(DRAGONFLY) 45 #define SUPPORTED 46 #include <sys/param.h> 47 #define UINT32_TYPE unsigned int 48 #define UINT16_TYPE unsigned short 49 #define USE_PATHS_H 50 #define HAS_FLOCK_LOCK 51 #define HAS_FCNTL_LOCK 52 #define INTERNAL_LOCK MYFLOCK_STYLE_FLOCK 53 #define DEF_MAILBOX_LOCK "flock, dotlock" 54 #define HAS_SUN_LEN 55 #define HAS_FSYNC 56 #define HAS_DB 57 #define HAS_SA_LEN 58 #define NATIVE_DB_TYPE "hash" 59 #if (defined(__NetBSD_Version__) && __NetBSD_Version__ >= 104250000) 60 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/mail/aliases" /* sendmail 8.10 */ 61 #endif 62 #if (defined(OpenBSD) && OpenBSD >= 200006) 63 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/mail/aliases" /* OpenBSD 2.7 */ 64 #endif 65 #ifndef ALIAS_DB_MAP 66 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/aliases" 67 #endif 68 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 69 #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin" 70 #if (defined(__NetBSD_Version__) && __NetBSD_Version__ > 299000900) 71 #define USE_STATVFS 72 #define STATVFS_IN_SYS_STATVFS_H 73 #else 74 #define USE_STATFS 75 #define STATFS_IN_SYS_MOUNT_H 76 #endif 77 #define HAS_POSIX_REGEXP 78 #define HAS_ST_GEN /* struct stat contains inode 79 * generation number */ 80 #define NATIVE_SENDMAIL_PATH "/usr/sbin/sendmail" 81 #define NATIVE_MAILQ_PATH "/usr/bin/mailq" 82 #define NATIVE_NEWALIAS_PATH "/usr/bin/newaliases" 83 #define NATIVE_COMMAND_DIR "/usr/sbin" 84 #define NATIVE_DAEMON_DIR "/usr/libexec/postfix" 85 #define HAS_DLOPEN 86 #endif 87 88 #ifdef FREEBSD2 89 #define getsid(p) getpgrp() 90 #ifndef CMSG_SPACE 91 #define CMSG_SPACE(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(len)) 92 #endif 93 #ifndef CMSG_LEN 94 #define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (len)) 95 #endif 96 #ifndef CMSG_ALIGN 97 #define CMSG_ALIGN(n) ALIGN(n) 98 #endif 99 #endif /* FREEBSD2 */ 100 101 #ifdef BSDI4 102 /* #define HAS_IPV6 find out interface lookup method */ 103 #endif 104 105 /* __FreeBSD_version version is major+minor */ 106 107 #if __FreeBSD_version >= 220000 108 #define PREFERRED_RAND_SOURCE "dev:/dev/urandom" /* introduced 2.1.5 */ 109 #endif 110 111 #if __FreeBSD_version >= 300000 112 #define HAS_ISSETUGID 113 #define HAS_FUTIMES 114 #endif 115 116 #if __FreeBSD_version >= 400000 117 #define SOCKADDR_SIZE socklen_t 118 #define SOCKOPT_SIZE socklen_t 119 #endif 120 121 #if __FreeBSD_version >= 420000 122 #define HAS_DUPLEX_PIPE /* 4.1 breaks with kqueue(2) */ 123 #endif 124 125 #if (__FreeBSD_version >= 702104 && __FreeBSD_version <= 800000) \ 126 || __FreeBSD_version >= 800100 127 #define HAS_CLOSEFROM 128 #endif 129 130 /* OpenBSD version is year+month */ 131 132 #if OpenBSD >= 199805 /* XXX */ 133 #define HAS_FUTIMES /* XXX maybe earlier */ 134 #endif 135 136 #if (defined(OpenBSD) && OpenBSD >= 199608 && OpenBSD < 201105) 137 #define PREFERRED_RAND_SOURCE "dev:/dev/arandom" /* XXX earlier */ 138 #endif 139 140 #if OpenBSD >= 200000 /* XXX */ 141 #define HAS_ISSETUGID 142 #endif 143 144 #if OpenBSD >= 200200 /* XXX */ 145 #define SOCKADDR_SIZE socklen_t 146 #define SOCKOPT_SIZE socklen_t 147 #endif 148 149 #if OpenBSD >= 200405 /* 3.5 */ 150 #define HAS_CLOSEFROM 151 #endif 152 153 /* __NetBSD_Version__ is major+minor */ 154 155 #if __NetBSD_Version__ >= 103000000 /* XXX maybe earlier */ 156 #undef DEF_MAILBOX_LOCK 157 #define DEF_MAILBOX_LOCK "flock, dotlock" 158 #define PREFERRED_RAND_SOURCE "dev:/dev/urandom" /* XXX maybe earlier */ 159 #endif 160 161 #if __NetBSD_Version__ >= 105000000 162 #define HAS_ISSETUGID /* XXX maybe earlier */ 163 #endif 164 165 #if __NetBSD_Version__ >= 106000000 /* XXX maybe earlier */ 166 #define SOCKADDR_SIZE socklen_t 167 #define SOCKOPT_SIZE socklen_t 168 #endif 169 170 #if __NetBSD_Version__ >= 299000900 /* 2.99.9 */ 171 #define HAS_CLOSEFROM 172 #endif 173 174 #if (defined(__NetBSD_Version__) && __NetBSD_Version__ >= 102000000) 175 #define HAS_FUTIMES 176 #endif 177 178 #if defined(__DragonFly__) 179 #define HAS_DEV_URANDOM 180 #define HAS_ISSETUGID 181 #define HAS_FUTIMES 182 #define SOCKADDR_SIZE socklen_t 183 #define SOCKOPT_SIZE socklen_t 184 #define HAS_DUPLEX_PIPE 185 #endif 186 187 #if (defined(__NetBSD_Version__) && __NetBSD_Version__ >= 105000000) \ 188 || (defined(__FreeBSD__) && __FreeBSD__ >= 4) \ 189 || (defined(OpenBSD) && OpenBSD >= 200003) \ 190 || defined(__DragonFly__) \ 191 || defined(USAGI_LIBINET6) 192 #ifndef NO_IPV6 193 #define HAS_IPV6 194 #endif 195 #if !defined(NO_IPV6) || defined(__NetBSD__) 196 #define HAVE_GETIFADDRS 197 #endif 198 #endif 199 200 #if (defined(__FreeBSD_version) && __FreeBSD_version >= 300000) \ 201 || (defined(__NetBSD_Version__) && __NetBSD_Version__ >= 103000000) \ 202 || (defined(OpenBSD) && OpenBSD >= 199700) /* OpenBSD 2.0?? */ \ 203 || defined(__DragonFly__) 204 #define USE_SYSV_POLL 205 #endif 206 207 #ifndef NO_KQUEUE 208 #if (defined(__FreeBSD_version) && __FreeBSD_version >= 410000) \ 209 || (defined(__NetBSD_Version__) && __NetBSD_Version__ >= 200000000) \ 210 || (defined(OpenBSD) && OpenBSD >= 200105) /* OpenBSD 2.9 */ \ 211 || defined(__DragonFly__) 212 #define EVENTS_STYLE EVENTS_STYLE_KQUEUE 213 #endif 214 #endif 215 216 #ifndef NO_POSIX_GETPW_R 217 #if (defined(__FreeBSD_version) && __FreeBSD_version >= 510000) \ 218 || (defined(__NetBSD_Version__) && __NetBSD_Version__ >= 300000000) \ 219 || (defined(OpenBSD) && OpenBSD >= 200811) /* OpenBSD 4.4 */ 220 #define HAVE_POSIX_GETPW_R 221 #endif 222 #endif 223 224 /* 225 * UNIX on MAC. 226 */ 227 #if defined(RHAPSODY5) || defined(MACOSX) 228 #define SUPPORTED 229 #define UINT32_TYPE unsigned int 230 #define UINT16_TYPE unsigned short 231 #define USE_PATHS_H 232 #define HAS_FLOCK_LOCK 233 #define HAS_FCNTL_LOCK 234 #define INTERNAL_LOCK MYFLOCK_STYLE_FLOCK 235 #define DEF_MAILBOX_LOCK "flock, dotlock" 236 #define HAS_SUN_LEN 237 #define HAS_FSYNC 238 #define HAS_DB 239 #define HAS_SA_LEN 240 #define NATIVE_DB_TYPE "hash" 241 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/aliases" 242 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 243 #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin" 244 #define USE_STATFS 245 #define STATFS_IN_SYS_MOUNT_H 246 #define HAS_POSIX_REGEXP 247 #ifndef NO_NETINFO 248 #define HAS_NETINFO 249 #endif 250 #ifndef NO_IPV6 251 #define HAS_IPV6 252 #define HAVE_GETIFADDRS 253 #endif 254 #define HAS_FUTIMES /* XXX Guessing */ 255 #define NATIVE_SENDMAIL_PATH "/usr/sbin/sendmail" 256 #define NATIVE_MAILQ_PATH "/usr/bin/mailq" 257 #define NATIVE_NEWALIAS_PATH "/usr/bin/newaliases" 258 #define NATIVE_COMMAND_DIR "/usr/sbin" 259 #define NATIVE_DAEMON_DIR "/usr/libexec/postfix" 260 #define SOCKADDR_SIZE socklen_t 261 #define SOCKOPT_SIZE socklen_t 262 #ifndef NO_KQUEUE 263 #define EVENTS_STYLE EVENTS_STYLE_KQUEUE 264 #define USE_SYSV_POLL_THEN_SELECT 265 #endif 266 #define USE_MAX_FILES_PER_PROC 267 #ifndef NO_POSIX_GETPW_R 268 #define HAVE_POSIX_GETPW_R 269 #endif 270 #define HAS_DLOPEN 271 #define PREFERRED_RAND_SOURCE "dev:/dev/urandom" 272 #endif 273 274 /* 275 * Ultrix 4.x, a sort of 4.[1-2] BSD system with System V.2 compatibility 276 * and POSIX. 277 */ 278 #ifdef ULTRIX4 279 #define SUPPORTED 280 #define UINT32_TYPE unsigned int 281 #define UINT16_TYPE unsigned short 282 /* Ultrix by default has only 64 descriptors per process */ 283 #ifndef FD_SETSIZE 284 #define FD_SETSIZE 96 285 #endif 286 #define _PATH_MAILDIR "/var/spool/mail" 287 #define _PATH_BSHELL "/bin/sh" 288 #define _PATH_DEFPATH "/bin:/usr/bin:/usr/ucb" 289 #define _PATH_STDPATH "/bin:/usr/bin:/usr/etc:/usr/ucb" 290 #define HAS_FLOCK_LOCK 291 #define HAS_FCNTL_LOCK 292 #define INTERNAL_LOCK MYFLOCK_STYLE_FLOCK 293 #define DEF_MAILBOX_LOCK "flock, dotlock" 294 #define HAS_FSYNC 295 /* might be set by makedef */ 296 #ifdef HAS_DB 297 #define NATIVE_DB_TYPE "hash" 298 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/aliases" 299 #else 300 #define HAS_DBM 301 #define NATIVE_DB_TYPE "dbm" 302 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/aliases" 303 #endif 304 extern int optind; 305 extern char *optarg; 306 extern int opterr; 307 extern int h_errno; 308 309 #define MISSING_STRFTIME_E 310 #ifndef NO_NIS 311 #define HAS_NIS 312 #endif 313 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 314 #define ROOT_PATH "/bin:/usr/bin:/etc:/usr/etc:/usr/ucb" 315 #define USE_STATFS 316 #define USE_STRUCT_FS_DATA 317 #define STATFS_IN_SYS_MOUNT_H 318 /* Ultrix misses just S_ISSOCK, the others are there */ 319 #define S_ISSOCK(mode) (((mode) & (S_IFMT)) == (S_IFSOCK)) 320 #define DUP2_DUPS_CLOSE_ON_EXEC 321 #define MISSING_USLEEP 322 #define NO_HERRNO 323 #define NATIVE_SENDMAIL_PATH "/usr/lib/sendmail" 324 #define NATIVE_COMMAND_DIR "/usr/etc" 325 #define NATIVE_DAEMON_DIR "/usr/libexec/postfix" 326 #endif 327 328 /* 329 * OSF, then Digital UNIX, then Compaq. A BSD-flavored hybrid. 330 */ 331 #ifdef OSF1 332 #define SUPPORTED 333 #define UINT32_TYPE unsigned int 334 #define UINT16_TYPE unsigned short 335 #define MISSING_SETENV 336 #define USE_PATHS_H 337 #define _PATH_DEFPATH "/usr/bin:/usr/ucb" 338 #define HAS_FLOCK_LOCK 339 #define HAS_FCNTL_LOCK 340 #define INTERNAL_LOCK MYFLOCK_STYLE_FLOCK 341 #define DEF_MAILBOX_LOCK "flock, dotlock" 342 #define HAS_FSYNC 343 #define HAVE_BASENAME 344 #define HAS_DBM 345 #define NATIVE_DB_TYPE "dbm" 346 #define ALIAS_DB_MAP DEF_DB_TYPE ":/var/adm/sendmail/aliases" 347 extern int optind; /* XXX use <getopt.h> */ 348 extern char *optarg; /* XXX use <getopt.h> */ 349 extern int opterr; /* XXX use <getopt.h> */ 350 351 #ifndef NO_NIS 352 #define HAS_NIS 353 #endif 354 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 355 #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb" 356 #define USE_STATFS 357 #define STATFS_IN_SYS_MOUNT_H 358 #define HAS_POSIX_REGEXP 359 #define BROKEN_WRITE_SELECT_ON_NON_BLOCKING_PIPE 360 #define NO_MSGHDR_MSG_CONTROL 361 #ifndef NO_IPV6 362 #define HAS_IPV6 363 #endif 364 365 #endif 366 367 /* 368 * SunOS 4.x, a mostly 4.[2-3] BSD system with System V.2 compatibility and 369 * POSIX support. 370 */ 371 #ifdef SUNOS4 372 #define SUPPORTED 373 #include <memory.h> 374 #define UINT32_TYPE unsigned int 375 #define UINT16_TYPE unsigned short 376 #define UNSAFE_CTYPE 377 #define fpos_t long 378 #define MISSING_SETENV 379 #define MISSING_STRERROR 380 #define MISSING_STRTOUL 381 #define _PATH_MAILDIR "/var/spool/mail" 382 #define _PATH_BSHELL "/bin/sh" 383 #define _PATH_DEFPATH "/usr/bin:/usr/ucb" 384 #define _PATH_STDPATH "/usr/bin:/usr/etc:/usr/ucb" 385 #define HAS_FLOCK_LOCK 386 #define HAS_FCNTL_LOCK 387 #define INTERNAL_LOCK MYFLOCK_STYLE_FLOCK 388 #define DEF_MAILBOX_LOCK "flock, dotlock" 389 #define HAS_FSYNC 390 #define HAS_DBM 391 #define NATIVE_DB_TYPE "dbm" 392 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/aliases" 393 extern int optind; 394 extern char *optarg; 395 extern int opterr; 396 397 #ifndef NO_NIS 398 #define HAS_NIS 399 #endif 400 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 401 #define ROOT_PATH "/bin:/usr/bin:/etc:/usr/etc:/usr/ucb" 402 #define USE_STATFS 403 #define STATFS_IN_SYS_VFS_H 404 #define memmove(d,s,l) bcopy(s,d,l) 405 #define NO_HERRNO 406 #define NATIVE_SENDMAIL_PATH "/usr/lib/sendmail" 407 #define NATIVE_MAILQ_PATH "/usr/ucb/mailq" 408 #define NATIVE_NEWALIAS_PATH "/usr/ucb/newaliases" 409 #define NATIVE_COMMAND_DIR "/usr/etc" 410 #define NATIVE_DAEMON_DIR "/usr/libexec/postfix" 411 #define STRCASECMP_IN_STRINGS_H 412 #define OCTAL_TO_UNSIGNED(res, str) sscanf((str), "%o", &(res)) 413 #define size_t unsigned 414 #define ssize_t int 415 #define getsid getpgrp 416 #define NO_SNPRINTF 417 #endif 418 419 /* 420 * SunOS 5.x, mostly System V Release 4. 421 */ 422 #ifdef SUNOS5 423 #define SUPPORTED 424 #define UINT32_TYPE unsigned int 425 #define UINT16_TYPE unsigned short 426 #define _PATH_MAILDIR "/var/mail" 427 #define _PATH_BSHELL "/bin/sh" 428 #define _PATH_DEFPATH "/usr/bin:/usr/ucb" 429 #define _PATH_STDPATH "/usr/bin:/usr/sbin:/usr/ucb" 430 #define HAS_FCNTL_LOCK 431 #define INTERNAL_LOCK MYFLOCK_STYLE_FCNTL 432 #define DEF_MAILBOX_LOCK "fcntl, dotlock" 433 #define HAS_FSYNC 434 #define HAS_DBM 435 #define NATIVE_DB_TYPE "dbm" 436 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/mail/aliases" 437 #ifndef NO_NIS 438 #define HAS_NIS 439 #ifndef NO_NISPLUS 440 #define HAS_NISPLUS 441 #endif /* NO_NISPLUS */ 442 #endif 443 #define USE_SYS_SOCKIO_H /* Solaris 2.5, changed sys/ioctl.h */ 444 #define GETTIMEOFDAY(t) gettimeofday(t) 445 #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb" 446 #define FIONREAD_IN_SYS_FILIO_H 447 #define USE_STATVFS 448 #define STATVFS_IN_SYS_STATVFS_H 449 #define INT_MAX_IN_LIMITS_H 450 #ifdef STREAM_CONNECTIONS /* avoid UNIX-domain sockets */ 451 #define LOCAL_LISTEN stream_listen 452 #define LOCAL_ACCEPT stream_accept 453 #define LOCAL_CONNECT stream_connect 454 #define LOCAL_TRIGGER stream_trigger 455 #define LOCAL_SEND_FD stream_send_fd 456 #define LOCAL_RECV_FD stream_recv_fd 457 #endif 458 #define HAS_VOLATILE_LOCKS 459 #define BROKEN_READ_SELECT_ON_TCP_SOCKET 460 #define CANT_WRITE_BEFORE_SENDING_FD 461 #ifndef NO_POSIX_REGEXP 462 #define HAS_POSIX_REGEXP 463 #endif 464 #ifndef NO_IPV6 465 #define HAS_IPV6 466 #define HAS_SIOCGLIF 467 #endif 468 #ifndef NO_CLOSEFROM 469 #define HAS_CLOSEFROM 470 #endif 471 #ifndef NO_DEV_URANDOM 472 #define PREFERRED_RAND_SOURCE "dev:/dev/urandom" 473 #endif 474 #ifndef NO_FUTIMESAT 475 #define HAS_FUTIMESAT 476 #endif 477 #define USE_SYSV_POLL 478 #ifndef NO_DEVPOLL 479 #define EVENTS_STYLE EVENTS_STYLE_DEVPOLL 480 #endif 481 #ifndef NO_POSIX_GETPW_R 482 #define HAVE_POSIX_GETPW_R 483 #define GETPW_R_NEEDS_POSIX_PTHREAD_SEMANTICS 484 #endif 485 486 /* 487 * Allow build environment to override paths. 488 */ 489 #define NATIVE_SENDMAIL_PATH "/usr/lib/sendmail" 490 #define NATIVE_MAILQ_PATH "/usr/bin/mailq" 491 #define NATIVE_NEWALIAS_PATH "/usr/bin/newaliases" 492 #define NATIVE_COMMAND_DIR "/usr/sbin" 493 #define NATIVE_DAEMON_DIR "/usr/libexec/postfix" 494 495 #define HAS_DLOPEN 496 #endif 497 498 /* 499 * UnixWare, System Release 4. 500 */ 501 #ifdef UW7 /* UnixWare 7 */ 502 #define SUPPORTED 503 #define UINT32_TYPE unsigned int 504 #define UINT16_TYPE unsigned short 505 #define _PATH_MAILDIR "/var/mail" 506 #define _PATH_BSHELL "/bin/sh" 507 #define _PATH_DEFPATH "/usr/bin:/usr/ucb" 508 #define _PATH_STDPATH "/usr/bin:/usr/sbin:/usr/ucb" 509 #define MISSING_SETENV 510 #define HAS_FCNTL_LOCK 511 #define INTERNAL_LOCK MYFLOCK_STYLE_FCNTL 512 #define DEF_MAILBOX_LOCK "fcntl, dotlock" 513 #define HAS_FSYNC 514 #define HAS_DBM 515 #define NATIVE_DB_TYPE "dbm" 516 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/mail/aliases" 517 #ifndef NO_NIS 518 #define HAS_NIS 519 #endif 520 #define USE_SYS_SOCKIO_H 521 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 522 #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb" 523 #define FIONREAD_IN_SYS_FILIO_H 524 #define DBM_NO_TRAILING_NULL 525 #define USE_STATVFS 526 #define STATVFS_IN_SYS_STATVFS_H 527 #define STRCASECMP_IN_STRINGS_H 528 #define USE_SET_H_ERRNO 529 #endif 530 531 #ifdef UW21 /* UnixWare 2.1.x */ 532 #define SUPPORTED 533 #define UINT32_TYPE unsigned int 534 #define UINT16_TYPE unsigned short 535 #define _PATH_MAILDIR "/var/mail" 536 #define _PATH_BSHELL "/bin/sh" 537 #define _PATH_DEFPATH "/usr/bin:/usr/ucb" 538 #define _PATH_STDPATH "/usr/bin:/usr/sbin:/usr/ucb" 539 #define MISSING_SETENV 540 #define HAS_FCNTL_LOCK 541 #define INTERNAL_LOCK MYFLOCK_STYLE_FCNTL 542 #define DEF_MAILBOX_LOCK "fcntl, dotlock" 543 #define HAS_FSYNC 544 #define HAS_DBM 545 #define NATIVE_DB_TYPE "dbm" 546 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/mail/aliases" 547 #ifndef NO_NIS 548 #define HAS_NIS */ 549 #endif 550 #define USE_SYS_SOCKIO_H 551 #define GETTIMEOFDAY(t) gettimeofday(t,NULL) 552 #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb" 553 #define FIONREAD_IN_SYS_FILIO_H 554 #define DBM_NO_TRAILING_NULL 555 #define USE_STATVFS 556 #define STATVFS_IN_SYS_STATVFS_H 557 #endif 558 559 /* 560 * AIX: a SYSV-flavored hybrid. NB: fcntl() and flock() access the same 561 * underlying locking primitives. 562 */ 563 #if defined(AIX5) || defined(AIX6) 564 #define SUPPORTED 565 #define UINT32_TYPE unsigned int 566 #define UINT16_TYPE unsigned short 567 #define MISSING_SETENV 568 #define USE_PATHS_H 569 #ifndef _PATH_BSHELL 570 #define _PATH_BSHELL "/bin/sh" 571 #endif 572 #ifndef _PATH_MAILDIR 573 #define _PATH_MAILDIR "/var/spool/mail" /* paths.h lies */ 574 #endif 575 #ifndef _PATH_DEFPATH 576 #define _PATH_DEFPATH "/usr/bin:/usr/ucb" 577 #endif 578 #ifndef _PATH_STDPATH 579 #define _PATH_STDPATH "/usr/bin:/usr/sbin:/usr/ucb" 580 #endif 581 #define HAS_FCNTL_LOCK 582 #define INTERNAL_LOCK MYFLOCK_STYLE_FCNTL 583 #define DEF_MAILBOX_LOCK "fcntl, dotlock" 584 #define USE_SYS_SELECT_H 585 #define HAS_FSYNC 586 #define HAS_DBM 587 #define NATIVE_DB_TYPE "dbm" 588 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/aliases" 589 #ifndef NO_NIS 590 #define HAS_NIS 591 #endif 592 #define HAS_SA_LEN 593 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 594 #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb" 595 #define SOCKADDR_SIZE socklen_t 596 #define SOCKOPT_SIZE socklen_t 597 #define USE_STATVFS 598 #define STATVFS_IN_SYS_STATVFS_H 599 #define NATIVE_SENDMAIL_PATH "/usr/sbin/sendmail" 600 #define NATIVE_MAILQ_PATH "/usr/sbin/mailq" 601 #define NATIVE_NEWALIAS_PATH "/usr/sbin/newaliases" 602 #define NATIVE_COMMAND_DIR "/usr/sbin" 603 #define NATIVE_DAEMON_DIR "/usr/libexec/postfix" 604 605 /* 606 * XXX Need CMSG_SPACE() and CMSG_LEN() but don't want to drag in everything 607 * that comes with _LINUX_SOURCE_COMPAT. 608 */ 609 #include <sys/socket.h> 610 #ifndef CMSG_SPACE 611 #define CMSG_SPACE(len) (_CMSG_ALIGN(sizeof(struct cmsghdr)) + _CMSG_ALIGN(len)) 612 #endif 613 #ifndef CMSG_LEN 614 #define CMSG_LEN(len) (_CMSG_ALIGN(sizeof(struct cmsghdr)) + (len)) 615 #endif 616 #ifndef NO_IPV6 617 #define HAS_IPV6 618 #endif 619 #define BROKEN_AI_PASSIVE_NULL_HOST 620 #define BROKEN_AI_NULL_SERVICE 621 #define USE_SYSV_POLL 622 #define MYMALLOC_FUZZ 1 623 #endif 624 625 #ifdef AIX4 626 #define SUPPORTED 627 #define UINT32_TYPE unsigned int 628 #define UINT16_TYPE unsigned short 629 #define MISSING_SETENV 630 #define _PATH_BSHELL "/bin/sh" 631 #define _PATH_MAILDIR "/var/spool/mail" /* paths.h lies */ 632 #define _PATH_DEFPATH "/usr/bin:/usr/ucb" 633 #define _PATH_STDPATH "/usr/bin:/usr/sbin:/usr/ucb" 634 #define HAS_FCNTL_LOCK 635 #define INTERNAL_LOCK MYFLOCK_STYLE_FCNTL 636 #define DEF_MAILBOX_LOCK "fcntl, dotlock" 637 #define USE_SYS_SELECT_H 638 #define HAS_FSYNC 639 #define HAS_DBM 640 #define NATIVE_DB_TYPE "dbm" 641 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/aliases" 642 #ifndef NO_NIS 643 #define HAS_NIS 644 #endif 645 #define HAS_SA_LEN 646 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 647 #define RESOLVE_H_NEEDS_STDIO_H 648 #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb" 649 #define SOCKADDR_SIZE size_t 650 #define SOCKOPT_SIZE size_t 651 #define USE_STATVFS 652 #define STATVFS_IN_SYS_STATVFS_H 653 #define STRCASECMP_IN_STRINGS_H 654 #if 0 655 extern time_t time(time_t *); 656 extern int seteuid(uid_t); 657 extern int setegid(gid_t); 658 extern int initgroups(const char *, int); 659 660 #endif 661 #define NATIVE_SENDMAIL_PATH "/usr/lib/sendmail" 662 #define NATIVE_MAILQ_PATH "/usr/sbin/mailq" 663 #define NATIVE_NEWALIAS_PATH "/usr/sbin/newaliases" 664 #define NATIVE_COMMAND_DIR "/usr/sbin" 665 #define NATIVE_DAEMON_DIR "/usr/libexec/postfix" 666 667 #define CANT_USE_SEND_RECV_MSG 668 #endif 669 670 #ifdef AIX3 671 #define SUPPORTED 672 #define UINT32_TYPE unsigned int 673 #define UINT16_TYPE unsigned short 674 #define MISSING_SETENV 675 #define _PATH_BSHELL "/bin/sh" 676 #define _PATH_MAILDIR "/var/spool/mail" /* paths.h lies */ 677 #define _PATH_DEFPATH "/usr/bin:/usr/ucb" 678 #define _PATH_STDPATH "/usr/bin:/usr/sbin:/usr/ucb" 679 #define HAS_FCNTL_LOCK 680 #define INTERNAL_LOCK MYFLOCK_STYLE_FCNTL 681 #define DEF_MAILBOX_LOCK "fcntl, dotlock" 682 #define USE_SYS_SELECT_H 683 #define HAS_FSYNC 684 #define HAS_DBM 685 #define NATIVE_DB_TYPE "dbm" 686 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/aliases" 687 #ifndef NO_NIS 688 #define HAS_NIS 689 #endif 690 #define HAS_SA_LEN 691 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 692 #define RESOLVE_H_NEEDS_STDIO_H 693 #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb" 694 #define SOCKADDR_SIZE size_t 695 #define SOCKOPT_SIZE size_t 696 #define USE_STATFS 697 #define STATFS_IN_SYS_STATFS_H 698 #define STRCASECMP_IN_STRINGS_H 699 extern time_t time(time_t *); 700 extern int seteuid(uid_t); 701 extern int setegid(gid_t); 702 extern int initgroups(const char *, int); 703 704 #define NATIVE_SENDMAIL_PATH "/usr/lib/sendmail" 705 706 #define CANT_USE_SEND_RECV_MSG 707 #endif 708 709 /* 710 * IRIX, a mix of System V Releases. 711 */ 712 #if defined(IRIX5) || defined(IRIX6) 713 #define SUPPORTED 714 #define UINT32_TYPE unsigned int 715 #define UINT16_TYPE unsigned short 716 #define MISSING_SETENV 717 #define _PATH_MAILDIR "/var/mail" 718 #define _PATH_BSHELL "/bin/sh" 719 #define _PATH_DEFPATH "/usr/bin:/usr/bsd" 720 #define _PATH_STDPATH "/usr/bin:/usr/sbin:/usr/bsd" 721 #define HAS_FCNTL_LOCK 722 #define INTERNAL_LOCK MYFLOCK_STYLE_FCNTL 723 #define DEF_MAILBOX_LOCK "fcntl, dotlock" 724 #define HAS_FSYNC 725 #define HAS_DBM 726 #define NATIVE_DB_TYPE "dbm" 727 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/aliases" 728 #ifndef NO_NIS 729 #define HAS_NIS 730 #endif 731 #define USE_SYS_SOCKIO_H /* XXX check */ 732 #define GETTIMEOFDAY(t) gettimeofday(t) 733 #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/bsd" 734 #define FIONREAD_IN_SYS_FILIO_H /* XXX check */ 735 #define DBM_NO_TRAILING_NULL /* XXX check */ 736 #define USE_STATVFS 737 #define STATVFS_IN_SYS_STATVFS_H 738 #define BROKEN_WRITE_SELECT_ON_NON_BLOCKING_PIPE 739 #define CANT_USE_SEND_RECV_MSG 740 #endif 741 742 #if defined(IRIX5) 743 #define MISSING_USLEEP 744 #endif 745 746 #if defined(IRIX6) 747 #ifndef NO_IPV6 748 #define HAS_IPV6 749 #endif 750 #define HAS_POSIX_REGEXP 751 #define PIPES_CANT_FIONREAD 752 #endif 753 754 /* 755 * GLIBC, mainly, but not exclusively Linux 756 */ 757 #ifdef __GLIBC_PREREQ 758 #define HAVE_GLIBC_API_VERSION_SUPPORT(maj, min) __GLIBC_PREREQ(maj, min) 759 #else 760 #define HAVE_GLIBC_API_VERSION_SUPPORT(maj, min) \ 761 (defined(__GLIBC__) && \ 762 ((__GLIBC__ << 16) + __GLIBC_MINOR__ >= ((maj) << 16) + (min))) 763 #endif 764 765 /* 766 * LINUX. 767 */ 768 #if defined(LINUX2) || defined(LINUX3) || defined(LINUX4) || defined(LINUX5) \ 769 || defined(LINUX6) 770 #define SUPPORTED 771 #define UINT32_TYPE unsigned int 772 #define UINT16_TYPE unsigned short 773 #include <features.h> 774 #define USE_PATHS_H 775 #define HAS_FLOCK_LOCK 776 #define HAS_FCNTL_LOCK 777 #define INTERNAL_LOCK MYFLOCK_STYLE_FLOCK 778 #define DEF_MAILBOX_LOCK "fcntl, dotlock" /* RedHat >= 4.x */ 779 #define HAS_FSYNC 780 #define HAS_DB 781 #define NATIVE_DB_TYPE "hash" 782 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/aliases" 783 #ifndef NO_NIS 784 #define HAS_NIS 785 #endif 786 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 787 #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin" 788 #define FIONREAD_IN_TERMIOS_H 789 #define USE_STATFS 790 #define STATFS_IN_SYS_VFS_H 791 #define PREPEND_PLUS_TO_OPTSTRING 792 #define HAS_POSIX_REGEXP 793 #define HAS_DLOPEN 794 #define NATIVE_SENDMAIL_PATH "/usr/sbin/sendmail" 795 #define NATIVE_MAILQ_PATH "/usr/bin/mailq" 796 #define NATIVE_NEWALIAS_PATH "/usr/bin/newaliases" 797 #define NATIVE_COMMAND_DIR "/usr/sbin" 798 #define NATIVE_DAEMON_DIR "/usr/libexec/postfix" 799 #if HAVE_GLIBC_API_VERSION_SUPPORT(2, 1) 800 #define SOCKADDR_SIZE socklen_t 801 #define SOCKOPT_SIZE socklen_t 802 #else 803 #define NO_SNPRINTF 804 #endif 805 #ifndef NO_IPV6 806 #define HAS_IPV6 807 #if HAVE_GLIBC_API_VERSION_SUPPORT(2, 4) 808 /* Really 2.3.3 or later, but there's no __GLIBC_MICRO version macro. */ 809 #define HAVE_GETIFADDRS 810 #else 811 #define HAS_PROCNET_IFINET6 812 #define _PATH_PROCNET_IFINET6 "/proc/net/if_inet6" 813 #endif 814 #endif 815 #include <linux/version.h> 816 #if !defined(KERNEL_VERSION) 817 #define KERNEL_VERSION(a,b,c) (LINUX_VERSION_CODE + 1) 818 #endif 819 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,2,0)) \ 820 || (defined(__GLIBC__) && __GLIBC__ < 2) 821 #define CANT_USE_SEND_RECV_MSG 822 #define DEF_SMTP_CACHE_DEMAND 0 823 #else 824 #define CANT_WRITE_BEFORE_SENDING_FD 825 #endif 826 #define PREFERRED_RAND_SOURCE "dev:/dev/urandom" /* introduced in 1.1 */ 827 #ifndef NO_EPOLL 828 #define EVENTS_STYLE EVENTS_STYLE_EPOLL /* introduced in 2.5 */ 829 #endif 830 #define USE_SYSV_POLL 831 #ifndef NO_POSIX_GETPW_R 832 #if (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 1) \ 833 || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 1) \ 834 || (defined(_BSD_SOURCE) && _BSD_SOURCE >= 1) \ 835 || (defined(_SVID_SOURCE) && _SVID_SOURCE >= 1) \ 836 || (defined(_POSIX_SOURCE) && _POSIX_SOURCE >= 1) 837 #define HAVE_POSIX_GETPW_R 838 #endif 839 #endif 840 #if HAVE_GLIBC_API_VERSION_SUPPORT(2, 34) 841 #define HAS_CLOSEFROM 842 #endif 843 844 #endif 845 846 #ifdef LINUX1 847 #define SUPPORTED 848 #define UINT32_TYPE unsigned int 849 #define UINT16_TYPE unsigned short 850 #define USE_PATHS_H 851 #define HAS_FLOCK_LOCK 852 #define HAS_FCNTL_LOCK 853 #define INTERNAL_LOCK MYFLOCK_STYLE_FLOCK 854 #define DEF_MAILBOX_LOCK "dotlock" /* verified RedHat 3.03 */ 855 #define HAS_FSYNC 856 #define HAS_DB 857 #define NATIVE_DB_TYPE "hash" 858 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/aliases" 859 #ifndef NO_NIS 860 #define HAS_NIS 861 #endif 862 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 863 #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin" 864 #define FIONREAD_IN_TERMIOS_H /* maybe unnecessary */ 865 #define USE_STATFS 866 #define STATFS_IN_SYS_VFS_H 867 #define PREPEND_PLUS_TO_OPTSTRING 868 #define HAS_POSIX_REGEXP 869 #define NATIVE_SENDMAIL_PATH "/usr/sbin/sendmail" 870 #define NATIVE_MAILQ_PATH "/usr/bin/mailq" 871 #define NATIVE_NEWALIAS_PATH "/usr/bin/newaliases" 872 #define NATIVE_COMMAND_DIR "/usr/sbin" 873 #define NATIVE_DAEMON_DIR "/usr/libexec/postfix" 874 #define CANT_USE_SEND_RECV_MSG 875 #define DEF_SMTP_CACHE_DEMAND 0 876 #endif 877 878 /* 879 * GNU. 880 */ 881 #ifdef GNU0 882 #define SUPPORTED 883 #include <features.h> 884 #define USE_PATHS_H 885 #define HAS_FCNTL_LOCK 886 #define INTERNAL_LOCK MYFLOCK_STYLE_FCNTL 887 #define DEF_MAILBOX_LOCK "fcntl, dotlock" /* RedHat >= 4.x */ 888 #define HAS_FSYNC 889 #define HAS_DB 890 #define NATIVE_DB_TYPE "hash" 891 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/aliases" 892 #ifndef NO_NIS 893 #define HAS_NIS 894 #endif 895 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 896 #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin" 897 #define FIONREAD_IN_TERMIOS_H 898 #define USE_STATFS 899 #define STATFS_IN_SYS_VFS_H 900 #define UNIX_DOMAIN_CONNECT_BLOCKS_FOR_ACCEPT 901 #define PREPEND_PLUS_TO_OPTSTRING 902 #define HAS_POSIX_REGEXP 903 #define HAS_DLOPEN 904 #define NATIVE_SENDMAIL_PATH "/usr/sbin/sendmail" 905 #define NATIVE_MAILQ_PATH "/usr/bin/mailq" 906 #define NATIVE_NEWALIAS_PATH "/usr/bin/newaliases" 907 #define NATIVE_COMMAND_DIR "/usr/sbin" 908 #ifdef DEBIAN 909 #define NATIVE_DAEMON_DIR "/usr/lib/postfix" 910 #ifndef DEF_MANPAGE_DIR 911 #define DEF_MANPAGE_DIR "/usr/share/man" 912 #endif 913 #ifndef DEF_SAMPLE_DIR 914 #define DEF_SAMPLE_DIR "/usr/share/doc/postfix/examples" 915 #endif 916 #ifndef DEF_README_DIR 917 #define DEF_README_DIR "/usr/share/doc/postfix" 918 #endif 919 #else 920 #define NATIVE_DAEMON_DIR "/usr/libexec/postfix" 921 #endif 922 #define SOCKADDR_SIZE socklen_t 923 #define SOCKOPT_SIZE socklen_t 924 #ifdef __FreeBSD_kernel__ 925 #define HAS_DUPLEX_PIPE 926 #define HAS_ISSETUGID 927 #endif 928 #ifndef NO_IPV6 929 #define HAS_IPV6 930 #ifdef __FreeBSD_kernel__ 931 #define HAVE_GETIFADDRS 932 #else 933 #define HAS_PROCNET_IFINET6 934 #define _PATH_PROCNET_IFINET6 "/proc/net/if_inet6" 935 #endif 936 #endif 937 #define CANT_USE_SEND_RECV_MSG 938 #define DEF_SMTP_CACHE_DEMAND 0 939 #define PREFERRED_RAND_SOURCE "dev:/dev/urandom" 940 #endif 941 942 /* 943 * HPUX11 was copied from HPUX10, but can perhaps be trimmed down a bit. 944 */ 945 #ifdef HPUX11 946 #define SUPPORTED 947 #define USE_SIG_RETURN 948 #define UINT32_TYPE unsigned int 949 #define UINT16_TYPE unsigned short 950 #define HAS_DBM 951 #define HAS_FCNTL_LOCK 952 #define INTERNAL_LOCK MYFLOCK_STYLE_FCNTL 953 #define DEF_MAILBOX_LOCK "fcntl, dotlock" 954 #define HAS_FSYNC 955 #define NATIVE_DB_TYPE "dbm" 956 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/mail/aliases" 957 #define ROOT_PATH "/usr/bin:/sbin:/usr/sbin" 958 #define MISSING_SETENV 959 #ifndef NO_NIS 960 #define HAS_NIS 961 #endif 962 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 963 #define _PATH_BSHELL "/bin/sh" 964 #define _PATH_MAILDIR "/var/mail" 965 #define _PATH_DEFPATH "/usr/bin" 966 #define _PATH_STDPATH "/usr/bin:/sbin:/usr/sbin" 967 #define MISSING_SETEUID 968 #define HAVE_SETRESUID 969 #define MISSING_SETEGID 970 #define HAVE_SETRESGID 971 extern int h_errno; /* <netdb.h> imports too much stuff */ 972 973 #define USE_STATFS 974 #define STATFS_IN_SYS_VFS_H 975 #define HAS_POSIX_REGEXP 976 #define HAS_DLOPEN 977 #define NATIVE_SENDMAIL_PATH "/usr/sbin/sendmail" 978 #define NATIVE_MAILQ_PATH "/usr/bin/mailq" 979 #define NATIVE_NEWALIAS_PATH "/usr/bin/newaliases" 980 #define NATIVE_COMMAND_DIR "/usr/sbin" 981 #define NATIVE_DAEMON_DIR "/usr/libexec/postfix" 982 #endif 983 984 #ifdef HPUX10 985 #define SUPPORTED 986 #define USE_SIG_RETURN 987 #define UINT32_TYPE unsigned int 988 #define UINT16_TYPE unsigned short 989 #define HAS_DBM 990 #define HAS_FCNTL_LOCK 991 #define INTERNAL_LOCK MYFLOCK_STYLE_FCNTL 992 #define DEF_MAILBOX_LOCK "fcntl, dotlock" 993 #define HAS_FSYNC 994 #define NATIVE_DB_TYPE "dbm" 995 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/mail/aliases" 996 #define ROOT_PATH "/usr/bin:/sbin:/usr/sbin" 997 #define MISSING_SETENV 998 #ifndef NO_NIS 999 #define HAS_NIS 1000 #endif 1001 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 1002 #define _PATH_BSHELL "/bin/sh" 1003 #define _PATH_MAILDIR "/var/mail" 1004 #define _PATH_DEFPATH "/usr/bin" 1005 #define _PATH_STDPATH "/usr/bin:/sbin:/usr/sbin" 1006 #define MISSING_SETEUID 1007 #define HAVE_SETRESUID 1008 #define MISSING_SETEGID 1009 #define HAVE_SETRESGID 1010 extern int h_errno; /* <netdb.h> imports too much stuff */ 1011 1012 #define USE_STATFS 1013 #define STATFS_IN_SYS_VFS_H 1014 #define HAS_POSIX_REGEXP 1015 #define HAS_SHL_LOAD 1016 #define NATIVE_SENDMAIL_PATH "/usr/sbin/sendmail" 1017 #define NATIVE_MAILQ_PATH "/usr/bin/mailq" 1018 #define NATIVE_NEWALIAS_PATH "/usr/bin/newaliases" 1019 #define NATIVE_COMMAND_DIR "/usr/sbin" 1020 #define NATIVE_DAEMON_DIR "/usr/libexec/postfix" 1021 #endif 1022 1023 #ifdef HPUX9 1024 #define SUPPORTED 1025 #define USE_SIG_RETURN 1026 #define UINT32_TYPE unsigned int 1027 #define UINT16_TYPE unsigned short 1028 #define HAS_DBM 1029 #define HAS_FCNTL_LOCK 1030 #define INTERNAL_LOCK MYFLOCK_STYLE_FCNTL 1031 #define DEF_MAILBOX_LOCK "fcntl, dotlock" 1032 #define HAS_FSYNC 1033 #ifndef NO_NIS 1034 #define HAS_NIS 1035 #endif 1036 #define MISSING_SETENV 1037 #define MISSING_RLIMIT_FSIZE 1038 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 1039 #define NATIVE_DB_TYPE "dbm" 1040 #define ALIAS_DB_MAP DEF_DB_TYPE ":/usr/lib/aliases" 1041 #define ROOT_PATH "/bin:/usr/bin:/etc" 1042 #define _PATH_BSHELL "/bin/sh" 1043 #define _PATH_MAILDIR "/usr/mail" 1044 #define _PATH_DEFPATH "/bin:/usr/bin" 1045 #define _PATH_STDPATH "/bin:/usr/bin:/etc" 1046 #define MISSING_SETEUID 1047 #define HAVE_SETRESUID 1048 #define MISSING_SETEGID 1049 #define HAVE_SETRESGID 1050 extern int h_errno; 1051 1052 #define USE_ULIMIT /* no setrlimit() */ 1053 #define USE_STATFS 1054 #define STATFS_IN_SYS_VFS_H 1055 #define HAS_POSIX_REGEXP 1056 #define HAS_SHL_LOAD 1057 #define NATIVE_SENDMAIL_PATH "/usr/bin/sendmail" 1058 #define NATIVE_MAILQ_PATH "/usr/bin/mailq" 1059 #define NATIVE_NEWALIAS_PATH "/usr/bin/newaliases" 1060 #define NATIVE_DAEMON_DIR "/usr/libexec/postfix" 1061 #endif 1062 1063 /* 1064 * NEXTSTEP3, without -lposix, because its naming service is broken. 1065 */ 1066 #ifdef NEXTSTEP3 1067 #define SUPPORTED 1068 #define UINT32_TYPE unsigned int 1069 #define UINT16_TYPE unsigned short 1070 #define HAS_DBM 1071 #define HAS_FLOCK_LOCK 1072 #define INTERNAL_LOCK MYFLOCK_STYLE_FLOCK 1073 #define DEF_MAILBOX_LOCK "flock, dotlock" 1074 #define USE_STATFS 1075 #define HAVE_SYS_DIR_H 1076 #define STATFS_IN_SYS_VFS_H 1077 #define HAS_FSYNC 1078 #ifndef NO_NIS 1079 #define HAS_NIS 1080 #endif 1081 #define HAS_NETINFO 1082 #define MISSING_SETENV_PUTENV 1083 #define MISSING_MKFIFO 1084 #define MISSING_SIGSET_T 1085 #define MISSING_SIGACTION 1086 #define MISSING_STD_FILENOS 1087 #define MISSING_SETSID 1088 #define MISSING_WAITPID 1089 #define MISSING_UTIMBUF 1090 #define HAS_WAIT4 1091 #define WAIT_STATUS_T union wait 1092 #define NORMAL_EXIT_STATUS(x) (WIFEXITED(x) && !WEXITSTATUS (x)) 1093 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 1094 #define _PATH_MAILDIR "/usr/spool/mail" 1095 #define _PATH_BSHELL "/bin/sh" 1096 #define _PATH_DEFPATH "/bin:/usr/bin:/usr/ucb" 1097 #define _PATH_STDPATH "/bin:/usr/bin:/usr/ucb" 1098 #define ROOT_PATH "/bin:/usr/bin:/usr/etc:/usr/ucb" 1099 #define NATIVE_DB_TYPE "dbm" 1100 #define ALIAS_DB_MAP "netinfo:/aliases" 1101 #include <libc.h> 1102 #define MISSING_POSIX_S_IS 1103 #define MISSING_POSIX_S_MODES 1104 /* It's amazing what is all missing... */ 1105 #define isascii(c) ((unsigned)(c)<=0177) 1106 extern int opterr; 1107 typedef unsigned short mode_t; 1108 1109 #define MISSING_PID_T 1110 #define MISSING_STRFTIME_E 1111 #define FD_CLOEXEC 1 1112 #define O_NONBLOCK O_NDELAY 1113 #define WEXITSTATUS(x) ((x).w_retcode) 1114 #define WTERMSIG(x) ((x).w_termsig) 1115 #endif 1116 1117 /* 1118 * OPENSTEP does not have posix (some fix...) 1119 */ 1120 #ifdef OPENSTEP4 1121 #define SUPPORTED 1122 #define UINT32_TYPE unsigned int 1123 #define UINT16_TYPE unsigned short 1124 #define HAS_DBM 1125 #define HAS_FLOCK_LOCK 1126 #define INTERNAL_LOCK MYFLOCK_STYLE_FLOCK 1127 #define DEF_MAILBOX_LOCK "flock, dotlock" 1128 #define USE_STATFS 1129 #define HAVE_SYS_DIR_H 1130 #define STATFS_IN_SYS_VFS_H 1131 #define HAS_FSYNC 1132 #ifndef NO_NIS 1133 #define HAS_NIS 1134 #endif 1135 #define HAS_NETINFO 1136 #define MISSING_SETENV_PUTENV 1137 #define MISSING_MKFIFO 1138 #define MISSING_SIGSET_T 1139 #define MISSING_SIGACTION 1140 #define MISSING_STD_FILENOS 1141 #define MISSING_SETSID 1142 #define MISSING_WAITPID 1143 #define MISSING_UTIMBUF 1144 #define HAS_WAIT4 1145 #define WAIT_STATUS_T union wait 1146 #define NORMAL_EXIT_STATUS(x) (WIFEXITED(x) && !WEXITSTATUS (x)) 1147 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 1148 #define _PATH_MAILDIR "/usr/spool/mail" 1149 #define _PATH_BSHELL "/bin/sh" 1150 #define _PATH_DEFPATH "/bin:/usr/bin:/usr/ucb" 1151 #define _PATH_STDPATH "/bin:/usr/bin:/usr/ucb" 1152 #define ROOT_PATH "/bin:/usr/bin:/usr/etc:/usr/ucb" 1153 #define NATIVE_DB_TYPE "dbm" 1154 #define ALIAS_DB_MAP "netinfo:/aliases" 1155 #include <libc.h> 1156 #define MISSING_POSIX_S_IS 1157 #define MISSING_POSIX_S_MODES 1158 /* It's amazing what is all missing... */ 1159 #define isascii(c) ((unsigned)(c)<=0177) 1160 extern int opterr; 1161 typedef unsigned short mode_t; 1162 1163 #define MISSING_PID_T 1164 #define MISSING_STRFTIME_E 1165 #define FD_CLOEXEC 1 1166 #define O_NONBLOCK O_NDELAY 1167 #define WEXITSTATUS(x) ((x).w_retcode) 1168 #define WTERMSIG(x) ((x).w_termsig) 1169 #endif 1170 1171 #ifdef ReliantUnix543 1172 #define SUPPORTED 1173 #define UINT32_TYPE unsigned int 1174 #define UINT16_TYPE unsigned short 1175 #define MISSING_SETENV 1176 #define _PATH_DEFPATH "/usr/bin:/usr/ucb" 1177 #define _PATH_BSHELL "/bin/sh" 1178 #define _PATH_MAILDIR "/var/spool/mail" 1179 #define HAS_FCNTL_LOCK 1180 #define INTERNAL_LOCK MYFLOCK_STYLE_FCNTL 1181 #define DEF_MAILBOX_LOCK "fcntl, dotlock" 1182 #define HAS_FSYNC 1183 #define FIONREAD_IN_SYS_FILIO_H 1184 #define USE_SYS_SOCKIO_H 1185 #define HAS_DBM 1186 #define NATIVE_DB_TYPE "dbm" 1187 #define ALIAS_DB_MAP DEF_DB_TYPE ":/var/adm/sendmail/aliases" 1188 extern int optind; /* XXX use <getopt.h> */ 1189 extern char *optarg; /* XXX use <getopt.h> */ 1190 extern int opterr; /* XXX use <getopt.h> */ 1191 1192 #ifndef NO_NIS 1193 #define HAS_NIS 1194 #endif 1195 #define GETTIMEOFDAY(t) gettimeofday(t) 1196 #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb" 1197 #define USE_STATVFS 1198 #define STATVFS_IN_SYS_STATVFS_H 1199 #define MISSING_USLEEP 1200 #endif 1201 1202 #ifdef DCOSX1 /* Siemens Pyramid */ 1203 #define SUPPORTED 1204 #define UINT32_TYPE unsigned int 1205 #define UINT16_TYPE unsigned short 1206 #define _PATH_MAILDIR "/var/mail" 1207 #define _PATH_BSHELL "/bin/sh" 1208 #define _PATH_DEFPATH "/usr/bin:/usr/ucb" 1209 #define _PATH_STDPATH "/usr/bin:/usr/sbin:/usr/ucb" 1210 #define MISSING_SETENV 1211 #define HAS_FCNTL_LOCK 1212 #define INTERNAL_LOCK MYFLOCK_STYLE_FCNTL 1213 #define DEF_MAILBOX_LOCK "fcntl, dotlock" 1214 #define HAS_FSYNC 1215 #define NATIVE_DB_TYPE "hash" 1216 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/aliases" 1217 /* Uncomment the following line if you have NIS package installed */ 1218 /* #define HAS_NIS */ 1219 #define USE_SYS_SOCKIO_H 1220 #define GETTIMEOFDAY(t) gettimeofday(t,NULL) 1221 #define ROOT_PATH "/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb" 1222 #define FIONREAD_IN_SYS_FILIO_H 1223 #define DBM_NO_TRAILING_NULL 1224 #define USE_STATVFS 1225 #define STATVFS_IN_SYS_STATVFS_H 1226 #ifndef S_ISSOCK 1227 #define S_ISSOCK(mode) ((mode&0xF000) == 0xC000) 1228 #endif 1229 #endif 1230 1231 #ifdef SCO5 1232 #define SUPPORTED 1233 #include <sys/socket.h> 1234 extern int h_errno; 1235 1236 #define UINT32_TYPE unsigned int 1237 #define UINT16_TYPE unsigned short 1238 #define _PATH_MAILDIR "/usr/spool/mail" 1239 #define _PATH_BSHELL "/bin/sh" 1240 #define _PATH_DEFPATH "/bin:/usr/bin" 1241 #define USE_PATHS_H 1242 #define HAS_FCNTL_LOCK 1243 #define INTERNAL_LOCK MYFLOCK_STYLE_FCNTL 1244 #define DEF_MAILBOX_LOCK "fcntl, dotlock" 1245 #define HAS_FSYNC 1246 #define HAS_DBM 1247 #define NATIVE_DB_TYPE "dbm" 1248 #define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/mail/aliases" 1249 #define DBM_NO_TRAILING_NULL 1250 #ifndef NO_NIS 1251 #define HAS_NIS 1252 #endif 1253 #define GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *) 0) 1254 #define ROOT_PATH "/bin:/etc:/usr/bin:/tcb/bin" 1255 #define USE_STATVFS 1256 #define STATVFS_IN_SYS_STATVFS_H 1257 #define MISSING_SETENV 1258 #define STRCASECMP_IN_STRINGS_H 1259 /* SCO5 misses just S_ISSOCK, the others are there 1260 * Use C_ISSOCK definition from cpio.h. 1261 */ 1262 #include <cpio.h> 1263 #define S_ISSOCK(mode) (((mode) & (S_IFMT)) == (C_ISSOCK)) 1264 #define CANT_USE_SEND_RECV_MSG 1265 #define DEF_SMTP_CACHE_DEMAND 0 1266 #endif 1267 1268 /* 1269 * We're not going to try to guess like configure does. 1270 */ 1271 #ifndef SUPPORTED 1272 #error "unsupported platform" 1273 #endif 1274 1275 /* 1276 * Allow command line flags to override native settings 1277 */ 1278 #ifndef DEF_COMMAND_DIR 1279 #ifdef NATIVE_COMMAND_DIR 1280 #define DEF_COMMAND_DIR NATIVE_COMMAND_DIR 1281 #endif 1282 #endif 1283 1284 #ifndef DEF_DAEMON_DIR 1285 #ifdef NATIVE_DAEMON_DIR 1286 #define DEF_DAEMON_DIR NATIVE_DAEMON_DIR 1287 #endif 1288 #endif 1289 1290 #ifndef DEF_SENDMAIL_PATH 1291 #ifdef NATIVE_SENDMAIL_PATH 1292 #define DEF_SENDMAIL_PATH NATIVE_SENDMAIL_PATH 1293 #endif 1294 #endif 1295 1296 #ifndef DEF_MAILQ_PATH 1297 #ifdef NATIVE_MAILQ_PATH 1298 #define DEF_MAILQ_PATH NATIVE_MAILQ_PATH 1299 #endif 1300 #endif 1301 1302 #ifndef DEF_NEWALIAS_PATH 1303 #ifdef NATIVE_NEWALIAS_PATH 1304 #define DEF_NEWALIAS_PATH NATIVE_NEWALIAS_PATH 1305 #endif 1306 #endif 1307 1308 #ifndef DEF_DB_TYPE 1309 #define DEF_DB_TYPE NATIVE_DB_TYPE 1310 #endif 1311 1312 #define CAST_ANY_PTR_TO_INT(cptr) ((int) (long) (cptr)) 1313 #define CAST_INT_TO_VOID_PTR(ival) ((void *) (long) (ival)) 1314 1315 #ifdef DUP2_DUPS_CLOSE_ON_EXEC 1316 /* dup2_pass_on_exec() can be found in util/sys_compat.c */ 1317 extern int dup2_pass_on_exec(int oldd, int newd); 1318 1319 #define DUP2 dup2_pass_on_exec 1320 #else 1321 #define DUP2 dup2 1322 #endif 1323 1324 #ifdef PREPEND_PLUS_TO_OPTSTRING 1325 #define GETOPT(argc, argv, str) getopt((argc), (argv), "+" str) 1326 #else 1327 #define GETOPT(argc, argv, str) getopt((argc), (argv), (str)) 1328 #endif 1329 #define OPTIND (optind > 0 ? optind : 1) 1330 1331 #if !defined(__UCLIBC__) && !defined(NO_RES_SEND) 1332 #define HAVE_RES_SEND 1333 #else 1334 #undef HAVE_RES_SEND 1335 #endif 1336 1337 /* 1338 * Check for required but missing definitions. 1339 */ 1340 #if !defined(HAS_FCNTL_LOCK) && !defined(HAS_FLOCK_LOCK) 1341 #error "define HAS_FCNTL_LOCK and/or HAS_FLOCK_LOCK" 1342 #endif 1343 1344 #if !defined(DEF_MAILBOX_LOCK) 1345 #error "define DEF_MAILBOX_LOCK" 1346 #endif 1347 1348 #if !defined(INTERNAL_LOCK) 1349 #error "define INTERNAL_LOCK" 1350 #endif 1351 1352 #if defined(USE_STATFS) && defined(USE_STATVFS) 1353 #error "define USE_STATFS or USE_STATVFS, not both" 1354 #endif 1355 1356 #if !defined(USE_STATFS) && !defined(USE_STATVFS) 1357 #error "define USE_STATFS or USE_STATVFS" 1358 #endif 1359 1360 /* 1361 * Defaults for systems that pre-date IPv6 support. 1362 */ 1363 #ifndef __NetBSD__ 1364 #ifndef HAS_IPV6 1365 #include <sys/socket.h> 1366 #define EMULATE_IPV4_ADDRINFO 1367 #define MISSING_INET_PTON 1368 #define MISSING_INET_NTOP 1369 extern const char *inet_ntop(int, const void *, char *, SOCKADDR_SIZE); 1370 extern int inet_pton(int, const char *, void *); 1371 1372 #endif 1373 #endif 1374 1375 /* 1376 * Workaround: after a watchdog alarm signal, wake up from select/poll/etc. 1377 * by writing to a pipe. Solaris needs this, and HP-UX apparently, too. The 1378 * run-time cost is negligible so we just turn it on for all systems. As a 1379 * side benefit, making this code system-independent will simplify the 1380 * detection of bit-rot problems. 1381 */ 1382 #ifndef NO_WATCHDOG_PIPE 1383 #define USE_WATCHDOG_PIPE 1384 #endif 1385 1386 /* 1387 * If we don't have defined a preferred random device above, but the system 1388 * has /dev/urandom, then we use that. 1389 */ 1390 #if !defined(PREFERRED_RAND_SOURCE) && defined(HAS_DEV_URANDOM) 1391 #define PREFERRED_RAND_SOURCE "dev:/dev/urandom" 1392 #endif 1393 1394 /* 1395 * Defaults for systems without kqueue, /dev/poll or epoll support. 1396 * master/multi-server.c and *qmgr/qmgr_transport.c depend on this. 1397 */ 1398 #if !defined(EVENTS_STYLE) 1399 #define EVENTS_STYLE EVENTS_STYLE_SELECT 1400 #endif 1401 1402 #define EVENTS_STYLE_SELECT 1 /* Traditional BSD select */ 1403 #define EVENTS_STYLE_KQUEUE 2 /* FreeBSD kqueue */ 1404 #define EVENTS_STYLE_DEVPOLL 3 /* Solaris /dev/poll */ 1405 #define EVENTS_STYLE_EPOLL 4 /* Linux epoll */ 1406 1407 /* 1408 * We use poll() for read/write time limit enforcement on modern systems. We 1409 * use select() on historical systems without poll() support. And on systems 1410 * where poll() is not implemented for some file handle types, we try to use 1411 * select() as a fall-back solution (MacOS X needs this). 1412 */ 1413 #if !defined(USE_SYSV_POLL) && !defined(USE_SYSV_POLL_THEN_SELECT) 1414 #define USE_BSD_SELECT 1415 #endif 1416 1417 /* 1418 * The Postfix 2.9 post-install workaround assumes that the inet_protocols 1419 * default value is "ipv4" when Postfix is compiled without IPv6 support. 1420 */ 1421 #ifndef DEF_INET_PROTOCOLS 1422 #ifdef HAS_IPV6 1423 #define DEF_INET_PROTOCOLS INET_PROTO_NAME_ALL 1424 #else 1425 #define DEF_INET_PROTOCOLS INET_PROTO_NAME_IPV4 1426 #endif 1427 #endif 1428 1429 /* 1430 * Defaults for systems that pre-date POSIX socklen_t. 1431 */ 1432 #ifndef SOCKADDR_SIZE 1433 #define SOCKADDR_SIZE int 1434 #endif 1435 1436 #ifndef SOCKOPT_SIZE 1437 #define SOCKOPT_SIZE int 1438 #endif 1439 1440 /* 1441 * Defaults for normal systems. 1442 */ 1443 #ifndef LOCAL_LISTEN 1444 #define LOCAL_LISTEN unix_listen 1445 #define LOCAL_ACCEPT unix_accept 1446 #define LOCAL_CONNECT unix_connect 1447 #define LOCAL_TRIGGER unix_trigger 1448 #define LOCAL_SEND_FD unix_send_fd 1449 #define LOCAL_RECV_FD unix_recv_fd 1450 #endif 1451 1452 #if !defined (HAVE_SYS_NDIR_H) && !defined (HAVE_SYS_DIR_H) \ 1453 && !defined (HAVE_NDIR_H) 1454 #define HAVE_DIRENT_H 1455 #endif 1456 1457 #ifndef WAIT_STATUS_T 1458 typedef int WAIT_STATUS_T; 1459 1460 #define NORMAL_EXIT_STATUS(status) ((status) == 0) 1461 #endif 1462 1463 #ifdef NO_POSIX_GETPW_R 1464 #undef HAVE_POSIX_GETPW_R 1465 #endif 1466 1467 #ifdef NO_DB 1468 #undef HAS_DB 1469 #endif 1470 1471 #ifndef OCTAL_TO_UNSIGNED 1472 #define OCTAL_TO_UNSIGNED(res, str) ((res) = strtoul((str), (char **) 0, 8)) 1473 #endif 1474 1475 /* 1476 * Avoid useless type mis-matches when using sizeof in an integer context. 1477 */ 1478 #define INT_SIZEOF(foo) ((int) sizeof(foo)) 1479 1480 /* 1481 * Turn on the compatibility stuff. 1482 */ 1483 #ifdef MISSING_UTIMBUF 1484 struct utimbuf { 1485 time_t actime; 1486 time_t modtime; 1487 }; 1488 1489 #endif 1490 1491 #ifdef MISSING_STRERROR 1492 extern const char *strerror(int); 1493 1494 #endif 1495 1496 #if defined (MISSING_SETENV) || defined (MISSING_SETENV_PUTENV) 1497 extern int setenv(const char *, const char *, int); 1498 1499 #endif 1500 1501 #ifdef MISSING_SETEUID 1502 extern int seteuid(uid_t euid); 1503 1504 #endif 1505 1506 #ifdef MISSING_SETEGID 1507 extern int setegid(gid_t egid); 1508 1509 #endif 1510 1511 #ifdef MISSING_MKFIFO 1512 extern int mkfifo(char *, int); 1513 1514 #endif 1515 1516 #ifdef MISSING_WAITPID 1517 extern int waitpid(int, WAIT_STATUS_T *status, int options); 1518 1519 #endif 1520 1521 #ifdef MISSING_SETSID 1522 extern int setsid(void); 1523 1524 #endif 1525 1526 #ifndef HAS_CLOSEFROM 1527 extern int closefrom(int); 1528 1529 #endif 1530 1531 #ifdef MISSING_STD_FILENOS 1532 #define STDIN_FILENO 0 1533 #define STDOUT_FILENO 1 1534 #define STDERR_FILENO 2 1535 #endif 1536 1537 #ifdef MISSING_PID_T 1538 typedef int pid_t; 1539 1540 #endif 1541 1542 #ifdef MISSING_POSIX_S_IS 1543 #define S_ISBLK(mode) (((mode) & (_S_IFMT)) == (_S_IFBLK)) 1544 #define S_ISCHR(mode) (((mode) & (_S_IFMT)) == (_S_IFCHR)) 1545 #define S_ISDIR(mode) (((mode) & (_S_IFMT)) == (_S_IFDIR)) 1546 #define S_ISSOCK(mode) (((mode) & (_S_IFMT)) == (_S_IFSOCK)) 1547 #define S_ISFIFO(mode) (((mode) & (_S_IFMT)) == (_S_IFIFO)) 1548 #define S_ISREG(mode) (((mode) & (_S_IFMT)) == (_S_IFREG)) 1549 #define S_ISLNK(mode) (((mode) & (_S_IFMT)) == (_S_IFLNK)) 1550 #endif 1551 1552 #ifdef MISSING_POSIX_S_MODES 1553 #define S_IRUSR _S_IRUSR 1554 #define S_IRGRP 0000040 1555 #define S_IROTH 0000004 1556 #define S_IWUSR _S_IWUSR 1557 #define S_IWGRP 0000020 1558 #define S_IWOTH 0000002 1559 #define S_IXUSR _S_IXUSR 1560 #define S_IXGRP 0000010 1561 #define S_IXOTH 0000001 1562 #define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) 1563 #endif 1564 1565 /* 1566 * Memory alignment of memory allocator results. By default we align for 1567 * doubles. 1568 */ 1569 #ifndef ALIGN_TYPE 1570 #if defined(__hpux) && defined(__ia64) 1571 #define ALIGN_TYPE __float80 1572 #elif defined(__ia64__) 1573 #define ALIGN_TYPE long double 1574 #else 1575 #define ALIGN_TYPE double 1576 #endif 1577 #endif 1578 1579 /* 1580 * Clang-style attribute tests. 1581 * 1582 * XXX Without the unconditional test below, gcc 4.6 will barf on ``elif 1583 * defined(__clang__) && __has_attribute(__whatever__)'' with error message 1584 * ``missing binary operator before token "("''. 1585 */ 1586 #ifndef __has_attribute 1587 #define __has_attribute(x) 0 1588 #endif /* __has_attribute */ 1589 1590 /* 1591 * Need to specify what functions never return, so that the compiler can 1592 * warn for missing initializations and other trouble. However, OPENSTEP4 1593 * gcc 2.7.x cannot handle this so we define this only if NORETURN isn't 1594 * already defined above. 1595 * 1596 * Data point: gcc 2.7.2 has __attribute__ (Wietse Venema) but gcc 2.6.3 does 1597 * not (Clive Jones). So we'll set the threshold at 2.7. 1598 */ 1599 #ifndef NORETURN 1600 #if (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || __GNUC__ >= 3 1601 #define NORETURN void __attribute__((__noreturn__)) 1602 #elif defined(__clang__) && __has_attribute(__noreturn__) 1603 #define NORETURN void __attribute__((__noreturn__)) 1604 #else 1605 #define NORETURN void 1606 #endif 1607 #endif /* NORETURN */ 1608 1609 /* 1610 * Turn on format string argument checking. This is more accurate than 1611 * printfck, but it misses #ifdef-ed code. XXX I am just guessing at what 1612 * gcc versions support this. In order to turn this off for some platforms, 1613 * specify #define PRINTFLIKE and #define SCANFLIKE in the system-dependent 1614 * sections above. 1615 */ 1616 #ifndef PRINTFLIKE 1617 #if (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || __GNUC__ >= 3 1618 #define PRINTFLIKE(x,y) __attribute__ ((format (printf, (x), (y)))) 1619 #elif defined(__clang__) && __has_attribute(__format__) 1620 #define PRINTFLIKE(x,y) __attribute__ ((__format__ (__printf__, (x), (y)))) 1621 #else 1622 #define PRINTFLIKE(x,y) 1623 #endif 1624 #endif /* PRINTFLIKE */ 1625 1626 #ifndef SCANFLIKE 1627 #if (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || __GNUC__ >= 3 1628 #define SCANFLIKE(x,y) __attribute__ ((format (scanf, (x), (y)))) 1629 #elif defined(__clang__) && __has_attribute(__format__) 1630 #define SCANFLIKE(x,y) __attribute__ ((__format__ (__scanf__, (x), (y)))) 1631 #else 1632 #define SCANFLIKE(x,y) 1633 #endif 1634 #endif /* SCANFLIKE */ 1635 1636 /* 1637 * Some gcc implementations don't grok these attributes with pointer to 1638 * function. Again, wild guess of what is supported. To override, specify 1639 * #define PRINTFPTRLIKE in the system-dependent sections above. 1640 */ 1641 #ifndef PRINTFPTRLIKE 1642 #if (__GNUC__ >= 3) /* XXX Rough estimate */ 1643 #define PRINTFPTRLIKE(x,y) PRINTFLIKE(x,y) 1644 #elif defined(__clang__) && __has_attribute(__format__) 1645 #define PRINTFPTRLIKE(x,y) __attribute__ ((__format__ (__printf__, (x), (y)))) 1646 #else 1647 #define PRINTFPTRLIKE(x,y) 1648 #endif 1649 #endif 1650 1651 /* 1652 * Compiler optimization hint. This makes sense only for code in a 1653 * performance-critical loop. 1654 */ 1655 #ifndef EXPECTED 1656 #if defined(__GNUC__) && (__GNUC__ > 2) 1657 #define EXPECTED(x) __builtin_expect(!!(x), 1) 1658 #define UNEXPECTED(x) __builtin_expect(!!(x), 0) 1659 #else 1660 #define EXPECTED(x) (x) 1661 #define UNEXPECTED(x) (x) 1662 #endif 1663 #endif 1664 1665 /* 1666 * Warn about ignored function result values that must never be ignored. 1667 * Typically, this is for error results from "read" functions that normally 1668 * write to output parameters (for example, stat- or scanf-like functions) 1669 * or from functions that have other useful side effects (for example, 1670 * fseek- or rename-like functions). 1671 * 1672 * DO NOT use this for functions that write to a stream; it is entirely 1673 * legitimate to detect write errors with fflush() or fclose() only. On the 1674 * other hand most (but not all) functions that read from a stream must 1675 * never ignore result values. 1676 * 1677 * XXX Prepending "(void)" won't shut up GCC. Clang behaves as expected. 1678 */ 1679 #if ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ > 3) 1680 #define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) 1681 #elif defined(__clang__) && __has_attribute(warn_unused_result) 1682 #define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) 1683 #else 1684 #define WARN_UNUSED_RESULT 1685 #endif 1686 1687 /* 1688 * ISO C says that the "volatile" qualifier protects against optimizations 1689 * that cause longjmp() to clobber local variables. 1690 */ 1691 #ifndef NOCLOBBER 1692 #define NOCLOBBER volatile 1693 #endif 1694 1695 /* 1696 * Bit banging!! There is no official constant that defines the INT_MAX 1697 * equivalent for off_t, ssize_t, etc. Wietse came up with the following 1698 * macro that works as long as off_t, ssize_t, etc. use one's or two's 1699 * complement logic (that is, the maximum value is binary 01...1). Don't use 1700 * right-shift for signed types: the result is implementation-defined. 1701 */ 1702 #include <limits.h> 1703 #define __MAXINT__(T) ((T) ~(((T) 1) << ((sizeof(T) * CHAR_BIT) - 1))) 1704 #ifndef OFF_T_MAX 1705 #define OFF_T_MAX __MAXINT__(off_t) 1706 #endif 1707 1708 #ifndef SSIZE_T_MAX 1709 #define SSIZE_T_MAX __MAXINT__(ssize_t) 1710 #endif 1711 1712 /* 1713 * Consistent enforcement of size limits. 1714 */ 1715 #define ENFORCING_SIZE_LIMIT(param) ((param) > 0) 1716 1717 /* 1718 * Don't mix socket message send/receive calls with socket stream read/write 1719 * calls. The fact that you can get away with it only on some stacks implies 1720 * that there is no long-term guarantee. 1721 */ 1722 #ifndef CAN_WRITE_BEFORE_SENDING_FD 1723 #define CANT_WRITE_BEFORE_SENDING_FD 1724 #endif 1725 1726 /* 1727 * FreeBSD sendmsg(2) says that after sending a file descriptor, the sender 1728 * must not immediately close the descriptor, otherwise it may close the 1729 * descriptor before it is actually sent. 1730 */ 1731 #ifndef DONT_WAIT_AFTER_SENDING_FD 1732 #define MUST_READ_AFTER_SENDING_FD 1733 #endif 1734 1735 /* 1736 * Hope for the best. 1737 */ 1738 #ifndef UINT32_TYPE 1739 #define UINT32_TYPE uint32_t 1740 #define UINT16_TYPE uint16_t 1741 #endif 1742 #define UINT32_SIZE 4 1743 #define UINT16_SIZE 2 1744 1745 /* 1746 * For the sake of clarity. 1747 */ 1748 #ifndef HAVE_CONST_CHAR_STAR 1749 typedef const char *CONST_CHAR_STAR; 1750 1751 #endif 1752 1753 /* 1754 * Safety. On some systems, ctype.h misbehaves with non-ASCII or negative 1755 * characters. More importantly, Postfix uses the ISXXX() macros to ensure 1756 * protocol compliance, so we have to rule out non-ASCII characters. 1757 * 1758 * XXX The (unsigned char) casts in isalnum() etc arguments are unnecessary 1759 * because the ISASCII() guard already ensures that the values are 1760 * non-negative; the casts are done anyway to shut up chatty compilers. 1761 */ 1762 #define ISASCII(c) isascii(_UCHAR_(c)) 1763 #define _UCHAR_(c) ((unsigned char)(c)) 1764 #define ISALNUM(c) (ISASCII(c) && isalnum((unsigned char)(c))) 1765 #define ISALPHA(c) (ISASCII(c) && isalpha((unsigned char)(c))) 1766 #define ISCNTRL(c) (ISASCII(c) && iscntrl((unsigned char)(c))) 1767 #define ISDIGIT(c) (ISASCII(c) && isdigit((unsigned char)(c))) 1768 #define ISGRAPH(c) (ISASCII(c) && isgraph((unsigned char)(c))) 1769 #define ISLOWER(c) (ISASCII(c) && islower((unsigned char)(c))) 1770 #define ISPRINT(c) (ISASCII(c) && isprint((unsigned char)(c))) 1771 #define ISPUNCT(c) (ISASCII(c) && ispunct((unsigned char)(c))) 1772 #define ISSPACE(c) (ISASCII(c) && isspace((unsigned char)(c))) 1773 #define ISUPPER(c) (ISASCII(c) && isupper((unsigned char)(c))) 1774 #define TOLOWER(c) (ISUPPER(c) ? tolower((unsigned char)(c)) : (c)) 1775 #define TOUPPER(c) (ISLOWER(c) ? toupper((unsigned char)(c)) : (c)) 1776 1777 /* 1778 * Character sets for parsing. 1779 */ 1780 #define CHARS_COMMA_SP ", \t\r\n" /* list separator */ 1781 #define CHARS_SPACE " \t\r\n" /* word separator */ 1782 #define CHARS_BRACE "{}" /* grouping */ 1783 1784 /* 1785 * Scaffolding. I don't want to lose messages while the program is under 1786 * development. 1787 */ 1788 extern int REMOVE(const char *); 1789 1790 /* LICENSE 1791 /* .ad 1792 /* .fi 1793 /* The Secure Mailer license must be distributed with this software. 1794 /* AUTHOR(S) 1795 /* Wietse Venema 1796 /* IBM T.J. Watson Research 1797 /* P.O. Box 704 1798 /* Yorktown Heights, NY 10598, USA 1799 /* 1800 /* Wietse Venema 1801 /* Google, Inc. 1802 /* 111 8th Avenue 1803 /* New York, NY 10011, USA 1804 /*--*/ 1805 1806 #endif 1807