diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2004-08-19 20:02:46 +0000 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2004-08-19 20:02:46 +0000 |
commit | bbc2ac99c1c717248d9d4594e0ad0e683ea7da6d (patch) | |
tree | 213d3c377efd30783e17e8573924a3f2aca172a7 | |
parent | c25bd1c9ce29d452b11fd6f0885deb31f994df95 (diff) | |
download | coreutils-bbc2ac99c1c717248d9d4594e0ad0e683ea7da6d.tar.xz |
(parse_group): Return gid_t rather than storing it
through a pointer. Treat "chgrp '' file" as a no-op change,
as FreeBSD does.
(main): Set chopt.group_name to NULL if the group is the empty
string.
-rw-r--r-- | src/chgrp.c | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/src/chgrp.c b/src/chgrp.c index a862c516d..2892434d6 100644 --- a/src/chgrp.c +++ b/src/chgrp.c @@ -75,28 +75,30 @@ static struct option const long_options[] = {0, 0, 0, 0} }; -/* Set *G according to NAME. */ +/* Return the group ID of NAME, or -1 if no name was specified. */ -static void -parse_group (const char *name, gid_t *g) +static gid_t +parse_group (const char *name) { - struct group *grp; + gid_t gid = -1; - if (*name == '\0') - error (EXIT_FAILURE, 0, _("cannot change to null group")); - - grp = getgrnam (name); - if (grp == NULL) + if (*name) { - unsigned long int tmp_long; - if (! (xstrtoul (name, NULL, 10, &tmp_long, "") == LONGINT_OK - && tmp_long <= GID_T_MAX)) - error (EXIT_FAILURE, 0, _("invalid group %s"), quote (name)); - *g = tmp_long; + struct group *grp = getgrnam (name); + if (grp) + gid = grp->gr_gid; + else + { + unsigned long int tmp; + if (! (xstrtoul (name, NULL, 10, &tmp, "") == LONGINT_OK + && tmp <= GID_T_MAX)) + error (EXIT_FAILURE, 0, _("invalid group %s"), quote (name)); + gid = tmp; + } + endgrent (); /* Save a file descriptor. */ } - else - *g = grp->gr_gid; - endgrent (); /* Save a file descriptor. */ + + return gid; } void @@ -281,8 +283,9 @@ main (int argc, char **argv) } else { - chopt.group_name = argv[optind++]; - parse_group (chopt.group_name, &gid); + char *group_name = argv[optind++]; + chopt.group_name = (*group_name ? group_name : NULL); + gid = parse_group (group_name); } ok = chown_files (argv + optind, bit_flags, |