Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 :
4 : macros to go along with the lib/replace/ portability layer code
5 :
6 : Copyright (C) Andrew Tridgell 2005
7 : Copyright (C) Jelmer Vernooij 2006-2008
8 : Copyright (C) Jeremy Allison 2007.
9 :
10 : ** NOTE! The following LGPL license applies to the replace
11 : ** library. This does NOT imply that all of Samba is released
12 : ** under the LGPL
13 :
14 : This library is free software; you can redistribute it and/or
15 : modify it under the terms of the GNU Lesser General Public
16 : License as published by the Free Software Foundation; either
17 : version 3 of the License, or (at your option) any later version.
18 :
19 : This library is distributed in the hope that it will be useful,
20 : but WITHOUT ANY WARRANTY; without even the implied warranty of
21 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 : Lesser General Public License for more details.
23 :
24 : You should have received a copy of the GNU Lesser General Public
25 : License along with this library; if not, see <http://www.gnu.org/licenses/>.
26 : */
27 :
28 : #ifndef _LIBREPLACE_REPLACE_H
29 : #define _LIBREPLACE_REPLACE_H
30 :
31 : #ifndef NO_CONFIG_H
32 : #include "config.h"
33 : #endif
34 :
35 : #ifdef HAVE_STANDARDS_H
36 : #include <standards.h>
37 : #endif
38 :
39 : /*
40 : * Needs to be defined before std*.h and string*.h are included
41 : * As it's also needed when Python.h is the first header we
42 : * require a global -D__STDC_WANT_LIB_EXT1__=1
43 : */
44 : #if __STDC_WANT_LIB_EXT1__ != 1
45 : #error -D__STDC_WANT_LIB_EXT1__=1 required
46 : #endif
47 :
48 : #include <stdio.h>
49 : #include <stdlib.h>
50 : #include <stdarg.h>
51 : #include <errno.h>
52 :
53 : #ifndef HAVE_DECL_EWOULDBLOCK
54 : #define EWOULDBLOCK EAGAIN
55 : #endif
56 :
57 : #if defined(_MSC_VER) || defined(__MINGW32__)
58 : #include "win32_replace.h"
59 : #endif
60 :
61 :
62 : #ifdef HAVE_INTTYPES_H
63 : #define __STDC_FORMAT_MACROS
64 : #include <inttypes.h>
65 : #elif defined(HAVE_STDINT_H)
66 : #include <stdint.h>
67 : /* force off HAVE_INTTYPES_H so that roken doesn't try to include both,
68 : which causes a warning storm on irix */
69 : #undef HAVE_INTTYPES_H
70 : #endif
71 :
72 : #ifdef HAVE_MALLOC_H
73 : #include <malloc.h>
74 : #endif
75 :
76 : #ifndef __PRI64_PREFIX
77 : # if __WORDSIZE == 64 && ! defined __APPLE__
78 : # define __PRI64_PREFIX "l"
79 : # else
80 : # define __PRI64_PREFIX "ll"
81 : # endif
82 : #endif
83 :
84 : /* Decimal notation. */
85 : #ifndef PRId8
86 : # define PRId8 "d"
87 : #endif
88 : #ifndef PRId16
89 : # define PRId16 "d"
90 : #endif
91 : #ifndef PRId32
92 : # define PRId32 "d"
93 : #endif
94 : #ifndef PRId64
95 : # define PRId64 __PRI64_PREFIX "d"
96 : #endif
97 :
98 : #ifndef PRIi8
99 : # define PRIi8 "i"
100 : #endif
101 : #ifndef PRIi16
102 : # define PRIi16 "i"
103 : #endif
104 : #ifndef PRIi32
105 : # define PRIi32 "i"
106 : #endif
107 : #ifndef PRIi64
108 : # define PRIi64 __PRI64_PREFIX "i"
109 : #endif
110 :
111 : #ifndef PRIu8
112 : # define PRIu8 "u"
113 : #endif
114 : #ifndef PRIu16
115 : # define PRIu16 "u"
116 : #endif
117 : #ifndef PRIu32
118 : # define PRIu32 "u"
119 : #endif
120 : #ifndef PRIu64
121 : # define PRIu64 __PRI64_PREFIX "u"
122 : #endif
123 :
124 : #ifndef SCNd8
125 : # define SCNd8 "hhd"
126 : #endif
127 : #ifndef SCNd16
128 : # define SCNd16 "hd"
129 : #endif
130 : #ifndef SCNd32
131 : # define SCNd32 "d"
132 : #endif
133 : #ifndef SCNd64
134 : # define SCNd64 __PRI64_PREFIX "d"
135 : #endif
136 :
137 : #ifndef SCNi8
138 : # define SCNi8 "hhi"
139 : #endif
140 : #ifndef SCNi16
141 : # define SCNi16 "hi"
142 : #endif
143 : #ifndef SCNi32
144 : # define SCNi32 "i"
145 : #endif
146 : #ifndef SCNi64
147 : # define SCNi64 __PRI64_PREFIX "i"
148 : #endif
149 :
150 : #ifndef SCNu8
151 : # define SCNu8 "hhu"
152 : #endif
153 : #ifndef SCNu16
154 : # define SCNu16 "hu"
155 : #endif
156 : #ifndef SCNu32
157 : # define SCNu32 "u"
158 : #endif
159 : #ifndef SCNu64
160 : # define SCNu64 __PRI64_PREFIX "u"
161 : #endif
162 :
163 : #ifdef HAVE_BSD_STRING_H
164 : #include <bsd/string.h>
165 : #endif
166 :
167 : #ifdef HAVE_BSD_UNISTD_H
168 : #include <bsd/unistd.h>
169 : #endif
170 :
171 : #ifdef HAVE_UNISTD_H
172 : #include <unistd.h>
173 : #endif
174 :
175 : #ifdef HAVE_STRING_H
176 : #include <string.h>
177 : #endif
178 :
179 : #ifdef HAVE_STRINGS_H
180 : #include <strings.h>
181 : #endif
182 :
183 : #ifdef HAVE_SYS_TYPES_H
184 : #include <sys/types.h>
185 : #endif
186 :
187 : #ifdef HAVE_SYS_SYSMACROS_H
188 : #include <sys/sysmacros.h>
189 : #endif
190 :
191 : #ifdef HAVE_SETPROCTITLE_H
192 : #include <setproctitle.h>
193 : #endif
194 :
195 : #if STDC_HEADERS
196 : #include <stdlib.h>
197 : #include <stddef.h>
198 : #endif
199 :
200 : #ifdef HAVE_LINUX_TYPES_H
201 : /*
202 : * This is needed as some broken header files require this to be included early
203 : */
204 : #include <linux/types.h>
205 : #endif
206 :
207 : #ifndef HAVE_STRERROR
208 : extern const char *const sys_errlist[];
209 : #define strerror(i) sys_errlist[i]
210 : #endif
211 :
212 : #ifndef HAVE_ERRNO_DECL
213 : extern int errno;
214 : #endif
215 :
216 : #ifndef HAVE_STRDUP
217 : #define strdup rep_strdup
218 : char *rep_strdup(const char *s);
219 : #endif
220 :
221 : #ifndef HAVE_MEMMOVE
222 : #define memmove rep_memmove
223 : void *rep_memmove(void *dest,const void *src,int size);
224 : #endif
225 :
226 : #ifndef HAVE_MEMMEM
227 : #define memmem rep_memmem
228 : void *rep_memmem(const void *haystack, size_t haystacklen,
229 : const void *needle, size_t needlelen);
230 : #endif
231 :
232 : #ifndef HAVE_MEMALIGN
233 : #define memalign rep_memalign
234 : void *rep_memalign(size_t boundary, size_t size);
235 : #endif
236 :
237 : #ifndef HAVE_MKTIME
238 : #define mktime rep_mktime
239 : /* prototype is in "system/time.h" */
240 : #endif
241 :
242 : #ifndef HAVE_TIMEGM
243 : #define timegm rep_timegm
244 : /* prototype is in "system/time.h" */
245 : #endif
246 :
247 : #ifndef HAVE_UTIME
248 : #define utime rep_utime
249 : /* prototype is in "system/time.h" */
250 : #endif
251 :
252 : #ifndef HAVE_UTIMES
253 : #define utimes rep_utimes
254 : /* prototype is in "system/time.h" */
255 : #endif
256 :
257 : #ifndef HAVE_STRLCPY
258 : #define strlcpy rep_strlcpy
259 : size_t rep_strlcpy(char *d, const char *s, size_t bufsize);
260 : #endif
261 :
262 : #ifndef HAVE_STRLCAT
263 : #define strlcat rep_strlcat
264 : size_t rep_strlcat(char *d, const char *s, size_t bufsize);
265 : #endif
266 :
267 : #ifndef HAVE_CLOSEFROM
268 : #define closefrom rep_closefrom
269 : int rep_closefrom(int lower);
270 : #endif
271 :
272 :
273 : #if (defined(BROKEN_STRNDUP) || !defined(HAVE_STRNDUP))
274 : #undef HAVE_STRNDUP
275 : #define strndup rep_strndup
276 : char *rep_strndup(const char *s, size_t n);
277 : #endif
278 :
279 : #if (defined(BROKEN_STRNLEN) || !defined(HAVE_STRNLEN))
280 : #undef HAVE_STRNLEN
281 : #define strnlen rep_strnlen
282 : size_t rep_strnlen(const char *s, size_t n);
283 : #endif
284 :
285 : #if !defined(HAVE_DECL_ENVIRON)
286 : # ifdef __APPLE__
287 : # include <crt_externs.h>
288 : # define environ (*_NSGetEnviron())
289 : # else /* __APPLE__ */
290 : extern char **environ;
291 : # endif /* __APPLE */
292 : #endif /* !defined(HAVE_DECL_ENVIRON) */
293 :
294 : #ifndef HAVE_SETENV
295 : #define setenv rep_setenv
296 : int rep_setenv(const char *name, const char *value, int overwrite);
297 : #else
298 : #ifndef HAVE_SETENV_DECL
299 : int setenv(const char *name, const char *value, int overwrite);
300 : #endif
301 : #endif
302 :
303 : #ifndef HAVE_UNSETENV
304 : #define unsetenv rep_unsetenv
305 : int rep_unsetenv(const char *name);
306 : #endif
307 :
308 : #ifndef HAVE_SETEUID
309 : #define seteuid rep_seteuid
310 : int rep_seteuid(uid_t);
311 : #endif
312 :
313 : #ifndef HAVE_SETEGID
314 : #define setegid rep_setegid
315 : int rep_setegid(gid_t);
316 : #endif
317 :
318 : #if (defined(USE_SETRESUID) && !defined(HAVE_SETRESUID_DECL))
319 : /* stupid glibc */
320 : int setresuid(uid_t ruid, uid_t euid, uid_t suid);
321 : #endif
322 : #if (defined(USE_SETRESUID) && !defined(HAVE_SETRESGID_DECL))
323 : int setresgid(gid_t rgid, gid_t egid, gid_t sgid);
324 : #endif
325 :
326 : #ifndef HAVE_CHOWN
327 : #define chown rep_chown
328 : int rep_chown(const char *path, uid_t uid, gid_t gid);
329 : #endif
330 :
331 : #ifndef HAVE_CHROOT
332 : #define chroot rep_chroot
333 : int rep_chroot(const char *dirname);
334 : #endif
335 :
336 : #ifndef HAVE_LINK
337 : #define link rep_link
338 : int rep_link(const char *oldpath, const char *newpath);
339 : #endif
340 :
341 : #ifndef HAVE_READLINK
342 : #define readlink rep_readlink
343 : ssize_t rep_readlink(const char *path, char *buf, size_t bufsize);
344 : #endif
345 :
346 : #ifndef HAVE_SYMLINK
347 : #define symlink rep_symlink
348 : int rep_symlink(const char *oldpath, const char *newpath);
349 : #endif
350 :
351 : #ifndef HAVE_REALPATH
352 : #define realpath rep_realpath
353 : char *rep_realpath(const char *path, char *resolved_path);
354 : #endif
355 :
356 : #ifndef HAVE_LCHOWN
357 : #define lchown rep_lchown
358 : int rep_lchown(const char *fname,uid_t uid,gid_t gid);
359 : #endif
360 :
361 : #ifdef HAVE_UNIX_H
362 : #include <unix.h>
363 : #endif
364 :
365 : #ifndef HAVE_SETLINEBUF
366 : #define setlinebuf rep_setlinebuf
367 : void rep_setlinebuf(FILE *);
368 : #endif
369 :
370 : #ifndef HAVE_STRCASESTR
371 : #define strcasestr rep_strcasestr
372 : char *rep_strcasestr(const char *haystack, const char *needle);
373 : #endif
374 :
375 : #ifndef HAVE_STRSEP
376 : #define strsep rep_strsep
377 : char *rep_strsep(char **pps, const char *delim);
378 : #endif
379 :
380 : #ifndef HAVE_STRTOK_R
381 : #define strtok_r rep_strtok_r
382 : char *rep_strtok_r(char *s, const char *delim, char **save_ptr);
383 : #endif
384 :
385 :
386 :
387 : #ifndef HAVE_STRTOLL
388 : #define strtoll rep_strtoll
389 : long long int rep_strtoll(const char *str, char **endptr, int base);
390 : #else
391 : #ifdef HAVE_BSD_STRTOLL
392 : #define strtoll rep_strtoll
393 : long long int rep_strtoll(const char *str, char **endptr, int base);
394 : #endif
395 : #endif
396 :
397 : #ifndef HAVE_STRTOULL
398 : #define strtoull rep_strtoull
399 : unsigned long long int rep_strtoull(const char *str, char **endptr, int base);
400 : #else
401 : #ifdef HAVE_BSD_STRTOLL /* yes, it's not HAVE_BSD_STRTOULL */
402 : #define strtoull rep_strtoull
403 : unsigned long long int rep_strtoull(const char *str, char **endptr, int base);
404 : #endif
405 : #endif
406 :
407 : #ifndef HAVE_FTRUNCATE
408 : #define ftruncate rep_ftruncate
409 : int rep_ftruncate(int,off_t);
410 : #endif
411 :
412 : #ifndef HAVE_INITGROUPS
413 : #define initgroups rep_initgroups
414 : int rep_initgroups(char *name, gid_t id);
415 : #endif
416 :
417 : #if !defined(HAVE_BZERO) && defined(HAVE_MEMSET)
418 : #define bzero(a,b) memset((a),'\0',(b))
419 : #endif
420 :
421 : #ifndef HAVE_DLERROR
422 : #define dlerror rep_dlerror
423 : char *rep_dlerror(void);
424 : #endif
425 :
426 : #ifndef HAVE_DLOPEN
427 : #define dlopen rep_dlopen
428 : #ifdef DLOPEN_TAKES_UNSIGNED_FLAGS
429 : void *rep_dlopen(const char *name, unsigned int flags);
430 : #else
431 : void *rep_dlopen(const char *name, int flags);
432 : #endif
433 : #endif
434 :
435 : #ifndef HAVE_DLSYM
436 : #define dlsym rep_dlsym
437 : void *rep_dlsym(void *handle, const char *symbol);
438 : #endif
439 :
440 : #ifndef HAVE_DLCLOSE
441 : #define dlclose rep_dlclose
442 : int rep_dlclose(void *handle);
443 : #endif
444 :
445 : #ifndef HAVE_SOCKETPAIR
446 : #define socketpair rep_socketpair
447 : /* prototype is in system/network.h */
448 : #endif
449 :
450 : /* for old gcc releases that don't have the feature test macro __has_attribute */
451 : #ifndef __has_attribute
452 : #define __has_attribute(x) 0
453 : #endif
454 :
455 : #ifndef PRINTF_ATTRIBUTE
456 : #if __has_attribute(format) || (__GNUC__ >= 3)
457 : /** Use gcc attribute to check printf fns. a1 is the 1-based index of
458 : * the parameter containing the format, and a2 the index of the first
459 : * argument. Note that some gcc 2.x versions don't handle this
460 : * properly **/
461 : #define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2)))
462 : #else
463 : #define PRINTF_ATTRIBUTE(a1, a2)
464 : #endif
465 : #endif
466 :
467 : #ifndef _DEPRECATED_
468 : #if __has_attribute(deprecated) || (__GNUC__ >= 3)
469 : #define _DEPRECATED_ __attribute__ ((deprecated))
470 : #else
471 : #define _DEPRECATED_
472 : #endif
473 : #endif
474 :
475 : #if !defined(HAVE_VDPRINTF) || !defined(HAVE_C99_VSNPRINTF)
476 : #define vdprintf rep_vdprintf
477 : int rep_vdprintf(int fd, const char *format, va_list ap) PRINTF_ATTRIBUTE(2,0);
478 : #endif
479 :
480 : #if !defined(HAVE_DPRINTF) || !defined(HAVE_C99_VSNPRINTF)
481 : #define dprintf rep_dprintf
482 : int rep_dprintf(int fd, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
483 : #endif
484 :
485 : #if !defined(HAVE_VASPRINTF) || !defined(HAVE_C99_VSNPRINTF)
486 : #define vasprintf rep_vasprintf
487 : int rep_vasprintf(char **ptr, const char *format, va_list ap) PRINTF_ATTRIBUTE(2,0);
488 : #endif
489 :
490 : #if !defined(HAVE_SNPRINTF) || !defined(HAVE_C99_VSNPRINTF)
491 : #define snprintf rep_snprintf
492 : int rep_snprintf(char *,size_t ,const char *, ...) PRINTF_ATTRIBUTE(3,4);
493 : #endif
494 :
495 : #if !defined(HAVE_VSNPRINTF) || !defined(HAVE_C99_VSNPRINTF)
496 : #define vsnprintf rep_vsnprintf
497 : int rep_vsnprintf(char *,size_t ,const char *, va_list ap) PRINTF_ATTRIBUTE(3,0);
498 : #endif
499 :
500 : #if !defined(HAVE_ASPRINTF) || !defined(HAVE_C99_VSNPRINTF)
501 : #define asprintf rep_asprintf
502 : int rep_asprintf(char **,const char *, ...) PRINTF_ATTRIBUTE(2,3);
503 : #endif
504 :
505 : #if !defined(HAVE_C99_VSNPRINTF)
506 : #ifdef REPLACE_BROKEN_PRINTF
507 : /*
508 : * We do not redefine printf by default
509 : * as it breaks the build if system headers
510 : * use __attribute__((format(printf, 3, 0)))
511 : * instead of __attribute__((format(__printf__, 3, 0)))
512 : */
513 : #define printf rep_printf
514 : #endif
515 : int rep_printf(const char *, ...) PRINTF_ATTRIBUTE(1,2);
516 : #endif
517 :
518 : #if !defined(HAVE_C99_VSNPRINTF)
519 : #define fprintf rep_fprintf
520 : int rep_fprintf(FILE *stream, const char *, ...) PRINTF_ATTRIBUTE(2,3);
521 : #endif
522 :
523 : #ifndef HAVE_VSYSLOG
524 : #ifdef HAVE_SYSLOG
525 : #define vsyslog rep_vsyslog
526 : void rep_vsyslog (int facility_priority, const char *format, va_list arglist) PRINTF_ATTRIBUTE(2,0);
527 : #endif
528 : #endif
529 :
530 : /* we used to use these fns, but now we have good replacements
531 : for snprintf and vsnprintf */
532 : #define slprintf snprintf
533 :
534 :
535 : #ifndef HAVE_VA_COPY
536 : #undef va_copy
537 : #ifdef HAVE___VA_COPY
538 : #define va_copy(dest, src) __va_copy(dest, src)
539 : #else
540 : #define va_copy(dest, src) (dest) = (src)
541 : #endif
542 : #endif
543 :
544 : #ifndef HAVE_VOLATILE
545 : #define volatile
546 : #endif
547 :
548 : #ifndef HAVE_COMPARISON_FN_T
549 : typedef int (*comparison_fn_t)(const void *, const void *);
550 : #endif
551 :
552 : #ifndef HAVE_WORKING_STRPTIME
553 : #define strptime rep_strptime
554 : struct tm;
555 : char *rep_strptime(const char *buf, const char *format, struct tm *tm);
556 : #endif
557 :
558 : #ifndef HAVE_DUP2
559 : #define dup2 rep_dup2
560 : int rep_dup2(int oldfd, int newfd);
561 : #endif
562 :
563 : /* Load header file for dynamic linking stuff */
564 : #ifdef HAVE_DLFCN_H
565 : #include <dlfcn.h>
566 : #endif
567 :
568 : #ifndef RTLD_LAZY
569 : #define RTLD_LAZY 0
570 : #endif
571 : #ifndef RTLD_NOW
572 : #define RTLD_NOW 0
573 : #endif
574 : #ifndef RTLD_GLOBAL
575 : #define RTLD_GLOBAL 0
576 : #endif
577 :
578 : #ifndef HAVE_SECURE_MKSTEMP
579 : #define mkstemp(path) rep_mkstemp(path)
580 : int rep_mkstemp(char *temp);
581 : #endif
582 :
583 : #ifndef HAVE_MKDTEMP
584 : #define mkdtemp rep_mkdtemp
585 : char *rep_mkdtemp(char *template);
586 : #endif
587 :
588 : #ifndef HAVE_PREAD
589 : #define pread rep_pread
590 : ssize_t rep_pread(int __fd, void *__buf, size_t __nbytes, off_t __offset);
591 : #define LIBREPLACE_PREAD_REPLACED 1
592 : #else
593 : #define LIBREPLACE_PREAD_NOT_REPLACED 1
594 : #endif
595 :
596 : #ifndef HAVE_PWRITE
597 : #define pwrite rep_pwrite
598 : ssize_t rep_pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offset);
599 : #define LIBREPLACE_PWRITE_REPLACED 1
600 : #else
601 : #define LIBREPLACE_PWRITE_NOT_REPLACED 1
602 : #endif
603 :
604 : #if !defined(HAVE_INET_NTOA) || defined(REPLACE_INET_NTOA)
605 : #define inet_ntoa rep_inet_ntoa
606 : /* prototype is in "system/network.h" */
607 : #endif
608 :
609 : #ifndef HAVE_INET_PTON
610 : #define inet_pton rep_inet_pton
611 : /* prototype is in "system/network.h" */
612 : #endif
613 :
614 : #ifndef HAVE_INET_NTOP
615 : #define inet_ntop rep_inet_ntop
616 : /* prototype is in "system/network.h" */
617 : #endif
618 :
619 : #ifndef HAVE_INET_ATON
620 : #define inet_aton rep_inet_aton
621 : /* prototype is in "system/network.h" */
622 : #endif
623 :
624 : #ifndef HAVE_CONNECT
625 : #define connect rep_connect
626 : /* prototype is in "system/network.h" */
627 : #endif
628 :
629 : #ifndef HAVE_GETHOSTBYNAME
630 : #define gethostbyname rep_gethostbyname
631 : /* prototype is in "system/network.h" */
632 : #endif
633 :
634 : #ifndef HAVE_GETIFADDRS
635 : #define getifaddrs rep_getifaddrs
636 : /* prototype is in "system/network.h" */
637 : #endif
638 :
639 : #ifndef HAVE_FREEIFADDRS
640 : #define freeifaddrs rep_freeifaddrs
641 : /* prototype is in "system/network.h" */
642 : #endif
643 :
644 : #ifndef HAVE_GET_CURRENT_DIR_NAME
645 : #define get_current_dir_name rep_get_current_dir_name
646 : char *rep_get_current_dir_name(void);
647 : #endif
648 :
649 : #if (!defined(HAVE_STRERROR_R) || !defined(STRERROR_R_XSI_NOT_GNU))
650 : #define strerror_r rep_strerror_r
651 : int rep_strerror_r(int errnum, char *buf, size_t buflen);
652 : #endif
653 :
654 : #if !defined(HAVE_CLOCK_GETTIME)
655 : #define clock_gettime rep_clock_gettime
656 : #endif
657 :
658 : #ifdef HAVE_LIMITS_H
659 : #include <limits.h>
660 : #endif
661 :
662 : #ifdef HAVE_SYS_PARAM_H
663 : #include <sys/param.h>
664 : #endif
665 :
666 : /* The extra casts work around common compiler bugs. */
667 : #define _TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
668 : /* The outer cast is needed to work around a bug in Cray C 5.0.3.0.
669 : It is necessary at least when t == time_t. */
670 : #define _TYPE_MINIMUM(t) ((t) (_TYPE_SIGNED (t) \
671 : ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0))
672 : #define _TYPE_MAXIMUM(t) ((t) (~ (t) 0 - _TYPE_MINIMUM (t)))
673 :
674 : #ifndef UINT16_MAX
675 : #define UINT16_MAX 65535
676 : #endif
677 :
678 : #ifndef UINT32_MAX
679 : #define UINT32_MAX (4294967295U)
680 : #endif
681 :
682 : #ifndef UINT64_MAX
683 : #define UINT64_MAX ((uint64_t)-1)
684 : #endif
685 :
686 : #ifndef INT64_MAX
687 : #define INT64_MAX 9223372036854775807LL
688 : #endif
689 :
690 : #ifndef CHAR_BIT
691 : #define CHAR_BIT 8
692 : #endif
693 :
694 : #ifndef INT32_MAX
695 : #define INT32_MAX _TYPE_MAXIMUM(int32_t)
696 : #endif
697 :
698 : #ifdef HAVE_STDBOOL_H
699 : #include <stdbool.h>
700 : #endif
701 :
702 : #ifndef HAVE_BOOL
703 : #error Need a real boolean type
704 : #endif
705 :
706 : #if !defined(HAVE_INTPTR_T)
707 : typedef long long intptr_t ;
708 : #define __intptr_t_defined
709 : #endif
710 :
711 : #if !defined(HAVE_UINTPTR_T)
712 : typedef unsigned long long uintptr_t ;
713 : #define __uintptr_t_defined
714 : #endif
715 :
716 : #if !defined(HAVE_PTRDIFF_T)
717 : typedef unsigned long long ptrdiff_t ;
718 : #endif
719 :
720 : /*
721 : * to prevent <rpcsvc/yp_prot.h> from doing a redefine of 'bool'
722 : *
723 : * IRIX, HPUX, MacOS 10 and Solaris need BOOL_DEFINED
724 : * Tru64 needs _BOOL_EXISTS
725 : * AIX needs _BOOL,_TRUE,_FALSE
726 : */
727 : #ifndef BOOL_DEFINED
728 : #define BOOL_DEFINED
729 : #endif
730 : #ifndef _BOOL_EXISTS
731 : #define _BOOL_EXISTS
732 : #endif
733 : #ifndef _BOOL
734 : #define _BOOL
735 : #endif
736 :
737 : #ifndef __bool_true_false_are_defined
738 : #define __bool_true_false_are_defined
739 : #endif
740 :
741 : #ifndef true
742 : #define true (1)
743 : #endif
744 : #ifndef false
745 : #define false (0)
746 : #endif
747 :
748 : #ifndef _TRUE
749 : #define _TRUE true
750 : #endif
751 : #ifndef _FALSE
752 : #define _FALSE false
753 : #endif
754 :
755 : #ifndef HAVE_FUNCTION_MACRO
756 : #ifdef HAVE_func_MACRO
757 : #define __FUNCTION__ __func__
758 : #else
759 : #define __FUNCTION__ ("")
760 : #endif
761 : #endif
762 :
763 :
764 : #ifndef MIN
765 : #define MIN(a,b) ((a)<(b)?(a):(b))
766 : #endif
767 :
768 : #ifndef MAX
769 : #define MAX(a,b) ((a)>(b)?(a):(b))
770 : #endif
771 :
772 : #if !defined(HAVE_VOLATILE)
773 : #define volatile
774 : #endif
775 :
776 : /**
777 : this is a warning hack. The idea is to use this everywhere that we
778 : get the "discarding const" warning from gcc. That doesn't actually
779 : fix the problem of course, but it means that when we do get to
780 : cleaning them up we can do it by searching the code for
781 : discard_const.
782 :
783 : It also means that other error types aren't as swamped by the noise
784 : of hundreds of const warnings, so we are more likely to notice when
785 : we get new errors.
786 :
787 : Please only add more uses of this macro when you find it
788 : _really_ hard to fix const warnings. Our aim is to eventually use
789 : this function in only a very few places.
790 :
791 : Also, please call this via the discard_const_p() macro interface, as that
792 : makes the return type safe.
793 : */
794 : #define discard_const(ptr) ((void *)((uintptr_t)(ptr)))
795 :
796 : /** Type-safe version of discard_const */
797 : #define discard_const_p(type, ptr) ((type *)discard_const(ptr))
798 :
799 : #ifndef __STRING
800 : #define __STRING(x) #x
801 : #endif
802 :
803 : #ifndef __STRINGSTRING
804 : #define __STRINGSTRING(x) __STRING(x)
805 : #endif
806 :
807 : #ifndef __LINESTR__
808 : #define __LINESTR__ __STRINGSTRING(__LINE__)
809 : #endif
810 :
811 : #ifndef __location__
812 : #define __location__ __FILE__ ":" __LINESTR__
813 : #endif
814 :
815 : /**
816 : * Zero a structure.
817 : */
818 : #define ZERO_STRUCT(x) memset_s((char *)&(x), sizeof(x), 0, sizeof(x))
819 :
820 : /**
821 : * Zero a structure given a pointer to the structure.
822 : */
823 : #define ZERO_STRUCTP(x) do { \
824 : if ((x) != NULL) { \
825 : memset_s((char *)(x), sizeof(*(x)), 0, sizeof(*(x))); \
826 : } \
827 : } while(0)
828 :
829 : /**
830 : * Zero a structure given a pointer to the structure - no zero check
831 : */
832 : #define ZERO_STRUCTPN(x) memset_s((char *)(x), sizeof(*(x)), 0, sizeof(*(x)))
833 :
834 : /**
835 : * Zero an array - note that sizeof(array) must work - ie. it must not be a
836 : * pointer
837 : */
838 : #define ZERO_ARRAY(x) memset_s((char *)(x), sizeof(x), 0, sizeof(x))
839 :
840 : /**
841 : * Zero a given len of an array
842 : */
843 : #define ZERO_ARRAY_LEN(x, l) memset_s((char *)(x), (l), 0, (l))
844 :
845 : /**
846 : * Explicitly zero data from memory. This is guaranteed to be not optimized
847 : * away.
848 : */
849 : #define BURN_DATA(x) memset_s((char *)&(x), sizeof(x), 0, sizeof(x))
850 :
851 : /**
852 : * Explicitly zero data from memory. This is guaranteed to be not optimized
853 : * away.
854 : */
855 : #define BURN_DATA_SIZE(x, s) memset_s((char *)&(x), (s), 0, (s))
856 :
857 : /**
858 : * Explicitly zero data from memory. This is guaranteed to be not optimized
859 : * away.
860 : */
861 : #define BURN_PTR_SIZE(x, s) memset_s((x), (s), 0, (s))
862 :
863 : /**
864 : * Explicitly zero data in string. This is guaranteed to be not optimized
865 : * away.
866 : */
867 : #define BURN_STR(x) do { \
868 : if ((x) != NULL) { \
869 : size_t s = strlen(x); \
870 : memset_s((x), s, 0, s); \
871 : } \
872 : } while(0)
873 :
874 : /**
875 : * Work out how many elements there are in a static array.
876 : */
877 : #ifdef ARRAY_SIZE
878 : #undef ARRAY_SIZE
879 : #endif
880 : #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
881 :
882 : /**
883 : * Remove an array element by moving the rest one down
884 : */
885 : #define ARRAY_DEL_ELEMENT(a,i,n) \
886 : if((i)<((n)-1)){memmove(&((a)[(i)]),&((a)[(i)+1]),(sizeof(*(a))*((n)-(i)-1)));}
887 :
888 : /**
889 : * Insert an array element by moving the rest one up
890 : *
891 : */
892 : #define ARRAY_INSERT_ELEMENT(__array,__old_last_idx,__new_elem,__new_idx) do { \
893 : if ((__new_idx) < (__old_last_idx)) { \
894 : const void *__src = &((__array)[(__new_idx)]); \
895 : void *__dst = &((__array)[(__new_idx)+1]); \
896 : size_t __num = (__old_last_idx)-(__new_idx); \
897 : size_t __len = sizeof(*(__array)) * __num; \
898 : memmove(__dst, __src, __len); \
899 : } \
900 : (__array)[(__new_idx)] = (__new_elem); \
901 : } while(0)
902 :
903 : /**
904 : * Pointer difference macro
905 : */
906 : #define PTR_DIFF(p1,p2) ((ptrdiff_t)(((const char *)(p1)) - (const char *)(p2)))
907 :
908 : #ifdef __COMPAR_FN_T
909 : #define QSORT_CAST (__compar_fn_t)
910 : #endif
911 :
912 : #ifndef QSORT_CAST
913 : #define QSORT_CAST (int (*)(const void *, const void *))
914 : #endif
915 :
916 : #ifndef PATH_MAX
917 : #define PATH_MAX 1024
918 : #endif
919 :
920 : #ifndef MAX_DNS_NAME_LENGTH
921 : #define MAX_DNS_NAME_LENGTH 256 /* Actually 255 but +1 for terminating null. */
922 : #endif
923 :
924 : #ifdef HAVE_CRYPT_H
925 : #include <crypt.h>
926 : #endif
927 :
928 : /* these macros gain us a few percent of speed on gcc */
929 : #if (__GNUC__ >= 3)
930 : /* the strange !! is to ensure that __builtin_expect() takes either 0 or 1
931 : as its first argument */
932 : #ifndef likely
933 : #define likely(x) __builtin_expect(!!(x), 1)
934 : #endif
935 : #ifndef unlikely
936 : #define unlikely(x) __builtin_expect(!!(x), 0)
937 : #endif
938 : #else
939 : #ifndef likely
940 : #define likely(x) (x)
941 : #endif
942 : #ifndef unlikely
943 : #define unlikely(x) (x)
944 : #endif
945 : #endif
946 :
947 : #ifndef HAVE_FDATASYNC
948 : #define fdatasync(fd) fsync(fd)
949 : #elif !defined(HAVE_DECL_FDATASYNC)
950 : int fdatasync(int );
951 : #endif
952 :
953 : /* these are used to mark symbols as local to a shared lib, or
954 : * publicly available via the shared lib API */
955 : #ifndef _PUBLIC_
956 : #ifdef HAVE_VISIBILITY_ATTR
957 : #define _PUBLIC_ __attribute__((visibility("default")))
958 : #else
959 : #define _PUBLIC_
960 : #endif
961 : #endif
962 :
963 : #ifndef _PRIVATE_
964 : #ifdef HAVE_VISIBILITY_ATTR
965 : # define _PRIVATE_ __attribute__((visibility("hidden")))
966 : #else
967 : # define _PRIVATE_
968 : #endif
969 : #endif
970 :
971 : #ifndef HAVE_POLL
972 : #define poll rep_poll
973 : /* prototype is in "system/network.h" */
974 : #endif
975 :
976 : #ifndef HAVE_GETPEEREID
977 : #define getpeereid rep_getpeereid
978 : int rep_getpeereid(int s, uid_t *uid, gid_t *gid);
979 : #endif
980 :
981 : #ifndef HAVE_USLEEP
982 : #define usleep rep_usleep
983 : typedef long useconds_t;
984 : int usleep(useconds_t);
985 : #endif
986 :
987 : #ifndef HAVE_SETPROCTITLE
988 : #define setproctitle rep_setproctitle
989 : void rep_setproctitle(const char *fmt, ...) PRINTF_ATTRIBUTE(1, 2);
990 : #endif
991 :
992 : #ifndef HAVE_SETPROCTITLE_INIT
993 : #define setproctitle_init rep_setproctitle_init
994 : void rep_setproctitle_init(int argc, char *argv[], char *envp[]);
995 : #endif
996 :
997 : #ifndef HAVE_MEMSET_S
998 : #define memset_s rep_memset_s
999 : int rep_memset_s(void *dest, size_t destsz, int ch, size_t count);
1000 : #endif
1001 :
1002 : #ifndef HAVE_GETPROGNAME
1003 : #define getprogname rep_getprogname
1004 : const char *rep_getprogname(void);
1005 : #endif
1006 :
1007 : #ifndef HAVE_COPY_FILE_RANGE
1008 : #define copy_file_range rep_copy_file_range
1009 : ssize_t rep_copy_file_range(int fd_in,
1010 : loff_t *off_in,
1011 : int fd_out,
1012 : loff_t *off_out,
1013 : size_t len,
1014 : unsigned int flags);
1015 : #endif /* HAVE_COPY_FILE_RANGE */
1016 :
1017 : #ifndef FALL_THROUGH
1018 : # ifdef HAVE_FALLTHROUGH_ATTRIBUTE
1019 : # define FALL_THROUGH __attribute__ ((fallthrough))
1020 : # else /* HAVE_FALLTHROUGH_ATTRIBUTE */
1021 : # define FALL_THROUGH ((void)0)
1022 : # endif /* HAVE_FALLTHROUGH_ATTRIBUTE */
1023 : #endif /* FALL_THROUGH */
1024 :
1025 : struct __rep_cwrap_enabled_state {
1026 : const char *fnname;
1027 : bool cached;
1028 : bool retval;
1029 : };
1030 :
1031 2573734 : static inline bool __rep_cwrap_enabled_fn(struct __rep_cwrap_enabled_state *state)
1032 : {
1033 2573734 : bool (*__wrapper_enabled_fn)(void) = NULL;
1034 :
1035 2573734 : if (state->cached) {
1036 0 : return state->retval;
1037 : }
1038 2573734 : state->retval = false;
1039 2573734 : state->cached = true;
1040 :
1041 2573734 : __wrapper_enabled_fn = (bool (*)(void))dlsym(RTLD_DEFAULT, state->fnname);
1042 2573734 : if (__wrapper_enabled_fn == NULL) {
1043 0 : return state->retval;
1044 : }
1045 :
1046 2573734 : state->retval = __wrapper_enabled_fn();
1047 2573734 : return state->retval;
1048 : }
1049 :
1050 510310 : static inline bool nss_wrapper_enabled(void)
1051 : {
1052 510310 : struct __rep_cwrap_enabled_state state = {
1053 : .fnname = "nss_wrapper_enabled",
1054 : };
1055 510310 : return __rep_cwrap_enabled_fn(&state);
1056 : }
1057 : static inline bool nss_wrapper_hosts_enabled(void)
1058 : {
1059 : struct __rep_cwrap_enabled_state state = {
1060 : .fnname = "nss_wrapper_hosts_enabled",
1061 : };
1062 : return __rep_cwrap_enabled_fn(&state);
1063 : }
1064 1 : static inline bool socket_wrapper_enabled(void)
1065 : {
1066 1 : struct __rep_cwrap_enabled_state state = {
1067 : .fnname = "socket_wrapper_enabled",
1068 : };
1069 1 : return __rep_cwrap_enabled_fn(&state);
1070 : }
1071 2063423 : static inline bool uid_wrapper_enabled(void)
1072 : {
1073 2063423 : struct __rep_cwrap_enabled_state state = {
1074 : .fnname = "uid_wrapper_enabled",
1075 : };
1076 2063423 : return __rep_cwrap_enabled_fn(&state);
1077 : }
1078 :
1079 5067147907 : static inline bool _hexcharval(char c, uint8_t *val)
1080 : {
1081 5067147907 : if ((c >= '0') && (c <= '9')) { *val = c - '0'; return true; }
1082 1508275070 : c &= 0xDF; /* map lower to upper case -- thanks libnfs :-) */
1083 1508275070 : if ((c >= 'A') && (c <= 'F')) { *val = c - 'A' + 10; return true; }
1084 384 : return false;
1085 : }
1086 :
1087 2533574123 : static inline bool hex_byte(const char *in, uint8_t *out)
1088 : {
1089 2533574123 : uint8_t hi=0, lo=0;
1090 2570212282 : bool ok = _hexcharval(in[0], &hi) && _hexcharval(in[1], &lo);
1091 2533574123 : *out = (hi<<4)+lo;
1092 2533574123 : return ok;
1093 : }
1094 :
1095 : /* Needed for Solaris atomic_add_XX functions. */
1096 : #if defined(HAVE_SYS_ATOMIC_H)
1097 : #include <sys/atomic.h>
1098 : #endif
1099 :
1100 : /*
1101 : * This handles the case of missing pthread support and ensures code can use
1102 : * __thread unconditionally, such that when built on a platform without pthread
1103 : * support, the __thread qualifier is an empty define.
1104 : */
1105 : #ifndef HAVE___THREAD
1106 : # ifdef HAVE_PTHREAD
1107 : # error Configure failed to detect pthread library with missing TLS support
1108 : # endif
1109 : #define HAVE___THREAD
1110 : #endif
1111 :
1112 : #endif /* _LIBREPLACE_REPLACE_H */
|