summaryrefslogtreecommitdiff
path: root/include/libipset/compat.h
diff options
context:
space:
mode:
authorJozsef Kadlecsik <kadlec@blackhole.kfki.hu>2014-09-23 11:43:20 +0200
committerJozsef Kadlecsik <kadlec@blackhole.kfki.hu>2014-09-23 11:43:20 +0200
commit910d9b625a4edf93b4713130fe2edc68ff7522d6 (patch)
tree707f3b902a2911aabddeb79ae506295912957885 /include/libipset/compat.h
parentd5927a73000ca784623feeab2b73facbd7fca3b0 (diff)
downloadipset-910d9b625a4edf93b4713130fe2edc68ff7522d6.tar.gz
Support glibc < 2.9 (fixes bugzilla id #891)
Diffstat (limited to 'include/libipset/compat.h')
-rw-r--r--include/libipset/compat.h70
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 */