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

1.1       misho       1: /*
1.1.1.6 ! misho       2:  * Copyright (c) 1996, 1998-2005, 2008, 2009-2014
1.1       misho       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>
1.1.1.5   misho      26: #ifdef STDC_HEADERS
                     27: # include <stddef.h>
                     28: #endif
1.1       misho      29: #include <stdarg.h>
                     30: 
                     31: /*
                     32:  * Macros and functions that may be missing on some operating systems.
                     33:  */
                     34: 
1.1.1.3   misho      35: #ifndef __GNUC_PREREQ__
                     36: # ifdef __GNUC__
                     37: #  define __GNUC_PREREQ__(ma, mi) \
                     38:        ((__GNUC__ > (ma)) || (__GNUC__ == (ma) && __GNUC_MINOR__ >= (mi)))
                     39: # else
                     40: #  define __GNUC_PREREQ__(ma, mi)      0
                     41: # endif
                     42: #endif
                     43: 
1.1       misho      44: /* Define away __attribute__ for non-gcc or old gcc */
1.1.1.3   misho      45: #if !defined(__attribute__) && !__GNUC_PREREQ__(2, 5)
1.1       misho      46: # define __attribute__(x)
                     47: #endif
                     48: 
                     49: /* For catching format string mismatches */
                     50: #ifndef __printflike
1.1.1.5   misho      51: # if __GNUC_PREREQ__(3, 3)
                     52: #  define __printflike(f, v)   __attribute__((__format__ (__printf__, f, v))) __attribute__((__nonnull__ (f)))
                     53: # elif __GNUC_PREREQ__(2, 7)
1.1       misho      54: #  define __printflike(f, v)   __attribute__((__format__ (__printf__, f, v)))
                     55: # else
                     56: #  define __printflike(f, v)
                     57: # endif
                     58: #endif
1.1.1.5   misho      59: #ifndef __printf0like
                     60: # if __GNUC_PREREQ__(2, 7)
                     61: #  define __printf0like(f, v)  __attribute__((__format__ (__printf__, f, v)))
                     62: # else
                     63: #  define __printf0like(f, v)
                     64: # endif
                     65: #endif
1.1.1.6 ! misho      66: #ifndef __format_arg
        !            67: # if __GNUC_PREREQ__(2, 7)
        !            68: #  define __format_arg(f)      __attribute__((__format_arg__ (f)))
        !            69: # else
        !            70: #  define __format_arg(f)
        !            71: # endif
        !            72: #endif
1.1       misho      73: 
1.1.1.4   misho      74: /* Hint to compiler that returned pointer is unique (malloc but not realloc). */
                     75: #ifndef __malloc_like
                     76: # if __GNUC_PREREQ__(2, 96)
                     77: #  define __malloc_like        __attribute__((__malloc__))
                     78: # else
                     79: #  define __malloc_like
                     80: # endif
                     81: #endif
                     82: 
1.1.1.6 ! misho      83: /*
        !            84:  * Given the pointer x to the member m of the struct s, return
        !            85:  * a pointer to the containing structure.
        !            86:  */
        !            87: #ifndef __containerof
        !            88: # define __containerof(x, s, m)        ((s *)((char *)(x) - offsetof(s, m)))
        !            89: #endif
        !            90: 
1.1.1.3   misho      91: #ifndef __dso_public
                     92: # ifdef HAVE_DSO_VISIBILITY
                     93: #  if defined(__GNUC__)
                     94: #   define __dso_public        __attribute__((__visibility__("default")))
                     95: #   define __dso_hidden        __attribute__((__visibility__("hidden")))
                     96: #  elif defined(__SUNPRO_C)
                     97: #   define __dso_public        __global
                     98: #   define __dso_hidden __hidden
                     99: #  else
                    100: #   define __dso_public        __declspec(dllexport)
                    101: #   define __dso_hidden
                    102: #  endif
                    103: # else
                    104: #  define __dso_public
                    105: #  define __dso_hidden
                    106: # endif
                    107: #endif
                    108: 
1.1       misho     109: /*
1.1.1.6 ! misho     110:  * Pre-C99 compilers may lack a va_copy macro.
        !           111:  */
        !           112: #ifndef va_copy
        !           113: # ifdef __va_copy
        !           114: #  define va_copy(d, s) __va_copy(d, s)
        !           115: # else
        !           116: #  define va_copy(d, s) memcpy(&(d), &(s), sizeof(d));
        !           117: # endif
        !           118: #endif
        !           119: 
        !           120: /*
1.1       misho     121:  * Some systems lack full limit definitions.
                    122:  */
                    123: #ifndef OPEN_MAX
                    124: # define OPEN_MAX      256
                    125: #endif
                    126: 
