Magellan Linux

Diff of /trunk/mkinitrd-magellan/busybox/include/platform.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 532 by niro, Sat Sep 1 22:45:15 2007 UTC revision 984 by niro, Sun May 30 11:32:42 2010 UTC
# Line 1  Line 1 
1  /* vi: set sw=4 ts=4: */  /* vi: set sw=4 ts=4: */
2  /*  /*
3     Copyright 2006, Bernhard Fischer     Copyright 2006, Bernhard Reutner-Fischer
4    
5     Licensed under the GPL v2 or later, see the file LICENSE in this tarball.     Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
6  */  */
7  #ifndef __PLATFORM_H  #ifndef BB_PLATFORM_H
8  #define __PLATFORM_H 1  #define BB_PLATFORM_H 1
9    
10    /* Assume all these functions exist by default.  Platforms where it is not
11     * true will #undef them below.
12     */
13    #define HAVE_FDPRINTF 1
14    #define HAVE_MEMRCHR 1
15    #define HAVE_MKDTEMP 1
16    #define HAVE_SETBIT 1
17    #define HAVE_STRCASESTR 1
18    #define HAVE_STRCHRNUL 1
19    #define HAVE_STRSIGNAL 1
20    #define HAVE_VASPRINTF 1
21    
22  /* Convenience macros to test the version of gcc. */  /* Convenience macros to test the version of gcc. */
23  #undef __GNUC_PREREQ  #undef __GNUC_PREREQ
# Line 17  Line 29 
29  #endif  #endif
30    
31  /* __restrict is known in EGCS 1.2 and above. */  /* __restrict is known in EGCS 1.2 and above. */
32  #if !__GNUC_PREREQ (2,92)  #if !__GNUC_PREREQ(2,92)
33  # ifndef __restrict  # ifndef __restrict
34  #  define __restrict     /* Ignore */  #  define __restrict
35  # endif  # endif
36  #endif  #endif
37    
# Line 27  Line 39 
39     macros freely, and know that they will come into play for the     macros freely, and know that they will come into play for the
40     version of gcc in which they are supported.  */     version of gcc in which they are supported.  */
41    
42  #if !__GNUC_PREREQ (2,7)  #if !__GNUC_PREREQ(2,7)
43  # ifndef __attribute__  # ifndef __attribute__
44  #  define __attribute__(x)  #  define __attribute__(x)
45  # endif  # endif
# Line 36  Line 48 
48  #undef inline  #undef inline
49  #if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L  #if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L
50  /* it's a keyword */  /* it's a keyword */
51    #elif __GNUC_PREREQ(2,7)
52    # define inline __inline__
53  #else  #else
54  # if __GNUC_PREREQ (2,7)  # define inline
 #  define inline __inline__  
 # else  
 #  define inline  
 # endif  
