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;