xref: /csrg-svn/lib/libc/gen/initgroups.c (revision 9110)
1*9110Ssam /*	initgroups.c	4.1	82/11/07	*/
2*9110Ssam 
3*9110Ssam /*
4*9110Ssam  * initgroups
5*9110Ssam  */
6*9110Ssam #include <stdio.h>
7*9110Ssam #include <sys/param.h>
8*9110Ssam #include <grp.h>
9*9110Ssam 
10*9110Ssam struct group *getgrent();
11*9110Ssam 
12*9110Ssam initgroups(uname, agroup)
13*9110Ssam 	char *uname;
14*9110Ssam 	int agroup;
15*9110Ssam {
16*9110Ssam 	int groups[NGROUPS], ngroups = 0;
17*9110Ssam 	register struct group *grp;
18*9110Ssam 	register int i;
19*9110Ssam 
20*9110Ssam 	if (agroup >= 0)
21*9110Ssam 		groups[ngroups++] = agroup;
22*9110Ssam 	setgrent();
23*9110Ssam 	while (grp = getgrent())
24*9110Ssam 		for (i = 0; grp->gr_mem[i]; i++)
25*9110Ssam 			if (!strcmp(grp->gr_mem[i], uname)) {
26*9110Ssam 				groups[ngroups++] = grp->gr_gid;
27*9110Ssam 				if (ngroups == NGROUPS) {
28*9110Ssam fprintf(stderr, "inigrp: %s is in too many groups\n", uname);
29*9110Ssam 					goto toomany;
30*9110Ssam 				}
31*9110Ssam 			}
32*9110Ssam toomany:
33*9110Ssam 	if (setgroups(ngroups, groups) < 0) {
34*9110Ssam 		perror("setgrp");
35*9110Ssam 		return (1);
36*9110Ssam 	}
37*9110Ssam 	return (0);
38*9110Ssam }
39