[systemd-devel] [PATCH] Big endian and the size of the gcc builtin type bool from stdbool.h
Dr. Werner Fink
werner at suse.de
Thu Sep 18 03:57:18 PDT 2014
On Thu, Sep 18, 2014 at 12:43:00PM +0200, David Herrmann wrote:
> Hi
>
> On Thu, Sep 18, 2014 at 11:16 AM, Werner Fink <werner at suse.de> wrote:
> > 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()
>
> We don't support "bool" in public APIs. sd-bus requires you to use
> "int" for boolean types. If a caller uses "bool", they must be fixed.
Then I'd like to know why the header <stdbool.h> together with the
therein provided type _Bool aka bool is used overall systemd. Also
it is systemctl which does use sd_bus_message_read_basic() to parse
the answer received over sd_bus of the status question send over
sd_bus?
linuxadmin:~ # uname -m
s390x
linuxadmin:~ # systemctl show multi-user.target | grep -E '=(yes|no)'
CanStart=no
CanStop=no
CanReload=no
CanIsolate=no
StopWhenUnneeded=no
RefuseManualStart=no
RefuseManualStop=no
AllowIsolate=no
DefaultDependencies=no
IgnoreOnIsolate=no
IgnoreOnSnapshot=no
NeedDaemonReload=no
ConditionResult=no
Transient=no
> Thanks
> David
Werner
> > ---
> > 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
--
"Having a smoking section in a restaurant is like having
a peeing section in a swimming pool." -- Edward Burr
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/systemd-devel/attachments/20140918/a5b6cd1b/attachment.sig>
More information about the systemd-devel
mailing list