aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/drm.c15
-rw-r--r--common/evdev.c23
-rw-r--r--common/terminal.c18
-rw-r--r--include/drm.h2
-rw-r--r--include/evdev.h2
-rw-r--r--meson.build1
-rw-r--r--seatd/client.c27
7 files changed, 84 insertions, 4 deletions
diff --git a/common/drm.c b/common/drm.c
index 9591dc0..0d8096a 100644
--- a/common/drm.c
+++ b/common/drm.c
@@ -6,6 +6,11 @@
#include <sys/sysmacros.h>
#endif
+#if defined(__NetBSD__)
+#include <stdlib.h>
+#include <sys/stat.h>
+#endif
+
#include "drm.h"
// From libdrm
@@ -40,6 +45,16 @@ int path_is_drm(const char *path) {
static const int prefixlen = STRLEN(prefix);
return strncmp(prefix, path, prefixlen) == 0;
}
+#elif defined(__NetBSD__)
+int path_is_drm(const char *path) {
+ static const char prefix[] = "/dev/dri/";
+ static const int prefixlen = STRLEN(prefix);
+ return strncmp(prefix, path, prefixlen) == 0;
+}
+
+int dev_is_drm(dev_t device) {
+ return major(device) == getdevmajor("drm", S_IFCHR);
+}
#else
#error Unsupported platform
#endif
diff --git a/common/evdev.c b/common/evdev.c
index 4aff9bc..d2398fb 100644
--- a/common/evdev.c
+++ b/common/evdev.c
@@ -9,6 +9,9 @@
#include <sys/sysmacros.h>
#elif defined(__FreeBSD__)
#include <dev/evdev/input.h>
+#elif defined(__NetBSD__)
+#include <stdlib.h>
+#include <sys/stat.h>
#else
#error Unsupported platform
#endif
@@ -17,6 +20,7 @@
#define STRLEN(s) ((sizeof(s) / sizeof(s[0])) - 1)
+#if defined(__linux__) || defined(__FreeBSD__)
int path_is_evdev(const char *path) {
static const char prefix[] = "/dev/input/event";
static const size_t prefixlen = STRLEN(prefix);
@@ -26,9 +30,28 @@ int path_is_evdev(const char *path) {
int evdev_revoke(int fd) {
return ioctl(fd, EVIOCREVOKE, NULL);
}
+#endif
#if defined(__linux__)
int dev_is_evdev(dev_t device) {
return major(device) == INPUT_MAJOR;
}
+#elif defined(__NetBSD__)
+int dev_is_evdev(dev_t device) {
+ return major(device) == getdevmajor("wskbd", S_IFCHR) ||
+ major(device) == getdevmajor("wsmouse", S_IFCHR) ||
+ major(device) == getdevmajor("wsmux", S_IFCHR);
+}
+int path_is_evdev(const char *path) {
+ const char *wskbd = "/dev/wskbd";
+ const char *wsmouse = "/dev/wsmouse";
+ const char *wsmux = "/dev/wsmux";
+ return strncmp(path, wskbd, STRLEN(wskbd)) == 0 ||
+ strncmp(path, wsmouse, STRLEN(wsmouse)) == 0 ||
+ strncmp(path, wsmux, STRLEN(wsmouse)) == 0;
+}
+int evdev_revoke(int fd) {
+ (void)fd;
+ return 0;
+}
#endif
diff --git a/common/terminal.c b/common/terminal.c
index 0c3466f..183c9bd 100644
--- a/common/terminal.c
+++ b/common/terminal.c
@@ -21,6 +21,11 @@
#define K_ENABLE K_XLATE
#define K_DISABLE K_RAW
#define FRSIG SIGIO
+#elif defined(__NetBSD__)
+#include <dev/wscons/wsdisplay_usl_io.h>
+#define K_ENABLE K_XLATE
+#define K_DISABLE K_RAW
+#define FRSIG 0 // unimplemented
#else
#error Unsupported platform
#endif
@@ -134,6 +139,14 @@ static int get_tty_path(int tty, char path[static TTYPATHLEN]) {
}
return 0;
}
+#elif defined(__NetBSD__)
+static int get_tty_path(int tty, char path[static TTYPATHLEN]) {
+ assert(tty >= 0);
+ if (snprintf(path, TTYPATHLEN, "/dev/ttyE%d", tty) == -1) {
+ return -1;
+ }
+ return 0;
+}
#else
#error Unsupported platform
#endif
@@ -153,7 +166,7 @@ int terminal_open(int vt) {
}
int terminal_current_vt(int fd) {
-#if defined(__linux__)
+#if defined(__linux__) || defined(__NetBSD__)
struct vt_stat st;
int res = ioctl(fd, VT_GETSTATE, &st);
close(fd);
@@ -231,12 +244,13 @@ int terminal_ack_acquire(int fd) {
int terminal_set_keyboard(int fd, bool enable) {
log_debugf("Setting KD keyboard state to %d", enable);
+#if defined(__linux__) || defined(__NetBSD__)
if (ioctl(fd, KDSKBMODE, enable ? K_ENABLE : K_DISABLE) == -1) {
log_errorf("Could not set KD keyboard mode to %s: %s",
enable ? "enabled" : "disabled", strerror(errno));
return -1;
}
-#if defined(__FreeBSD__)
+#elif defined(__FreeBSD__)
struct termios tios;
if (tcgetattr(fd, &tios) == -1) {
log_errorf("Could not set get terminal mode: %s", strerror(errno));
diff --git a/include/drm.h b/include/drm.h
index 8a7fb10..c8c3eeb 100644
--- a/include/drm.h
+++ b/include/drm.h
@@ -5,7 +5,7 @@ int drm_set_master(int fd);
int drm_drop_master(int fd);
int path_is_drm(const char *path);
-#if defined(__linux__)
+#if defined(__linux__) || defined(__NetBSD__)
#include <sys/types.h>
int dev_is_drm(dev_t device);
#endif
diff --git a/include/evdev.h b/include/evdev.h
index 6ebd943..da57828 100644
--- a/include/evdev.h
+++ b/include/evdev.h
@@ -4,7 +4,7 @@
int evdev_revoke(int fd);
int path_is_evdev(const char *path);
-#if defined(__linux__)
+#if defined(__linux__) || defined(__NetBSD__)
#include <sys/types.h>
int dev_is_evdev(dev_t device);
#endif
diff --git a/meson.build b/meson.build
index e6e583d..0f267a6 100644
--- a/meson.build
+++ b/meson.build
@@ -30,6 +30,7 @@ add_project_arguments(
[
'-D_XOPEN_SOURCE=700',
'-D__BSD_VISIBLE',
+ '-D_NETBSD_SOURCE',
'-DSEATD_VERSION="@0@"'.format(meson.project_version()),
'-DSEATD_DEFAULTPATH="@0@"'.format(defaultpath),
'-DSEATD_INSTALLPATH="@0@"'.format(seatdpath),
diff --git a/seatd/client.c b/seatd/client.c
index 6b6f3b3..0097792 100644
--- a/seatd/client.c
+++ b/seatd/client.c
@@ -14,6 +14,10 @@
#include <sys/un.h>
#endif
+#if defined(__NetBSD__)
+#include <sys/un.h>
+#endif
+
#include "client.h"
#include "linked_list.h"
#include "log.h"
@@ -34,6 +38,23 @@ static int get_peer(int fd, pid_t *pid, uid_t *uid, gid_t *gid) {
*uid = cred.uid;
*gid = cred.gid;
return 0;
+#elif defined(__NetBSD__)
+ struct unpcbid cred;
+ socklen_t len = sizeof cred;
+ if (getsockopt(fd, 0, LOCAL_PEEREID, &cred, &len) == -1) {
+ // assume builtin backend
+ if (errno == EINVAL) {
+ *pid = getpid();
+ *uid = getuid();
+ *gid = getgid();
+ return 0;
+ }
+ return -1;
+ }
+ *pid = cred.unp_pid;
+ *uid = cred.unp_euid;
+ *gid = cred.unp_egid;
+ return 0;
#elif defined(__FreeBSD__)
struct xucred cred;
socklen_t len = sizeof cred;
@@ -468,7 +489,13 @@ int client_handle_connection(int fd, uint32_t mask, void *data) {
goto fail;
}
if (len == 0) {
+// https://man.netbsd.org/poll.2
+// Sockets produce POLLIN rather than POLLHUP when the remote end is closed.
+#if defined(__NetBSD__)
+ log_info("Client disconnected");
+#else
log_error("Could not read client connection: zero-length read");
+#endif
goto fail;
}