summaryrefslogtreecommitdiffstats
path: root/dcopc/marshal.c
diff options
context:
space:
mode:
Diffstat (limited to 'dcopc/marshal.c')
-rw-r--r--dcopc/marshal.c27
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;