On s390 the big endianness and cast from pointers of integers to
the type of bool leads to the funny status messages that e.g.
all targets are set to AllowIsolate=no even for multi-user.target.

The gcc builtin type bool or _Bool has the size of one byte which
should be taken into account in sd_bus_message_read_basic() as well
as in bus_message_append_ap()

---
 src/libsystemd/sd-bus/bus-message.c |   19 +++++++++++++++----
 1 files changed, 15 insertions(+), 4 deletions(-)

diff --git src/libsystemd/sd-bus/bus-message.c 
src/libsystemd/sd-bus/bus-message.c
index bfb14fc..b70d814 100644
--- src/libsystemd/sd-bus/bus-message.c
+++ src/libsystemd/sd-bus/bus-message.c
@@ -2263,14 +2263,25 @@ int bus_message_append_ap(
                         r = sd_bus_message_append_basic(m, *t, &x);
                         break;
                 }
+                case SD_BUS_TYPE_BOOLEAN: {
+                        if (sizeof(bool) == sizeof(uint32_t)) {
+                                uint32_t x;
 
-                case SD_BUS_TYPE_BOOLEAN:
+                                x = va_arg(ap, uint32_t);
+                                r = sd_bus_message_append_basic(m, *t, &x);
+                        } else {
+                                uint8_t x;
+
+                                x = (uint8_t) va_arg(ap, int);
+                                r = sd_bus_message_append_basic(m, *t, &x);
+                        }
+                        break;
+                }
                 case SD_BUS_TYPE_INT32:
                 case SD_BUS_TYPE_UINT32:
                 case SD_BUS_TYPE_UNIX_FD: {
                         uint32_t x;
 
-                        /* We assume a boolean is the same as int32_t */
                         assert_cc(sizeof(int32_t) == sizeof(int));
 
                         x = va_arg(ap, uint32_t);
@@ -3233,7 +3244,7 @@ _public_ int sd_bus_message_read_basic(sd_bus_message *m, 
char type, void *p) {
 
                         case SD_BUS_TYPE_BOOLEAN:
                                 if (p)
-                                        *(int*) p = !!*(uint8_t*) q;
+                                        *(bool*) p = !!*(uint8_t*) q;
                                 break;
 
                         case SD_BUS_TYPE_INT16:
@@ -3343,7 +3354,7 @@ _public_ int sd_bus_message_read_basic(sd_bus_message *m, 
char type, void *p) {
 
                         case SD_BUS_TYPE_BOOLEAN:
                                 if (p)
-                                        *(int*) p = !!*(uint32_t*) q;
+                                        *(bool*) p = !!*(uint32_t*) q;
                                 break;
 
                         case SD_BUS_TYPE_INT16:
-- 
1.7.7

_______________________________________________
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to