diff options
| author | Vladimir Kondratyev <wulf@FreeBSD.org> | 2025-12-01 20:42:14 +0000 |
|---|---|---|
| committer | Vladimir Kondratyev <wulf@FreeBSD.org> | 2025-12-01 20:42:14 +0000 |
| commit | ecccc9d99901dd874e8d122853026d7c28fa4fcf (patch) | |
| tree | 805de26eac9257adbca639732920c708c0f7a394 | |
| parent | 882821b78faecaffdecac8fdcd943ee2e1053ee7 (diff) | |
evdev: Allow setting of character device ownership and access mode
by device driver. That is required as game pad and joystick events have
to be accessible by ordinary users.
MFC after: 1 month
| -rw-r--r-- | sys/dev/evdev/cdev.c | 6 | ||||
| -rw-r--r-- | sys/dev/evdev/evdev.c | 17 | ||||
| -rw-r--r-- | sys/dev/evdev/evdev.h | 1 | ||||
| -rw-r--r-- | sys/dev/evdev/evdev_private.h | 3 |
4 files changed, 23 insertions, 4 deletions
diff --git a/sys/dev/evdev/cdev.c b/sys/dev/evdev/cdev.c index dd4115cdfc71..2f47056081d2 100644 --- a/sys/dev/evdev/cdev.c +++ b/sys/dev/evdev/cdev.c @@ -772,9 +772,9 @@ evdev_cdev_create(struct evdev_dev *evdev) make_dev_args_init(&mda); mda.mda_flags = MAKEDEV_WAITOK | MAKEDEV_CHECKNAME; mda.mda_devsw = &evdev_cdevsw; - mda.mda_uid = UID_ROOT; - mda.mda_gid = GID_WHEEL; - mda.mda_mode = 0600; + mda.mda_uid = evdev->ev_cdev_uid; + mda.mda_gid = evdev->ev_cdev_gid; + mda.mda_mode = evdev->ev_cdev_mode; mda.mda_si_drv1 = evdev; /* Try to coexist with cuse-backed input/event devices */ diff --git a/sys/dev/evdev/evdev.c b/sys/dev/evdev/evdev.c index e71f4f389d5c..4dcd6f23d338 100644 --- a/sys/dev/evdev/evdev.c +++ b/sys/dev/evdev/evdev.c @@ -37,6 +37,7 @@ #include <sys/malloc.h> #include <sys/module.h> #include <sys/proc.h> +#include <sys/stat.h> #include <sys/sx.h> #include <sys/sysctl.h> #include <sys/systm.h> @@ -94,8 +95,14 @@ static int evdev_check_event(struct evdev_dev *, uint16_t, uint16_t, int32_t); struct evdev_dev * evdev_alloc(void) { + struct evdev_dev *evdev; - return malloc(sizeof(struct evdev_dev), M_EVDEV, M_WAITOK | M_ZERO); + evdev = malloc(sizeof(struct evdev_dev), M_EVDEV, M_WAITOK | M_ZERO); + evdev->ev_cdev_uid = UID_ROOT; + evdev->ev_cdev_gid = GID_WHEEL; + evdev->ev_cdev_mode = S_IRUSR | S_IWUSR; + + return (evdev); } void @@ -584,6 +591,14 @@ evdev_set_flag(struct evdev_dev *evdev, uint16_t flag) bit_set(evdev->ev_flags, flag); } +void +evdev_set_cdev_mode(struct evdev_dev *evdev, uid_t uid, gid_t gid, int mode) +{ + evdev->ev_cdev_uid = uid; + evdev->ev_cdev_gid = gid; + evdev->ev_cdev_mode = mode; +} + static int evdev_check_event(struct evdev_dev *evdev, uint16_t type, uint16_t code, int32_t value) diff --git a/sys/dev/evdev/evdev.h b/sys/dev/evdev/evdev.h index 2ee374f184cc..d5aa58f0ccc4 100644 --- a/sys/dev/evdev/evdev.h +++ b/sys/dev/evdev/evdev.h @@ -153,6 +153,7 @@ void evdev_support_sw(struct evdev_dev *, uint16_t); void evdev_set_repeat_params(struct evdev_dev *, uint16_t, int); int evdev_set_report_size(struct evdev_dev *, size_t); void evdev_set_flag(struct evdev_dev *, uint16_t); +void evdev_set_cdev_mode(struct evdev_dev *, uid_t, gid_t, int); void *evdev_get_softc(struct evdev_dev *); bool evdev_is_grabbed(struct evdev_dev *); diff --git a/sys/dev/evdev/evdev_private.h b/sys/dev/evdev/evdev_private.h index 661259bd2594..4c371e538598 100644 --- a/sys/dev/evdev/evdev_private.h +++ b/sys/dev/evdev/evdev_private.h @@ -111,6 +111,9 @@ struct evdev_dev char ev_shortname[NAMELEN]; char ev_serial[NAMELEN]; struct cdev * ev_cdev; + uid_t ev_cdev_uid; + gid_t ev_cdev_gid; + int ev_cdev_mode; int ev_unit; enum evdev_lock_type ev_lock_type; struct mtx * ev_state_lock; /* State lock */ |
