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