git: e3f669870fe2 - main - cdev: dev_copyname copies a character device's name to a buffer

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Thu, 27 Mar 2025 20:48:40 UTC
The branch main has been updated by jhb:

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

commit e3f669870fe255ad4535d2a793e79e8ad878177f
Author:     John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2025-03-27 20:43:15 +0000
Commit:     John Baldwin <jhb@FreeBSD.org>
CommitDate: 2025-03-27 20:43:15 +0000

    cdev: dev_copyname copies a character device's name to a buffer
    
    This function can be called on a cdev that might have been destroyed
    unlike devtoname.
    
    Reviewed by:    kib
    Differential Revision:  https://reviews.freebsd.org/D49334
---
 sys/kern/kern_conf.c | 13 +++++++++++++
 sys/sys/conf.h       |  1 +
 2 files changed, 14 insertions(+)

diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c
index f9d406548d10..1f0772e97030 100644
--- a/sys/kern/kern_conf.c
+++ b/sys/kern/kern_conf.c
@@ -1245,6 +1245,19 @@ devtoname(struct cdev *dev)
 	return (dev->si_name);
 }
 
+void
+dev_copyname(struct cdev *dev, char *path, size_t len)
+{
+	struct cdevsw *csw;
+	int ref;
+
+	csw = dev_refthread(dev, &ref);
+	if (csw != NULL) {
+		strlcpy(path, dev->si_name, len);
+		dev_relthread(dev, ref);
+	}
+}
+
 int
 dev_stdclone(char *name, char **namep, const char *stem, int *unit)
 {
diff --git a/sys/sys/conf.h b/sys/sys/conf.h
index 8970006c7089..1646aa108701 100644
--- a/sys/sys/conf.h
+++ b/sys/sys/conf.h
@@ -277,6 +277,7 @@ void	destroy_dev(struct cdev *_dev);
 int	destroy_dev_sched(struct cdev *dev);
 int	destroy_dev_sched_cb(struct cdev *dev, void (*cb)(void *), void *arg);
 void	destroy_dev_drain(struct cdevsw *csw);
+void	dev_copyname(struct cdev *dev, char *path, size_t len);
 struct cdevsw *dev_refthread(struct cdev *_dev, int *_ref);
 struct cdevsw *devvn_refthread(struct vnode *vp, struct cdev **devp, int *_ref);
 void	dev_relthread(struct cdev *_dev, int _ref);