diff options
| author | Poul-Henning Kamp <phk@FreeBSD.org> | 2000-09-09 11:39:59 +0000 |
|---|---|---|
| committer | Poul-Henning Kamp <phk@FreeBSD.org> | 2000-09-09 11:39:59 +0000 |
| commit | 8d25eb2c3a292113d6fd5b0f35ae3e3a40870a4f (patch) | |
| tree | f081d489e6b2b23dcec1bcfd667768bc82431e67 /lib/libc | |
| parent | cb9c6f988781afa63c2afecdb13caa66bf123de6 (diff) | |
Notes
Diffstat (limited to 'lib/libc')
| -rw-r--r-- | lib/libc/gen/devname.3 | 1 | ||||
| -rw-r--r-- | lib/libc/gen/devname.c | 39 |
2 files changed, 28 insertions, 12 deletions
diff --git a/lib/libc/gen/devname.3 b/lib/libc/gen/devname.3 index b63d6c99996f..2f39c80e9cd1 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 898c8e88d10e..7d84037917ac 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); } |
