xfree86: os-support: bsd: move wscons 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-14 20:52:36 +01:00
committed by Enrico Weigelt
parent 1ce27b0459
commit 43b2d7a634
4 changed files with 178 additions and 185 deletions

View File

@@ -57,21 +57,6 @@ int initialVT = -1;
#define SYSCONS_CONSOLE_MODE O_RDWR|O_NDELAY
#endif
#ifdef PCVT_SUPPORT
/* Hellmuth Michaelis' pcvt driver */
#ifndef __OpenBSD__
#define PCVT_CONSOLE_DEV "/dev/ttyv0"
#else
#define PCVT_CONSOLE_DEV "/dev/ttyC0"
#endif
#define PCVT_CONSOLE_MODE O_RDWR|O_NDELAY
#endif
#if defined(WSCONS_SUPPORT) && defined(__NetBSD__)
/* NetBSD's new console driver */
#define WSCONS_PCVT_COMPAT_CONSOLE_DEV "/dev/ttyE0"
#endif
#ifdef __GLIBC__
#define setpgrp setpgid
#endif
@@ -90,14 +75,6 @@ int initialVT = -1;
static bool xf86OpenSyscons(void);
#endif /* SYSCONS_SUPPORT */
#ifdef PCVT_SUPPORT
static bool xf86OpenPcvt(void);
#endif /* PCVT_SUPPORT */
#ifdef WSCONS_SUPPORT
static bool xf86OpenWScons(void);
#endif
typedef struct console_driver {
const char *name;
bool (*open) (void);
@@ -119,13 +96,13 @@ static console_driver_t console_drivers[] = {
#ifdef PCVT_SUPPORT
{
.name = "pcvt",
.open = xf86OpenPcvt,
.open = xf86_console_pcvt_open,
},
#endif
#ifdef WSCONS_SUPPORT
{
.name = "wscons",
.open = xf86OpenWScons,
.open = xf86_console_wscons_open,
},
#endif
};
@@ -344,166 +321,6 @@ static bool xf86OpenSyscons(void)
#endif /* SYSCONS_SUPPORT */
#ifdef PCVT_SUPPORT
static bool xf86OpenPcvt(void)
{
/* This looks much like syscons, since pcvt is API compatible */
int fd = -1;
vtmode_t vtmode;
char vtname[12];
const char *vtprefix;
#ifdef __NetBSD__
struct pcvtid pcvt_version;
#endif
#ifndef __OpenBSD__
vtprefix = "/dev/ttyv";
#else
vtprefix = "/dev/ttyC";
#endif
fd = open(PCVT_CONSOLE_DEV, PCVT_CONSOLE_MODE, 0);
#ifdef WSCONS_PCVT_COMPAT_CONSOLE_DEV
if (fd < 0) {
fd = open(WSCONS_PCVT_COMPAT_CONSOLE_DEV, PCVT_CONSOLE_MODE, 0);
vtprefix = "/dev/ttyE";
}
#endif
if (fd >= 0) {
#ifdef __NetBSD__
if (ioctl(fd, VGAPCVTID, &pcvt_version) >= 0) {
#endif
if (ioctl(fd, VT_GETMODE, &vtmode) < 0) {
FatalError("%s: VT_GETMODE failed\n%s%s\n%s",
"xf86OpenPcvt",
"Found pcvt driver but X11 seems to be",
" not supported.", CHECK_DRIVER_MSG);
}
xf86Info.vtno = xf86_console_requested_vt;
if (ioctl(fd, VT_GETACTIVE, &initialVT) < 0)
initialVT = -1;
if (xf86Info.vtno == -1) {
if (ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) {
/* No free VTs */
xf86Info.vtno = -1;
}
if (xf86Info.vtno == -1) {
/*
* All VTs are in use. If initialVT was found, use it.
*/
if (initialVT != -1) {
xf86Info.vtno = initialVT;
}
else {
FatalError("%s: Cannot find a free VT", "xf86OpenPcvt");
}
}
}
close(fd);
snprintf(vtname, sizeof(vtname), "%s%01x", vtprefix,
xf86Info.vtno - 1);
if ((fd = open(vtname, PCVT_CONSOLE_MODE, 0)) < 0) {
ErrorF("xf86OpenPcvt: Cannot open %s (%s)",
vtname, strerror(errno));
xf86Info.vtno = initialVT;
snprintf(vtname, sizeof(vtname), "%s%01x", vtprefix,
xf86Info.vtno - 1);
if ((fd = open(vtname, PCVT_CONSOLE_MODE, 0)) < 0) {
FatalError("xf86OpenPcvt: Cannot open %s (%s)",
vtname, strerror(errno));
}
}
if (ioctl(fd, VT_GETMODE, &vtmode) < 0) {
FatalError("xf86OpenPcvt: VT_GETMODE failed");
}
xf86Info.consType = PCVT;
#ifdef WSCONS_SUPPORT
LogMessageVerb(X_PROBED, 1,
"Using wscons driver on %s in pcvt compatibility mode ",
vtname);
#else
LogMessageVerb(X_PROBED, 1, "Using pcvt driver\n");
#endif
#ifdef __NetBSD__
}
else {
/* Not pcvt */
close(fd);
fd = -1;
}
#endif
}
xf86Info.consoleFd = fd;
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
goto out;
#endif
#if !(defined(__NetBSD__) && (__NetBSD_Version__ >= 200000000))
/*
* First activate the #1 VT. This is a hack to allow a server
* to be started while another one is active. There should be
* a better way.
*/
if (initialVT != 1) {
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, 1) != 0) {
LogMessageVerb(X_WARNING, 1, "xf86OpenConsole: VT_ACTIVATE failed\n");
}
sleep(1);
}
#endif
goto out;
out:
xf86_bsd_acquire_vt();
xf86_console_proc_close = xf86_console_pcvt_close;
xf86_console_proc_reactivate = xf86_console_pcvt_reactivate;
return (fd > 0);
}
#endif /* PCVT_SUPPORT */
#ifdef WSCONS_SUPPORT
static bool xf86OpenWScons(void)
{
int fd = -1;
int mode = WSDISPLAYIO_MODE_MAPPED;
int i;
char ttyname[16];
/* XXX Is this ok? */
for (i = 0; i < 8; i++) {
#if defined(__NetBSD__)
snprintf(ttyname, sizeof(ttyname), "/dev/ttyE%d", i);
#elif defined(__OpenBSD__)
snprintf(ttyname, sizeof(ttyname), "/dev/ttyC%x", i);
#endif
if ((fd = open(ttyname, 2)) != -1)
break;
}
if (fd != -1) {
if (ioctl(fd, WSDISPLAYIO_SMODE, &mode) < 0) {
FatalError("%s: WSDISPLAYIO_MODE_MAPPED failed (%s)\n%s",
"xf86OpenConsole", strerror(errno), CHECK_DRIVER_MSG);
}
xf86Info.consType = WSCONS;
LogMessageVerb(X_PROBED, 1, "Using wscons driver\n");
}
xf86Info.consoleFd = fd;
xf86_console_proc_close = xf86_console_wscons_close;
/* nothing special to do for acquiring the VT */
return (fd > 0);
}
#endif /* WSCONS_SUPPORT */
void
xf86CloseConsole(void)
{

View File

@@ -2,8 +2,13 @@
#if defined(PCVT_SUPPORT)
#define CHECK_DRIVER_MSG \
"Check your kernel's console driver configuration and /dev entries"
#include <sys/ioctl.h>
#include <errno.h>
#include <fcntl.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
@@ -17,9 +22,17 @@
#endif
#include "xf86Priv.h"
#include "xf86_priv.h"
#include "xf86_bsd_priv.h"
#include "xf86_console_priv.h"
#ifndef __OpenBSD__
#define PCVT_CONSOLE_DEV "/dev/ttyv0"
#else
#define PCVT_CONSOLE_DEV "/dev/ttyC0"
#endif
#define PCVT_CONSOLE_MODE O_RDWR|O_NDELAY
void xf86_console_pcvt_close(void)
{
struct vt_mode VT = { 0 };
@@ -46,4 +59,123 @@ void xf86_console_pcvt_reactivate(void)
LogMessageVerb(X_WARNING, 1, "xf86_console_pcvt_reactivate: VT_ACTIVATE failed\n");
}
bool xf86_console_pcvt_open(void)
{
/* This looks much like syscons, since pcvt is API compatible */
int fd = -1;
vtmode_t vtmode;
char vtname[12];
const char *vtprefix;
#ifdef __NetBSD__
struct pcvtid pcvt_version;
#endif
#ifndef __OpenBSD__
vtprefix = "/dev/ttyv";
#else
vtprefix = "/dev/ttyC";
#endif
fd = open(PCVT_CONSOLE_DEV, PCVT_CONSOLE_MODE, 0);
#ifdef WSCONS_PCVT_COMPAT_CONSOLE_DEV
if (fd < 0) {
fd = open(WSCONS_PCVT_COMPAT_CONSOLE_DEV, PCVT_CONSOLE_MODE, 0);
vtprefix = "/dev/ttyE";
}
#endif
if (fd >= 0) {
#ifdef __NetBSD__
if (ioctl(fd, VGAPCVTID, &pcvt_version) >= 0) {
#endif
if (ioctl(fd, VT_GETMODE, &vtmode) < 0) {
FatalError("%s: VT_GETMODE failed\n%s%s\n%s",
"xf86OpenPcvt",
"Found pcvt driver but X11 seems to be",
" not supported.", CHECK_DRIVER_MSG);
}
xf86Info.vtno = xf86_console_requested_vt;
if (ioctl(fd, VT_GETACTIVE, &initialVT) < 0)
initialVT = -1;
if (xf86Info.vtno == -1) {
if (ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) {
/* No free VTs */
xf86Info.vtno = -1;
}
if (xf86Info.vtno == -1) {
/*
* All VTs are in use. If initialVT was found, use it.
*/
if (initialVT != -1) {
xf86Info.vtno = initialVT;
}
else {
FatalError("%s: Cannot find a free VT", "xf86OpenPcvt");
}
}
}
close(fd);
snprintf(vtname, sizeof(vtname), "%s%01x", vtprefix,
xf86Info.vtno - 1);
if ((fd = open(vtname, PCVT_CONSOLE_MODE, 0)) < 0) {
ErrorF("xf86OpenPcvt: Cannot open %s (%s)",
vtname, strerror(errno));
xf86Info.vtno = initialVT;
snprintf(vtname, sizeof(vtname), "%s%01x", vtprefix,
xf86Info.vtno - 1);
if ((fd = open(vtname, PCVT_CONSOLE_MODE, 0)) < 0) {
FatalError("xf86OpenPcvt: Cannot open %s (%s)",
vtname, strerror(errno));
}
}
if (ioctl(fd, VT_GETMODE, &vtmode) < 0) {
FatalError("xf86OpenPcvt: VT_GETMODE failed");
}
xf86Info.consType = PCVT;
#ifdef WSCONS_SUPPORT
LogMessageVerb(X_PROBED, 1,
"Using wscons driver on %s in pcvt compatibility mode ",
vtname);
#else
LogMessageVerb(X_PROBED, 1, "Using pcvt driver\n");
#endif
#ifdef __NetBSD__
}
else {
/* Not pcvt */
close(fd);
fd = -1;
}
#endif
}
xf86Info.consoleFd = fd;
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
goto out;
#endif
#if !(defined(__NetBSD__) && (__NetBSD_Version__ >= 200000000))
/*
* First activate the #1 VT. This is a hack to allow a server
* to be started while another one is active. There should be
* a better way.
*/
if (initialVT != 1) {
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, 1) != 0) {
LogMessageVerb(X_WARNING, 1, "xf86OpenConsole: VT_ACTIVATE failed\n");
}
sleep(1);
}
#endif
goto out;
out:
xf86_bsd_acquire_vt();
xf86_console_proc_close = xf86_console_pcvt_close;
xf86_console_proc_reactivate = xf86_console_pcvt_reactivate;
return (fd > 0);
}
#endif /* PCVT_SUPPORT */

