xref: /csrg-svn/lib/libc/gen/initgroups.c (revision 12168)
1*12168Ssam /*	initgroups.c	4.3	83/05/01	*/
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();
23*12168Ssam 	while (grp = getgrent()) {
24*12168Ssam 		if (grp->gr_gid == agroup)
25*12168Ssam 			continue;
269110Ssam 		for (i = 0; grp->gr_mem[i]; i++)
279110Ssam 			if (!strcmp(grp->gr_mem[i], uname)) {
289110Ssam 				if (ngroups == NGROUPS) {
29*12168Ssam fprintf(stderr, "initgroups: %s is in too many groups\n", uname);
309110Ssam 					goto toomany;
319110Ssam 				}
3211073Smckusick 				groups[ngroups++] = grp->gr_gid;
339110Ssam 			}
34*12168Ssam 	}
359110Ssam toomany:
369110Ssam 	if (setgroups(ngroups, groups) < 0) {
37*12168Ssam 		perror("setgroups");
389110Ssam 		return (1);
399110Ssam 	}
409110Ssam 	return (0);
419110Ssam }
42