Annotation of researchv9/libc/gen/setupgroups.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.