xfree86: os-support: bsd: move syscons open logic into console_wscons.c

Yet another step on factoring out console type specific code so
separate drivers.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult
2026-01-16 17:51:13 +01:00
committed by Enrico Weigelt
parent 43b2d7a634
commit 8a4089e53d
3 changed files with 111 additions and 121 deletions

View File

@@ -64,17 +64,6 @@ int initialVT = -1;
#define CHECK_DRIVER_MSG \
"Check your kernel's console driver configuration and /dev entries"
/*
* Functions to probe for the existence of a supported console driver.
* Any function returns either a valid file descriptor (driver probed
* successfully), -1 (driver not found), or uses FatalError() if the
* driver was found but proved to not support the required mode to run
* an X server.
*/
#ifdef SYSCONS_SUPPORT
static bool xf86OpenSyscons(void);
#endif /* SYSCONS_SUPPORT */
typedef struct console_driver {
const char *name;
bool (*open) (void);
@@ -90,7 +79,7 @@ static console_driver_t console_drivers[] = {
#ifdef SYSCONS_SUPPORT
{
.name = "syscons",
.open = xf86OpenSyscons,
.open = xf86_console_syscons_open,
},
#endif
#ifdef PCVT_SUPPORT
@@ -212,115 +201,6 @@ xf86OpenConsole(void)
}
}
#ifdef SYSCONS_SUPPORT
static bool xf86OpenSyscons(void)
{
int fd = -1;
vtmode_t vtmode;
char vtname[12];
long syscons_version;
MessageType from;
/* Check for syscons */
if ((fd = open(SYSCONS_CONSOLE_DEV1, SYSCONS_CONSOLE_MODE, 0)) >= 0
|| (fd = open(SYSCONS_CONSOLE_DEV2, SYSCONS_CONSOLE_MODE, 0)) >= 0) {
if (ioctl(fd, VT_GETMODE, &vtmode) >= 0) {
/* Get syscons version */
if (ioctl(fd, CONS_GETVERS, &syscons_version) < 0) {
syscons_version = 0;
}
xf86Info.vtno = xf86_console_requested_vt;
from = X_CMDLINE;
#ifdef VT_GETACTIVE
if (ioctl(fd, VT_GETACTIVE, &initialVT) < 0)
initialVT = -1;
#endif
if (xf86Info.ShareVTs)
xf86Info.vtno = initialVT;
if (xf86Info.vtno == -1) {
/*
* For old syscons versions (<0x100), VT_OPENQRY returns
* the current VT rather than the next free VT. In this
* case, the server gets started on the current VT instead
* of the next free VT.
*/
#if 0
/* check for the fixed VT_OPENQRY */
if (syscons_version >= 0x100) {
#endif
if (ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) {
/* No free VTs */
xf86Info.vtno = -1;
}
#if 0
}
#endif
if (xf86Info.vtno == -1) {
/*
* All VTs are in use. If initialVT was found, use it.
*/
if (initialVT != -1) {
xf86Info.vtno = initialVT;
}
else {
if (syscons_version >= 0x100) {
FatalError("%s: Cannot find a free VT",
"xf86OpenSyscons");
}
/* Should no longer reach here */
FatalError("%s: %s %s\n\t%s %s",
"xf86OpenSyscons",
"syscons versions prior to 1.0 require",
"either the",
"server's stdin be a VT",
"or the use of the vtxx server option");
}
}
from = X_PROBED;
}
close(fd);
snprintf(vtname, sizeof(vtname), "/dev/ttyv%01x",
xf86Info.vtno - 1);
if ((fd = open(vtname, SYSCONS_CONSOLE_MODE, 0)) < 0) {
FatalError("xf86OpenSyscons: Cannot open %s (%s)",
vtname, strerror(errno));
}
if (ioctl(fd, VT_GETMODE, &vtmode) < 0) {
FatalError("xf86OpenSyscons: VT_GETMODE failed");
}
xf86Info.consType = SYSCONS;
LogMessageVerb(X_PROBED, 1, "Using syscons driver with X support");
if (syscons_version >= 0x100) {
xf86ErrorF(" (version %ld.%ld)\n", syscons_version >> 8,
syscons_version & 0xFF);
}
else {
xf86ErrorF(" (version 0.x)\n");
}
LogMessageVerb(from, 1, "using VT number %d\n\n", xf86Info.vtno);
}
else {
/* VT_GETMODE failed, probably not syscons */
close(fd);
fd = -1;
}
}
xf86Info.consoleFd = fd;
xf86_bsd_acquire_vt();
xf86_console_proc_close = xf86_console_syscons_close;
xf86_console_proc_reactivate = xf86_console_syscons_reactivate;
return (fd > 0);
}
#endif /* SYSCONS_SUPPORT */
void
xf86CloseConsole(void)
{

View File

@@ -7,11 +7,14 @@
#include <sys/kbio.h>
#endif
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <unistd.h>
#include "xf86Priv.h"
#include "xf86_console_priv.h"
#include "xf86_bsd_priv.h"
void xf86_console_syscons_close(void)
@@ -41,4 +44,110 @@ void xf86_console_syscons_reactivate(void)
LogMessageVerb(X_WARNING, 1, "xf86_console_syscons_reactivate: VT_ACTIVATE failed\n");
}
/* The FreeBSD 1.1 version syscons driver uses /dev/ttyv0 */
#define SYSCONS_CONSOLE_DEV1 "/dev/ttyv0"
#define SYSCONS_CONSOLE_DEV2 "/dev/vga"
#define SYSCONS_CONSOLE_MODE O_RDWR|O_NDELAY
bool xf86_console_syscons_open(void)
{
int fd = -1;
vtmode_t vtmode;
char vtname[12];
long syscons_version;
MessageType from;
/* Check for syscons */
if ((fd = open(SYSCONS_CONSOLE_DEV1, SYSCONS_CONSOLE_MODE, 0)) >= 0
|| (fd = open(SYSCONS_CONSOLE_DEV2, SYSCONS_CONSOLE_MODE, 0)) >= 0) {
if (ioctl(fd, VT_GETMODE, &vtmode) >= 0) {
/* Get syscons version */
if (ioctl(fd, CONS_GETVERS, &syscons_version) < 0) {
syscons_version = 0;
}
xf86Info.vtno = xf86_console_requested_vt;
from = X_CMDLINE;
#ifdef VT_GETACTIVE
if (ioctl(fd, VT_GETACTIVE, &initialVT) < 0)
initialVT = -1;
#endif
if (xf86Info.ShareVTs)
xf86Info.vtno = initialVT;
if (xf86Info.vtno == -1) {
/*
* For old syscons versions (<0x100), VT_OPENQRY returns
* the current VT rather than the next free VT. In this
* case, the server gets started on the current VT instead
* of the next free VT.
*/
#if 0
/* check for the fixed VT_OPENQRY */
if (syscons_version >= 0x100) {
#endif
if (ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) {
/* No free VTs */
xf86Info.vtno = -1;
}
#if 0
}
#endif
if (xf86Info.vtno == -1) {
/*
* All VTs are in use. If initialVT was found, use it.
*/
if (initialVT != -1) {
xf86Info.vtno = initialVT;
}
else {
if (syscons_version >= 0x100)
FatalError("xf86_console_syscons_open: Cannot find a free VT");
/* Should no longer reach here */
FatalError(
"xf86_console_syscons_open: syscons versions prior to 1.0 require either\n"
"the server's stdin be a VT or the use of the vtxx server option");
}
}
from = X_PROBED;
}
close(fd);
snprintf(vtname, sizeof(vtname), "/dev/ttyv%01x",
xf86Info.vtno - 1);
if ((fd = open(vtname, SYSCONS_CONSOLE_MODE, 0)) < 0) {
FatalError("xf86OpenSyscons: Cannot open %s (%s)",
vtname, strerror(errno));
}
if (ioctl(fd, VT_GETMODE, &vtmode) < 0) {
FatalError("xf86OpenSyscons: VT_GETMODE failed");
}
xf86Info.consType = SYSCONS;
LogMessageVerb(X_PROBED, 1, "Using syscons driver with X support");
if (syscons_version >= 0x100) {
LogMessageVerb(X_PROBED, 1, " (version %ld.%ld)\n", syscons_version >> 8,
syscons_version & 0xFF);
}
else {
LogMessageVerb(X_PROBED, 1, " (version 0.x)\n");
}
LogMessageVerb(from, 1, "using VT number %d\n\n", xf86Info.vtno);
}
else {
/* VT_GETMODE failed, probably not syscons */
close(fd);
fd = -1;
}
}
xf86Info.consoleFd = fd;
xf86_bsd_acquire_vt();
xf86_console_proc_close = xf86_console_syscons_close;
xf86_console_proc_reactivate = xf86_console_syscons_reactivate;
return (fd > 0);
}
#endif /* SYSCONS_SUPPORT */

View File

@@ -30,6 +30,7 @@ void xf86_console_pcvt_reactivate(void);
/* SYSCONS console driver */
void xf86_console_syscons_close(void);
bool xf86_console_syscons_open(void);
void xf86_console_syscons_reactivate(void);
/* WSCONS console driver */