68d5879b877849c30be80455f4ab82925b115373
[debian/sudo] / include / missing.h
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 #ifndef timevalclear
206 # define timevalclear(tv)       ((tv)->tv_sec = (tv)->tv_usec = 0)
207 #endif
208 #ifndef timevalisset
209 # define timevalisset(tv)       ((tv)->tv_sec || (tv)->tv_usec)
210 #endif
211 #ifndef timevalcmp
212 # define timevalcmp(tv1, tv2, op)                                              \
213     (((tv1)->tv_sec == (tv2)->tv_sec) ?                                        \
214         ((tv1)->tv_usec op (tv2)->tv_usec) :                                   \
215         ((tv1)->tv_sec op (tv2)->tv_sec))
216 #endif
217 #ifndef timevaladd
218 # define timevaladd(tv1, tv2)                                                  \
219     do {                                                                       \
220         (tv1)->tv_sec += (tv2)->tv_sec;                                        \
221         (tv1)->tv_usec += (tv2)->tv_usec;                                      \
222         if ((tv1)->tv_usec >= 1000000) {                                       \
223             (tv1)->tv_sec++;                                                   \
224             (tv1)->tv_usec -= 1000000;                                         \
225         }                                                                      \
226     } while (0)
227 #endif
228 #ifndef timevalsub
229 # define timevalsub(tv1, tv2)                                                  \
230     do {                                                                       \
231         (tv1)->tv_sec -= (tv2)->tv_sec;                                        \
232         (tv1)->tv_usec -= (tv2)->tv_usec;                                      \
233         if ((tv1)->tv_usec < 0) {                                              \
234             (tv1)->tv_sec--;                                                   \
235             (tv1)->tv_usec += 1000000;                                         \
236         }                                                                      \
237     } while (0)
238 #endif
239
240 /* Not all systems define NSIG in signal.h */
241 #if !defined(NSIG)
242 # if defined(_NSIG)
243 #  define NSIG _NSIG
244 # elif defined(__NSIG)
245 #  define NSIG __NSIG
246 # else
247 #  define NSIG 64
248 # endif
249 #endif
250
251 #ifndef WCOREDUMP
252 # define WCOREDUMP(x)   ((x) & 0x80)
253 #endif
254
255 #ifndef HAVE_SETEUID
256 #  if defined(HAVE_SETRESUID)
257 #    define seteuid(u)  setresuid(-1, (u), -1)
258 #    define setegid(g)  setresgid(-1, (g), -1)
259 #    define HAVE_SETEUID 1
260 #  elif defined(HAVE_SETREUID)
261 #    define seteuid(u)  setreuid(-1, (u))
262 #    define setegid(g)  setregid(-1, (g))
263 #    define HAVE_SETEUID 1
264 #  endif
265 #endif /* HAVE_SETEUID */
266
267 /*
268  * HP-UX does not declare innetgr() or getdomainname().
269  * Solaris does not declare getdomainname().
270  */
271 #if defined(__hpux)
272 int innetgr(const char *, const char *, const char *, const char *);
273 #endif
274 #if defined(__hpux) || defined(__sun)
275 int getdomainname(char *, size_t);
276 #endif
277
278 /* Functions "missing" from libc. */
279
280 struct timeval;
281 struct timespec;
282
283 #ifndef HAVE_CLOSEFROM
284 void closefrom(int);
285 #endif
286 #ifndef HAVE_GETCWD
287 char *getcwd(char *, size_t size);
288 #endif
289 #ifndef HAVE_GETLINE
290 ssize_t getline(char **, size_t *, FILE *);
291 #endif
292 #ifndef HAVE_UTIMES
293 int utimes(const char *, const struct timeval *);
294 #endif
295 #ifdef HAVE_FUTIME
296 int futimes(int, const struct timeval *);
297 #endif
298 #ifndef HAVE_SNPRINTF
299 int snprintf(char *, size_t, const char *, ...) __printflike(3, 4);
300 #endif
301 #ifndef HAVE_VSNPRINTF
302 int vsnprintf(char *, size_t, const char *, va_list) __printflike(3, 0);
303 #endif
304 #ifndef HAVE_ASPRINTF
305 int asprintf(char **, const char *, ...) __printflike(2, 3);
306 #endif
307 #ifndef HAVE_VASPRINTF
308 int vasprintf(char **, const char *, va_list) __printflike(2, 0);
309 #endif
310 #ifndef HAVE_STRLCAT
311 size_t strlcat(char *, const char *, size_t);
312 #endif
313 #ifndef HAVE_STRLCPY
314 size_t strlcpy(char *, const char *, size_t);
315 #endif
316 #ifndef HAVE_MEMRCHR
317 void *memrchr(const void *, int, size_t);
318 #endif
319 #ifndef HAVE_MKDTEMP
320 char *mkdtemp(char *);
321 #endif
322 #ifndef HAVE_MKSTEMPS
323 int mkstemps(char *, int);
324 #endif
325 #ifndef HAVE_NANOSLEEP
326 int nanosleep(const struct timespec *, struct timespec *);
327 #endif
328 #ifndef HAVE_SETENV
329 int setenv(const char *, const char *, int);
330 #endif
331 #ifndef HAVE_UNSETENV
332 int unsetenv(const char *);
333 #endif
334 #ifndef HAVE_STRSIGNAL
335 char *strsignal(int);
336 #endif
337
338 #endif /* _SUDO_MISSING_H */