[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] chgrp: --from parameter similar to chown
From: |
Ed Neville |
Subject: |
[PATCH] chgrp: --from parameter similar to chown |
Date: |
Wed, 27 Sep 2023 20:32:06 +0100 |
A friend at work noticed that chown had a --from and needed that
functionality in chgrp.
---
src/chgrp.c | 26 +++++++++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/src/chgrp.c b/src/chgrp.c
index 6ec3b4d99..f780a6fc2 100644
--- a/src/chgrp.c
+++ b/src/chgrp.c
@@ -28,6 +28,7 @@
#include "quote.h"
#include "root-dev-ino.h"
#include "xstrtol.h"
+#include "userspec.h"
/* The official name of this program (e.g., no 'g' prefix). */
#define PROGRAM_NAME "chgrp"
@@ -49,6 +50,7 @@ static char *reference_file;
enum
{
DEREFERENCE_OPTION = CHAR_MAX + 1,
+ FROM_OPTION,
NO_PRESERVE_ROOT,
PRESERVE_ROOT,
REFERENCE_FILE_OPTION
@@ -59,6 +61,7 @@ static struct option const long_options[] =
{"recursive", no_argument, nullptr, 'R'},
{"changes", no_argument, nullptr, 'c'},
{"dereference", no_argument, nullptr, DEREFERENCE_OPTION},
+ {"from", required_argument, nullptr, FROM_OPTION},
{"no-dereference", no_argument, nullptr, 'h'},
{"no-preserve-root", no_argument, nullptr, NO_PRESERVE_ROOT},
{"preserve-root", no_argument, nullptr, PRESERVE_ROOT},
@@ -121,6 +124,11 @@ With --reference, change the group of each FILE to that of
RFILE.\n\
-v, --verbose output a diagnostic for every file processed\n\
"), stdout);
fputs (_("\
+ --from=CURRENT_OWNER:CURRENT_GROUP\n\
+ change the group of each file only if its current\n\
+ owner and/or group match those specified here.\n\
+ Either may be omitted, in which case a match is \n\
+ not required for the omitted attribute\n\
--dereference affect the referent of each symbolic link (this is\n\
the default), rather than the symbolic link itself\n\
-h, --no-dereference affect symbolic links instead of any referenced
file\n\
@@ -184,6 +192,11 @@ main (int argc, char **argv)
bool ok;
int optc;
+ /* Change the group of a file only if it has this uid/gid.
+ * -1 means there's no restriction. */
+ uid_t required_uid = -1;
+ gid_t required_gid = -1;
+
initialize_main (&argc, &argv);
set_program_name (argv[0]);
setlocale (LC_ALL, "");
@@ -232,6 +245,17 @@ main (int argc, char **argv)
reference_file = optarg;
break;
+ case FROM_OPTION:
+ {
+ bool warn;
+ char const *e = parse_user_spec_warn (optarg,
+ &required_uid, &required_gid,
+ nullptr, nullptr, &warn);
+ if (e)
+ error (warn ? 0 : EXIT_FAILURE, 0, "%s: %s", e, quote (optarg));
+ break;
+ }
+
case 'R':
chopt.recurse = true;
break;
@@ -309,7 +333,7 @@ main (int argc, char **argv)
bit_flags |= FTS_DEFER_STAT;
ok = chown_files (argv + optind, bit_flags,
(uid_t) -1, gid,
- (uid_t) -1, (gid_t) -1, &chopt);
+ (uid_t) required_uid, required_gid, &chopt);
main_exit (ok ? EXIT_SUCCESS : EXIT_FAILURE);
}
--
2.39.2
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] chgrp: --from parameter similar to chown,
Ed Neville <=