Kaynağa Gözat

chown+chgrp: Add --no-dereference option

This option will change the ownership of the symlink rather than the
file it points to.
circl 3 yıl önce
ebeveyn
işleme
4b40d2cc07
2 değiştirilmiş dosya ile 24 ekleme ve 11 silme
  1. 7 1
      Userland/Utilities/chgrp.cpp
  2. 17 10
      Userland/Utilities/chown.cpp

+ 7 - 1
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;
 }

+ 17 - 10
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;
 }