chiark / gitweb /
core: convert PID 1 to libsystemd-bus
[elogind.git] / src / login / logind-dbus.c
index 9fe41d8123b693d3411c3b6a657cb0301af761d9..7e6f6109dc878a3f748945de0ded51379b4aa513 100644 (file)
@@ -40,6 +40,7 @@
 #include "bus-util.h"
 #include "bus-error.h"
 #include "logind.h"
+#include "bus-errors.h"
 
 static int property_get_idle_hint(
                 sd_bus *bus,
@@ -157,17 +158,25 @@ static int method_get_session_by_pid(sd_bus *bus, sd_bus_message *message, void
         _cleanup_free_ char *p = NULL;
         Session *session = NULL;
         Manager *m = userdata;
-        uint32_t pid;
+        pid_t pid;
         int r;
 
         assert(bus);
         assert(message);
         assert(m);
 
+        assert_cc(sizeof(pid_t) == sizeof(uint32_t));
+
         r = sd_bus_message_read(message, "u", &pid);
         if (r < 0)
                 return sd_bus_reply_method_errno(bus, message, r, NULL);
 
+        if (pid == 0) {
+                r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid);
+                if (r < 0)
+                        return sd_bus_reply_method_errno(bus, message, r, NULL);
+        }
+
         r = manager_get_session_by_pid(m, pid, &session);
         if (r < 0)
                 return sd_bus_reply_method_errno(bus, message, r, NULL);
@@ -176,7 +185,7 @@ static int method_get_session_by_pid(sd_bus *bus, sd_bus_message *message, void
 
         p = session_bus_path(session);
         if (!p)
-                return sd_bus_reply_method_errno(bus, message, -ENOMEM, NULL);
+                return sd_bus_reply_method_errno(bus, message, ENOMEM, NULL);
 
         return sd_bus_reply_method_return(bus, message, "o", p);
 }
@@ -211,17 +220,25 @@ static int method_get_user_by_pid(sd_bus *bus, sd_bus_message *message, void *us
         _cleanup_free_ char *p = NULL;
         Manager *m = userdata;
         User *user = NULL;
-        uint32_t pid;
+        pid_t pid;
         int r;
 
         assert(bus);
         assert(message);
         assert(m);
 
+        assert_cc(sizeof(pid_t) == sizeof(uint32_t));
+
         r = sd_bus_message_read(message, "u", &pid);
         if (r < 0)
                 return sd_bus_reply_method_errno(bus, message, r, NULL);
 
+        if (pid == 0) {
+                r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid);
+                if (r < 0)
+                        return sd_bus_reply_method_errno(bus, message, r, NULL);
+        }
+
         r = manager_get_user_by_pid(m, pid, &user);
         if (r < 0)
                 return sd_bus_reply_method_errno(bus, message, r, NULL);
@@ -400,7 +417,7 @@ static int method_list_inhibitors(sd_bus *bus, sd_bus_message *message, void *us
 
         HASHMAP_FOREACH(inhibitor, m->inhibitors, i) {
 
-                r = sd_bus_message_append(reply, "ssssuu",
+                r = sd_bus_message_append(reply, "(ssssuu)",
                                           strempty(inhibit_what_to_string(inhibitor->what)),
                                           strempty(inhibitor->who),
                                           strempty(inhibitor->why),
@@ -1369,7 +1386,7 @@ static int send_prepare_for(Manager *m, InhibitWhat w, bool _active) {
                                   "org.freedesktop.login1.Manager",
                                   signal_name[w],
                                   "b",
-                                  &active);
+                                  active);
 }
 
 int bus_manager_shutdown_or_sleep_now_or_later(
@@ -2200,7 +2217,7 @@ int manager_start_scope(
         if (r < 0)
                 return r;
 
-        r = sd_bus_send_with_reply_and_block(manager->bus, m, 0, error, &reply);
+        r = sd_bus_call(manager->bus, m, 0, error, &reply);
         if (r < 0)
                 return r;