From 2a013cce1a58e3ea7d4eaf448066b8b5bb046e74 Mon Sep 17 00:00:00 2001 From: Tijl Coosemans Date: Sun, 21 Apr 2024 14:54:51 +0200 Subject: [PATCH] Implement FreeBSD vt switching --- src/vt.c | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/vt.c b/src/vt.c index 920ae6828..28dd59cb3 100644 --- a/src/vt.c +++ b/src/vt.c @@ -16,6 +16,9 @@ #include #include #include +#ifdef __FreeBSD__ +#include +#endif #ifdef __linux__ #include #endif @@ -23,31 +26,56 @@ #include "vt.h" #include "configuration.h" +#if defined(__FreeBSD__) +#define CONSOLE "/dev/console" +#else +#define CONSOLE "/dev/tty0" +#endif + static GList *used_vts = NULL; static gint open_tty (void) { - int fd = g_open ("/dev/tty0", O_RDONLY | O_NOCTTY, 0); + int fd = g_open (CONSOLE, O_RDONLY | O_NOCTTY, 0); if (fd < 0) - g_warning ("Error opening /dev/tty0: %s", strerror (errno)); + g_warning ("Error opening " CONSOLE ": %s", strerror (errno)); return fd; } gboolean vt_can_multi_seat (void) { +#if defined(__linux__) /* Quick check to see if we can multi seat. This is intentionally the same check logind does, just without actually reading from the files. Existence will prove whether we have CONFIG_VT built into the kernel. */ return access ("/dev/tty0", F_OK) == 0 && access ("/sys/class/tty/tty0/active", F_OK) == 0; +#else + return FALSE; +#endif } gint vt_get_active (void) { -#ifdef __linux__ +#if defined(__FreeBSD__) + int active, res; + int tty_fd = open_tty (); + + if (tty_fd >= 0) + { + res = ioctl (tty_fd, VT_GETACTIVE, &active); + close (tty_fd); + if (res == 0) + return active; + + g_warning ("Error using VT_GETACTIVE on " CONSOLE ": %s", strerror (errno)); + } + + return -1; +#elif defined(__linux__) /* Pretend always active */ if (getuid () != 0) return 1; @@ -73,7 +101,7 @@ vt_get_active (void) void vt_set_active (gint number) { -#ifdef __linux__ +#if defined(__FreeBSD__) || defined(__linux__) g_debug ("Activating VT %d", number); /* Pretend always active */ @@ -86,7 +114,7 @@ vt_set_active (gint number) int n = number; if (ioctl (tty_fd, VT_ACTIVATE, n) < 0) { - g_warning ("Error using VT_ACTIVATE %d on /dev/tty0: %s", n, strerror (errno)); + g_warning ("Error using VT_ACTIVATE %d on " CONSOLE ": %s", n, strerror (errno)); close (tty_fd); return; } @@ -101,7 +129,7 @@ vt_set_active (gint number) { if (errno == EINTR) continue; - g_warning ("Error using VT_WAITACTIVE %d on /dev/tty0: %s", n, strerror (errno)); + g_warning ("Error using VT_WAITACTIVE %d on " CONSOLE ": %s", n, strerror (errno)); } break; }