winbindd: add routing_domain as parameter to add_trusted_domain
[Samba.git] / lib / replace / replace.h
blob128978c561ec815b4136e20727787a23dd434e04
1 /*
2 Unix SMB/CIFS implementation.
4 macros to go along with the lib/replace/ portability layer code
6 Copyright (C) Andrew Tridgell 2005
7 Copyright (C) Jelmer Vernooij 2006-2008
8 Copyright (C) Jeremy Allison 2007.
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
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.
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.
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/>.
28 #ifndef _LIBREPLACE_REPLACE_H
29 #define _LIBREPLACE_REPLACE_H
31 #ifndef NO_CONFIG_H
32 #include "config.h"
33 #endif
35 #ifdef HAVE_STANDARDS_H
36 #include <standards.h>
37 #endif
39 #include <stdio.h>
40 #include <stdlib.h>
41 #include <stdarg.h>
42 #include <errno.h>
44 #ifndef HAVE_DECL_EWOULDBLOCK
45 #define EWOULDBLOCK EAGAIN
46 #endif
48 #if defined(_MSC_VER) || defined(__MINGW32__)
49 #include "win32_replace.h"
50 #endif
53 #ifdef HAVE_INTTYPES_H
54 #define __STDC_FORMAT_MACROS
55 #include <inttypes.h>
56 #elif HAVE_STDINT_H
57 #include <stdint.h>
58 /* force off HAVE_INTTYPES_H so that roken doesn't try to include both,
59 which causes a warning storm on irix */
60 #undef HAVE_INTTYPES_H
61 #endif
63 #ifdef HAVE_MALLOC_H
64 #include <malloc.h>
65 #endif
67 #ifndef __PRI64_PREFIX
68 # if __WORDSIZE == 64 && ! defined __APPLE__
69 # define __PRI64_PREFIX "l"
70 # else
71 # define __PRI64_PREFIX "ll"
72 # endif
73 #endif
75 /* Decimal notation. */
76 #ifndef PRId8
77 # define PRId8 "d"
78 #endif
79 #ifndef PRId16
80 # define PRId16 "d"
81 #endif
82 #ifndef PRId32
83 # define PRId32 "d"
84 #endif
85 #ifndef PRId64
86 # define PRId64 __PRI64_PREFIX "d"
87 #endif
89 #ifndef PRIi8
90 # define PRIi8 "i"
91 #endif
92 #ifndef PRIi16
93 # define PRIi16 "i"
94 #endif
95 #ifndef PRIi32
96 # define PRIi32 "i"
97 #endif
98 #ifndef PRIi64
99 # define PRIi64 __PRI64_PREFIX "i"
100 #endif
102 #ifndef PRIu8
103 # define PRIu8 "u"
104 #endif
105 #ifndef PRIu16
106 # define PRIu16 "u"
107 #endif
108 #ifndef PRIu32
109 # define PRIu32 "u"
110 #endif
111 #ifndef PRIu64
112 # define PRIu64 __PRI64_PREFIX "u"
113 #endif
115 #ifndef SCNd8
116 # define SCNd8 "hhd"
117 #endif
118 #ifndef SCNd16
119 # define SCNd16 "hd"
120 #endif
121 #ifndef SCNd32
122 # define SCNd32 "d"
123 #endif
124 #ifndef SCNd64
125 # define SCNd64 __PRI64_PREFIX "d"
126 #endif
128 #ifndef SCNi8
129 # define SCNi8 "hhi"
130 #endif
131 #ifndef SCNi16
132 # define SCNi16 "hi"
133 #endif
134 #ifndef SCNi32
135 # define SCNi32 "i"
136 #endif
137 #ifndef SCNi64
138 # define SCNi64 __PRI64_PREFIX "i"
139 #endif
141 #ifndef SCNu8
142 # define SCNu8 "hhu"
143 #endif
144 #ifndef SCNu16
145 # define SCNu16 "hu"
146 #endif
147 #ifndef SCNu32
148 # define SCNu32 "u"
149 #endif
150 #ifndef SCNu64
151 # define SCNu64 __PRI64_PREFIX "u"
152 #endif
154 #ifdef HAVE_BSD_STRING_H
155 #include <bsd/string.h>
156 #endif
158 #ifdef HAVE_BSD_UNISTD_H
159 #include <bsd/unistd.h>
160 #endif
162 #ifdef HAVE_STRING_H
163 #include <string.h>
164 #endif
166 #ifdef HAVE_STRINGS_H
167 #include <strings.h>
168 #endif
170 #ifdef HAVE_SYS_TYPES_H
171 #include <sys/types.h>
172 #endif
174 #ifdef HAVE_SYS_SYSMACROS_H
175 #include <sys/sysmacros.h>
176 #endif
178 #ifdef HAVE_SETPROCTITLE_H
179 #include <setproctitle.h>
180 #endif
182 #if STDC_HEADERS
183 #include <stdlib.h>
184 #include <stddef.h>
185 #endif
187 #ifdef HAVE_LINUX_TYPES_H
189 * This is needed as some broken header files require this to be included early
191 #include <linux/types.h>
192 #endif
194 #ifndef HAVE_STRERROR
195 extern char *sys_errlist[];
196 #define strerror(i) sys_errlist[i]
197 #endif
199 #ifndef HAVE_ERRNO_DECL
200 extern int errno;
201 #endif
203 #ifndef HAVE_STRDUP
204 #define strdup rep_strdup
205 char *rep_strdup(const char *s);
206 #endif
208 #ifndef HAVE_MEMMOVE
209 #define memmove rep_memmove
210 void *rep_memmove(void *dest,const void *src,int size);
211 #endif
213 #ifndef HAVE_MEMMEM
214 #define memmem rep_memmem
215 void *rep_memmem(const void *haystack, size_t haystacklen,
216 const void *needle, size_t needlelen);
217 #endif
219 #ifndef HAVE_MEMALIGN
220 #define memalign rep_memalign
221 void *rep_memalign(size_t boundary, size_t size);
222 #endif
224 #ifndef HAVE_MKTIME
225 #define mktime rep_mktime
226 /* prototype is in "system/time.h" */
227 #endif
229 #ifndef HAVE_TIMEGM
230 #define timegm rep_timegm
231 /* prototype is in "system/time.h" */
232 #endif
234 #ifndef HAVE_UTIME
235 #define utime rep_utime
236 /* prototype is in "system/time.h" */
237 #endif
239 #ifndef HAVE_UTIMES
240 #define utimes rep_utimes
241 /* prototype is in "system/time.h" */
242 #endif
244 #ifndef HAVE_STRLCPY
245 #define strlcpy rep_strlcpy
246 size_t rep_strlcpy(char *d, const char *s, size_t bufsize);
247 #endif
249 #ifndef HAVE_STRLCAT
250 #define strlcat rep_strlcat
251 size_t rep_strlcat(char *d, const char *s, size_t bufsize);
252 #endif
254 #ifndef HAVE_CLOSEFROM
255 #define closefrom rep_closefrom
256 int rep_closefrom(int lower);
257 #endif
260 #if (defined(BROKEN_STRNDUP) || !defined(HAVE_STRNDUP))
261 #undef HAVE_STRNDUP
262 #define strndup rep_strndup
263 char *rep_strndup(const char *s, size_t n);
264 #endif
266 #if (defined(BROKEN_STRNLEN) || !defined(HAVE_STRNLEN))
267 #undef HAVE_STRNLEN
268 #define strnlen rep_strnlen
269 size_t rep_strnlen(const char *s, size_t n);
270 #endif
272 #if !HAVE_DECL_ENVIRON
273 #ifdef __APPLE__
274 #include <crt_externs.h>
275 #define environ (*_NSGetEnviron())
276 #else
277 extern char **environ;
278 #endif
279 #endif
281 #ifndef HAVE_SETENV
282 #define setenv rep_setenv
283 int rep_setenv(const char *name, const char *value, int overwrite);
284 #else
285 #ifndef HAVE_SETENV_DECL
286 int setenv(const char *name, const char *value, int overwrite);
287 #endif
288 #endif
290 #ifndef HAVE_UNSETENV
291 #define unsetenv rep_unsetenv
292 int rep_unsetenv(const char *name);
293 #endif
295 #ifndef HAVE_SETEUID
296 #define seteuid rep_seteuid
297 int rep_seteuid(uid_t);
298 #endif
300 #ifndef HAVE_SETEGID
301 #define setegid rep_setegid
302 int rep_setegid(gid_t);
303 #endif
305 #if (defined(USE_SETRESUID) && !defined(HAVE_SETRESUID_DECL))
306 /* stupid glibc */
307 int setresuid(uid_t ruid, uid_t euid, uid_t suid);
308 #endif
309 #if (defined(USE_SETRESUID) && !defined(HAVE_SETRESGID_DECL))
310 int setresgid(gid_t rgid, gid_t egid, gid_t sgid);
311 #endif
313 #ifndef HAVE_CHOWN
314 #define chown rep_chown
315 int rep_chown(const char *path, uid_t uid, gid_t gid);
316 #endif
318 #ifndef HAVE_CHROOT
319 #define chroot rep_chroot
320 int rep_chroot(const char *dirname);
321 #endif
323 #ifndef HAVE_LINK
324 #define link rep_link
325 int rep_link(const char *oldpath, const char *newpath);
326 #endif
328 #ifndef HAVE_READLINK
329 #define readlink rep_readlink
330 ssize_t rep_readlink(const char *path, char *buf, size_t bufsize);
331 #endif
333 #ifndef HAVE_SYMLINK
334 #define symlink rep_symlink
335 int rep_symlink(const char *oldpath, const char *newpath);
336 #endif
338 #ifndef HAVE_REALPATH
339 #define realpath rep_realpath
340 char *rep_realpath(const char *path, char *resolved_path);
341 #endif
343 #ifndef HAVE_LCHOWN
344 #define lchown rep_lchown
345 int rep_lchown(const char *fname,uid_t uid,gid_t gid);
346 #endif
348 #ifdef HAVE_UNIX_H
349 #include <unix.h>
350 #endif
352 #ifndef HAVE_SETLINEBUF
353 #define setlinebuf rep_setlinebuf
354 void rep_setlinebuf(FILE *);
355 #endif
357 #ifndef HAVE_STRCASESTR
358 #define strcasestr rep_strcasestr
359 char *rep_strcasestr(const char *haystack, const char *needle);
360 #endif
362 #ifndef HAVE_STRSEP
363 #define strsep rep_strsep
364 char *rep_strsep(char **pps, const char *delim);
365 #endif
367 #ifndef HAVE_STRTOK_R
368 #define strtok_r rep_strtok_r
369 char *rep_strtok_r(char *s, const char *delim, char **save_ptr);
370 #endif
374 #ifndef HAVE_STRTOLL
375 #define strtoll rep_strtoll
376 long long int rep_strtoll(const char *str, char **endptr, int base);
377 #else
378 #ifdef HAVE_BSD_STRTOLL
379 #define strtoll rep_strtoll
380 long long int rep_strtoll(const char *str, char **endptr, int base);
381 #endif
382 #endif
384 #ifndef HAVE_STRTOULL
385 #define strtoull rep_strtoull
386 unsigned long long int rep_strtoull(const char *str, char **endptr, int base);
387 #else
388 #ifdef HAVE_BSD_STRTOLL /* yes, it's not HAVE_BSD_STRTOULL */
389 #define strtoull rep_strtoull
390 unsigned long long int rep_strtoull(const char *str, char **endptr, int base);
391 #endif
392 #endif
394 #ifndef HAVE_FTRUNCATE
395 #define ftruncate rep_ftruncate
396 int rep_ftruncate(int,off_t);
397 #endif
399 #ifndef HAVE_INITGROUPS
400 #define initgroups rep_initgroups
401 int rep_initgroups(char *name, gid_t id);
402 #endif
404 #if !defined(HAVE_BZERO) && defined(HAVE_MEMSET)
405 #define bzero(a,b) memset((a),'\0',(b))
406 #endif
408 #ifndef HAVE_DLERROR
409 #define dlerror rep_dlerror
410 char *rep_dlerror(void);
411 #endif
413 #ifndef HAVE_DLOPEN
414 #define dlopen rep_dlopen
415 #ifdef DLOPEN_TAKES_UNSIGNED_FLAGS
416 void *rep_dlopen(const char *name, unsigned int flags);
417 #else
418 void *rep_dlopen(const char *name, int flags);
419 #endif
420 #endif
422 #ifndef HAVE_DLSYM
423 #define dlsym rep_dlsym
424 void *rep_dlsym(void *handle, const char *symbol);
425 #endif
427 #ifndef HAVE_DLCLOSE
428 #define dlclose rep_dlclose
429 int rep_dlclose(void *handle);
430 #endif
432 #ifndef HAVE_SOCKETPAIR
433 #define socketpair rep_socketpair
434 /* prototype is in system/network.h */
435 #endif
437 #ifndef PRINTF_ATTRIBUTE
438 #ifdef HAVE___ATTRIBUTE__
439 /** Use gcc attribute to check printf fns. a1 is the 1-based index of
440 * the parameter containing the format, and a2 the index of the first
441 * argument. Note that some gcc 2.x versions don't handle this
442 * properly **/
443 #define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2)))
444 #else
445 #define PRINTF_ATTRIBUTE(a1, a2)
446 #endif
447 #endif
449 #ifndef _DEPRECATED_
450 #ifdef HAVE___ATTRIBUTE__
451 #define _DEPRECATED_ __attribute__ ((deprecated))
452 #else
453 #define _DEPRECATED_
454 #endif
455 #endif
457 #if !defined(HAVE_VDPRINTF) || !defined(HAVE_C99_VSNPRINTF)
458 #define vdprintf rep_vdprintf
459 int rep_vdprintf(int fd, const char *format, va_list ap) PRINTF_ATTRIBUTE(2,0);
460 #endif
462 #if !defined(HAVE_DPRINTF) || !defined(HAVE_C99_VSNPRINTF)
463 #define dprintf rep_dprintf
464 int rep_dprintf(int fd, const char *format, ...) PRINTF_ATTRIBUTE(2,3);
465 #endif
467 #if !defined(HAVE_VASPRINTF) || !defined(HAVE_C99_VSNPRINTF)
468 #define vasprintf rep_vasprintf
469 int rep_vasprintf(char **ptr, const char *format, va_list ap) PRINTF_ATTRIBUTE(2,0);
470 #endif
472 #if !defined(HAVE_SNPRINTF) || !defined(HAVE_C99_VSNPRINTF)
473 #define snprintf rep_snprintf
474 int rep_snprintf(char *,size_t ,const char *, ...) PRINTF_ATTRIBUTE(3,4);
475 #endif
477 #if !defined(HAVE_VSNPRINTF) || !defined(HAVE_C99_VSNPRINTF)
478 #define vsnprintf rep_vsnprintf
479 int rep_vsnprintf(char *,size_t ,const char *, va_list ap) PRINTF_ATTRIBUTE(3,0);
480 #endif
482 #if !defined(HAVE_ASPRINTF) || !defined(HAVE_C99_VSNPRINTF)
483 #define asprintf rep_asprintf
484 int rep_asprintf(char **,const char *, ...) PRINTF_ATTRIBUTE(2,3);
485 #endif
487 #if !defined(HAVE_C99_VSNPRINTF)
488 #ifdef REPLACE_BROKEN_PRINTF
490 * We do not redefine printf by default
491 * as it breaks the build if system headers
492 * use __attribute__((format(printf, 3, 0)))
493 * instead of __attribute__((format(__printf__, 3, 0)))
495 #define printf rep_printf
496 #endif
497 int rep_printf(const char *, ...) PRINTF_ATTRIBUTE(1,2);
498 #endif
500 #if !defined(HAVE_C99_VSNPRINTF)
501 #define fprintf rep_fprintf
502 int rep_fprintf(FILE *stream, const char *, ...) PRINTF_ATTRIBUTE(2,3);
503 #endif
505 #ifndef HAVE_VSYSLOG
506 #ifdef HAVE_SYSLOG
507 #define vsyslog rep_vsyslog
508 void rep_vsyslog (int facility_priority, const char *format, va_list arglist) PRINTF_ATTRIBUTE(2,0);
509 #endif
510 #endif
512 /* we used to use these fns, but now we have good replacements
513 for snprintf and vsnprintf */
514 #define slprintf snprintf
517 #ifndef HAVE_VA_COPY
518 #undef va_copy
519 #ifdef HAVE___VA_COPY
520 #define va_copy(dest, src) __va_copy(dest, src)
521 #else
522 #define va_copy(dest, src) (dest) = (src)
523 #endif
524 #endif
526 #ifndef HAVE_VOLATILE
527 #define volatile
528 #endif
530 #ifndef HAVE_COMPARISON_FN_T
531 typedef int (*comparison_fn_t)(const void *, const void *);
532 #endif
534 #ifndef HAVE_WORKING_STRPTIME
535 #define strptime rep_strptime
536 struct tm;
537 char *rep_strptime(const char *buf, const char *format, struct tm *tm);
538 #endif
540 #ifndef HAVE_DUP2
541 #define dup2 rep_dup2
542 int rep_dup2(int oldfd, int newfd);
543 #endif
545 /* Load header file for dynamic linking stuff */
546 #ifdef HAVE_DLFCN_H
547 #include <dlfcn.h>
548 #endif
550 #ifndef RTLD_LAZY
551 #define RTLD_LAZY 0
552 #endif
553 #ifndef RTLD_NOW
554 #define RTLD_NOW 0
555 #endif
556 #ifndef RTLD_GLOBAL
557 #define RTLD_GLOBAL 0
558 #endif
560 #ifndef HAVE_SECURE_MKSTEMP
561 #define mkstemp(path) rep_mkstemp(path)
562 int rep_mkstemp(char *temp);
563 #endif
565 #ifndef HAVE_MKDTEMP
566 #define mkdtemp rep_mkdtemp
567 char *rep_mkdtemp(char *template);
568 #endif
570 #ifndef HAVE_PREAD
571 #define pread rep_pread
572 ssize_t rep_pread(int __fd, void *__buf, size_t __nbytes, off_t __offset);
573 #define LIBREPLACE_PREAD_REPLACED 1
574 #else
575 #define LIBREPLACE_PREAD_NOT_REPLACED 1
576 #endif
578 #ifndef HAVE_PWRITE
579 #define pwrite rep_pwrite
580 ssize_t rep_pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offset);
581 #define LIBREPLACE_PWRITE_REPLACED 1
582 #else
583 #define LIBREPLACE_PWRITE_NOT_REPLACED 1
584 #endif
586 #if !defined(HAVE_INET_NTOA) || defined(REPLACE_INET_NTOA)
587 #define inet_ntoa rep_inet_ntoa
588 /* prototype is in "system/network.h" */
589 #endif
591 #ifndef HAVE_INET_PTON
592 #define inet_pton rep_inet_pton
593 /* prototype is in "system/network.h" */
594 #endif
596 #ifndef HAVE_INET_NTOP
597 #define inet_ntop rep_inet_ntop
598 /* prototype is in "system/network.h" */
599 #endif
601 #ifndef HAVE_INET_ATON
602 #define inet_aton rep_inet_aton
603 /* prototype is in "system/network.h" */
604 #endif
606 #ifndef HAVE_CONNECT
607 #define connect rep_connect
608 /* prototype is in "system/network.h" */
609 #endif
611 #ifndef HAVE_GETHOSTBYNAME
612 #define gethostbyname rep_gethostbyname
613 /* prototype is in "system/network.h" */
614 #endif
616 #ifndef HAVE_GETIFADDRS
617 #define getifaddrs rep_getifaddrs
618 /* prototype is in "system/network.h" */
619 #endif
621 #ifndef HAVE_FREEIFADDRS
622 #define freeifaddrs rep_freeifaddrs
623 /* prototype is in "system/network.h" */
624 #endif
626 #ifndef HAVE_GET_CURRENT_DIR_NAME
627 #define get_current_dir_name rep_get_current_dir_name
628 char *rep_get_current_dir_name(void);
629 #endif
631 #if (!defined(HAVE_STRERROR_R) || !defined(STRERROR_R_XSI_NOT_GNU))
632 #define strerror_r rep_strerror_r
633 int rep_strerror_r(int errnum, char *buf, size_t buflen);
634 #endif
636 #if !defined(HAVE_CLOCK_GETTIME)
637 #define clock_gettime rep_clock_gettime
638 #endif
640 #ifdef HAVE_LIMITS_H
641 #include <limits.h>
642 #endif
644 #ifdef HAVE_SYS_PARAM_H
645 #include <sys/param.h>
646 #endif
648 /* The extra casts work around common compiler bugs. */
649 #define _TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
650 /* The outer cast is needed to work around a bug in Cray C 5.0.3.0.
651 It is necessary at least when t == time_t. */
652 #define _TYPE_MINIMUM(t) ((t) (_TYPE_SIGNED (t) \
653 ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0))
654 #define _TYPE_MAXIMUM(t) ((t) (~ (t) 0 - _TYPE_MINIMUM (t)))
656 #ifndef UINT16_MAX
657 #define UINT16_MAX 65535
658 #endif
660 #ifndef UINT32_MAX
661 #define UINT32_MAX (4294967295U)
662 #endif
664 #ifndef UINT64_MAX
665 #define UINT64_MAX ((uint64_t)-1)
666 #endif
668 #ifndef INT64_MAX
669 #define INT64_MAX 9223372036854775807LL
670 #endif
672 #ifndef CHAR_BIT
673 #define CHAR_BIT 8
674 #endif
676 #ifndef INT32_MAX
677 #define INT32_MAX _TYPE_MAXIMUM(int32_t)
678 #endif
680 #ifdef HAVE_STDBOOL_H
681 #include <stdbool.h>
682 #endif
684 #if !defined(HAVE_BOOL)
685 #ifdef HAVE__Bool
686 #define bool _Bool
687 #else
688 typedef int bool;
689 #endif
690 #endif
692 #if !defined(HAVE_INTPTR_T)
693 typedef long long intptr_t ;
694 #endif
696 #if !defined(HAVE_UINTPTR_T)
697 typedef unsigned long long uintptr_t ;
698 #endif
700 #if !defined(HAVE_PTRDIFF_T)
701 typedef unsigned long long ptrdiff_t ;
702 #endif
705 * to prevent <rpcsvc/yp_prot.h> from doing a redefine of 'bool'
707 * IRIX, HPUX, MacOS 10 and Solaris need BOOL_DEFINED
708 * Tru64 needs _BOOL_EXISTS
709 * AIX needs _BOOL,_TRUE,_FALSE
711 #ifndef BOOL_DEFINED
712 #define BOOL_DEFINED
713 #endif
714 #ifndef _BOOL_EXISTS
715 #define _BOOL_EXISTS
716 #endif
717 #ifndef _BOOL
718 #define _BOOL
719 #endif
721 #ifndef __bool_true_false_are_defined
722 #define __bool_true_false_are_defined
723 #endif
725 #ifndef true
726 #define true (1)
727 #endif
728 #ifndef false
729 #define false (0)
730 #endif
732 #ifndef _TRUE
733 #define _TRUE true
734 #endif
735 #ifndef _FALSE
736 #define _FALSE false
737 #endif
739 #ifndef HAVE_FUNCTION_MACRO
740 #ifdef HAVE_func_MACRO
741 #define __FUNCTION__ __func__
742 #else
743 #define __FUNCTION__ ("")
744 #endif
745 #endif
748 #ifndef MIN
749 #define MIN(a,b) ((a)<(b)?(a):(b))
750 #endif
752 #ifndef MAX
753 #define MAX(a,b) ((a)>(b)?(a):(b))
754 #endif
756 #if !defined(HAVE_VOLATILE)
757 #define volatile
758 #endif
761 this is a warning hack. The idea is to use this everywhere that we
762 get the "discarding const" warning from gcc. That doesn't actually
763 fix the problem of course, but it means that when we do get to
764 cleaning them up we can do it by searching the code for
765 discard_const.
767 It also means that other error types aren't as swamped by the noise
768 of hundreds of const warnings, so we are more likely to notice when
769 we get new errors.
771 Please only add more uses of this macro when you find it
772 _really_ hard to fix const warnings. Our aim is to eventually use
773 this function in only a very few places.
775 Also, please call this via the discard_const_p() macro interface, as that
776 makes the return type safe.
778 #define discard_const(ptr) ((void *)((uintptr_t)(ptr)))
780 /** Type-safe version of discard_const */
781 #define discard_const_p(type, ptr) ((type *)discard_const(ptr))
783 #ifndef __STRING
784 #define __STRING(x) #x
785 #endif
787 #ifndef __STRINGSTRING
788 #define __STRINGSTRING(x) __STRING(x)
789 #endif
791 #ifndef __LINESTR__
792 #define __LINESTR__ __STRINGSTRING(__LINE__)
793 #endif
795 #ifndef __location__
796 #define __location__ __FILE__ ":" __LINESTR__
797 #endif
799 /**
800 * zero a structure
802 #define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
804 /**
805 * zero a structure given a pointer to the structure
807 #define ZERO_STRUCTP(x) do { if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); } while(0)
809 /**
810 * zero a structure given a pointer to the structure - no zero check
812 #define ZERO_STRUCTPN(x) memset((char *)(x), 0, sizeof(*(x)))
814 /* zero an array - note that sizeof(array) must work - ie. it must not be a
815 pointer */
816 #define ZERO_ARRAY(x) memset((char *)(x), 0, sizeof(x))
819 * work out how many elements there are in a static array
821 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
823 /**
824 * pointer difference macro
826 #define PTR_DIFF(p1,p2) ((ptrdiff_t)(((const char *)(p1)) - (const char *)(p2)))
828 #if MMAP_BLACKLIST
829 #undef HAVE_MMAP
830 #endif
832 #ifdef __COMPAR_FN_T
833 #define QSORT_CAST (__compar_fn_t)
834 #endif
836 #ifndef QSORT_CAST
837 #define QSORT_CAST (int (*)(const void *, const void *))
838 #endif
840 #ifndef PATH_MAX
841 #define PATH_MAX 1024
842 #endif
844 #ifndef MAX_DNS_NAME_LENGTH
845 #define MAX_DNS_NAME_LENGTH 256 /* Actually 255 but +1 for terminating null. */
846 #endif
848 #ifndef HAVE_CRYPT
849 char *ufc_crypt(const char *key, const char *salt);
850 #define crypt ufc_crypt
851 #else
852 #ifdef HAVE_CRYPT_H
853 #include <crypt.h>
854 #endif
855 #endif
857 /* these macros gain us a few percent of speed on gcc */
858 #if (__GNUC__ >= 3)
859 /* the strange !! is to ensure that __builtin_expect() takes either 0 or 1
860 as its first argument */
861 #ifndef likely
862 #define likely(x) __builtin_expect(!!(x), 1)
863 #endif
864 #ifndef unlikely
865 #define unlikely(x) __builtin_expect(!!(x), 0)
866 #endif
867 #else
868 #ifndef likely
869 #define likely(x) (x)
870 #endif
871 #ifndef unlikely
872 #define unlikely(x) (x)
873 #endif
874 #endif
876 #ifndef HAVE_FDATASYNC
877 #define fdatasync(fd) fsync(fd)
878 #elif !defined(HAVE_DECL_FDATASYNC)
879 int fdatasync(int );
880 #endif
882 /* these are used to mark symbols as local to a shared lib, or
883 * publicly available via the shared lib API */
884 #ifndef _PUBLIC_
885 #ifdef HAVE_VISIBILITY_ATTR
886 #define _PUBLIC_ __attribute__((visibility("default")))
887 #else
888 #define _PUBLIC_
889 #endif
890 #endif
892 #ifndef _PRIVATE_
893 #ifdef HAVE_VISIBILITY_ATTR
894 # define _PRIVATE_ __attribute__((visibility("hidden")))
895 #else
896 # define _PRIVATE_
897 #endif
898 #endif
900 #ifndef HAVE_POLL
901 #define poll rep_poll
902 /* prototype is in "system/network.h" */
903 #endif
905 #ifndef HAVE_GETPEEREID
906 #define getpeereid rep_getpeereid
907 int rep_getpeereid(int s, uid_t *uid, gid_t *gid);
908 #endif
910 #ifndef HAVE_USLEEP
911 #define usleep rep_usleep
912 typedef long useconds_t;
913 int usleep(useconds_t);
914 #endif
916 #ifndef HAVE_SETPROCTITLE
917 #define setproctitle rep_setproctitle
918 void rep_setproctitle(const char *fmt, ...) PRINTF_ATTRIBUTE(1, 2);
919 #endif
921 #ifndef HAVE_SETPROCTITLE_INIT
922 #define setproctitle_init rep_setproctitle_init
923 void rep_setproctitle_init(int argc, char *argv[], char *envp[]);
924 #endif
925 bool nss_wrapper_enabled(void);
926 bool nss_wrapper_hosts_enabled(void);
927 bool socket_wrapper_enabled(void);
928 bool uid_wrapper_enabled(void);
930 /* Needed for Solaris atomic_add_XX functions. */
931 #if defined(HAVE_SYS_ATOMIC_H)
932 #include <sys/atomic.h>
933 #endif
935 #endif /* _LIBREPLACE_REPLACE_H */