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
[email protected]
http://lists.freedesktop.org/mailman/listinfo/systemd-devel