commit 407e7c1
chld
·
2026-03-22 17:56:16 +0000 UTC
parent 437e7d5
add guards and functionality for freebsd seat handling
1 files changed,
+34,
-25
+34,
-25
1@@ -50,7 +50,10 @@
2 #include <sys/sysmacros.h>
3 #endif
4
5-#if defined(__NetBSD__)
6+#if defined(__FreeBSD__)
7+#include <sys/consio.h>
8+#include <sys/kbio.h>
9+#elif defined(__NetBSD__)
10 #include <dev/wscons/wsdisplay_usl_io.h>
11
12 #elif defined(__OpenBSD__)
13@@ -325,7 +328,11 @@ find_vt(char *vt, size_t size)
14 * new VT instead of using the current one. */
15 if (getenv("DISPLAY") || getenv("WAYLAND_DISPLAY") ||
16 !(vtnr = getenv("XDG_VTNR"))) {
17+#if defined(__FreeBSD__)
18+ tty0_fd=open("/dev/ttyv0", O_RDWR | O_CLOEXEC);
19+ #else
20 tty0_fd = open("/dev/tty0", O_RDWR | O_CLOEXEC);
21+ #endif
22 if (tty0_fd == -1) {
23 die("open /dev/tty0:");
24 }
25@@ -333,11 +340,21 @@ find_vt(char *vt, size_t size)
26 die("VT open query failed:");
27 }
28 close(tty0_fd);
29+#if defined(__FreeBSD__)
30+ if (snprintf(vt, size, "/dev/ttyv%d", vt_num - 1) >= size) {
31+ #else
32 if (snprintf(vt, size, "/dev/tty%d", vt_num) >= size) {
33- die("VT number is too large");
34+
35+ #endif
36+ die("VT number is too large");
37 }
38 } else {
39+#if defined(__FreeBSD__)
40+ int n=atoi(vtnr);
41+ if (snprintf(vt, size, "/dev/ttyv%d", n - 1) >= size) {
42+ #else
43 if (snprintf(vt, size, "/dev/tty%s", vtnr) >= size) {
44+ #endif
45 die("XDG_VTNR is too long");
46 }
47 }
48@@ -369,8 +386,10 @@ setup_tty(int fd)
49 {
50 struct stat st;
51 int vt;
52-#ifndef __OpenBSD__
53+#if !defined (__OpenBSD__) && !defined(__FreeBSD__)
54 struct vt_stat state;
55+ #endif
56+#if !defined(__OpenBSD__)
57 struct vt_mode mode = {
58 .mode = VT_PROCESS, .relsig = SIGUSR1, .acqsig = SIGUSR2};
59 #endif
60@@ -390,15 +409,25 @@ setup_tty(int fd)
61 }
62 #endif
63
64-#ifdef __OpenBSD__
65+#if defined(__OpenBSD__)
66 /* OpenBSD wscons has no VT_GETSTATE */
67+ original_vt_state.vt=vt;
68+#elif defined(__FreeBSD__)
69+ {
70+ int vt_num;
71+ if (ioctl(fd, VT_GETACTIVE, &vt_num) == -1)
72+ {
73+ die("failed to get current VT state:");
74+ }
75+ original_vt_state.vt=vt_num;
76+ }
77 #else
78 if (ioctl(fd, VT_GETSTATE, &state) == -1) {
79 die("failed to get the current VT state:");
80 }
81 #endif
82
83-#ifndef __OpenBSD__
84+#if !defined (__OpenBSD__) && !defined(__FreeBSD__)
85 original_vt_state.vt = state.v_active;
86 #else
87 original_vt_state.vt = vt;
88@@ -451,26 +480,6 @@ setup_tty(int fd)
89 }
90 }
91 #endif
92-
93-#ifdef __OpenBSD__
94- /* OpenBSD wscons already on active VT */
95- activate();
96-#else
97- if (vt == original_vt_state.vt) {
98- activate();
99- } else if (!nflag) {
100- if (ioctl(fd, VT_ACTIVATE, vt) == -1) {
101- perror("failed to activate VT");
102- goto error2;
103- }
104-
105- if (ioctl(fd, VT_WAITACTIVE, vt) == -1) {
106- perror("failed to wait for VT to become active");
107- goto error2;
108- }
109- }
110-#endif
111-
112 original_vt_state.altered = true;
113
114 return;