diff options
author | ed <ed@FreeBSD.org> | 2010-01-31 11:48:25 +0000 |
---|---|---|
committer | ed <ed@FreeBSD.org> | 2010-01-31 11:48:25 +0000 |
commit | 98370595619170317553259ee369d70c9c7717b8 (patch) | |
tree | c7d98933a2f1d73a42370fdc8efc96f22dbf24af /sbin/mknod/mknod.c | |
parent | 0f402c23311b40ba88b3ea3c95cf73ee0b6cf4d4 (diff) | |
download | FreeBSD-src-98370595619170317553259ee369d70c9c7717b8.zip FreeBSD-src-98370595619170317553259ee369d70c9c7717b8.tar.gz |
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.
Diffstat (limited to 'sbin/mknod/mknod.c')
-rw-r--r-- | sbin/mknod/mknod.c | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/sbin/mknod/mknod.c b/sbin/mknod/mknod.c index 4c6c399..6905cae 100644 --- a/sbin/mknod/mknod.c +++ b/sbin/mknod/mknod.c @@ -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'"); - - 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"); + 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"); + } else { + mode = 0666 | S_IFCHR; + dev = 0; + } uid = gid = -1; if (6 == argc) { |