diff options
author | Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> | 2014-09-23 11:43:20 +0200 |
---|---|---|
committer | Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> | 2014-09-23 11:43:20 +0200 |
commit | 910d9b625a4edf93b4713130fe2edc68ff7522d6 (patch) | |
tree | 707f3b902a2911aabddeb79ae506295912957885 /include/libipset/compat.h | |
parent | d5927a73000ca784623feeab2b73facbd7fca3b0 (diff) | |
download | ipset-910d9b625a4edf93b4713130fe2edc68ff7522d6.tar.gz |
Support glibc < 2.9 (fixes bugzilla id #891)
Diffstat (limited to 'include/libipset/compat.h')
-rw-r--r-- | include/libipset/compat.h | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/include/libipset/compat.h b/include/libipset/compat.h new file mode 100644 index 0000000..9616a8b --- /dev/null +++ b/include/libipset/compat.h @@ -0,0 +1,70 @@ +/* Copyright 2014 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef LIBIPSET_COMPAT_H +#define LIBIPSET_COMPAT_H + +#ifndef be64toh + +#include <endian.h> +/* Swap bytes in 64 bit value. */ +#if __BYTE_ORDER == __LITTLE_ENDIAN +/* From bits/byteswap.h in eglibc source: */ +#define __bswap_constant_32(x) \ + ((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8) | \ + (((x) & 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24)) + +#ifdef __GNUC__ +# define __bswap_32(x) \ + (__extension__ \ + ({ register unsigned int __bsx = (x); __bswap_constant_32 (__bsx); })) +#else +static __inline unsigned int +__bswap_32 (unsigned int __bsx) +{ + return __bswap_constant_32 (__bsx); +} +#endif + +#if defined __GNUC__ && __GNUC__ >= 2 +/* Swap bytes in 64 bit value. */ +# define __bswap_constant_64(x) \ + ((((x) & 0xff00000000000000ull) >> 56) \ + | (((x) & 0x00ff000000000000ull) >> 40) \ + | (((x) & 0x0000ff0000000000ull) >> 24) \ + | (((x) & 0x000000ff00000000ull) >> 8) \ + | (((x) & 0x00000000ff000000ull) << 8) \ + | (((x) & 0x0000000000ff0000ull) << 24) \ + | (((x) & 0x000000000000ff00ull) << 40) \ + | (((x) & 0x00000000000000ffull) << 56)) + +# define __bswap_64(x) \ + (__extension__ \ + ({ union { __extension__ unsigned long long int __ll; \ + unsigned int __l[2]; } __w, __r; \ + if (__builtin_constant_p (x)) \ + __r.__ll = __bswap_constant_64 (x); \ + else \ + { \ + __w.__ll = (x); \ + __r.__l[0] = __bswap_32 (__w.__l[1]); \ + __r.__l[1] = __bswap_32 (__w.__l[0]); \ + } \ + __r.__ll; })) +#else +#error "Unsupported, you need at least gcc 3.x" +#endif + +#define be64toh(x) __bswap_64(x) +#define htobe64(x) __bswap_64(x) +#else +#define be64toh(x) (x) +#define htobe64(x) (x) +#endif + +#endif + +#endif /* LIBIPSET_COMPAT_H */ |