1/*$Id: includes.h,v 1.77 2001/08/25 04:38:37 guenther Exp $*/ 2 3#include "../autoconf.h" 4#ifdef NO_const 5#ifdef const 6#undef const 7#endif 8#define const 9#endif 10#include "../config.h" 11 /* not all the "library identifiers" specified here need to be 12 available for all programs in this package; some have substitutes 13 as well (see autoconf); this is just an informal list */ 14 15#ifndef _HPUX_SOURCE 16#define _HPUX_SOURCE /* sad, but needed on HP-UX when compiling -Aa */ 17#endif 18#ifndef NO_FIX_MALLOC 19#define NO_FIX_MALLOC /* we don't need a `fixed' malloc(0) call */ 20#endif /* saves a few bytes in some implementations */ 21 22#include <sys/types.h> /* pid_t mode_t uid_t gid_t off_t */ 23#ifndef LIMITS_H_MISSING 24#include <limits.h> /* absolutely nothing, just for fun */ 25#undef LIMITS_H_MISSING 26#endif 27#ifndef UNISTD_H_MISSING 28#include <unistd.h> /* open() read() write() close() dup() pipe() 29 /* fork() getuid() geteuid() getgid() getegid() 30 getpid() execv() execvp() sleep() setuid() 31 setgid() setruid() setrgid() setegid() 32 chown() nice() ftruncate() truncate() */ 33#undef EX_OK 34#else 35#undef UNISTD_H_MISSING 36#endif 37#include <stdio.h> /* setbuf() fclose() stdin stdout stderr 38 /* fopen() fread() fwrite() fgetc() getc() 39 getchar() fdopen() putc() fputs() printf() 40 sprintf() fprintf() sscanf() FILE EOF 41 fileno() */ 42#ifndef STDDEF_H_MISSING 43#include <stddef.h> /* ptrdiff_t size_t */ 44#else 45#undef STDDEF_H_MISSING 46#endif 47#ifndef STDLIB_H_MISSING 48#include <stdlib.h> /* getenv() malloc() realloc() free() 49 /* strtol() strtod() exit() EXIT_SUCCESS */ 50#endif 51#include <time.h> /* time() ctime() time_t */ 52#include <fcntl.h> /* fcntl() struct flock O_RDONLY O_WRONLY 53 /* O_APPEND O_CREAT O_EXCL */ 54#include <grp.h> /* getgrgid() struct group */ 55#include <pwd.h> /* getpwuid() getpwnam() struct passwd */ 56#ifndef DIRENT_H_MISSING 57#include <dirent.h> /* opendir() readdir() closedir() DIR 58 /* struct dirent */ 59#endif 60#ifndef SYS_WAIT_H_MISSING 61#include <sys/wait.h> /* wait() waitpid() WIFEXITED() WIFSTOPPED() 62 /* WEXITSTATUS() WTERMSIG() WNOHANG */ 63#else 64#undef SYS_WAIT_H_MISSING 65#endif 66#ifndef SYS_UTSNAME_H_MISSING 67#include <sys/utsname.h> /* uname() utsname */ 68#endif 69#include <sys/stat.h> /* stat() S_ISDIR() S_ISREG() struct stat 70 /* chmod() mkdir() */ 71#include <signal.h> /* signal() kill() alarm() SIG_IGN SIGHUP 72 /* SIGINT SIGQUIT SIGALRM SIGTERM */ 73#ifndef STRING_H_MISSING 74#include <string.h> /* strcpy() strcat() strlen() 75 /* strspn() strcspn() strchr() strcmp() 76 strncmp() strpbrk() strstr() memmove() 77 strncasecmp() memset() */ 78#endif 79#ifndef MATH_H_MISSING 80#include <math.h> /* pow() */ 81#endif 82#ifndef SYSLOG_H_MISSING 83#include <syslog.h> /* openlog() syslog() closelog() LOG_EMERG 84 /* LOG_ALERT LOG_CRIT LOG_ERR LOG_NOTICE 85 LOG_PID LOG_MAIL */ 86#endif 87#include <errno.h> /* EINTR EEXIST ENFILE EACCES EAGAIN EXDEV */ 88 /* EDQUOT ENOSPC strerror() */ 89#ifndef SYSEXITS_H_MISSING 90#include <sysexits.h> /* EX_USAGE EX_DATAERR EX_NOINPUT EX_NOUSER 91 EX_UNAVAILABLE EX_OSERR EX_OSFILE 92 EX_CANTCREAT EX_IOERR EX_TEMPFAIL 93 EX_NOPERM EX__BASE */ 94#endif 95 96#ifdef STDLIB_H_MISSING 97#undef STDLIB_H_MISSING 98void*malloc(),*realloc(); 99const char*getenv(); 100#endif 101#ifdef DIRENT_H_MISSING 102#undef DIRENT_H_MISSING 103#ifndef NDIR_H_MISSING 104#include <ndir.h> 105#define dirent direct 106#else 107#undef NDIR_H_MISSING 108#ifndef SYS_NDIR_H_MISSING 109#include <sys/ndir.h> 110#define dirent direct 111#else 112#undef SYS_NDIR_H_MISSING 113#ifndef SYS_DIR_H_MISSING 114#include <sys/dir.h> 115#define dirent direct 116#else /* due to brain-damaged NeXT sys/dirent.h contents */ 117#undef SYS_DIR_H_MISSING 118#ifndef SYS_DIRENT_H_MISSING /* sys/dirent.h must be moved down here */ 119#include <sys/dirent.h> 120#else 121/*#undef SYS_DIRENT_H_MISSING /* needed by autoconf */ 122/* I give up, I can only hope that your system defines DIR and struct dirent */ 123#endif 124#endif 125#endif 126#endif 127#endif /* DIRENT_H_MISSING */ 128#ifdef STRING_H_MISSING 129#undef STRING_H_MISSING 130#include <strings.h> 131#ifndef strchr 132char*strchr(); 133#endif 134char*strpbrk(); 135#endif 136#ifdef SYS_UTSNAME_H_MISSING 137#undef SYS_UTSNAME_H_MISSING 138#define NOuname 139#endif 140#ifdef MATH_H_MISSING 141#undef MATH_H_MISSING 142double pow(); 143#endif 144#ifdef SYSEXITS_H_MISSING 145#undef SYSEXITS_H_MISSING 146 /* Standard exitcodes, original list maintained 147 by Eric Allman (eric@Sendmail.COM) */ 148#define EX__BASE 64 149#define EX_USAGE 64 150#define EX_DATAERR 65 151#define EX_NOINPUT 66 152#define EX_NOUSER 67 153#define EX_UNAVAILABLE 69 154#define EX_OSERR 71 155#define EX_OSFILE 72 156#define EX_CANTCREAT 73 157#define EX_IOERR 74 158#define EX_TEMPFAIL 75 159#define EX_NOPERM 77 160#endif 161 162#ifndef EXIT_SUCCESS 163#define EXIT_SUCCESS 0 164#endif 165 166#ifdef NO_exit 167#define _exit(sig) exit(sig) 168#endif 169 170#if O_SYNC 171#else 172#undef O_SYNC 173#define O_SYNC 0 174#endif 175#ifndef O_RDONLY 176#define O_RDONLY 0 177#define O_WRONLY 1 178#endif 179#ifndef SEEK_SET 180#define SEEK_SET 0 181#define SEEK_CUR 1 182#define SEEK_END 2 183#endif 184#ifndef tell 185#define tell(fd) lseek(fd,(off_t)0,SEEK_CUR) 186#endif 187 188#ifndef EWOULDBLOCK 189#define EWOULDBLOCK EAGAIN 190#endif 191#ifndef EAGAIN 192#define EAGAIN EINTR 193#endif 194 195#ifndef EOF 196#define EOF (-1) 197#endif 198 199#ifndef S_ISDIR 200#define S_ISDIR(mode) (((mode)&S_IFMT)==S_IFDIR) 201#ifndef S_IFDIR 202#define S_IFDIR 0040000 203#endif 204#endif 205 206#ifndef S_ISREG 207#define S_ISREG(mode) (((mode)&S_IFMT)==S_IFREG) 208#ifndef S_IFREG 209#define S_IFREG 0100000 210#endif 211#endif 212 213#ifndef S_ISLNK 214#ifndef S_IFLNK 215#define lstat(path,stbuf) stat(path,stbuf) 216#define S_ISLNK(mode) 0 217#else 218#define S_ISLNK(mode) (((mode)&S_IFMT)==S_IFLNK) 219#endif 220#endif 221 222#ifndef S_IFMT 223#define S_IFMT 0170000 224#endif 225 226#ifndef S_IRWXU 227#define S_IRWXU 00700 228#define S_IRWXG 00070 229#define S_IRWXO 00007 230#endif 231#ifndef S_IWUSR 232#ifdef S_IREAD 233#define S_IRUSR S_IREAD 234#define S_IWUSR S_IWRITE 235#define S_IXUSR S_IEXEC 236#else 237#define S_IRUSR 0400 238#define S_IWUSR 0200 239#define S_IXUSR 0100 240#endif /* S_IREAD */ 241#define S_IRGRP 0040 242#define S_IWGRP 0020 243#define S_IXGRP 0010 244#define S_IROTH 0004 245#define S_IWOTH 0002 246#define S_IXOTH 0001 247#endif /* S_IWUSR */ 248#ifndef S_ISGID 249#define S_ISUID 04000 250#define S_ISGID 02000 251#endif 252#ifndef S_ISVTX 253#define S_ISVTX 01000 254#endif 255 256#ifdef WMACROS_NON_POSIX 257#undef WMACROS_NON_POSIX 258#ifdef WIFEXITED 259#undef WIFEXITED 260#endif 261#ifdef WIFSTOPPED 262#undef WIFSTOPPED 263#endif 264#ifdef WEXITSTATUS 265#undef WEXITSTATUS 266#endif 267#ifdef WTERMSIG 268#undef WTERMSIG 269#endif 270#endif /* WMACROS_NON_POSIX */ 271 272#ifndef WIFEXITED 273#define WIFEXITED(waitval) (!((waitval)&255)) 274#endif 275#ifndef WIFSTOPPED 276#define WIFSTOPPED(waitval) (((waitval)&255)==127) 277#endif 278#ifndef WEXITSTATUS 279#define WEXITSTATUS(waitval) ((waitval)>>8&255) 280#endif 281#ifndef WTERMSIG 282#define WTERMSIG(waitval) ((waitval)&255) 283#endif 284 285extern /*const*/char**environ; 286extern int errno; 287 288#ifndef STDIN_FILENO 289#define STDIN 0 290#define STDOUT 1 291#define STDERR 2 292#else 293#define STDIN STDIN_FILENO 294#define STDOUT STDOUT_FILENO 295#define STDERR STDERR_FILENO 296#endif 297 298#ifdef NO_fcntl_LOCK 299#ifndef NOfcntl_lock 300#define NOfcntl_lock 301#endif 302#endif 303#ifdef NO_lockf_LOCK 304#ifdef USElockf 305#undef USElockf 306#endif 307#endif 308#ifdef NO_flock_LOCK 309#ifdef USEflock 310#undef USEflock 311#endif 312#endif 313 314#ifdef SYSLOG_H_MISSING 315#undef SYSLOG_H_MISSING 316#define Openlog(ident,logopt,facility) 0 317#define syslog (void) 318#define closelog() 319#define LOG_EMERG 0 320#define LOG_CRIT 0 321#define LOG_ALERT 0 322#define LOG_ERR 0 323#define LOG_NOTICE 0 324#else 325#ifdef LOG_MAIL 326#define Openlog(ident,logopt,facility) openlog(ident,logopt,facility) 327#else 328#define Openlog(ident,logopt,facility) openlog(ident,logopt) 329#endif 330#endif 331 332#ifndef NOuname 333#ifndef P /* SINIX V5.23 has the wrong prototype for uname() */ 334extern int uname(); /* so we fix it :-) */ 335#define Uname(name) ((int(*)(struct utsname*))uname)(name) 336#else 337#define Uname(name) uname(name) /* no fix needed */ 338#endif /* P */ 339#endif /* NOuname */ 340 /* NEWS OS 5.X has the wrong prototype here */ 341#define Fdopen(fd,type) ((FILE*)fdopen(fd,type)) 342 343#ifdef u 344#undef u /* and the winner is: AIX 3.2 */ 345#endif 346 347#ifndef strchr /* for very old K&R compatible include files with */ 348#ifdef P /* new K&R libraries */ 349#ifdef void 350#ifdef NO_const 351extern char*strchr(); 352extern char*strpbrk(); 353extern char*strstr(); 354extern void*memmove(); 355#endif 356#endif 357#endif 358#endif 359 360#define Const /*const*/ /* Convex cc doesn't grok this */ 361 362#ifndef P /* no prototypes without const */ 363#ifdef NO_const 364#define P(args) () 365#endif 366#endif 367 368#ifdef NOrename 369#undef NOrename 370#define rename(old,new) (-(link(old,new)||unlink(old))) 371#endif 372 373#ifndef NOsetregid 374#ifdef NOsetrgid 375#define setrgid(gid) setregid(gid,-1) 376#define setruid(uid) setreuid(uid,-1) 377#endif 378#ifdef NOsetegid 379#define setegid(gid) setregid(-1,gid) 380#endif 381#else 382#ifndef NOsetresgid 383#ifdef NOsetrgid 384#define setrgid(gid) setresgid(gid,-1,-1) 385#define setruid(uid) setresuid(uid,-1,-1) 386#endif 387#ifdef NOsetegid 388#define setegid(gid) setresgid(-1,gid,-1) 389#endif 390#else 391#ifdef NOsetrgid 392#define setrgid(gid) (-1) 393#define setruid(uid) (-1) 394#endif 395#ifdef NOsetegid 396#define setegid(gid) setgid(gid) 397#endif 398#endif 399#endif 400 401#ifdef NOsetrgid 402#undef NOsetrgid 403#endif 404#ifdef NOsetegid 405#undef NOsetegid 406#endif 407#ifdef NOsetregid 408#undef NOsetregid 409#endif 410#ifdef NOsetresgid 411#undef NOsetresgid 412#endif 413 414#ifdef setrgid_BRAIN_DAMAGE 415#undef setrgid_BRAIN_DAMAGE 416#ifdef setrgid 417#undef setrgid 418#endif 419#ifdef setruid 420#undef setruid 421#endif 422#define setrgid(gid) (-1) /* and you think POSIX is broken? */ 423#define setruid(uid) (-1) /* BSD 4.4 just topped it */ 424#endif 425 426#ifdef setrgid_RUNTIME_CHECK 427#undef setrgid_RUNTIME_CHECK 428#define setRgid(gid) (setrgid(gid)||getgid()!=(gid)) 429#define setRuid(uid) (setruid(uid)||getuid()!=(uid)) 430#else 431#define setRgid(gid) setrgid(gid) 432#define setRuid(uid) setruid(uid) 433#endif 434 435#ifdef NOinitgroups 436/*#undef NOinitgroups need this macro in autoconf */ 437#define initgroups(n,g) 438#endif 439 440#ifdef INEFFICIENTrealloc 441#undef INEFFICIENTrealloc 442#define EXPBLKSIZ 4 /* 4+3+2+1 = 10 bits total shift */ 443#else 444#define EXPBLKSIZ 0 445#endif 446 447#ifdef NOpow 448#define tpow(x,y) (x) 449#else 450#define tpow(x,y) pow(x,y) 451#endif 452 453#ifdef NOmkdir 454#undef NOmkdir 455#define mkdir(dir,mode) (-1) 456#endif 457 458#ifdef NOftruncate 459#undef NOftruncate 460#define ftruncate(fildes,length) (-1) 461#define truncate(file,length) (-1) 462#endif 463 464#ifdef NOfsync 465#define fsync(fd) 0 466#endif 467 468#ifdef NOfstat 469#define fstat(fd,st) (-1) 470#endif 471 472#ifdef NOwaitpid 473#undef NOwaitpid 474#define waitpid(pid,stat_loc,options) 0 475#else 476#ifndef WNOHANG 477#ifdef waitpid 478#undef waitpid 479#endif 480#define waitpid(pid,stat_loc,options) 0 481#endif 482#endif 483 484#ifdef NOmemmove 485#define memmove(to,from,count) smemmove(to,from,count) 486#endif 487 488#ifdef NOstrpbrk 489#define strpbrk(s,d) sstrpbrk(s,d) 490#endif 491 492#ifdef SLOWstrstr 493#ifdef strstr 494#undef strstr 495#endif 496#define strstr(haystack,needle) sstrstr(haystack,needle) 497#endif 498 499#ifdef NOmemset 500#ifdef NObzero 501#define NEEDbbzero 502#else 503#define bbzero(s,l) bzero(s,l) 504#endif 505#else 506#define bbzero(s,l) memset(s,'\0',l) 507#endif 508 509#ifdef NOstrlcat 510#define strlcat(d,s,z) sstrlcat(d,s,z) 511#define strlcpy(d,s,z) sstrlcpy(d,s,z) 512#endif 513 514#ifdef NOstrerror 515#define strerror(e) sstrerror(e) 516#endif 517 518#ifdef NOstrtol 519#define strtol(s,p,b) sstrtol(s,p,b) 520#endif 521 522#ifndef P 523#define P(args) args 524#endif 525 526/* 527 * Until function definitions are ANSI, any function whose argument list 528 * includes a size_t, uid_t, gid_t, mode_t, pid_t, or time_t type variable 529 * should be declared with Q() instead of P(). This is done to prevent 530 * problems caused by one of those types being shorter than int and thereby 531 * being passed differently under ANSI rules. 532 */ 533#define Q(args) () 534 535#ifdef oBRAIN_DAMAGE 536#undef oBRAIN_DAMAGE 537#undef offsetof 538#endif 539#ifndef offsetof 540#define offsetof(s,m) ((char*)&(((s*)sizeof(s))->m)-(char*)sizeof(s)) 541#endif 542 543#define SETerrno(v) (errno=(v)) /* multi-threading errno hook */ 544 545#define PROGID /*const*/char progid[]="Stephen R. van den Berg" 546#define maxindex(x) (sizeof(x)/sizeof((x)[0])-1) 547#define STRLEN(x) (sizeof(x)-1) 548#define ioffsetof(s,m) ((int)offsetof(s,m)) 549#define numeric(x) (alphanum((unsigned char)(x))>1) 550#define sizeNUM(v) (8*sizeof(v)*4/10+1+1) 551#define charNUM(num,v) char num[sizeNUM(v)] 552 553#define mx(a,b) ((a)>(b)?(a):(b)) 554 555typedef unsigned char uschar; /* sometimes uchar is already typedef'd */ 556#ifdef uchar 557#undef uchar 558#endif 559#define uchar uschar 560 561#if ! (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) 562#define __attribute__(foo) 563#endif 564 565#if defined(__OpenBSD__) && defined(DEBUGGING) 566#define setuid(x) 0 /* Under OpenBSD, you can't trace a */ 567#define setgid(x) 0 /* program after it calls any of these */ 568#define setegid(x) 0 569#endif 570