systemd: export message_append_cmdline

Change-Id: I337ebf4eda95597b59778c7f6198fa5388472c2e
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/common/recipes-core/systemd/systemd/0001-Export-message_append_cmdline.patch b/common/recipes-core/systemd/systemd/0001-Export-message_append_cmdline.patch
new file mode 100644
index 0000000..afb2a48
--- /dev/null
+++ b/common/recipes-core/systemd/systemd/0001-Export-message_append_cmdline.patch
@@ -0,0 +1,323 @@
+From 5dfdd9973fe6437985d535fd530cec83a2774113 Mon Sep 17 00:00:00 2001
+From: Brad Bishop <bradleyb@us.ibm.com>
+Date: Tue, 16 Aug 2016 15:07:34 -0400
+Subject: [PATCH] Export message_append_cmdline
+
+Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
+---
+ Makefile.am                         |  43 ++++--
+ src/libsystemd/libsystemd.sym       |   1 +
+ src/libsystemd/sd-bus/bus-message.c | 254 ++++++++++++++++++++++++++++++++++++
+ src/systemd/sd-bus.h                |   1 +
+ 4 files changed, 285 insertions(+), 14 deletions(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index 03341fc..0dbf4b7 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -3032,7 +3033,10 @@ libsystemd_internal_la_SOURCES = \
+ 	src/libsystemd/sd-device/sd-device.c \
+ 	src/libsystemd/sd-device/device-private.c \
+ 	src/libsystemd/sd-device/device-private.h \
+-	src/libsystemd/sd-resolve/sd-resolve.c
++	src/libsystemd/sd-resolve/sd-resolve.c \
++	src/shared/bus-util.c \
++	src/shared/bus-util.h
++
+ 
+ libsystemd_internal_la_LIBADD = \
+ 	libbasic.la \
+diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym
+index 4ab637b..f0c06c7 100644
+--- a/src/libsystemd/libsystemd.sym
++++ b/src/libsystemd/libsystemd.sym
+@@ -488,4 +488,5 @@ global:
+         sd_journal_has_persistent_files;
+         sd_journal_enumerate_fields;
+         sd_journal_restart_fields;
++        sd_bus_message_append_cmdline;
+ } LIBSYSTEMD_227;
+diff --git a/src/libsystemd/sd-bus/bus-message.c b/src/libsystemd/sd-bus/bus-message.c
+index c2e913f..d8d3ec8 100644
+--- a/src/libsystemd/sd-bus/bus-message.c
++++ b/src/libsystemd/sd-bus/bus-message.c
+@@ -38,6 +38,7 @@
+ #include "time-util.h"
+ #include "utf8.h"
+ #include "util.h"
++#include "parse-util.h"
+ 
+ static int message_append_basic(sd_bus_message *m, char type, const void *p, const void **stored);
+ 
+@@ -5946,3 +5947,256 @@ _public_ int sd_bus_message_set_priority(sd_bus_message *m, int64_t priority) {
+         m->priority = priority;
+         return 0;
+ }
++
++_public_ int sd_bus_message_append_cmdline(sd_bus_message *m, const char *signature, char ***x) {
++        char **p;
++        int r;
++
++        assert(m);
++        assert(signature);
++        assert(x);
++
++        p = *x;
++
++        for (;;) {
++                const char *v;
++                char t;
++
++                t = *signature;
++                v = *p;
++
++                if (t == 0)
++                        break;
++                if (!v) {
++                        log_error("Too few parameters for signature.");
++                        return -EINVAL;
++                }
++
++                signature++;
++                p++;
++
++                switch (t) {
++
++                case SD_BUS_TYPE_BOOLEAN:
++
++                        r = parse_boolean(v);
++                        if (r < 0) {
++                                log_error("Failed to parse as boolean: %s", v);
++                                return r;
++                        }
++
++                        r = sd_bus_message_append_basic(m, t, &r);
++                        break;
++
++                case SD_BUS_TYPE_BYTE: {
++                        uint8_t z;
++
++                        r = safe_atou8(v, &z);
++                        if (r < 0) {
++                                log_error("Failed to parse as byte (unsigned 8bit integer): %s", v);
++                                return r;
++                        }
++
++                        r = sd_bus_message_append_basic(m, t, &z);
++                        break;
++                }
++
++                case SD_BUS_TYPE_INT16: {
++                        int16_t z;
++
++                        r = safe_atoi16(v, &z);
++                        if (r < 0) {
++                                log_error("Failed to parse as signed 16bit integer: %s", v);
++                                return r;
++                        }
++
++                        r = sd_bus_message_append_basic(m, t, &z);
++                        break;
++                }
++
++                case SD_BUS_TYPE_UINT16: {
++                        uint16_t z;
++
++                        r = safe_atou16(v, &z);
++                        if (r < 0) {
++                                log_error("Failed to parse as unsigned 16bit integer: %s", v);
++                                return r;
++                        }
++
++                        r = sd_bus_message_append_basic(m, t, &z);
++                        break;
++                }
++
++                case SD_BUS_TYPE_INT32: {
++                        int32_t z;
++
++                        r = safe_atoi32(v, &z);
++                        if (r < 0) {
++                                log_error("Failed to parse as signed 32bit integer: %s", v);
++                                return r;
++                        }
++
++                        r = sd_bus_message_append_basic(m, t, &z);
++                        break;
++                }
++
++                case SD_BUS_TYPE_UINT32: {
++                        uint32_t z;
++
++                        r = safe_atou32(v, &z);
++                        if (r < 0) {
++                                log_error("Failed to parse as unsigned 32bit integer: %s", v);
++                                return r;
++                        }
++
++                        r = sd_bus_message_append_basic(m, t, &z);
++                        break;
++                }
++
++                case SD_BUS_TYPE_INT64: {
++                        int64_t z;
++
++                        r = safe_atoi64(v, &z);
++                        if (r < 0) {
++                                log_error("Failed to parse as signed 64bit integer: %s", v);
++                                return r;
++                        }
++
++                        r = sd_bus_message_append_basic(m, t, &z);
++                        break;
++                }
++
++                case SD_BUS_TYPE_UINT64: {
++                        uint64_t z;
++
++                        r = safe_atou64(v, &z);
++                        if (r < 0) {
++                                log_error("Failed to parse as unsigned 64bit integer: %s", v);
++                                return r;
++                        }
++
++                        r = sd_bus_message_append_basic(m, t, &z);
++                        break;
++                }
++
++
++                case SD_BUS_TYPE_DOUBLE: {
++                        double z;
++
++                        r = safe_atod(v, &z);
++                        if (r < 0) {
++                                log_error("Failed to parse as double precision floating point: %s", v);
++                                return r;
++                        }
++
++                        r = sd_bus_message_append_basic(m, t, &z);
++                        break;
++                }
++
++                case SD_BUS_TYPE_STRING:
++                case SD_BUS_TYPE_OBJECT_PATH:
++                case SD_BUS_TYPE_SIGNATURE:
++
++                        r = sd_bus_message_append_basic(m, t, v);
++                        break;
++
++                case SD_BUS_TYPE_ARRAY: {
++                        uint32_t n;
++                        size_t k;
++
++                        r = safe_atou32(v, &n);
++                        if (r < 0) {
++                                log_error("Failed to parse number of array entries: %s", v);
++                                return r;
++                        }
++
++                        r = signature_element_length(signature, &k);
++                        if (r < 0) {
++                                log_error("Invalid array signature.");
++                                return r;
++                        }
++
++                        {
++                                unsigned i;
++                                char s[k + 1];
++                                memcpy(s, signature, k);
++                                s[k] = 0;
++
++                                r = sd_bus_message_open_container(m, SD_BUS_TYPE_ARRAY, s);
++                                if (r < 0)
++                                        return bus_log_create_error(r);
++
++                                for (i = 0; i < n; i++) {
++                                        r = sd_bus_message_append_cmdline(m, s, &p);
++                                        if (r < 0)
++                                                return r;
++                                }
++                        }
++
++                        signature += k;
++
++                        r = sd_bus_message_close_container(m);
++                        break;
++                }
++
++                case SD_BUS_TYPE_VARIANT:
++                        r = sd_bus_message_open_container(m, SD_BUS_TYPE_VARIANT, v);
++                        if (r < 0)
++                                return bus_log_create_error(r);
++
++                        r = sd_bus_message_append_cmdline(m, v, &p);
++                        if (r < 0)
++                                return r;
++
++                        r = sd_bus_message_close_container(m);
++                        break;
++
++                case SD_BUS_TYPE_STRUCT_BEGIN:
++                case SD_BUS_TYPE_DICT_ENTRY_BEGIN: {
++                        size_t k;
++
++                        signature--;
++                        p--;
++
++                        r = signature_element_length(signature, &k);
++                        if (r < 0) {
++                                log_error("Invalid struct/dict entry signature.");
++                                return r;
++                        }
++
++                        {
++                                char s[k-1];
++                                memcpy(s, signature + 1, k - 2);
++                                s[k - 2] = 0;
++
++                                r = sd_bus_message_open_container(m, t == SD_BUS_TYPE_STRUCT_BEGIN ? SD_BUS_TYPE_STRUCT : SD_BUS_TYPE_DICT_ENTRY, s);
++                                if (r < 0)
++                                        return bus_log_create_error(r);
++
++                                r = sd_bus_message_append_cmdline(m, s, &p);
++                                if (r < 0)
++                                        return r;
++                        }
++
++                        signature += k;
++
++                        r = sd_bus_message_close_container(m);
++                        break;
++                }
++
++                case SD_BUS_TYPE_UNIX_FD:
++                        log_error("UNIX file descriptor not supported as type.");
++                        return -EINVAL;
++
++                default:
++                        log_error("Unknown signature type %c.", t);
++                        return -EINVAL;
++                }
++
++                if (r < 0)
++                        return bus_log_create_error(r);
++        }
++
++        *x = p;
++        return 0;
++}
+diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h
+index 2a2ef0e..a6a21a4 100644
+--- a/src/systemd/sd-bus.h
++++ b/src/systemd/sd-bus.h
+@@ -233,6 +233,7 @@ int sd_bus_message_get_priority(sd_bus_message *m, int64_t *priority);
+ int sd_bus_message_get_expect_reply(sd_bus_message *m);
+ int sd_bus_message_get_auto_start(sd_bus_message *m);
+ int sd_bus_message_get_allow_interactive_authorization(sd_bus_message *m);
++int sd_bus_message_append_cmdline(sd_bus_message *m, const char *signature, char ***x);
+ 
+ const char *sd_bus_message_get_signature(sd_bus_message *m, int complete);
+ const char *sd_bus_message_get_path(sd_bus_message *m);
+-- 
+1.8.3.1
+
diff --git a/common/recipes-core/systemd/systemd_%.bbappend b/common/recipes-core/systemd/systemd_%.bbappend
index 3c3dbac..0fd2931 100644
--- a/common/recipes-core/systemd/systemd_%.bbappend
+++ b/common/recipes-core/systemd/systemd_%.bbappend
@@ -3,6 +3,7 @@
 FILESEXTRAPATHS_append := "${THISDIR}/${PN}:"
 SRC_URI += "file://default.network"
 SRC_URI += "file://obmc-standby.target"
+SRC_URI += "file://0001-Export-message_append_cmdline.patch"
 
 FILES_${PN} += "${libdir}/systemd/network/default.network"
 FILES_${PN} += "${systemd_system_unitdir}/obmc-standby.target"