2005-06-07 07:22:25 +00:00
/*
Unix SMB / CIFS implementation .
macros to go along with the lib / replace / portability layer code
Copyright ( C ) Andrew Tridgell 2005
2006-09-04 12:21:42 +00:00
Copyright ( C ) Jelmer Vernooij 2006
* * NOTE ! The following LGPL license applies to the replace
* * library . This does NOT imply that all of Samba is released
* * under the LGPL
2005-06-07 07:22:25 +00:00
2006-09-04 12:21:42 +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
version 2 of the License , or ( at your option ) any later version .
This library is distributed in the hope that it will be useful ,
2005-06-07 07:22:25 +00:00
but WITHOUT ANY WARRANTY ; without even the implied warranty of
2006-09-04 12:21:42 +00:00
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
License along with this library ; if not , write to the Free Software
Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
2005-06-07 07:22:25 +00:00
*/
2006-09-12 07:05:41 +00:00
# ifndef _LIBREPLACE_REPLACE_H
# define _LIBREPLACE_REPLACE_H
2005-06-07 07:22:25 +00:00
2006-10-11 11:52:49 +00:00
# ifndef NO_CONFIG_H
2006-09-04 12:21:42 +00:00
# include "config.h"
2006-10-11 11:52:49 +00:00
# endif
2006-09-06 04:44:32 +00:00
2006-09-11 14:08:51 +00:00
# ifdef HAVE_STANDARDS_H
# include <standards.h>
# endif
2006-09-06 04:44:32 +00:00
# include <stdio.h>
2006-09-04 12:21:42 +00:00
# include <stdlib.h>
# include <stdarg.h>
2006-09-06 04:44:32 +00:00
# include <errno.h>
2006-09-04 12:21:42 +00:00
2005-09-23 00:38:22 +00:00
# if defined(_MSC_VER) || defined(__MINGW32__)
2006-09-13 10:13:01 +00:00
# include "win32_replace.h"
2005-09-23 00:38:22 +00:00
# endif
2005-06-07 07:22:25 +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
2006-03-31 23:28:18 +00:00
# ifdef HAVE_STDINT_H
# include <stdint.h>
2006-09-12 18:45:05 +00:00
/* 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
2006-09-05 07:58:26 +00:00
# elif HAVE_INTTYPES_H
2006-03-31 23:28:18 +00:00
# include <inttypes.h>
# endif
2006-09-06 04:44:32 +00:00
# ifdef HAVE_STRING_H
# include <string.h>
# endif
# ifdef HAVE_STRINGS_H
# include <strings.h>
# endif
2006-09-09 01:49:38 +00:00
# ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
# endif
2006-09-13 13:50:51 +00:00
# if STDC_HEADERS
# include <stdlib.h>
2006-09-09 01:49:38 +00:00
# include <stddef.h>
# endif
2007-04-15 21:13:13 +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 .
*/
# define discard_const(ptr) ((void *)((intptr_t)(ptr)))
/** Type-safe version of discard_const */
# define discard_const_p(type, ptr) ((type *)discard_const(ptr))
2005-09-23 00:38:22 +00:00
# ifndef HAVE_STRERROR
extern char * sys_errlist [ ] ;
# define strerror(i) sys_errlist[i]
# endif
# ifndef HAVE_ERRNO_DECL
extern int errno ;
# endif
2005-06-07 07:22:25 +00:00
# ifndef HAVE_STRDUP
2006-09-04 12:21:42 +00:00
# define strdup rep_strdup
char * rep_strdup ( const char * s ) ;
2005-06-07 07:22:25 +00:00
# endif
# ifndef HAVE_MEMMOVE
2006-09-04 12:21:42 +00:00
# define memmove rep_memmove
void * rep_memmove ( void * dest , const void * src , int size ) ;
2005-06-07 07:22:25 +00:00
# endif
2006-09-04 13:07:29 +00:00
# if !defined(HAVE_MKTIME) || !defined(HAVE_TIMEGM)
2006-09-06 04:44:32 +00:00
# include "system/time.h"
2006-09-04 13:07:29 +00:00
# endif
2005-06-07 07:22:25 +00:00
# ifndef HAVE_MKTIME
2006-09-04 12:21:42 +00:00
# define mktime rep_mktime
time_t rep_mktime ( struct tm * t ) ;
2005-06-07 07:22:25 +00:00
# endif
2006-09-04 13:07:29 +00:00
# ifndef HAVE_TIMEGM
struct tm ;
# define timegm rep_timegm
time_t rep_timegm ( struct tm * tm ) ;
# endif
2005-06-07 07:22:25 +00:00
# ifndef HAVE_STRLCPY
2006-09-04 12:21:42 +00:00
# define strlcpy rep_strlcpy
size_t rep_strlcpy ( char * d , const char * s , size_t bufsize ) ;
2005-06-07 07:22:25 +00:00
# endif
# ifndef HAVE_STRLCAT
2006-09-04 12:21:42 +00:00
# define strlcat rep_strlcat
size_t rep_strlcat ( char * d , const char * s , size_t bufsize ) ;
2005-06-07 07:22:25 +00:00
# endif
2006-09-28 06:43:27 +00:00
# if (defined(BROKEN_STRNDUP) || !defined(HAVE_STRNDUP))
# undef HAVE_STRNDUP
2006-09-04 12:21:42 +00:00
# define strndup rep_strndup
char * rep_strndup ( const char * s , size_t n ) ;
2005-06-07 07:22:25 +00:00
# endif
2006-09-28 06:43:27 +00:00
# if (defined(BROKEN_STRNLEN) || !defined(HAVE_STRNLEN))
# undef HAVE_STRNLEN
2006-09-04 12:21:42 +00:00
# define strnlen rep_strnlen
size_t rep_strnlen ( const char * s , size_t n ) ;
2005-06-07 07:22:25 +00:00
# endif
# ifndef HAVE_SETENV
2006-09-04 12:21:42 +00:00
# define setenv rep_setenv
2007-04-16 09:19:35 +00:00
int rep_setenv ( const char * name , const char * value , int overwrite ) ;
# else
2007-04-16 12:43:18 +00:00
# ifndef HAVE_SETENV_DECL
2007-04-16 09:19:35 +00:00
int setenv ( const char * name , const char * value , int overwrite ) ;
# endif
2005-06-07 07:22:25 +00:00
# endif
2007-03-12 09:59:06 +00:00
# ifndef HAVE_UNSETENV
# define unsetenv rep_unsetenv
2007-03-12 10:12:27 +00:00
int rep_unsetenv ( const char * name ) ;
2007-03-12 09:59:06 +00:00
# endif
2006-09-07 07:23:58 +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
2006-09-07 07:26:02 +00:00
# ifndef HAVE_SETLINEBUF
# define setlinebuf rep_setlinebuf
2006-09-10 14:19:38 +00:00
void rep_setlinebuf ( FILE * ) ;
2006-09-07 07:26:02 +00:00
# endif
2005-10-11 12:30:34 +00:00
# ifndef HAVE_STRCASESTR
2006-09-04 12:21:42 +00:00
# define strcasestr rep_strcasestr
char * rep_strcasestr ( const char * haystack , const char * needle ) ;
2005-10-11 12:30:34 +00:00
# endif
2006-05-25 13:23:24 +00:00
# ifndef HAVE_STRTOK_R
2006-09-04 12:21:42 +00:00
# define strtok_r rep_strtok_r
char * rep_strtok_r ( char * s , const char * delim , char * * save_ptr ) ;
# endif
# ifndef HAVE_STRTOLL
# define strtoll rep_strtoll
long long int rep_strtoll ( const char * str , char * * endptr , int base ) ;
# endif
# ifndef HAVE_STRTOULL
# define strtoull rep_strtoull
unsigned long long int rep_strtoull ( const char * str , char * * endptr , int base ) ;
2006-05-25 13:23:24 +00:00
# endif
2005-09-30 23:10:20 +00:00
# ifndef HAVE_FTRUNCATE
2006-09-04 12:21:42 +00:00
# define ftruncate rep_ftruncate
2006-09-06 11:31:59 +00:00
int rep_ftruncate ( int , off_t ) ;
# endif
# ifndef HAVE_INITGROUPS
2007-01-23 19:52:17 +00:00
# define initgroups rep_initgroups
2006-09-06 11:31:59 +00:00
int rep_initgroups ( char * name , gid_t id ) ;
2005-09-30 23:10:20 +00:00
# endif
2005-06-07 07:22:25 +00:00
# if !defined(HAVE_BZERO) && defined(HAVE_MEMSET)
# define bzero(a,b) memset((a),'\0',(b))
# endif
2006-09-06 11:31:59 +00:00
# ifndef HAVE_DLERROR
# define dlerror rep_dlerror
char * rep_dlerror ( void ) ;
# endif
# ifndef HAVE_DLOPEN
# define dlopen rep_dlopen
void * rep_dlopen ( const char * name , int flags ) ;
# endif
# 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
2006-10-18 16:08:22 +00:00
# ifndef HAVE_SOCKETPAIR
# define socketpair rep_socketpair
int rep_socketpair ( int d , int type , int protocol , int sv [ 2 ] ) ;
# endif
2006-05-30 05:57:43 +00:00
2006-01-10 07:08:27 +00:00
# ifndef PRINTF_ATTRIBUTE
2006-09-19 03:48:31 +00:00
# if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1 )
2006-01-10 07:08:27 +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
2006-09-06 00:06:00 +00:00
# ifndef HAVE_VASPRINTF
# define vasprintf rep_vasprintf
2006-09-29 12:38:51 +00:00
int rep_vasprintf ( char * * ptr , const char * format , va_list ap ) PRINTF_ATTRIBUTE ( 2 , 0 ) ;
2006-09-06 00:06:00 +00:00
# endif
2006-09-14 11:55:49 +00:00
# if !defined(HAVE_SNPRINTF) || !defined(HAVE_C99_VSNPRINTF)
2006-09-04 12:21:42 +00:00
# define snprintf rep_snprintf
int rep_snprintf ( char * , size_t , const char * , . . . ) PRINTF_ATTRIBUTE ( 3 , 4 ) ;
2005-06-07 07:22:25 +00:00
# endif
2006-09-06 00:06:00 +00:00
2006-09-14 11:55:49 +00:00
# if !defined(HAVE_VSNPRINTF) || !defined(HAVE_C99_VSNPRINTF)
2006-09-06 00:06:00 +00:00
# define vsnprintf rep_vsnprintf
2006-09-29 12:38:51 +00:00
int rep_vsnprintf ( char * , size_t , const char * , va_list ap ) PRINTF_ATTRIBUTE ( 3 , 0 ) ;
2006-09-06 00:06:00 +00:00
# endif
# ifndef HAVE_ASPRINTF
2006-09-04 12:21:42 +00:00
# define asprintf rep_asprintf
int rep_asprintf ( char * * , const char * , . . . ) PRINTF_ATTRIBUTE ( 2 , 3 ) ;
2005-06-07 07:22:25 +00:00
# endif
2006-09-29 12:38:51 +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
2005-06-07 07:22:25 +00:00
/* we used to use these fns, but now we have good replacements
for snprintf and vsnprintf */
# define slprintf snprintf
2006-04-08 16:05:21 +00:00
# ifndef HAVE_VA_COPY
2006-09-06 11:31:59 +00:00
# undef va_copy
2006-04-08 16:05:21 +00:00
# ifdef HAVE___VA_COPY
# define va_copy(dest, src) __va_copy(dest, src)
2005-06-07 07:22:25 +00:00
# else
2006-04-08 16:05:21 +00:00
# define va_copy(dest, src) (dest) = (src)
# endif
2005-06-07 07:22:25 +00:00
# endif
2006-04-08 16:05:21 +00:00
# ifndef HAVE_VOLATILE
# define volatile
2005-06-07 07:22:25 +00:00
# endif
# ifndef HAVE_COMPARISON_FN_T
typedef int ( * comparison_fn_t ) ( const void * , const void * ) ;
# endif
2007-04-14 09:14:40 +00:00
# ifdef REPLACE_STRPTIME
# define strptime rep_strptime
struct tm ;
char * rep_strptime ( const char * buf , const char * format , struct tm * tm ) ;
# endif
2005-09-30 23:10:20 +00:00
/* Load header file for dynamic linking stuff */
2005-09-23 00:38:22 +00:00
# ifdef HAVE_DLFCN_H
# include <dlfcn.h>
# endif
2005-09-30 23:10:20 +00:00
# ifndef RTLD_LAZY
# define RTLD_LAZY 0
# endif
2005-09-23 00:38:22 +00:00
# ifndef HAVE_SECURE_MKSTEMP
# define mkstemp(path) rep_mkstemp(path)
int rep_mkstemp ( char * temp ) ;
# endif
2006-06-27 05:49:09 +00:00
# ifndef HAVE_MKDTEMP
2006-09-04 12:21:42 +00:00
# define mkdtemp rep_mkdtemp
char * rep_mkdtemp ( char * template ) ;
2006-06-27 05:49:09 +00:00
# endif
2005-09-30 23:10:20 +00:00
# ifdef HAVE_LIMITS_H
# include <limits.h>
# endif
2006-02-20 20:40:51 +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)))
2005-09-30 23:10:20 +00:00
# ifndef HOST_NAME_MAX
# define HOST_NAME_MAX 64
# endif
2005-12-13 19:38:12 +00:00
# ifndef UINT16_MAX
# define UINT16_MAX 65535
# endif
2005-12-19 17:10:18 +00:00
# ifndef UINT32_MAX
# define UINT32_MAX (4294967295U)
# endif
# ifndef UINT64_MAX
# define UINT64_MAX ((uint64_t)-1)
# endif
2006-02-20 20:40:51 +00:00
# ifndef CHAR_BIT
# define CHAR_BIT 8
# endif
# ifndef INT32_MAX
# define INT32_MAX _TYPE_MAXIMUM(int32_t)
# endif
2006-03-31 23:28:18 +00:00
# ifdef HAVE_STDBOOL_H
# include <stdbool.h>
2006-09-10 12:23:47 +00:00
# endif
# if !defined(HAVE_BOOL)
# ifdef HAVE__Bool
# define bool _Bool
# else
2006-04-25 07:56:31 +00:00
typedef int bool ;
2006-09-10 12:23:47 +00:00
# endif
# endif
2006-09-19 03:51:45 +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-24 02:06:05 +00:00
* AIX needs _BOOL , _TRUE , _FALSE
2006-09-19 03:51:45 +00:00
*/
# ifndef BOOL_DEFINED
# define BOOL_DEFINED
# endif
# ifndef _BOOL_EXISTS
# define _BOOL_EXISTS
# endif
2006-09-24 02:06:05 +00:00
# ifndef _BOOL
# define _BOOL
# endif
2006-09-19 03:51:45 +00:00
# ifndef __bool_true_false_are_defined
# define __bool_true_false_are_defined
# endif
2006-09-10 12:23:47 +00:00
# ifndef true
2006-03-31 23:28:18 +00:00
# define true (1)
# endif
2006-09-10 12:23:47 +00:00
# ifndef false
# define false (0)
# endif
2006-03-31 23:28:18 +00:00
2006-09-24 02:06:05 +00:00
# ifndef _TRUE
2006-09-24 02:13:52 +00:00
# define _TRUE true
2006-09-24 02:06:05 +00:00
# endif
# ifndef _FALSE
2006-09-24 02:13:52 +00:00
# define _FALSE false
2006-09-24 02:06:05 +00:00
# endif
2006-04-08 16:25:53 +00:00
# ifndef HAVE_FUNCTION_MACRO
2006-04-26 14:20:46 +00:00
# ifdef HAVE_func_MACRO
# define __FUNCTION__ __func__
# else
2006-04-08 16:25:53 +00:00
# define __FUNCTION__ ("")
# endif
2006-04-26 14:20:46 +00:00
# endif
2006-04-08 16:25:53 +00:00
2006-04-24 14:09:07 +00:00
# ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
# endif
# ifndef MIN
# define MIN(a,b) ((a)<(b)?(a):(b))
# endif
# ifndef MAX
# define MAX(a,b) ((a)>(b)?(a):(b))
# endif
2006-05-24 17:21:37 +00:00
# ifndef __STRING
# define __STRING(x) #x
# endif
2006-04-24 14:09:07 +00:00
2007-04-16 19:45:35 +00:00
# ifndef _STRINGSTRING
# define __STRINGSTRING(x) __STRING(x)
# endif
# ifndef __LINESTR__
# define __LINESTR__ __STRINGSTRING(__LINE__)
# endif
2007-04-16 19:22:24 +00:00
# ifndef __location__
2007-04-16 19:45:35 +00:00
# define __location__ __FILE__ ":" __LINESTR__
2007-04-16 19:22:24 +00:00
# endif
2006-09-10 12:45:37 +00:00
# if MMAP_BLACKLIST
# undef HAVE_MMAP
# endif
2006-09-12 07:05:41 +00:00
# endif /* _LIBREPLACE_REPLACE_H */