lib/replace: define __[u]intptr_t_defined if we prove an replacement
[Samba.git] / lib / replace / replace.h
blob3304cdafa41f3487af65d4b4c1d8f9ca2118047a
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 #define __intptr_t_defined
695 #endif
697 #if !defined(HAVE_UINTPTR_T)
698 typedef unsigned long long uintptr_t ;
699 #define __uintptr_t_defined
700 #endif
702 #if !defined(HAVE_PTRDIFF_T)
703 typedef unsigned long long ptrdiff_t ;
704 #endif
707 * to prevent <rpcsvc/yp_prot.h> from doing a redefine of 'bool'
709 * IRIX, HPUX, MacOS 10 and Solaris need BOOL_DEFINED
710 * Tru64 needs _BOOL_EXISTS
711 * AIX needs _BOOL,_TRUE,_FALSE
713 #ifndef BOOL_DEFINED
714 #define BOOL_DEFINED
715 #endif
716 #ifndef _BOOL_EXISTS
717 #define _BOOL_EXISTS
718 #endif
719 #ifndef _BOOL
720 #define _BOOL
721 #endif
723 #ifndef __bool_true_false_are_defined
724 #define __bool_true_false_are_defined
725 #endif
727 #ifndef true
728 #define true (1)
729 #endif
730 #ifndef false
731 #define false (0)
732 #endif
734 #ifndef _TRUE
735 #define _TRUE true
736 #endif
737 #ifndef _FALSE
738 #define _FALSE false
739 #endif
741 #ifndef HAVE_FUNCTION_MACRO
742 #ifdef HAVE_func_MACRO
743 #define __FUNCTION__ __func__
744 #else
745 #define __FUNCTION__ ("")
746 #endif
747 #endif
750 #ifndef MIN
751 #define MIN(a,b) ((a)<(b)?(a):(b))
752 #endif
754 #ifndef MAX
755 #define MAX(a,b) ((a)>(b)?(a):(b))
756 #endif
758 #if !defined(HAVE_VOLATILE)
759 #define volatile
760 #endif
763 this is a warning hack. The idea is to use this everywhere that we
764 get the "discarding const" warning from gcc. That doesn't actually
765 fix the problem of course, but it means that when we do get to
766 cleaning them up we can do it by searching the code for
767 discard_const.
769 It also means that other error types aren't as swamped by the noise
770 of hundreds of const warnings, so we are more likely to notice when
771 we get new errors.
773 Please only add more uses of this macro when you find it
774 _really_ hard to fix const warnings. Our aim is to eventually use
775 this function in only a very few places.
777 Also, please call this via the discard_const_p() macro interface, as that
778 makes the return type safe.
780 #define discard_const(ptr) ((void *)((uintptr_t)(ptr)))
782 /** Type-safe version of discard_const */
783 #define discard_const_p(type, ptr) ((type *)discard_const(ptr))
785 #ifndef __STRING
786 #define __STRING(x) #x
787 #endif
789 #ifndef __STRINGSTRING
790 #define __STRINGSTRING(x) __STRING(x)
791 #endif
793 #ifndef __LINESTR__
794 #define __LINESTR__ __STRINGSTRING(__LINE__)
795 #endif
797 #ifndef __location__
798 #define __location__ __FILE__ ":" __LINESTR__
799 #endif
801 /**
802 * zero a structure
804 #define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
806 /**
807 * zero a structure given a pointer to the structure
809 #define ZERO_STRUCTP(x) do { if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); } while(0)
811 /**
812 * zero a structure given a pointer to the structure - no zero check
814 #define ZERO_STRUCTPN(x) memset((char *)(x), 0, sizeof(*(x)))
816 /* zero an array - note that sizeof(array) must work - ie. it must not be a
817 pointer */
818 #define ZERO_ARRAY(x) memset((char *)(x), 0, sizeof(x))
821 * work out how many elements there are in a static array
823 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
825 /**
826 * pointer difference macro
828 #define PTR_DIFF(p1,p2) ((ptrdiff_t)(((const char *)(p1)) - (const char *)(p2)))
830 #if MMAP_BLACKLIST
831 #undef HAVE_MMAP
832 #endif
834 #ifdef __COMPAR_FN_T
835 #define QSORT_CAST (__compar_fn_t)
836 #endif
838 #ifndef QSORT_CAST
839 #define QSORT_CAST (int (*)(const void *, const void *))
840 #endif
842 #ifndef PATH_MAX
843 #define PATH_MAX 1024
844 #endif
846 #ifndef MAX_DNS_NAME_LENGTH
847 #define MAX_DNS_NAME_LENGTH 256 /* Actually 255 but +1 for terminating null. */
848 #endif
850 #ifndef HAVE_CRYPT
851 char *ufc_crypt(const char *key, const char *salt);
852 #define crypt ufc_crypt
853 #else
854 #ifdef HAVE_CRYPT_H
855 #include <crypt.h>
856 #endif
857 #endif
859 /* these macros gain us a few percent of speed on gcc */
860 #if (__GNUC__ >= 3)
861 /* the strange !! is to ensure that __builtin_expect() takes either 0 or 1
862 as its first argument */
863 #ifndef likely
864 #define likely(x) __builtin_expect(!!(x), 1)
865 #endif
866 #ifndef unlikely
867 #define unlikely(x) __builtin_expect(!!(x), 0)
868 #endif
869 #else
870 #ifndef likely
871 #define likely(x) (x)
872 #endif
873 #ifndef unlikely
874 #define unlikely(x) (x)
875 #endif
876 #endif
878 #ifndef HAVE_FDATASYNC
879 #define fdatasync(fd) fsync(fd)
880 #elif !defined(HAVE_DECL_FDATASYNC)
881 int fdatasync(int );
882 #endif
884 /* these are used to mark symbols as local to a shared lib, or
885 * publicly available via the shared lib API */
886 #ifndef _PUBLIC_
887 #ifdef HAVE_VISIBILITY_ATTR
888 #define _PUBLIC_ __attribute__((visibility("default")))
889 #else
890 #define _PUBLIC_
891 #endif
892 #endif
894 #ifndef _PRIVATE_
895 #ifdef HAVE_VISIBILITY_ATTR
896 # define _PRIVATE_ __attribute__((visibility("hidden")))
897 #else
898 # define _PRIVATE_
899 #endif
900 #endif
902 #ifndef HAVE_POLL
903 #define poll rep_poll
904 /* prototype is in "system/network.h" */
905 #endif
907 #ifndef HAVE_GETPEEREID
908 #define getpeereid rep_getpeereid
909 int rep_getpeereid(int s, uid_t *uid, gid_t *gid);
910 #endif
912 #ifndef HAVE_USLEEP
913 #define usleep rep_usleep
914 typedef long useconds_t;
915 int usleep(useconds_t);
916 #endif
918 #ifndef HAVE_SETPROCTITLE
919 #define setproctitle rep_setproctitle
920 void rep_setproctitle(const char *fmt, ...) PRINTF_ATTRIBUTE(1, 2);
921 #endif
923 #ifndef HAVE_SETPROCTITLE_INIT
924 #define setproctitle_init rep_setproctitle_init
925 void rep_setproctitle_init(int argc, char *argv[], char *envp[]);
926 #endif
927 bool nss_wrapper_enabled(void);
928 bool nss_wrapper_hosts_enabled(void);
929 bool socket_wrapper_enabled(void);
930 bool uid_wrapper_enabled(void);
932 /* Needed for Solaris atomic_add_XX functions. */
933 #if defined(HAVE_SYS_ATOMIC_H)
934 #include <sys/atomic.h>
935 #endif
937 #endif /* _LIBREPLACE_REPLACE_H */