diff options
-rw-r--r-- | coreutils/mknod.c | 56 |
1 files changed, 28 insertions, 28 deletions
diff --git a/coreutils/mknod.c b/coreutils/mknod.c index 565b33d..d57167f 100644 --- a/coreutils/mknod.c +++ b/coreutils/mknod.c @@ -20,7 +20,7 @@ /* BB_AUDIT SUSv3 N/A -- Matches GNU behavior. */ //usage:#define mknod_trivial_usage -//usage: "[-m MODE] " IF_SELINUX("[-Z] ") "NAME TYPE MAJOR MINOR" +//usage: "[-m MODE] " IF_SELINUX("[-Z] ") "NAME TYPE [MAJOR MINOR]" //usage:#define mknod_full_usage "\n\n" //usage: "Create a special file (block, character, or pipe)\n" //usage: "\n -m MODE Creation mode (default a=rw)" @@ -30,7 +30,7 @@ //usage: "\nTYPE:" //usage: "\n b Block device" //usage: "\n c or u Character device" -//usage: "\n p Named pipe (MAJOR and MINOR are ignored)" +//usage: "\n p Named pipe (MAJOR MINOR must be omitted)" //usage: //usage:#define mknod_example_usage //usage: "$ mknod /dev/fd0 b 2 0\n" @@ -47,40 +47,40 @@ static const char modes_chars[] ALIGN1 = { 'p', 'c', 'u', 'b', 0, 1, 1, 2 }; static const mode_t modes_cubp[] = { S_IFIFO, S_IFCHR, S_IFBLK }; int mknod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; -int mknod_main(int argc, char **argv) +int mknod_main(int argc UNUSED_PARAM, char **argv) { mode_t mode; dev_t dev; - const char *name; + const char *type, *arg; mode = getopt_mk_fifo_nod(argv); argv += optind; - argc -= optind; + //argc -= optind; - if (argc >= 2) { - name = strchr(modes_chars, argv[1][0]); - if (name != NULL) { - mode |= modes_cubp[(int)(name[4])]; + if (!argv[0] || !argv[1]) + bb_show_usage(); + type = strchr(modes_chars, argv[1][0]); + if (!type) + bb_show_usage(); - dev = 0; - if (*name != 'p') { - argc -= 2; - if (argc == 2) { - /* Autodetect what the system supports; these macros should - * optimize out to two constants. */ - dev = makedev(xatoul_range(argv[2], 0, major(UINT_MAX)), - xatoul_range(argv[3], 0, minor(UINT_MAX))); - } - } + mode |= modes_cubp[(int)(type[4])]; - if (argc == 2) { - name = *argv; - if (mknod(name, mode, dev) == 0) { - return EXIT_SUCCESS; - } - bb_simple_perror_msg_and_die(name); - } - } + dev = 0; + arg = argv[2]; + if (*type != 'p') { + if (!argv[2] || !argv[3]) + bb_show_usage(); + /* Autodetect what the system supports; these macros should + * optimize out to two constants. */ + dev = makedev(xatoul_range(argv[2], 0, major(UINT_MAX)), + xatoul_range(argv[3], 0, minor(UINT_MAX))); + arg = argv[4]; } - bb_show_usage(); + if (arg) + bb_show_usage(); + + if (mknod(argv[0], mode, dev) != 0) { + bb_simple_perror_msg_and_die(argv[0]); + } + return EXIT_SUCCESS; } |