Allow mknod(8) to be only invoked with a pathname as an argument.

In 99% of the cases people just want to recreate device nodes they
removed from /dev. There is no reason to pass the additional "c 0 0"
anymore.

Also slightly improve the manpage. Remove references to non-existent
device names and platforms.
This commit is contained in:
Ed Schouten 2010-01-31 11:48:25 +00:00
parent c2a5f1a57a
commit 04e532d50b
2 changed files with 39 additions and 31 deletions

View File

@ -28,7 +28,7 @@
.\" @(#)mknod.8 8.2 (Berkeley) 12/11/93
.\" $FreeBSD$
.\"
.Dd October 31, 2009
.Dd January 31, 2010
.Dt MKNOD 8
.Os
.Sh NAME
@ -37,6 +37,8 @@
.Sh SYNOPSIS
.Nm
.Ar name
.Nm
.Ar name
.Op Cm b | c
.Ar major minor
.Op Ar owner : Ns Ar group
@ -52,14 +54,14 @@ systems.
The
.Nm
utility creates device special files.
To make nodes manually, the four required arguments are:
To make nodes manually, the arguments are:
.Pp
.Bl -tag -width indent
.It Ar name
Device name, for example
.Dq sd
for a SCSI disk on an HP300 or a
.Dq pty
.Pa /dev/da0
for a SCSI disk or
.Pa /dev/pts/0
for pseudo-terminals.
.It Cm b | c
Type of device.
@ -110,13 +112,13 @@ The
.Nm
utility can be used to recreate deleted device nodes under a
.Xr devfs 5
mount point by invoking it using dummy arguments.
mount point by invoking it with only a filename as an argument.
Example:
.Pp
.Dl "mknod cd0 c 0 0"
.Dl "mknod /dev/cd0"
.Pp
where
.Dq Li cd0
.Pa /dev/cd0
is the name of the deleted device node.
.Sh COMPATIBILITY
The

View File

@ -61,7 +61,8 @@ usage(void)
{
(void)fprintf(stderr,
"usage: mknod name [b | c] major minor [owner:group]\n");
"usage: mknod name\n"
" mknod name [b | c] major minor [owner:group]\n");
exit(1);
}
@ -115,31 +116,36 @@ main(int argc, char **argv)
char *cp, *endp;
long mymajor, myminor;
if (argc != 5 && argc != 6)
if (argc != 2 && argc != 5 && argc != 6)
usage();
mode = 0666;
if (argv[2][0] == 'c')
mode |= S_IFCHR;
else if (argv[2][0] == 'b')
mode |= S_IFBLK;
else
errx(1, "node must be type 'b' or 'c'");
if (argc >= 5) {
mode = 0666;
if (argv[2][0] == 'c')
mode |= S_IFCHR;
else if (argv[2][0] == 'b')
mode |= S_IFBLK;
else
errx(1, "node must be type 'b' or 'c'");
errno = 0;
mymajor = (long)strtoul(argv[3], &endp, 0);
if (endp == argv[3] || *endp != '\0')
errx(1, "%s: non-numeric major number", argv[3]);
range_error = errno;
errno = 0;
myminor = (long)strtoul(argv[4], &endp, 0);
if (endp == argv[4] || *endp != '\0')
errx(1, "%s: non-numeric minor number", argv[4]);
range_error |= errno;
dev = makedev(mymajor, myminor);
if (range_error || major(dev) != (u_int) mymajor ||
(long)(u_int)minor(dev) != myminor)
errx(1, "major or minor number too large");
errno = 0;
mymajor = (long)strtoul(argv[3], &endp, 0);
if (endp == argv[3] || *endp != '\0')
errx(1, "%s: non-numeric major number", argv[3]);
range_error = errno;
errno = 0;
myminor = (long)strtoul(argv[4], &endp, 0);
if (endp == argv[4] || *endp != '\0')
errx(1, "%s: non-numeric minor number", argv[4]);
range_error |= errno;
dev = makedev(mymajor, myminor);
if (range_error || major(dev) != (u_int) mymajor ||
(long)(u_int)minor(dev) != myminor)
errx(1, "major or minor number too large");
} else {
mode = 0666 | S_IFCHR;
dev = 0;
}
uid = gid = -1;
if (6 == argc) {