summaryrefslogtreecommitdiffstats
path: root/lib/libc/gen
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 /lib/libc/gen
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 'lib/libc/gen')
-rw-r--r--lib/libc/gen/devname.31
-rw-r--r--lib/libc/gen/devname.c39
2 files changed, 28 insertions, 12 deletions
diff --git a/lib/libc/gen/devname.3 b/lib/libc/gen/devname.3
index b63d6c9..2f39c80 100644
--- a/lib/libc/gen/devname.3
+++ b/lib/libc/gen/devname.3
@@ -41,6 +41,7 @@
.Sh LIBRARY
.Lb libc
.Sh SYNOPSIS
+.Fd #include <sys/stat.h>
.Fd #include <stdlib.h>
.Ft char *
.Fn devname "dev_t dev" "mode_t type"
diff --git a/lib/libc/gen/devname.c b/lib/libc/gen/devname.c
index 898c8e8..7d84037 100644
--- a/lib/libc/gen/devname.c
+++ b/lib/libc/gen/devname.c
@@ -29,6 +29,8 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $FreeBSD$
*/
#if defined(LIBC_SCCS) && !defined(lint)
@@ -36,6 +38,7 @@ static char sccsid[] = "@(#)devname.c 8.2 (Berkeley) 4/29/95";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
+#include <sys/sysctl.h>
#include <db.h>
#include <err.h>
@@ -85,21 +88,33 @@ devname(dev, type)
dev_t dev;
mode_t type;
{
- static char buf[20];
+ static char buf[30]; /* XXX: pick up from <sys/conf.h> */
+ int i, j;
char *r;
+ /* First check the DB file. */
r = xdevname(dev, type);
- if (!r) {
- r = buf;
- if (minor(dev) > 255) {
- sprintf(buf, "#%c%d:0x%x",
- (type & S_IFMT) == S_IFCHR ? 'C' : 'B',
- major(dev), minor(dev));
- } else {
- sprintf(buf, "#%c%d:%d",
- (type & S_IFMT) == S_IFCHR ? 'C' : 'B',
- major(dev), minor(dev));
- }
+ if (r != NULL)
+ return (r);
+
+ /* Then ask the kernel. */
+ if ((type & S_IFMT) == S_IFCHR) {
+ j = sizeof(buf);
+ i = sysctlbyname("kern.devname", buf, &j, &dev, sizeof (dev));
+ if (i == 0)
+ return (buf);
+ }
+
+ /* Finally just format it */
+ r = buf;
+ if (minor(dev) > 255) {
+ sprintf(buf, "#%c%d:0x%x",
+ (type & S_IFMT) == S_IFCHR ? 'C' : 'B',
+ major(dev), minor(dev));
+ } else {
+ sprintf(buf, "#%c%d:%d",
+ (type & S_IFMT) == S_IFCHR ? 'C' : 'B',
+ major(dev), minor(dev));
}
return (r);
}
OpenPOWER on IntegriCloud