2007-10-01 23:18:26 +00:00
/*
2006-09-18 22:49:20 +00:00
Unix SMB / CIFS implementation .
macros to go along with the lib / replace / portability layer code
Copyright ( C ) Andrew Tridgell 2005
2008-11-02 17:39:41 +01:00
Copyright ( C ) Jelmer Vernooij 2006 - 2008
2007-10-01 23:18:26 +00:00
Copyright ( C ) Jeremy Allison 2007.
2006-09-18 22:49:20 +00:00
* * NOTE ! The following LGPL license applies to the replace
* * library . This does NOT imply that all of Samba is released
* * under the LGPL
2007-10-01 23:18:26 +00:00
2006-09-18 22:49:20 +00:00
This library is free software ; you can redistribute it and / or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation ; either
2007-07-10 01:44:42 +00:00
version 3 of the License , or ( at your option ) any later version .
2006-09-18 22:49:20 +00:00
This library is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
Lesser General Public License for more details .
You should have received a copy of the GNU Lesser General Public
2007-07-10 03:42:26 +00:00
License along with this library ; if not , see < http : //www.gnu.org/licenses/>.
2006-09-18 22:49:20 +00:00
*/
# ifndef _LIBREPLACE_REPLACE_H
# define _LIBREPLACE_REPLACE_H
2006-10-11 11:38:40 +00:00
# ifndef NO_CONFIG_H
2006-09-18 22:49:20 +00:00
# include "config.h"
2006-10-11 11:38:40 +00:00
# endif
2006-09-18 22:49:20 +00:00
# ifdef HAVE_STANDARDS_H
# include <standards.h>
# endif
# include <stdio.h>
# include <stdlib.h>
# include <stdarg.h>
# include <errno.h>
2014-09-16 19:44:57 +02:00
# ifndef HAVE_DECL_EWOULDBLOCK
# define EWOULDBLOCK EAGAIN
# endif
2006-09-18 22:49:20 +00:00
# if defined(_MSC_VER) || defined(__MINGW32__)
# include "win32_replace.h"
# endif
2013-04-09 23:10:16 +02:00
# ifdef HAVE_INTTYPES_H
# define __STDC_FORMAT_MACROS
# include <inttypes.h>
# elif HAVE_STDINT_H
2006-09-18 22:49:20 +00:00
# include <stdint.h>
/* force off HAVE_INTTYPES_H so that roken doesn't try to include both,
which causes a warning storm on irix */
# undef HAVE_INTTYPES_H
# endif
2012-03-24 14:43:21 +01:00
# ifdef HAVE_MALLOC_H
# include <malloc.h>
# endif
2008-10-14 04:12:53 +02:00
# ifndef __PRI64_PREFIX
2012-09-08 00:12:51 -07:00
# if __WORDSIZE == 64 && ! defined __APPLE__
2008-10-14 04:12:53 +02:00
# define __PRI64_PREFIX "l"
# else
# define __PRI64_PREFIX "ll"
# endif
# endif
/* Decimal notation. */
# ifndef PRId8
# define PRId8 "d"
# endif
# ifndef PRId16
# define PRId16 "d"
# endif
# ifndef PRId32
# define PRId32 "d"
# endif
# ifndef PRId64
# define PRId64 __PRI64_PREFIX "d"
# endif
# ifndef PRIi8
# define PRIi8 "i"
# endif
2010-08-23 15:10:07 +02:00
# ifndef PRIi16
2008-10-14 04:12:53 +02:00
# define PRIi16 "i"
# endif
2010-08-23 15:10:07 +02:00
# ifndef PRIi32
2008-10-14 04:12:53 +02:00
# define PRIi32 "i"
# endif
2010-08-23 15:10:07 +02:00
# ifndef PRIi64
2008-10-14 04:12:53 +02:00
# define PRIi64 __PRI64_PREFIX "i"
# endif
# ifndef PRIu8
# define PRIu8 "u"
# endif
# ifndef PRIu16
# define PRIu16 "u"
# endif
# ifndef PRIu32
# define PRIu32 "u"
# endif
# ifndef PRIu64
# define PRIu64 __PRI64_PREFIX "u"
# endif
2013-04-16 10:56:29 +02:00
# ifndef SCNd8
# define SCNd8 "hhd"
# endif
# ifndef SCNd16
# define SCNd16 "hd"
# endif
# ifndef SCNd32
# define SCNd32 "d"
# endif
# ifndef SCNd64
# define SCNd64 __PRI64_PREFIX "d"
# endif
# ifndef SCNi8
# define SCNi8 "hhi"
# endif
# ifndef SCNi16
# define SCNi16 "hi"
# endif
# ifndef SCNi32
# define SCNi32 "i"
# endif
# ifndef SCNi64
# define SCNi64 __PRI64_PREFIX "i"
# endif
# ifndef SCNu8
# define SCNu8 "hhu"
# endif
# ifndef SCNu16
# define SCNu16 "hu"
# endif
# ifndef SCNu32
# define SCNu32 "u"
# endif
# ifndef SCNu64
# define SCNu64 __PRI64_PREFIX "u"
# endif
2012-01-31 22:28:08 +01:00
# ifdef HAVE_BSD_STRING_H
# include <bsd/string.h>
# endif
2012-03-24 16:00:36 +01:00
# ifdef HAVE_BSD_UNISTD_H
# include <bsd/unistd.h>
# endif
2006-09-18 22:49:20 +00:00
# ifdef HAVE_STRING_H
# include <string.h>
# endif
# ifdef HAVE_STRINGS_H
# include <strings.h>
# endif
# ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
# endif
2017-01-05 09:34:36 +01:00
# ifdef HAVE_SYS_SYSMACROS_H
# include <sys/sysmacros.h>
# endif
2012-09-24 09:20:46 +02:00
# ifdef HAVE_SETPROCTITLE_H
# include <setproctitle.h>
# endif
2006-09-18 22:49:20 +00:00
# if STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
# endif
2011-02-02 10:40:06 +01:00
# ifdef HAVE_LINUX_TYPES_H
/*
* This is needed as some broken header files require this to be included early
*/
# include <linux/types.h>
# endif
2006-09-18 22:49:20 +00:00
# ifndef HAVE_STRERROR
extern char * sys_errlist [ ] ;
# define strerror(i) sys_errlist[i]
# endif
# ifndef HAVE_ERRNO_DECL
extern int errno ;
# endif
# ifndef HAVE_STRDUP
# define strdup rep_strdup
char * rep_strdup ( const char * s ) ;
# endif
# ifndef HAVE_MEMMOVE
# define memmove rep_memmove
void * rep_memmove ( void * dest , const void * src , int size ) ;
# endif
2010-01-02 10:01:11 +11:00
# ifndef HAVE_MEMMEM
# define memmem rep_memmem
void * rep_memmem ( const void * haystack , size_t haystacklen ,
const void * needle , size_t needlelen ) ;
# endif
2012-03-24 14:43:21 +01:00
# ifndef HAVE_MEMALIGN
# define memalign rep_memalign
void * rep_memalign ( size_t boundary , size_t size ) ;
# endif
2006-09-18 22:49:20 +00:00
# ifndef HAVE_MKTIME
# define mktime rep_mktime
2007-10-10 17:56:19 -07:00
/* prototype is in "system/time.h" */
2006-09-18 22:49:20 +00:00
# endif
# ifndef HAVE_TIMEGM
# define timegm rep_timegm
2007-10-10 17:56:19 -07:00
/* prototype is in "system/time.h" */
2006-09-18 22:49:20 +00:00
# endif
2008-05-07 13:10:31 +02:00
# ifndef HAVE_UTIME
# define utime rep_utime
/* prototype is in "system/time.h" */
# endif
# ifndef HAVE_UTIMES
# define utimes rep_utimes
/* prototype is in "system/time.h" */
# endif
2006-09-18 22:49:20 +00:00
# ifndef HAVE_STRLCPY
# define strlcpy rep_strlcpy
size_t rep_strlcpy ( char * d , const char * s , size_t bufsize ) ;
# endif
# ifndef HAVE_STRLCAT
# define strlcat rep_strlcat
size_t rep_strlcat ( char * d , const char * s , size_t bufsize ) ;
# endif
2016-06-09 21:27:09 +02:00
# ifndef HAVE_CLOSEFROM
# define closefrom rep_closefrom
int rep_closefrom ( int lower ) ;
# endif
2006-10-02 09:20:18 +00:00
# if (defined(BROKEN_STRNDUP) || !defined(HAVE_STRNDUP))
# undef HAVE_STRNDUP
2006-09-18 22:49:20 +00:00
# define strndup rep_strndup
char * rep_strndup ( const char * s , size_t n ) ;
# endif
2006-10-02 09:20:18 +00:00
# if (defined(BROKEN_STRNLEN) || !defined(HAVE_STRNLEN))
# undef HAVE_STRNLEN
2006-09-18 22:49:20 +00:00
# define strnlen rep_strnlen
size_t rep_strnlen ( const char * s , size_t n ) ;
# endif
2008-10-27 23:39:53 +01:00
# if !HAVE_DECL_ENVIRON
# ifdef __APPLE__
# include <crt_externs.h>
# define environ (*_NSGetEnviron())
# else
extern char * * environ ;
# endif
# endif
2006-09-18 22:49:20 +00:00
# ifndef HAVE_SETENV
# define setenv rep_setenv
2007-04-16 09:20:52 +00:00
int rep_setenv ( const char * name , const char * value , int overwrite ) ;
# else
2007-04-16 12:43:54 +00:00
# ifndef HAVE_SETENV_DECL
2007-04-16 09:20:52 +00:00
int setenv ( const char * name , const char * value , int overwrite ) ;
# endif
2006-09-18 22:49:20 +00:00
# endif
2007-04-15 20:12:09 +00:00
# ifndef HAVE_UNSETENV
# define unsetenv rep_unsetenv
2007-10-04 17:20:49 +00:00
int rep_unsetenv ( const char * name ) ;
2007-04-15 20:12:09 +00:00
# endif
2006-09-18 22:49:20 +00:00
# ifndef HAVE_SETEUID
# define seteuid rep_seteuid
int rep_seteuid ( uid_t ) ;
# endif
# ifndef HAVE_SETEGID
# define setegid rep_setegid
int rep_setegid ( gid_t ) ;
# endif
2008-11-02 17:39:41 +01:00
# if (defined(USE_SETRESUID) && !defined(HAVE_SETRESUID_DECL))
/* stupid glibc */
int setresuid ( uid_t ruid , uid_t euid , uid_t suid ) ;
# endif
# if (defined(USE_SETRESUID) && !defined(HAVE_SETRESGID_DECL))
int setresgid ( gid_t rgid , gid_t egid , gid_t sgid ) ;
# endif
2008-11-01 03:27:45 +01:00
# ifndef HAVE_CHOWN
# define chown rep_chown
int rep_chown ( const char * path , uid_t uid , gid_t gid ) ;
# endif
2008-11-01 03:46:09 +01:00
# ifndef HAVE_CHROOT
# define chroot rep_chroot
int rep_chroot ( const char * dirname ) ;
# endif
2008-11-01 03:30:47 +01:00
# ifndef HAVE_LINK
# define link rep_link
int rep_link ( const char * oldpath , const char * newpath ) ;
# endif
2008-11-01 03:33:39 +01:00
# ifndef HAVE_READLINK
# define readlink rep_readlink
2008-11-01 04:36:24 +01:00
ssize_t rep_readlink ( const char * path , char * buf , size_t bufsize ) ;
2008-11-01 03:33:39 +01:00
# endif
2008-11-01 03:35:58 +01:00
# ifndef HAVE_SYMLINK
# define symlink rep_symlink
int rep_symlink ( const char * oldpath , const char * newpath ) ;
# endif
2008-11-01 03:42:27 +01:00
# ifndef HAVE_REALPATH
# define realpath rep_realpath
char * rep_realpath ( const char * path , char * resolved_path ) ;
# endif
2008-11-01 03:39:20 +01:00
# ifndef HAVE_LCHOWN
# define lchown rep_lchown
int rep_lchown ( const char * fname , uid_t uid , gid_t gid ) ;
# endif
2008-11-01 03:35:58 +01:00
2009-07-09 09:45:28 -07:00
# ifdef HAVE_UNIX_H
# include <unix.h>
# endif
2006-09-18 22:49:20 +00:00
# ifndef HAVE_SETLINEBUF
# define setlinebuf rep_setlinebuf
void rep_setlinebuf ( FILE * ) ;
# endif
# ifndef HAVE_STRCASESTR
# define strcasestr rep_strcasestr
char * rep_strcasestr ( const char * haystack , const char * needle ) ;
# endif
2015-07-15 10:43:56 -07:00
# ifndef HAVE_STRSEP
# define strsep rep_strsep
char * rep_strsep ( char * * pps , const char * delim ) ;
# endif
2006-09-18 22:49:20 +00:00
# ifndef HAVE_STRTOK_R
2007-10-04 17:20:49 +00:00
# define strtok_r rep_strtok_r
2006-09-18 22:49:20 +00:00
char * rep_strtok_r ( char * s , const char * delim , char * * save_ptr ) ;
# endif
2010-10-21 00:13:54 +04:00
2006-09-18 22:49:20 +00:00
# ifndef HAVE_STRTOLL
# define strtoll rep_strtoll
2010-10-22 10:23:23 +04:00
long long int rep_strtoll ( const char * str , char * * endptr , int base ) ;
2010-10-21 00:13:54 +04:00
# else
# ifdef HAVE_BSD_STRTOLL
# define strtoll rep_strtoll
2010-10-22 10:23:23 +04:00
long long int rep_strtoll ( const char * str , char * * endptr , int base ) ;
2010-10-21 00:13:54 +04:00
# endif
2006-09-18 22:49:20 +00:00
# endif
# ifndef HAVE_STRTOULL
# define strtoull rep_strtoull
unsigned long long int rep_strtoull ( const char * str , char * * endptr , int base ) ;
2010-10-21 00:13:54 +04:00
# else
2010-10-22 08:44:29 +02:00
# ifdef HAVE_BSD_STRTOLL /* yes, it's not HAVE_BSD_STRTOULL */
2010-10-21 00:13:54 +04:00
# define strtoull rep_strtoull
2010-10-22 10:23:23 +04:00
unsigned long long int rep_strtoull ( const char * str , char * * endptr , int base ) ;
2010-10-21 00:13:54 +04:00
# endif
2006-09-18 22:49:20 +00:00
# endif
# ifndef HAVE_FTRUNCATE
# define ftruncate rep_ftruncate
int rep_ftruncate ( int , off_t ) ;
# endif
# ifndef HAVE_INITGROUPS
2007-04-15 20:12:09 +00:00
# define initgroups rep_initgroups
2006-09-18 22:49:20 +00:00
int rep_initgroups ( char * name , gid_t id ) ;
# endif
# if !defined(HAVE_BZERO) && defined(HAVE_MEMSET)
# define bzero(a,b) memset((a),'\0',(b))
# endif
# ifndef HAVE_DLERROR
# define dlerror rep_dlerror
char * rep_dlerror ( void ) ;
# endif
# ifndef HAVE_DLOPEN
# define dlopen rep_dlopen
2007-06-02 09:10:08 +00:00
# ifdef DLOPEN_TAKES_UNSIGNED_FLAGS
void * rep_dlopen ( const char * name , unsigned int flags ) ;
# else
2006-09-18 22:49:20 +00:00
void * rep_dlopen ( const char * name , int flags ) ;
# endif
2007-06-02 09:10:08 +00:00
# endif
2006-09-18 22:49:20 +00:00
# ifndef HAVE_DLSYM
# define dlsym rep_dlsym
void * rep_dlsym ( void * handle , const char * symbol ) ;
# endif
# ifndef HAVE_DLCLOSE
# define dlclose rep_dlclose
int rep_dlclose ( void * handle ) ;
# endif
2007-01-15 19:10:54 +00:00
# ifndef HAVE_SOCKETPAIR
# define socketpair rep_socketpair
2008-03-18 17:20:47 +01:00
/* prototype is in system/network.h */
2007-01-15 19:10:54 +00:00
# endif
2006-09-18 22:49:20 +00:00
# ifndef PRINTF_ATTRIBUTE
2016-03-23 15:26:03 +13:00
# ifdef HAVE___ATTRIBUTE__
2006-09-18 22:49:20 +00:00
/** Use gcc attribute to check printf fns. a1 is the 1-based index of
* the parameter containing the format , and a2 the index of the first
* argument . Note that some gcc 2. x versions don ' t handle this
* properly * */
# define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2)))
# else
# define PRINTF_ATTRIBUTE(a1, a2)
# endif
# endif
2007-06-02 09:10:08 +00:00
# ifndef _DEPRECATED_
2016-03-23 15:26:03 +13:00
# ifdef HAVE___ATTRIBUTE__
2007-06-02 09:10:08 +00:00
# define _DEPRECATED_ __attribute__ ((deprecated))
# else
# define _DEPRECATED_
# endif
# endif
2012-11-13 14:07:11 +01:00
# if !defined(HAVE_VDPRINTF) || !defined(HAVE_C99_VSNPRINTF)
# define vdprintf rep_vdprintf
int rep_vdprintf ( int fd , const char * format , va_list ap ) PRINTF_ATTRIBUTE ( 2 , 0 ) ;
# endif
# if !defined(HAVE_DPRINTF) || !defined(HAVE_C99_VSNPRINTF)
# define dprintf rep_dprintf
int rep_dprintf ( int fd , const char * format , . . . ) PRINTF_ATTRIBUTE ( 2 , 3 ) ;
# endif
# if !defined(HAVE_VASPRINTF) || !defined(HAVE_C99_VSNPRINTF)
2006-09-18 22:49:20 +00:00
# define vasprintf rep_vasprintf
2006-09-29 12:30:14 +00:00
int rep_vasprintf ( char * * ptr , const char * format , va_list ap ) PRINTF_ATTRIBUTE ( 2 , 0 ) ;
2006-09-18 22:49:20 +00:00
# endif
# if !defined(HAVE_SNPRINTF) || !defined(HAVE_C99_VSNPRINTF)
# define snprintf rep_snprintf
int rep_snprintf ( char * , size_t , const char * , . . . ) PRINTF_ATTRIBUTE ( 3 , 4 ) ;
# endif
# if !defined(HAVE_VSNPRINTF) || !defined(HAVE_C99_VSNPRINTF)
# define vsnprintf rep_vsnprintf
2006-09-29 12:30:14 +00:00
int rep_vsnprintf ( char * , size_t , const char * , va_list ap ) PRINTF_ATTRIBUTE ( 3 , 0 ) ;
2006-09-18 22:49:20 +00:00
# endif
2012-11-13 14:07:11 +01:00
# if !defined(HAVE_ASPRINTF) || !defined(HAVE_C99_VSNPRINTF)
2006-09-18 22:49:20 +00:00
# define asprintf rep_asprintf
int rep_asprintf ( char * * , const char * , . . . ) PRINTF_ATTRIBUTE ( 2 , 3 ) ;
2012-11-13 14:07:11 +01:00
# endif
# if !defined(HAVE_C99_VSNPRINTF)
# ifdef REPLACE_BROKEN_PRINTF
/*
* We do not redefine printf by default
* as it breaks the build if system headers
* use __attribute__ ( ( format ( printf , 3 , 0 ) ) )
* instead of __attribute__ ( ( format ( __printf__ , 3 , 0 ) ) )
*/
# define printf rep_printf
# endif
int rep_printf ( const char * , . . . ) PRINTF_ATTRIBUTE ( 1 , 2 ) ;
# endif
# if !defined(HAVE_C99_VSNPRINTF)
# define fprintf rep_fprintf
int rep_fprintf ( FILE * stream , const char * , . . . ) PRINTF_ATTRIBUTE ( 2 , 3 ) ;
2006-09-18 22:49:20 +00:00
# endif
2006-09-29 12:30:14 +00:00
# ifndef HAVE_VSYSLOG
# ifdef HAVE_SYSLOG
# define vsyslog rep_vsyslog
void rep_vsyslog ( int facility_priority , const char * format , va_list arglist ) PRINTF_ATTRIBUTE ( 2 , 0 ) ;
# endif
# endif
2006-09-18 22:49:20 +00:00
/* we used to use these fns, but now we have good replacements
for snprintf and vsnprintf */
# define slprintf snprintf
# ifndef HAVE_VA_COPY
# undef va_copy
# ifdef HAVE___VA_COPY
# define va_copy(dest, src) __va_copy(dest, src)
# else
# define va_copy(dest, src) (dest) = (src)
# endif
# endif
# ifndef HAVE_VOLATILE
# define volatile
# endif
# ifndef HAVE_COMPARISON_FN_T
typedef int ( * comparison_fn_t ) ( const void * , const void * ) ;
# endif
2012-06-11 09:11:17 +02:00
# ifndef HAVE_WORKING_STRPTIME
2007-04-15 20:12:09 +00:00
# define strptime rep_strptime
struct tm ;
char * rep_strptime ( const char * buf , const char * format , struct tm * tm ) ;
# endif
2008-11-01 03:58:14 +01:00
# ifndef HAVE_DUP2
# define dup2 rep_dup2
int rep_dup2 ( int oldfd , int newfd ) ;
# endif
2006-09-18 22:49:20 +00:00
/* Load header file for dynamic linking stuff */
# ifdef HAVE_DLFCN_H
# include <dlfcn.h>
# endif
# ifndef RTLD_LAZY
# define RTLD_LAZY 0
# endif
2007-05-24 07:15:36 +00:00
# ifndef RTLD_NOW
# define RTLD_NOW 0
# endif
# ifndef RTLD_GLOBAL
# define RTLD_GLOBAL 0
# endif
2006-09-18 22:49:20 +00:00
# ifndef HAVE_SECURE_MKSTEMP
# define mkstemp(path) rep_mkstemp(path)
int rep_mkstemp ( char * temp ) ;
# endif
# ifndef HAVE_MKDTEMP
# define mkdtemp rep_mkdtemp
char * rep_mkdtemp ( char * template ) ;
# endif
2007-06-06 09:27:43 +00:00
# ifndef HAVE_PREAD
# define pread rep_pread
ssize_t rep_pread ( int __fd , void * __buf , size_t __nbytes , off_t __offset ) ;
2009-01-22 11:52:54 +01:00
# define LIBREPLACE_PREAD_REPLACED 1
# else
# define LIBREPLACE_PREAD_NOT_REPLACED 1
2007-06-06 09:27:43 +00:00
# endif
# ifndef HAVE_PWRITE
# define pwrite rep_pwrite
ssize_t rep_pwrite ( int __fd , const void * __buf , size_t __nbytes , off_t __offset ) ;
2009-01-22 11:52:54 +01:00
# define LIBREPLACE_PWRITE_REPLACED 1
# else
# define LIBREPLACE_PWRITE_NOT_REPLACED 1
2007-06-06 09:27:43 +00:00
# endif
2007-10-01 23:18:26 +00:00
2008-03-18 12:16:47 +01:00
# if !defined(HAVE_INET_NTOA) || defined(REPLACE_INET_NTOA)
2007-10-10 12:09:06 +00:00
# define inet_ntoa rep_inet_ntoa
/* prototype is in "system/network.h" */
# endif
2007-10-01 23:18:26 +00:00
# ifndef HAVE_INET_PTON
2007-10-02 19:27:25 +00:00
# define inet_pton rep_inet_pton
2007-10-10 12:09:06 +00:00
/* prototype is in "system/network.h" */
2007-10-01 23:18:26 +00:00
# endif
# ifndef HAVE_INET_NTOP
2007-10-02 19:27:25 +00:00
# define inet_ntop rep_inet_ntop
2007-10-10 12:09:06 +00:00
/* prototype is in "system/network.h" */
2007-10-01 23:18:26 +00:00
# endif
2007-06-06 09:27:43 +00:00
2008-03-14 08:49:34 +01:00
# ifndef HAVE_INET_ATON
# define inet_aton rep_inet_aton
/* prototype is in "system/network.h" */
# endif
2008-02-26 13:24:54 +01:00
# ifndef HAVE_CONNECT
# define connect rep_connect
/* prototype is in "system/network.h" */
# endif
# ifndef HAVE_GETHOSTBYNAME
# define gethostbyname rep_gethostbyname
/* prototype is in "system/network.h" */
# endif
2007-12-17 07:45:05 +01:00
# ifndef HAVE_GETIFADDRS
# define getifaddrs rep_getifaddrs
/* prototype is in "system/network.h" */
# endif
# ifndef HAVE_FREEIFADDRS
# define freeifaddrs rep_freeifaddrs
/* prototype is in "system/network.h" */
# endif
2010-03-05 22:45:27 +11:00
# ifndef HAVE_GET_CURRENT_DIR_NAME
# define get_current_dir_name rep_get_current_dir_name
char * rep_get_current_dir_name ( void ) ;
# endif
2017-06-01 13:26:38 +12:00
# if (!defined(HAVE_STRERROR_R) || !defined(STRERROR_R_XSI_NOT_GNU))
2012-11-19 23:25:45 +11:00
# define strerror_r rep_strerror_r
2010-03-29 20:53:16 +11:00
int rep_strerror_r ( int errnum , char * buf , size_t buflen ) ;
2010-03-26 16:50:24 +11:00
# endif
2010-08-19 19:07:04 +02:00
# if !defined(HAVE_CLOCK_GETTIME)
# define clock_gettime rep_clock_gettime
# endif
2006-09-18 22:49:20 +00:00
# ifdef HAVE_LIMITS_H
# include <limits.h>
# endif
2007-09-20 09:12:18 +00:00
# ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
# endif
2006-09-18 22:49:20 +00:00
/* The extra casts work around common compiler bugs. */
# define _TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
/* The outer cast is needed to work around a bug in Cray C 5.0.3.0.
It is necessary at least when t = = time_t . */
# define _TYPE_MINIMUM(t) ((t) (_TYPE_SIGNED (t) \
? ~ ( t ) 0 < < ( sizeof ( t ) * CHAR_BIT - 1 ) : ( t ) 0 ) )
# define _TYPE_MAXIMUM(t) ((t) (~ (t) 0 - _TYPE_MINIMUM (t)))
# ifndef UINT16_MAX
# define UINT16_MAX 65535
# endif
# ifndef UINT32_MAX
# define UINT32_MAX (4294967295U)
# endif
# ifndef UINT64_MAX
# define UINT64_MAX ((uint64_t)-1)
# endif
2012-06-27 19:23:15 +02:00
# ifndef INT64_MAX
2012-07-04 10:33:58 +02:00
# define INT64_MAX 9223372036854775807LL
2012-06-27 19:23:15 +02:00
# endif
2006-09-18 22:49:20 +00:00
# ifndef CHAR_BIT
# define CHAR_BIT 8
# endif
# ifndef INT32_MAX
# define INT32_MAX _TYPE_MAXIMUM(int32_t)
# endif
# ifdef HAVE_STDBOOL_H
# include <stdbool.h>
# endif
# if !defined(HAVE_BOOL)
# ifdef HAVE__Bool
# define bool _Bool
# else
2006-09-19 03:38:35 +00:00
typedef int bool ;
# endif
# endif
2009-04-22 10:32:53 +02:00
# if !defined(HAVE_INTPTR_T)
typedef long long intptr_t ;
# endif
# if !defined(HAVE_UINTPTR_T)
typedef unsigned long long uintptr_t ;
# endif
# if !defined(HAVE_PTRDIFF_T)
typedef unsigned long long ptrdiff_t ;
# endif
2006-09-19 03:29:44 +00:00
/*
* to prevent < rpcsvc / yp_prot . h > from doing a redefine of ' bool '
*
* IRIX , HPUX , MacOS 10 and Solaris need BOOL_DEFINED
* Tru64 needs _BOOL_EXISTS
2006-09-21 08:48:18 +00:00
* AIX needs _BOOL , _TRUE , _FALSE
2006-09-19 03:29:44 +00:00
*/
2006-09-19 03:38:35 +00:00
# ifndef BOOL_DEFINED
2006-09-19 03:29:44 +00:00
# define BOOL_DEFINED
2006-09-19 03:38:35 +00:00
# endif
# ifndef _BOOL_EXISTS
2006-09-19 03:29:44 +00:00
# define _BOOL_EXISTS
2006-09-18 22:49:20 +00:00
# endif
2006-09-21 08:48:18 +00:00
# ifndef _BOOL
# define _BOOL
# endif
2006-09-19 03:38:35 +00:00
# ifndef __bool_true_false_are_defined
# define __bool_true_false_are_defined
2006-09-18 22:49:20 +00:00
# endif
# ifndef true
# define true (1)
# endif
# ifndef false
# define false (0)
# endif
2006-09-21 08:48:18 +00:00
# ifndef _TRUE
2006-09-24 02:29:12 +00:00
# define _TRUE true
2006-09-21 08:48:18 +00:00
# endif
# ifndef _FALSE
2006-09-24 02:29:12 +00:00
# define _FALSE false
2006-09-21 08:48:18 +00:00
# endif
2006-09-18 22:49:20 +00:00
# ifndef HAVE_FUNCTION_MACRO
# ifdef HAVE_func_MACRO
# define __FUNCTION__ __func__
# else
# define __FUNCTION__ ("")
# endif
# endif
# ifndef MIN
# define MIN(a,b) ((a)<(b)?(a):(b))
# endif
# ifndef MAX
# define MAX(a,b) ((a)>(b)?(a):(b))
# endif
2007-11-06 21:47:57 -08:00
# if !defined(HAVE_VOLATILE)
# define volatile
# endif
2007-09-20 09:12:18 +00:00
/**
this is a warning hack . The idea is to use this everywhere that we
get the " discarding const " warning from gcc . That doesn ' t actually
fix the problem of course , but it means that when we do get to
cleaning them up we can do it by searching the code for
discard_const .
It also means that other error types aren ' t as swamped by the noise
of hundreds of const warnings , so we are more likely to notice when
we get new errors .
Please only add more uses of this macro when you find it
_really_ hard to fix const warnings . Our aim is to eventually use
this function in only a very few places .
Also , please call this via the discard_const_p ( ) macro interface , as that
makes the return type safe .
*/
2008-04-18 00:30:50 -07:00
# define discard_const(ptr) ((void *)((uintptr_t)(ptr)))
2007-09-20 09:12:18 +00:00
/** Type-safe version of discard_const */
# define discard_const_p(type, ptr) ((type *)discard_const(ptr))
2006-09-18 22:49:20 +00:00
# ifndef __STRING
# define __STRING(x) #x
# endif
2007-09-19 14:57:20 +00:00
# ifndef __STRINGSTRING
2007-04-16 19:46:06 +00:00
# define __STRINGSTRING(x) __STRING(x)
# endif
# ifndef __LINESTR__
# define __LINESTR__ __STRINGSTRING(__LINE__)
# endif
2007-04-16 19:23:00 +00:00
# ifndef __location__
2007-04-16 19:46:06 +00:00
# define __location__ __FILE__ ":" __LINESTR__
2007-04-16 19:23:00 +00:00
# endif
2007-04-17 08:03:29 +00:00
/**
* zero a structure
*/
# define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
/**
* zero a structure given a pointer to the structure
*/
# define ZERO_STRUCTP(x) do { if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); } while(0)
/**
* zero a structure given a pointer to the structure - no zero check
*/
# define ZERO_STRUCTPN(x) memset((char *)(x), 0, sizeof(*(x)))
/* zero an array - note that sizeof(array) must work - ie. it must not be a
pointer */
# define ZERO_ARRAY(x) memset((char *)(x), 0, sizeof(x))
/**
* work out how many elements there are in a static array
*/
# define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
/**
* pointer difference macro
*/
# define PTR_DIFF(p1,p2) ((ptrdiff_t)(((const char *)(p1)) - (const char *)(p2)))
2006-09-18 22:49:20 +00:00
# if MMAP_BLACKLIST
# undef HAVE_MMAP
# endif
2007-09-20 09:12:18 +00:00
# ifdef __COMPAR_FN_T
# define QSORT_CAST (__compar_fn_t)
# endif
# ifndef QSORT_CAST
# define QSORT_CAST (int (*)(const void *, const void *))
# endif
2007-11-10 22:31:34 -08:00
# ifndef PATH_MAX
# define PATH_MAX 1024
# endif
2007-11-15 18:27:26 -08:00
# ifndef MAX_DNS_NAME_LENGTH
# define MAX_DNS_NAME_LENGTH 256 /* Actually 255 but +1 for terminating null. */
# endif
2008-10-18 17:49:41 +02:00
# ifndef HAVE_CRYPT
char * ufc_crypt ( const char * key , const char * salt ) ;
# define crypt ufc_crypt
# else
2008-10-20 10:38:03 +02:00
# ifdef HAVE_CRYPT_H
2008-10-18 17:49:41 +02:00
# include <crypt.h>
# endif
2008-10-20 10:38:03 +02:00
# endif
2008-10-18 17:49:41 +02:00
2009-09-17 09:07:17 -07:00
/* these macros gain us a few percent of speed on gcc */
# if (__GNUC__ >= 3)
/* the strange !! is to ensure that __builtin_expect() takes either 0 or 1
as its first argument */
# ifndef likely
# define likely(x) __builtin_expect(!!(x), 1)
# endif
# ifndef unlikely
# define unlikely(x) __builtin_expect(!!(x), 0)
# endif
# else
# ifndef likely
# define likely(x) (x)
# endif
# ifndef unlikely
# define unlikely(x) (x)
# endif
# endif
2010-02-13 12:57:13 +11:00
# ifndef HAVE_FDATASYNC
# define fdatasync(fd) fsync(fd)
2010-10-16 19:53:17 +11:00
# elif !defined(HAVE_DECL_FDATASYNC)
int fdatasync ( int ) ;
2010-02-13 12:57:13 +11:00
# endif
2010-04-18 12:44:58 +10:00
/* these are used to mark symbols as local to a shared lib, or
* publicly available via the shared lib API */
# ifndef _PUBLIC_
# ifdef HAVE_VISIBILITY_ATTR
# define _PUBLIC_ __attribute__((visibility("default")))
# else
# define _PUBLIC_
# endif
# endif
# ifndef _PRIVATE_
# ifdef HAVE_VISIBILITY_ATTR
# define _PRIVATE_ __attribute__((visibility("hidden")))
# else
# define _PRIVATE_
# endif
# endif
2011-02-09 19:22:25 +01:00
# ifndef HAVE_POLL
# define poll rep_poll
/* prototype is in "system/network.h" */
# endif
2012-03-24 16:00:36 +01:00
# ifndef HAVE_GETPEEREID
# define getpeereid rep_getpeereid
int rep_getpeereid ( int s , uid_t * uid , gid_t * gid ) ;
# endif
2012-03-24 21:17:56 +01:00
# ifndef HAVE_USLEEP
# define usleep rep_usleep
typedef long useconds_t ;
int usleep ( useconds_t ) ;
# endif
2012-09-24 09:20:46 +02:00
# ifndef HAVE_SETPROCTITLE
# define setproctitle rep_setproctitle
void rep_setproctitle ( const char * fmt , . . . ) PRINTF_ATTRIBUTE ( 1 , 2 ) ;
# endif
2017-09-14 09:36:21 +12:00
# ifndef HAVE_SETPROCTITLE_INIT
# define setproctitle_init rep_setproctitle_init
void rep_setproctitle_init ( int argc , char * argv [ ] , char * envp [ ] ) ;
# endif
2014-04-07 16:32:20 +02:00
bool nss_wrapper_enabled ( void ) ;
2014-04-08 10:07:14 +02:00
bool nss_wrapper_hosts_enabled ( void ) ;
2014-02-12 16:24:26 +01:00
bool socket_wrapper_enabled ( void ) ;
2014-01-17 15:23:54 +01:00
bool uid_wrapper_enabled ( void ) ;
2014-06-03 10:44:19 -07:00
/* Needed for Solaris atomic_add_XX functions. */
# if defined(HAVE_SYS_ATOMIC_H)
# include <sys/atomic.h>
# endif
2006-09-18 22:49:20 +00:00
# endif /* _LIBREPLACE_REPLACE_H */