Detect big/little endian in the configure script and adjust the ares_dns.h
authorDaniel Stenberg <daniel@haxx.se>
Mon, 14 Nov 2005 23:14:54 +0000 (23:14 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 14 Nov 2005 23:14:54 +0000 (23:14 +0000)
macros accordingly.

ares_dns.h
configure.ac

index 3e57572..290c8fb 100644 (file)
 #ifndef ARES__DNS_H
 #define ARES__DNS_H
 
-#if 0
+#ifdef ARES_BIG_ENDIAN
+/* big-endian aware versions */
+#define DNS__16BIT(p)                   (((p)[1] << 8) | (p)[0])
+#define DNS__32BIT(p)                   (((p)[3] << 24) | ((p)[2] << 16) | \
+                                         ((p)[1] << 8) | (p)[0])
+#define DNS__SET16BIT(p, v)             (((p)[1] = ((v) >> 8) & 0xff), \
+                                         ((p)[0] = (v) & 0xff))
+#define DNS__SET32BIT(p, v)             (((p)[3] = ((v) >> 24) & 0xff), \
+                                         ((p)[2] = ((v) >> 16) & 0xff), \
+                                         ((p)[1] = ((v) >> 8) & 0xff), \
+                                         ((p)[0] = (v) & 0xff))
+#else
 #define DNS__16BIT(p)                   (((p)[0] << 8) | (p)[1])
 #define DNS__32BIT(p)                   (((p)[0] << 24) | ((p)[1] << 16) | \
                                          ((p)[2] << 8) | (p)[3])
                                          ((p)[1] = ((v) >> 16) & 0xff), \
                                          ((p)[2] = ((v) >> 8) & 0xff), \
                                          ((p)[3] = (v) & 0xff))
-#else  /* big-endian aware versions */
+#endif
+
+#if 0
+/* we cannot use this approach on systems where we can't access 16/32 bit
+   data on un-aligned addresses */
 #define DNS__16BIT(p)                   ntohs(*(unsigned short*)(p))
 #define DNS__32BIT(p)                   ntohl(*(unsigned long*)(p))
 #define DNS__SET16BIT(p, v)             *(unsigned short*)(p) = htons(v)
index f4cc523..c20685b 100644 (file)
@@ -356,4 +356,10 @@ CARES_CHECK_GETSERVBYPORT_R
 
 CURL_CHECK_NONBLOCKING_SOCKET
 
+AC_C_BIGENDIAN(
+    [AC_DEFINE(ARES_BIG_ENDIAN, 1, [define this if ares is built for a big endian system])],
+    ,
+    [AC_MSG_WARN([couldn't figure out endianess, assuming little endian!])]
+)
+
 AC_OUTPUT(Makefile)