From 96fecc434c76ac3513fdb830a0ba4931b293590d Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Tue, 6 Jun 2023 20:04:11 +0100 Subject: [PATCH] chgrp: Add support for multiple file paths --- Base/usr/share/man/man1/chgrp.md | 6 +++--- Userland/Utilities/chgrp.cpp | 24 ++++++++++++++++-------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/Base/usr/share/man/man1/chgrp.md b/Base/usr/share/man/man1/chgrp.md index 1e67a3f1152..0725e2f343c 100644 --- a/Base/usr/share/man/man1/chgrp.md +++ b/Base/usr/share/man/man1/chgrp.md @@ -1,12 +1,12 @@ ## Name -chgrp - change group ownership of file +chgrp - change group ownership of files ## Synopsis ```**sh -$ chgrp -$ chgrp +$ chgrp +$ chgrp ``` ## Description diff --git a/Userland/Utilities/chgrp.cpp b/Userland/Utilities/chgrp.cpp index 716f958e6e8..01a0a1d7d28 100644 --- a/Userland/Utilities/chgrp.cpp +++ b/Userland/Utilities/chgrp.cpp @@ -14,14 +14,14 @@ ErrorOr serenity_main(Main::Arguments arguments) TRY(Core::System::pledge("stdio rpath chown")); StringView gid_arg; - StringView path {}; + Vector paths; bool dont_follow_symlinks = false; Core::ArgsParser args_parser; - args_parser.set_general_help("Change the owning group for a file or directory."); + args_parser.set_general_help("Change the owning group for files or directories."); args_parser.add_option(dont_follow_symlinks, "Don't follow symlinks", "no-dereference", 'h'); args_parser.add_positional_argument(gid_arg, "Group ID", "gid"); - args_parser.add_positional_argument(path, "Path to file", "path"); + args_parser.add_positional_argument(paths, "Paths to files", "paths"); args_parser.parse(arguments); gid_t new_gid = -1; @@ -43,11 +43,19 @@ ErrorOr serenity_main(Main::Arguments arguments) new_gid = group->gr_gid; } - if (dont_follow_symlinks) { - TRY(Core::System::lchown(path, -1, new_gid)); - } else { - TRY(Core::System::chown(path, -1, new_gid)); + auto has_errors = false; + for (auto path : paths) { + ErrorOr maybe_error; + if (dont_follow_symlinks) + maybe_error = Core::System::lchown(path, -1, new_gid); + else + maybe_error = Core::System::chown(path, -1, new_gid); + + if (maybe_error.is_error()) { + has_errors = true; + warnln("Changing group of '{}'. {}", path, maybe_error.release_error()); + } } - return 0; + return has_errors ? 1 : 0; }