Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement FreeBSD vt switching #353

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 34 additions & 6 deletions src/vt.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,38 +16,66 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#ifdef __FreeBSD__
#include <sys/consio.h>
#endif
#ifdef __linux__
#include <linux/vt.h>
#endif

#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;
Expand All @@ -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 */
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand Down
Loading