have the sudo-ldap package init.d script be named sudo-ldap
[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 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 */