55  #endif  #endif
56    
57  #ifndef __const  #ifndef __const
58  # define __const const  # define __const const
59  #endif  #endif
60    
61  # define ATTRIBUTE_UNUSED __attribute__ ((__unused__))  #define UNUSED_PARAM __attribute__ ((__unused__))
62  # define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))  #define NORETURN __attribute__ ((__noreturn__))
63  # define ATTRIBUTE_PACKED __attribute__ ((__packed__))  /* "The malloc attribute is used to tell the compiler that a function
64  # define ATTRIBUTE_ALIGNED(m) __attribute__ ((__aligned__(m)))   * may be treated as if any non-NULL pointer it returns cannot alias
65  # if __GNUC_PREREQ (3,0)   * any other pointer valid when the function returns. This will often
66  #  define ATTRIBUTE_ALWAYS_INLINE __attribute__ ((always_inline)) inline   * improve optimization. Standard functions with this property include
67     * malloc and calloc. realloc-like functions have this property as long
68     * as the old pointer is never referred to (including comparing it
69     * to the new pointer) after the function returns a non-NULL value."
70     */
71    #define RETURNS_MALLOC __attribute__ ((malloc))
72    #define PACKED __attribute__ ((__packed__))
73    #define ALIGNED(m) __attribute__ ((__aligned__(m)))
74    
75    /* __NO_INLINE__: some gcc's do not honor inlining! :( */
76    #if __GNUC_PREREQ(3,0) && !defined(__NO_INLINE__)
77    # define ALWAYS_INLINE __attribute__ ((always_inline)) inline
78    /* I've seen a toolchain where I needed __noinline__ instead of noinline */
79    # define NOINLINE      __attribute__((__noinline__))
80    # if !ENABLE_WERROR
81    #  define DEPRECATED __attribute__ ((__deprecated__))
82    #  define UNUSED_PARAM_RESULT __attribute__ ((warn_unused_result))
83  # else  # else
84  #  define ATTRIBUTE_ALWAYS_INLINE inline  #  define DEPRECATED
85    #  define UNUSED_PARAM_RESULT
86  # endif  # endif
87    #else
88    # define ALWAYS_INLINE inline
89    # define NOINLINE
90    # define DEPRECATED
91    # define UNUSED_PARAM_RESULT
92    #endif
93    
94  /* -fwhole-program makes all symbols local. The attribute externally_visible  /* -fwhole-program makes all symbols local. The attribute externally_visible
95     forces a symbol global.  */     forces a symbol global.  */
96  # if __GNUC_PREREQ (4,1)  #if __GNUC_PREREQ(4,1)
97  #  define ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((__externally_visible__))  # define EXTERNALLY_VISIBLE __attribute__(( visibility("default") ))
98  # else  //__attribute__ ((__externally_visible__))
99  #  define ATTRIBUTE_EXTERNALLY_VISIBLE  #else
100  # endif /* GNUC >= 4.1 */  # define EXTERNALLY_VISIBLE
101    #endif
102    
103  /* We use __extension__ in some places to suppress -pedantic warnings  /* We use __extension__ in some places to suppress -pedantic warnings
104     about GCC extensions.  This feature didn't work properly before     about GCC extensions.  This feature didn't work properly before
105     gcc 2.8.  */     gcc 2.8.  */
106  #if !__GNUC_PREREQ (2,8)  #if !__GNUC_PREREQ(2,8)
107  # ifndef __extension__  # ifndef __extension__
108  #  define __extension__  #  define __extension__
109  # endif  # endif
110  #endif  #endif
111    
112  /* gcc-2.95 had no va_copy but only __va_copy. */  /* gcc-2.95 had no va_copy but only __va_copy. */
113  #if !__GNUC_PREREQ (3,0)  #if !__GNUC_PREREQ(3,0)
114  # include <stdarg.h>  # include <stdarg.h>
115  # if !defined va_copy && defined __va_copy  # if !defined va_copy && defined __va_copy
116  #  define va_copy(d,s) __va_copy((d),(s))  #  define va_copy(d,s) __va_copy((d),(s))
117  # endif  # endif
118  #endif  #endif
119    
120    /* FAST_FUNC is a qualifier which (possibly) makes function call faster
121     * and/or smaller by using modified ABI. It is usually only needed
122     * on non-static, busybox internal functions. Recent versions of gcc
123     * optimize statics automatically. FAST_FUNC on static is required
124     * only if you need to match a function pointer's type */
125    #if __GNUC_PREREQ(3,0) && defined(i386) /* || defined(__x86_64__)? */
126    /* stdcall makes callee to pop arguments from stack, not caller */
127    # define FAST_FUNC __attribute__((regparm(3),stdcall))
128    /* #elif ... - add your favorite arch today! */
129    #else
130    # define FAST_FUNC
131    #endif
132    
133    /* Make all declarations hidden (-fvisibility flag only affects definitions) */
134    /* (don't include system headers after this until corresponding pop!) */
135    #if __GNUC_PREREQ(4,1)
136    # define PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN _Pragma("GCC visibility push(hidden)")
137    # define POP_SAVED_FUNCTION_VISIBILITY              _Pragma("GCC visibility pop")
138    #else
139    # define PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
140    # define POP_SAVED_FUNCTION_VISIBILITY
141    #endif
142    
143  /* ---- Endian Detection ------------------------------------ */  /* ---- Endian Detection ------------------------------------ */
144    
145  #if (defined __digital__ && defined __unix__)  #if defined(__digital__) && defined(__unix__)
146  # include <sex.h>  # include <sex.h>
147  # define __BIG_ENDIAN__ (BYTE_ORDER == BIG_ENDIAN)  # define __BIG_ENDIAN__ (BYTE_ORDER == BIG_ENDIAN)
148  # define __BYTE_ORDER BYTE_ORDER  # define __BYTE_ORDER BYTE_ORDER
149    #elif defined __FreeBSD__
150    # include <sys/resource.h> /* rlimit */
151    # include <machine/endian.h>
152    # define bswap_64 __bswap64
153    # define bswap_32 __bswap32
154    # define bswap_16 __bswap16
155    # define __BIG_ENDIAN__ (_BYTE_ORDER == _BIG_ENDIAN)
156  #elif !defined __APPLE__  #elif !defined __APPLE__
157  # include <byteswap.h>  # include <byteswap.h>
158  # include <endian.h>  # include <endian.h>
159  #endif  #endif
160    
161  #ifdef __BIG_ENDIAN__  #if defined(__BIG_ENDIAN__) && __BIG_ENDIAN__
162  # define BB_BIG_ENDIAN 1  # define BB_BIG_ENDIAN 1
163  # define BB_LITTLE_ENDIAN 0  # define BB_LITTLE_ENDIAN 0
164  #elif __BYTE_ORDER == __BIG_ENDIAN  #elif __BYTE_ORDER == __BIG_ENDIAN
165  # define BB_BIG_ENDIAN 1  # define BB_BIG_ENDIAN 1
166  # define BB_LITTLE_ENDIAN 0  # define BB_LITTLE_ENDIAN 0
167  #else  #elif __BYTE_ORDER == __LITTLE_ENDIAN
168  # define BB_BIG_ENDIAN 0  # define BB_BIG_ENDIAN 0
169  # define BB_LITTLE_ENDIAN 1  # define BB_LITTLE_ENDIAN 1
170    #else
171    # error "Can't determine endianness"
172  #endif  #endif
173    
174    /* SWAP_LEnn means "convert CPU<->little_endian by swapping bytes" */
175  #if BB_BIG_ENDIAN  #if BB_BIG_ENDIAN
176  #define SWAP_BE16(x) (x)  # define SWAP_BE16(x) (x)
177  #define SWAP_BE32(x) (x)  # define SWAP_BE32(x) (x)
178  #define SWAP_BE64(x) (x)  # define SWAP_BE64(x) (x)
179  #define SWAP_LE16(x) bswap_16(x)  # define SWAP_LE16(x) bswap_16(x)
180  #define SWAP_LE32(x) bswap_32(x)  # define SWAP_LE32(x) bswap_32(x)
181  #define SWAP_LE64(x) bswap_64(x)  # define SWAP_LE64(x) bswap_64(x)
182  #else  #else
183  #define SWAP_BE16(x) bswap_16(x)  # define SWAP_BE16(x) bswap_16(x)
184  #define SWAP_BE32(x) bswap_32(x)  # define SWAP_BE32(x) bswap_32(x)
185  #define SWAP_BE64(x) bswap_64(x)  # define SWAP_BE64(x) bswap_64(x)
186  #define SWAP_LE16(x) (x)  # define SWAP_LE16(x) (x)
187  #define SWAP_LE32(x) (x)  # define SWAP_LE32(x) (x)
188  #define SWAP_LE64(x) (x)  # define SWAP_LE64(x) (x)
189    #endif
190    
191    /* ---- Unaligned access ------------------------------------ */
192    
193    /* NB: unaligned parameter should be a pointer, aligned one -
194     * a lvalue. This makes it more likely to not swap them by mistake
195     */
196    #if defined(i386) || defined(__x86_64__)
197    # define move_from_unaligned_int(v, intp) ((v) = *(int*)(intp))
198    # define move_from_unaligned16(v, u16p) ((v) = *(uint16_t*)(u16p))
199    # define move_from_unaligned32(v, u32p) ((v) = *(uint32_t*)(u32p))
200    # define move_to_unaligned32(u32p, v)   (*(uint32_t*)(u32p) = (v))
201    /* #elif ... - add your favorite arch today! */
202    #else
203    /* performs reasonably well (gcc usually inlines memcpy here) */
204    # define move_from_unaligned_int(v, intp) (memcpy(&(v), (intp), sizeof(int)))
205    # define move_from_unaligned16(v, u16p) (memcpy(&(v), (u16p), 2))
206    # define move_from_unaligned32(v, u32p) (memcpy(&(v), (u32p), 4))
207    # define move_to_unaligned32(u32p, v) do { \
208     uint32_t __t = (v); \
209     memcpy((u32p), &__t, 4); \
210    } while (0)
211  #endif  #endif
212    
213  /* ---- Networking ------------------------------------------ */  /* ---- Networking ------------------------------------------ */
214    
215  #ifndef __APPLE__  #ifndef __APPLE__
216  # include <arpa/inet.h>  # include <arpa/inet.h>
217    # if !defined(__socklen_t_defined) && !defined(_SOCKLEN_T_DECLARED)
218    typedef int socklen_t;
219    # endif
220  #else  #else
221  # include <netinet/in.h>  # include <netinet/in.h>
222  #endif  #endif
223    
 #ifndef __socklen_t_defined  
 typedef int socklen_t;  
 #endif  
   
