X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flogin%2Flogind-seat-dbus.c;h=f274c0d6396f47f804235788af7c166d79968bcd;hb=71a6151083d842b2f5bf04e50239f0bf85d34d2e;hp=e9f8d2637e7f61284a1664d2646d828a521b726b;hpb=cc3773810855956bad92337cee8fa193584ab62e;p=elogind.git diff --git a/src/login/logind-seat-dbus.c b/src/login/logind-seat-dbus.c index e9f8d2637..f274c0d63 100644 --- a/src/login/logind-seat-dbus.c +++ b/src/login/logind-seat-dbus.c @@ -25,6 +25,7 @@ #include "util.h" #include "bus-util.h" #include "strv.h" +#include "bus-errors.h" #include "logind.h" #include "logind-seat.h" @@ -34,8 +35,8 @@ static int property_get_active_session( const char *interface, const char *property, sd_bus_message *reply, - sd_bus_error *error, - void *userdata) { + void *userdata, + sd_bus_error *error) { _cleanup_free_ char *p = NULL; Seat *s = userdata; @@ -57,8 +58,8 @@ static int property_get_can_multi_session( const char *interface, const char *property, sd_bus_message *reply, - sd_bus_error *error, - void *userdata) { + void *userdata, + sd_bus_error *error) { Seat *s = userdata; @@ -75,8 +76,8 @@ static int property_get_can_tty( const char *interface, const char *property, sd_bus_message *reply, - sd_bus_error *error, - void *userdata) { + void *userdata, + sd_bus_error *error) { Seat *s = userdata; @@ -93,8 +94,8 @@ static int property_get_can_graphical( const char *interface, const char *property, sd_bus_message *reply, - sd_bus_error *error, - void *userdata) { + void *userdata, + sd_bus_error *error) { Seat *s = userdata; @@ -111,8 +112,8 @@ static int property_get_sessions( const char *interface, const char *property, sd_bus_message *reply, - sd_bus_error *error, - void *userdata) { + void *userdata, + sd_bus_error *error) { Seat *s = userdata; Session *session; @@ -152,8 +153,8 @@ static int property_get_idle_hint( const char *interface, const char *property, sd_bus_message *reply, - sd_bus_error *error, - void *userdata) { + void *userdata, + sd_bus_error *error) { Seat *s = userdata; @@ -170,8 +171,8 @@ static int property_get_idle_since_hint( const char *interface, const char *property, sd_bus_message *reply, - sd_bus_error *error, - void *userdata) { + void *userdata, + sd_bus_error *error) { Seat *s = userdata; dual_timestamp t; @@ -191,7 +192,7 @@ static int property_get_idle_since_hint( return sd_bus_message_append(reply, "t", u); } -static int method_terminate(sd_bus *bus, sd_bus_message *message, void *userdata) { +static int method_terminate(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { Seat *s = userdata; int r; @@ -201,12 +202,12 @@ static int method_terminate(sd_bus *bus, sd_bus_message *message, void *userdata r = seat_stop_sessions(s); if (r < 0) - return sd_bus_reply_method_errno(bus, message, r, NULL); + return r; - return sd_bus_reply_method_return(bus, message, NULL); + return sd_bus_reply_method_return(message, NULL); } -static int method_activate_session(sd_bus *bus, sd_bus_message *message, void *userdata) { +static int method_activate_session(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { Seat *s = userdata; const char *name; Session *session; @@ -218,20 +219,20 @@ static int method_activate_session(sd_bus *bus, sd_bus_message *message, void *u r = sd_bus_message_read(message, "s", &name); if (r < 0) - return sd_bus_reply_method_errno(bus, message, r, NULL); + return r; session = hashmap_get(s->manager->sessions, name); if (!session) - return sd_bus_reply_method_errorf(bus, message, BUS_ERROR_NO_SUCH_SESSION, "No session '%s' known", name); + return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_SESSION, "No session '%s' known", name); if (session->seat != s) - return sd_bus_reply_method_errorf(bus, message, BUS_ERROR_SESSION_NOT_ON_SEAT, "Session %s not on seat %s", name, s->id); + return sd_bus_error_setf(error, BUS_ERROR_SESSION_NOT_ON_SEAT, "Session %s not on seat %s", name, s->id); r = session_activate(session); if (r < 0) - return sd_bus_reply_method_errno(bus, message, r, NULL); + return r; - return sd_bus_reply_method_return(bus, message, NULL); + return sd_bus_reply_method_return(message, NULL); } const sd_bus_vtable seat_vtable[] = { @@ -253,11 +254,10 @@ const sd_bus_vtable seat_vtable[] = { SD_BUS_VTABLE_END }; -int seat_object_find(sd_bus *bus, const char *path, const char *interface, void **found, void *userdata) { - _cleanup_free_ char *e = NULL; +int seat_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) { Manager *m = userdata; Seat *seat; - const char *p; + int r; assert(bus); assert(path); @@ -265,17 +265,43 @@ int seat_object_find(sd_bus *bus, const char *path, const char *interface, void assert(found); assert(m); - p = startswith(path, "/org/freedesktop/login1/seat/"); - if (!p) - return 0; + if (streq(path, "/org/freedesktop/login1/seat/self")) { + sd_bus_message *message; + Session *session; + pid_t pid; - e = bus_path_unescape(p); - if (!e) - return -ENOMEM; + message = sd_bus_get_current(bus); + if (!message) + return 0; - seat = hashmap_get(m->seats, e); - if (!seat) - return 0; + r = sd_bus_get_owner_pid(bus, sd_bus_message_get_sender(message), &pid); + if (r < 0) + return 0; + + r = manager_get_session_by_pid(m, pid, &session); + if (r <= 0) + return 0; + + if (!session->seat) + return 0; + + seat = session->seat; + } else { + _cleanup_free_ char *e = NULL; + const char *p; + + p = startswith(path, "/org/freedesktop/login1/seat/"); + if (!p) + return 0; + + e = sd_bus_label_unescape(p); + if (!e) + return -ENOMEM; + + seat = hashmap_get(m->seats, e); + if (!seat) + return 0; + } *found = seat; return 1; @@ -286,14 +312,14 @@ char *seat_bus_path(Seat *s) { assert(s); - t = bus_path_escape(s->id); + t = sd_bus_label_escape(s->id); if (!t) return NULL; return strappend("/org/freedesktop/login1/seat/", t); } -int seat_node_enumerator(sd_bus *bus, const char *path, char ***nodes, void *userdata) { +int seat_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error) { _cleanup_strv_free_ char **l = NULL; Manager *m = userdata; Seat *seat;