xref: /csrg-svn/lib/libc/gen/initgroups.c (revision 11073)
1*11073Smckusick /*	initgroups.c	4.2	83/02/15	*/
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();
239110Ssam 	while (grp = getgrent())
249110Ssam 		for (i = 0; grp->gr_mem[i]; i++)
259110Ssam 			if (!strcmp(grp->gr_mem[i], uname)) {
269110Ssam 				if (ngroups == NGROUPS) {
279110Ssam fprintf(stderr, "inigrp: %s is in too many groups\n", uname);
289110Ssam 					goto toomany;
299110Ssam 				}
30*11073Smckusick 				groups[ngroups++] = grp->gr_gid;
319110Ssam 			}
329110Ssam toomany:
339110Ssam 	if (setgroups(ngroups, groups) < 0) {
349110Ssam 		perror("setgrp");
359110Ssam 		return (1);
369110Ssam 	}
379110Ssam 	return (0);
389110Ssam }
39