r18278: move more header checks and _GNU_SOURCE into libreplace
[samba.git] / source4 / lib / replace / replace.h
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
8
9      ** NOTE! The following LGPL license applies to the replace
10      ** library. This does NOT imply that all of Samba is released
11      ** under the LGPL
12    
13    This library is free software; you can redistribute it and/or
14    modify it under the terms of the GNU Lesser General Public
15    License as published by the Free Software Foundation; either
16    version 2 of the License, or (at your option) any later version.
17
18    This library is distributed in the hope that it will be useful,
19    but WITHOUT ANY WARRANTY; without even the implied warranty of
20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21    Lesser General Public License for more details.
22
23    You should have received a copy of the GNU Lesser General Public
24    License along with this library; if not, write to the Free Software
25    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26 */
27
28 #ifndef _replace_h
29 #define _replace_h
30
31 #include "config.h"
32
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <stdarg.h>
36 #include <errno.h>
37
38 #if defined(_MSC_VER) || defined(__MINGW32__)
39 #include "lib/replace/win32/replace.h"
40 #endif
41
42 #ifdef __COMPAR_FN_T
43 #define QSORT_CAST (__compar_fn_t)
44 #endif
45
46 #ifndef QSORT_CAST
47 #define QSORT_CAST (int (*)(const void *, const void *))
48 #endif
49
50 #ifdef HAVE_STDINT_H
51 #include <stdint.h>
52 #elif HAVE_INTTYPES_H
53 #include <inttypes.h>
54 #endif
55
56 #ifdef HAVE_STRING_H
57 #include <string.h>
58 #endif
59
60 #ifdef HAVE_STRINGS_H
61 #include <strings.h>
62 #endif
63
64 #ifdef HAVE_SYS_TYPES_H
65 #include <sys/types.h>
66 #endif
67
68 #ifdef HAVE_STDDEF_H
69 #include <stddef.h>
70 #endif
71
72 #ifndef HAVE_STRERROR
73 extern char *sys_errlist[];
74 #define strerror(i) sys_errlist[i]
75 #endif
76
77 #ifndef HAVE_ERRNO_DECL
78 extern int errno;
79 #endif
80
81 #ifndef HAVE_STRDUP
82 #define strdup rep_strdup
83 char *rep_strdup(const char *s);
84 #endif
85
86 #ifndef HAVE_MEMMOVE
87 #define memmove rep_memmove
88 void *rep_memmove(void *dest,const void *src,int size);
89 #endif
90
91 #if !defined(HAVE_MKTIME) || !defined(HAVE_TIMEGM)
92 #include "system/time.h"
93 #endif
94
95 #ifndef HAVE_MKTIME
96 #define mktime rep_mktime
97 time_t rep_mktime(struct tm *t);
98 #endif
99
100 #ifndef HAVE_TIMEGM
101 struct tm;
102 #define timegm rep_timegm
103 time_t rep_timegm(struct tm *tm);
104 #endif
105
106 #ifndef HAVE_STRLCPY
107 #define strlcpy rep_strlcpy
108 size_t rep_strlcpy(char *d, const char *s, size_t bufsize);
109 #endif
110
111 #ifndef HAVE_STRLCAT
112 #define strlcat rep_strlcat
113 size_t rep_strlcat(char *d, const char *s, size_t bufsize);
114 #endif
115
116 #ifndef HAVE_STRNDUP
117 #define strndup rep_strndup
118 char *rep_strndup(const char *s, size_t n);
119 #endif
120
121 #ifndef HAVE_STRNLEN
122 #define strnlen rep_strnlen
123 size_t rep_strnlen(const char *s, size_t n);
124 #endif
125
126 #ifndef HAVE_SETENV
127 #define setenv rep_setenv
128 int rep_setenv(const char *name, const char *value, int overwrite); 
129 #endif
130
131 #ifndef HAVE_SETEUID
132 #define seteuid rep_seteuid
133 int rep_seteuid(uid_t);
134 #endif
135
136 #ifndef HAVE_SETEGID
137 #define setegid rep_setegid
138 int rep_setegid(gid_t);
139 #endif
140
141 #ifndef HAVE_SETLINEBUF
142 #define setlinebuf rep_setlinebuf
143 int rep_setlinebuf(FILE *);
144 #endif
145
146 #ifndef HAVE_STRCASESTR
147 #define strcasestr rep_strcasestr
148 char *rep_strcasestr(const char *haystack, const char *needle);
149 #endif
150
151 #ifndef HAVE_STRTOK_R
152 #define strtok_r rep_strtok_r 
153 char *rep_strtok_r(char *s, const char *delim, char **save_ptr);
154 #endif
155
156 #ifndef HAVE_STRTOLL
157 #define strtoll rep_strtoll
158 long long int rep_strtoll(const char *str, char **endptr, int base);
159 #endif
160
161 #ifndef HAVE_STRTOULL
162 #define strtoull rep_strtoull
163 unsigned long long int rep_strtoull(const char *str, char **endptr, int base);
164 #endif
165
166 #ifndef HAVE_FTRUNCATE
167 #define ftruncate rep_ftruncate
168 int rep_ftruncate(int,off_t);
169 #endif
170
171 #ifndef HAVE_INITGROUPS
172 #define ftruncate rep_ftruncate
173 int rep_initgroups(char *name, gid_t id);
174 #endif
175
176 #if !defined(HAVE_BZERO) && defined(HAVE_MEMSET)
177 #define bzero(a,b) memset((a),'\0',(b))
178 #endif
179
180 #ifndef HAVE_DLERROR
181 #define dlerror rep_dlerror
182 char *rep_dlerror(void);
183 #endif
184
185 #ifndef HAVE_DLOPEN
186 #define dlopen rep_dlopen
187 void *rep_dlopen(const char *name, int flags);
188 #endif
189
190 #ifndef HAVE_DLSYM
191 #define dlsym rep_dlsym
192 void *rep_dlsym(void *handle, const char *symbol);
193 #endif
194
195 #ifndef HAVE_DLCLOSE
196 #define dlclose rep_dlclose
197 int rep_dlclose(void *handle);
198 #endif
199
200
201 #ifndef PRINTF_ATTRIBUTE
202 #if __GNUC__ >= 3
203 /** Use gcc attribute to check printf fns.  a1 is the 1-based index of
204  * the parameter containing the format, and a2 the index of the first
205  * argument. Note that some gcc 2.x versions don't handle this
206  * properly **/
207 #define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2)))
208 #else
209 #define PRINTF_ATTRIBUTE(a1, a2)
210 #endif
211 #endif
212
213 #ifndef HAVE_VASPRINTF
214 #define vasprintf rep_vasprintf
215 int rep_vasprintf(char **ptr, const char *format, va_list ap);
216 #endif
217
218 #ifndef HAVE_SNPRINTF
219 #define snprintf rep_snprintf
220 int rep_snprintf(char *,size_t ,const char *, ...) PRINTF_ATTRIBUTE(3,4);
221 #endif
222
223 #ifndef HAVE_VSNPRINTF
224 #define vsnprintf rep_vsnprintf
225 int rep_vsnprintf(char *,size_t ,const char *, va_list ap);
226 #endif
227
228 #ifndef HAVE_ASPRINTF
229 #define asprintf rep_asprintf
230 int rep_asprintf(char **,const char *, ...) PRINTF_ATTRIBUTE(2,3);
231 #endif
232
233
234 /* we used to use these fns, but now we have good replacements
235    for snprintf and vsnprintf */
236 #define slprintf snprintf
237
238
239 #ifndef HAVE_VA_COPY
240 #undef va_copy
241 #ifdef HAVE___VA_COPY
242 #define va_copy(dest, src) __va_copy(dest, src)
243 #else
244 #define va_copy(dest, src) (dest) = (src)
245 #endif
246 #endif
247
248 #ifndef HAVE_VOLATILE
249 #define volatile
250 #endif
251
252 #ifndef HAVE_COMPARISON_FN_T
253 typedef int (*comparison_fn_t)(const void *, const void *);
254 #endif
255
256 /* Load header file for dynamic linking stuff */
257 #ifdef HAVE_DLFCN_H
258 #include <dlfcn.h>
259 #endif
260
261 #ifndef RTLD_LAZY
262 #define RTLD_LAZY 0
263 #endif
264
265 #ifndef HAVE_SECURE_MKSTEMP
266 #define mkstemp(path) rep_mkstemp(path)
267 int rep_mkstemp(char *temp);
268 #endif
269
270 #ifndef HAVE_MKDTEMP
271 #define mkdtemp rep_mkdtemp
272 char *rep_mkdtemp(char *template);
273 #endif
274
275 #ifdef HAVE_LIMITS_H
276 #include <limits.h>
277 #endif
278
279 /* The extra casts work around common compiler bugs.  */
280 #define _TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
281 /* The outer cast is needed to work around a bug in Cray C 5.0.3.0.
282    It is necessary at least when t == time_t.  */
283 #define _TYPE_MINIMUM(t) ((t) (_TYPE_SIGNED (t) \
284                               ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0))
285 #define _TYPE_MAXIMUM(t) ((t) (~ (t) 0 - _TYPE_MINIMUM (t)))
286
287 #ifndef HOST_NAME_MAX
288 #define HOST_NAME_MAX 64
289 #endif
290
291 #ifndef UINT16_MAX
292 #define UINT16_MAX 65535
293 #endif
294
295 #ifndef UINT32_MAX
296 #define UINT32_MAX (4294967295U)
297 #endif
298
299 #ifndef UINT64_MAX
300 #define UINT64_MAX ((uint64_t)-1)
301 #endif
302
303 #ifndef CHAR_BIT
304 #define CHAR_BIT 8
305 #endif
306
307 #ifndef INT32_MAX
308 #define INT32_MAX _TYPE_MAXIMUM(int32_t)
309 #endif
310
311 #ifdef HAVE_STDBOOL_H
312 #include <stdbool.h>
313 #elif !defined(HAVE_BOOL)
314 #define __bool_true_false_are_defined
315 typedef int bool;
316 #define false (0)
317 #define true (1)
318 #endif
319
320 #ifndef HAVE_FUNCTION_MACRO
321 #ifdef HAVE_func_MACRO
322 #define __FUNCTION__ __func__
323 #else
324 #define __FUNCTION__ ("")
325 #endif
326 #endif
327
328 #ifdef HAVE_SYS_PARAM_H
329 #include <sys/param.h>
330 #endif
331
332 #ifndef MIN
333 #define MIN(a,b) ((a)<(b)?(a):(b))
334 #endif
335
336 #ifndef MAX
337 #define MAX(a,b) ((a)>(b)?(a):(b))
338 #endif
339
340 #ifndef __STRING
341 #define __STRING(x)    #x
342 #endif
343
344 #endif