X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flogin%2Flogind-session-dbus.c;h=c4db3155308196a71739ab77fd014e733e01892b;hp=102f8ac99bcf066722148d4db48f4987d4974d2e;hb=c6a818c82035da91e;hpb=55efac6cbcea0d8edda9c6820620ceb390009e7a diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c index 102f8ac99..c4db31553 100644 --- a/src/login/logind-session-dbus.c +++ b/src/login/logind-session-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 . ***/ @@ -40,12 +40,14 @@ " \n" \ " \n" \ " \n" \ + " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ " \n" \ " \n" \ - " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ @@ -53,12 +55,13 @@ " \n" \ " \n" \ " \n" \ - " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ - " \n" \ + " \n" \ " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ @@ -182,12 +185,16 @@ static int bus_session_append_idle_hint_since(DBusMessageIter *i, const char *pr Session *s = data; dual_timestamp t; uint64_t u; + int r; assert(i); assert(property); assert(s); - session_get_idle_hint(s, &t); + r = session_get_idle_hint(s, &t); + if (r < 0) + return r; + u = streq(property, "IdleSinceHint") ? t.realtime : t.monotonic; if (!dbus_message_iter_append_basic(i, DBUS_TYPE_UINT64, &u)) @@ -196,9 +203,45 @@ static int bus_session_append_idle_hint_since(DBusMessageIter *i, const char *pr return 0; } +static int bus_session_append_default_cgroup(DBusMessageIter *i, const char *property, void *data) { + Session *s = data; + char *t; + int r; + bool success; + + assert(i); + assert(property); + assert(s); + + r = cg_join_spec(SYSTEMD_CGROUP_CONTROLLER, s->cgroup_path, &t); + if (r < 0) + return r; + + success = dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &t); + free(t); + + return success ? 0 : -ENOMEM; +} + static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_session_append_type, session_type, SessionType); static DEFINE_BUS_PROPERTY_APPEND_ENUM(bus_session_append_class, session_class, SessionClass); +static int bus_session_append_state(DBusMessageIter *i, const char *property, void *data) { + Session *s = data; + const char *state; + + assert(i); + assert(property); + assert(s); + + state = session_state_to_string(session_get_state(s)); + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &state)) + return -ENOMEM; + + return 0; +} + static int get_session_for_path(Manager *m, const char *path, Session **_s) { Session *s; char *id; @@ -228,7 +271,7 @@ static const BusProperty bus_login_session_properties[] = { { "Id", bus_property_append_string, "s", offsetof(Session, id), true }, { "Timestamp", bus_property_append_usec, "t", offsetof(Session, timestamp.realtime) }, { "TimestampMonotonic", bus_property_append_usec, "t", offsetof(Session, timestamp.monotonic) }, - { "ControlGroupPath", bus_property_append_string, "s", offsetof(Session, cgroup_path), true }, + { "DefaultControlGroup", bus_session_append_default_cgroup, "s", 0, }, { "VTNr", bus_property_append_uint32, "u", offsetof(Session, vtnr) }, { "Seat", bus_session_append_seat, "(so)", 0 }, { "TTY", bus_property_append_string, "s", offsetof(Session, tty), true }, @@ -242,6 +285,7 @@ static const BusProperty bus_login_session_properties[] = { { "Type", bus_session_append_type, "s", offsetof(Session, type) }, { "Class", bus_session_append_class, "s", offsetof(Session, class) }, { "Active", bus_session_append_active, "b", 0 }, + { "State", bus_session_append_state, "s", 0 }, { "Controllers", bus_property_append_strv, "as", offsetof(Session, controllers), true }, { "ResetControllers", bus_property_append_strv, "as", offsetof(Session, reset_controllers), true }, { "KillProcesses", bus_property_append_bool, "b", offsetof(Session, kill_processes) }, @@ -368,7 +412,7 @@ static DBusHandlerResult session_message_dispatch( } if (reply) { - if (!dbus_connection_send(connection, reply, NULL)) + if (!bus_maybe_send_reply(connection, message, reply)) goto oom; dbus_message_unref(reply); @@ -526,3 +570,21 @@ int session_send_lock(Session *s, bool lock) { return 0; } + +int session_send_lock_all(Manager *m, bool lock) { + Session *session; + Iterator i; + int r = 0; + + assert(m); + + HASHMAP_FOREACH(session, m->sessions, i) { + int k; + + k = session_send_lock(session, lock); + if (k < 0) + r = k; + } + + return r; +}