fprintf(f,
"ACTIVE=%s\n"
- "ACTIVE_UID=%lu\n",
+ "ACTIVE_UID="UID_FMT"\n",
s->active->id,
- (unsigned long) s->active->user->uid);
+ s->active->user->uid);
}
if (s->sessions) {
fputs("UIDS=", f);
LIST_FOREACH(sessions_by_seat, i, s->sessions)
fprintf(f,
- "%lu%c",
- (unsigned long) i->user->uid,
+ UID_FMT"%c",
+ i->user->uid,
i->sessions_by_seat_next ? ' ' : '\n');
}
finish:
if (r < 0)
- log_error("Failed to save seat data for %s: %s", s->id, strerror(-r));
+ log_error("Failed to save seat data %s: %s", s->state_file, strerror(-r));
return r;
}
}
static int vt_allocate(unsigned int vtnr) {
- _cleanup_free_ char *p = NULL;
+ char p[sizeof("/dev/tty") + DECIMAL_STR_MAX(unsigned int)];
_cleanup_close_ int fd = -1;
assert(vtnr >= 1);
- if (asprintf(&p, "/dev/tty%u", vtnr) < 0)
- return -ENOMEM;
-
+ snprintf(p, sizeof(p), "/dev/tty%u", vtnr);
fd = open_terminal(p, O_RDWR|O_NOCTTY|O_CLOEXEC);
if (fd < 0)
return -errno;
return 0;
}
-int seat_stop(Seat *s) {
+int seat_stop(Seat *s, bool force) {
int r = 0;
assert(s);
"MESSAGE=Removed seat %s.", s->id,
NULL);
- seat_stop_sessions(s);
+ seat_stop_sessions(s, force);
unlink(s->state_file);
seat_add_to_gc_queue(s);
return r;
}
-int seat_stop_sessions(Seat *s) {
+int seat_stop_sessions(Seat *s, bool force) {
Session *session;
int r = 0, k;
assert(s);
LIST_FOREACH(sessions_by_seat, session, s->sessions) {
- k = session_stop(session);
+ k = session_stop(session, force);
if (k < 0)
r = k;
}
}
void seat_evict_position(Seat *s, Session *session) {
+ Session *iter;
unsigned int pos = session->pos;
session->pos = 0;
if (!pos)
return;
- if (pos < s->position_count && s->positions[pos] == session)
+ if (pos < s->position_count && s->positions[pos] == session) {
s->positions[pos] = NULL;
+
+ /* There might be another session claiming the same
+ * position (eg., during gdm->session transition), so lets look
+ * for it and set it on the free slot. */
+ LIST_FOREACH(sessions_by_seat, iter, s->sessions) {
+ if (iter->pos == pos) {
+ s->positions[pos] = iter;
+ break;
+ }
+ }
+ }
}
void seat_claim_position(Seat *s, Session *session, unsigned int pos) {