1*13176Ssam /* initgroups.c 4.4 83/06/17 */ 29110Ssam 39110Ssam /* 49110Ssam * initgroups 59110Ssam */ 69110Ssam #include <stdio.h> 79110Ssam #include <sys/param.h> 89110Ssam #include <grp.h> 99110Ssam 109110Ssam struct group *getgrent(); 119110Ssam 129110Ssam initgroups(uname, agroup) 139110Ssam char *uname; 149110Ssam int agroup; 159110Ssam { 169110Ssam int groups[NGROUPS], ngroups = 0; 179110Ssam register struct group *grp; 189110Ssam register int i; 199110Ssam 209110Ssam if (agroup >= 0) 219110Ssam groups[ngroups++] = agroup; 229110Ssam setgrent(); 2312168Ssam while (grp = getgrent()) { 2412168Ssam if (grp->gr_gid == agroup) 2512168Ssam continue; 269110Ssam for (i = 0; grp->gr_mem[i]; i++) 279110Ssam if (!strcmp(grp->gr_mem[i], uname)) { 289110Ssam if (ngroups == NGROUPS) { 2912168Ssam fprintf(stderr, "initgroups: %s is in too many groups\n", uname); 309110Ssam goto toomany; 319110Ssam } 3211073Smckusick groups[ngroups++] = grp->gr_gid; 339110Ssam } 3412168Ssam } 359110Ssam toomany: 36*13176Ssam endgrent(); 379110Ssam if (setgroups(ngroups, groups) < 0) { 3812168Ssam perror("setgroups"); 399110Ssam return (1); 409110Ssam } 419110Ssam return (0); 429110Ssam } 43