xref: /csrg-svn/lib/libc/gen/initgroups.c (revision 26567)
1 /*
2  * Copyright (c) 1983 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  */
6 
7 #if defined(LIBC_SCCS) && !defined(lint)
8 static char sccsid[] = "@(#)initgroups.c	5.2 (Berkeley) 03/09/86";
9 #endif LIBC_SCCS and not lint
10 
11 /*
12  * initgroups
13  */
14 #include <stdio.h>
15 #include <sys/param.h>
16 #include <grp.h>
17 
18 struct group *getgrent();
19 
20 initgroups(uname, agroup)
21 	char *uname;
22 	int agroup;
23 {
24 	int groups[NGROUPS], ngroups = 0;
25 	register struct group *grp;
26 	register int i;
27 
28 	if (agroup >= 0)
29 		groups[ngroups++] = agroup;
30 	setgrent();
31 	while (grp = getgrent()) {
32 		if (grp->gr_gid == agroup)
33 			continue;
34 		for (i = 0; grp->gr_mem[i]; i++)
35 			if (!strcmp(grp->gr_mem[i], uname)) {
36 				if (ngroups == NGROUPS) {
37 fprintf(stderr, "initgroups: %s is in too many groups\n", uname);
38 					goto toomany;
39 				}
40 				groups[ngroups++] = grp->gr_gid;
41 			}
42 	}
43 toomany:
44 	endgrent();
45 	if (setgroups(ngroups, groups) < 0) {
46 		perror("setgroups");
47 		return (1);
48 	}
49 	return (0);
50 }
51