Annotation of researchv10no/sys/mkconf/readconf.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * read the configuration file
                      3:  *     name    id      addr ...
                      4:  * addr pieces are just numbers here;
                      5:  * it's up to the address drivers to interpret
                      6:  */
                      7: 
                      8: #include <fio.h>
                      9: #include <libc.h>
                     10: #include <ctype.h>
                     11: #include "mkconf.h"
                     12: 
                     13: /*
                     14:  * table of address-type drivers
                     15:  * entries should match with the numbers above
                     16:  */
                     17: 
                     18: int nosyntax(), nofixup(), noputaddr(), noputvec();
                     19: int sbisyntax(), sbifixup(), sbiputaddr(), nexputvec();
                     20: int vbisyntax(), vbifixup(), vbiputaddr();
                     21: int cntsyntax(), cntputaddr();
                     22: int ubasyntax(), ubafixup(), ubaputaddr(), ubaputvec();
                     23: int subsyntax(), subputaddr();
                     24: int mbasyntax(), mbafixup(), mbaputaddr();
                     25: int prmputaddr();
                     26: int mscpsyntax(), mscpfixup(), mscpputaddr();
                     27: int nobussyntax(), nobusfixup(), nobusputaddr(), nobusputvec();
                     28: 
                     29: struct acode acode[] = {
                     30:        nosyntax, nofixup, noputaddr, noputvec,         /* ANONE */
                     31:        cntsyntax, nofixup, cntputaddr, noputvec,       /* ACNT */
                     32:        sbisyntax, sbifixup, sbiputaddr, nexputvec,     /* ASBI */
                     33:        mbasyntax, mbafixup, mbaputaddr, noputvec,      /* AMBA */
                     34:        ubasyntax, ubafixup, ubaputaddr, ubaputvec,     /* AUBA */
                     35:        subsyntax, nofixup, subputaddr, noputvec,       /* ASUB */
                     36:        vbisyntax, vbifixup, vbiputaddr, nexputvec,     /* AVBI */
                     37:        cntsyntax, nofixup, prmputaddr, noputvec,       /* APARAM */
                     38:        mscpsyntax, mscpfixup, mscpputaddr, noputvec,   /* AMSCP */
                     39:        nobussyntax, nobusfixup, nobusputaddr, nobusputvec,     /* ANOBUS */
                     40: };
                     41: 
                     42: #define        NATYPE  (sizeof(acode)/sizeof(acode[0]))
                     43: 
                     44: #define        MAXARGS (NADDR*2+2)
                     45: 
                     46: readconf(f)
                     47: char *f;
                     48: {
                     49:        int fd;
                     50:        register char *p;
                     51:        char *args[MAXARGS];
                     52:        register Dev *dp;
                     53:        register int n;
                     54:        Mdev *mp;
                     55:        Mdev *mdlook();
                     56: 
                     57:        if ((fd = open(f, 0)) < 0) {
                     58:                perror(f);
                     59:                exit(1);
                     60:        }
                     61:        while ((p = Frdline(fd)) != NULL) {
                     62:                while (isspace(*p))
                     63:                        p++;
                     64:                if (*p == '#' || *p == 0)
                     65:                        continue;
                     66:                if ((n = crack(p, args, MAXARGS)) <= 1) {
                     67:                        fprint(STDERR, "silly conf line: %s\n", p);
                     68:                        errs++;
                     69:                        continue;
                     70:                }
                     71:                if (spconf(args, n))
                     72:                        continue;
                     73:                if ((mp = mdlook(args[0])) == NULL) {
                     74:                        fprint(STDERR, "unknown device %s\n", p);
                     75:                        errs++;
                     76:                        continue;
                     77:                }
                     78:                if (0 > mp->atype || mp->atype >= NATYPE) {
                     79:                        fprint(STDERR, "%s gok atype %d\n", mp->name, mp->atype);
                     80:                        errs++;
                     81:                        continue;
                     82:                }
                     83:                if ((dp = (Dev *)ealloc(sizeof(Dev))) == NULL) {
                     84:                        fprint(STDERR, "out of memory\n");
                     85:                        exit(1);
                     86:                }
                     87:                dp->mdev = mp;
                     88:                dp->id = nconv(args[1]);
                     89:                dp->parent = NULL;
                     90:                if ((*acode[mp->atype].syntax)(dp, &args[2], n-2)) {
                     91:                        free((char *)dp);
                     92:                        continue;
                     93:                }
                     94:                dinsert(dp);
                     95:        }
                     96:        close(fd);
                     97: }
                     98: 
                     99: /*
                    100:  * insert a device into the list of those configured
                    101:  * check for duplicates, cluster and order
                    102:  * different instances of the same device
                    103:  */
                    104: dinsert(dp)
                    105: register Dev *dp;
                    106: {
                    107:        register Dev *ep, *bp;
                    108: 
                    109:        if (dlist == NULL) {
                    110:                dlist = dp;
                    111:                dp->next = NULL;
                    112:                return;
                    113:        }
                    114:        bp = NULL;
                    115:        for (ep = dlist; ep; bp = ep, ep = ep->next)
                    116:                if (dp->mdev == ep->mdev)
                    117:                        break;
                    118:        for (; ep && dp->mdev == ep->mdev; bp = ep, ep = ep->next) {
                    119:                if (dp->id == ep->id) {
                    120:                        fprint(STDERR, "%s %d: dup device\n", dp->mdev->name, dp->id);
                    121:                        errs++;
                    122:                        return;
                    123:                }
                    124:                if (dp->id < ep->id)
                    125:                        break;
                    126:        }
                    127:        if (bp == NULL) {
                    128:                dp->next = dlist;
                    129:                dlist = dp;
                    130:        }
                    131:        else {
                    132:                dp->next = bp->next;
                    133:                bp->next = dp;
                    134:        }
                    135: }
                    136: 
                    137: /*
                    138:  * things in the conf file
                    139:  * that aren't strictly devices
                    140:  * the hard-coded names here take precedence over
                    141:  * names of devices and drivers
                    142:  * keep these as few as possible, please
                    143:  *     root    fs      driver  minor
                    144:  *     swap    driver  minor   size
                    145:  *     dump    drname  minor   low     size
                    146:  */
                    147: 
                    148: int
                    149: spconf(a, n)
                    150: register char **a;
                    151: int n;
                    152: {
                    153: 
                    154:        if (strcmp(a[0], "root") == 0) {
                    155:                cfroot(a, n);
                    156:                return (1);
                    157:        }
                    158:        if (strcmp(a[0], "swap") == 0) {
                    159:                cfswap(a, n);
                    160:                return (1);
                    161:        }
                    162:        if (strcmp(a[0], "dump") == 0) {
                    163:                cfdump(a, n);
                    164:                return (1);
                    165:        }
                    166:        return (0);             /* not a special; perhaps a device */
                    167: }
                    168: 
                    169: Mdev *rootfmp, *rootdmp;
                    170: int rootfs;
                    171: int rootmaj, rootmin;
                    172: 
                    173: cfroot(a, n)
                    174: register char **a;
                    175: int n;
                    176: {
                    177:        register Mdev *fmp, *dmp;
                    178: 
                    179:        if (n != 4) {
                    180:                fprint(STDERR, "bad root spec\n");
                    181:                errs++;
                    182:                return;
                    183:        }
                    184:        if ((fmp = mdlook(a[1])) == NULL) {
                    185:                fprint(STDERR, "%s: unknown root fs\n", a[1]);
                    186:                errs++;
                    187:                return;
                    188:        }
                    189:        if ((dmp = mdlook(a[2])) == NULL) {
                    190:                fprint(STDERR, "%s: unknown root device\n", a[2]);
                    191:                errs++;
                    192:                return;
                    193:        }
                    194:        rootfmp = fmp;
                    195:        rootdmp = dmp;
                    196:        rootmin = nconv(a[3]);
                    197: }
                    198: 
                    199: #define        NSWAP   10
                    200: 
                    201: Swapdev swaptab[NSWAP];
                    202: int nswapdev;
                    203: int swapmaj, swapmin;          /* set elsewhere to `drum' */
                    204: 
                    205: cfswap(a, n)
                    206: register char **a;
                    207: int n;
                    208: {
                    209:        register Mdev *mp;
                    210: 
                    211:        if (n < 4) {
                    212:                fprint(STDERR, "bad swap spec\n");
                    213:                errs++;
                    214:                return;
                    215:        }
                    216:        if ((mp = mdlook(a[1])) == NULL) {
                    217:                fprint(STDERR, "%s: unknown swap device\n");
                    218:                errs++;
                    219:                return;
                    220:        }
                    221:        if (nswapdev >= NSWAP) {
                    222:                fprint(STDERR, "too many swap devices\n");
                    223:                errs++;
                    224:                return;
                    225:        }
                    226:        swaptab[nswapdev].mp = mp;
                    227:        swaptab[nswapdev].minor = nconv(a[2]);
                    228:        swaptab[nswapdev].size = nconv(a[3]);
                    229:        nswapdev++;
                    230: }
                    231: 
                    232: char *dumprout;
                    233: int dumpunit;
                    234: long dumplow, dumpsize;
                    235: 
                    236: cfdump(a, n)
                    237: register char **a;
                    238: int n;
                    239: {
                    240:        if (n != 5) {
                    241:                fprint(STDERR, "bad dump spec\n");
                    242:                errs++;
                    243:                return;
                    244:        }
                    245:        dumprout = estrdup(a[1]);
                    246:        dumpunit = nconv(a[2]);
                    247:        dumplow = nconv(a[3]);
                    248:        dumpsize = nconv(a[4]);
                    249: }

unix.superglobalmegacorp.com

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