coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] chgrp: --from parameter similar to chown


From: Ed Neville
Subject: Re: [PATCH] chgrp: --from parameter similar to chown
Date: Tue, 31 Oct 2023 17:51:39 +0000

Hi there,

Please could one of the maintainers take a look at this patch? Is it 
ready for merge? It should be a straight forward change that brings the 
same functionality from chown.

Best regards,
Ed

On 2023-09-27 20:32+0100, Ed Neville wrote:
> 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
> 
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]