aboutsummaryrefslogtreecommitdiffstats
path: root/src/mds-vt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mds-vt.c')
-rw-r--r--src/mds-vt.c49
1 files changed, 41 insertions, 8 deletions
diff --git a/src/mds-vt.c b/src/mds-vt.c
index 93e97e8..99a34ed 100644
--- a/src/mds-vt.c
+++ b/src/mds-vt.c
@@ -241,13 +241,8 @@ int initialise_server(void)
if (is_respawn == 0)
{
- display_vt = vt_get_next_available(); /* TODO add support for $XDG_VTNR */
- if (display_vt == 0)
- {
- eprint("out of available virtual terminals, I am stymied.");
- goto fail;
- }
- else if (display_vt < 0)
+ display_vt = select_vt();
+ if (display_vt < 0)
goto pfail;
display_tty_fd = vt_open(display_vt, &old_vt_stat);
fail_if (write_vt_file() < 0);
@@ -280,7 +275,6 @@ int initialise_server(void)
return 1;
pfail:
xperror(*argv);
- fail:
unlink(vtfile_path);
if (display_tty_fd >= 0)
vt_close(display_tty_fd, &old_vt_stat);
@@ -741,6 +735,45 @@ int full_send(int socket, const char* message, size_t length)
/**
+ * Get the index of the virtual terminal on which the display should be opened
+ *
+ * @return The index of the virtual terminal on which the display should be opened, -1 on error
+ */
+int select_vt(void)
+{
+ int rc, r;
+ const char* xdg_vtnr;
+
+ xdg_vtnr = getenv("XDG_VTNR");
+ if (xdg_vtnr == NULL)
+ xdg_vtnr = "";
+
+ if (*xdg_vtnr)
+ {
+ /* $XDG_VTNR has been specified, use it to select VT. */
+ r = strict_atoi(xdg_vtnr, &rc, MIN_NR_CONSOLES, MAX_NR_CONSOLES);
+ if (r < 0)
+ {
+ eprint("the environment variable XDG_VTNR contains an invalid value.");
+ return errno = 0, -1;
+ }
+ }
+ else
+ {
+ /* $XDG_VTNR has not been specified, select next available VT. */
+ rc = vt_get_next_available();
+ if (rc == 0)
+ {
+ eprint("out of available virtual terminals, I am stymied.");
+ return errno = 0, -1;
+ }
+ }
+
+ return rc;
+}
+
+
+/**
* Get the index of the next available virtual terminal
*
* @return -1 on error, 0 if the terminals are exhausted, otherwise the next terminal