From: Lennart Poettering Date: Fri, 1 Mar 2024 13:47:52 +0000 (+0100) Subject: bus-util: add generic parser for extracting id128 values from bus messages X-Git-Tag: v256-rc1~672^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8157cc0e3e33c97b406cc088cf001ca524154f64;p=thirdparty%2Fsystemd.git bus-util: add generic parser for extracting id128 values from bus messages --- diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c index 31b2f1daef4..00fd801cb3f 100644 --- a/src/core/dbus-manager.c +++ b/src/core/dbus-manager.c @@ -570,23 +570,14 @@ static int method_get_unit_by_invocation_id(sd_bus_message *message, void *userd _cleanup_free_ char *path = NULL; Manager *m = ASSERT_PTR(userdata); sd_id128_t id; - const void *a; Unit *u; - size_t sz; int r; assert(message); /* Anyone can call this method */ - r = sd_bus_message_read_array(message, 'y', &a, &sz); - if (r < 0) - return r; - if (sz == 0) - id = SD_ID128_NULL; - else if (sz == 16) - memcpy(&id, a, sz); - else + if (bus_message_read_id128(message, &id) < 0) return sd_bus_error_set(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid invocation ID"); if (sd_id128_is_null(id)) { diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c index a7d04f2f4de..b93c73f3cd5 100644 --- a/src/machine/machinectl.c +++ b/src/machine/machinectl.c @@ -767,22 +767,17 @@ static int print_image_hostname(sd_bus *bus, const char *name) { static int print_image_machine_id(sd_bus *bus, const char *name) { _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL; - sd_id128_t id = SD_ID128_NULL; - const void *p; - size_t size; + sd_id128_t id; int r; r = bus_call_method(bus, bus_machine_mgr, "GetImageMachineID", NULL, &reply, "s", name); if (r < 0) return r; - r = sd_bus_message_read_array(reply, 'y', &p, &size); + r = bus_message_read_id128(reply, &id); if (r < 0) return r; - if (size == sizeof(sd_id128_t)) - memcpy(&id, p, size); - if (!sd_id128_is_null(id)) printf(" Machine ID: " SD_ID128_FORMAT_STR "\n", SD_ID128_FORMAT_VAL(id)); diff --git a/src/run/run.c b/src/run/run.c index 5181c18c201..c0c65b2ea1f 100644 --- a/src/run/run.c +++ b/src/run/run.c @@ -1552,8 +1552,6 @@ static int acquire_invocation_id(sd_bus *bus, const char *unit, sd_id128_t *ret) _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL; _cleanup_free_ char *object = NULL; - const void *p; - size_t l; int r; assert(bus); @@ -1576,20 +1574,11 @@ static int acquire_invocation_id(sd_bus *bus, const char *unit, sd_id128_t *ret) if (r < 0) return log_error_errno(r, "Failed to request invocation ID for unit: %s", bus_error_message(&error, r)); - r = sd_bus_message_read_array(reply, 'y', &p, &l); + r = bus_message_read_id128(reply, ret); if (r < 0) return bus_log_parse_error(r); - if (l == 0) { - *ret = SD_ID128_NULL; - return 0; /* no uuid set */ - } - - if (l != sizeof(sd_id128_t)) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid UUID size, %zu != %zu.", l, sizeof(sd_id128_t)); - - memcpy(ret, p, l); - return !sd_id128_is_null(*ret); + return 0; } static void set_window_title(PTYForward *f) { diff --git a/src/shared/bus-map-properties.c b/src/shared/bus-map-properties.c index 809759db803..a4833a5c1ee 100644 --- a/src/shared/bus-map-properties.c +++ b/src/shared/bus-map-properties.c @@ -8,21 +8,12 @@ int bus_map_id128(sd_bus *bus, const char *member, sd_bus_message *m, sd_bus_error *error, void *userdata) { sd_id128_t *p = userdata; - const void *v; - size_t n; int r; - r = sd_bus_message_read_array(m, SD_BUS_TYPE_BYTE, &v, &n); + r = bus_message_read_id128(m, p); if (r < 0) return bus_log_parse_error_debug(r); - if (n == 0) - *p = SD_ID128_NULL; - else if (n == 16) - memcpy((*p).bytes, v, n); - else - return -EINVAL; - return 0; } diff --git a/src/shared/bus-util.c b/src/shared/bus-util.c index eea6c2321af..88e1249b8ed 100644 --- a/src/shared/bus-util.c +++ b/src/shared/bus-util.c @@ -754,3 +754,32 @@ int bus_query_sender_pidref( return bus_creds_get_pidref(creds, ret); } + +int bus_message_read_id128(sd_bus_message *m, sd_id128_t *ret) { + const void *a; + size_t sz; + int r; + + assert(m); + + r = sd_bus_message_read_array(m, 'y', &a, &sz); + if (r < 0) + return r; + + switch (sz) { + case 0: + if (ret) + *ret = SD_ID128_NULL; + break; + + case sizeof(sd_id128_t): + if (ret) + memcpy(ret, a, sz); + break; + + default: + return -EINVAL; + } + + return 0; +} diff --git a/src/shared/bus-util.h b/src/shared/bus-util.h index 1004c794069..d55665f502a 100644 --- a/src/shared/bus-util.h +++ b/src/shared/bus-util.h @@ -77,3 +77,5 @@ int bus_property_get_string_set(sd_bus *bus, const char *path, const char *inter int bus_creds_get_pidref(sd_bus_creds *c, PidRef *ret); int bus_query_sender_pidref(sd_bus_message *m, PidRef *ret); + +int bus_message_read_id128(sd_bus_message *m, sd_id128_t *ret);