1.1.1.6 ! misho     127: #ifndef LLONG_MAX
        !           128: # if defined(QUAD_MAX)
        !           129: #  define LLONG_MAX    QUAD_MAX
        !           130: # else
        !           131: #  define LLONG_MAX    0x7fffffffffffffffLL
        !           132: # endif
        !           133: #endif
        !           134: 
        !           135: #ifndef LLONG_MIN
        !           136: # if defined(QUAD_MIN)
        !           137: #  define LLONG_MIN    QUAD_MIN
        !           138: # else
        !           139: #  define LLONG_MIN    (-0x7fffffffffffffffLL-1)
        !           140: # endif
        !           141: #endif
        !           142: 
        !           143: #ifndef ULLONG_MAX
        !           144: # if defined(UQUAD_MAX)
        !           145: #  define ULLONG_MAX   UQUAD_MAX
        !           146: # else
        !           147: #  define ULLONG_MAX   0xffffffffffffffffULL
        !           148: # endif
1.1       misho     149: #endif
                    150: 
                    151: #ifndef PATH_MAX
1.1.1.4   misho     152: # ifdef _POSIX_PATH_MAX
                    153: #  define PATH_MAX             _POSIX_PATH_MAX
1.1       misho     154: # else
1.1.1.4   misho     155: #  define PATH_MAX             256
1.1       misho     156: # endif
                    157: #endif
                    158: 
1.1.1.4   misho     159: #ifndef HOST_NAME_MAX
                    160: # ifdef _POSIX_HOST_NAME_MAX
                    161: #  define HOST_NAME_MAX                _POSIX_HOST_NAME_MAX
                    162: # else
                    163: #  define HOST_NAME_MAX                255
                    164: # endif
1.1       misho     165: #endif
                    166: 
                    167: /*
                    168:  * Posix versions for those without...
                    169:  */
                    170: #ifndef _S_IFMT
                    171: # define _S_IFMT               S_IFMT
                    172: #endif /* _S_IFMT */
                    173: #ifndef _S_IFREG
                    174: # define _S_IFREG              S_IFREG
                    175: #endif /* _S_IFREG */
                    176: #ifndef _S_IFDIR
                    177: # define _S_IFDIR              S_IFDIR
                    178: #endif /* _S_IFDIR */
                    179: #ifndef _S_IFLNK
                    180: # define _S_IFLNK              S_IFLNK
                    181: #endif /* _S_IFLNK */
                    182: #ifndef S_ISREG
                    183: # define S_ISREG(m)            (((m) & _S_IFMT) == _S_IFREG)
                    184: #endif /* S_ISREG */
                    185: #ifndef S_ISDIR
                    186: # define S_ISDIR(m)            (((m) & _S_IFMT) == _S_IFDIR)
                    187: #endif /* S_ISDIR */
                    188: 
                    189: /*
                    190:  * Some OS's may not have this.
                    191:  */
                    192: #ifndef S_IRWXU
                    193: # define S_IRWXU               0000700         /* rwx for owner */
                    194: #endif /* S_IRWXU */
                    195: 
                    196: /*
                    197:  * These should be defined in <unistd.h> but not everyone has them.
                    198:  */
                    199: #ifndef STDIN_FILENO
                    200: # define       STDIN_FILENO    0
                    201: #endif
                    202: #ifndef STDOUT_FILENO
                    203: # define       STDOUT_FILENO   1
                    204: #endif
                    205: #ifndef STDERR_FILENO
                    206: # define       STDERR_FILENO   2
                    207: #endif
                    208: 
                    209: /*
1.1.1.4   misho     210:  * BSD defines these in <sys/param.h> but we don't include that anymore.
1.1       misho     211:  */
                    212: #ifndef MIN
                    213: # define MIN(a,b) (((a)<(b))?(a):(b))
                    214: #endif
                    215: #ifndef MAX
                    216: # define MAX(a,b) (((a)>(b))?(a):(b))
                    217: #endif
                    218: 
