X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flogin%2Flogind-dbus.c;h=47459617733da9f6295729173bc442c384e31f66;hp=7ece815155cc4c41d8b16b0b4674bfd9d0b20e25;hb=a4cd87e9dce6d38846f23d44df9e21f322f946df;hpb=556089dc57b10a12a03edd3d3e90ca17398ad206 diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index 7ece81515..474596177 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -450,7 +450,7 @@ static int method_list_inhibitors(sd_bus *bus, sd_bus_message *message, void *us } static int method_create_session(sd_bus *bus, sd_bus_message *message, void *userdata, sd_bus_error *error) { - const char *service, *type, *class, *cseat, *tty, *display, *remote_user, *remote_host; + const char *service, *type, *class, *cseat, *tty, *display, *remote_user, *remote_host, *desktop; uint32_t uid, leader, audit_id = 0; _cleanup_free_ char *id = NULL; Session *session = NULL; @@ -467,7 +467,7 @@ static int method_create_session(sd_bus *bus, sd_bus_message *message, void *use assert(message); assert(m); - r = sd_bus_message_read(message, "uussssussbss", &uid, &leader, &service, &type, &class, &cseat, &vtnr, &tty, &display, &remote, &remote_user, &remote_host); + r = sd_bus_message_read(message, "uusssssussbss", &uid, &leader, &service, &type, &class, &desktop, &cseat, &vtnr, &tty, &display, &remote, &remote_user, &remote_host); if (r < 0) return r; @@ -490,12 +490,19 @@ static int method_create_session(sd_bus *bus, sd_bus_message *message, void *use return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid session class %s", class); } + if (isempty(desktop)) + desktop = NULL; + else { + if (!string_is_safe(desktop)) + return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid desktop string %s", desktop); + } + if (isempty(cseat)) seat = NULL; else { seat = hashmap_get(m->seats, cseat); if (!seat) - return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_SEAT, "No seat '%s' known", seat); + return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_SEAT, "No seat '%s' known", cseat); } if (tty_is_vc(tty)) { @@ -504,7 +511,7 @@ static int method_create_session(sd_bus *bus, sd_bus_message *message, void *use if (!seat) seat = m->seat0; else if (seat != m->seat0) - return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "TTY %s is virtual console but seat %s is not seat0", tty, seat); + return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "TTY %s is virtual console but seat %s is not seat0", tty, seat->id); v = vtnr_from_tty(tty); if (v <= 0) @@ -550,10 +557,10 @@ static int method_create_session(sd_bus *bus, sd_bus_message *message, void *use } if (c == _SESSION_CLASS_INVALID) { - if (!isempty(display) || !isempty(tty)) - c = SESSION_USER; - else + if (t == SESSION_UNSPECIFIED) c = SESSION_BACKGROUND; + else + c = SESSION_USER; } if (leader <= 0) { @@ -687,6 +694,14 @@ static int method_create_session(sd_bus *bus, sd_bus_message *message, void *use } } + if (!isempty(desktop)) { + session->desktop = strdup(desktop); + if (!session->desktop) { + r = -ENOMEM; + goto fail; + } + } + if (seat) { r = seat_attach_session(seat, session); if (r < 0) @@ -1864,7 +1879,7 @@ const sd_bus_vtable manager_vtable[] = { SD_BUS_METHOD("ListUsers", NULL, "a(uso)", method_list_users, SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD("ListSeats", NULL, "a(so)", method_list_seats, SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD("ListInhibitors", NULL, "a(ssssuu)", method_list_inhibitors, SD_BUS_VTABLE_UNPRIVILEGED), - SD_BUS_METHOD("CreateSession", "uussssussbssa(sv)", "soshusub", method_create_session, 0), + SD_BUS_METHOD("CreateSession", "uusssssussbssa(sv)", "soshusub", method_create_session, 0), SD_BUS_METHOD("ReleaseSession", "s", NULL, method_release_session, 0), SD_BUS_METHOD("ActivateSession", "s", NULL, method_activate_session, SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD("ActivateSessionOnSeat", "ss", NULL, method_activate_session_on_seat, SD_BUS_VTABLE_UNPRIVILEGED), @@ -1971,6 +1986,20 @@ int match_job_removed(sd_bus *bus, sd_bus_message *message, void *userdata, sd_b user->slice_job = NULL; } + LIST_FOREACH(sessions_by_user, session, user->sessions) { + if (!session->started) + continue; + + if (streq(result, "done")) + session_send_create_reply(session, NULL); + else { + _cleanup_bus_error_free_ sd_bus_error e = SD_BUS_ERROR_NULL; + + sd_bus_error_setf(&e, BUS_ERROR_JOB_FAILED, "Start job for unit %s failed with '%s'", unit, result); + session_send_create_reply(session, &e); + } + } + user_save(user); user_add_to_gc_queue(user); }