224  /* ---- Compiler dependent settings ------------------------- */  /* ---- Compiler dependent settings ------------------------- */
225  #if (defined __digital__ && defined __unix__)  
226    #if (defined __digital__ && defined __unix__) \
227     || defined __APPLE__ || defined __FreeBSD__
228  # undef HAVE_MNTENT_H  # undef HAVE_MNTENT_H
229    # undef HAVE_SYS_STATFS_H
230  #else  #else
231  # define HAVE_MNTENT_H 1  # define HAVE_MNTENT_H 1
232  #endif /* ___digital__ && __unix__ */  # define HAVE_SYS_STATFS_H 1
233    #endif
234    
235  /*----- Kernel versioning ------------------------------------*/  /*----- Kernel versioning ------------------------------------*/
236    
237  #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))  #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
238    
239  /* ---- miscellaneous --------------------------------------- */  /* ---- Miscellaneous --------------------------------------- */
240    
241  #if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ < 5 && \  #if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ < 5 && \
242   !defined(__dietlibc__) && \   !defined(__dietlibc__) && \
# Line 151  typedef int socklen_t; Line 245  typedef int socklen_t;
245  # error "Sorry, this libc version is not supported :("  # error "Sorry, this libc version is not supported :("
246  #endif  #endif
247    
248  // Don't perpetuate e2fsck crap into the headers.  Clean up e2fsck instead.  /* Don't perpetuate e2fsck crap into the headers.  Clean up e2fsck instead. */
249    
250  #if defined __GLIBC__ || defined __UCLIBC__ \  #if defined __GLIBC__ || defined __UCLIBC__ \
251   || defined __dietlibc__ || defined _NEWLIB_VERSION   || defined __dietlibc__ || defined _NEWLIB_VERSION
252  #include <features.h>  # include <features.h>
253  #define HAVE_FEATURES_H  # define HAVE_FEATURES_H
254  #include <stdint.h>  # include <stdint.h>
255  #define HAVE_STDINT_H  # define HAVE_STDINT_H
256  #else  #elif !defined __APPLE__
257  /* Largest integral types.  */  /* Largest integral types. */
258  #if __BIG_ENDIAN__  # if BB_BIG_ENDIAN
259  typedef long int                intmax_t;  /* Looks BROKEN! */
260  typedef unsigned long int       uintmax_t;  typedef long                intmax_t;
261  #else  typedef unsigned long       uintmax_t;
262    # else
263  __extension__  __extension__
264  typedef long long int           intmax_t;  typedef long long           intmax_t;
265  __extension__  __extension__
266  typedef unsigned long long int  uintmax_t;  typedef unsigned long long  uintmax_t;
267  #endif  # endif
268  #endif  #endif
269    
270  /* Size-saving "small" ints (arch-dependent) */  /* Size-saving "small" ints (arch-dependent) */
# Line 183  typedef int smallint; Line 278  typedef int smallint;
278  typedef unsigned smalluint;  typedef unsigned smalluint;
279  #endif  #endif
280    
281  /* uclibc does not implement daemon() for no-mmu systems.  /* ISO C Standard:  7.16  Boolean type and values  <stdbool.h> */
282   * For 0.9.29 and svn, __ARCH_USE_MMU__ indicates no-mmu reliably.  #if (defined __digital__ && defined __unix__)
283   * For earlier versions there is no reliable way to check if we are building  /* old system without (proper) C99 support */
284   * for a mmu-less system; the user should pass EXTRA_CFLAGS="-DBB_NOMMU"  # define bool smalluint
285   * on his own.  #else
286   */  /* modern system, so use it */
287  #if defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \  # include <stdbool.h>
     __UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__  
 #define BB_NOMMU  
