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