1.1.1.4   misho     219: /* Macros to set/clear/test flags. */
                    220: #undef SET
                    221: #define SET(t, f)      ((t) |= (f))
                    222: #undef CLR
                    223: #define CLR(t, f)      ((t) &= ~(f))
                    224: #undef ISSET
                    225: #define ISSET(t, f)     ((t) & (f))
                    226: 
                    227: /*
1.1.1.2   misho     228:  * Older systems may be missing stddef.h and/or offsetof macro
                    229:  */
                    230: #ifndef offsetof
                    231: # ifdef __offsetof
                    232: #  define offsetof(type, field) __offsetof(type, field)
                    233: # else
                    234: #  define offsetof(type, field) ((size_t)(&((type *)0)->field))
                    235: # endif
                    236: #endif
                    237: 
                    238: /*
1.1       misho     239:  * Simple isblank() macro and function for systems without it.
                    240:  */
                    241: #ifndef HAVE_ISBLANK
                    242: int isblank(int);
                    243: # define isblank(_x)   ((_x) == ' ' || (_x) == '\t')
                    244: #endif
                    245: 
                    246: /*
                    247:  * NCR's SVr4 has _innetgr(3) instead of innetgr(3) for some reason.
                    248:  */
                    249: #ifdef HAVE__INNETGR
                    250: # define innetgr(n, h, u, d)   (_innetgr(n, h, u, d))
                    251: # define HAVE_INNETGR 1
                    252: #endif /* HAVE__INNETGR */
                    253: 
                    254: /*
                    255:  * On POSIX systems, O_NOCTTY is the default so some OS's may lack this define.
                    256:  */
                    257: #ifndef O_NOCTTY
                    258: # define O_NOCTTY      0
                    259: #endif /* O_NOCTTY */
                    260: 
                    261: /*
                    262:  * Add IRIX-like sigaction_t for those without it.
                    263:  * SA_RESTART is not required by POSIX; SunOS has SA_INTERRUPT instead.
                    264:  */
                    265: #ifndef HAVE_SIGACTION_T
                    266: typedef struct sigaction sigaction_t;
                    267: #endif
                    268: #ifndef SA_INTERRUPT
                    269: # define SA_INTERRUPT  0
                    270: #endif
                    271: #ifndef SA_RESTART
                    272: # define SA_RESTART    0
                    273: #endif
                    274: 
                    275: /*
                    276:  * If dirfd() does not exists, hopefully dd_fd does.
                    277:  */
                    278: #if !defined(HAVE_DIRFD) && defined(HAVE_DD_FD)
                    279: # define dirfd(_d)     ((_d)->dd_fd)
                    280: # define HAVE_DIRFD
                    281: #endif
                    282: 
                    283: /*
                    284:  * Define futimes() in terms of futimesat() if needed.
                    285:  */
                    286: #if !defined(HAVE_FUTIMES) && defined(HAVE_FUTIMESAT)
                    287: # define futimes(_f, _tv)      futimesat(_f, NULL, _tv)
                    288: # define HAVE_FUTIMES
                    289: #endif
                    290: 
                    291: #if !defined(HAVE_KILLPG) && !defined(killpg)
                    292: # define killpg(s)     kill(-(s))
                    293: #endif
                    294: 
                    295: /*
                    296:  * If we lack getprogname(), emulate with __progname if possible.
                    297:  * Otherwise, add a prototype for use with our own getprogname.c.
                    298:  */
                    299: #ifndef HAVE_GETPROGNAME
                    300: # ifdef HAVE___PROGNAME
                    301: extern const char *__progname;
1.1.1.4   misho     302: #  define getprogname()                (__progname)
1.1       misho     303: # else
                    304: const char *getprogname(void);
1.1.1.4   misho     305: # endif /* HAVE___PROGNAME */
1.1       misho     306: #endif /* !HAVE_GETPROGNAME */
                    307: 
                    308: /*
                    309:  * Declare errno if errno.h doesn't do it for us.
                    310:  */
                    311: #if defined(HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO
                    312: extern int errno;
                    313: #endif /* !HAVE_DECL_ERRNO */
                    314: 
                    315: /* Not all systems define NSIG in signal.h */
                    316: #if !defined(NSIG)
                    317: # if defined(_NSIG)
                    318: #  define NSIG _NSIG
                    319: # elif defined(__NSIG)
                    320: #  define NSIG __NSIG
                    321: # else
                    322: #  define NSIG 64
                    323: # endif
                    324: #endif
                    325: 
1.1.1.3   misho     326: /* For sig2str() */
                    327: #ifndef SIG2STR_MAX
                    328: # define SIG2STR_MAX 32
                    329: #endif
                    330: 
