diff options
Diffstat (limited to 'include/platform.h')
-rw-r--r-- | include/platform.h | 276 |
1 files changed, 276 insertions, 0 deletions
diff --git a/include/platform.h b/include/platform.h new file mode 100644 index 000000000..345e9cb7a --- /dev/null +++ b/include/platform.h | |||
@@ -0,0 +1,276 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | Copyright 2006, Bernhard Fischer | ||
4 | |||
5 | Licensed under the GPL v2 or later, see the file LICENSE in this tarball. | ||
6 | */ | ||
7 | #ifndef __PLATFORM_H | ||
8 | #define __PLATFORM_H 1 | ||
9 | |||
10 | /* Convenience macros to test the version of gcc. */ | ||
11 | #undef __GNUC_PREREQ | ||
12 | #if defined __GNUC__ && defined __GNUC_MINOR__ | ||
13 | # define __GNUC_PREREQ(maj, min) \ | ||
14 | ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) | ||
15 | #else | ||
16 | # define __GNUC_PREREQ(maj, min) 0 | ||
17 | #endif | ||
18 | |||
19 | /* __restrict is known in EGCS 1.2 and above. */ | ||
20 | #if !__GNUC_PREREQ (2,92) | ||
21 | # ifndef __restrict | ||
22 | # define __restrict /* Ignore */ | ||
23 | # endif | ||
24 | #endif | ||
25 | |||
26 | /* Define macros for some gcc attributes. This permits us to use the | ||
27 | macros freely, and know that they will come into play for the | ||
28 | version of gcc in which they are supported. */ | ||
29 | |||
30 | #if !__GNUC_PREREQ (2,7) | ||
31 | # ifndef __attribute__ | ||
32 | # define __attribute__(x) | ||
33 | # endif | ||
34 | #endif | ||
35 | |||
36 | #undef inline | ||
37 | #if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L | ||
38 | /* it's a keyword */ | ||
39 | #else | ||
40 | # if __GNUC_PREREQ (2,7) | ||
41 | # define inline __inline__ | ||
42 | # else | ||
43 | # define inline | ||
44 | # endif | ||
45 | #endif | ||
46 | |||
47 | #ifndef __const | ||
48 | # define __const const | ||
49 | #endif | ||
50 | |||
51 | # define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) | ||
52 | # define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) | ||
53 | # define ATTRIBUTE_PACKED __attribute__ ((__packed__)) | ||
54 | # define ATTRIBUTE_ALIGNED(m) __attribute__ ((__aligned__(m))) | ||
55 | # if __GNUC_PREREQ (3,0) | ||
56 | # define ATTRIBUTE_ALWAYS_INLINE __attribute__ ((always_inline)) inline | ||
57 | # else | ||
58 | # define ATTRIBUTE_ALWAYS_INLINE inline | ||
59 | # endif | ||
60 | |||
61 | /* -fwhole-program makes all symbols local. The attribute externally_visible | ||
62 | forces a symbol global. */ | ||
63 | # if __GNUC_PREREQ (4,1) | ||
64 | # define ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((__externally_visible__)) | ||
65 | # else | ||
66 | # define ATTRIBUTE_EXTERNALLY_VISIBLE | ||
67 | # endif /* GNUC >= 4.1 */ | ||
68 | |||
69 | /* We use __extension__ in some places to suppress -pedantic warnings | ||
70 | about GCC extensions. This feature didn't work properly before | ||
71 | gcc 2.8. */ | ||
72 | #if !__GNUC_PREREQ (2,8) | ||
73 | # ifndef __extension__ | ||
74 | # define __extension__ | ||
75 | # endif | ||
76 | #endif | ||
77 | |||
78 | /* gcc-2.95 had no va_copy but only __va_copy. */ | ||
79 | #if !__GNUC_PREREQ (3,0) | ||
80 | # include <stdarg.h> | ||
81 | # if !defined va_copy && defined __va_copy | ||
82 | # define va_copy(d,s) __va_copy((d),(s)) | ||
83 | # endif | ||
84 | #endif | ||
85 | |||
86 | /* ---- Endian Detection ------------------------------------ */ | ||
87 | |||
88 | #if (defined __digital__ && defined __unix__) | ||
89 | # include <sex.h> | ||
90 | # define __BIG_ENDIAN__ (BYTE_ORDER == BIG_ENDIAN) | ||
91 | # define __BYTE_ORDER BYTE_ORDER | ||
92 | #elif !defined __APPLE__ | ||
93 | # include <byteswap.h> | ||
94 | # include <endian.h> | ||
95 | #endif | ||
96 | |||
97 | #ifdef __BIG_ENDIAN__ | ||
98 | # define BB_BIG_ENDIAN 1 | ||
99 | # define BB_LITTLE_ENDIAN 0 | ||
100 | #elif __BYTE_ORDER == __BIG_ENDIAN | ||
101 | # define BB_BIG_ENDIAN 1 | ||
102 | # define BB_LITTLE_ENDIAN 0 | ||
103 | #else | ||
104 | # define BB_BIG_ENDIAN 0 | ||
105 | # define BB_LITTLE_ENDIAN 1 | ||
106 | #endif | ||
107 | |||
108 | #if BB_BIG_ENDIAN | ||
109 | #define SWAP_BE16(x) (x) | ||
110 | #define SWAP_BE32(x) (x) | ||
111 | #define SWAP_BE64(x) (x) | ||
112 | #define SWAP_LE16(x) bswap_16(x) | ||
113 | #define SWAP_LE32(x) bswap_32(x) | ||
114 | #define SWAP_LE64(x) bswap_64(x) | ||
115 | #else | ||
116 | #define SWAP_BE16(x) bswap_16(x) | ||
117 | #define SWAP_BE32(x) bswap_32(x) | ||
118 | #define SWAP_BE64(x) bswap_64(x) | ||
119 | #define SWAP_LE16(x) (x) | ||
120 | #define SWAP_LE32(x) (x) | ||
121 | #define SWAP_LE64(x) (x) | ||
122 | #endif | ||
123 | |||
124 | /* ---- Networking ------------------------------------------ */ | ||
125 | #ifndef __APPLE__ | ||
126 | # include <arpa/inet.h> | ||
127 | #else | ||
128 | # include <netinet/in.h> | ||
129 | #endif | ||
130 | |||
131 | #ifndef __socklen_t_defined | ||
132 | typedef int socklen_t; | ||
133 | #endif | ||
134 | |||
135 | /* ---- Compiler dependent settings ------------------------- */ | ||
136 | #ifndef __GNUC__ | ||
137 | #if defined __INTEL_COMPILER | ||
138 | __extension__ typedef __signed__ long long __s64; | ||
139 | __extension__ typedef unsigned long long __u64; | ||
140 | #endif /* __INTEL_COMPILER */ | ||
141 | #endif /* ifndef __GNUC__ */ | ||
142 | |||
143 | #if (defined __digital__ && defined __unix__) | ||
144 | # undef HAVE_MNTENT_H | ||
145 | #else | ||
146 | # define HAVE_MNTENT_H 1 | ||
147 | #endif /* ___digital__ && __unix__ */ | ||
148 | |||
149 | /*----- Kernel versioning ------------------------------------*/ | ||
150 | #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) | ||
151 | |||
152 | /* ---- miscellaneous --------------------------------------- */ | ||
153 | |||
154 | #if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ < 5 && \ | ||
155 | !defined(__dietlibc__) && \ | ||
156 | !defined(_NEWLIB_VERSION) && \ | ||
157 | !(defined __digital__ && defined __unix__) | ||
158 | # error "Sorry, this libc version is not supported :(" | ||
159 | #endif | ||
160 | |||
161 | // Don't perpetuate e2fsck crap into the headers. Clean up e2fsck instead. | ||
162 | |||
163 | #if defined __GLIBC__ || defined __UCLIBC__ \ | ||
164 | || defined __dietlibc__ || defined _NEWLIB_VERSION | ||
165 | #include <features.h> | ||
166 | #define HAVE_FEATURES_H | ||
167 | #include <stdint.h> | ||
168 | #define HAVE_STDINT_H | ||
169 | #else | ||
170 | /* Largest integral types. */ | ||
171 | #if __BIG_ENDIAN__ | ||
172 | typedef long int intmax_t; | ||
173 | typedef unsigned long int uintmax_t; | ||
174 | #else | ||
175 | __extension__ | ||
176 | typedef long long int intmax_t; | ||
177 | __extension__ | ||
178 | typedef unsigned long long int uintmax_t; | ||
179 | #endif | ||
180 | #endif | ||
181 | |||
182 | /* uclibc does not implement daemon() for no-mmu systems. | ||
183 | * For 0.9.29 and svn, __ARCH_USE_MMU__ indicates no-mmu reliably. | ||
184 | * For earlier versions there is no reliable way to check if we are building | ||
185 | * for a mmu-less system; the user should pass EXTRA_CFLAGS="-DBB_NOMMU" | ||
186 | * on his own. | ||
187 | */ | ||
188 | #if defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \ | ||
189 | __UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__ | ||
190 | #define BB_NOMMU | ||
191 | #endif | ||
192 | |||
193 | /* Platforms that haven't got dprintf need to implement fdprintf() in | ||
194 | * libbb. This would require a platform.c. It's not going to be cleaned | ||
195 | * out of the tree, so stop saying it should be. */ | ||
196 | #define fdprintf dprintf | ||
197 | |||
198 | /* Don't use lchown with glibc older then 2.1.x ... uC-libc lacks it */ | ||
199 | #if (defined __GLIBC__ && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1) || \ | ||
200 | defined __UC_LIBC__ | ||
201 | # define lchown chown | ||
202 | #endif | ||
203 | |||
204 | /* THIS SHOULD BE CLEANED OUT OF THE TREE ENTIRELY */ | ||
205 | /* FIXME: fix tar.c! */ | ||
206 | #ifndef FNM_LEADING_DIR | ||
207 | #define FNM_LEADING_DIR 0 | ||
208 | #endif | ||
209 | |||
210 | #if (defined __digital__ && defined __unix__) | ||
211 | #include <standards.h> | ||
212 | #define HAVE_STANDARDS_H | ||
213 | #include <inttypes.h> | ||
214 | #define HAVE_INTTYPES_H | ||
215 | #define PRIu32 "u" | ||
216 | |||
217 | /* use legacy setpgrp(pidt_,pid_t) for now. move to platform.c */ | ||
218 | #define bb_setpgrp do{pid_t __me = getpid();setpgrp(__me,__me);}while(0) | ||
219 | |||
220 | #if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET | ||
221 | #define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET) | ||
222 | #endif | ||
223 | #if !defined ADJ_FREQUENCY && defined MOD_FREQUENCY | ||
224 | #define ADJ_FREQUENCY MOD_FREQUENCY | ||
225 | #endif | ||
226 | #if !defined ADJ_TIMECONST && defined MOD_TIMECONST | ||
227 | #define ADJ_TIMECONST MOD_TIMECONST | ||
228 | #endif | ||
229 | #if !defined ADJ_TICK && defined MOD_CLKB | ||
230 | #define ADJ_TICK MOD_CLKB | ||
231 | #endif | ||
232 | |||
233 | #else | ||
234 | #define bb_setpgrp setpgrp() | ||
235 | #endif | ||
236 | |||
237 | #if defined(__linux__) | ||
238 | #include <sys/mount.h> | ||
239 | // Make sure we have all the new mount flags we actually try to use. | ||
240 | #ifndef MS_BIND | ||
241 | #define MS_BIND (1<<12) | ||
242 | #endif | ||
243 | #ifndef MS_MOVE | ||
244 | #define MS_MOVE (1<<13) | ||
245 | #endif | ||
246 | #ifndef MS_RECURSIVE | ||
247 | #define MS_RECURSIVE (1<<14) | ||
248 | #endif | ||
249 | #ifndef MS_SILENT | ||
250 | #define MS_SILENT (1<<15) | ||
251 | #endif | ||
252 | |||
253 | // The shared subtree stuff, which went in around 2.6.15 | ||
254 | #ifndef MS_UNBINDABLE | ||
255 | #define MS_UNBINDABLE (1<<17) | ||
256 | #endif | ||
257 | #ifndef MS_PRIVATE | ||
258 | #define MS_PRIVATE (1<<18) | ||
259 | #endif | ||
260 | #ifndef MS_SLAVE | ||
261 | #define MS_SLAVE (1<<19) | ||
262 | #endif | ||
263 | #ifndef MS_SHARED | ||
264 | #define MS_SHARED (1<<20) | ||
265 | #endif | ||
266 | |||
267 | |||
268 | #if !defined(BLKSSZGET) | ||
269 | #define BLKSSZGET _IO(0x12, 104) | ||
270 | #endif | ||
271 | #if !defined(BLKGETSIZE64) | ||
272 | #define BLKGETSIZE64 _IOR(0x12,114,size_t) | ||
273 | #endif | ||
274 | #endif | ||
275 | |||
276 | #endif /* platform.h */ | ||