summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/login/logind-dbus.c13
-rw-r--r--src/shared/util.c9
-rw-r--r--src/shared/util.h1
3 files changed, 21 insertions, 2 deletions
diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c
index b8143b6179..3fe6c872b7 100644
--- a/src/login/logind-dbus.c
+++ b/src/login/logind-dbus.c
@@ -351,16 +351,25 @@ static int bus_manager_create_session(Manager *m, DBusMessage *message, DBusMess
vtnr = (uint32_t) v;
else if (vtnr != (uint32_t) v)
return -EINVAL;
+ } else if (tty_is_console(tty)) {
+
+ if (!s)
+ s = m->vtconsole;
+ else if (s != m->vtconsole)
+ return -EINVAL;
+
+ if (vtnr != 0)
+ return -EINVAL;
} else if (!isempty(tty) && s && seat_is_vtconsole(s))
return -EINVAL;
if (s) {
if (seat_can_multi_session(s)) {
- if (vtnr <= 0 || vtnr > 63)
+ if (vtnr > 63)
return -EINVAL;
} else {
- if (vtnr > 0)
+ if (vtnr != 0)
return -EINVAL;
}
}
diff --git a/src/shared/util.c b/src/shared/util.c
index 43948ccbd8..def576de21 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -4287,6 +4287,15 @@ bool tty_is_vc(const char *tty) {
return vtnr_from_tty(tty) >= 0;
}
+bool tty_is_console(const char *tty) {
+ assert(tty);
+
+ if (startswith(tty, "/dev/"))
+ tty += 5;
+
+ return streq(tty, "console");
+}
+
int vtnr_from_tty(const char *tty) {
int i, r;
diff --git a/src/shared/util.h b/src/shared/util.h
index 76bc7b3572..35ba0057d6 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -415,6 +415,7 @@ char *fstab_node_to_udev_node(const char *p);
bool tty_is_vc(const char *tty);
bool tty_is_vc_resolve(const char *tty);
+bool tty_is_console(const char *tty);
int vtnr_from_tty(const char *tty);
const char *default_term_for_tty(const char *tty);