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