chiark / gitweb /
bus: catch up with kdbus changes (ABI break)
[elogind.git] / src / bus-driverd / bus-driverd.c
index 319596a40bdfc599327b7e65ebcb97d069564d28..4756c481bd60b15709da35a892c21c26598d2aed 100644 (file)
@@ -29,7 +29,6 @@
 #include <sys/un.h>
 #include <sys/timex.h>
 #include <sys/utsname.h>
-#include <unistd.h>
 
 #include "kdbus.h"
 #include "sd-bus.h"
@@ -365,23 +364,18 @@ finish:
         return r;
 }
 
-static int get_creds(sd_bus *bus, sd_bus_message *m, uint64_t mask, sd_bus_creds **_creds, sd_bus_error *error) {
+static int get_creds_by_name(sd_bus *bus, const char *name, uint64_t mask, sd_bus_creds **_creds, sd_bus_error *error) {
         _cleanup_bus_creds_unref_ sd_bus_creds *c = NULL;
-        const char *name;
         int r;
 
         assert(bus);
-        assert(m);
+        assert(name);
         assert(_creds);
 
-        r = sd_bus_message_read(m, "s", &name);
-        if (r < 0)
-                return r;
-
         assert_return(service_name_is_valid(name), -EINVAL);
 
         r = sd_bus_get_owner(bus, name, mask, &c);
-        if (r == -ENOENT || r == -ENXIO)
+        if (r == -ESRCH || r == -ENXIO)
                 return sd_bus_error_setf(error, SD_BUS_ERROR_NAME_HAS_NO_OWNER, "Name %s is currently not owned by anyone.", name);
         if (r < 0)
                 return r;
@@ -395,12 +389,28 @@ static int get_creds(sd_bus *bus, sd_bus_message *m, uint64_t mask, sd_bus_creds
         return 0;
 }
 
+
+static int get_creds_by_message(sd_bus *bus, sd_bus_message *m, uint64_t mask, sd_bus_creds **_creds, sd_bus_error *error) {
+        const char *name;
+        int r;
+
+        assert(bus);
+        assert(m);
+        assert(_creds);
+
+        r = sd_bus_message_read(m, "s", &name);
+        if (r < 0)
+                return r;
+
+        return get_creds_by_name(bus, name, mask, _creds, error);
+}
+
 static int driver_get_security_context(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {
         _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
         _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
         int r;
 
-        r = get_creds(bus, m, SD_BUS_CREDS_SELINUX_CONTEXT, &creds, error);
+        r = get_creds_by_message(bus, m, SD_BUS_CREDS_SELINUX_CONTEXT, &creds, error);
         if (r < 0)
                 return r;
 
@@ -419,7 +429,7 @@ static int driver_get_pid(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus
         _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
         int r;
 
-        r = get_creds(bus, m, SD_BUS_CREDS_PID, &creds, error);
+        r = get_creds_by_message(bus, m, SD_BUS_CREDS_PID, &creds, error);
         if (r < 0)
                 return r;
 
@@ -430,7 +440,7 @@ static int driver_get_user(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bu
         _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
         int r;
 
-        r = get_creds(bus, m, SD_BUS_CREDS_UID, &creds, error);
+        r = get_creds_by_message(bus, m, SD_BUS_CREDS_UID, &creds, error);
         if (r < 0)
                 return r;
 
@@ -439,9 +449,20 @@ static int driver_get_user(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bu
 
 static int driver_get_name_owner(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *error) {
         _cleanup_bus_creds_unref_ sd_bus_creds *creds = NULL;
+        const char *name;
         int r;
 
-        r = get_creds(bus, m, SD_BUS_CREDS_UNIQUE_NAME, &creds, error);
+        r = sd_bus_message_read(m, "s", &name);
+        if (r < 0)
+                return r;
+
+        /* Here's a special exception for compatibility with dbus1:
+         * the bus name of the driver is owned by itself, not by a
+         * unique ID. */
+        if (streq(name, "org.freedesktop.DBus"))
+                return sd_bus_reply_method_return(m, "s", "org.freedesktop.DBus");
+
+        r = get_creds_by_name(bus, name, SD_BUS_CREDS_UNIQUE_NAME, &creds, error);
         if (r < 0)
                 return r;
 
@@ -541,11 +562,9 @@ static int driver_list_queued_owners(sd_bus *bus, sd_bus_message *m, void *userd
                 if (asprintf(&n, ":1.%llu", (unsigned long long) name->owner_id) < 0)
                         return -ENOMEM;
 
-                r = strv_push(&owners, n);
-                if (r < 0) {
-                        free(n);
-                        return -ENOMEM;
-                }
+                r = strv_consume(&owners, n);
+                if (r < 0)
+                        return r;
         }
 
         r = ioctl(bus->input_fd, KDBUS_CMD_FREE, &cmd.offset);
@@ -566,7 +585,7 @@ static int driver_name_has_owner(sd_bus *bus, sd_bus_message *m, void *userdata,
         assert_return(service_name_is_valid(name), -EINVAL);
 
         r = sd_bus_get_owner(bus, name, 0, NULL);
-        if (r < 0 && r != -ENOENT && r != -ENXIO)
+        if (r < 0 && r != -ESRCH && r != -ENXIO)
                 return r;
 
         return sd_bus_reply_method_return(m, "b", r >= 0);
@@ -675,7 +694,7 @@ static int driver_start_service_by_name(sd_bus *bus, sd_bus_message *m, void *us
         r = sd_bus_get_owner(bus, name, 0, NULL);
         if (r >= 0)
                 return sd_bus_reply_method_return(m, "u", BUS_START_REPLY_ALREADY_RUNNING);
-        if (r != -ENOENT)
+        if (r != -ESRCH)
                 return r;
 
         u = strappenda(name, ".busname");
@@ -755,11 +774,11 @@ static int driver_update_environment(sd_bus*bus, sd_bus_message *m, void *userda
 
         r = sd_bus_message_new_method_call(
                         bus,
+                        &msg,
                         "org.freedesktop.systemd1",
                         "/org/freedesktop/systemd1",
                         "org.freedesktop.systemd1.Manager",
-                        "SetEnvironment",
-                        &msg);
+                        "SetEnvironment");
         if (r < 0)
                 return r;
 
@@ -847,11 +866,7 @@ static int connect_bus(Context *c) {
 
         assert(c);
 
-        r = cg_pid_get_owner_uid(0, NULL);
-        if (r < 0)
-                r = sd_bus_default_system(&c->bus);
-        else
-                r = sd_bus_default_user(&c->bus);
+        r = sd_bus_default(&c->bus);
         if (r < 0) {
                 log_error("Failed to create bus: %s", strerror(-r));
                 return r;