/*$Id: includes.h,v 1.77 2001/08/25 04:38:37 guenther Exp $*/ #include "../autoconf.h" #ifdef NO_const #ifdef const #undef const #endif #define const #endif #include "../config.h" /* not all the "library identifiers" specified here need to be available for all programs in this package; some have substitutes as well (see autoconf); this is just an informal list */ #ifndef _HPUX_SOURCE #define _HPUX_SOURCE /* sad, but needed on HP-UX when compiling -Aa */ #endif #ifndef NO_FIX_MALLOC #define NO_FIX_MALLOC /* we don't need a `fixed' malloc(0) call */ #endif /* saves a few bytes in some implementations */ #include /* pid_t mode_t uid_t gid_t off_t */ #ifndef LIMITS_H_MISSING #include /* absolutely nothing, just for fun */ #undef LIMITS_H_MISSING #endif #ifndef UNISTD_H_MISSING #include /* open() read() write() close() dup() pipe() /* fork() getuid() geteuid() getgid() getegid() getpid() execv() execvp() sleep() setuid() setgid() setruid() setrgid() setegid() chown() nice() ftruncate() truncate() */ #undef EX_OK #else #undef UNISTD_H_MISSING #endif #include /* setbuf() fclose() stdin stdout stderr /* fopen() fread() fwrite() fgetc() getc() getchar() fdopen() putc() fputs() printf() sprintf() fprintf() sscanf() FILE EOF fileno() */ #ifndef STDDEF_H_MISSING #include /* ptrdiff_t size_t */ #else #undef STDDEF_H_MISSING #endif #ifndef STDLIB_H_MISSING #include /* getenv() malloc() realloc() free() /* strtol() strtod() exit() EXIT_SUCCESS */ #endif #include /* time() ctime() time_t */ #include /* fcntl() struct flock O_RDONLY O_WRONLY /* O_APPEND O_CREAT O_EXCL */ #include /* getgrgid() struct group */ #include /* getpwuid() getpwnam() struct passwd */ #ifndef DIRENT_H_MISSING #include /* opendir() readdir() closedir() DIR /* struct dirent */ #endif #ifndef SYS_WAIT_H_MISSING #include /* wait() waitpid() WIFEXITED() WIFSTOPPED() /* WEXITSTATUS() WTERMSIG() WNOHANG */ #else #undef SYS_WAIT_H_MISSING #endif #ifndef SYS_UTSNAME_H_MISSING #include /* uname() utsname */ #endif #include /* stat() S_ISDIR() S_ISREG() struct stat /* chmod() mkdir() */ #include /* signal() kill() alarm() SIG_IGN SIGHUP /* SIGINT SIGQUIT SIGALRM SIGTERM */ #ifndef STRING_H_MISSING #include /* strcpy() strcat() strlen() /* strspn() strcspn() strchr() strcmp() strncmp() strpbrk() strstr() memmove() strncasecmp() memset() */ #endif #ifndef MATH_H_MISSING #include /* pow() */ #endif #ifndef SYSLOG_H_MISSING #include /* openlog() syslog() closelog() LOG_EMERG /* LOG_ALERT LOG_CRIT LOG_ERR LOG_NOTICE LOG_PID LOG_MAIL */ #endif #include /* EINTR EEXIST ENFILE EACCES EAGAIN EXDEV */ /* EDQUOT ENOSPC strerror() */ #ifndef SYSEXITS_H_MISSING #include /* EX_USAGE EX_DATAERR EX_NOINPUT EX_NOUSER EX_UNAVAILABLE EX_OSERR EX_OSFILE EX_CANTCREAT EX_IOERR EX_TEMPFAIL EX_NOPERM EX__BASE */ #endif #ifdef STDLIB_H_MISSING #undef STDLIB_H_MISSING void*malloc(),*realloc(); const char*getenv(); #endif #ifdef DIRENT_H_MISSING #undef DIRENT_H_MISSING #ifndef NDIR_H_MISSING #include #define dirent direct #else #undef NDIR_H_MISSING #ifndef SYS_NDIR_H_MISSING #include #define dirent direct #else #undef SYS_NDIR_H_MISSING #ifndef SYS_DIR_H_MISSING #include #define dirent direct #else /* due to brain-damaged NeXT sys/dirent.h contents */ #undef SYS_DIR_H_MISSING #ifndef SYS_DIRENT_H_MISSING /* sys/dirent.h must be moved down here */ #include #else /*#undef SYS_DIRENT_H_MISSING /* needed by autoconf */ /* I give up, I can only hope that your system defines DIR and struct dirent */ #endif #endif #endif #endif #endif /* DIRENT_H_MISSING */ #ifdef STRING_H_MISSING #undef STRING_H_MISSING #include #ifndef strchr char*strchr(); #endif char*strpbrk(); #endif #ifdef SYS_UTSNAME_H_MISSING #undef SYS_UTSNAME_H_MISSING #define NOuname #endif #ifdef MATH_H_MISSING #undef MATH_H_MISSING double pow(); #endif #ifdef SYSEXITS_H_MISSING #undef SYSEXITS_H_MISSING /* Standard exitcodes, original list maintained by Eric Allman (eric@Sendmail.COM) */ #define EX__BASE 64 #define EX_USAGE 64 #define EX_DATAERR 65 #define EX_NOINPUT 66 #define EX_NOUSER 67 #define EX_UNAVAILABLE 69 #define EX_OSERR 71 #define EX_OSFILE 72 #define EX_CANTCREAT 73 #define EX_IOERR 74 #define EX_TEMPFAIL 75 #define EX_NOPERM 77 #endif #ifndef EXIT_SUCCESS #define EXIT_SUCCESS 0 #endif #ifdef NO_exit #define _exit(sig) exit(sig) #endif #if O_SYNC #else #undef O_SYNC #define O_SYNC 0 #endif #ifndef O_RDONLY #define O_RDONLY 0 #define O_WRONLY 1 #endif #ifndef SEEK_SET #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 #endif #ifndef tell #define tell(fd) lseek(fd,(off_t)0,SEEK_CUR) #endif #ifndef EWOULDBLOCK #define EWOULDBLOCK EAGAIN #endif #ifndef EAGAIN #define EAGAIN EINTR #endif #ifndef EOF #define EOF (-1) #endif #ifndef S_ISDIR #define S_ISDIR(mode) (((mode)&S_IFMT)==S_IFDIR) #ifndef S_IFDIR #define S_IFDIR 0040000 #endif #endif #ifndef S_ISREG #define S_ISREG(mode) (((mode)&S_IFMT)==S_IFREG) #ifndef S_IFREG #define S_IFREG 0100000 #endif #endif #ifndef S_ISLNK #ifndef S_IFLNK #define lstat(path,stbuf) stat(path,stbuf) #define S_ISLNK(mode) 0 #else #define S_ISLNK(mode) (((mode)&S_IFMT)==S_IFLNK) #endif #endif #ifndef S_IFMT #define S_IFMT 0170000 #endif #ifndef S_IRWXU #define S_IRWXU 00700 #define S_IRWXG 00070 #define S_IRWXO 00007 #endif #ifndef S_IWUSR #ifdef S_IREAD #define S_IRUSR S_IREAD #define S_IWUSR S_IWRITE #define S_IXUSR S_IEXEC #else #define S_IRUSR 0400 #define S_IWUSR 0200 #define S_IXUSR 0100 #endif /* S_IREAD */ #define S_IRGRP 0040 #define S_IWGRP 0020 #define S_IXGRP 0010 #define S_IROTH 0004 #define S_IWOTH 0002 #define S_IXOTH 0001 #endif /* S_IWUSR */ #ifndef S_ISGID #define S_ISUID 04000 #define S_ISGID 02000 #endif #ifndef S_ISVTX #define S_ISVTX 01000 #endif #ifdef WMACROS_NON_POSIX #undef WMACROS_NON_POSIX #ifdef WIFEXITED #undef WIFEXITED #endif #ifdef WIFSTOPPED #undef WIFSTOPPED #endif #ifdef WEXITSTATUS #undef WEXITSTATUS #endif #ifdef WTERMSIG #undef WTERMSIG #endif #endif /* WMACROS_NON_POSIX */ #ifndef WIFEXITED #define WIFEXITED(waitval) (!((waitval)&255)) #endif #ifndef WIFSTOPPED #define WIFSTOPPED(waitval) (((waitval)&255)==127) #endif #ifndef WEXITSTATUS #define WEXITSTATUS(waitval) ((waitval)>>8&255) #endif #ifndef WTERMSIG #define WTERMSIG(waitval) ((waitval)&255) #endif extern /*const*/char**environ; extern int errno; #ifndef STDIN_FILENO #define STDIN 0 #define STDOUT 1 #define STDERR 2 #else #define STDIN STDIN_FILENO #define STDOUT STDOUT_FILENO #define STDERR STDERR_FILENO #endif #ifdef NO_fcntl_LOCK #ifndef NOfcntl_lock #define NOfcntl_lock #endif #endif #ifdef NO_lockf_LOCK #ifdef USElockf #undef USElockf #endif #endif #ifdef NO_flock_LOCK #ifdef USEflock #undef USEflock #endif #endif #ifdef SYSLOG_H_MISSING #undef SYSLOG_H_MISSING #define Openlog(ident,logopt,facility) 0 #define syslog (void) #define closelog() #define LOG_EMERG 0 #define LOG_CRIT 0 #define LOG_ALERT 0 #define LOG_ERR 0 #define LOG_NOTICE 0 #else #ifdef LOG_MAIL #define Openlog(ident,logopt,facility) openlog(ident,logopt,facility) #else #define Openlog(ident,logopt,facility) openlog(ident,logopt) #endif #endif #ifndef NOuname #ifndef P /* SINIX V5.23 has the wrong prototype for uname() */ extern int uname(); /* so we fix it :-) */ #define Uname(name) ((int(*)(struct utsname*))uname)(name) #else #define Uname(name) uname(name) /* no fix needed */ #endif /* P */ #endif /* NOuname */ /* NEWS OS 5.X has the wrong prototype here */ #define Fdopen(fd,type) ((FILE*)fdopen(fd,type)) #ifdef u #undef u /* and the winner is: AIX 3.2 */ #endif #ifndef strchr /* for very old K&R compatible include files with */ #ifdef P /* new K&R libraries */ #ifdef void #ifdef NO_const extern char*strchr(); extern char*strpbrk(); extern char*strstr(); extern void*memmove(); #endif #endif #endif #endif #define Const /*const*/ /* Convex cc doesn't grok this */ #ifndef P /* no prototypes without const */ #ifdef NO_const #define P(args) () #endif #endif #ifdef NOrename #undef NOrename #define rename(old,new) (-(link(old,new)||unlink(old))) #endif #ifndef NOsetregid #ifdef NOsetrgid #define setrgid(gid) setregid(gid,-1) #define setruid(uid) setreuid(uid,-1) #endif #ifdef NOsetegid #define setegid(gid) setregid(-1,gid) #endif #else #ifndef NOsetresgid #ifdef NOsetrgid #define setrgid(gid) setresgid(gid,-1,-1) #define setruid(uid) setresuid(uid,-1,-1) #endif #ifdef NOsetegid #define setegid(gid) setresgid(-1,gid,-1) #endif #else #ifdef NOsetrgid #define setrgid(gid) (-1) #define setruid(uid) (-1) #endif #ifdef NOsetegid #define setegid(gid) setgid(gid) #endif #endif #endif #ifdef NOsetrgid #undef NOsetrgid #endif #ifdef NOsetegid #undef NOsetegid #endif #ifdef NOsetregid #undef NOsetregid #endif #ifdef NOsetresgid #undef NOsetresgid #endif #ifdef setrgid_BRAIN_DAMAGE #undef setrgid_BRAIN_DAMAGE #ifdef setrgid #undef setrgid #endif #ifdef setruid #undef setruid #endif #define setrgid(gid) (-1) /* and you think POSIX is broken? */ #define setruid(uid) (-1) /* BSD 4.4 just topped it */ #endif #ifdef setrgid_RUNTIME_CHECK #undef setrgid_RUNTIME_CHECK #define setRgid(gid) (setrgid(gid)||getgid()!=(gid)) #define setRuid(uid) (setruid(uid)||getuid()!=(uid)) #else #define setRgid(gid) setrgid(gid) #define setRuid(uid) setruid(uid) #endif #ifdef NOinitgroups /*#undef NOinitgroups need this macro in autoconf */ #define initgroups(n,g) #endif #ifdef INEFFICIENTrealloc #undef INEFFICIENTrealloc #define EXPBLKSIZ 4 /* 4+3+2+1 = 10 bits total shift */ #else #define EXPBLKSIZ 0 #endif #ifdef NOpow #define tpow(x,y) (x) #else #define tpow(x,y) pow(x,y) #endif #ifdef NOmkdir #undef NOmkdir #define mkdir(dir,mode) (-1) #endif #ifdef NOftruncate #undef NOftruncate #define ftruncate(fildes,length) (-1) #define truncate(file,length) (-1) #endif #ifdef NOfsync #define fsync(fd) 0 #endif #ifdef NOfstat #define fstat(fd,st) (-1) #endif #ifdef NOwaitpid #undef NOwaitpid #define waitpid(pid,stat_loc,options) 0 #else #ifndef WNOHANG #ifdef waitpid #undef waitpid #endif #define waitpid(pid,stat_loc,options) 0 #endif #endif #ifdef NOmemmove #define memmove(to,from,count) smemmove(to,from,count) #endif #ifdef NOstrpbrk #define strpbrk(s,d) sstrpbrk(s,d) #endif #ifdef SLOWstrstr #ifdef strstr #undef strstr #endif #define strstr(haystack,needle) sstrstr(haystack,needle) #endif #ifdef NOmemset #ifdef NObzero #define NEEDbbzero #else #define bbzero(s,l) bzero(s,l) #endif #else #define bbzero(s,l) memset(s,'\0',l) #endif #ifdef NOstrlcat #define strlcat(d,s,z) sstrlcat(d,s,z) #define strlcpy(d,s,z) sstrlcpy(d,s,z) #endif #ifdef NOstrerror #define strerror(e) sstrerror(e) #endif #ifdef NOstrtol #define strtol(s,p,b) sstrtol(s,p,b) #endif #ifndef P #define P(args) args #endif /* * Until function definitions are ANSI, any function whose argument list * includes a size_t, uid_t, gid_t, mode_t, pid_t, or time_t type variable * should be declared with Q() instead of P(). This is done to prevent * problems caused by one of those types being shorter than int and thereby * being passed differently under ANSI rules. */ #define Q(args) () #ifdef oBRAIN_DAMAGE #undef oBRAIN_DAMAGE #undef offsetof #endif #ifndef offsetof #define offsetof(s,m) ((char*)&(((s*)sizeof(s))->m)-(char*)sizeof(s)) #endif #define SETerrno(v) (errno=(v)) /* multi-threading errno hook */ #define PROGID /*const*/char progid[]="Stephen R. van den Berg" #define maxindex(x) (sizeof(x)/sizeof((x)[0])-1) #define STRLEN(x) (sizeof(x)-1) #define ioffsetof(s,m) ((int)offsetof(s,m)) #define numeric(x) (alphanum((unsigned char)(x))>1) #define sizeNUM(v) (8*sizeof(v)*4/10+1+1) #define charNUM(num,v) char num[sizeNUM(v)] #define mx(a,b) ((a)>(b)?(a):(b)) typedef unsigned char uschar; /* sometimes uchar is already typedef'd */ #ifdef uchar #undef uchar #endif #define uchar uschar #if ! (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) #define __attribute__(foo) #endif #if defined(__OpenBSD__) && defined(DEBUGGING) #define setuid(x) 0 /* Under OpenBSD, you can't trace a */ #define setgid(x) 0 /* program after it calls any of these */ #define setegid(x) 0 #endif