Annotation of embedaddon/sudo/include/missing.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (c) 1996, 1998-2005, 2008, 2009-2010
                      3:  *     Todd C. Miller <Todd.Miller@courtesan.com>
                      4:  *
                      5:  * Permission to use, copy, modify, and distribute this software for any
                      6:  * purpose with or without fee is hereby granted, provided that the above
                      7:  * copyright notice and this permission notice appear in all copies.
                      8:  *
                      9:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     10:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     11:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     12:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     13:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     14:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     15:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     16:  *
                     17:  * Sponsored in part by the Defense Advanced Research Projects
                     18:  * Agency (DARPA) and Air Force Research Laboratory, Air Force
                     19:  * Materiel Command, USAF, under agreement number F39502-99-1-0512.
                     20:  */
                     21: 
                     22: #ifndef _SUDO_MISSING_H
                     23: #define _SUDO_MISSING_H
                     24: 
                     25: #include <stdio.h>
                     26: #include <stdarg.h>
                     27: 
                     28: /*
                     29:  * Macros and functions that may be missing on some operating systems.
                     30:  */
                     31: 
                     32: /* Define away __attribute__ for non-gcc or old gcc */
                     33: #if !defined(__GNUC__) || __GNUC__ < 2 || __GNUC__ == 2 && __GNUC_MINOR__ < 5
                     34: # define __attribute__(x)
                     35: #endif
                     36: 
                     37: /* For silencing gcc warnings about rcsids */
                     38: #ifndef __unused
                     39: # if defined(__GNUC__) && (__GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ > 7)
                     40: #  define __unused     __attribute__((__unused__))
                     41: # else
                     42: #  define __unused
                     43: # endif
                     44: #endif
                     45: 
                     46: /* For catching format string mismatches */
                     47: #ifndef __printflike
                     48: # if defined(__GNUC__) && (__GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ >= 7)
                     49: #  define __printflike(f, v)   __attribute__((__format__ (__printf__, f, v)))
                     50: # else
                     51: #  define __printflike(f, v)
                     52: # endif
                     53: #endif
                     54: 
                     55: /*
                     56:  * Some systems lack full limit definitions.
                     57:  */
                     58: #ifndef OPEN_MAX
                     59: # define OPEN_MAX      256
                     60: #endif
                     61: 
                     62: #ifndef INT_MAX
                     63: # define INT_MAX       0x7fffffff
                     64: #endif
                     65: 
                     66: #ifndef PATH_MAX
                     67: # ifdef MAXPATHLEN
                     68: #  define PATH_MAX             MAXPATHLEN
                     69: # else
                     70: #  ifdef _POSIX_PATH_MAX
                     71: #   define PATH_MAX            _POSIX_PATH_MAX
                     72: #  else
                     73: #   define PATH_MAX            1024
                     74: #  endif
                     75: # endif
                     76: #endif
                     77: 
                     78: #ifndef MAXHOSTNAMELEN
                     79: # define MAXHOSTNAMELEN                64
                     80: #endif
                     81: 
                     82: /*
                     83:  * Posix versions for those without...
                     84:  */
                     85: #ifndef _S_IFMT
                     86: # define _S_IFMT               S_IFMT
                     87: #endif /* _S_IFMT */
                     88: #ifndef _S_IFREG
                     89: # define _S_IFREG              S_IFREG
                     90: #endif /* _S_IFREG */
                     91: #ifndef _S_IFDIR
                     92: # define _S_IFDIR              S_IFDIR
                     93: #endif /* _S_IFDIR */
                     94: #ifndef _S_IFLNK
                     95: # define _S_IFLNK              S_IFLNK
                     96: #endif /* _S_IFLNK */
                     97: #ifndef S_ISREG
                     98: # define S_ISREG(m)            (((m) & _S_IFMT) == _S_IFREG)
                     99: #endif /* S_ISREG */
                    100: #ifndef S_ISDIR
                    101: # define S_ISDIR(m)            (((m) & _S_IFMT) == _S_IFDIR)
                    102: #endif /* S_ISDIR */
                    103: 
                    104: /*
                    105:  * Some OS's may not have this.
                    106:  */
                    107: #ifndef S_IRWXU
                    108: # define S_IRWXU               0000700         /* rwx for owner */
                    109: #endif /* S_IRWXU */
                    110: 
                    111: /*
                    112:  * These should be defined in <unistd.h> but not everyone has them.
                    113:  */
                    114: #ifndef STDIN_FILENO
                    115: # define       STDIN_FILENO    0
                    116: #endif
                    117: #ifndef STDOUT_FILENO
                    118: # define       STDOUT_FILENO   1
                    119: #endif
                    120: #ifndef STDERR_FILENO
                    121: # define       STDERR_FILENO   2
                    122: #endif
                    123: 
                    124: /*
                    125:  * BSD defines these in <sys/param.h> but others may not.
                    126:  */
                    127: #ifndef MIN
                    128: # define MIN(a,b) (((a)<(b))?(a):(b))
                    129: #endif
                    130: #ifndef MAX
                    131: # define MAX(a,b) (((a)>(b))?(a):(b))
                    132: #endif
                    133: 
                    134: /*
                    135:  * Simple isblank() macro and function for systems without it.
                    136:  */
                    137: #ifndef HAVE_ISBLANK
                    138: int isblank(int);
                    139: # define isblank(_x)   ((_x) == ' ' || (_x) == '\t')
                    140: #endif
                    141: 
                    142: /*
                    143:  * NCR's SVr4 has _innetgr(3) instead of innetgr(3) for some reason.
                    144:  */
                    145: #ifdef HAVE__INNETGR
                    146: # define innetgr(n, h, u, d)   (_innetgr(n, h, u, d))
                    147: # define HAVE_INNETGR 1
                    148: #endif /* HAVE__INNETGR */
                    149: 
                    150: /*
                    151:  * On POSIX systems, O_NOCTTY is the default so some OS's may lack this define.
                    152:  */
                    153: #ifndef O_NOCTTY
                    154: # define O_NOCTTY      0
                    155: #endif /* O_NOCTTY */
                    156: 
                    157: /*
                    158:  * Add IRIX-like sigaction_t for those without it.
                    159:  * SA_RESTART is not required by POSIX; SunOS has SA_INTERRUPT instead.
                    160:  */
                    161: #ifndef HAVE_SIGACTION_T
                    162: typedef struct sigaction sigaction_t;
                    163: #endif
                    164: #ifndef SA_INTERRUPT
                    165: # define SA_INTERRUPT  0
                    166: #endif
                    167: #ifndef SA_RESTART
                    168: # define SA_RESTART    0
                    169: #endif
                    170: 
                    171: /*
                    172:  * If dirfd() does not exists, hopefully dd_fd does.
                    173:  */
                    174: #if !defined(HAVE_DIRFD) && defined(HAVE_DD_FD)
                    175: # define dirfd(_d)     ((_d)->dd_fd)
                    176: # define HAVE_DIRFD
                    177: #endif
                    178: 
                    179: /*
                    180:  * Define futimes() in terms of futimesat() if needed.
                    181:  */
                    182: #if !defined(HAVE_FUTIMES) && defined(HAVE_FUTIMESAT)
                    183: # define futimes(_f, _tv)      futimesat(_f, NULL, _tv)
                    184: # define HAVE_FUTIMES
                    185: #endif
                    186: 
                    187: #if !defined(HAVE_KILLPG) && !defined(killpg)
                    188: # define killpg(s)     kill(-(s))
                    189: #endif
                    190: 
                    191: /*
                    192:  * If we lack getprogname(), emulate with __progname if possible.
                    193:  * Otherwise, add a prototype for use with our own getprogname.c.
                    194:  */
                    195: #ifndef HAVE_GETPROGNAME
                    196: # ifdef HAVE___PROGNAME
                    197: extern const char *__progname;
                    198: #  define getprogname()          (__progname)
                    199: # else
                    200: const char *getprogname(void);
                    201: void setprogname(const char *);
                    202: #endif /* HAVE___PROGNAME */
                    203: #endif /* !HAVE_GETPROGNAME */
                    204: 
                    205: /*
                    206:  * Declare errno if errno.h doesn't do it for us.
                    207:  */
                    208: #if defined(HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO
                    209: extern int errno;
                    210: #endif /* !HAVE_DECL_ERRNO */
                    211: 
                    212: #ifndef timevalclear
                    213: # define timevalclear(tv)      ((tv)->tv_sec = (tv)->tv_usec = 0)
                    214: #endif
                    215: #ifndef timevalisset
                    216: # define timevalisset(tv)      ((tv)->tv_sec || (tv)->tv_usec)
                    217: #endif
                    218: #ifndef timevalcmp
                    219: # define timevalcmp(tv1, tv2, op)                                             \
                    220:     (((tv1)->tv_sec == (tv2)->tv_sec) ?                                               \
                    221:        ((tv1)->tv_usec op (tv2)->tv_usec) :                                   \
                    222:        ((tv1)->tv_sec op (tv2)->tv_sec))
                    223: #endif
                    224: #ifndef timevaladd
                    225: # define timevaladd(tv1, tv2)                                                 \
                    226:     do {                                                                      \
                    227:        (tv1)->tv_sec += (tv2)->tv_sec;                                        \
                    228:        (tv1)->tv_usec += (tv2)->tv_usec;                                      \
                    229:        if ((tv1)->tv_usec >= 1000000) {                                       \
                    230:            (tv1)->tv_sec++;                                                   \
                    231:            (tv1)->tv_usec -= 1000000;                                         \
                    232:        }                                                                      \
                    233:     } while (0)
                    234: #endif
                    235: #ifndef timevalsub
                    236: # define timevalsub(tv1, tv2)                                                 \
                    237:     do {                                                                      \
                    238:        (tv1)->tv_sec -= (tv2)->tv_sec;                                        \
                    239:        (tv1)->tv_usec -= (tv2)->tv_usec;                                      \
                    240:        if ((tv1)->tv_usec < 0) {                                              \
                    241:            (tv1)->tv_sec--;                                                   \
                    242:            (tv1)->tv_usec += 1000000;                                         \
                    243:        }                                                                      \
                    244:     } while (0)
                    245: #endif
                    246: 
                    247: /* Not all systems define NSIG in signal.h */
                    248: #if !defined(NSIG)
                    249: # if defined(_NSIG)
                    250: #  define NSIG _NSIG
                    251: # elif defined(__NSIG)
                    252: #  define NSIG __NSIG
                    253: # else
                    254: #  define NSIG 64
                    255: # endif
                    256: #endif
                    257: 
                    258: #ifndef WCOREDUMP
                    259: # define WCOREDUMP(x)  ((x) & 0x80)
                    260: #endif
                    261: 
                    262: #ifndef HAVE_SETEUID
                    263: #  if defined(HAVE_SETRESUID)
                    264: #    define seteuid(u) setresuid(-1, (u), -1)
                    265: #    define setegid(g) setresgid(-1, (g), -1)
                    266: #    define HAVE_SETEUID 1
                    267: #  elif defined(HAVE_SETREUID)
                    268: #    define seteuid(u) setreuid(-1, (u))
                    269: #    define setegid(g) setregid(-1, (g))
                    270: #    define HAVE_SETEUID 1
                    271: #  endif
                    272: #endif /* HAVE_SETEUID */
                    273: 
                    274: /*
                    275:  * HP-UX does not declare innetgr() or getdomainname().
                    276:  * Solaris does not declare getdomainname().
                    277:  */
                    278: #if defined(__hpux)
                    279: int innetgr(const char *, const char *, const char *, const char *);
                    280: #endif
                    281: #if defined(__hpux) || defined(__sun)
                    282: int getdomainname(char *, size_t);
                    283: #endif
                    284: 
                    285: /* Functions "missing" from libc. */
                    286: 
                    287: struct timeval;
                    288: struct timespec;
                    289: 
                    290: #ifndef HAVE_CLOSEFROM
                    291: void closefrom(int);
                    292: #endif
                    293: #ifndef HAVE_GETCWD
                    294: char *getcwd(char *, size_t size);
                    295: #endif
                    296: #ifndef HAVE_GETGROUPLIST
                    297: int getgrouplist(const char *, gid_t, gid_t *, int *);
                    298: #endif
                    299: #ifndef HAVE_GETLINE
                    300: ssize_t getline(char **, size_t *, FILE *);
                    301: #endif
                    302: #ifndef HAVE_UTIMES
                    303: int utimes(const char *, const struct timeval *);
                    304: #endif
                    305: #ifdef HAVE_FUTIME
                    306: int futimes(int, const struct timeval *);
                    307: #endif
                    308: #ifndef HAVE_SNPRINTF
                    309: int snprintf(char *, size_t, const char *, ...) __printflike(3, 4);
                    310: #endif
                    311: #ifndef HAVE_VSNPRINTF
                    312: int vsnprintf(char *, size_t, const char *, va_list) __printflike(3, 0);
                    313: #endif
                    314: #ifndef HAVE_ASPRINTF
                    315: int asprintf(char **, const char *, ...) __printflike(2, 3);
                    316: #endif
                    317: #ifndef HAVE_VASPRINTF
                    318: int vasprintf(char **, const char *, va_list) __printflike(2, 0);
                    319: #endif
                    320: #ifndef HAVE_STRLCAT
                    321: size_t strlcat(char *, const char *, size_t);
                    322: #endif
                    323: #ifndef HAVE_STRLCPY
                    324: size_t strlcpy(char *, const char *, size_t);
                    325: #endif
                    326: #ifndef HAVE_MEMRCHR
                    327: void *memrchr(const void *, int, size_t);
                    328: #endif
                    329: #ifndef HAVE_MKDTEMP
                    330: char *mkdtemp(char *);
                    331: #endif
                    332: #ifndef HAVE_MKSTEMPS
                    333: int mkstemps(char *, int);
                    334: #endif
                    335: #ifndef HAVE_NANOSLEEP
                    336: int nanosleep(const struct timespec *, struct timespec *);
                    337: #endif
                    338: #ifndef HAVE_SETENV
                    339: int setenv(const char *, const char *, int);
                    340: #endif
                    341: #ifndef HAVE_UNSETENV
                    342: int unsetenv(const char *);
                    343: #endif
                    344: #ifndef HAVE_STRSIGNAL
                    345: char *strsignal(int);
                    346: #endif
                    347: 
                    348: #endif /* _SUDO_MISSING_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>