- int i;
-
- setgrp(0, grps);
- for (i = 0; i < NGRPS; i++)
- if (grps[i/(sizeof(int)*8)] & (1<<(i%(sizeof(int)*8)))) {
- gr = getgrgid(i);
- if (gr == NULL)
- printf("%s%d", sep, i);
- else
- printf("%s%s", sep, gr->gr_name);
+ struct group *gr;
+
+ if (argc > 1)
+ showgroups(argv[1]);
+ ngroups = getgroups(NGROUPS, groups);
+ for (i = 0; i < ngroups; i++) {
+ gr = getgrgid(groups[i]);
+ if (gr == NULL)
+ printf("%s%d", sep, groups[i]);
+ else
+ printf("%s%s", sep, gr->gr_name);
+ sep = " ";
+ }
+ printf("\n");
+ exit(0);
+}
+
+showgroups(user)
+ register char *user;
+{
+ register struct group *gr;
+ register struct passwd *pw;
+ register char **cp;
+ char *sep = "";
+
+ if ((pw = getpwnam(user)) == NULL) {
+ fprintf(stderr, "groups: no such user.\n");
+ exit(1);
+ }
+ while (gr = getgrent()) {
+ if (pw->pw_gid == gr->gr_gid) {
+ printf("%s%s", sep, gr->gr_name);