summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorcircl <circl.lastname@gmail.com>2021-12-31 19:28:24 +0100
committerAndreas Kling <kling@serenityos.org>2022-01-01 15:08:49 +0100
commit4b40d2cc07ee1b4b1ddf3d6025131e935962f48c (patch)
tree59a6354e610158d127d8cd4f740ca3a2033dcd94 /Userland
parent63760603f3adec2fb696018f6c1c77feeb0dbdd0 (diff)
downloadserenity-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.cpp8
-rw-r--r--Userland/Utilities/chown.cpp27
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;
}