diff options
Diffstat (limited to 'dcopc/marshal.c')
-rw-r--r-- | dcopc/marshal.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/dcopc/marshal.c b/dcopc/marshal.c index e0de9296..4cc804de 100644 --- a/dcopc/marshal.c +++ b/dcopc/marshal.c @@ -27,6 +27,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include <stdlib.h> #include <string.h> +/* The code in previous revisions was broken on little endian system, also see KDE bug #32463 */ +/* The current code was not tested on big endian system, so it could be another issue and big */ +/* endian systems would need the same code as the little endian ones */ +#include <endian.h> + dcop_data *dcop_data_new() { dcop_data *res = g_new( dcop_data, 1 ); @@ -90,10 +95,21 @@ gboolean dcop_marshal_uint32( dcop_data *data, unsigned int val ) g_assert( sizeof( unsigned int ) == 4 ); +#ifdef __BIG_ENDIAN__ buf[0] = val; buf[1] = val >> 8; buf[2] = val >> 16; buf[3] = val >> 24; +#endif +#ifdef __LITTLE_ENDIAN__ + buf[3] = val; + buf[2] = val >> 8; + buf[1] = val >> 16; + buf[0] = val >> 24; +#endif +#if (!defined(__LITTLE_ENDIAN) && !defined(__BIG_ENDIAN)) +#error "You cannot compile the DCOP C bindings without defining either __LITTLE_ENDIAN or __BIG_ENDIAN" +#endif return dcop_marshal_raw( data, buf, 4 ); } @@ -105,10 +121,21 @@ gboolean dcop_demarshal_uint32( dcop_data *data, unsigned int *val ) if ( !dcop_data_check_size( data, 4 ) ) return FALSE; +#ifdef __BIG_ENDIAN__ *val = (data->cur[3] << 24) | (data->cur[2] << 16) | (data->cur[1] << 8) | data->cur[0]; +#endif +#ifdef __LITTLE_ENDIAN__ + *val = (data->cur[0] << 24) | + (data->cur[1] << 16) | + (data->cur[2] << 8) | + data->cur[3]; +#endif +#if (!defined(__LITTLE_ENDIAN) && !defined(__BIG_ENDIAN)) +#error "You cannot compile the DCOP C bindings without defining either __LITTLE_ENDIAN or __BIG_ENDIAN" +#endif data->cur += 4; return TRUE; |