X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Flogind-dbus.c;h=7e6f6109dc878a3f748945de0ded51379b4aa513;hb=718db96199e;hp=532b48ff6bea2f75aa2a56d9155383bfc1e861db;hpb=dbfa3fbbe423bfaa6b5e864cce51724f8ddfb64f;p=elogind.git diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index 532b48ff6..7e6f6109d 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -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); @@ -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;