|
|
1.1 root 1: /*
2: ** Set up access groups.
3: */
4:
5: #include <sys/types.h>
6: #include <setjmp.h>
7: #include <grp.h>
8:
9: #define SYSERROR (-1)
10:
11: static int catchsys();
12: static jmp_buf Sigsysbuf;
13:
14: int
15: setupgroups(name, gid)
16: char * name;
17: int gid;
18: {
19: register char ** cpp;
20: register short * gp;
21: register struct group * grp;
22: register int n;
23: register int (*oldsig)();
24: int on;
25: short groups[NGROUPS];
26:
27: oldsig = signal(SIGSYS, catchsys);
28:
29: if
30: (
31: setjmp(Sigsysbuf)
32: ||
33: (on = getgroups(NGROUPS, groups)) == SYSERROR
34: )
35: {
36: (void)signal(SIGSYS, oldsig);
37: return 0; /* Not installed */
38: }
39:
40: (void)signal(SIGSYS, oldsig);
41:
42: (void)setgrent();
43:
44: gp = groups;
45:
46: while ( gp < &groups[NGROUPS] && (grp = getgrent()) != (struct group *)0 )
47: for ( cpp = grp->gr_mem ; *cpp != (char *)0 ; cpp++ )
48: if ( strcmp(*cpp, name) == 0 && grp->gr_gid != gid )
49: {
50: *gp++ = grp->gr_gid;
51: break;
52: }
53:
54: (void)endgrent();
55:
56: if ( (n = gp-groups) == 0 && on == 0 )
57: return 0;
58:
59: return setgroups(n, groups);
60: }
61:
62: static int
63: catchsys(sig)
64: {
65: longjmp(Sigsysbuf, 1);
66: abort();
67: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.