lib:replace: Add FALL_THROUGH support
[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 #endif
695
696 #if !defined(HAVE_UINTPTR_T)
697 typedef unsigned long long uintptr_t ;
698 #endif
699
700 #if !defined(HAVE_PTRDIFF_T)
701 typedef unsigned long long ptrdiff_t ;
702 #endif
703
704 /*
705  * to prevent <rpcsvc/yp_prot.h> from doing a redefine of 'bool'
706  *
707  * IRIX, HPUX, MacOS 10 and Solaris need BOOL_DEFINED
708  * Tru64 needs _BOOL_EXISTS
709  * AIX needs _BOOL,_TRUE,_FALSE
710  */
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
720
721 #ifndef __bool_true_false_are_defined
722 #define __bool_true_false_are_defined
723 #endif
724
725 #ifndef true
726 #define true (1)
727 #endif
728 #ifndef false
729 #define false (0)
730 #endif
731
732 #ifndef _TRUE
733 #define _TRUE true
734 #endif
735 #ifndef _FALSE
736 #define _FALSE false
737 #endif
738
739 #ifndef HAVE_FUNCTION_MACRO
740 #ifdef HAVE_func_MACRO
741 #define __FUNCTION__ __func__
742 #else
743 #define __FUNCTION__ ("")
744 #endif
745 #endif
746
747
748 #ifndef MIN
749 #define MIN(a,b) ((a)<(b)?(a):(b))
750 #endif
751
752 #ifndef MAX
753 #define MAX(a,b) ((a)>(b)?(a):(b))
754 #endif
755
756 #if !defined(HAVE_VOLATILE)
757 #define volatile
758 #endif
759
760 /**
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.
766
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.
770
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.
774
775   Also, please call this via the discard_const_p() macro interface, as that
776   makes the return type safe.
777 */
778 #define discard_const(ptr) ((void *)((uintptr_t)(ptr)))
779
780 /** Type-safe version of discard_const */
781 #define discard_const_p(type, ptr) ((type *)discard_const(ptr))
782
783 #ifndef __STRING
784 #define __STRING(x)    #x
785 #endif
786
787 #ifndef __STRINGSTRING
788 #define __STRINGSTRING(x) __STRING(x)
789 #endif
790
791 #ifndef __LINESTR__
792 #define __LINESTR__ __STRINGSTRING(__LINE__)
793 #endif
794
795 #ifndef __location__
796 #define __location__ __FILE__ ":" __LINESTR__
797 #endif
798
799 /** 
800  * zero a structure 
801  */
802 #define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
803
804 /** 
805  * zero a structure given a pointer to the structure 
806  */
807 #define ZERO_STRUCTP(x) do { if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); } while(0)
808
809 /** 
810  * zero a structure given a pointer to the structure - no zero check 
811  */
812 #define ZERO_STRUCTPN(x) memset((char *)(x), 0, sizeof(*(x)))
813
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))
817
818 /**
819  * work out how many elements there are in a static array 
820  */
821 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
822
823 /** 
824  * pointer difference macro 
825  */
826 #define PTR_DIFF(p1,p2) ((ptrdiff_t)(((const char *)(p1)) - (const char *)(p2)))
827
828 #if MMAP_BLACKLIST
829 #undef HAVE_MMAP
830 #endif
831
832 #ifdef __COMPAR_FN_T
833 #define QSORT_CAST (__compar_fn_t)
834 #endif
835
836 #ifndef QSORT_CAST
837 #define QSORT_CAST (int (*)(const void *, const void *))
838 #endif
839
840 #ifndef PATH_MAX
841 #define PATH_MAX 1024
842 #endif
843
844 #ifndef MAX_DNS_NAME_LENGTH
845 #define MAX_DNS_NAME_LENGTH 256 /* Actually 255 but +1 for terminating null. */
846 #endif
847
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
856
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
875
876 #ifndef HAVE_FDATASYNC
877 #define fdatasync(fd) fsync(fd)
878 #elif !defined(HAVE_DECL_FDATASYNC)
879 int fdatasync(int );
880 #endif
881
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
891
892 #ifndef _PRIVATE_
893 #ifdef HAVE_VISIBILITY_ATTR
894 #  define _PRIVATE_ __attribute__((visibility("hidden")))
895 #else
896 #  define _PRIVATE_
897 #endif
898 #endif
899
900 #ifndef HAVE_POLL
901 #define poll rep_poll
902 /* prototype is in "system/network.h" */
903 #endif
904
905 #ifndef HAVE_GETPEEREID
906 #define getpeereid rep_getpeereid
907 int rep_getpeereid(int s, uid_t *uid, gid_t *gid);
908 #endif
909
910 #ifndef HAVE_USLEEP
911 #define usleep rep_usleep
912 typedef long useconds_t;
913 int usleep(useconds_t);
914 #endif
915
916 #ifndef HAVE_SETPROCTITLE
917 #define setproctitle rep_setproctitle
918 void rep_setproctitle(const char *fmt, ...) PRINTF_ATTRIBUTE(1, 2);
919 #endif
920
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
926 #ifndef FALL_THROUGH
927 # ifdef HAVE_FALLTHROUGH_ATTRIBUTE
928 #  define FALL_THROUGH __attribute__ ((fallthrough))
929 # else /* HAVE_FALLTHROUGH_ATTRIBUTE */
930 #  define FALL_THROUGH ((void)0)
931 # endif /* HAVE_FALLTHROUGH_ATTRIBUTE */
932 #endif /* FALL_THROUGH */
933
934 bool nss_wrapper_enabled(void);
935 bool nss_wrapper_hosts_enabled(void);
936 bool socket_wrapper_enabled(void);
937 bool uid_wrapper_enabled(void);
938
939 /* Needed for Solaris atomic_add_XX functions. */
940 #if defined(HAVE_SYS_ATOMIC_H)
941 #include <sys/atomic.h>
942 #endif
943
944 #endif /* _LIBREPLACE_REPLACE_H */