diff options
Diffstat (limited to 'coreutils/mknod.c')
-rw-r--r-- | coreutils/mknod.c | 53 |
1 files changed, 38 insertions, 15 deletions
diff --git a/coreutils/mknod.c b/coreutils/mknod.c index 40f508d..0c93df6 100644 --- a/coreutils/mknod.c +++ b/coreutils/mknod.c @@ -28,23 +28,47 @@ #include <fcntl.h> #include <unistd.h> -static const char mknod_usage[] = "mknod NAME TYPE MAJOR MINOR\n\n" - "Make block or character special files.\n\n" +static const char mknod_usage[] = "mknod [OPTIONS] NAME TYPE MAJOR MINOR\n\n" + "Create a special file (block, character, or pipe).\n\n" + "Options:\n" + "\t-m\tcreate the special file using the specified mode (default a=rw)\n\n" "TYPEs include:\n" "\tb:\tMake a block (buffered) device.\n" - "\tc or u:\tMake a character (un-buffered) device.\n" - "\tp:\tMake a named pipe. Major and minor are ignored for named pipes.\n"; + "\tp:\tMake a named pipe. MAJOR and MINOR are ignored for named pipes.\n"; int mknod_main(int argc, char **argv) { + char *thisarg; mode_t mode = 0; + mode_t perm = 0666; dev_t dev = 0; - if (argc != 5 || **(argv + 1) == '-') { + argc--; + argv++; + + /* Parse any options */ + while (argc > 1) { + if (**argv != '-') + break; + thisarg = *argv; + thisarg++; + switch (*thisarg) { + case 'm': + argc--; + argv++; + parse_mode(*argv, &perm); + break; + default: + usage(mknod_usage); + } + argc--; + argv++; + } + if (argc != 4 && argc != 2) { usage(mknod_usage); } - switch (argv[2][0]) { + switch (argv[1][0]) { case 'c': case 'u': mode = S_IFCHR; @@ -54,23 +78,22 @@ int mknod_main(int argc, char **argv) break; case 'p': mode = S_IFIFO; + if (argc!=2) { + usage(mknod_usage); + } break; default: usage(mknod_usage); } if (mode == S_IFCHR || mode == S_IFBLK) { - dev = (atoi(argv[3]) << 8) | atoi(argv[4]); - if (argc != 5) { - usage(mknod_usage); - } + dev = (atoi(argv[2]) << 8) | atoi(argv[1]); } - mode |= 0666; + mode |= perm; - if (mknod(argv[1], mode, dev) != 0) { - perror(argv[1]); - exit (FALSE); - } + if (mknod(argv[0], mode, dev) != 0) + fatalError("%s: %s\n", argv[0], strerror(errno)); exit (TRUE); } + |