288  #endif  #endif
289    
290  /* Platforms that haven't got dprintf need to implement fdprintf() in  /* Try to defeat gcc's alignment of "char message[]"-like data */
291   * libbb.  This would require a platform.c.  It's not going to be cleaned  #if 1 /* if needed: !defined(arch1) && !defined(arch2) */
292   * out of the tree, so stop saying it should be. */  # define ALIGN1 __attribute__((aligned(1)))
293  #if !defined(__dietlibc__)  # define ALIGN2 __attribute__((aligned(2)))
294  /* Needed for: glibc */  #else
295  /* Not needed for: dietlibc */  /* Arches which MUST have 2 or 4 byte alignment for everything are here */
296  /* Others: ?? (add as needed) */  # define ALIGN1
297  #define fdprintf dprintf  # define ALIGN2
298  #endif  #endif
299    
300  #if defined(__dietlibc__)  
301  static ATTRIBUTE_ALWAYS_INLINE char* strchrnul(const char *s, char c) {  /* uclibc does not implement daemon() for no-mmu systems.
302   while (*s && *s != c) ++s;   * For 0.9.29 and svn, __ARCH_USE_MMU__ indicates no-mmu reliably.
303   return (char*)s;   * For earlier versions there is no reliable way to check if we are building
304  }   * for a mmu-less system.
305     */
306    #if ENABLE_NOMMU || \
307        (defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \
308        __UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__)
309    # define BB_MMU 0
310    # define USE_FOR_NOMMU(...) __VA_ARGS__
311    # define USE_FOR_MMU(...)
312    #else
313    # define BB_MMU 1
314    # define USE_FOR_NOMMU(...)
315    # define USE_FOR_MMU(...) __VA_ARGS__
316  #endif  #endif
317    
318  /* Don't use lchown with glibc older than 2.1.x ... uC-libc lacks it */  /* Don't use lchown with glibc older than 2.1.x */
319  #if (defined __GLIBC__ && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1) || \  #if defined(__GLIBC__) && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1
     defined __UC_LIBC__  
320  # define lchown chown  # define lchown chown
321  #endif  #endif
322    
323  /* THIS SHOULD BE CLEANED OUT OF THE TREE ENTIRELY */  #if defined(__digital__) && defined(__unix__)
 /* FIXME: fix tar.c! */  
 #ifndef FNM_LEADING_DIR  
 #define FNM_LEADING_DIR 0  
 #endif  
324    
325  #if (defined __digital__ && defined __unix__)  # include <standards.h>
326  #include <standards.h>  # include <inttypes.h>
327  #define HAVE_STANDARDS_H  # define PRIu32 "u"
328  #include <inttypes.h>  /* use legacy setpgrp(pid_t,pid_t) for now.  move to platform.c */
329  #define HAVE_INTTYPES_H  # define bb_setpgrp() do { pid_t __me = getpid(); setpgrp(__me, __me); } while (0)
330  #define PRIu32 "u"  # if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET
331    #  define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET)
332    # endif
333    # if !defined ADJ_FREQUENCY && defined MOD_FREQUENCY
334    #  define ADJ_FREQUENCY MOD_FREQUENCY
335    # endif
336    # if !defined ADJ_TIMECONST && defined MOD_TIMECONST
337    #  define ADJ_TIMECONST MOD_TIMECONST
338    # endif
339    # if !defined ADJ_TICK && defined MOD_CLKB
340    #  define ADJ_TICK MOD_CLKB
341    # endif
342    
343  /* use legacy setpgrp(pidt_,pid_t) for now.  move to platform.c */  #else
 #define bb_setpgrp do { pid_t __me = getpid(); setpgrp(__me,__me); } while (0)  
344    
345  #if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET  # define bb_setpgrp() setpgrp()
 #define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET)  
 #endif  
 #if !defined ADJ_FREQUENCY && defined MOD_FREQUENCY  
 #define ADJ_FREQUENCY MOD_FREQUENCY  
 #endif  
 #if !defined ADJ_TIMECONST && defined MOD_TIMECONST  
 #define ADJ_TIMECONST MOD_TIMECONST  
 #endif  
 #if !defined ADJ_TICK && defined MOD_CLKB  
 #define ADJ_TICK MOD_CLKB  
 #endif  
346    
 #else  
 #define bb_setpgrp setpgrp()  
347  #endif  #endif
348    
349  #if defined(__linux__)  #if defined(__GLIBC__)
350  #include <sys/mount.h>  # define fdprintf dprintf
 // Make sure we have all the new mount flags we actually try to use.  
 #ifndef MS_BIND  
 #define MS_BIND        (1<<12)  
351  #endif  #endif
352  #ifndef MS_MOVE  
353  #define MS_MOVE        (1<<13)  #if defined(__dietlibc__)
354    # undef HAVE_STRCHRNUL
355  #endif  #endif
356  #ifndef MS_RECURSIVE  
357  #define MS_RECURSIVE   (1<<14)  #if defined(__WATCOMC__)
358    # undef HAVE_FDPRINTF
359    # undef HAVE_MEMRCHR
360    # undef HAVE_MKDTEMP
361    # undef HAVE_SETBIT
362    # undef HAVE_STRCASESTR
363    # undef HAVE_STRCHRNUL
364    # undef HAVE_STRSIGNAL
365    # undef HAVE_VASPRINTF
366  #endif  #endif
367  #ifndef MS_SILENT  
368  #define MS_SILENT      (1<<15)  #if defined(__FreeBSD__)
369    # undef HAVE_STRCHRNUL
370  #endif  #endif
371    
372  // The shared subtree stuff, which went in around 2.6.15  /*
373  #ifndef MS_UNBINDABLE   * Now, define prototypes for all the functions defined in platform.c
374  #define MS_UNBINDABLE  (1<<17)   * These must come after all the HAVE_* macros are defined (or not)
375     */
376    
377    #ifndef HAVE_FDPRINTF
378    extern int fdprintf(int fd, const char *format, ...);
379  #endif  #endif
380  #ifndef MS_PRIVATE  
381  #define MS_PRIVATE     (1<<18)  #ifndef HAVE_MEMRCHR
382    extern void *memrchr(const void *s, int c, size_t n) FAST_FUNC;
383  #endif  #endif
384  #ifndef MS_SLAVE  
385  #define MS_SLAVE       (1<<19)  #ifndef HAVE_MKDTEMP
386    extern char *mkdtemp(char *template) FAST_FUNC;
387  #endif  #endif
388  #ifndef MS_SHARED  
389  #define MS_SHARED      (1<<20)  #ifndef HAVE_SETBIT
390    # define setbit(a, b)  ((a)[(b) >> 3] |= 1 << ((b) & 7))
391    # define clrbit(a, b)  ((a)[(b) >> 3] &= ~(1 << ((b) & 7)))
392  #endif  #endif
393    
394    #ifndef HAVE_STRCASESTR
395    extern char *strcasestr(const char *s, const char *pattern) FAST_FUNC;
396    #endif
397    
398  #if !defined(BLKSSZGET)  #ifndef HAVE_STRCHRNUL
399  #define BLKSSZGET _IO(0x12, 104)  extern char *strchrnul(const char *s, int c) FAST_FUNC;
400  #endif  #endif
401  #if !defined(BLKGETSIZE64)  
402  #define BLKGETSIZE64 _IOR(0x12,114,size_t)  #ifndef HAVE_STRSIGNAL
403    /* Not exactly the same: instead of "Stopped" it shows "STOP" etc */
404    # define strsignal(sig) get_signame(sig)
405  #endif  #endif
406    
407    #ifndef HAVE_VASPRINTF
408    extern int vasprintf(char **string_ptr, const char *format, va_list p) FAST_FUNC;
409  #endif  #endif
410    
411  #endif /* platform.h */  #endif

Legend:
Removed from v.532  
changed lines
  Added in v.984