static void print_group_list (char *username) { print_group (rgid); if (egid != rgid) { putchar (' '); print_group (egid); } #if HAVE_GETGROUPS { int n_groups; GETGROUPS_T *groups; register int i; if (xgetgroups (username, &n_groups, &groups)) { ++problems; return; } for (i = 0; i < n_groups; i++) if (groups[i] != rgid && groups[i] != egid) { putchar (' '); print_group (groups[i]); } free (groups); } #endif }
/* Print all of the distinct groups the user is in. */ extern bool print_group_list (const char *username, uid_t ruid, gid_t rgid, gid_t egid, bool use_names, char delim) { bool ok = true; struct passwd *pwd = NULL; if (username) { pwd = getpwuid (ruid); if (pwd == NULL) ok = false; } if (!print_group (rgid, use_names)) ok = false; if (egid != rgid) { putchar (delim); if (!print_group (egid, use_names)) ok = false; } { gid_t *groups; int n_groups = xgetgroups (username, (pwd ? pwd->pw_gid : egid), &groups); if (n_groups < 0) { if (username) { error (0, errno, _("failed to get groups for user %s"), quote (username)); } else { error (0, errno, _("failed to get groups for the current process")); } return false; } for (int i = 0; i < n_groups; i++) if (groups[i] != rgid && groups[i] != egid) { putchar (delim); if (!print_group (groups[i], use_names)) ok = false; } free (groups); } return ok; }
static void print_full_info (char *username) { struct passwd *pwd; struct group *grp; printf ("uid=%u", (unsigned) ruid); pwd = getpwuid (ruid); if (pwd == NULL) problems++; else printf ("(%s)", pwd->pw_name); printf (" gid=%u", (unsigned) rgid); grp = getgrgid (rgid); if (grp == NULL) problems++; else printf ("(%s)", grp->gr_name); if (euid != ruid) { printf (" euid=%u", (unsigned) euid); pwd = getpwuid (euid); if (pwd == NULL) problems++; else printf ("(%s)", pwd->pw_name); } if (egid != rgid) { printf (" egid=%u", (unsigned) egid); grp = getgrgid (egid); if (grp == NULL) problems++; else printf ("(%s)", grp->gr_name); } #if HAVE_GETGROUPS { int n_groups; GETGROUPS_T *groups; register int i; if (xgetgroups (username, &n_groups, &groups)) { ++problems; return; } if (n_groups > 0) fputs (_(" groups="), stdout); for (i = 0; i < n_groups; i++) { if (i > 0) putchar (','); printf ("%u", (unsigned) groups[i]); grp = getgrgid (groups[i]); if (grp == NULL) problems++; else printf ("(%s)", grp->gr_name); } free (groups); } #endif }