diff options
author | circl <circl.lastname@gmail.com> | 2021-12-31 19:28:24 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-01-01 15:08:49 +0100 |
commit | 4b40d2cc07ee1b4b1ddf3d6025131e935962f48c (patch) | |
tree | 59a6354e610158d127d8cd4f740ca3a2033dcd94 /Userland | |
parent | 63760603f3adec2fb696018f6c1c77feeb0dbdd0 (diff) | |
download | serenity-4b40d2cc07ee1b4b1ddf3d6025131e935962f48c.zip |
chown+chgrp: Add --no-dereference option
This option will change the ownership of the symlink rather than the
file it points to.
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Utilities/chgrp.cpp | 8 | ||||
-rw-r--r-- | Userland/Utilities/chown.cpp | 27 |
2 files changed, 24 insertions, 11 deletions
diff --git a/Userland/Utilities/chgrp.cpp b/Userland/Utilities/chgrp.cpp index 580febb215..269b3a8592 100644 --- a/Userland/Utilities/chgrp.cpp +++ b/Userland/Utilities/chgrp.cpp @@ -17,9 +17,11 @@ ErrorOr<int> serenity_main(Main::Arguments arguments) const char* gid_arg = nullptr; const char* path = nullptr; + 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.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.parse(arguments); @@ -43,7 +45,11 @@ ErrorOr<int> serenity_main(Main::Arguments arguments) new_gid = group->gr_gid; } - TRY(Core::System::chown(path, -1, new_gid)); + if (dont_follow_symlinks) { + TRY(Core::System::lchown(path, -1, new_gid)); + } else { + TRY(Core::System::chown(path, -1, new_gid)); + } return 0; } diff --git a/Userland/Utilities/chown.cpp b/Userland/Utilities/chown.cpp index 85d667baff..30bac63045 100644 --- a/Userland/Utilities/chown.cpp +++ b/Userland/Utilities/chown.cpp @@ -6,6 +6,7 @@ #include <AK/String.h> #include <AK/Vector.h> +#include <LibCore/ArgsParser.h> #include <LibCore/System.h> #include <LibMain/Main.h> #include <grp.h> @@ -19,19 +20,21 @@ ErrorOr<int> serenity_main(Main::Arguments arguments) { TRY(Core::System::pledge("stdio rpath chown", nullptr)); - if (arguments.strings.size() < 3) { - warnln("usage: chown <uid[:gid]> <path>"); - return 1; - } + String spec; + String path; + bool dont_follow_symlinks = false; + + Core::ArgsParser args_parser; + args_parser.set_general_help("Change the ownership of a file or directory."); + args_parser.add_option(dont_follow_symlinks, "Don't follow symlinks", "no-dereference", 'h'); + args_parser.add_positional_argument(spec, "User and group IDs", "USER[:GROUP]"); + args_parser.add_positional_argument(path, "Path to file", "PATH"); + args_parser.parse(arguments); uid_t new_uid = -1; gid_t new_gid = -1; - auto parts = arguments.strings[1].split_view(':', true); - if (parts.is_empty()) { - warnln("Empty uid/gid spec"); - return 1; - } + auto parts = spec.split_view(':', true); if (parts[0].is_empty() || (parts.size() == 2 && parts[1].is_empty()) || parts.size() > 2) { warnln("Invalid uid/gid spec"); return 1; @@ -63,7 +66,11 @@ ErrorOr<int> serenity_main(Main::Arguments arguments) } } - TRY(Core::System::chown(arguments.strings[2], new_uid, new_gid)); + if (dont_follow_symlinks) { + TRY(Core::System::lchown(path, new_uid, new_gid)); + } else { + TRY(Core::System::chown(path, new_uid, new_gid)); + } return 0; } |