]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
bus-util: add generic parser for extracting id128 values from bus messages
authorLennart Poettering <lennart@poettering.net>
Fri, 1 Mar 2024 13:47:52 +0000 (14:47 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 1 Mar 2024 21:37:38 +0000 (22:37 +0100)
src/core/dbus-manager.c
src/machine/machinectl.c
src/run/run.c
src/shared/bus-map-properties.c
src/shared/bus-util.c
src/shared/bus-util.h

index 31b2f1daef4e0cba37b897773328c6cd6395b6d3..00fd801cb3ffd046e8104aff0cfb44cc6118f27d 100644 (file)
@@ -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)) {
index a7d04f2f4deebba919aa19e2174bbfb939b0b7ab..b93c73f3cd5dee4dcd16827458a87d03a37eb9bd 100644 (file)
@@ -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));
 
index 5181c18c20151f952ecd1a19f98b2950113d644f..c0c65b2ea1fa12eb5faf8129a7a3f550a9c57003 100644 (file)
@@ -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) {
index 809759db803733f5611225cb8fbd7c725c6ca45a..a4833a5c1ee270f2d765e0c77e9d94ea042f8742 100644 (file)
@@ -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;
 }
 
index eea6c2321af6091aab5f236cb00469e3f9eec96d..88e1249b8edb171af2d3626056e98f37cbd86137 100644 (file)
@@ -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;
+}
index 1004c79406906ee25e3db74287fab1a66f3eee27..d55665f502a3f38ce9afa6f417c80e73b16b2508 100644 (file)
@@ -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);