chiark / gitweb /
core: convert PID 1 to libsystemd-bus
[elogind.git] / src / login / logind-dbus.c
index dcfd25d69b06d9f3c4ee602edb35f2d35ff44096..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);
@@ -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;