Annotation of researchv9/libc/gen/setupgroups.c, revision 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.