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#if defined(_MSC_VER) || defined(__MINGW32__) 45#include "win32_replace.h" 46#endif 47 48 49#ifdef HAVE_STDINT_H 50#include <stdint.h> 51/* force off HAVE_INTTYPES_H so that roken doesn't try to include both, 52 which causes a warning storm on irix */ 53#undef HAVE_INTTYPES_H 54#elif HAVE_INTTYPES_H 55#define __STDC_FORMAT_MACROS 56#include <inttypes.h> 57#endif 58 59#ifndef __PRI64_PREFIX 60# if __WORDSIZE == 64 61# define __PRI64_PREFIX "l" 62# else 63# define __PRI64_PREFIX "ll" 64# endif 65#endif 66 67/* Decimal notation. */ 68#ifndef PRId8 69# define PRId8 "d" 70#endif 71#ifndef PRId16 72# define PRId16 "d" 73#endif 74#ifndef PRId32 75# define PRId32 "d" 76#endif 77#ifndef PRId64 78# define PRId64 __PRI64_PREFIX "d" 79#endif 80 81#ifndef PRIi8 82# define PRIi8 "i" 83#endif 84#ifndef PRIi8 85# define PRIi16 "i" 86#endif 87#ifndef PRIi8 88# define PRIi32 "i" 89#endif 90#ifndef PRIi8 91# define PRIi64 __PRI64_PREFIX "i" 92#endif 93 94#ifndef PRIu8 95# define PRIu8 "u" 96#endif 97#ifndef PRIu16 98# define PRIu16 "u" 99#endif 100#ifndef PRIu32 101# define PRIu32 "u" 102#endif 103#ifndef PRIu64 104# define PRIu64 __PRI64_PREFIX "u" 105#endif 106 107#ifdef HAVE_STRING_H 108#include <string.h> 109#endif 110 111#ifdef HAVE_STRINGS_H 112#include <strings.h> 113#endif 114 115#ifdef HAVE_SYS_TYPES_H 116#include <sys/types.h> 117#endif 118 119#if STDC_HEADERS 120#include <stdlib.h> 121#include <stddef.h> 122#endif 123 124#ifndef HAVE_STRERROR 125extern char *sys_errlist[]; 126#define strerror(i) sys_errlist[i] 127#endif 128 129#ifndef HAVE_ERRNO_DECL 130extern int errno; 131#endif 132 133#ifndef HAVE_STRDUP 134#define strdup rep_strdup 135char *rep_strdup(const char *s); 136#endif 137 138#ifndef HAVE_MEMMOVE 139#define memmove rep_memmove 140void *rep_memmove(void *dest,const void *src,int size); 141#endif 142 143#ifndef HAVE_MKTIME 144#define mktime rep_mktime 145/* prototype is in "system/time.h" */ 146#endif 147 148#ifndef HAVE_TIMEGM 149#define timegm rep_timegm 150/* prototype is in "system/time.h" */ 151#endif 152 153#ifndef HAVE_UTIME 154#define utime rep_utime 155/* prototype is in "system/time.h" */ 156#endif 157 158#ifndef HAVE_UTIMES 159#define utimes rep_utimes 160/* prototype is in "system/time.h" */ 161#endif 162 163#ifndef HAVE_STRLCPY 164#define strlcpy rep_strlcpy 165size_t rep_strlcpy(char *d, const char *s, size_t bufsize); 166#endif 167 168#ifndef HAVE_STRLCAT 169#define strlcat rep_strlcat 170size_t rep_strlcat(char *d, const char *s, size_t bufsize); 171#endif 172 173#if (defined(BROKEN_STRNDUP) || !defined(HAVE_STRNDUP)) 174#undef HAVE_STRNDUP 175#define strndup rep_strndup 176char *rep_strndup(const char *s, size_t n); 177#endif 178 179#if (defined(BROKEN_STRNLEN) || !defined(HAVE_STRNLEN)) 180#undef HAVE_STRNLEN 181#define strnlen rep_strnlen 182size_t rep_strnlen(const char *s, size_t n); 183#endif 184 185#if !HAVE_DECL_ENVIRON 186#ifdef __APPLE__ 187#include <crt_externs.h> 188#define environ (*_NSGetEnviron()) 189#else 190extern char **environ; 191#endif 192#endif 193 194#ifndef HAVE_SETENV 195#define setenv rep_setenv 196int rep_setenv(const char *name, const char *value, int overwrite); 197#else 198#ifndef HAVE_SETENV_DECL 199int setenv(const char *name, const char *value, int overwrite); 200#endif 201#endif 202 203#ifndef HAVE_UNSETENV 204#define unsetenv rep_unsetenv 205int rep_unsetenv(const char *name); 206#endif 207 208#ifndef HAVE_SETEUID 209#define seteuid rep_seteuid 210int rep_seteuid(uid_t); 211#endif 212 213#ifndef HAVE_SETEGID 214#define setegid rep_setegid 215int rep_setegid(gid_t); 216#endif 217 218#if (defined(USE_SETRESUID) && !defined(HAVE_SETRESUID_DECL)) 219/* stupid glibc */ 220int setresuid(uid_t ruid, uid_t euid, uid_t suid); 221#endif 222#if (defined(USE_SETRESUID) && !defined(HAVE_SETRESGID_DECL)) 223int setresgid(gid_t rgid, gid_t egid, gid_t sgid); 224#endif 225 226#ifndef HAVE_CHOWN 227#define chown rep_chown 228int rep_chown(const char *path, uid_t uid, gid_t gid); 229#endif 230 231#ifndef HAVE_CHROOT 232#define chroot rep_chroot 233int rep_chroot(const char *dirname); 234#endif 235 236#ifndef HAVE_LINK 237#define link rep_link 238int rep_link(const char *oldpath, const char *newpath); 239#endif 240 241#ifndef HAVE_READLINK 242#define readlink rep_readlink 243ssize_t rep_readlink(const char *path, char *buf, size_t bufsize); 244#endif 245 246#ifndef HAVE_SYMLINK 247#define symlink rep_symlink 248int rep_symlink(const char *oldpath, const char *newpath); 249#endif 250 251#ifndef HAVE_REALPATH 252#define realpath rep_realpath 253char *rep_realpath(const char *path, char *resolved_path); 254#endif 255 256#ifndef HAVE_LCHOWN 257#define lchown rep_lchown 258int rep_lchown(const char *fname,uid_t uid,gid_t gid); 259#endif 260 261#ifdef HAVE_UNIX_H 262#include <unix.h> 263#endif 264 265#ifndef HAVE_SETLINEBUF 266#define setlinebuf rep_setlinebuf 267void rep_setlinebuf(FILE *); 268#endif 269 270#ifndef HAVE_STRCASESTR 271#define strcasestr rep_strcasestr 272char *rep_strcasestr(const char *haystack, const char *needle); 273#endif 274 275#ifndef HAVE_STRTOK_R 276#define strtok_r rep_strtok_r 277char *rep_strtok_r(char *s, const char *delim, char **save_ptr); 278#endif 279 280#ifndef HAVE_STRTOLL 281#define strtoll rep_strtoll 282long long int rep_strtoll(const char *str, char **endptr, int base); 283#endif 284 285#ifndef HAVE_STRTOULL 286#define strtoull rep_strtoull 287unsigned long long int rep_strtoull(const char *str, char **endptr, int base); 288#endif 289 290#ifndef HAVE_FTRUNCATE 291#define ftruncate rep_ftruncate 292int rep_ftruncate(int,off_t); 293#endif 294 295#ifndef HAVE_INITGROUPS 296#define initgroups rep_initgroups 297int rep_initgroups(char *name, gid_t id); 298#endif 299 300#if !defined(HAVE_BZERO) && defined(HAVE_MEMSET) 301#define bzero(a,b) memset((a),'\0',(b)) 302#endif 303 304#ifndef HAVE_DLERROR 305#define dlerror rep_dlerror 306char *rep_dlerror(void); 307#endif 308 309#ifndef HAVE_DLOPEN 310#define dlopen rep_dlopen 311#ifdef DLOPEN_TAKES_UNSIGNED_FLAGS 312void *rep_dlopen(const char *name, unsigned int flags); 313#else 314void *rep_dlopen(const char *name, int flags); 315#endif 316#endif 317 318#ifndef HAVE_DLSYM 319#define dlsym rep_dlsym 320void *rep_dlsym(void *handle, const char *symbol); 321#endif 322 323#ifndef HAVE_DLCLOSE 324#define dlclose rep_dlclose 325int rep_dlclose(void *handle); 326#endif 327 328#ifndef HAVE_SOCKETPAIR 329#define socketpair rep_socketpair 330/* prototype is in system/network.h */ 331#endif 332 333#ifndef PRINTF_ATTRIBUTE 334#if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1 ) 335/** Use gcc attribute to check printf fns. a1 is the 1-based index of 336 * the parameter containing the format, and a2 the index of the first 337 * argument. Note that some gcc 2.x versions don't handle this 338 * properly **/ 339#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2))) 340#else 341#define PRINTF_ATTRIBUTE(a1, a2) 342#endif 343#endif 344 345#ifndef _DEPRECATED_ 346#if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1 ) 347#define _DEPRECATED_ __attribute__ ((deprecated)) 348#else 349#define _DEPRECATED_ 350#endif 351#endif 352 353#ifndef HAVE_VASPRINTF 354#define vasprintf rep_vasprintf 355int rep_vasprintf(char **ptr, const char *format, va_list ap) PRINTF_ATTRIBUTE(2,0); 356#endif 357 358#if !defined(HAVE_SNPRINTF) || !defined(HAVE_C99_VSNPRINTF) 359#define snprintf rep_snprintf 360int rep_snprintf(char *,size_t ,const char *, ...) PRINTF_ATTRIBUTE(3,4); 361#endif 362 363#if !defined(HAVE_VSNPRINTF) || !defined(HAVE_C99_VSNPRINTF) 364#define vsnprintf rep_vsnprintf 365int rep_vsnprintf(char *,size_t ,const char *, va_list ap) PRINTF_ATTRIBUTE(3,0); 366#endif 367 368#ifndef HAVE_ASPRINTF 369#define asprintf rep_asprintf 370int rep_asprintf(char **,const char *, ...) PRINTF_ATTRIBUTE(2,3); 371#endif 372 373#ifndef HAVE_VSYSLOG 374#ifdef HAVE_SYSLOG 375#define vsyslog rep_vsyslog 376void rep_vsyslog (int facility_priority, const char *format, va_list arglist) PRINTF_ATTRIBUTE(2,0); 377#endif 378#endif 379 380/* we used to use these fns, but now we have good replacements 381 for snprintf and vsnprintf */ 382#define slprintf snprintf 383 384 385#ifndef HAVE_VA_COPY 386#undef va_copy 387#ifdef HAVE___VA_COPY 388#define va_copy(dest, src) __va_copy(dest, src) 389#else 390#define va_copy(dest, src) (dest) = (src) 391#endif 392#endif 393 394#ifndef HAVE_VOLATILE 395#define volatile 396#endif 397 398#ifndef HAVE_COMPARISON_FN_T 399typedef int (*comparison_fn_t)(const void *, const void *); 400#endif 401 402#ifdef REPLACE_STRPTIME 403#define strptime rep_strptime 404struct tm; 405char *rep_strptime(const char *buf, const char *format, struct tm *tm); 406#endif 407 408#ifndef HAVE_DUP2 409#define dup2 rep_dup2 410int rep_dup2(int oldfd, int newfd); 411#endif 412 413/* Load header file for dynamic linking stuff */ 414#ifdef HAVE_DLFCN_H 415#include <dlfcn.h> 416#endif 417 418#ifndef RTLD_LAZY 419#define RTLD_LAZY 0 420#endif 421#ifndef RTLD_NOW 422#define RTLD_NOW 0 423#endif 424#ifndef RTLD_GLOBAL 425#define RTLD_GLOBAL 0 426#endif 427 428#ifndef HAVE_SECURE_MKSTEMP 429#define mkstemp(path) rep_mkstemp(path) 430int rep_mkstemp(char *temp); 431#endif 432 433#ifndef HAVE_MKDTEMP 434#define mkdtemp rep_mkdtemp 435char *rep_mkdtemp(char *template); 436#endif 437 438#ifndef HAVE_PREAD 439#define pread rep_pread 440ssize_t rep_pread(int __fd, void *__buf, size_t __nbytes, off_t __offset); 441#define LIBREPLACE_PREAD_REPLACED 1 442#else 443#define LIBREPLACE_PREAD_NOT_REPLACED 1 444#endif 445 446#ifndef HAVE_PWRITE 447#define pwrite rep_pwrite 448ssize_t rep_pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offset); 449#define LIBREPLACE_PWRITE_REPLACED 1 450#else 451#define LIBREPLACE_PWRITE_NOT_REPLACED 1 452#endif 453 454#if !defined(HAVE_INET_NTOA) || defined(REPLACE_INET_NTOA) 455#define inet_ntoa rep_inet_ntoa 456/* prototype is in "system/network.h" */ 457#endif 458 459#ifndef HAVE_INET_PTON 460#define inet_pton rep_inet_pton 461/* prototype is in "system/network.h" */ 462#endif 463 464#ifndef HAVE_INET_NTOP 465#define inet_ntop rep_inet_ntop 466/* prototype is in "system/network.h" */ 467#endif 468 469#ifndef HAVE_INET_ATON 470#define inet_aton rep_inet_aton 471/* prototype is in "system/network.h" */ 472#endif 473 474#ifndef HAVE_CONNECT 475#define connect rep_connect 476/* prototype is in "system/network.h" */ 477#endif 478 479#ifndef HAVE_GETHOSTBYNAME 480#define gethostbyname rep_gethostbyname 481/* prototype is in "system/network.h" */ 482#endif 483 484#ifndef HAVE_GETIFADDRS 485#define getifaddrs rep_getifaddrs 486/* prototype is in "system/network.h" */ 487#endif 488 489#ifndef HAVE_FREEIFADDRS 490#define freeifaddrs rep_freeifaddrs 491/* prototype is in "system/network.h" */ 492#endif 493 494#ifdef HAVE_LIMITS_H 495#include <limits.h> 496#endif 497 498#ifdef HAVE_SYS_PARAM_H 499#include <sys/param.h> 500#endif 501 502/* The extra casts work around common compiler bugs. */ 503#define _TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) 504/* The outer cast is needed to work around a bug in Cray C 5.0.3.0. 505 It is necessary at least when t == time_t. */ 506#define _TYPE_MINIMUM(t) ((t) (_TYPE_SIGNED (t) \ 507 ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0)) 508#define _TYPE_MAXIMUM(t) ((t) (~ (t) 0 - _TYPE_MINIMUM (t))) 509 510#ifndef UINT16_MAX 511#define UINT16_MAX 65535 512#endif 513 514#ifndef UINT32_MAX 515#define UINT32_MAX (4294967295U) 516#endif 517 518#ifndef UINT64_MAX 519#define UINT64_MAX ((uint64_t)-1) 520#endif 521 522#ifndef CHAR_BIT 523#define CHAR_BIT 8 524#endif 525 526#ifndef INT32_MAX 527#define INT32_MAX _TYPE_MAXIMUM(int32_t) 528#endif 529 530#ifdef HAVE_STDBOOL_H 531#include <stdbool.h> 532#endif 533 534#if !defined(HAVE_BOOL) 535#ifdef HAVE__Bool 536#define bool _Bool 537#else 538typedef int bool; 539#endif 540#endif 541 542#if !defined(HAVE_INTPTR_T) 543typedef long long intptr_t ; 544#endif 545 546#if !defined(HAVE_UINTPTR_T) 547typedef unsigned long long uintptr_t ; 548#endif 549 550#if !defined(HAVE_PTRDIFF_T) 551typedef unsigned long long ptrdiff_t ; 552#endif 553 554/* 555 * to prevent <rpcsvc/yp_prot.h> from doing a redefine of 'bool' 556 * 557 * IRIX, HPUX, MacOS 10 and Solaris need BOOL_DEFINED 558 * Tru64 needs _BOOL_EXISTS 559 * AIX needs _BOOL,_TRUE,_FALSE 560 */ 561#ifndef BOOL_DEFINED 562#define BOOL_DEFINED 563#endif 564#ifndef _BOOL_EXISTS 565#define _BOOL_EXISTS 566#endif 567#ifndef _BOOL 568#define _BOOL 569#endif 570 571#ifndef __bool_true_false_are_defined 572#define __bool_true_false_are_defined 573#endif 574 575#ifndef true 576#define true (1) 577#endif 578#ifndef false 579#define false (0) 580#endif 581 582#ifndef _TRUE 583#define _TRUE true 584#endif 585#ifndef _FALSE 586#define _FALSE false 587#endif 588 589#ifndef HAVE_FUNCTION_MACRO 590#ifdef HAVE_func_MACRO 591#define __FUNCTION__ __func__ 592#else 593#define __FUNCTION__ ("") 594#endif 595#endif 596 597 598#ifndef MIN 599#define MIN(a,b) ((a)<(b)?(a):(b)) 600#endif 601 602#ifndef MAX 603#define MAX(a,b) ((a)>(b)?(a):(b)) 604#endif 605 606#if !defined(HAVE_VOLATILE) 607#define volatile 608#endif 609 610/** 611 this is a warning hack. The idea is to use this everywhere that we 612 get the "discarding const" warning from gcc. That doesn't actually 613 fix the problem of course, but it means that when we do get to 614 cleaning them up we can do it by searching the code for 615 discard_const. 616 617 It also means that other error types aren't as swamped by the noise 618 of hundreds of const warnings, so we are more likely to notice when 619 we get new errors. 620 621 Please only add more uses of this macro when you find it 622 _really_ hard to fix const warnings. Our aim is to eventually use 623 this function in only a very few places. 624 625 Also, please call this via the discard_const_p() macro interface, as that 626 makes the return type safe. 627*/ 628#define discard_const(ptr) ((void *)((uintptr_t)(ptr))) 629 630/** Type-safe version of discard_const */ 631#define discard_const_p(type, ptr) ((type *)discard_const(ptr)) 632 633#ifndef __STRING 634#define __STRING(x) #x 635#endif 636 637#ifndef __STRINGSTRING 638#define __STRINGSTRING(x) __STRING(x) 639#endif 640 641#ifndef __LINESTR__ 642#define __LINESTR__ __STRINGSTRING(__LINE__) 643#endif 644 645#ifndef __location__ 646#define __location__ __FILE__ ":" __LINESTR__ 647#endif 648 649/** 650 * zero a structure 651 */ 652#define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x)) 653 654/** 655 * zero a structure given a pointer to the structure 656 */ 657#define ZERO_STRUCTP(x) do { if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); } while(0) 658 659/** 660 * zero a structure given a pointer to the structure - no zero check 661 */ 662#define ZERO_STRUCTPN(x) memset((char *)(x), 0, sizeof(*(x))) 663 664/* zero an array - note that sizeof(array) must work - ie. it must not be a 665 pointer */ 666#define ZERO_ARRAY(x) memset((char *)(x), 0, sizeof(x)) 667 668/** 669 * work out how many elements there are in a static array 670 */ 671#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) 672 673/** 674 * pointer difference macro 675 */ 676#define PTR_DIFF(p1,p2) ((ptrdiff_t)(((const char *)(p1)) - (const char *)(p2))) 677 678#if MMAP_BLACKLIST 679#undef HAVE_MMAP 680#endif 681 682#ifdef __COMPAR_FN_T 683#define QSORT_CAST (__compar_fn_t) 684#endif 685 686#ifndef QSORT_CAST 687#define QSORT_CAST (int (*)(const void *, const void *)) 688#endif 689 690#ifndef PATH_MAX 691#define PATH_MAX 1024 692#endif 693 694#ifndef MAX_DNS_NAME_LENGTH 695#define MAX_DNS_NAME_LENGTH 256 /* Actually 255 but +1 for terminating null. */ 696#endif 697 698#ifndef HAVE_CRYPT 699char *ufc_crypt(const char *key, const char *salt); 700#define crypt ufc_crypt 701#else 702#ifdef HAVE_CRYPT_H 703#include <crypt.h> 704#endif 705#endif 706 707/* these macros gain us a few percent of speed on gcc */ 708#if (__GNUC__ >= 3) 709/* the strange !! is to ensure that __builtin_expect() takes either 0 or 1 710 as its first argument */ 711#ifndef likely 712#define likely(x) __builtin_expect(!!(x), 1) 713#endif 714#ifndef unlikely 715#define unlikely(x) __builtin_expect(!!(x), 0) 716#endif 717#else 718#ifndef likely 719#define likely(x) (x) 720#endif 721#ifndef unlikely 722#define unlikely(x) (x) 723#endif 724#endif 725 726#endif /* _LIBREPLACE_REPLACE_H */ 727