|
|
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.