1/* Copyright 1993,1994 by Paul Vixie 2 * All rights reserved 3 * 4 * Distribute freely, except: don't remove my name from the source or 5 * documentation (don't take credit for my work), mark your changes (don't 6 * get me blamed for your possible bugs), don't alter or remove this 7 * notice. May be sold if buildable source is provided to buyer. No 8 * warrantee of any kind, express or implied, is included with this 9 * software; use at your own risk, responsibility for damages (if any) to 10 * anyone resulting from the use of this software rests entirely with the 11 * user. 12 * 13 * Send bug reports, bug fixes, enhancements, requests, flames, etc., and 14 * I'll try to keep a version up to date. I can be reached as follows: 15 * Paul Vixie <paul@vix.com> uunet!decwrl!vixie!paul 16 */ 17 18#if defined(POSIX) || defined(ATT) 19# include <stdlib.h> 20# include <unistd.h> 21# include <string.h> 22# include <dirent.h> 23# define DIR_T struct dirent 24# define WAIT_T int 25# define WAIT_IS_INT 1 26extern char *tzname[2]; 27# define TZONE(tm) tzname[(tm).tm_isdst] 28#endif 29 30#if defined(UNIXPC) 31# undef WAIT_T 32# undef WAIT_IS_INT 33# define WAIT_T union wait 34#endif 35 36#if defined(POSIX) 37# define SIG_T sig_t 38# define TIME_T time_t 39# define PID_T pid_t 40#endif 41 42#if defined(ATT) 43# define SIG_T void 44# define TIME_T long 45# define PID_T int 46#endif 47 48#if !defined(POSIX) && !defined(ATT) 49/* classic BSD */ 50extern time_t time(); 51extern unsigned sleep(); 52extern struct tm *localtime(); 53extern struct passwd *getpwnam(); 54extern int errno; 55extern void perror(), exit(), free(); 56extern char *getenv(), *strcpy(), *strchr(), *strtok(); 57extern void *malloc(), *realloc(); 58# define SIG_T void 59# define TIME_T long 60# define PID_T int 61# define WAIT_T union wait 62# define DIR_T struct direct 63# include <sys/dir.h> 64# define TZONE(tm) (tm).tm_zone 65#endif 66 67/* getopt() isn't part of POSIX. some systems define it in <stdlib.h> anyway. 68 * of those that do, some complain that our definition is different and some 69 * do not. to add to the misery and confusion, some systems define getopt() 70 * in ways that we cannot predict or comprehend, yet do not define the adjunct 71 * external variables needed for the interface. 72 */ 73#if (!defined(BSD) || (BSD < 198911)) && !defined(ATT) && !defined(UNICOS) 74int getopt __P((int, char * const *, const char *)); 75#endif 76 77#if (!defined(BSD) || (BSD < 199103)) 78extern char *optarg; 79extern int optind, opterr, optopt; 80#endif 81 82#if WAIT_IS_INT 83# ifndef WEXITSTATUS 84# define WEXITSTATUS(x) (((x) >> 8) & 0xff) 85# endif 86# ifndef WTERMSIG 87# define WTERMSIG(x) ((x) & 0x7f) 88# endif 89# ifndef WCOREDUMP 90# define WCOREDUMP(x) ((x) & 0x80) 91# endif 92#else /*WAIT_IS_INT*/ 93# ifndef WEXITSTATUS 94# define WEXITSTATUS(x) ((x).w_retcode) 95# endif 96# ifndef WTERMSIG 97# define WTERMSIG(x) ((x).w_termsig) 98# endif 99# ifndef WCOREDUMP 100# define WCOREDUMP(x) ((x).w_coredump) 101# endif 102#endif /*WAIT_IS_INT*/ 103 104#ifndef WIFSIGNALED 105#define WIFSIGNALED(x) (WTERMSIG(x) != 0) 106#endif 107#ifndef WIFEXITED 108#define WIFEXITED(x) (WTERMSIG(x) == 0) 109#endif 110 111#ifdef NEED_STRCASECMP 112extern int strcasecmp __P((char *, char *)); 113#endif 114 115#ifdef NEED_STRDUP 116extern char *strdup __P((char *)); 117#endif 118 119#ifdef NEED_STRERROR 120extern char *strerror __P((int)); 121#endif 122 123#ifdef NEED_FLOCK 124extern int flock __P((int, int)); 125# define LOCK_SH 1 126# define LOCK_EX 2 127# define LOCK_NB 4 128# define LOCK_UN 8 129#endif 130 131#ifdef NEED_SETSID 132extern int setsid __P((void)); 133#endif 134 135#ifdef NEED_GETDTABLESIZE 136extern int getdtablesize __P((void)); 137#endif 138 139#ifdef NEED_SETENV 140extern int setenv __P((char *, char *, int)); 141#endif 142 143#ifdef NEED_VFORK 144extern PID_T vfork __P((void)); 145#endif 146