|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #if defined(LIBC_SCCS) && !defined(lint)
21: static char sccsid[] = "@(#)initgroups.c 5.6 (Berkeley) 6/1/90";
22: #endif /* LIBC_SCCS and not lint */
23:
24: /*
25: * initgroups
26: */
27: #include <stdio.h>
28: #include <sys/param.h>
29: #include <grp.h>
30:
31: struct group *getgrent();
32:
33: initgroups(uname, agroup)
34: char *uname;
35: int agroup;
36: {
37: int groups[NGROUPS], ngroups = 0;
38: register struct group *grp;
39: register int i;
40:
41: /*
42: * If installing primary group, duplicate it;
43: * the first element of groups is the effective gid
44: * and will be overwritten when a setgid file is executed.
45: */
46: if (agroup >= 0) {
47: groups[ngroups++] = agroup;
48: groups[ngroups++] = agroup;
49: }
50: setgrent();
51: while (grp = getgrent()) {
52: if (grp->gr_gid == agroup)
53: continue;
54: for (i = 0; grp->gr_mem[i]; i++)
55: if (!strcmp(grp->gr_mem[i], uname)) {
56: if (ngroups == NGROUPS) {
57: fprintf(stderr, "initgroups: %s is in too many groups\n", uname);
58: goto toomany;
59: }
60: groups[ngroups++] = grp->gr_gid;
61: }
62: }
63: toomany:
64: endgrent();
65: if (setgroups(ngroups, groups) < 0) {
66: perror("setgroups");
67: return (-1);
68: }
69: return (0);
70: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.