aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas G. Lockhart <lockhart@fourpalms.org>1997-07-01 00:32:27 +0000
committerThomas G. Lockhart <lockhart@fourpalms.org>1997-07-01 00:32:27 +0000
commit3ded6fd5117a272220cad7b3687bee7b442d27e7 (patch)
treea1bc877e3fb0d2d15e23c29cf8162c26a0e62b45 /src
parentbf3bcb6a6dff24a2025d58a747f700e3aa20dd28 (diff)
downloadpostgresql-3ded6fd5117a272220cad7b3687bee7b442d27e7.tar.gz
postgresql-3ded6fd5117a272220cad7b3687bee7b442d27e7.zip
Fix code to do the right thing with mixed-endian clients and servers.
Diffstat (limited to 'src')
-rw-r--r--src/backend/libpq/pqcomprim.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/src/backend/libpq/pqcomprim.c b/src/backend/libpq/pqcomprim.c
index 2756285b176..3501b63c7b6 100644
--- a/src/backend/libpq/pqcomprim.c
+++ b/src/backend/libpq/pqcomprim.c
@@ -10,10 +10,11 @@
/* --------------------------------------------------------------------- */
-/* Is the other way around than system ntoh/hton, so we roll our own
- here */
-
-#ifndef BYTE_ORDER
+/* These definitions for ntoh/hton are the other way around from the
+ * default system definitions, so we roll our own here.
+ */
+
+#ifndef BYTE_ORDER
#error BYTE_ORDER must be defined as LITTLE_ENDIAN, BIG_ENDIAN or PDP_ENDIAN
#endif
@@ -24,11 +25,13 @@
# define hton_l(n) n
#else /* BYTE_ORDER != LITTLE_ENDIAN */
# if BYTE_ORDER == BIG_ENDIAN
-# define ntoh_s(n) (u_short)(((u_char *) &n)[0] << 8 | ((u_char *) &n)[1])
-# define ntoh_l(n) (u_long)(((u_char *)&n)[0] << 24 | \
- ((u_char *)&n)[1] << 16 | \
- ((u_char *)&n)[2] << 8 | ((u_char *)&n)[3])
-# define hton_s(n) (u_short)(((u_char *) &n)[2] << 8 | ((u_char *) &n)[3])
+# define ntoh_s(n) (u_short)(((u_char *)&n)[1] << 8 \
+ | ((u_char *)&n)[0])
+# define ntoh_l(n) (u_long) (((u_char *)&n)[3] << 24 \
+ | ((u_char *)&n)[2] << 16 \
+ | ((u_char *)&n)[1] << 8 \
+ | ((u_char *)&n)[0])
+# define hton_s(n) (ntoh_s(n))
# define hton_l(n) (ntoh_l(n))
# else /* BYTE_ORDER != BIG_ENDIAN */
# if BYTE_ORDER == PDP_ENDIAN
@@ -43,9 +46,10 @@
int pqPutShort(int integer, FILE *f)
{
int retval = 0;
- u_short n;
+ u_short n,s;
- n = hton_s(integer);
+ s = integer;
+ n = hton_s(s);
if(fwrite(&n, sizeof(u_short), 1, f) != 1)
retval = EOF;