Annotation of embedaddon/sudo/include/missing.h, revision 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>