File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sudo / include / missing.h
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:26:49 2012 UTC (12 years, 2 months ago) by misho
Branches: sudo, MAIN
CVS tags: v1_8_5p1, HEAD
sudo 1.8.5p1

    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 catching format string mismatches */
   38: #ifndef __printflike
   39: # if defined(__GNUC__) && (__GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ >= 7)
   40: #  define __printflike(f, v) 	__attribute__((__format__ (__printf__, f, v)))
   41: # else
   42: #  define __printflike(f, v)
   43: # endif
   44: #endif
   45: 
   46: /*
   47:  * Some systems lack full limit definitions.
   48:  */
   49: #ifndef OPEN_MAX
   50: # define OPEN_MAX	256
   51: #endif
   52: 
   53: #ifndef INT_MAX
   54: # define INT_MAX	0x7fffffff
   55: #endif
   56: 
   57: #ifndef PATH_MAX
   58: # ifdef MAXPATHLEN
   59: #  define PATH_MAX		MAXPATHLEN
   60: # else
   61: #  ifdef _POSIX_PATH_MAX
   62: #   define PATH_MAX		_POSIX_PATH_MAX
   63: #  else
   64: #   define PATH_MAX		1024
   65: #  endif
   66: # endif
   67: #endif
   68: 
   69: #ifndef MAXHOSTNAMELEN
   70: # define MAXHOSTNAMELEN		64
   71: #endif
   72: 
   73: /*
   74:  * Posix versions for those without...
   75:  */
   76: #ifndef _S_IFMT
   77: # define _S_IFMT		S_IFMT
   78: #endif /* _S_IFMT */
   79: #ifndef _S_IFREG
   80: # define _S_IFREG		S_IFREG
   81: #endif /* _S_IFREG */
   82: #ifndef _S_IFDIR
   83: # define _S_IFDIR		S_IFDIR
   84: #endif /* _S_IFDIR */
   85: #ifndef _S_IFLNK
   86: # define _S_IFLNK		S_IFLNK
   87: #endif /* _S_IFLNK */
   88: #ifndef S_ISREG
   89: # define S_ISREG(m)		(((m) & _S_IFMT) == _S_IFREG)
   90: #endif /* S_ISREG */
   91: #ifndef S_ISDIR
   92: # define S_ISDIR(m)		(((m) & _S_IFMT) == _S_IFDIR)
   93: #endif /* S_ISDIR */
   94: 
   95: /*
   96:  * Some OS's may not have this.
   97:  */
   98: #ifndef S_IRWXU
   99: # define S_IRWXU		0000700		/* rwx for owner */
  100: #endif /* S_IRWXU */
  101: 
  102: /*
  103:  * These should be defined in <unistd.h> but not everyone has them.
  104:  */
  105: #ifndef STDIN_FILENO
  106: # define	STDIN_FILENO	0
  107: #endif
  108: #ifndef STDOUT_FILENO
  109: # define	STDOUT_FILENO	1
  110: #endif
  111: #ifndef STDERR_FILENO
  112: # define	STDERR_FILENO	2
  113: #endif
  114: 
  115: /*
  116:  * BSD defines these in <sys/param.h> but others may not.
  117:  */
  118: #ifndef MIN
  119: # define MIN(a,b) (((a)<(b))?(a):(b))
  120: #endif
  121: #ifndef MAX
  122: # define MAX(a,b) (((a)>(b))?(a):(b))
  123: #endif
  124: 
  125: /*
  126:  * Older systems may be missing stddef.h and/or offsetof macro
  127:  */
  128: #ifndef offsetof
  129: # ifdef __offsetof
  130: #  define offsetof(type, field) __offsetof(type, field)
  131: # else
  132: #  define offsetof(type, field) ((size_t)(&((type *)0)->field))
  133: # endif
  134: #endif
  135: 
  136: /*
  137:  * Simple isblank() macro and function for systems without it.
  138:  */
  139: #ifndef HAVE_ISBLANK
  140: int isblank(int);
  141: # define isblank(_x)	((_x) == ' ' || (_x) == '\t')
  142: #endif
  143: 
  144: /*
  145:  * NCR's SVr4 has _innetgr(3) instead of innetgr(3) for some reason.
  146:  */
  147: #ifdef HAVE__INNETGR
  148: # define innetgr(n, h, u, d)	(_innetgr(n, h, u, d))
  149: # define HAVE_INNETGR 1
  150: #endif /* HAVE__INNETGR */
  151: 
  152: /*
  153:  * On POSIX systems, O_NOCTTY is the default so some OS's may lack this define.
  154:  */
  155: #ifndef O_NOCTTY
  156: # define O_NOCTTY	0
  157: #endif /* O_NOCTTY */
  158: 
  159: /*
  160:  * Add IRIX-like sigaction_t for those without it.
  161:  * SA_RESTART is not required by POSIX; SunOS has SA_INTERRUPT instead.
  162:  */
  163: #ifndef HAVE_SIGACTION_T
  164: typedef struct sigaction sigaction_t;
  165: #endif
  166: #ifndef SA_INTERRUPT
  167: # define SA_INTERRUPT	0
  168: #endif
  169: #ifndef SA_RESTART
  170: # define SA_RESTART	0
  171: #endif
  172: 
  173: /*
  174:  * If dirfd() does not exists, hopefully dd_fd does.
  175:  */
  176: #if !defined(HAVE_DIRFD) && defined(HAVE_DD_FD)
  177: # define dirfd(_d)	((_d)->dd_fd)
  178: # define HAVE_DIRFD
  179: #endif
  180: 
  181: /*
  182:  * Define futimes() in terms of futimesat() if needed.
  183:  */
  184: #if !defined(HAVE_FUTIMES) && defined(HAVE_FUTIMESAT)
  185: # define futimes(_f, _tv)	futimesat(_f, NULL, _tv)
  186: # define HAVE_FUTIMES
  187: #endif
  188: 
  189: #if !defined(HAVE_KILLPG) && !defined(killpg)
  190: # define killpg(s)	kill(-(s))
  191: #endif
  192: 
  193: /*
  194:  * If we lack getprogname(), emulate with __progname if possible.
  195:  * Otherwise, add a prototype for use with our own getprogname.c.
  196:  */
  197: #ifndef HAVE_GETPROGNAME
  198: # ifdef HAVE___PROGNAME
  199: extern const char *__progname;
  200: #  define getprogname()          (__progname)
  201: # else
  202: const char *getprogname(void);
  203: void setprogname(const char *);
  204: #endif /* HAVE___PROGNAME */
  205: #endif /* !HAVE_GETPROGNAME */
  206: 
  207: /*
  208:  * Declare errno if errno.h doesn't do it for us.
  209:  */
  210: #if defined(HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO
  211: extern int errno;
  212: #endif /* !HAVE_DECL_ERRNO */
  213: 
  214: #ifndef timevalclear
  215: # define timevalclear(tv)	((tv)->tv_sec = (tv)->tv_usec = 0)
  216: #endif
  217: #ifndef timevalisset
  218: # define timevalisset(tv)	((tv)->tv_sec || (tv)->tv_usec)
  219: #endif
  220: #ifndef timevalcmp
  221: # define timevalcmp(tv1, tv2, op)					       \
  222:     (((tv1)->tv_sec == (tv2)->tv_sec) ?					       \
  223: 	((tv1)->tv_usec op (tv2)->tv_usec) :				       \
  224: 	((tv1)->tv_sec op (tv2)->tv_sec))
  225: #endif
  226: #ifndef timevaladd
  227: # define timevaladd(tv1, tv2)						       \
  228:     do {								       \
  229: 	(tv1)->tv_sec += (tv2)->tv_sec;					       \
  230: 	(tv1)->tv_usec += (tv2)->tv_usec;				       \
  231: 	if ((tv1)->tv_usec >= 1000000) {				       \
  232: 	    (tv1)->tv_sec++;						       \
  233: 	    (tv1)->tv_usec -= 1000000;					       \
  234: 	}								       \
  235:     } while (0)
  236: #endif
  237: #ifndef timevalsub
  238: # define timevalsub(tv1, tv2)						       \
  239:     do {								       \
  240: 	(tv1)->tv_sec -= (tv2)->tv_sec;					       \
  241: 	(tv1)->tv_usec -= (tv2)->tv_usec;				       \
  242: 	if ((tv1)->tv_usec < 0) {					       \
  243: 	    (tv1)->tv_sec--;						       \
  244: 	    (tv1)->tv_usec += 1000000;					       \
  245: 	}								       \
  246:     } while (0)
  247: #endif
  248: 
  249: /* Not all systems define NSIG in signal.h */
  250: #if !defined(NSIG)
  251: # if defined(_NSIG)
  252: #  define NSIG _NSIG
  253: # elif defined(__NSIG)
  254: #  define NSIG __NSIG
  255: # else
  256: #  define NSIG 64
  257: # endif
  258: #endif
  259: 
  260: #ifndef WCOREDUMP
  261: # define WCOREDUMP(x)	((x) & 0x80)
  262: #endif
  263: 
  264: #ifndef HAVE_SETEUID
  265: #  if defined(HAVE_SETRESUID)
  266: #    define seteuid(u)	setresuid(-1, (u), -1)
  267: #    define setegid(g)	setresgid(-1, (g), -1)
  268: #    define HAVE_SETEUID 1
  269: #  elif defined(HAVE_SETREUID)
  270: #    define seteuid(u)	setreuid(-1, (u))
  271: #    define setegid(g)	setregid(-1, (g))
  272: #    define HAVE_SETEUID 1
  273: #  endif
  274: #endif /* HAVE_SETEUID */
  275: 
  276: /*
  277:  * HP-UX does not declare innetgr() or getdomainname().
  278:  * Solaris does not declare getdomainname().
  279:  */
  280: #if defined(__hpux)
  281: int innetgr(const char *, const char *, const char *, const char *);
  282: #endif
  283: #if defined(__hpux) || defined(__sun)
  284: int getdomainname(char *, size_t);
  285: #endif
  286: 
  287: /* Functions "missing" from libc. */
  288: 
  289: struct timeval;
  290: struct timespec;
  291: 
  292: #ifndef HAVE_CLOSEFROM
  293: void closefrom(int);
  294: #endif
  295: #ifndef HAVE_GETCWD
  296: char *getcwd(char *, size_t size);
  297: #endif
  298: #ifndef HAVE_GETGROUPLIST
  299: int getgrouplist(const char *, gid_t, gid_t *, int *);
  300: #endif
  301: #ifndef HAVE_GETLINE
  302: ssize_t getline(char **, size_t *, FILE *);
  303: #endif
  304: #ifndef HAVE_UTIMES
  305: int utimes(const char *, const struct timeval *);
  306: #endif
  307: #ifdef HAVE_FUTIME
  308: int futimes(int, const struct timeval *);
  309: #endif
  310: #ifndef HAVE_SNPRINTF
  311: int snprintf(char *, size_t, const char *, ...) __printflike(3, 4);
  312: #endif
  313: #ifndef HAVE_VSNPRINTF
  314: int vsnprintf(char *, size_t, const char *, va_list) __printflike(3, 0);
  315: #endif
  316: #ifndef HAVE_ASPRINTF
  317: int asprintf(char **, const char *, ...) __printflike(2, 3);
  318: #endif
  319: #ifndef HAVE_VASPRINTF
  320: int vasprintf(char **, const char *, va_list) __printflike(2, 0);
  321: #endif
  322: #ifndef HAVE_STRLCAT
  323: size_t strlcat(char *, const char *, size_t);
  324: #endif
  325: #ifndef HAVE_STRLCPY
  326: size_t strlcpy(char *, const char *, size_t);
  327: #endif
  328: #ifndef HAVE_MEMRCHR
  329: void *memrchr(const void *, int, size_t);
  330: #endif
  331: #ifndef HAVE_MKDTEMP
  332: char *mkdtemp(char *);
  333: #endif
  334: #ifndef HAVE_MKSTEMPS
  335: int mkstemps(char *, int);
  336: #endif
  337: #ifndef HAVE_NANOSLEEP
  338: int nanosleep(const struct timespec *, struct timespec *);
  339: #endif
  340: #ifndef HAVE_PW_DUP
  341: struct passwd *pw_dup(const struct passwd *);
  342: #endif
  343: #ifndef HAVE_SETENV
  344: int setenv(const char *, const char *, int);
  345: #endif
  346: #ifndef HAVE_UNSETENV
  347: int unsetenv(const char *);
  348: #endif
  349: #ifndef HAVE_STRSIGNAL
  350: char *strsignal(int);
  351: #endif
  352: 
  353: #endif /* _SUDO_MISSING_H */

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