summaryrefslogtreecommitdiff
path: root/src/login/logind-seat.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/login/logind-seat.c')
-rw-r--r--src/login/logind-seat.c97
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;