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