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