diff options
Diffstat (limited to 'src/login/logind-seat.c')
-rw-r--r-- | src/login/logind-seat.c | 97 |
1 files changed, 48 insertions, 49 deletions
diff --git a/src/login/logind-seat.c b/src/login/logind-seat.c index 63253db5bf..c758ffd5fa 100644 --- a/src/login/logind-seat.c +++ b/src/login/logind-seat.c @@ -19,35 +19,45 @@ #include "stdio-util.h" #include "string-util.h" #include "terminal-util.h" +#include "tmpfile-util.h" #include "util.h" -Seat *seat_new(Manager *m, const char *id) { - Seat *s; +int seat_new(Seat** ret, Manager *m, const char *id) { + _cleanup_(seat_freep) Seat *s = NULL; + int r; + assert(ret); assert(m); assert(id); - s = new0(Seat, 1); + if (!seat_name_is_valid(id)) + return -EINVAL; + + s = new(Seat, 1); if (!s) - return NULL; + return -ENOMEM; + + *s = (Seat) { + .manager = m, + }; s->state_file = strappend("/run/systemd/seats/", id); if (!s->state_file) - return mfree(s); + return -ENOMEM; s->id = basename(s->state_file); - s->manager = m; - if (hashmap_put(m->seats, s->id, s) < 0) { - free(s->state_file); - return mfree(s); - } + r = hashmap_put(m->seats, s->id, s); + if (r < 0) + return r; - return s; + *ret = TAKE_PTR(s); + return 0; } -void seat_free(Seat *s) { - assert(s); +Seat* seat_free(Seat *s) { + if (!s) + return NULL; if (s->in_gc_queue) LIST_REMOVE(gc_queue, s->manager->seat_gc_queue, s); @@ -64,7 +74,8 @@ void seat_free(Seat *s) { free(s->positions); free(s->state_file); - free(s); + + return mfree(s); } int seat_save(Seat *s) { @@ -156,8 +167,8 @@ int seat_load(Seat *s) { return 0; } -static int vt_allocate(unsigned int vtnr) { - char p[sizeof("/dev/tty") + DECIMAL_STR_MAX(unsigned int)]; +static int vt_allocate(unsigned vtnr) { + char p[sizeof("/dev/tty") + DECIMAL_STR_MAX(unsigned)]; _cleanup_close_ int fd = -1; assert(vtnr >= 1); @@ -165,7 +176,7 @@ static int vt_allocate(unsigned int vtnr) { xsprintf(p, "/dev/tty%u", vtnr); fd = open_terminal(p, O_RDWR|O_NOCTTY|O_CLOEXEC); if (fd < 0) - return -errno; + return fd; return 0; } @@ -189,10 +200,8 @@ int seat_preallocate_vts(Seat *s) { int q; q = vt_allocate(i); - if (q < 0) { - log_error_errno(q, "Failed to preallocate VT %u: %m", i); - r = q; - } + if (q < 0) + r = log_error_errno(q, "Failed to preallocate VT %u: %m", i); } return r; @@ -203,16 +212,15 @@ int seat_apply_acls(Seat *s, Session *old_active) { assert(s); - r = devnode_acl_all(s->manager->udev, - s->id, + r = devnode_acl_all(s->id, false, !!old_active, old_active ? old_active->user->uid : 0, !!s->active, s->active ? s->active->user->uid : 0); if (r < 0) - log_error_errno(r, "Failed to apply ACLs: %m"); + return log_error_errno(r, "Failed to apply ACLs: %m"); - return r; + return 0; } int seat_set_active(Seat *s, Session *session) { @@ -232,7 +240,7 @@ int seat_set_active(Seat *s, Session *session) { session_send_changed(old_active, "Active", NULL); } - seat_apply_acls(s, old_active); + (void) seat_apply_acls(s, old_active); if (session && session->started) { session_send_changed(session, "Active", NULL); @@ -258,7 +266,7 @@ int seat_set_active(Seat *s, Session *session) { return 0; } -int seat_switch_to(Seat *s, unsigned int num) { +int seat_switch_to(Seat *s, unsigned num) { /* Public session positions skip 0 (there is only F1-F12). Maybe it * will get reassigned in the future, so return error for now. */ if (num == 0) @@ -276,7 +284,7 @@ int seat_switch_to(Seat *s, unsigned int num) { } int seat_switch_to_next(Seat *s) { - unsigned int start, i; + unsigned start, i; if (s->position_count == 0) return -EINVAL; @@ -297,7 +305,7 @@ int seat_switch_to_next(Seat *s) { } int seat_switch_to_previous(Seat *s) { - unsigned int start, i; + unsigned start, i; if (s->position_count == 0) return -EINVAL; @@ -317,7 +325,7 @@ int seat_switch_to_previous(Seat *s) { return -EINVAL; } -int seat_active_vt_changed(Seat *s, unsigned int vtnr) { +int seat_active_vt_changed(Seat *s, unsigned vtnr) { Session *i, *new_active = NULL; int r; @@ -356,8 +364,7 @@ int seat_active_vt_changed(Seat *s, unsigned int vtnr) { int seat_read_active_vt(Seat *s) { char t[64]; ssize_t k; - unsigned int vtnr; - int r; + int vtnr; assert(s); @@ -376,17 +383,9 @@ int seat_read_active_vt(Seat *s) { t[k] = 0; truncate_nl(t); - if (!startswith(t, "tty")) { - log_error("Hm, /sys/class/tty/tty0/active is badly formatted."); - return -EIO; - } - - r = safe_atou(t+3, &vtnr); - if (r < 0) - return log_error_errno(r, "Failed to parse VT number \"%s\": %m", t+3); - - if (!vtnr) { - log_error("VT number invalid: %s", t+3); + vtnr = vtnr_from_tty(t); + if (vtnr < 0) { + log_error_errno(vtnr, "Hm, /sys/class/tty/tty0/active is badly formatted: %m"); return -EIO; } @@ -421,7 +420,7 @@ int seat_start(Seat *s) { } int seat_stop(Seat *s, bool force) { - int r = 0; + int r; assert(s); @@ -431,9 +430,9 @@ int seat_stop(Seat *s, bool force) { "SEAT_ID=%s", s->id, LOG_MESSAGE("Removed seat %s.", s->id)); - seat_stop_sessions(s, force); + r = seat_stop_sessions(s, force); - unlink(s->state_file); + (void) unlink(s->state_file); seat_add_to_gc_queue(s); if (s->started) @@ -461,7 +460,7 @@ int seat_stop_sessions(Seat *s, bool force) { void seat_evict_position(Seat *s, Session *session) { Session *iter; - unsigned int pos = session->position; + unsigned pos = session->position; session->position = 0; @@ -483,7 +482,7 @@ void seat_evict_position(Seat *s, Session *session) { } } -void seat_claim_position(Seat *s, Session *session, unsigned int pos) { +void seat_claim_position(Seat *s, Session *session, unsigned pos) { /* with VTs, the position is always the same as the VTnr */ if (seat_has_vts(s)) pos = session->vtnr; @@ -499,7 +498,7 @@ void seat_claim_position(Seat *s, Session *session, unsigned int pos) { } static void seat_assign_position(Seat *s, Session *session) { - unsigned int pos; + unsigned pos; if (session->position > 0) return; |