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 |
*/ |
*/ |
17 |
#endif |
#endif |
18 |
|
|
19 |
/* __restrict is known in EGCS 1.2 and above. */ |
/* __restrict is known in EGCS 1.2 and above. */ |
20 |
#if !__GNUC_PREREQ (2,92) |
#if !__GNUC_PREREQ(2,92) |
21 |
# ifndef __restrict |
# ifndef __restrict |
22 |
# define __restrict /* Ignore */ |
# define __restrict /* Ignore */ |
23 |
# endif |
# endif |
27 |
macros freely, and know that they will come into play for the |
macros freely, and know that they will come into play for the |
28 |
version of gcc in which they are supported. */ |
version of gcc in which they are supported. */ |
29 |
|
|
30 |
#if !__GNUC_PREREQ (2,7) |
#if !__GNUC_PREREQ(2,7) |
31 |
# ifndef __attribute__ |
# ifndef __attribute__ |
32 |
# define __attribute__(x) |
# define __attribute__(x) |
33 |
# endif |
# endif |
37 |
#if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L |
#if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L |
38 |
/* it's a keyword */ |
/* it's a keyword */ |
39 |
#else |
#else |
40 |
# if __GNUC_PREREQ (2,7) |
# if __GNUC_PREREQ(2,7) |
41 |
# define inline __inline__ |
# define inline __inline__ |
42 |
# else |
# else |
43 |
# define inline |
# define inline |
48 |
# define __const const |
# define __const const |
49 |
#endif |
#endif |
50 |
|
|
51 |
# define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) |
#define UNUSED_PARAM __attribute__ ((__unused__)) |
52 |
# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) |
#define NORETURN __attribute__ ((__noreturn__)) |
53 |
# define ATTRIBUTE_PACKED __attribute__ ((__packed__)) |
#define PACKED __attribute__ ((__packed__)) |
54 |
# define ATTRIBUTE_ALIGNED(m) __attribute__ ((__aligned__(m))) |
#define ALIGNED(m) __attribute__ ((__aligned__(m))) |
55 |
# if __GNUC_PREREQ (3,0) |
/* __NO_INLINE__: some gcc's do not honor inlining! :( */ |
56 |
# define ATTRIBUTE_ALWAYS_INLINE __attribute__ ((always_inline)) inline |
#if __GNUC_PREREQ(3,0) && !defined(__NO_INLINE__) |
57 |
|
# define ALWAYS_INLINE __attribute__ ((always_inline)) inline |
58 |
|
/* I've seen a toolchain where I needed __noinline__ instead of noinline */ |
59 |
|
# define NOINLINE __attribute__((__noinline__)) |
60 |
|
# if !ENABLE_WERROR |
61 |
|
# define DEPRECATED __attribute__ ((__deprecated__)) |
62 |
|
# define UNUSED_PARAM_RESULT __attribute__ ((warn_unused_result)) |
63 |
# else |
# else |
64 |
# define ATTRIBUTE_ALWAYS_INLINE inline |
# define DEPRECATED /* n/a */ |
65 |
|
# define UNUSED_PARAM_RESULT /* n/a */ |
66 |
# endif |
# endif |
67 |
|
#else |
68 |
|
# define ALWAYS_INLINE inline /* n/a */ |
69 |
|
# define NOINLINE /* n/a */ |
70 |
|
# define DEPRECATED /* n/a */ |
71 |
|
# define UNUSED_PARAM_RESULT /* n/a */ |
72 |
|
#endif |
73 |
|
|
74 |
/* -fwhole-program makes all symbols local. The attribute externally_visible |
/* -fwhole-program makes all symbols local. The attribute externally_visible |
75 |
forces a symbol global. */ |
forces a symbol global. */ |
76 |
# if __GNUC_PREREQ (4,1) |
#if __GNUC_PREREQ(4,1) |
77 |
# define ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((__externally_visible__)) |
# define EXTERNALLY_VISIBLE __attribute__(( visibility("default") )) |
78 |
# else |
//__attribute__ ((__externally_visible__)) |
79 |
# define ATTRIBUTE_EXTERNALLY_VISIBLE |
#else |
80 |
# endif /* GNUC >= 4.1 */ |
# define EXTERNALLY_VISIBLE |
81 |
|
#endif /* GNUC >= 4.1 */ |
82 |
|
|
83 |
/* We use __extension__ in some places to suppress -pedantic warnings |
/* We use __extension__ in some places to suppress -pedantic warnings |
84 |
about GCC extensions. This feature didn't work properly before |
about GCC extensions. This feature didn't work properly before |
85 |
gcc 2.8. */ |
gcc 2.8. */ |
86 |
#if !__GNUC_PREREQ (2,8) |
#if !__GNUC_PREREQ(2,8) |
87 |
# ifndef __extension__ |
# ifndef __extension__ |
88 |
# define __extension__ |
# define __extension__ |
89 |
# endif |
# endif |
90 |
#endif |
#endif |
91 |
|
|
92 |
/* gcc-2.95 had no va_copy but only __va_copy. */ |
/* gcc-2.95 had no va_copy but only __va_copy. */ |
93 |
#if !__GNUC_PREREQ (3,0) |
#if !__GNUC_PREREQ(3,0) |
94 |
# include <stdarg.h> |
# include <stdarg.h> |
95 |
# if !defined va_copy && defined __va_copy |
# if !defined va_copy && defined __va_copy |
96 |
# define va_copy(d,s) __va_copy((d),(s)) |
# define va_copy(d,s) __va_copy((d),(s)) |
97 |
# endif |
# endif |
98 |
#endif |
#endif |
99 |
|
|
100 |
|
/* FAST_FUNC is a qualifier which (possibly) makes function call faster |
101 |
|
* and/or smaller by using modified ABI. It is usually only needed |
102 |
|
* on non-static, busybox internal functions. Recent versions of gcc |
103 |
|
* optimize statics automatically. FAST_FUNC on static is required |
104 |
|
* only if you need to match a function pointer's type */ |
105 |
|
#if __GNUC_PREREQ(3,0) && defined(i386) /* || defined(__x86_64__)? */ |
106 |
|
/* stdcall makes callee to pop arguments from stack, not caller */ |
107 |
|
# define FAST_FUNC __attribute__((regparm(3),stdcall)) |
108 |
|
/* #elif ... - add your favorite arch today! */ |
109 |
|
#else |
110 |
|
# define FAST_FUNC |
111 |
|
#endif |
112 |
|
|
113 |
/* ---- Endian Detection ------------------------------------ */ |
/* ---- Endian Detection ------------------------------------ */ |
114 |
|
|
115 |
#if (defined __digital__ && defined __unix__) |
#if (defined __digital__ && defined __unix__) |
132 |
# define BB_LITTLE_ENDIAN 1 |
# define BB_LITTLE_ENDIAN 1 |
133 |
#endif |
#endif |
134 |
|
|
135 |
|
/* SWAP_LEnn means "convert CPU<->little_endian by swapping bytes" */ |
136 |
#if BB_BIG_ENDIAN |
#if BB_BIG_ENDIAN |
137 |
#define SWAP_BE16(x) (x) |
#define SWAP_BE16(x) (x) |
138 |
#define SWAP_BE32(x) (x) |
#define SWAP_BE32(x) (x) |
149 |
#define SWAP_LE64(x) (x) |
#define SWAP_LE64(x) (x) |
150 |
#endif |
#endif |
151 |
|
|
152 |
|
/* ---- Unaligned access ------------------------------------ */ |
153 |
|
|
154 |
|
/* parameter is supposed to be an uint32_t* ptr */ |
155 |
|
#if defined(i386) || defined(__x86_64__) |
156 |
|
#define get_unaligned_u32p(u32p) (*(u32p)) |
157 |
|
/* #elif ... - add your favorite arch today! */ |
158 |
|
#else |
159 |
|
/* performs reasonably well (gcc usually inlines memcpy here) */ |
160 |
|
#define get_unaligned_u32p(u32p) ({ uint32_t __t; memcpy(&__t, (u32p), 4); __t; }) |
161 |
|
#endif |
162 |
|
|
163 |
/* ---- Networking ------------------------------------------ */ |
/* ---- Networking ------------------------------------------ */ |
164 |
|
|
165 |
#ifndef __APPLE__ |
#ifndef __APPLE__ |
166 |
# include <arpa/inet.h> |
# include <arpa/inet.h> |
167 |
|
# ifndef __socklen_t_defined |
168 |
|
typedef int socklen_t; |
169 |
|
# endif |
170 |
#else |
#else |
171 |
# include <netinet/in.h> |
# include <netinet/in.h> |
172 |
#endif |
#endif |
173 |
|
|
|
#ifndef __socklen_t_defined |
|
|
typedef int socklen_t; |
|
|
#endif |
|
|
|
|
174 |
/* ---- Compiler dependent settings ------------------------- */ |
/* ---- Compiler dependent settings ------------------------- */ |
175 |
#if (defined __digital__ && defined __unix__) |
|
176 |
|
#if (defined __digital__ && defined __unix__) || defined __APPLE__ |
177 |
# undef HAVE_MNTENT_H |
# undef HAVE_MNTENT_H |
178 |
|
# undef HAVE_SYS_STATFS_H |
179 |
#else |
#else |
180 |
# define HAVE_MNTENT_H 1 |
# define HAVE_MNTENT_H 1 |
181 |
|
# define HAVE_SYS_STATFS_H 1 |
182 |
#endif /* ___digital__ && __unix__ */ |
#endif /* ___digital__ && __unix__ */ |
183 |
|
|
184 |
|
/* linux/loop.h relies on __u64. Make sure we have that as a proper type |
185 |
|
* until userspace is widely fixed. */ |
186 |
|
#if (defined __INTEL_COMPILER && !defined __GNUC__) || \ |
187 |
|
(defined __GNUC__ && defined __STRICT_ANSI__) |
188 |
|
__extension__ typedef __signed__ long long __s64; |
189 |
|
__extension__ typedef unsigned long long __u64; |
190 |
|
#endif |
191 |
|
|
192 |
/*----- Kernel versioning ------------------------------------*/ |
/*----- Kernel versioning ------------------------------------*/ |
193 |
|
|
194 |
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) |
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) |
195 |
|
|
196 |
/* ---- miscellaneous --------------------------------------- */ |
/* ---- Miscellaneous --------------------------------------- */ |
197 |
|
|
198 |
#if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ < 5 && \ |
#if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ < 5 && \ |
199 |
!defined(__dietlibc__) && \ |
!defined(__dietlibc__) && \ |
202 |
# error "Sorry, this libc version is not supported :(" |
# error "Sorry, this libc version is not supported :(" |
203 |
#endif |
#endif |
204 |
|
|
205 |
// Don't perpetuate e2fsck crap into the headers. Clean up e2fsck instead. |
/* Don't perpetuate e2fsck crap into the headers. Clean up e2fsck instead. */ |
206 |
|
|
207 |
#if defined __GLIBC__ || defined __UCLIBC__ \ |
#if defined __GLIBC__ || defined __UCLIBC__ \ |
208 |
|| defined __dietlibc__ || defined _NEWLIB_VERSION |
|| defined __dietlibc__ || defined _NEWLIB_VERSION |
210 |
#define HAVE_FEATURES_H |
#define HAVE_FEATURES_H |
211 |
#include <stdint.h> |
#include <stdint.h> |
212 |
#define HAVE_STDINT_H |
#define HAVE_STDINT_H |
213 |
#else |
#elif !defined __APPLE__ |
214 |
/* Largest integral types. */ |
/* Largest integral types. */ |
215 |
#if __BIG_ENDIAN__ |
#if __BIG_ENDIAN__ |
216 |
typedef long int intmax_t; |
typedef long intmax_t; |
217 |
typedef unsigned long int uintmax_t; |
typedef unsigned long uintmax_t; |
218 |
#else |
#else |
219 |
__extension__ |
__extension__ |
220 |
typedef long long int intmax_t; |
typedef long long intmax_t; |
221 |
__extension__ |
__extension__ |
222 |
typedef unsigned long long int uintmax_t; |
typedef unsigned long long uintmax_t; |
223 |
#endif |
#endif |
224 |
#endif |
#endif |
225 |
|
|
234 |
typedef unsigned smalluint; |
typedef unsigned smalluint; |
235 |
#endif |
#endif |
236 |
|
|
237 |
|
/* ISO C Standard: 7.16 Boolean type and values <stdbool.h> */ |
238 |
|
#if (defined __digital__ && defined __unix__) |
239 |
|
/* old system without (proper) C99 support */ |
240 |
|
#define bool smalluint |
241 |
|
#else |
242 |
|
/* modern system, so use it */ |
243 |
|
#include <stdbool.h> |
244 |
|
#endif |
245 |
|
|
246 |
|
/* Try to defeat gcc's alignment of "char message[]"-like data */ |
247 |
|
#if 1 /* if needed: !defined(arch1) && !defined(arch2) */ |
248 |
|
#define ALIGN1 __attribute__((aligned(1))) |
249 |
|
#define ALIGN2 __attribute__((aligned(2))) |
250 |
|
#else |
251 |
|
/* Arches which MUST have 2 or 4 byte alignment for everything are here */ |
252 |
|
#define ALIGN1 |
253 |
|
#define ALIGN2 |
254 |
|
#endif |
255 |
|
|
256 |
|
|
257 |
/* uclibc does not implement daemon() for no-mmu systems. |
/* uclibc does not implement daemon() for no-mmu systems. |
258 |
* For 0.9.29 and svn, __ARCH_USE_MMU__ indicates no-mmu reliably. |
* For 0.9.29 and svn, __ARCH_USE_MMU__ indicates no-mmu reliably. |
259 |
* For earlier versions there is no reliable way to check if we are building |
* For earlier versions there is no reliable way to check if we are building |
260 |
* for a mmu-less system; the user should pass EXTRA_CFLAGS="-DBB_NOMMU" |
* for a mmu-less system. |
|
* on his own. |
|
261 |
*/ |
*/ |
262 |
#if defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \ |
#if ENABLE_NOMMU || \ |
263 |
__UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__ |
(defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \ |
264 |
#define BB_NOMMU |
__UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__) |
265 |
|
#define BB_MMU 0 |
266 |
|
#define USE_FOR_NOMMU(...) __VA_ARGS__ |
267 |
|
#define USE_FOR_MMU(...) |
268 |
|
#else |
269 |
|
#define BB_MMU 1 |
270 |
|
#define USE_FOR_NOMMU(...) |
271 |
|
#define USE_FOR_MMU(...) __VA_ARGS__ |
272 |
#endif |
#endif |
273 |
|
|
274 |
/* Platforms that haven't got dprintf need to implement fdprintf() in |
/* Platforms that haven't got dprintf need to implement fdprintf() in |
282 |
#endif |
#endif |
283 |
|
|
284 |
#if defined(__dietlibc__) |
#if defined(__dietlibc__) |
285 |
static ATTRIBUTE_ALWAYS_INLINE char* strchrnul(const char *s, char c) { |
static ALWAYS_INLINE char* strchrnul(const char *s, char c) |
286 |
|
{ |
287 |
while (*s && *s != c) ++s; |
while (*s && *s != c) ++s; |
288 |
return (char*)s; |
return (char*)s; |
289 |
} |
} |
290 |
#endif |
#endif |
291 |
|
|
292 |
/* 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 ... uClibc lacks it */ |
293 |
#if (defined __GLIBC__ && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1) || \ |
#if (defined __GLIBC__ && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1) || \ |
294 |
defined __UC_LIBC__ |
defined __UC_LIBC__ |
295 |
# define lchown chown |
# define lchown chown |
296 |
#endif |
#endif |
297 |
|
|
|
/* THIS SHOULD BE CLEANED OUT OF THE TREE ENTIRELY */ |
|
|
/* FIXME: fix tar.c! */ |
|
|
#ifndef FNM_LEADING_DIR |
|
|
#define FNM_LEADING_DIR 0 |
|
|
#endif |
|
|
|
|
298 |
#if (defined __digital__ && defined __unix__) |
#if (defined __digital__ && defined __unix__) |
299 |
#include <standards.h> |
#include <standards.h> |
300 |
#define HAVE_STANDARDS_H |
#define HAVE_STANDARDS_H |
302 |
#define HAVE_INTTYPES_H |
#define HAVE_INTTYPES_H |
303 |
#define PRIu32 "u" |
#define PRIu32 "u" |
304 |
|
|
305 |
/* use legacy setpgrp(pidt_,pid_t) for now. move to platform.c */ |
/* use legacy setpgrp(pid_t,pid_t) for now. move to platform.c */ |
306 |
#define bb_setpgrp do { pid_t __me = getpid(); setpgrp(__me,__me); } while (0) |
#define bb_setpgrp() do { pid_t __me = getpid(); setpgrp(__me,__me); } while (0) |
307 |
|
|
308 |
#if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET |
#if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET |
309 |
#define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET) |
#define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET) |
319 |
#endif |
#endif |
320 |
|
|
321 |
#else |
#else |
322 |
#define bb_setpgrp setpgrp() |
#define bb_setpgrp() setpgrp() |
323 |
#endif |
#endif |
324 |
|
|
325 |
#if defined(__linux__) |
#if defined(__linux__) |
326 |
#include <sys/mount.h> |
#include <sys/mount.h> |
327 |
// Make sure we have all the new mount flags we actually try to use. |
/* Make sure we have all the new mount flags we actually try to use. */ |
328 |
#ifndef MS_BIND |
#ifndef MS_BIND |
329 |
#define MS_BIND (1<<12) |
#define MS_BIND (1<<12) |
330 |
#endif |
#endif |
338 |
#define MS_SILENT (1<<15) |
#define MS_SILENT (1<<15) |
339 |
#endif |
#endif |
340 |
|
|
341 |
// The shared subtree stuff, which went in around 2.6.15 |
/* The shared subtree stuff, which went in around 2.6.15. */ |
342 |
#ifndef MS_UNBINDABLE |
#ifndef MS_UNBINDABLE |
343 |
#define MS_UNBINDABLE (1<<17) |
#define MS_UNBINDABLE (1<<17) |
344 |
#endif |
#endif |
351 |
#ifndef MS_SHARED |
#ifndef MS_SHARED |
352 |
#define MS_SHARED (1<<20) |
#define MS_SHARED (1<<20) |
353 |
#endif |
#endif |
354 |
|
#ifndef MS_RELATIME |
355 |
|
#define MS_RELATIME (1 << 21) |
356 |
|
#endif |
357 |
|
|
358 |
#if !defined(BLKSSZGET) |
#if !defined(BLKSSZGET) |
359 |
#define BLKSSZGET _IO(0x12, 104) |
#define BLKSSZGET _IO(0x12, 104) |