logind-seat.c revision 718d006a63f773c42106494e823250c48942cf08
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt This file is part of systemd.
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt Copyright 2011 Lennart Poettering
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt systemd is free software; you can redistribute it and/or modify it
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt under the terms of the GNU Lesser General Public License as published by
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt the Free Software Foundation; either version 2.1 of the License, or
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt (at your option) any later version.
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt systemd is distributed in the hope that it will be useful, but
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt WITHOUT ANY WARRANTY; without even the implied warranty of
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt Lesser General Public License for more details.
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt You should have received a copy of the GNU Lesser General Public License
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt along with systemd; If not, see <http://www.gnu.org/licenses/>.
be3a09b7ffe62b52658e77ae4d6638d1b0dae654Patrik Flykt s->state_file = strappend("/run/systemd/seats/", id);
c62c4628d9dbc27effd36143c75abe528f561867Patrik Flykt LIST_REMOVE(Seat, gc_queue, s->manager->seat_gc_queue, s);
c62c4628d9dbc27effd36143c75abe528f561867Patrik Flykt r = mkdir_safe_label("/run/systemd/seats", 0755, 0, 0);
c62c4628d9dbc27effd36143c75abe528f561867Patrik Flykt r = fopen_temporary(s->state_file, &f, &temp_path);
c62c4628d9dbc27effd36143c75abe528f561867Patrik Flykt "# This is private data. Do not parse.\n"
c62c4628d9dbc27effd36143c75abe528f561867Patrik Flykt "IS_VTCONSOLE=%i\n"
c62c4628d9dbc27effd36143c75abe528f561867Patrik Flykt "CAN_MULTI_SESSION=%i\n"
c62c4628d9dbc27effd36143c75abe528f561867Patrik Flykt "CAN_TTY=%i\n"
c62c4628d9dbc27effd36143c75abe528f561867Patrik Flykt "CAN_GRAPHICAL=%i\n",
c62c4628d9dbc27effd36143c75abe528f561867Patrik Flykt "ACTIVE=%s\n"
c62c4628d9dbc27effd36143c75abe528f561867Patrik Flykt "ACTIVE_UID=%lu\n",
c62c4628d9dbc27effd36143c75abe528f561867Patrik Flykt LIST_FOREACH(sessions_by_seat, i, s->sessions) {
18d29550b5fbc4b0de334b8212d05decdd131f1bPatrik Flykt if (ferror(f) || rename(temp_path, s->state_file) < 0) {
c62c4628d9dbc27effd36143c75abe528f561867Patrik Flykt log_error("Failed to save seat data for %s: %s", s->id, strerror(-r));
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt /* There isn't actually anything to read here ... */
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt fd = open_terminal(p, O_RDWR|O_NOCTTY|O_CLOEXEC);
e66040417b52be98d41ba1230f25dea65147e8eePatrik Flykt log_error("Failed to preallocate VT %i: %s", i, strerror(-q));
e66040417b52be98d41ba1230f25dea65147e8eePatrik Flyktint seat_apply_acls(Seat *s, Session *old_active) {
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt !!old_active, old_active ? old_active->user->uid : 0,
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt !!s->active, s->active ? s->active->user->uid : 0);
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt log_error("Failed to apply ACLs: %s", strerror(-r));
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flyktint seat_set_active(Seat *s, Session *session) {
e66040417b52be98d41ba1230f25dea65147e8eePatrik Flykt if (!session || session->user != old_active->user)
be3a09b7ffe62b52658e77ae4d6638d1b0dae654Patrik Flykt lseek(s->manager->console_active_fd, SEEK_SET, 0);
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt k = read(s->manager->console_active_fd, t, sizeof(t)-1);
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt if (k <= 0) {
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt log_error("Failed to read current console: %s", k < 0 ? strerror(-errno) : "EOF");
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt log_error("Hm, /sys/class/tty/tty0/active is badly formatted.");
575ac4c62e417cb3e963f2bee627e3c10b06691dDavid Herrmann log_error("Failed to parse VT number %s", t+3);
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt /* Initialize VT magic stuff */
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt /* Read current VT */
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt /* Save seat data */
NULL);
if (s->started)
seat_send_signal(s, false);
s->started = false;
assert(s);
assert(s);
if (!seat_can_multi_session(s))
assert(s);
assert(s);
if (!seat_is_vtconsole(s))
assert(s);
return seat_is_vtconsole(s);
assert(s);
assert(s);
return seat_has_master_device(s);
bool idle_hint = true;
assert(s);
int ih;
if (ih < 0)
return ih;
if (!ih) {
if (!idle_hint) {
ts = k;
idle_hint = false;
ts = k;
} else if (idle_hint) {
ts = k;
*t = ts;
return idle_hint;
assert(s);
if (seat_is_vtconsole(s))
return seat_has_master_device(s);
assert(s);
if (s->in_gc_queue)
s->in_gc_queue = true;
static bool seat_name_valid_char(char c) {
for (p = name; *p; p++)
if (!seat_name_valid_char(*p))