devname.c revision 203290
1168404Spjd/*
2168404Spjd * Copyright (c) 1989, 1993
3168404Spjd *	The Regents of the University of California.  All rights reserved.
4168404Spjd *
5168404Spjd * Redistribution and use in source and binary forms, with or without
6168404Spjd * modification, are permitted provided that the following conditions
7168404Spjd * are met:
8168404Spjd * 1. Redistributions of source code must retain the above copyright
9168404Spjd *    notice, this list of conditions and the following disclaimer.
10168404Spjd * 2. Redistributions in binary form must reproduce the above copyright
11168404Spjd *    notice, this list of conditions and the following disclaimer in the
12168404Spjd *    documentation and/or other materials provided with the distribution.
13168404Spjd * 4. Neither the name of the University nor the names of its contributors
14168404Spjd *    may be used to endorse or promote products derived from this software
15168404Spjd *    without specific prior written permission.
16168404Spjd *
17168404Spjd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18168404Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19168404Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20168404Spjd * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21168404Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22209962Smm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23168404Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24168404Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25168404Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26168404Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27168404Spjd * SUCH DAMAGE.
28185029Spjd */
29168404Spjd
30168404Spjd#if defined(LIBC_SCCS) && !defined(lint)
31168404Spjdstatic char sccsid[] = "@(#)devname.c	8.2 (Berkeley) 4/29/95";
32168404Spjd#endif /* LIBC_SCCS and not lint */
33168404Spjd#include <sys/cdefs.h>
34185029Spjd__FBSDID("$FreeBSD: head/lib/libc/gen/devname.c 203290 2010-01-31 14:51:04Z ed $");
35168404Spjd
36168404Spjd#include <sys/types.h>
37168404Spjd#include <sys/sysctl.h>
38168404Spjd
39168404Spjd#include <stdio.h>
40168404Spjd#include <string.h>
41168404Spjd#include <sys/param.h>
42168404Spjd#include <sys/stat.h>
43168404Spjd
44168404Spjdchar *
45168404Spjddevname_r(dev_t dev, mode_t type, char *buf, int len)
46168404Spjd{
47168404Spjd	int i;
48168404Spjd	size_t j;
49168404Spjd
50209962Smm	if (dev == NODEV || !(S_ISCHR(type) || S_ISBLK(dev))) {
51168404Spjd		strlcpy(buf, "#NODEV", len);
52168404Spjd		return (buf);
53168404Spjd	}
54185029Spjd
55185029Spjd	if (S_ISCHR(type)) {
56168404Spjd		j = len;
57168404Spjd		i = sysctlbyname("kern.devname", buf, &j, &dev, sizeof (dev));
58168404Spjd		if (i == 0)
59168404Spjd			return (buf);
60168404Spjd	}
61168404Spjd
62168404Spjd	/* Finally just format it */
63168404Spjd	snprintf(buf, len, "#%c:%d:0x%x",
64168404Spjd	    S_ISCHR(type) ? 'C' : 'B', major(dev), minor(dev));
65168404Spjd	return (buf);
66168404Spjd}
67168404Spjd
68168404Spjdchar *
69168404Spjddevname(dev_t dev, mode_t type)
70168404Spjd{
71168404Spjd	static char buf[SPECNAMELEN + 1];
72168404Spjd
73168404Spjd	return (devname_r(dev, type, buf, sizeof(buf)));
74168404Spjd}
75168404Spjd