Annotation of researchv10no/netfs/libnetb/fsmkidmap.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * make an ID map for the file server library
                      3:  * takes a /etc/passwd-like file and an optional `exception' list
                      4:  * of explicit mappings;
                      5:  * returns a list of local name-ID mappings to be combined
                      6:  * with those from the client to make an ID-ID map.
                      7:  */
                      8: 
                      9: #include <stdio.h>
                     10: #include <ctype.h>
                     11: #include "rf.h"
                     12: 
                     13: static Idmap *exmerge();
                     14: static int nextid();
                     15: 
                     16: extern char *malloc(), *realloc();
                     17: 
                     18: Idmap *
                     19: rfmkidmap(file, ex)
                     20: char *file;
                     21: Namemap *ex;
                     22: {
                     23:        Idmap *map;
                     24:        register Idmap *cur;
                     25:        register int size;
                     26:        register Idmap *last;
                     27:        int curoff;
                     28:        FILE *fp;
                     29: 
                     30:        if ((fp = fopen(file, "r")) == NULL)
                     31:                rfpanic("can't open map %s\n", file);
                     32:        size = 100;
                     33:        if ((map = (Idmap *)malloc(size*sizeof(Idmap))) == NULL)
                     34:                rfpanic("out of mem for %s map\n", file);
                     35:        last = &map[size - 1];
                     36:        for (cur = map;; cur++) {
                     37:                if (cur >= last) {
                     38:                        curoff = cur - map;     /* realloc may move map */
                     39:                        size += 100;
                     40:                        if ((map = (Idmap *)realloc((char *)map, size*sizeof(Idmap))) == NULL)
                     41:                                rfpanic("out of mem for %s map\n", file);
                     42:                        last = &map[size - 1];
                     43:                        cur = &map[curoff];
                     44:                }
                     45:                if (nextid(cur, fp) == 0)
                     46:                        break;
                     47:        }
                     48:        cur->name[0] = 0;
                     49:        fclose(fp);
                     50:        return (exmerge(map, last, ex));
                     51: }
                     52: 
                     53: /*
                     54:  * pick out the next name and ID from the file
                     55:  * name:junk:number:junk until newline
                     56:  * this matches /etc/passwd and /etc/group,
                     57:  * and is simple enough to fake up
                     58:  */
                     59: static
                     60: nextid(cur, fp)
                     61: Idmap *cur;
                     62: register FILE *fp;
                     63: {
                     64:        register char *p;
                     65:        char buf[150];          /* assume big enough for now */
                     66: 
                     67:        for (;;) {
                     68:                if (fgets(buf, sizeof(buf), fp) == NULL)
                     69:                        return (0);     /* EOF */
                     70:                p = buf;
                     71:                while (*p && *p != ':')
                     72:                        p++;
                     73:                if (*p == 0)
                     74:                        continue;
                     75:                *p++ = 0;
                     76:                strncpy(cur->name, buf, sizeof(cur->name)-1);
                     77:                cur->name[sizeof(cur->name)-1] = 0;
                     78:                while (*p && *p != ':')
                     79:                        p++;
                     80:                if (*p == 0)
                     81:                        continue;
                     82:                p++;
                     83:                if (!isdigit(*p) && *p != '-')
                     84:                        continue;
                     85:                cur->id = atoi(p);
                     86:                return (1);
                     87:        }
                     88: }
                     89: 
                     90: static Idmap *
                     91: exmerge(map, last, ex)
                     92: Idmap *map, *last;
                     93: Namemap *ex;
                     94: {
                     95:        register Idmap *lp;
                     96:        register Namemap *ep;
                     97:        int size, curoff;
                     98:        static Namemap nilex;
                     99: 
                    100:        if (ex == NULL)
                    101:                ex = &nilex;
                    102:        for (ep = ex; ep->cname[0]; ep++) {
                    103:                if (ep->sname[0] == 0)
                    104:                        ep->sid = RFNOID;
                    105:                else
                    106:                        ep->sid = _rflookid(map, ep->sname);
                    107:        }
                    108:        for (lp = map; lp->name[0]; lp++)
                    109:                for (ep = ex; ep->cname[0]; ep++) {
                    110:                        if (ep->cname[0] != lp->name[0])        /* hash */
                    111:                                continue;
                    112:                        if (strcmp(ep->cname, lp->name) == 0) {
                    113:                                lp->id = ep->sid;
                    114:                                ep->sid = RFNOID;
                    115:                        }
                    116:                }
                    117:        /*
                    118:         * add client names not in local file
                    119:         * lp was left at the end of the map
                    120:         */
                    121:        for (ep = ex; ep->cname[0]; ep++) {
                    122:                if (ep->sid == RFNOID)  /* no need to enter */
                    123:                        continue;
                    124:                if (lp >= last) {
                    125:                        curoff = lp - map;
                    126:                        size = curoff + 10;
                    127:                        if ((map = (Idmap *)realloc((char *)map,
                    128:                            size*sizeof(Idmap))) == NULL)
                    129:                                rfpanic("out of mem merging except\n");
                    130:                        last = &map[size - 1];
                    131:                        lp = &map[curoff];
                    132:                }
                    133:                strncpy(lp->name, ep->cname, sizeof(lp->name)-1);
                    134:                lp->id = ep->sid;
                    135:                lp++;
                    136:        }
                    137:        lp->name[0] = 0;
                    138:        return (map);
                    139: }

unix.superglobalmegacorp.com

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