summaryrefslogtreecommitdiffstats
path: root/sbin/mknod/mknod.c
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2010-01-31 11:48:25 +0000
committered <ed@FreeBSD.org>2010-01-31 11:48:25 +0000
commit98370595619170317553259ee369d70c9c7717b8 (patch)
treec7d98933a2f1d73a42370fdc8efc96f22dbf24af /sbin/mknod/mknod.c
parent0f402c23311b40ba88b3ea3c95cf73ee0b6cf4d4 (diff)
downloadFreeBSD-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.c54
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) {
OpenPOWER on IntegriCloud