#include #include #include #include Result mkdir_recursively(StringView path, mode_t mode) { begin: auto rc = os::FileSystem::create_directory(path, mode); if (!rc.has_error()) return {}; if (rc.error() == EEXIST) return {}; if (rc.error() == ENOENT) { PathParser parser = TRY(PathParser::create(path.chars())); auto parent = TRY(parser.dirname()); TRY(mkdir_recursively(parent.view(), mode)); goto begin; } return rc.release_error(); } Result luna_main(int argc, char** argv) { StringView path; StringView mode_string; bool recursive; os::ArgumentParser parser; parser.add_description("Create directories."_sv); parser.add_system_program_info("mkdir"_sv); parser.add_positional_argument(path, "path"_sv, true); parser.add_positional_argument(mode_string, "mode"_sv, "755"_sv); parser.add_switch_argument(recursive, 'p', "parents"_sv, "if parent directories do not exist, create them as well"_sv); parser.parse(argc, argv); mode_t mode = (mode_t)parse_unsigned_integer(mode_string.chars(), nullptr, 8); if (recursive) { TRY(mkdir_recursively(path, mode)); return 0; } TRY(os::FileSystem::create_directory(path, mode)); return 0; }