X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=include%2Fplatform.h;h=c2013b39dacd2ec223897d705a420ca0c8c648c3;hb=c14d39e83a7f55ab9b92e98673a281fd6565c32d;hp=ea2983d30f859b00bd12125311c0cc769455084f;hpb=f8855139402a8752b9f9f5425cebe23e88e94c2a;p=oweals%2Fbusybox.git diff --git a/include/platform.h b/include/platform.h index ea2983d30..c2013b39d 100644 --- a/include/platform.h +++ b/include/platform.h @@ -1,3 +1,4 @@ +/* vi: set sw=4 ts=4: */ /* Copyright 2006, Bernhard Fischer @@ -10,7 +11,7 @@ #undef __GNUC_PREREQ #if defined __GNUC__ && defined __GNUC_MINOR__ # define __GNUC_PREREQ(maj, min) \ - ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) + ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) #else # define __GNUC_PREREQ(maj, min) 0 #endif @@ -32,42 +33,44 @@ # endif #endif -#if 0 -/* Attribute __malloc__ on functions was valid as of gcc 2.96. */ -#ifndef ATTRIBUTE_MALLOC -# if __GNUC_PREREQ (2,96) -# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) +#undef inline +#if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L +/* it's a keyword */ +#else +# if __GNUC_PREREQ (2,7) +# define inline __inline__ # else -# define ATTRIBUTE_MALLOC -# endif /* GNUC >= 2.96 */ -#endif /* ATTRIBUTE_MALLOC */ +# define inline +# endif #endif -#ifndef ATTRIBUTE_UNUSED -# define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) -#endif /* ATTRIBUTE_UNUSED */ +#ifndef __const +# define __const const +#endif -#ifndef ATTRIBUTE_NORETURN +# define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) # define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) -#endif /* ATTRIBUTE_NORETURN */ - -#ifndef ATTRIBUTE_PACKED # define ATTRIBUTE_PACKED __attribute__ ((__packed__)) -#endif /* ATTRIBUTE_PACKED */ - -#ifndef ATTRIBUTE_ALIGNED # define ATTRIBUTE_ALIGNED(m) __attribute__ ((__aligned__(m))) -#endif /* ATTRIBUTE_ALIGNED */ +# if __GNUC_PREREQ (3,0) +# define ATTRIBUTE_ALWAYS_INLINE __attribute__ ((always_inline)) inline +# if !ENABLE_WERROR +# define ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__)) +# else +# define ATTRIBUTE_DEPRECATED /* n/a */ +# endif +# else +# define ATTRIBUTE_ALWAYS_INLINE inline +# define ATTRIBUTE_DEPRECATED /* n/a */ +# endif /* -fwhole-program makes all symbols local. The attribute externally_visible forces a symbol global. */ -#ifndef ATTRIBUTE_EXTERNALLY_VISIBLE # if __GNUC_PREREQ (4,1) # define ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((__externally_visible__)) # else # define ATTRIBUTE_EXTERNALLY_VISIBLE # endif /* GNUC >= 4.1 */ -#endif /* ATTRIBUTE_EXTERNALLY_VISIBLE */ /* We use __extension__ in some places to suppress -pedantic warnings about GCC extensions. This feature didn't work properly before @@ -78,8 +81,21 @@ # endif #endif +/* gcc-2.95 had no va_copy but only __va_copy. */ +#if !__GNUC_PREREQ (3,0) +# include +# if !defined va_copy && defined __va_copy +# define va_copy(d,s) __va_copy((d),(s)) +# endif +#endif + /* ---- Endian Detection ------------------------------------ */ -#ifndef __APPLE__ + +#if (defined __digital__ && defined __unix__) +# include +# define __BIG_ENDIAN__ (BYTE_ORDER == BIG_ENDIAN) +# define __BYTE_ORDER BYTE_ORDER +#elif !defined __APPLE__ # include # include #endif @@ -95,6 +111,22 @@ # define BB_LITTLE_ENDIAN 1 #endif +#if BB_BIG_ENDIAN +#define SWAP_BE16(x) (x) +#define SWAP_BE32(x) (x) +#define SWAP_BE64(x) (x) +#define SWAP_LE16(x) bswap_16(x) +#define SWAP_LE32(x) bswap_32(x) +#define SWAP_LE64(x) bswap_64(x) +#else +#define SWAP_BE16(x) bswap_16(x) +#define SWAP_BE32(x) bswap_32(x) +#define SWAP_BE64(x) bswap_64(x) +#define SWAP_LE16(x) (x) +#define SWAP_LE32(x) (x) +#define SWAP_LE64(x) (x) +#endif + /* ---- Networking ------------------------------------------ */ #ifndef __APPLE__ # include @@ -102,10 +134,193 @@ # include #endif +#ifndef __socklen_t_defined +typedef int socklen_t; +#endif + +/* ---- Compiler dependent settings ------------------------- */ +#if (defined __digital__ && defined __unix__) +# undef HAVE_MNTENT_H +#else +# define HAVE_MNTENT_H 1 +#endif /* ___digital__ && __unix__ */ + +/* linux/loop.h relies on __u64. Make sure we have that as a proper type + * until userspace is widely fixed. */ +#ifndef __GNUC__ +#if defined __INTEL_COMPILER +__extension__ typedef __signed__ long long __s64; +__extension__ typedef unsigned long long __u64; +#endif /* __INTEL_COMPILER */ +#endif /* ifndef __GNUC__ */ + +/*----- Kernel versioning ------------------------------------*/ +#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) + /* ---- miscellaneous --------------------------------------- */ -/* NLS stuff */ + +#if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ < 5 && \ + !defined(__dietlibc__) && \ + !defined(_NEWLIB_VERSION) && \ + !(defined __digital__ && defined __unix__) +# error "Sorry, this libc version is not supported :(" +#endif + +// Don't perpetuate e2fsck crap into the headers. Clean up e2fsck instead. + +#if defined __GLIBC__ || defined __UCLIBC__ \ + || defined __dietlibc__ || defined _NEWLIB_VERSION +#include +#define HAVE_FEATURES_H +#include +#define HAVE_STDINT_H +#else +/* Largest integral types. */ +#if __BIG_ENDIAN__ +typedef long intmax_t; +typedef unsigned long uintmax_t; +#else +__extension__ +typedef long long intmax_t; +__extension__ +typedef unsigned long long uintmax_t; +#endif +#endif + +/* Size-saving "small" ints (arch-dependent) */ +#if defined(i386) || defined(__x86_64__) || defined(__mips__) || defined(__cris__) +/* add other arches which benefit from this... */ +typedef signed char smallint; +typedef unsigned char smalluint; +#else +/* for arches where byte accesses generate larger code: */ +typedef int smallint; +typedef unsigned smalluint; +#endif + +/* ISO C Standard: 7.16 Boolean type and values */ +#if (defined __digital__ && defined __unix__) +/* old system without (proper) C99 support */ +#define bool smalluint +#else +/* modern system, so use it */ +#include +#endif + + +/* uclibc does not implement daemon() for no-mmu systems. + * For 0.9.29 and svn, __ARCH_USE_MMU__ indicates no-mmu reliably. + * For earlier versions there is no reliable way to check if we are building + * for a mmu-less system; the user should pass EXTRA_CFLAGS="-DBB_NOMMU" + * on his own. + */ +#if defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \ + __UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__ +#define BB_MMU 0 +#define BB_NOMMU 1 +#define USE_FOR_NOMMU(...) __VA_ARGS__ +#define USE_FOR_MMU(...) +#else +#define BB_MMU 1 +/* BB_NOMMU is not defined in this case! */ +#define USE_FOR_NOMMU(...) +#define USE_FOR_MMU(...) __VA_ARGS__ +#endif + +/* Platforms that haven't got dprintf need to implement fdprintf() in + * libbb. This would require a platform.c. It's not going to be cleaned + * out of the tree, so stop saying it should be. */ +#if !defined(__dietlibc__) +/* Needed for: glibc */ +/* Not needed for: dietlibc */ +/* Others: ?? (add as needed) */ +#define fdprintf dprintf +#endif + +#if defined(__dietlibc__) +static ATTRIBUTE_ALWAYS_INLINE char* strchrnul(const char *s, char c) +{ + while (*s && *s != c) ++s; + return (char*)s; +} +#endif + +/* Don't use lchown with glibc older than 2.1.x ... uClibc lacks it */ +#if (defined __GLIBC__ && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1) || \ + defined __UC_LIBC__ +# define lchown chown +#endif + /* THIS SHOULD BE CLEANED OUT OF THE TREE ENTIRELY */ -#define _(Text) Text -#define N_(Text) (Text) +/* FIXME: fix tar.c! */ +#ifndef FNM_LEADING_DIR +#define FNM_LEADING_DIR 0 +#endif + +#if (defined __digital__ && defined __unix__) +#include +#define HAVE_STANDARDS_H +#include +#define HAVE_INTTYPES_H +#define PRIu32 "u" + +/* use legacy setpgrp(pid_t,pid_t) for now. move to platform.c */ +#define bb_setpgrp() do { pid_t __me = getpid(); setpgrp(__me,__me); } while (0) + +#if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET +#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 + +#else +#define bb_setpgrp() setpgrp() +#endif + +#if defined(__linux__) +#include +// Make sure we have all the new mount flags we actually try to use. +#ifndef MS_BIND +#define MS_BIND (1<<12) +#endif +#ifndef MS_MOVE +#define MS_MOVE (1<<13) +#endif +#ifndef MS_RECURSIVE +#define MS_RECURSIVE (1<<14) +#endif +#ifndef MS_SILENT +#define MS_SILENT (1<<15) +#endif + +// The shared subtree stuff, which went in around 2.6.15 +#ifndef MS_UNBINDABLE +#define MS_UNBINDABLE (1<<17) +#endif +#ifndef MS_PRIVATE +#define MS_PRIVATE (1<<18) +#endif +#ifndef MS_SLAVE +#define MS_SLAVE (1<<19) +#endif +#ifndef MS_SHARED +#define MS_SHARED (1<<20) +#endif + + +#if !defined(BLKSSZGET) +#define BLKSSZGET _IO(0x12, 104) +#endif +#if !defined(BLKGETSIZE64) +#define BLKGETSIZE64 _IOR(0x12,114,size_t) +#endif +#endif #endif /* platform.h */