xref: /csrg-svn/lib/libc/gen/initgroups.c (revision 13176)
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