Define __STDC_FORMAT_MACROS, required for PRIu64 define (among others)
[ira/wip.git] / 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    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 #ifdef HAVE_STRING_H
60 #include <string.h>
61 #endif
62
63 #ifdef HAVE_STRINGS_H
64 #include <strings.h>
65 #endif
66
67 #ifdef HAVE_SYS_TYPES_H
68 #include <sys/types.h>
69 #endif
70
71 #if STDC_HEADERS
72 #include <stdlib.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 #ifndef HAVE_MKTIME
96 #define mktime rep_mktime
97 /* prototype is in "system/time.h" */
98 #endif
99
100 #ifndef HAVE_TIMEGM
101 #define timegm rep_timegm
102 /* prototype is in "system/time.h" */
103 #endif
104
105 #ifndef HAVE_UTIME
106 #define utime rep_utime
107 /* prototype is in "system/time.h" */
108 #endif
109
110 #ifndef HAVE_UTIMES
111 #define utimes rep_utimes
112 /* prototype is in "system/time.h" */
113 #endif
114
115 #ifndef HAVE_STRLCPY
116 #define strlcpy rep_strlcpy
117 size_t rep_strlcpy(char *d, const char *s, size_t bufsize);
118 #endif
119
120 #ifndef HAVE_STRLCAT
121 #define strlcat rep_strlcat
122 size_t rep_strlcat(char *d, const char *s, size_t bufsize);
123 #endif
124
125 #if (defined(BROKEN_STRNDUP) || !defined(HAVE_STRNDUP))
126 #undef HAVE_STRNDUP
127 #define strndup rep_strndup
128 char *rep_strndup(const char *s, size_t n);
129 #endif
130
131 #if (defined(BROKEN_STRNLEN) || !defined(HAVE_STRNLEN))
132 #undef HAVE_STRNLEN
133 #define strnlen rep_strnlen
134 size_t rep_strnlen(const char *s, size_t n);
135 #endif
136
137 #ifndef HAVE_SETENV
138 #define setenv rep_setenv
139 int rep_setenv(const char *name, const char *value, int overwrite);
140 #else
141 #ifndef HAVE_SETENV_DECL
142 int setenv(const char *name, const char *value, int overwrite);
143 #endif
144 #endif
145
146 #ifndef HAVE_UNSETENV
147 #define unsetenv rep_unsetenv
148 int rep_unsetenv(const char *name);
149 #endif
150
151 #ifndef HAVE_SETEUID
152 #define seteuid rep_seteuid
153 int rep_seteuid(uid_t);
154 #endif
155
156 #ifndef HAVE_SETEGID
157 #define setegid rep_setegid
158 int rep_setegid(gid_t);
159 #endif
160
161 #ifndef HAVE_SETLINEBUF
162 #define setlinebuf rep_setlinebuf
163 void rep_setlinebuf(FILE *);
164 #endif
165
166 #ifndef HAVE_STRCASESTR
167 #define strcasestr rep_strcasestr
168 char *rep_strcasestr(const char *haystack, const char *needle);
169 #endif
170
171 #ifndef HAVE_STRTOK_R
172 #define strtok_r rep_strtok_r
173 char *rep_strtok_r(char *s, const char *delim, char **save_ptr);
174 #endif
175
176 #ifndef HAVE_STRTOLL
177 #define strtoll rep_strtoll
178 long long int rep_strtoll(const char *str, char **endptr, int base);
179 #endif
180
181 #ifndef HAVE_STRTOULL
182 #define strtoull rep_strtoull
183 unsigned long long int rep_strtoull(const char *str, char **endptr, int base);
184 #endif
185
186 #ifndef HAVE_FTRUNCATE
187 #define ftruncate rep_ftruncate
188 int rep_ftruncate(int,off_t);
189 #endif
190
191 #ifndef HAVE_INITGROUPS
192 #define initgroups rep_initgroups
193 int rep_initgroups(char *name, gid_t id);
194 #endif
195
196 #if !defined(HAVE_BZERO) && defined(HAVE_MEMSET)
197 #define bzero(a,b) memset((a),'\0',(b))
198 #endif
199
200 #ifndef HAVE_DLERROR
201 #define dlerror rep_dlerror
202 char *rep_dlerror(void);
203 #endif
204
205 #ifndef HAVE_DLOPEN
206 #define dlopen rep_dlopen
207 #ifdef DLOPEN_TAKES_UNSIGNED_FLAGS
208 void *rep_dlopen(const char *name, unsigned int flags);
209 #else
210 void *rep_dlopen(const char *name, int flags);
211 #endif
212 #endif
213
214 #ifndef HAVE_DLSYM
215 #define dlsym rep_dlsym
216 void *rep_dlsym(void *handle, const char *symbol);
217 #endif
218
219 #ifndef HAVE_DLCLOSE
220 #define dlclose rep_dlclose
221 int rep_dlclose(void *handle);
222 #endif
223
224 #ifndef HAVE_SOCKETPAIR
225 #define socketpair rep_socketpair
226 /* prototype is in system/network.h */
227 #endif
228
229 #ifndef PRINTF_ATTRIBUTE
230 #if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1 )
231 /** Use gcc attribute to check printf fns.  a1 is the 1-based index of
232  * the parameter containing the format, and a2 the index of the first
233  * argument. Note that some gcc 2.x versions don't handle this
234  * properly **/
235 #define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2)))
236 #else
237 #define PRINTF_ATTRIBUTE(a1, a2)
238 #endif
239 #endif
240
241 #ifndef _DEPRECATED_
242 #if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1 )
243 #define _DEPRECATED_ __attribute__ ((deprecated))
244 #else
245 #define _DEPRECATED_
246 #endif
247 #endif
248
249 #ifndef HAVE_VASPRINTF
250 #define vasprintf rep_vasprintf
251 int rep_vasprintf(char **ptr, const char *format, va_list ap) PRINTF_ATTRIBUTE(2,0);
252 #endif
253
254 #if !defined(HAVE_SNPRINTF) || !defined(HAVE_C99_VSNPRINTF)
255 #define snprintf rep_snprintf
256 int rep_snprintf(char *,size_t ,const char *, ...) PRINTF_ATTRIBUTE(3,4);
257 #endif
258
259 #if !defined(HAVE_VSNPRINTF) || !defined(HAVE_C99_VSNPRINTF)
260 #define vsnprintf rep_vsnprintf
261 int rep_vsnprintf(char *,size_t ,const char *, va_list ap) PRINTF_ATTRIBUTE(3,0);
262 #endif
263
264 #ifndef HAVE_ASPRINTF
265 #define asprintf rep_asprintf
266 int rep_asprintf(char **,const char *, ...) PRINTF_ATTRIBUTE(2,3);
267 #endif
268
269 #ifndef HAVE_VSYSLOG
270 #ifdef HAVE_SYSLOG
271 #define vsyslog rep_vsyslog
272 void rep_vsyslog (int facility_priority, const char *format, va_list arglist) PRINTF_ATTRIBUTE(2,0);
273 #endif
274 #endif
275
276 /* we used to use these fns, but now we have good replacements
277    for snprintf and vsnprintf */
278 #define slprintf snprintf
279
280
281 #ifndef HAVE_VA_COPY
282 #undef va_copy
283 #ifdef HAVE___VA_COPY
284 #define va_copy(dest, src) __va_copy(dest, src)
285 #else
286 #define va_copy(dest, src) (dest) = (src)
287 #endif
288 #endif
289
290 #ifndef HAVE_VOLATILE
291 #define volatile
292 #endif
293
294 #ifndef HAVE_COMPARISON_FN_T
295 typedef int (*comparison_fn_t)(const void *, const void *);
296 #endif
297
298 #ifdef REPLACE_STRPTIME
299 #define strptime rep_strptime
300 struct tm;
301 char *rep_strptime(const char *buf, const char *format, struct tm *tm);
302 #endif
303
304 /* Load header file for dynamic linking stuff */
305 #ifdef HAVE_DLFCN_H
306 #include <dlfcn.h>
307 #endif
308
309 #ifndef RTLD_LAZY
310 #define RTLD_LAZY 0
311 #endif
312 #ifndef RTLD_NOW
313 #define RTLD_NOW 0
314 #endif
315 #ifndef RTLD_GLOBAL
316 #define RTLD_GLOBAL 0
317 #endif
318
319 #ifndef HAVE_SECURE_MKSTEMP
320 #define mkstemp(path) rep_mkstemp(path)
321 int rep_mkstemp(char *temp);
322 #endif
323
324 #ifndef HAVE_MKDTEMP
325 #define mkdtemp rep_mkdtemp
326 char *rep_mkdtemp(char *template);
327 #endif
328
329 #ifndef HAVE_PREAD
330 #define pread rep_pread
331 ssize_t rep_pread(int __fd, void *__buf, size_t __nbytes, off_t __offset);
332 #endif
333
334 #ifndef HAVE_PWRITE
335 #define pwrite rep_pwrite
336 ssize_t rep_pwrite(int __fd, const void *__buf, size_t __nbytes, off_t __offset);
337 #endif
338
339 #if !defined(HAVE_INET_NTOA) || defined(REPLACE_INET_NTOA)
340 #define inet_ntoa rep_inet_ntoa
341 /* prototype is in "system/network.h" */
342 #endif
343
344 #ifndef HAVE_INET_PTON
345 #define inet_pton rep_inet_pton
346 /* prototype is in "system/network.h" */
347 #endif
348
349 #ifndef HAVE_INET_NTOP
350 #define inet_ntop rep_inet_ntop
351 /* prototype is in "system/network.h" */
352 #endif
353
354 #ifndef HAVE_INET_ATON
355 #define inet_aton rep_inet_aton
356 /* prototype is in "system/network.h" */
357 #endif
358
359 #ifndef HAVE_CONNECT
360 #define connect rep_connect
361 /* prototype is in "system/network.h" */
362 #endif
363
364 #ifndef HAVE_GETHOSTBYNAME
365 #define gethostbyname rep_gethostbyname
366 /* prototype is in "system/network.h" */
367 #endif
368
369 #ifndef HAVE_GETIFADDRS
370 #define getifaddrs rep_getifaddrs
371 /* prototype is in "system/network.h" */
372 #endif
373
374 #ifndef HAVE_FREEIFADDRS
375 #define freeifaddrs rep_freeifaddrs
376 /* prototype is in "system/network.h" */
377 #endif
378
379 #ifdef HAVE_LIMITS_H
380 #include <limits.h>
381 #endif
382
383 #ifdef HAVE_SYS_PARAM_H
384 #include <sys/param.h>
385 #endif
386
387 /* The extra casts work around common compiler bugs.  */
388 #define _TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
389 /* The outer cast is needed to work around a bug in Cray C 5.0.3.0.
390    It is necessary at least when t == time_t.  */
391 #define _TYPE_MINIMUM(t) ((t) (_TYPE_SIGNED (t) \
392                               ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0))
393 #define _TYPE_MAXIMUM(t) ((t) (~ (t) 0 - _TYPE_MINIMUM (t)))
394
395 #ifndef HOST_NAME_MAX
396 #define HOST_NAME_MAX 255
397 #endif
398
399 /*
400  * Some older systems seem not to have MAXHOSTNAMELEN
401  * defined.
402  */
403 #ifndef MAXHOSTNAMELEN
404 #define MAXHOSTNAMELEN HOST_NAME_MAX
405 #endif
406
407 #ifndef UINT16_MAX
408 #define UINT16_MAX 65535
409 #endif
410
411 #ifndef UINT32_MAX
412 #define UINT32_MAX (4294967295U)
413 #endif
414
415 #ifndef UINT64_MAX
416 #define UINT64_MAX ((uint64_t)-1)
417 #endif
418
419 #ifndef CHAR_BIT
420 #define CHAR_BIT 8
421 #endif
422
423 #ifndef INT32_MAX
424 #define INT32_MAX _TYPE_MAXIMUM(int32_t)
425 #endif
426
427 #ifdef HAVE_STDBOOL_H
428 #include <stdbool.h>
429 #endif
430
431 #if !defined(HAVE_BOOL)
432 #ifdef HAVE__Bool
433 #define bool _Bool
434 #else
435 typedef int bool;
436 #endif
437 #endif
438
439 /*
440  * to prevent <rpcsvc/yp_prot.h> from doing a redefine of 'bool'
441  *
442  * IRIX, HPUX, MacOS 10 and Solaris need BOOL_DEFINED
443  * Tru64 needs _BOOL_EXISTS
444  * AIX needs _BOOL,_TRUE,_FALSE
445  */
446 #ifndef BOOL_DEFINED
447 #define BOOL_DEFINED
448 #endif
449 #ifndef _BOOL_EXISTS
450 #define _BOOL_EXISTS
451 #endif
452 #ifndef _BOOL
453 #define _BOOL
454 #endif
455
456 #ifndef __bool_true_false_are_defined
457 #define __bool_true_false_are_defined
458 #endif
459
460 #ifndef true
461 #define true (1)
462 #endif
463 #ifndef false
464 #define false (0)
465 #endif
466
467 #ifndef _TRUE
468 #define _TRUE true
469 #endif
470 #ifndef _FALSE
471 #define _FALSE false
472 #endif
473
474 #ifndef HAVE_FUNCTION_MACRO
475 #ifdef HAVE_func_MACRO
476 #define __FUNCTION__ __func__
477 #else
478 #define __FUNCTION__ ("")
479 #endif
480 #endif
481
482
483 #ifndef MIN
484 #define MIN(a,b) ((a)<(b)?(a):(b))
485 #endif
486
487 #ifndef MAX
488 #define MAX(a,b) ((a)>(b)?(a):(b))
489 #endif
490
491 #if !defined(HAVE_VOLATILE)
492 #define volatile
493 #endif
494
495 /**
496   this is a warning hack. The idea is to use this everywhere that we
497   get the "discarding const" warning from gcc. That doesn't actually
498   fix the problem of course, but it means that when we do get to
499   cleaning them up we can do it by searching the code for
500   discard_const.
501
502   It also means that other error types aren't as swamped by the noise
503   of hundreds of const warnings, so we are more likely to notice when
504   we get new errors.
505
506   Please only add more uses of this macro when you find it
507   _really_ hard to fix const warnings. Our aim is to eventually use
508   this function in only a very few places.
509
510   Also, please call this via the discard_const_p() macro interface, as that
511   makes the return type safe.
512 */
513 #define discard_const(ptr) ((void *)((uintptr_t)(ptr)))
514
515 /** Type-safe version of discard_const */
516 #define discard_const_p(type, ptr) ((type *)discard_const(ptr))
517
518 #ifndef __STRING
519 #define __STRING(x)    #x
520 #endif
521
522 #ifndef __STRINGSTRING
523 #define __STRINGSTRING(x) __STRING(x)
524 #endif
525
526 #ifndef __LINESTR__
527 #define __LINESTR__ __STRINGSTRING(__LINE__)
528 #endif
529
530 #ifndef __location__
531 #define __location__ __FILE__ ":" __LINESTR__
532 #endif
533
534 /** 
535  * zero a structure 
536  */
537 #define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
538
539 /** 
540  * zero a structure given a pointer to the structure 
541  */
542 #define ZERO_STRUCTP(x) do { if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); } while(0)
543
544 /** 
545  * zero a structure given a pointer to the structure - no zero check 
546  */
547 #define ZERO_STRUCTPN(x) memset((char *)(x), 0, sizeof(*(x)))
548
549 /* zero an array - note that sizeof(array) must work - ie. it must not be a
550    pointer */
551 #define ZERO_ARRAY(x) memset((char *)(x), 0, sizeof(x))
552
553 /**
554  * work out how many elements there are in a static array 
555  */
556 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
557
558 /** 
559  * pointer difference macro 
560  */
561 #define PTR_DIFF(p1,p2) ((ptrdiff_t)(((const char *)(p1)) - (const char *)(p2)))
562
563 #if MMAP_BLACKLIST
564 #undef HAVE_MMAP
565 #endif
566
567 #ifdef __COMPAR_FN_T
568 #define QSORT_CAST (__compar_fn_t)
569 #endif
570
571 #ifndef QSORT_CAST
572 #define QSORT_CAST (int (*)(const void *, const void *))
573 #endif
574
575 #ifndef PATH_MAX
576 #define PATH_MAX 1024
577 #endif
578
579 #ifndef MAX_DNS_NAME_LENGTH
580 #define MAX_DNS_NAME_LENGTH 256 /* Actually 255 but +1 for terminating null. */
581 #endif
582
583 #endif /* _LIBREPLACE_REPLACE_H */