X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=coreutils%2Fmknod.c;h=b4d4b82a109cba977bffc206c16da96359f0c8a7;hb=ce98c19dfe7bcfb3174c0898f3c001c38c6d44c6;hp=40f508d334c6dd8ce0a3beb0cf507c0581824d0d;hpb=9cf3bfa7c1bf3ad959c61711c9a5ac1969149300;p=oweals%2Fbusybox.git diff --git a/coreutils/mknod.c b/coreutils/mknod.c index 40f508d33..b4d4b82a1 100644 --- a/coreutils/mknod.c +++ b/coreutils/mknod.c @@ -20,31 +20,48 @@ * */ -#include "internal.h" #include #include -#include -#include #include #include - -static const char mknod_usage[] = "mknod NAME TYPE MAJOR MINOR\n\n" - "Make block or character special files.\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"; +#include +#include +#include +#include "busybox.h" 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) == '-') { - usage(mknod_usage); + argc--; + argv++; + + /* Parse any options */ + while (argc > 1) { + if (**argv != '-') + break; + thisarg = *argv; + thisarg++; + switch (*thisarg) { + case 'm': + argc--; + argv++; + parse_mode(*argv, &perm); + umask(0); + break; + default: + show_usage(); + } + argc--; + argv++; } - switch (argv[2][0]) { + if (argc != 4 && argc != 2) { + show_usage(); + } + switch (argv[1][0]) { case 'c': case 'u': mode = S_IFCHR; @@ -54,23 +71,22 @@ int mknod_main(int argc, char **argv) break; case 'p': mode = S_IFIFO; + if (argc!=2) { + show_usage(); + } break; default: - usage(mknod_usage); + show_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[3]); } - mode |= 0666; + mode |= perm; - if (mknod(argv[1], mode, dev) != 0) { - perror(argv[1]); - exit (FALSE); - } - exit (TRUE); + if (mknod(argv[0], mode, dev) != 0) + perror_msg_and_die("%s", argv[0]); + return EXIT_SUCCESS; } +