lib/replace: define __[u]intptr_t_defined if we prove an replacement
[metze/samba/wip.git] / lib / replace / replace.h
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 #include <stdio.h>
40 #include <stdlib.h>
41 #include <stdarg.h>
42 #include <errno.h>
43
44 #ifndef HAVE_DECL_EWOULDBLOCK
45 #define EWOULDBLOCK EAGAIN
46 #endif
47
48 #if defined(_MSC_VER) || defined(__MINGW32__)
49 #include "win32_replace.h"
50 #endif
51
52
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
62
63 #ifdef HAVE_MALLOC_H
64 #include <malloc.h>
65 #endif
66
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
74
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
88
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
101
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
114
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
127
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
140
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
153
154 #ifdef HAVE_BSD_STRING_H
155 #include <bsd/string.h>
156 #endif
157
158 #ifdef HAVE_BSD_UNISTD_H
159 #include <bsd/unistd.h>
160 #endif
161
162 #ifdef HAVE_STRING_H
163 #include <string.h>
164 #endif
165
166 #ifdef HAVE_STRINGS_H
167 #include <strings.h>
168 #endif
169
170 #ifdef HAVE_SYS_TYPES_H
171 #include <sys/types.h>
172 #endif
173
174 #ifdef HAVE_SYS_SYSMACROS_H
175 #include <sys/sysmacros.h>
176 #endif
177
178 #ifdef HAVE_SETPROCTITLE_H
179 #include <setproctitle.h>
180 #endif
181
182 #if STDC_HEADERS
183 #include <stdlib.h>
184 #include <stddef.h>
185 #endif
186
187 #ifdef HAVE_LINUX_TYPES_H
188 /*
189  * This is needed as some broken header files require this to be included early
190  */
191 #include <linux/types.h>
192 #endif
193
194 #ifndef HAVE_STRERROR
195 extern char *sys_errlist[];
196 #define strerror(i) sys_errlist[i]
197 #endif
198
199 #ifndef HAVE_ERRNO_DECL
200 extern int errno;
201 #endif
202
203 #ifndef HAVE_STRDUP
204 #define strdup rep_strdup
205 char *rep_strdup(const char *s);
206 #endif
207
208 #ifndef HAVE_MEMMOVE
209 #define memmove rep_memmove
210 void *rep_memmove(void *dest,const void *src,int size);
211 #endif
212
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
218
219 #ifndef HAVE_MEMALIGN
220 #define memalign rep_memalign
221 void *rep_memalign(size_t boundary, size_t size);
222 #endif
223
224 #ifndef HAVE_MKTIME
225 #define mktime rep_mktime
226 /* prototype is in "system/time.h" */
227 #endif
228
229 #ifndef HAVE_TIMEGM
230 #define timegm rep_timegm
231 /* prototype is in "system/time.h" */
232 #endif
233
234 #ifndef HAVE_UTIME
235 #define utime rep_utime
236 /* prototype is in "system/time.h" */
237 #endif
238
239 #ifndef HAVE_UTIMES
240 #define utimes rep_utimes
241 /* prototype is in "system/time.h" */
242 #endif
243
244 #ifndef HAVE_STRLCPY
245 #define strlcpy rep_strlcpy
246 size_t rep_strlcpy(char *d, const char *s, size_t bufsize);
247 #endif
248
249 #ifndef HAVE_STRLCAT
250 #define strlcat rep_strlcat
251 size_t rep_strlcat(char *d, const char *s, size_t bufsize);
252 #endif
253
254 #ifndef HAVE_CLOSEFROM
255 #define closefrom rep_closefrom
256 int rep_closefrom(int lower);
257 #endif
258
259
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
265
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
271
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
280
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
289
290 #ifndef HAVE_UNSETENV
291 #define unsetenv rep_unsetenv
292 int rep_unsetenv(const char *name);
293 #endif
294
295 #ifndef HAVE_SETEUID
296 #define seteuid rep_seteuid
297 int rep_seteuid(uid_t);
298 #endif
299
300 #ifndef HAVE_SETEGID
301 #define setegid rep_setegid
302 int rep_setegid(gid_t);
303 #endif
304
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
312
313 #ifndef HAVE_CHOWN
314 #define chown rep_chown
315 int rep_chown(const char *path, uid_t uid, gid_t gid);
316 #endif
317
318 #ifndef HAVE_CHROOT
319 #define chroot rep_chroot
320 int rep_chroot(const char *dirname);
321 #endif
322
323 #ifndef HAVE_LINK
324 #define link rep_link
325 int rep_link(const char *oldpath, const char *newpath);
326 #endif
327
328 #ifndef HAVE_READLINK
329 #define readlink rep_readlink
330 ssize_t rep_readlink(const char *path, char *buf, size_t bufsize);
331 #endif
332
333 #ifndef HAVE_SYMLINK
334 #define symlink rep_symlink
335 int rep_symlink(const char *oldpath, const char *newpath);
336 #endif
337
338 #ifndef HAVE_REALPATH
339 #define realpath rep_realpath
340 char *rep_realpath(const char *path, char *resolved_path);
341 #endif
342
343 #ifndef HAVE_LCHOWN
344 #define lchown rep_lchown
345 int rep_lchown(const char *fname,uid_t uid,gid_t gid);
346 #endif
347
348 #ifdef HAVE_UNIX_H
349 #include <unix.h>
350 #endif
351
352 #ifndef HAVE_SETLINEBUF
353 #define setlinebuf rep_setlinebuf
354 void rep_setlinebuf(FILE *);
355 #endif
356
357 #ifndef HAVE_STRCASESTR
358 #define strcasestr rep_strcasestr
359 char *rep_strcasestr(const char *haystack, const char *needle);
360 #endif
361
362 #ifndef HAVE_STRSEP
363 #define strsep rep_strsep
364 char *rep_strsep(char **pps, const char *delim);
365 #endif
366
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
371
372
373
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
383
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
393
394 #ifndef HAVE_FTRUNCATE
395 #define ftruncate rep_ftruncate
396 int rep_ftruncate(int,off_t);
397 #endif
398
399 #ifndef HAVE_INITGROUPS
400 #define initgroups rep_initgroups
401 int rep_initgroups(char *name, gid_t id);
402 #endif
403
404 #if !defined(HAVE_BZERO) && defined(HAVE_MEMSET)
405 #define bzero(a,b) memset((a),'\0',(b))
406 #endif
407
408 #ifndef HAVE_DLERROR
409 #define dlerror rep_dlerror
410 char *rep_dlerror(void);
411 #endif
412
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
421
422 #ifndef HAVE_DLSYM
423 #define dlsym rep_dlsym
424 void *rep_dlsym(void *handle, const char *symbol);
425 #endif
426
427 #ifndef HAVE_DLCLOSE
428 #define dlclose rep_dlclose
429 int rep_dlclose(void *handle);
430 #endif
431
432 #ifndef HAVE_SOCKETPAIR
433 #define socketpair rep_socketpair
434 /* prototype is in system/network.h */
435 #endif
436
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
448
449 #ifndef _DEPRECATED_
450 #ifdef HAVE___ATTRIBUTE__
451 #define _DEPRECATED_ __attribute__ ((deprecated))
452 #else
453 #define _DEPRECATED_
454 #endif
455 #endif
456
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
461
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
466
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
471
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
476
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
481
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
486
487 #if !defined(HAVE_C99_VSNPRINTF)
488 #ifdef REPLACE_BROKEN_PRINTF
489 /*
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)))
494  */
495 #define printf rep_printf
496 #endif
497 int rep_printf(const char *, ...) PRINTF_ATTRIBUTE(1,2);
498 #endif
499
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
504
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
511
512 /* we used to use these fns, but now we have good replacements
513    for snprintf and vsnprintf */
514 #define slprintf snprintf
515
516
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
525
526 #ifndef HAVE_VOLATILE
527 #define volatile
528 #endif
529
530 #ifndef HAVE_COMPARISON_FN_T
531 typedef int (*comparison_fn_t)(const void *, const void *);
532 #endif
533
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
539
540 #ifndef HAVE_DUP2
541 #define dup2 rep_dup2
542 int rep_dup2(int oldfd, int newfd);
543 #endif
544
545 /* Load header file for dynamic linking stuff */
546 #ifdef HAVE_DLFCN_H
547 #include <dlfcn.h>
548 #endif
549
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
559
560 #ifndef HAVE_SECURE_MKSTEMP
561 #define mkstemp(path) rep_mkstemp(path)
562 int rep_mkstemp(char *temp);
563 #endif
564
565 #ifndef HAVE_MKDTEMP
566 #define mkdtemp rep_mkdtemp
567 char *rep_mkdtemp(char *template);
568 #endif
569
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
577
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
585
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
590
591 #ifndef HAVE_INET_PTON
592 #define inet_pton rep_inet_pton
593 /* prototype is in "system/network.h" */
594 #endif
595
596 #ifndef HAVE_INET_NTOP
597 #define inet_ntop rep_inet_ntop
598 /* prototype is in "system/network.h" */
599 #endif
600
601 #ifndef HAVE_INET_ATON
602 #define inet_aton rep_inet_aton
603 /* prototype is in "system/network.h" */
604 #endif
605
606 #ifndef HAVE_CONNECT
607 #define connect rep_connect
608 /* prototype is in "system/network.h" */
609 #endif
610
611 #ifndef HAVE_GETHOSTBYNAME
612 #define gethostbyname rep_gethostbyname
613 /* prototype is in "system/network.h" */
614 #endif
615
616 #ifndef HAVE_GETIFADDRS
617 #define getifaddrs rep_getifaddrs
618 /* prototype is in "system/network.h" */
619 #endif
620
621 #ifndef HAVE_FREEIFADDRS
622 #define freeifaddrs rep_freeifaddrs
623 /* prototype is in "system/network.h" */
624 #endif
625
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
630
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
635
636 #if !defined(HAVE_CLOCK_GETTIME)
637 #define clock_gettime rep_clock_gettime
638 #endif
639
640 #ifdef HAVE_LIMITS_H
641 #include <limits.h>
642 #endif
643
644 #ifdef HAVE_SYS_PARAM_H
645 #include <sys/param.h>
646 #endif
647
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)))
655
656 #ifndef UINT16_MAX
657 #define UINT16_MAX 65535
658 #endif
659
660 #ifndef UINT32_MAX
661 #define UINT32_MAX (4294967295U)
662 #endif
663
664 #ifndef UINT64_MAX
665 #define UINT64_MAX ((uint64_t)-1)
666 #endif
667
668 #ifndef INT64_MAX
669 #define INT64_MAX 9223372036854775807LL
670 #endif
671
672 #ifndef CHAR_BIT
673 #define CHAR_BIT 8
674 #endif
675
676 #ifndef INT32_MAX
677 #define INT32_MAX _TYPE_MAXIMUM(int32_t)
678 #endif
679
680 #ifdef HAVE_STDBOOL_H
681 #include <stdbool.h>
682 #endif
683
684 #if !defined(HAVE_BOOL)
685 #ifdef HAVE__Bool
686 #define bool _Bool
687 #else
688 typedef int bool;
689 #endif
690 #endif
691
692 #if !defined(HAVE_INTPTR_T)
693 typedef long long intptr_t ;
694 #define __intptr_t_defined
695 #endif
696
697 #if !defined(HAVE_UINTPTR_T)
698 typedef unsigned long long uintptr_t ;
699 #define __uintptr_t_defined
700 #endif
701
702 #if !defined(HAVE_PTRDIFF_T)
703 typedef unsigned long long ptrdiff_t ;
704 #endif
705
706 /*
707  * to prevent <rpcsvc/yp_prot.h> from doing a redefine of 'bool'
708  *
709  * IRIX, HPUX, MacOS 10 and Solaris need BOOL_DEFINED
710  * Tru64 needs _BOOL_EXISTS
711  * AIX needs _BOOL,_TRUE,_FALSE
712  */
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
722
723 #ifndef __bool_true_false_are_defined
724 #define __bool_true_false_are_defined
725 #endif
726
727 #ifndef true
728 #define true (1)
729 #endif
730 #ifndef false
731 #define false (0)
732 #endif
733
734 #ifndef _TRUE
735 #define _TRUE true
736 #endif
737 #ifndef _FALSE
738 #define _FALSE false
739 #endif
740
741 #ifndef HAVE_FUNCTION_MACRO
742 #ifdef HAVE_func_MACRO
743 #define __FUNCTION__ __func__
744 #else
745 #define __FUNCTION__ ("")
746 #endif
747 #endif
748
749
750 #ifndef MIN
751 #define MIN(a,b) ((a)<(b)?(a):(b))
752 #endif
753
754 #ifndef MAX
755 #define MAX(a,b) ((a)>(b)?(a):(b))
756 #endif
757
758 #if !defined(HAVE_VOLATILE)
759 #define volatile
760 #endif
761
762 /**
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.
768
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.
772
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.
776
777   Also, please call this via the discard_const_p() macro interface, as that
778   makes the return type safe.
779 */
780 #define discard_const(ptr) ((void *)((uintptr_t)(ptr)))
781
782 /** Type-safe version of discard_const */
783 #define discard_const_p(type, ptr) ((type *)discard_const(ptr))
784
785 #ifndef __STRING
786 #define __STRING(x)    #x
787 #endif
788
789 #ifndef __STRINGSTRING
790 #define __STRINGSTRING(x) __STRING(x)
791 #endif
792
793 #ifndef __LINESTR__
794 #define __LINESTR__ __STRINGSTRING(__LINE__)
795 #endif
796
797 #ifndef __location__
798 #define __location__ __FILE__ ":" __LINESTR__
799 #endif
800
801 /** 
802  * zero a structure 
803  */
804 #define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
805
806 /** 
807  * zero a structure given a pointer to the structure 
808  */
809 #define ZERO_STRUCTP(x) do { if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); } while(0)
810
811 /** 
812  * zero a structure given a pointer to the structure - no zero check 
813  */
814 #define ZERO_STRUCTPN(x) memset((char *)(x), 0, sizeof(*(x)))
815
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))
819
820 /**
821  * work out how many elements there are in a static array 
822  */
823 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
824
825 /** 
826  * pointer difference macro 
827  */
828 #define PTR_DIFF(p1,p2) ((ptrdiff_t)(((const char *)(p1)) - (const char *)(p2)))
829
830 #if MMAP_BLACKLIST
831 #undef HAVE_MMAP
832 #endif
833
834 #ifdef __COMPAR_FN_T
835 #define QSORT_CAST (__compar_fn_t)
836 #endif
837
838 #ifndef QSORT_CAST
839 #define QSORT_CAST (int (*)(const void *, const void *))
840 #endif
841
842 #ifndef PATH_MAX
843 #define PATH_MAX 1024
844 #endif
845
846 #ifndef MAX_DNS_NAME_LENGTH
847 #define MAX_DNS_NAME_LENGTH 256 /* Actually 255 but +1 for terminating null. */
848 #endif
849
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
858
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
877
878 #ifndef HAVE_FDATASYNC
879 #define fdatasync(fd) fsync(fd)
880 #elif !defined(HAVE_DECL_FDATASYNC)
881 int fdatasync(int );
882 #endif
883
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
893
894 #ifndef _PRIVATE_
895 #ifdef HAVE_VISIBILITY_ATTR
896 #  define _PRIVATE_ __attribute__((visibility("hidden")))
897 #else
898 #  define _PRIVATE_
899 #endif
900 #endif
901
902 #ifndef HAVE_POLL
903 #define poll rep_poll
904 /* prototype is in "system/network.h" */
905 #endif
906
907 #ifndef HAVE_GETPEEREID
908 #define getpeereid rep_getpeereid
909 int rep_getpeereid(int s, uid_t *uid, gid_t *gid);
910 #endif
911
912 #ifndef HAVE_USLEEP
913 #define usleep rep_usleep
914 typedef long useconds_t;
915 int usleep(useconds_t);
916 #endif
917
918 #ifndef HAVE_SETPROCTITLE
919 #define setproctitle rep_setproctitle
920 void rep_setproctitle(const char *fmt, ...) PRINTF_ATTRIBUTE(1, 2);
921 #endif
922
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
928 #ifndef FALL_THROUGH
929 # ifdef HAVE_FALLTHROUGH_ATTRIBUTE
930 #  define FALL_THROUGH __attribute__ ((fallthrough))
931 # else /* HAVE_FALLTHROUGH_ATTRIBUTE */
932 #  define FALL_THROUGH ((void)0)
933 # endif /* HAVE_FALLTHROUGH_ATTRIBUTE */
934 #endif /* FALL_THROUGH */
935
936 bool nss_wrapper_enabled(void);
937 bool nss_wrapper_hosts_enabled(void);
938 bool socket_wrapper_enabled(void);
939 bool uid_wrapper_enabled(void);
940
941 /* Needed for Solaris atomic_add_XX functions. */
942 #if defined(HAVE_SYS_ATOMIC_H)
943 #include <sys/atomic.h>
944 #endif
945
946 #endif /* _LIBREPLACE_REPLACE_H */