diff options
author | phk <phk@FreeBSD.org> | 2000-09-09 11:39:59 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2000-09-09 11:39:59 +0000 |
commit | d0fd2f76cf6b0884889cbadc44dc9807523a6d51 (patch) | |
tree | 8c7e2a84070834a639ea2e7b10c104c5505a1e85 /sys/kern/kern_conf.c | |
parent | 81ee18f66b10b0987c69873963a2552186771844 (diff) | |
download | FreeBSD-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.c | 27 |
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"); + |