diff --git a/Userland/Utilities/mknod.cpp b/Userland/Utilities/mknod.cpp index beeb3c5da9..1cc714c976 100644 --- a/Userland/Utilities/mknod.cpp +++ b/Userland/Utilities/mknod.cpp @@ -5,36 +5,36 @@ */ #include +#include #include #include #include #include #include -static int usage() -{ - warnln("usage: mknod [ ]"); - return 1; -} - ErrorOr serenity_main(Main::Arguments arguments) { TRY(Core::System::pledge("stdio dpath")); + StringView name; + StringView type_string; + StringView major_string; + StringView minor_string; + + Core::ArgsParser args_parser; + args_parser.set_general_help("Creates a file system node."); + args_parser.add_positional_argument(name, "Pathname to create", "name", Core::ArgsParser::Required::Yes); + args_parser.add_positional_argument(type_string, "Type of file to create", "type", Core::ArgsParser::Required::Yes); + args_parser.add_positional_argument(major_string, "Major device number", "major", Core::ArgsParser::Required::No); + args_parser.add_positional_argument(minor_string, "Minor device number", "minor", Core::ArgsParser::Required::No); + args_parser.parse(arguments); + // FIXME: Add some kind of option for specifying the file permissions. - if (arguments.strings.size() < 3) - return usage(); - if (arguments.strings[2].starts_with('p')) { - if (arguments.strings.size() != 3) - return usage(); - } else if (arguments.strings.size() != 5) { - return usage(); - } - - auto name = arguments.strings[1]; mode_t mode = 0666; - switch (arguments.strings[2][0]) { + char type = type_string[0]; + + switch (type) { case 'c': case 'u': mode |= S_IFCHR; @@ -46,14 +46,27 @@ ErrorOr serenity_main(Main::Arguments arguments) mode |= S_IFIFO; break; default: - return usage(); + warnln("Invalid device type {}", type); + return 1; + } + + if (type == 'p') { + if (!major_string.is_empty() || !minor_string.is_empty()) { + warnln("Do not set device numbers when creating FIFO"); + return 1; + } + } else { + if (major_string.is_empty() || minor_string.is_empty()) { + warnln("Major and minor device numbers are required"); + return 1; + } } int major = 0; int minor = 0; - if (arguments.strings.size() == 5) { - major = atoi(arguments.argv[3]); - minor = atoi(arguments.argv[4]); + if (type != 'p') { + major = atoi(major_string.characters_without_null_termination()); + minor = atoi(minor_string.characters_without_null_termination()); } TRY(Core::System::mknod(name, mode, makedev(major, minor)));