X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flogin%2Flogind-seat-dbus.c;h=585e0c15c33feed5c6d343ed687b5252ed077fb6;hp=3a916eef78f6606de65e03e05c04cd7cbe0840ff;hb=ce0fc5f5f6debc6e37ac3ab0a3ea1c9c35b3ed99;hpb=4bba9156da3e1df2cee24d10d7cd88c776ef4179 diff --git a/src/login/logind-seat-dbus.c b/src/login/logind-seat-dbus.c index 3a916eef7..585e0c15c 100644 --- a/src/login/logind-seat-dbus.c +++ b/src/login/logind-seat-dbus.c @@ -6,16 +6,16 @@ Copyright 2011 Lennart Poettering systemd is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. systemd is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + Lesser General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Lesser General Public License along with systemd; If not, see . ***/ @@ -36,6 +36,8 @@ " \n" \ " \n" \ " \n" \ + " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ @@ -133,7 +135,7 @@ static int bus_seat_append_sessions(DBusMessageIter *i, const char *property, vo return 0; } -static int bus_seat_append_multi_session(DBusMessageIter *i, const char *property, void *data) { +static int bus_seat_append_can_multi_session(DBusMessageIter *i, const char *property, void *data) { Seat *s = data; dbus_bool_t b; @@ -141,7 +143,39 @@ static int bus_seat_append_multi_session(DBusMessageIter *i, const char *propert assert(property); assert(s); - b = seat_is_vtconsole(s); + b = seat_can_multi_session(s); + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &b)) + return -ENOMEM; + + return 0; +} + +static int bus_seat_append_can_tty(DBusMessageIter *i, const char *property, void *data) { + Seat *s = data; + dbus_bool_t b; + + assert(i); + assert(property); + assert(s); + + b = seat_can_tty(s); + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &b)) + return -ENOMEM; + + return 0; +} + +static int bus_seat_append_can_graphical(DBusMessageIter *i, const char *property, void *data) { + Seat *s = data; + dbus_bool_t b; + + assert(i); + assert(property); + assert(s); + + b = seat_can_graphical(s); if (!dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, &b)) return -ENOMEM; @@ -207,24 +241,26 @@ static int get_seat_for_path(Manager *m, const char *path, Seat **_s) { return 0; } +static const BusProperty bus_login_seat_properties[] = { + { "Id", bus_property_append_string, "s", offsetof(Seat, id), true }, + { "ActiveSession", bus_seat_append_active, "(so)", 0 }, + { "CanMultiSession", bus_seat_append_can_multi_session, "b", 0 }, + { "CanTTY", bus_seat_append_can_tty, "b", 0 }, + { "CanGraphical", bus_seat_append_can_graphical, "b", 0 }, + { "Sessions", bus_seat_append_sessions, "a(so)", 0 }, + { "IdleHint", bus_seat_append_idle_hint, "b", 0 }, + { "IdleSinceHint", bus_seat_append_idle_hint_since, "t", 0 }, + { "IdleSinceHintMonotonic", bus_seat_append_idle_hint_since, "t", 0 }, + { NULL, } +}; + static DBusHandlerResult seat_message_dispatch( Seat *s, DBusConnection *connection, DBusMessage *message) { - const BusProperty properties[] = { - { "org.freedesktop.login1.Seat", "Id", bus_property_append_string, "s", s->id }, - { "org.freedesktop.login1.Seat", "ActiveSession", bus_seat_append_active, "(so)", s }, - { "org.freedesktop.login1.Seat", "CanMultiSession", bus_seat_append_multi_session, "b", s }, - { "org.freedesktop.login1.Seat", "Sessions", bus_seat_append_sessions, "a(so)", s }, - { "org.freedesktop.login1.Seat", "IdleHint", bus_seat_append_idle_hint, "b", s }, - { "org.freedesktop.login1.Seat", "IdleSinceHint", bus_seat_append_idle_hint_since, "t", s }, - { "org.freedesktop.login1.Seat", "IdleSinceHintMonotonic", bus_seat_append_idle_hint_since, "t", s }, - { NULL, NULL, NULL, NULL, NULL } - }; - DBusError error; - DBusMessage *reply = NULL; + _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; int r; assert(s); @@ -265,22 +301,22 @@ static DBusHandlerResult seat_message_dispatch( reply = dbus_message_new_method_return(message); if (!reply) goto oom; - } else - return bus_default_message_handler(connection, message, INTROSPECTION, INTERFACES_LIST, properties); + } else { + const BusBoundProperties bps[] = { + { "org.freedesktop.login1.Seat", bus_login_seat_properties, s }, + { NULL, } + }; + return bus_default_message_handler(connection, message, INTROSPECTION, INTERFACES_LIST, bps); + } if (reply) { - if (!dbus_connection_send(connection, reply, NULL)) + if (!bus_maybe_send_reply(connection, message, reply)) goto oom; - - dbus_message_unref(reply); } return DBUS_HANDLER_RESULT_HANDLED; oom: - if (reply) - dbus_message_unref(reply); - dbus_error_free(&error); return DBUS_HANDLER_RESULT_NEED_MEMORY; @@ -335,9 +371,9 @@ char *seat_bus_path(Seat *s) { } int seat_send_signal(Seat *s, bool new_seat) { - DBusMessage *m; + _cleanup_dbus_message_unref_ DBusMessage *m = NULL; int r = -ENOMEM; - char *p = NULL; + _cleanup_free_ char *p = NULL; assert(s); @@ -365,16 +401,13 @@ int seat_send_signal(Seat *s, bool new_seat) { r = 0; finish: - dbus_message_unref(m); - free(p); - return r; } int seat_send_changed(Seat *s, const char *properties) { - DBusMessage *m; + _cleanup_dbus_message_unref_ DBusMessage *m = NULL; int r = -ENOMEM; - char *p = NULL; + _cleanup_free_ char *p = NULL; assert(s); @@ -395,9 +428,5 @@ int seat_send_changed(Seat *s, const char *properties) { r = 0; finish: - if (m) - dbus_message_unref(m); - free(p); - return r; }