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