Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 01 Dec 2025 20:43:12 +0000
From:      Vladimir Kondratyev <wulf@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: ecccc9d99901 - main - evdev: Allow setting of character device ownership and access mode
Message-ID:  <692dfde0.31de4.4c5251df@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by wulf:

URL: https://cgit.FreeBSD.org/src/commit/?id=ecccc9d99901dd874e8d122853026d7c28fa4fcf

commit ecccc9d99901dd874e8d122853026d7c28fa4fcf
Author:     Vladimir Kondratyev <wulf@FreeBSD.org>
AuthorDate: 2025-12-01 20:42:14 +0000
Commit:     Vladimir Kondratyev <wulf@FreeBSD.org>
CommitDate: 2025-12-01 20:42:14 +0000

    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
---
 sys/dev/evdev/cdev.c          |  6 +++---
 sys/dev/evdev/evdev.c         | 17 ++++++++++++++++-
 sys/dev/evdev/evdev.h         |  1 +
 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 */


help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?692dfde0.31de4.4c5251df>