From 0c13e147a55ede1da8ed34bea773b560860a8af5 Mon Sep 17 00:00:00 2001 From: Sebastian Dransfeld Date: Wed, 7 Feb 2007 00:23:54 +0000 Subject: [PATCH] Make dbus endian aware. SVN revision: 28278 --- legacy/ecore/src/lib/ecore_dbus/ecore_dbus.c | 12 ++++++++++ .../src/lib/ecore_dbus/ecore_dbus_message.c | 6 +++-- .../src/lib/ecore_dbus/ecore_dbus_private.h | 24 +++++++++++++++++++ .../src/lib/ecore_dbus/ecore_dbus_utils.c | 2 ++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus.c b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus.c index 10c9db30a8..56ae147f17 100644 --- a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus.c +++ b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus.c @@ -13,6 +13,7 @@ /********************************************************************************/ /* Author: Jorge Luis Zapata */ /* Author: Brian Mattern (rephorm) */ +/* Author: Sebastian Dransfeld */ /* Version: 0.3.0 */ /********************************************************************************/ /* Todo */ @@ -83,6 +84,8 @@ static int init_count = 0; static Ecore_List2 *servers = NULL; static Ecore_Event_Handler *handler[3]; +int words_bigendian = -1; + /* public functions */ EAPI int ecore_dbus_init(void) @@ -91,6 +94,15 @@ ecore_dbus_init(void) if (++init_count != 1) return init_count; + if (words_bigendian == -1) + { + unsigned long int v; + + v = htonl(0x12345678); + if (v == 0x12345678) words_bigendian = 1; + else words_bigendian = 0; + } + ecore_con_init(); ECORE_DBUS_EVENT_SERVER_ADD = ecore_event_type_new(); diff --git a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_message.c b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_message.c index fe4f942960..50ff0484ae 100644 --- a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_message.c +++ b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_message.c @@ -462,8 +462,10 @@ _ecore_dbus_message_header(Ecore_DBus_Message *msg, int type, int flags, if (!msg) return; /* endianness (1) */ - /* XXX we need to detect for endianess and send 'B' for Bigendian machines */ - msg->buffer[0] = msg->byte_order = 'l'; + if (words_bigendian) + msg->buffer[0] = msg->byte_order = 'B'; + else + msg->buffer[0] = msg->byte_order = 'l'; /* type (1) */ msg->buffer[1] = msg->type = (char)type; /* flags (1) 0x1 = no reply expected, 0x2 auto activation */ diff --git a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_private.h b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_private.h index df3988ad39..2fd280fff0 100644 --- a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_private.h +++ b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_private.h @@ -7,6 +7,30 @@ #include "Ecore_Con.h" #include "Ecore_Data.h" +extern int words_bigendian; + +#define SWAP64(x) (x) = \ + ((((unsigned long long)(x) & 0x00000000000000ffULL ) << 56) |\ + (((unsigned long long)(x) & 0x000000000000ff00ULL ) << 40) |\ + (((unsigned long long)(x) & 0x0000000000ff0000ULL ) << 24) |\ + (((unsigned long long)(x) & 0x00000000ff000000ULL ) << 8) |\ + (((unsigned long long)(x) & 0x000000ff00000000ULL ) >> 8) |\ + (((unsigned long long)(x) & 0x0000ff0000000000ULL ) >> 24) |\ + (((unsigned long long)(x) & 0x00ff000000000000ULL ) >> 40) |\ + (((unsigned long long)(x) & 0xff00000000000000ULL ) >> 56)) +#define SWAP32(x) (x) = \ + ((((unsigned int)(x) & 0x000000ff ) << 24) |\ + (((unsigned int)(x) & 0x0000ff00 ) << 8) |\ + (((unsigned int)(x) & 0x00ff0000 ) >> 8) |\ + (((unsigned int)(x) & 0xff000000 ) >> 24)) +#define SWAP16(x) (x) = \ + ((((unsigned short)(x) & 0x00ff ) << 8) |\ + (((unsigned short)(x) & 0xff00 ) >> 8)) + +#define CONV16(order, x) { if (words_bigendian && (order) != 'B') SWAP16(x); } +#define CONV32(order, x) { if (words_bigendian && (order) != 'B') SWAP32(x); } +#define CONV64(order, x) { if (words_bigendian && (order) != 'B') SWAP64(x); } + typedef unsigned char *(*Ecore_DBus_Auth_Transaction)(void *); typedef struct _Ecore_DBus_Auth Ecore_DBus_Auth; diff --git a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_utils.c b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_utils.c index 1b1c21d89e..e2f2faf47f 100644 --- a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_utils.c +++ b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_utils.c @@ -83,6 +83,7 @@ _ecore_dbus_message_append_uint32(Ecore_DBus_Message *msg, unsigned int i) { unsigned char *c; + CONV32(msg->byte_order, i) c = (unsigned char *)&i; _ecore_dbus_message_length_append(msg, 4); msg->buffer[msg->length++] = c[0]; @@ -109,6 +110,7 @@ _ecore_dbus_message_read_uint32(Ecore_DBus_Message *msg) _ecore_dbus_message_length_append(msg, 4); i = *(unsigned int *)(msg->buffer + msg->length); + CONV32(msg->byte_order, i) msg->length += 4; return i; }