machine: split out manager_acquire_image() from image_object_find()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 17 May 2024 20:31:16 +0000 (05:31 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 19 May 2024 16:03:14 +0000 (01:03 +0900)
Preparation for the next commit. No functional change.

src/machine/image-dbus.c
src/machine/image-dbus.h

index 69039de2e6c3fe645d7a60dd65687c5ee0a34474..801ecd419a1a4f21c8b9fe5adafd2a9c3a003c9d 100644 (file)
@@ -378,30 +378,17 @@ static int image_flush_cache(sd_event_source *s, void *userdata) {
         return 0;
 }
 
-static int image_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
-        _cleanup_free_ char *e = NULL;
-        Manager *m = userdata;
-        Image *image = NULL;
-        const char *p;
+int manager_acquire_image(Manager *m, const char *name, Image **ret) {
         int r;
 
-        assert(bus);
-        assert(path);
-        assert(interface);
-        assert(found);
+        assert(m);
+        assert(name);
 
-        p = startswith(path, "/org/freedesktop/machine1/image/");
-        if (!p)
+        Image *existing = hashmap_get(m->image_cache, name);
+        if (existing) {
+                if (ret)
+                        *ret = existing;
                 return 0;
-
-        e = bus_label_unescape(p);
-        if (!e)
-                return -ENOMEM;
-
-        image = hashmap_get(m->image_cache, e);
-        if (image) {
-                *found = image;
-                return 1;
         }
 
         if (!m->image_cache_defer_event) {
@@ -418,19 +405,49 @@ static int image_object_find(sd_bus *bus, const char *path, const char *interfac
         if (r < 0)
                 return r;
 
-        r = image_find(IMAGE_MACHINE, e, NULL, &image);
-        if (r == -ENOENT)
-                return 0;
+        _cleanup_(image_unrefp) Image *image = NULL;
+        r = image_find(IMAGE_MACHINE, name, NULL, &image);
         if (r < 0)
                 return r;
 
         image->userdata = m;
 
         r = hashmap_ensure_put(&m->image_cache, &image_hash_ops, image->name, image);
-        if (r < 0) {
-                image_unref(image);
+        if (r < 0)
+                return r;
+
+        if (ret)
+                *ret = image;
+
+        TAKE_PTR(image);
+        return 0;
+}
+
+static int image_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
+        _cleanup_free_ char *e = NULL;
+        Manager *m = userdata;
+        Image *image;
+        const char *p;
+        int r;
+
+        assert(bus);
+        assert(path);
+        assert(interface);
+        assert(found);
+
+        p = startswith(path, "/org/freedesktop/machine1/image/");
+        if (!p)
+                return 0;
+
+        e = bus_label_unescape(p);
+        if (!e)
+                return -ENOMEM;
+
+        r = manager_acquire_image(m, e, &image);
+        if (r == -ENOENT)
+                return 0;
+        if (r < 0)
                 return r;
-        }
 
         *found = image;
         return 1;
index 4b00203bff2f526e8c98752c2d6ebd28a6a7440a..0c4fab1b0a7c9b5ce90d83b0e6e52bc140899e83 100644 (file)
@@ -2,10 +2,12 @@
 #pragma once
 
 #include "bus-object.h"
+#include "discover-image.h"
 #include "machined.h"
 
 extern const BusObjectImplementation image_object;
 
+int manager_acquire_image(Manager *m, const char *name, Image **ret);
 char *image_bus_path(const char *name);
 
 int bus_image_method_remove(sd_bus_message *message, void *userdata, sd_bus_error *error);