Annotation of 43BSDTahoe/new/notes/src/perms.c, revision 1.1

1.1     ! root        1: #include "parms.h"
        !             2: #include "structs.h"
        !             3: 
        !             4: #ifdef RCSIDENT
        !             5: static char rcsid[] = "$Header: perms.c,v 1.7.0.1 85/04/09 11:42:48 notes Rel $";
        !             6: #endif RCSIDENT
        !             7: 
        !             8: /* 
        !             9:  *     getperms - opens and reads the permission file to
        !            10:  *     determine the access rights for this user
        !            11:  *
        !            12:  *     Uses a struture similar to PLATO's. A list is scanned
        !            13:  *     until a match is found. The access rights at that point
        !            14:  *     are then awarded to the user. In the event that no
        !            15:  *     match is found, no access rights are granted.
        !            16:  *
        !            17:  *     Original Coding:        Ray Essick      December 1981
        !            18:  */
        !            19: #include       <grp.h>
        !            20: #include       <sys/param.h>                           /* for groups */
        !            21: /*
        !            22:  *     Make sure that the name NGROUPS is defined.
        !            23:  *     pre-4.1a probably doesn't define either.
        !            24:  *     4.1a uses the NGRPS constant
        !            25:  *     4.2 uses the NGROUPS constant
        !            26:  *     We make sure that NGROUPS is defined and use that in the
        !            27:  *     generic portion of the routine. The emulation for V7, 4.1, 4.1a
        !            28:  *     and such use the NGRPS or whatever is appropriate.
        !            29:  */
        !            30: #if    defined(NGRPS) && ! defined(NGROUPS)
        !            31: #define        NGROUPS NGRPS                                   /* name change! */
        !            32: #endif
        !            33: #ifndef                NGROUPS
        !            34: #define                NGROUPS         1                       /* could be better */
        !            35: #endif         NGROUPS
        !            36: 
        !            37: static char *gnameptr[NGROUPS];                                /* point to names */
        !            38: static int  ngroups = 0;                               /* true if have gids */
        !            39: 
        !            40: getperms (io, sysflag, name)
        !            41: struct io_f *io;
        !            42: int     sysflag;                                       /* true for remote system */
        !            43: char   *name;
        !            44: {
        !            45: 
        !            46:     register int    i;
        !            47:     FILE * acs, *fopen ();
        !            48:     struct group   *gr,
        !            49:                    *getgrgid ();
        !            50:     char    fn[WDLEN];
        !            51:     struct perm_f   entry;
        !            52:     int     hisperms;                                  /* built up perms */
        !            53:     int     given;                                     /* if assigned perms */
        !            54: 
        !            55:     if (sysflag == 0 && globuid == Notesuid)           /* "notes" omnipotent */
        !            56:     {
        !            57:        io -> access = READOK + RESPOK + WRITOK + DRCTOK;/* all */
        !            58: /*
        !            59:  *     should I just set it to -1 or something that turns on
        !            60:  *     all the bits?  or leave it with the defined bits only?
        !            61:  */
        !            62:        return;
        !            63:     }
        !            64: 
        !            65:     if (sysflag == 0 && ngroups == 0)
        !            66:     {
        !            67:        register int    i,
        !            68:                        j;                              /* temp loop stuff */
        !            69:        int     gidset[NGROUPS];                        /* hold gid list */
        !            70: 
        !            71:        ngroups = NGROUPS;                              /* max allowed */
        !            72:        /* 
        !            73:         * NOTE that the getgroups system call doesn't behave as 
        !            74:         * documented in the 4.2 manual.  The manual says to call it
        !            75:         * ret=getgroups(&ngroups,&gidset) where ngroups is value-result.
        !            76:         * and ret is 0 on success.  Actual implementation works as below.
        !            77:         */
        !            78:        if ((ngroups = getgroups (ngroups, &gidset)) >= 0)/* worked */
        !            79:        {
        !            80:            for (i = 0, j = 0; i < ngroups; i++)        /* get names */
        !            81:            {
        !            82:                if ((gr = getgrgid (gidset[i])) == NULL)
        !            83:                    continue;                           /* bogus, skip it */
        !            84:                gnameptr[j++] = strsave (gr -> gr_name);/* save it */
        !            85:            }
        !            86:            ngroups = j;                                /* save count */
        !            87:        }
        !            88:     }
        !            89:     io -> access = 0;                                  /* default null */
        !            90:     hisperms = 0;                                      /* set up mask */
        !            91:     given = 0;
        !            92: 
        !            93:     sprintf (fn, "%s/%s/%s", io -> basedir, io -> nf, ACCESS);
        !            94:     x ((acs = fopen (fn, "r")) == NULL, "getperms: no list");
        !            95:     while (fread (&entry, sizeof entry, 1, acs) == 1)
        !            96:     {
        !            97:        if ((sysflag != 0) && (entry.ptype != PERMSYSTEM))
        !            98:            continue;                                   /* looking for systems */
        !            99:        if ((sysflag == 0) && (entry.ptype == PERMSYSTEM))
        !           100:            continue;                                   /* users != systems */
        !           101: 
        !           102:        if (strcmp (entry.name, "Other") == 0)
        !           103:        {
        !           104:            if (!given)                                 /* he hasn't matched */
        !           105:                hisperms = entry.perms;                 /* give him these */
        !           106:            goto gotit;                                 /* and exit ... */
        !           107:        }
        !           108:        switch (entry.ptype)
        !           109:        {
        !           110:            case PERMUSER: 
        !           111:                if (strcmp (name, entry.name) == 0)
        !           112:                {
        !           113:                    hisperms = entry.perms;
        !           114:                    goto gotit;
        !           115:                }
        !           116:                break;
        !           117: 
        !           118:            case PERMGROUP:                             /* a group entry */
        !           119:                for (i = 0; i < ngroups; i++)           /* check all */
        !           120:                    if (strcmp (entry.name, gnameptr[i]) == 0)
        !           121:                    {
        !           122:                        hisperms |= entry.perms;        /* OR them in */
        !           123:                        given++;                        /* mark as such */
        !           124:                        break;
        !           125:                    }
        !           126:                break;
        !           127: 
        !           128:            case PERMSYSTEM: 
        !           129:                if (strcmp (name, entry.name) == 0)
        !           130:                {
        !           131:                    hisperms = entry.perms;
        !           132:                    given++;
        !           133:                    goto gotit;
        !           134:                }
        !           135:                break;
        !           136: 
        !           137:            default:                                    /* bad access list */
        !           138:                x (1, "getperms: bad list");
        !           139:        }
        !           140:     }
        !           141: gotit: 
        !           142:     fclose (acs);                                      /* close the access file */
        !           143:     io -> access = hisperms;                           /* what we built */
        !           144: 
        !           145:     return;
        !           146: }
        !           147: 
        !           148: /*
        !           149:  *     Some compatibility routines to let us use the fancy 4.2 Bsd
        !           150:  *     getgroups() system call while running 4.1, 4.1a or V7 kernels.
        !           151:  *     I've undoubtedly missed some kernels.
        !           152:  */
        !           153: 
        !           154: 
        !           155: /*
        !           156:  *     getgroups
        !           157:  *
        !           158:  *     Returns an integer and a set of groups.
        !           159:  *     Emulates the 4.2 getgroups command under 4.1a Bsd
        !           160:  *
        !           161:  *     Stolen mostly from the 4.1a command "groups".
        !           162:  *
        !           163:  *     Ray Essick, January 1984
        !           164:  *
        !           165:  */
        !           166: 
        !           167: #if    defined (BSD41A)
        !           168: 
        !           169: getgroups (ngroups, gidset)
        !           170: int     ngroups;
        !           171: int    *gidset;
        !           172: {
        !           173:     register int    i;
        !           174:     register int    maxback;                           /* most to user */
        !           175:     int     grps[NGRPS / (sizeof (int) * 8)];          /* NGRPS=NGROUPS */
        !           176: 
        !           177:     setgrp (0, grps);                                  /* get groups */
        !           178:     maxback = ngroups;                                 /* save limit */
        !           179:     ngroups = 0;                                       /* start empty */
        !           180:     for (i = 0; i < NGRPS && ngroups < maxback; i++)   /* for each */
        !           181:        if (grps[i / (sizeof (int) * 8)] & (1 << (i % (sizeof (int) * 8))))
        !           182:        {
        !           183:            *gidset++ = i;                              /* save the group */
        !           184:            ngroups++;                                  /* and count */
        !           185:        }
        !           186:     return (ngroups);
        !           187: }
        !           188: #endif defined (BSD41A)
        !           189: 
        !           190: /*
        !           191:  *     The V7 and 4.1 version of this system call. Also serves well 
        !           192:  *     for the 2.8 Bsd kernels and probably for the more recent BTL
        !           193:  *     kernels.
        !           194:  *     This could be extended to read from /etc/groups to actually give
        !           195:  *     the user all groups he is permitted.
        !           196:  */
        !           197: 
        !           198: #if    defined (V7) || defined (BSD41) || defined (BSD2x) || defined (USG)
        !           199: getgroups (ngroups, gidset)                            /* simple V7 one */
        !           200: int     ngroups;
        !           201: int    *gidset;
        !           202: {
        !           203:     *gidset = getgid () & GIDMASK;
        !           204:     ngroups = 1;
        !           205:     return (1);
        !           206: }
        !           207: #endif defined (V7) || defined (BSD41) || defined (BSD2x) || defined(USG)

unix.superglobalmegacorp.com

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