diff options
author | Jim Meyering <jim@meyering.net> | 1996-05-21 04:19:02 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 1996-05-21 04:19:02 +0000 |
commit | 4c8f85373573f0957c7cca39df771ed13e1ba282 (patch) | |
tree | 8116084978d41dbe873689cd10ba4a5378e4e284 /src | |
parent | 6225a432232bc0ae7d1a4560324e6f040bb4ab21 (diff) | |
download | coreutils-4c8f85373573f0957c7cca39df771ed13e1ba282.tar.xz |
(xgetgroups): New function, factored out of
print_group_list and print_full_info.
(print_group_list): Call it.
(print_full_info): Call it.
From Andreas Schwab:
(print_group_list): When USERNAME is specified use
getugroups to get the number of groups.
(print_full_info): Likewise.
Diffstat (limited to 'src')
-rw-r--r-- | src/id.c | 63 |
1 files changed, 39 insertions, 24 deletions
@@ -218,6 +218,40 @@ print_group (int gid) printf ("%s", grp->gr_name); } +static int +xgetgroups (const char *username, int *n_groups, GETGROUPS_T **groups) +{ + int max_n_groups; + int ng; + GETGROUPS_T *g; + int fail = 0; + + if (username == 0) + max_n_groups = getgroups (0, NULL); + else + max_n_groups = getugroups (0, NULL, username); + + /* Add 1 just in case max_n_groups is zero. */ + g = (GETGROUPS_T *) xmalloc (max_n_groups * sizeof (GETGROUPS_T) + 1); + if (username == 0) + ng = getgroups (max_n_groups, g); + else + ng = getugroups (max_n_groups, g, username); + + if (ng < 0) + { + error (0, errno, _("cannot get supplemental group list")); + ++fail; + free (groups); + } + if (!fail) + { + *n_groups = ng; + *groups = g; + } + return fail; +} + /* Print all of the distinct groups the user is in . */ static void @@ -232,23 +266,13 @@ print_group_list (char *username) #if HAVE_GETGROUPS { - int ng, n_groups; + int n_groups; GETGROUPS_T *groups; register int i; - n_groups = getgroups (0, NULL); - /* Add 1 just in case n_groups is zero. */ - groups = (GETGROUPS_T *) xmalloc (n_groups * sizeof (GETGROUPS_T) + 1); - if (username == 0) - ng = getgroups (n_groups, groups); - else - ng = getugroups (n_groups, groups, username); - - if (ng < 0) + if (xgetgroups (username, &n_groups, &groups)) { - error (0, errno, _("cannot get supplemental group list")); ++problems; - free (groups); return; } @@ -307,22 +331,13 @@ print_full_info (char *username) #if HAVE_GETGROUPS { - int ng, n_groups; + int n_groups; GETGROUPS_T *groups; register int i; - n_groups = getgroups (0, NULL); - /* Add 1 just in case n_groups is zero. */ - groups = (GETGROUPS_T *) xmalloc (n_groups * sizeof (GETGROUPS_T) + 1); - if (username == 0) - ng = getgroups (n_groups, groups); - else - ng = getugroups (n_groups, groups, username); - if (ng < 0) + if (xgetgroups (username, &n_groups, &groups)) { - error (0, errno, _("cannot get supplemental group list")); - problems++; - free (groups); + ++problems; return; } |