]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
bus-util: dedup bus_set_address_capsule 31960/head
authorMike Yuan <me@yhndnzj.com>
Tue, 26 Mar 2024 12:59:32 +0000 (20:59 +0800)
committerMike Yuan <me@yhndnzj.com>
Tue, 26 Mar 2024 13:40:10 +0000 (21:40 +0800)
Follow-up for ad963c3f5680796ccd094b81f35ff7aa20b57247

src/shared/bus-util.c

index 842e747c50879738ac04eb05bafc5c0e7c485e58..9a480aa0e3acd99a6c737ba2639bad47da5e27ab 100644 (file)
@@ -280,6 +280,8 @@ static int pin_capsule_socket(const char *capsule, const char *suffix, uid_t *re
 
         assert(capsule);
         assert(suffix);
+        assert(ret_uid);
+        assert(ret_gid);
 
         p = path_join("/run/capsules", capsule, suffix);
         if (!p)
@@ -291,7 +293,7 @@ static int pin_capsule_socket(const char *capsule, const char *suffix, uid_t *re
                 return r;
 
         if (fstat(inode_fd, &st) < 0)
-                return -errno;
+                return negative_errno();
 
         /* Paranoid safety check */
         if (uid_is_system(st.st_uid) || gid_is_system(st.st_gid))
@@ -303,16 +305,20 @@ static int pin_capsule_socket(const char *capsule, const char *suffix, uid_t *re
         return TAKE_FD(inode_fd);
 }
 
-int bus_connect_capsule_systemd(const char *capsule, sd_bus **ret_bus) {
-        _cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL;
+static int bus_set_address_capsule(sd_bus *bus, const char *capsule, const char *suffix, int *ret_pin_fd) {
         _cleanup_close_ int inode_fd = -EBADF;
         _cleanup_free_ char *pp = NULL;
         uid_t uid;
         gid_t gid;
         int r;
 
+        assert(bus);
         assert(capsule);
-        assert(ret_bus);
+        assert(suffix);
+        assert(ret_pin_fd);
+
+        /* Connects to a capsule's user bus. We need to do so under the capsule's UID/GID, otherwise
+         * the service manager might refuse our connection. Hence fake it. */
 
         r = capsule_name_is_valid(capsule);
         if (r < 0)
@@ -320,10 +326,7 @@ int bus_connect_capsule_systemd(const char *capsule, sd_bus **ret_bus) {
         if (r == 0)
                 return -EINVAL;
 
-        /* Connects to a capsule's user bus. We need to do so under the capsule's UID/GID, otherwise the
-         * the service manager might refuse our connection. Hence fake it. */
-
-        inode_fd = pin_capsule_socket(capsule, "systemd/private", &uid, &gid);
+        inode_fd = pin_capsule_socket(capsule, suffix, &uid, &gid);
         if (inode_fd < 0)
                 return inode_fd;
 
@@ -331,50 +334,38 @@ int bus_connect_capsule_systemd(const char *capsule, sd_bus **ret_bus) {
         if (!pp)
                 return -ENOMEM;
 
-        r = sd_bus_new(&bus);
-        if (r < 0)
-                return r;
-
         if (asprintf(&bus->address, "unix:path=%s,uid=" UID_FMT ",gid=" GID_FMT, pp, uid, gid) < 0)
                 return -ENOMEM;
 
-        r = sd_bus_start(bus);
-        if (r < 0)
-                return r;
-
-        *ret_bus = TAKE_PTR(bus);
+        *ret_pin_fd = TAKE_FD(inode_fd); /* This fd must be kept pinned until the connection has been established */
         return 0;
 }
 
 int bus_set_address_capsule_bus(sd_bus *bus, const char *capsule, int *ret_pin_fd) {
-        _cleanup_free_ char *pp = NULL;
+        return bus_set_address_capsule(bus, capsule, "bus", ret_pin_fd);
+}
+
+int bus_connect_capsule_systemd(const char *capsule, sd_bus **ret_bus) {
+        _cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL;
         _cleanup_close_ int inode_fd = -EBADF;
-        uid_t uid;
-        gid_t gid;
         int r;
 
-        assert(bus);
         assert(capsule);
-        assert(ret_pin_fd);
+        assert(ret_bus);
 
-        r = capsule_name_is_valid(capsule);
+        r = sd_bus_new(&bus);
         if (r < 0)
                 return r;
-        if (r == 0)
-                return -EINVAL;
-
-        inode_fd = pin_capsule_socket(capsule, "bus", &uid, &gid);
-        if (inode_fd < 0)
-                return inode_fd;
 
-        pp = bus_address_escape(FORMAT_PROC_FD_PATH(inode_fd));
-        if (!pp)
-                return -ENOMEM;
+        r = bus_set_address_capsule(bus, capsule, "systemd/private", &inode_fd);
+        if (r < 0)
+                return r;
 
-        if (asprintf(&bus->address, "unix:path=%s,uid=" UID_FMT ",gid=" GID_FMT, pp, uid, gid) < 0)
-                return -ENOMEM;
+        r = sd_bus_start(bus);
+        if (r < 0)
+                return r;
 
-        *ret_pin_fd = TAKE_FD(inode_fd); /* This fd must be kept pinned until the connection has been established */
+        *ret_bus = TAKE_PTR(bus);
         return 0;
 }