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