summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_conf.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2000-09-09 11:39:59 +0000
committerphk <phk@FreeBSD.org>2000-09-09 11:39:59 +0000
commitd0fd2f76cf6b0884889cbadc44dc9807523a6d51 (patch)
tree8c7e2a84070834a639ea2e7b10c104c5505a1e85 /sys/kern/kern_conf.c
parent81ee18f66b10b0987c69873963a2552186771844 (diff)
downloadFreeBSD-src-d0fd2f76cf6b0884889cbadc44dc9807523a6d51.zip
FreeBSD-src-d0fd2f76cf6b0884889cbadc44dc9807523a6d51.tar.gz
Add code to devname(3) so it can find the names of devices which
were not present when dev_mkdb(8) was run. First the dev_mkdb(8) database is searched, this caters for non-DEVFS cases where people have renamed a device. If that fails we ask the kernel using sysctl kern.devname if the device driver has put a name in the dev_t. This covers DEVFS cloned devices. If that also fails we format a string which isn't entirely useless.
Diffstat (limited to 'sys/kern/kern_conf.c')
-rw-r--r--sys/kern/kern_conf.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c
index fb15afd..404f6f4 100644
--- a/sys/kern/kern_conf.c
+++ b/sys/kern/kern_conf.c
@@ -406,3 +406,30 @@ dev_stdclone(char *name, char **namep, char *stem, int *unit)
return (2);
return (1);
}
+
+/*
+ * Helper sysctl for devname(3). We're given a {u}dev_t and return
+ * the name, if any, registered by the device driver.
+ */
+static int
+sysctl_devname(SYSCTL_HANDLER_ARGS)
+{
+ int error;
+ udev_t ud;
+ dev_t dev;
+
+ error = SYSCTL_IN(req, &ud, sizeof (ud));
+ if (error)
+ return (error);
+ dev = makedev(umajor(ud), uminor(ud));
+ if (dev->si_name[0] == '\0')
+ error = ENOENT;
+ else
+ error = SYSCTL_OUT(req, dev->si_name, strlen(dev->si_name) + 1);
+ freedev(dev);
+ return (error);
+}
+
+SYSCTL_PROC(_kern, OID_AUTO, devname, CTLTYPE_OPAQUE|CTLFLAG_RW,
+ NULL, 0, sysctl_devname, "", "devname(3) handler");
+
OpenPOWER on IntegriCloud