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

1.1     ! root        1: #include "parms.h"
        !             2: #include "structs.h"
        !             3: 
        !             4: #ifdef RCSIDENT
        !             5: static char rcsid[] = "$Header: acssort.c,v 1.7 85/01/18 15:40:40 notes Rel $";
        !             6: #endif RCSIDENT
        !             7: 
        !             8: /*
        !             9:  *     acssort
        !            10:  *
        !            11:  *     Routines in this file are used to sort access lists.
        !            12:  *     Splintered off from access.c so that nfaccess.c can use
        !            13:  *     them.
        !            14:  *
        !            15:  *     Also contains routines to add entries to an access list
        !            16:  *     and to parse an ascii representation of an access right.
        !            17:  *
        !            18:  *     Ray Essick
        !            19:  */
        !            20: 
        !            21: 
        !            22: acscmp (a, b)
        !            23: struct perm_f  *a,
        !            24:                *b;
        !            25: {
        !            26: /*
        !            27:  *     people before groups before systems
        !            28:  *     Alphabetical within each class
        !            29:  */
        !            30:     if (a -> ptype < b -> ptype)
        !            31:        return (-1);
        !            32:     if (a -> ptype > b -> ptype)
        !            33:        return 1;
        !            34:     if (strcmp ("Other", a -> name) == 0)
        !            35:        if (strcmp ("Other", b -> name) == 0)
        !            36:            return 0;
        !            37:        else
        !            38:            return 1;                                   /* put "Other" last */
        !            39:     if (strcmp ("Other", b -> name) == 0)
        !            40:        return (-1);                                    /* is correct */
        !            41:     return strcmp (a -> name, b -> name);
        !            42: }
        !            43: 
        !            44: /*
        !            45:  *     acssort
        !            46:  *
        !            47:  *     sort the access list
        !            48:  */
        !            49: 
        !            50: acssort (alist, items)
        !            51: struct perm_f   alist[];
        !            52: int     items;
        !            53: {
        !            54:     qsort (alist, items, sizeof (struct perm_f), acscmp);
        !            55: }
        !            56: /*
        !            57:  *     addmodes(io) struct io_f *io;
        !            58:  *
        !            59:  *     reads the access list and adds the modes specified in the
        !            60:  *     Newmodes array.
        !            61:  *     Checks for duplication and merely replaces with the new
        !            62:  *     permission in those cases.
        !            63:  */
        !            64: 
        !            65: addmodes (io, nmodes, Newmodes, verbose)
        !            66: struct io_f *io;
        !            67: int     nmodes;
        !            68: struct perm_f  *Newmodes;
        !            69: int     verbose;
        !            70: {
        !            71:     struct perm_f   alist[NPERMS];
        !            72:     int     pcount;                                    /* items in list */
        !            73:     FILE * acs;
        !            74:     int     i,
        !            75:             j;
        !            76:     char    fn[WDLEN];                                 /* hold a filename */
        !            77: 
        !            78:     sprintf (fn, "%s/%s/%s", io -> basedir, io -> nf, ACCESS);
        !            79:     x ((acs = fopen (fn, "r")) == NULL, "addmode: no access list");
        !            80:     x ((pcount = fread (alist, sizeof (struct perm_f), NPERMS, acs)) == 0, "addmode: empty access list");
        !            81:     fclose (acs);
        !            82: 
        !            83:     for (i = 0; i < nmodes; i++)                       /* for each mode */
        !            84:     {
        !            85:        for (j = 0; j < pcount; j++)                    /* look for match */
        !            86:            if (Newmodes[i].ptype == alist[j].ptype &&
        !            87:                    strcmp (Newmodes[i].name, alist[j].name) == 0)
        !            88:                break;                                  /* match */
        !            89:        if (j == pcount)                                /* wasn't there */
        !            90:        {
        !            91:            if (pcount == NPERMS)
        !            92:            {
        !            93:                if (verbose)
        !            94:                    printf ("%s: access list full\n", io -> nf);
        !            95:                break;
        !            96:            }
        !            97:            alist[pcount].ptype = Newmodes[i].ptype;
        !            98:            alist[pcount].perms = Newmodes[i].perms;
        !            99:            strcpy (alist[pcount].name, Newmodes[i].name);
        !           100:            pcount++;
        !           101:        }
        !           102:        else                                            /* update existing one */
        !           103:        {
        !           104:            alist[j].perms = Newmodes[i].perms;
        !           105:            if (verbose)
        !           106:                printf ("%s: replaced extant permission for %s\n",
        !           107:                        io -> nf, Newmodes[i].name);
        !           108:        }
        !           109:     }
        !           110: /*
        !           111:  *     replace the access list
        !           112:  */
        !           113: 
        !           114:     acssort (alist, pcount);
        !           115:     x ((acs = fopen (fn, "w")) == NULL, "addmodes: can't write access list");
        !           116:     x (fwrite (alist, sizeof (struct perm_f), pcount, acs) != pcount, "addmodes: writing access");
        !           117:     fclose (acs);
        !           118: }
        !           119: 
        !           120: /*
        !           121:  *     parsemode
        !           122:  *
        !           123:  *     Parse the supplied (character string) access specification
        !           124:  *     into the specified perm_f structure.
        !           125:  *
        !           126:  *     Ray Essick
        !           127:  */
        !           128: 
        !           129: parsemode (asciimode, pstuff, verbose)
        !           130: char   *asciimode;
        !           131: struct perm_f  *pstuff;
        !           132: int     verbose;
        !           133: {
        !           134:     char   *p;
        !           135:     char    name[WDLEN];                               /* hold the name */
        !           136:     char    namespec[WDLEN];                           /* entire name */
        !           137:     int     nametype;                                  /* name class */
        !           138:     char    mode[WDLEN];                               /* and the mode */
        !           139:     char    imode = 0;                                 /* internalized */
        !           140: 
        !           141: 
        !           142:     if ((p = index (asciimode, '=')) == NULL)          /* find the mode */
        !           143:     {
        !           144:        if (verbose)
        !           145:            printf ("No mode separator: %s\n", asciimode);
        !           146:        return (1);
        !           147:     }
        !           148: 
        !           149:     *p++ = '\0';                                       /* split out mode */
        !           150:     strcpy (mode, p);                                  /* grab mode */
        !           151:     strcpy (namespec, asciimode);                      /* and name */
        !           152:     *--p = '=';                                                /* replace marker */
        !           153: 
        !           154: 
        !           155:     if ((p = index (namespec, ':')) == NULL)           /* implicitly user? */
        !           156:     {
        !           157:        strcpy (name, namespec);                        /* user name */
        !           158:        nametype = PERMUSER;                            /* default to user */
        !           159:     }
        !           160:     else
        !           161:     {
        !           162:        *p++ = '\0';                                    /* break specification */
        !           163:        strcpy (name, p);                               /* load name */
        !           164:        switch (namespec[0])                            /* determine class */
        !           165:        {
        !           166:            case 'u': 
        !           167:            case 'U': 
        !           168:                nametype = PERMUSER;
        !           169:                break;
        !           170: 
        !           171:            case 'g': 
        !           172:            case 'G': 
        !           173:                nametype = PERMGROUP;
        !           174:                break;
        !           175: 
        !           176:            case 's': 
        !           177:            case 'S': 
        !           178:                nametype = PERMSYSTEM;
        !           179:                break;
        !           180: 
        !           181:            default: 
        !           182:                if (verbose)
        !           183:                    printf ("Invalid name class: %s\n", namespec);
        !           184:                return (1);
        !           185:                break;
        !           186:        }
        !           187: 
        !           188:     }
        !           189: /*
        !           190:  *     Check that user/group are defined on our system. Don't
        !           191:  *     want to be filling our tables with bogus stuff.
        !           192:  */
        !           193: 
        !           194:     switch (nametype)
        !           195:     {
        !           196:        case PERMUSER: 
        !           197:            if (getpwnam (name) == NULL)                /* does he exist? */
        !           198:            {
        !           199:                if (verbose)
        !           200:                    printf ("%s: no such user\n", name);
        !           201:                return (1);
        !           202:            }
        !           203:            break;
        !           204: 
        !           205:        case PERMGROUP: 
        !           206:            if (getgrnam (name) == NULL)                /* does it exist */
        !           207:            {
        !           208:                if (verbose)
        !           209:                    printf ("%s: no such group\n", name);
        !           210:                return (1);
        !           211:            }
        !           212:            break;
        !           213: 
        !           214:        case PERMSYSTEM: 
        !           215:        default: 
        !           216:            break;
        !           217:     }
        !           218: 
        !           219: /*
        !           220:  *     Now internalize the mode
        !           221:  */
        !           222: 
        !           223:     imode = 0;                                         /* initially null */
        !           224:     for (p = mode; *p; p++)                            /* each specifier */
        !           225:     {
        !           226:        switch (*p)
        !           227:        {
        !           228:            case 'd':                                   /* director */
        !           229:                imode = DRCTOK + READOK + WRITOK + RESPOK;
        !           230:                break;
        !           231:            case 'r':                                   /* read */
        !           232:                imode |= READOK;
        !           233:                break;
        !           234:            case 'w':                                   /* write (and respond) */
        !           235:                imode |= WRITOK + RESPOK;
        !           236:                break;
        !           237:            case 'a':                                   /* respond */
        !           238:                imode |= RESPOK;
        !           239:                break;
        !           240:            case 'n':                                   /* nullify */
        !           241:                imode = 0;
        !           242:                break;
        !           243:            default: 
        !           244:                if (verbose)
        !           245:                    printf ("%c: Invalid permission mode\n", *p);
        !           246:                break;
        !           247:        }
        !           248: 
        !           249:     }
        !           250:     pstuff -> ptype = nametype;                                /* load structure */
        !           251:     pstuff -> perms = imode;
        !           252:     strcpy (pstuff -> name, name);
        !           253:     return 0;
        !           254: }

unix.superglobalmegacorp.com

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