| 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 |
| |