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=2cc4d8587bff6452f6fee64142deea0efcdbe6b9;hp=91037812896d3451a2e26876ebce75e4e760baa6;hb=76e665855edef5b7103cb09d114377d477bfae02;hpb=0604381b9dbef4cc498b5a77311e1da99c1430b8 diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c index 910378128..2cc4d8587 100644 --- a/src/login/logind-session-dbus.c +++ b/src/login/logind-session-dbus.c @@ -40,12 +40,13 @@ " \n" \ " \n" \ " \n" \ + " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ " \n" \ " \n" \ - " \n" \ " \n" \ " \n" \ " \n" \ @@ -54,15 +55,13 @@ " \n" \ " \n" \ " \n" \ + " \n" \ " \n" \ " \n" \ " \n" \ " \n" \ " \n" \ " \n" \ - " \n" \ - " \n" \ - " \n" \ " \n" \ " \n" \ " \n" \ @@ -106,12 +105,8 @@ static int bus_session_append_seat(DBusMessageIter *i, const char *property, voi } if (!dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &id) || - !dbus_message_iter_append_basic(&sub, DBUS_TYPE_OBJECT_PATH, &path)) { - free(p); + !dbus_message_iter_append_basic(&sub, DBUS_TYPE_OBJECT_PATH, &path)) return -ENOMEM; - } - - free(p); if (!dbus_message_iter_close_container(i, &sub)) return -ENOMEM; @@ -122,7 +117,7 @@ static int bus_session_append_seat(DBusMessageIter *i, const char *property, voi static int bus_session_append_user(DBusMessageIter *i, const char *property, void *data) { DBusMessageIter sub; User *u = data; - char *p = NULL; + _cleanup_free_ char *p = NULL; assert(i); assert(property); @@ -136,12 +131,8 @@ static int bus_session_append_user(DBusMessageIter *i, const char *property, voi return -ENOMEM; if (!dbus_message_iter_append_basic(&sub, DBUS_TYPE_UINT32, &u->uid) || - !dbus_message_iter_append_basic(&sub, DBUS_TYPE_OBJECT_PATH, &p)) { - free(p); + !dbus_message_iter_append_basic(&sub, DBUS_TYPE_OBJECT_PATH, &p)) return -ENOMEM; - } - - free(p); if (!dbus_message_iter_close_container(i, &sub)) return -ENOMEM; @@ -183,12 +174,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)) @@ -197,26 +192,6 @@ 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); @@ -237,8 +212,8 @@ static int bus_session_append_state(DBusMessageIter *i, const char *property, vo } static int get_session_for_path(Manager *m, const char *path, Session **_s) { + _cleanup_free_ char *id = NULL; Session *s; - char *id; assert(m); assert(path); @@ -252,8 +227,6 @@ static int get_session_for_path(Manager *m, const char *path, Session **_s) { return -ENOMEM; s = hashmap_get(m->sessions, id); - free(id); - if (!s) return -ENOENT; @@ -265,7 +238,6 @@ 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) }, - { "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 }, @@ -274,15 +246,13 @@ static const BusProperty bus_login_session_properties[] = { { "RemoteUser", bus_property_append_string, "s", offsetof(Session, remote_user), true }, { "RemoteHost", bus_property_append_string, "s", offsetof(Session, remote_host), true }, { "Service", bus_property_append_string, "s", offsetof(Session, service), true }, + { "Scope", bus_property_append_string, "s", offsetof(Session, scope), true }, { "Leader", bus_property_append_pid, "u", offsetof(Session, leader) }, { "Audit", bus_property_append_uint32, "u", offsetof(Session, audit_id) }, { "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) }, { "IdleHint", bus_session_append_idle_hint, "b", 0 }, { "IdleSinceHint", bus_session_append_idle_hint_since, "t", 0 }, { "IdleSinceHintMonotonic", bus_session_append_idle_hint_since, "t", 0 }, @@ -301,7 +271,7 @@ static DBusHandlerResult session_message_dispatch( DBusMessage *message) { DBusError error; - DBusMessage *reply = NULL; + _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; int r; assert(s); @@ -406,18 +376,13 @@ 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); } return DBUS_HANDLER_RESULT_HANDLED; oom: - if (reply) - dbus_message_unref(reply); - dbus_error_free(&error); return DBUS_HANDLER_RESULT_NEED_MEMORY; @@ -457,7 +422,7 @@ const DBusObjectPathVTable bus_session_vtable = { }; char *session_bus_path(Session *s) { - char *t, *r; + _cleanup_free_ char *t = NULL; assert(s); @@ -465,16 +430,12 @@ char *session_bus_path(Session *s) { if (!t) return NULL; - r = strappend("/org/freedesktop/login1/session/", t); - free(t); - - return r; + return strappend("/org/freedesktop/login1/session/", t); } int session_send_signal(Session *s, bool new_session) { - DBusMessage *m; - int r = -ENOMEM; - char *p = NULL; + _cleanup_dbus_message_unref_ DBusMessage *m = NULL; + _cleanup_free_ char *p = NULL; assert(s); @@ -487,31 +448,24 @@ int session_send_signal(Session *s, bool new_session) { p = session_bus_path(s); if (!p) - goto finish; + return -ENOMEM; if (!dbus_message_append_args( m, DBUS_TYPE_STRING, &s->id, DBUS_TYPE_OBJECT_PATH, &p, DBUS_TYPE_INVALID)) - goto finish; + return -ENOMEM; if (!dbus_connection_send(s->manager->bus, m, NULL)) - goto finish; - - r = 0; - -finish: - dbus_message_unref(m); - free(p); + return -ENOMEM; - return r; + return 0; } int session_send_changed(Session *s, const char *properties) { - DBusMessage *m; - int r = -ENOMEM; - char *p = NULL; + _cleanup_dbus_message_unref_ DBusMessage *m = NULL; + _cleanup_free_ char *p = NULL; assert(s); @@ -524,25 +478,18 @@ int session_send_changed(Session *s, const char *properties) { m = bus_properties_changed_new(p, "org.freedesktop.login1.Session", properties); if (!m) - goto finish; + return -ENOMEM; if (!dbus_connection_send(s->manager->bus, m, NULL)) - goto finish; - - r = 0; - -finish: - if (m) - dbus_message_unref(m); - free(p); + return -ENOMEM; - return r; + return 0; } int session_send_lock(Session *s, bool lock) { - DBusMessage *m; + _cleanup_dbus_message_unref_ DBusMessage *m = NULL; bool b; - char *p; + _cleanup_free_ char *p = NULL; assert(s); @@ -551,16 +498,109 @@ int session_send_lock(Session *s, bool lock) { return -ENOMEM; m = dbus_message_new_signal(p, "org.freedesktop.login1.Session", lock ? "Lock" : "Unlock"); - free(p); if (!m) return -ENOMEM; b = dbus_connection_send(s->manager->bus, m, NULL); - dbus_message_unref(m); - if (!b) return -ENOMEM; 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; +} + +int session_send_create_reply(Session *s, DBusError *error) { + _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; + + assert(s); + + if (!s->create_message) + return 0; + + /* This is called after the session scope was successfully + * created, and finishes where bus_manager_create_session() + * left off. */ + + if (error) { + DBusError buffer; + + dbus_error_init(&buffer); + + if (!dbus_error_is_set(error)) { + dbus_set_error_const(&buffer, DBUS_ERROR_INVALID_ARGS, "Invalid Arguments"); + error = &buffer; + } + + reply = dbus_message_new_error(s->create_message, error->name, error->message); + dbus_error_free(&buffer); + + if (!reply) + return log_oom(); + } else { + _cleanup_close_ int fifo_fd = -1; + _cleanup_free_ char *path = NULL; + const char *cseat; + uint32_t vtnr; + dbus_bool_t exists; + + fifo_fd = session_create_fifo(s); + if (fifo_fd < 0) { + log_error("Failed to create fifo: %s", strerror(-fifo_fd)); + return fifo_fd; + } + + path = session_bus_path(s); + if (!path) + return log_oom(); + + reply = dbus_message_new_method_return(s->create_message); + if (!reply) + return log_oom(); + + cseat = s->seat ? s->seat->id : ""; + vtnr = s->vtnr; + exists = false; + + if (!dbus_message_append_args( + reply, + DBUS_TYPE_STRING, &s->id, + DBUS_TYPE_OBJECT_PATH, &path, + DBUS_TYPE_STRING, &s->user->runtime_path, + DBUS_TYPE_UNIX_FD, &fifo_fd, + DBUS_TYPE_STRING, &cseat, + DBUS_TYPE_UINT32, &vtnr, + DBUS_TYPE_BOOLEAN, &exists, + DBUS_TYPE_INVALID)) + return log_oom(); + } + + /* Update the state file before we notify the client about the + * result */ + session_save(s); + + if (!dbus_connection_send(s->manager->bus, reply, NULL)) + return log_oom(); + + dbus_message_unref(s->create_message); + s->create_message = NULL; + + return 0; +}