X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flogin%2Flogind-session.c;h=f856127eae12300059d560a8b83d52bef64f1d32;hp=a726fb1bedcae8cf195985109ef77094eb972257;hb=bf7825ae69f53a7e80a740547919833e49ed1df4;hpb=5af726cced7f87d6f7b7d6bd1dd5ee44ded5aa7b diff --git a/src/login/logind-session.c b/src/login/logind-session.c index a726fb1be..f856127ea 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -41,6 +41,7 @@ Session* session_new(Manager *m, const char *id) { assert(m); assert(id); + assert(session_id_valid(id)); s = new0(Session, 1); if (!s) @@ -72,6 +73,8 @@ void session_free(Session *s) { if (s->in_gc_queue) LIST_REMOVE(Session, gc_queue, s->manager->session_gc_queue, s); + session_drop_controller(s); + if (s->user) { LIST_REMOVE(Session, sessions_by_user, s->user->sessions, s); @@ -188,7 +191,7 @@ int session_save(Session *s) { if (s->service) fprintf(f, "SERVICE=%s\n", s->service); - if (s->seat && seat_can_multi_session(s->seat)) + if (s->seat && seat_has_vts(s->seat)) fprintf(f, "VTNR=%i\n", s->vtnr); if (s->leader > 0) @@ -298,7 +301,7 @@ int session_load(Session *s) { seat_attach_session(o, s); } - if (vtnr && s->seat && seat_can_multi_session(s->seat)) { + if (vtnr && s->seat && seat_has_vts(s->seat)) { int v; k = safe_atoi(vtnr, &v); @@ -357,12 +360,10 @@ int session_load(Session *s) { } int session_activate(Session *s) { - int r; - assert(s); assert(s->user); - if (s->vtnr < 0) + if (s->vtnr <= 0) return -ENOTSUP; if (!s->seat) @@ -371,13 +372,9 @@ int session_activate(Session *s) { if (s->seat->active == s) return 0; - assert(seat_is_vtconsole(s->seat)); - - r = chvt(s->vtnr); - if (r < 0) - return r; + assert(seat_has_vts(s->seat)); - return seat_set_active(s->seat, s); + return chvt(s->vtnr); } static int session_link_x11_socket(Session *s) { @@ -917,6 +914,52 @@ int session_kill(Session *s, KillWho who, int signo) { return manager_kill_unit(s->manager, s->scope, who, signo, NULL); } +bool session_is_controller(Session *s, const char *sender) +{ + assert(s); + + return streq_ptr(s->controller, sender); +} + +int session_set_controller(Session *s, const char *sender, bool force) { + char *t; + int r; + + assert(s); + assert(sender); + + if (session_is_controller(s, sender)) + return 0; + if (s->controller && !force) + return -EBUSY; + + t = strdup(sender); + if (!t) + return -ENOMEM; + + r = manager_watch_busname(s->manager, sender); + if (r) { + free(t); + return r; + } + + session_drop_controller(s); + + s->controller = t; + return 0; +} + +void session_drop_controller(Session *s) { + assert(s); + + if (!s->controller) + return; + + manager_drop_busname(s->manager, s->controller); + free(s->controller); + s->controller = NULL; +} + static const char* const session_state_table[_SESSION_STATE_MAX] = { [SESSION_OPENING] = "opening", [SESSION_ONLINE] = "online",