1.1       misho     331: #ifndef WCOREDUMP
                    332: # define WCOREDUMP(x)  ((x) & 0x80)
                    333: #endif
                    334: 
                    335: #ifndef HAVE_SETEUID
                    336: #  if defined(HAVE_SETRESUID)
                    337: #    define seteuid(u) setresuid(-1, (u), -1)
                    338: #    define setegid(g) setresgid(-1, (g), -1)
                    339: #    define HAVE_SETEUID 1
                    340: #  elif defined(HAVE_SETREUID)
                    341: #    define seteuid(u) setreuid(-1, (u))
                    342: #    define setegid(g) setregid(-1, (g))
                    343: #    define HAVE_SETEUID 1
                    344: #  endif
                    345: #endif /* HAVE_SETEUID */
                    346: 
                    347: /*
                    348:  * HP-UX does not declare innetgr() or getdomainname().
                    349:  * Solaris does not declare getdomainname().
                    350:  */
                    351: #if defined(__hpux)
                    352: int innetgr(const char *, const char *, const char *, const char *);
                    353: #endif
                    354: #if defined(__hpux) || defined(__sun)
                    355: int getdomainname(char *, size_t);
                    356: #endif
                    357: 
                    358: /* Functions "missing" from libc. */
                    359: 
                    360: struct timeval;
                    361: struct timespec;
                    362: 
                    363: #ifndef HAVE_CLOSEFROM
                    364: void closefrom(int);
                    365: #endif
                    366: #ifndef HAVE_GETCWD
                    367: char *getcwd(char *, size_t size);
                    368: #endif
                    369: #ifndef HAVE_GETGROUPLIST
                    370: int getgrouplist(const char *, gid_t, gid_t *, int *);
                    371: #endif
                    372: #ifndef HAVE_GETLINE
                    373: ssize_t getline(char **, size_t *, FILE *);
                    374: #endif
                    375: #ifndef HAVE_UTIMES
                    376: int utimes(const char *, const struct timeval *);
                    377: #endif
                    378: #ifdef HAVE_FUTIME
                    379: int futimes(int, const struct timeval *);
                    380: #endif
1.1.1.6 ! misho     381: #if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
        !           382: int rpl_snprintf(char *, size_t, const char *, ...) __printflike(3, 4);
        !           383: # undef snprintf
        !           384: # define snprintf rpl_snprintf
        !           385: #endif
        !           386: #if !defined(HAVE_VSNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
        !           387: int rpl_vsnprintf(char *, size_t, const char *, va_list) __printflike(3, 0);
        !           388: # undef vsnprintf
        !           389: # define vsnprintf rpl_vsnprintf
        !           390: #endif
        !           391: #if !defined(HAVE_ASPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
        !           392: int rpl_asprintf(char **, const char *, ...) __printflike(2, 3);
        !           393: # undef asprintf
        !           394: # define asprintf rpl_asprintf
        !           395: #endif
        !           396: #if !defined(HAVE_VASPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
        !           397: int rpl_vasprintf(char **, const char *, va_list) __printflike(2, 0);
        !           398: # undef vasprintf
        !           399: # define vasprintf rpl_vasprintf
1.1       misho     400: #endif
                    401: #ifndef HAVE_STRLCAT
                    402: size_t strlcat(char *, const char *, size_t);
                    403: #endif
                    404: #ifndef HAVE_STRLCPY
                    405: size_t strlcpy(char *, const char *, size_t);
                    406: #endif
                    407: #ifndef HAVE_MEMRCHR
                    408: void *memrchr(const void *, int, size_t);
                    409: #endif
1.1.1.5   misho     410: #ifndef HAVE_MEMSET_S
                    411: errno_t memset_s(void *, rsize_t, int, rsize_t);
                    412: #endif
1.1       misho     413: #ifndef HAVE_MKDTEMP
                    414: char *mkdtemp(char *);
                    415: #endif
                    416: #ifndef HAVE_MKSTEMPS
                    417: int mkstemps(char *, int);
                    418: #endif
1.1.1.2   misho     419: #ifndef HAVE_PW_DUP
                    420: struct passwd *pw_dup(const struct passwd *);
                    421: #endif
1.1       misho     422: #ifndef HAVE_SETENV
                    423: int setenv(const char *, const char *, int);
                    424: #endif
                    425: #ifndef HAVE_UNSETENV
                    426: int unsetenv(const char *);
                    427: #endif
                    428: #ifndef HAVE_STRSIGNAL
                    429: char *strsignal(int);
                    430: #endif
1.1.1.3   misho     431: #ifndef HAVE_SIG2STR
                    432: int sig2str(int, char *);
                    433: #endif
1.1.1.6 ! misho     434: #ifndef HAVE_STRTONUM
        !           435: long long rpl_strtonum(const char *, long long, long long, const char **);
        !           436: # undef strtonum
        !           437: # define strtonum rpl_strtonum
        !           438: #endif
        !           439: #ifndef HAVE_CLOCK_GETTIME
        !           440: # define CLOCK_REALTIME 0
        !           441: # ifdef __MACH__
        !           442: #  define CLOCK_MONOTONIC 1
        !           443: # endif
        !           444: int clock_gettime(clockid_t clock_id, struct timespec *tp);
        !           445: #endif
        !           446: #ifndef HAVE_INET_PTON
        !           447: int inet_pton(int af, const char *src, void *dst);
        !           448: #endif
1.1       misho     449: 
                    450: #endif /* _SUDO_MISSING_H */

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