View File

@@ -2,13 +2,20 @@
#if defined(WSCONS_SUPPORT)
#include <errno.h>
#include <stdbool.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <dev/wscons/wsconsio.h>
#include "xf86Priv.h"
#include "xf86_console_priv.h"
#include "xf86_bsd_priv.h"
#define CHECK_DRIVER_MSG \
"Check your kernel's console driver configuration and /dev entries"
void xf86_console_wscons_close(void)
{
int mode = WSDISPLAYIO_MODE_EMUL;
@@ -18,4 +25,37 @@ void xf86_console_wscons_close(void)
xf86Info.consoleFd = -1;
}
bool xf86_console_wscons_open(void)
{
int fd = -1;
int mode = WSDISPLAYIO_MODE_MAPPED;
int i;
char ttyname[16];
/* XXX Is this ok? */
for (i = 0; i < 8; i++) {
#if defined(__NetBSD__)
snprintf(ttyname, sizeof(ttyname), "/dev/ttyE%d", i);
#elif defined(__OpenBSD__)
snprintf(ttyname, sizeof(ttyname), "/dev/ttyC%x", i);
#endif
if ((fd = open(ttyname, 2)) != -1)
break;
}
if (fd != -1) {
if (ioctl(fd, WSDISPLAYIO_SMODE, &mode) < 0) {
FatalError("%s: WSDISPLAYIO_MODE_MAPPED failed (%s)\n%s",
"xf86OpenConsole", strerror(errno), CHECK_DRIVER_MSG);
}
xf86Info.consType = WSCONS;
LogMessageVerb(X_PROBED, 1, "Using wscons driver\n");
}
xf86Info.consoleFd = fd;
xf86_console_proc_close = xf86_console_wscons_close;
/* nothing special to do for acquiring the VT */
return (fd > 0);
}
#endif /* WSCONS_SUPPORT */

View File

@@ -5,6 +5,8 @@
#ifndef _XSERVER_XFREE86_OS_SUPPORT_BSD_PRIV_H
#define _XSERVER_XFREE86_OS_SUPPORT_BSD_PRIV_H
#include <stdbool.h>
#ifdef __OpenBSD__
#define DEV_MEM "/dev/xf86"
#else
@@ -23,6 +25,7 @@ void xf86_bsd_acquire_vt(void);
/* PCVT console driver */
void xf86_console_pcvt_close(void);
bool xf86_console_pcvt_open(void);
void xf86_console_pcvt_reactivate(void);
/* SYSCONS console driver */
@@ -31,6 +34,7 @@ void xf86_console_syscons_reactivate(void);
/* WSCONS console driver */
void xf86_console_wscons_close(void);
bool xf86_console_wscons_open(void);
extern int initialVT;