/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include #include ErrorOr serenity_main(Main::Arguments arguments) { TRY(Core::System::pledge("stdio rpath cpath")); bool recursive = false; bool force = false; bool verbose = false; bool no_preserve_root = false; Vector paths; Core::ArgsParser args_parser; args_parser.add_option(recursive, "Delete directories recursively", "recursive", 'r'); args_parser.add_option(force, "Ignore nonexistent files", "force", 'f'); args_parser.add_option(verbose, "Verbose", "verbose", 'v'); args_parser.add_option(no_preserve_root, "Do not consider '/' specially", "no-preserve-root", 0); args_parser.add_positional_argument(paths, "Path(s) to remove", "path", Core::ArgsParser::Required::No); args_parser.parse(arguments); if (!force && paths.is_empty()) { args_parser.print_usage(stderr, arguments.strings[0]); return 1; } bool had_errors = false; for (auto& path : paths) { if (!no_preserve_root && path == "/") { warnln("rm: '/' is protected, try with --no-preserve-root to override this behavior"); continue; } auto result = Core::DeprecatedFile::remove(path, recursive ? Core::DeprecatedFile::RecursionMode::Allowed : Core::DeprecatedFile::RecursionMode::Disallowed); if (result.is_error()) { auto error = result.release_error(); if (force && error.is_errno() && error.code() == ENOENT) continue; warnln("rm: cannot remove '{}': {}", path, error); had_errors = true; } if (verbose) outln("removed '{}'", path); } return had_errors ? 1 : 0; }