Annotation of 43BSDReno/usr.sbin/config/config.y, revision 1.1.1.1

1.1       root        1: %union {
                      2:        char    *str;
                      3:        int     val;
                      4:        struct  file_list *file;
                      5:        struct  idlst *lst;
                      6: }
                      7: 
                      8: %token AND
                      9: %token ANY
                     10: %token ARGS
                     11: %token AT
                     12: %token COMMA
                     13: %token CONFIG
                     14: %token CONTROLLER
                     15: %token CPU
                     16: %token CSR
                     17: %token DEVICE
                     18: %token DISK
                     19: %token DRIVE
                     20: %token DST
                     21: %token DUMPS
                     22: %token EQUALS
                     23: %token FLAGS
                     24: %token HZ
                     25: %token IDENT
                     26: %token MACHINE
                     27: %token MAJOR
                     28: %token MASTER
                     29: %token MAXUSERS
                     30: %token MINOR
                     31: %token MINUS
                     32: %token NEXUS
                     33: %token ON
                     34: %token OPTIONS
                     35: %token MAKEOPTIONS
                     36: %token PRIORITY
                     37: %token PSEUDO_DEVICE
                     38: %token ROOT
                     39: %token SEMICOLON
                     40: %token SIZE
                     41: %token SLAVE
                     42: %token SWAP
                     43: %token TIMEZONE
                     44: %token TRACE
                     45: %token VECTOR
                     46: 
                     47: %token <str>   ID
                     48: %token <val>   NUMBER
                     49: %token <val>   FPNUMBER
                     50: 
                     51: %type  <str>   Save_id
                     52: %type  <str>   Opt_value
                     53: %type  <str>   Dev
                     54: %type  <lst>   Id_list
                     55: %type  <val>   optional_size
                     56: %type  <str>   device_name
                     57: %type  <val>   major_minor
                     58: %type  <val>   arg_device_spec
                     59: %type  <val>   root_device_spec
                     60: %type  <val>   dump_device_spec
                     61: %type  <file>  swap_device_spec
                     62: 
                     63: %{
                     64: 
                     65: /*
                     66:  * Copyright (c) 1988 Regents of the University of California.
                     67:  * All rights reserved.
                     68:  *
                     69:  * Redistribution and use in source and binary forms are permitted provided
                     70:  * that: (1) source distributions retain this entire copyright notice and
                     71:  * comment, and (2) distributions including binaries display the following
                     72:  * acknowledgement:  ``This product includes software developed by the
                     73:  * University of California, Berkeley and its contributors'' in the
                     74:  * documentation or other materials provided with the distribution and in
                     75:  * all advertising materials mentioning features or use of this software.
                     76:  * Neither the name of the University nor the names of its contributors may
                     77:  * be used to endorse or promote products derived from this software without
                     78:  * specific prior written permission.
                     79:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
                     80:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
                     81:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     82:  *
                     83:  *     @(#)config.y    5.10 (Berkeley) 6/1/90
                     84:  */
                     85: 
                     86: #include "config.h"
                     87: #include <ctype.h>
                     88: #include <stdio.h>
                     89: 
                     90: struct device cur;
                     91: struct device *curp = 0;
                     92: char   *temp_id;
                     93: char   *val_id;
                     94: char   *malloc();
                     95: 
                     96: %}
                     97: %%
                     98: Configuration:
                     99:        Many_specs
                    100:                = { verifysystemspecs(); }
                    101:                ;
                    102: 
                    103: Many_specs:
                    104:        Many_specs Spec
                    105:                |
                    106:        /* lambda */
                    107:                ;
                    108: 
                    109: Spec:
                    110:        Device_spec SEMICOLON
                    111:              = { newdev(&cur); } |
                    112:        Config_spec SEMICOLON
                    113:                |
                    114:        TRACE SEMICOLON
                    115:              = { do_trace = !do_trace; } |
                    116:        SEMICOLON
                    117:                |
                    118:        error SEMICOLON
                    119:                ;
                    120: 
                    121: Config_spec:
                    122:        MACHINE Save_id
                    123:            = {
                    124:                if (!strcmp($2, "vax")) {
                    125:                        machine = MACHINE_VAX;
                    126:                        machinename = "vax";
                    127:                } else if (!strcmp($2, "tahoe")) {
                    128:                        machine = MACHINE_TAHOE;
                    129:                        machinename = "tahoe";
                    130:                } else if (!strcmp($2, "hp300")) {
                    131:                        machine = MACHINE_HP300;
                    132:                        machinename = "hp300";
                    133:                } else
                    134:                        yyerror("Unknown machine type");
                    135:              } |
                    136:        CPU Save_id
                    137:              = {
                    138:                struct cputype *cp =
                    139:                    (struct cputype *)malloc(sizeof (struct cputype));
                    140:                cp->cpu_name = ns($2);
                    141:                cp->cpu_next = cputype;
                    142:                cputype = cp;
                    143:                free(temp_id);
                    144:              } |
                    145:        OPTIONS Opt_list
                    146:                |
                    147:        MAKEOPTIONS Mkopt_list
                    148:                |
                    149:        IDENT ID
                    150:              = { ident = ns($2); } |
                    151:        System_spec
                    152:                |
                    153:        HZ NUMBER
                    154:              = { yyerror("HZ specification obsolete; delete"); } |
                    155:        TIMEZONE NUMBER
                    156:              = { timezone = 60 * $2; check_tz(); } |
                    157:        TIMEZONE NUMBER DST NUMBER
                    158:              = { timezone = 60 * $2; dst = $4; check_tz(); } |
                    159:        TIMEZONE NUMBER DST
                    160:              = { timezone = 60 * $2; dst = 1; check_tz(); } |
                    161:        TIMEZONE FPNUMBER
                    162:              = { timezone = $2; check_tz(); } |
                    163:        TIMEZONE FPNUMBER DST NUMBER
                    164:              = { timezone = $2; dst = $4; check_tz(); } |
                    165:        TIMEZONE FPNUMBER DST
                    166:              = { timezone = $2; dst = 1; check_tz(); } |
                    167:        TIMEZONE MINUS NUMBER
                    168:              = { timezone = -60 * $3; check_tz(); } |
                    169:        TIMEZONE MINUS NUMBER DST NUMBER
                    170:              = { timezone = -60 * $3; dst = $5; check_tz(); } |
                    171:        TIMEZONE MINUS NUMBER DST
                    172:              = { timezone = -60 * $3; dst = 1; check_tz(); } |
                    173:        TIMEZONE MINUS FPNUMBER
                    174:              = { timezone = -$3; check_tz(); } |
                    175:        TIMEZONE MINUS FPNUMBER DST NUMBER
                    176:              = { timezone = -$3; dst = $5; check_tz(); } |
                    177:        TIMEZONE MINUS FPNUMBER DST
                    178:              = { timezone = -$3; dst = 1; check_tz(); } |
                    179:        MAXUSERS NUMBER
                    180:              = { maxusers = $2; };
                    181: 
                    182: System_spec:
                    183:          System_id System_parameter_list
                    184:                = { checksystemspec(*confp); }
                    185:        ;
                    186:                
                    187: System_id:
                    188:          CONFIG Save_id
                    189:                = { mkconf($2); }
                    190:        ;
                    191: 
                    192: System_parameter_list:
                    193:          System_parameter_list System_parameter
                    194:        | System_parameter
                    195:        ;
                    196: 
                    197: System_parameter:
                    198:          swap_spec
                    199:        | root_spec
                    200:        | dump_spec
                    201:        | arg_spec
                    202:        ;
                    203:        
                    204: swap_spec:
                    205:          SWAP optional_on swap_device_list
                    206:        ;
                    207:        
                    208: swap_device_list:
                    209:          swap_device_list AND swap_device
                    210:        | swap_device
                    211:        ;
                    212:        
                    213: swap_device:
                    214:          swap_device_spec optional_size
                    215:              = { mkswap(*confp, $1, $2); }
                    216:        ;
                    217: 
                    218: swap_device_spec:
                    219:          device_name
                    220:                = {
                    221:                        struct file_list *fl = newswap();
                    222: 
                    223:                        if (eq($1, "generic"))
                    224:                                fl->f_fn = $1;
                    225:                        else {
                    226:                                fl->f_swapdev = nametodev($1, 0, 'b');
                    227:                                fl->f_fn = devtoname(fl->f_swapdev);
                    228:                        }
                    229:                        $$ = fl;
                    230:                }
                    231:        | major_minor
                    232:                = {
                    233:                        struct file_list *fl = newswap();
                    234: 
                    235:                        fl->f_swapdev = $1;
                    236:                        fl->f_fn = devtoname($1);
                    237:                        $$ = fl;
                    238:                }
                    239:        ;
                    240: 
                    241: root_spec:
                    242:          ROOT optional_on root_device_spec
                    243:                = {
                    244:                        struct file_list *fl = *confp;
                    245: 
                    246:                        if (fl && fl->f_rootdev != NODEV)
                    247:                                yyerror("extraneous root device specification");
                    248:                        else
                    249:                                fl->f_rootdev = $3;
                    250:                }
                    251:        ;
                    252: 
                    253: root_device_spec:
                    254:          device_name
                    255:                = { $$ = nametodev($1, 0, 'a'); }
                    256:        | major_minor
                    257:        ;
                    258: 
                    259: dump_spec:
                    260:          DUMPS optional_on dump_device_spec
                    261:                = {
                    262:                        struct file_list *fl = *confp;
                    263: 
                    264:                        if (fl && fl->f_dumpdev != NODEV)
                    265:                                yyerror("extraneous dump device specification");
                    266:                        else
                    267:                                fl->f_dumpdev = $3;
                    268:                }
                    269: 
                    270:        ;
                    271: 
                    272: dump_device_spec:
                    273:          device_name
                    274:                = { $$ = nametodev($1, 0, 'b'); }
                    275:        | major_minor
                    276:        ;
                    277: 
                    278: arg_spec:
                    279:          ARGS optional_on arg_device_spec
                    280:                = {
                    281:                        struct file_list *fl = *confp;
                    282: 
                    283:                        if (fl && fl->f_argdev != NODEV)
                    284:                                yyerror("extraneous arg device specification");
                    285:                        else
                    286:                                fl->f_argdev = $3;
                    287:                }
                    288:        ;
                    289: 
                    290: arg_device_spec:
                    291:          device_name
                    292:                = { $$ = nametodev($1, 0, 'b'); }
                    293:        | major_minor
                    294:        ;
                    295: 
                    296: major_minor:
                    297:          MAJOR NUMBER MINOR NUMBER
                    298:                = { $$ = makedev($2, $4); }
                    299:        ;
                    300: 
                    301: optional_on:
                    302:          ON
                    303:        | /* empty */
                    304:        ;
                    305: 
                    306: optional_size:
                    307:          SIZE NUMBER
                    308:              = { $$ = $2; }
                    309:        | /* empty */
                    310:              = { $$ = 0; }
                    311:        ;
                    312: 
                    313: device_name:
                    314:          Save_id
                    315:                = { $$ = $1; }
                    316:        | Save_id NUMBER
                    317:                = {
                    318:                        char buf[80];
                    319: 
                    320:                        (void) sprintf(buf, "%s%d", $1, $2);
                    321:                        $$ = ns(buf); free($1);
                    322:                }
                    323:        | Save_id NUMBER ID
                    324:                = {
                    325:                        char buf[80];
                    326: 
                    327:                        (void) sprintf(buf, "%s%d%s", $1, $2, $3);
                    328:                        $$ = ns(buf); free($1);
                    329:                }
                    330:        ;
                    331: 
                    332: Opt_list:
                    333:        Opt_list COMMA Option
                    334:                |
                    335:        Option
                    336:                ;
                    337: 
                    338: Option:
                    339:        Save_id
                    340:              = {
                    341:                struct opt *op = (struct opt *)malloc(sizeof (struct opt));
                    342:                op->op_name = ns($1);
                    343:                op->op_next = opt;
                    344:                op->op_value = 0;
                    345:                opt = op;
                    346:                free(temp_id);
                    347:              } |
                    348:        Save_id EQUALS Opt_value
                    349:              = {
                    350:                struct opt *op = (struct opt *)malloc(sizeof (struct opt));
                    351:                op->op_name = ns($1);
                    352:                op->op_next = opt;
                    353:                op->op_value = ns($3);
                    354:                opt = op;
                    355:                free(temp_id);
                    356:                free(val_id);
                    357:              } ;
                    358: 
                    359: Opt_value:
                    360:        ID
                    361:              = { $$ = val_id = ns($1); } |
                    362:        NUMBER
                    363:              = {
                    364:                char nb[16];
                    365:                (void) sprintf(nb, "%d", $1);
                    366:                $$ = val_id = ns(nb);
                    367:              } ;
                    368: 
                    369: 
                    370: Save_id:
                    371:        ID
                    372:              = { $$ = temp_id = ns($1); }
                    373:        ;
                    374: 
                    375: Mkopt_list:
                    376:        Mkopt_list COMMA Mkoption
                    377:                |
                    378:        Mkoption
                    379:                ;
                    380: 
                    381: Mkoption:
                    382:        Save_id EQUALS Opt_value
                    383:              = {
                    384:                struct opt *op = (struct opt *)malloc(sizeof (struct opt));
                    385:                op->op_name = ns($1);
                    386:                op->op_next = mkopt;
                    387:                op->op_value = ns($3);
                    388:                mkopt = op;
                    389:                free(temp_id);
                    390:                free(val_id);
                    391:              } ;
                    392: 
                    393: Dev:
                    394:        ID
                    395:              = { $$ = ns($1); }
                    396:        ;
                    397: 
                    398: Device_spec:
                    399:        DEVICE Dev_name Dev_info Int_spec
                    400:              = { cur.d_type = DEVICE; } |
                    401:        MASTER Dev_name Dev_info Int_spec
                    402:              = { cur.d_type = MASTER; } |
                    403:        DISK Dev_name Dev_info Int_spec
                    404:              = { cur.d_dk = 1; cur.d_type = DEVICE; } |
                    405:        CONTROLLER Dev_name Dev_info Int_spec
                    406:              = { cur.d_type = CONTROLLER; } |
                    407:        PSEUDO_DEVICE Init_dev Dev
                    408:              = {
                    409:                cur.d_name = $3;
                    410:                cur.d_type = PSEUDO_DEVICE;
                    411:                } |
                    412:        PSEUDO_DEVICE Init_dev Dev NUMBER
                    413:              = {
                    414:                cur.d_name = $3;
                    415:                cur.d_type = PSEUDO_DEVICE;
                    416:                cur.d_slave = $4;
                    417:                };
                    418: 
                    419: Dev_name:
                    420:        Init_dev Dev NUMBER
                    421:              = {
                    422:                cur.d_name = $2;
                    423:                if (eq($2, "mba"))
                    424:                        seen_mba = 1;
                    425:                else if (eq($2, "uba"))
                    426:                        seen_uba = 1;
                    427:                else if (eq($2, "vba"))
                    428:                        seen_vba = 1;
                    429:                cur.d_unit = $3;
                    430:                };
                    431: 
                    432: Init_dev:
                    433:        /* lambda */
                    434:              = { init_dev(&cur); };
                    435: 
                    436: Dev_info:
                    437:        Con_info Info_list
                    438:                |
                    439:        /* lambda */
                    440:                ;
                    441: 
                    442: Con_info:
                    443:        AT Dev NUMBER
                    444:              = {
                    445:                if (eq(cur.d_name, "mba") || eq(cur.d_name, "uba")) {
                    446:                        (void) sprintf(errbuf,
                    447:                                "%s must be connected to a nexus", cur.d_name);
                    448:                        yyerror(errbuf);
                    449:                }
                    450:                cur.d_conn = connect($2, $3);
                    451:                } |
                    452:        AT NEXUS NUMBER
                    453:              = { check_nexus(&cur, $3); cur.d_conn = TO_NEXUS; };
                    454:     
                    455: Info_list:
                    456:        Info_list Info
                    457:                |
                    458:        /* lambda */
                    459:                ;
                    460: 
                    461: Info:
                    462:        CSR NUMBER
                    463:              = { cur.d_addr = $2; } |
                    464:        DRIVE NUMBER
                    465:              = { cur.d_drive = $2; } |
                    466:        SLAVE NUMBER
                    467:              = {
                    468:                if (cur.d_conn != 0 && cur.d_conn != TO_NEXUS &&
                    469:                    cur.d_conn->d_type == MASTER)
                    470:                        cur.d_slave = $2;
                    471:                else
                    472:                        yyerror("can't specify slave--not to master");
                    473:                } |
                    474:        FLAGS NUMBER
                    475:              = { cur.d_flags = $2; };
                    476: 
                    477: Int_spec:
                    478:        VECTOR Id_list
                    479:              = { cur.d_vec = $2; } |
                    480:        PRIORITY NUMBER
                    481:              = { cur.d_pri = $2; } |
                    482:        /* lambda */
                    483:                ;
                    484: 
                    485: Id_list:
                    486:        Save_id
                    487:              = {
                    488:                struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
                    489:                a->id = $1; a->id_next = 0; $$ = a;
                    490:                } |
                    491:        Save_id Id_list =
                    492:                {
                    493:                struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
                    494:                a->id = $1; a->id_next = $2; $$ = a;
                    495:                };
                    496: 
                    497: %%
                    498: 
                    499: yyerror(s)
                    500:        char *s;
                    501: {
                    502: 
                    503:        fprintf(stderr, "config: line %d: %s\n", yyline + 1, s);
                    504: }
                    505: 
                    506: /*
                    507:  * return the passed string in a new space
                    508:  */
                    509: char *
                    510: ns(str)
                    511:        register char *str;
                    512: {
                    513:        register char *cp;
                    514: 
                    515:        cp = malloc((unsigned)(strlen(str)+1));
                    516:        (void) strcpy(cp, str);
                    517:        return (cp);
                    518: }
                    519: 
                    520: /*
                    521:  * add a device to the list of devices
                    522:  */
                    523: newdev(dp)
                    524:        register struct device *dp;
                    525: {
                    526:        register struct device *np;
                    527: 
                    528:        np = (struct device *) malloc(sizeof *np);
                    529:        *np = *dp;
                    530:        np->d_next = 0;
                    531:        if (curp == 0)
                    532:                dtab = np;
                    533:        else
                    534:                curp->d_next = np;
                    535:        curp = np;
                    536: }
                    537: 
                    538: /*
                    539:  * note that a configuration should be made
                    540:  */
                    541: mkconf(sysname)
                    542:        char *sysname;
                    543: {
                    544:        register struct file_list *fl, **flp;
                    545: 
                    546:        fl = (struct file_list *) malloc(sizeof *fl);
                    547:        fl->f_type = SYSTEMSPEC;
                    548:        fl->f_needs = sysname;
                    549:        fl->f_rootdev = NODEV;
                    550:        fl->f_argdev = NODEV;
                    551:        fl->f_dumpdev = NODEV;
                    552:        fl->f_fn = 0;
                    553:        fl->f_next = 0;
                    554:        for (flp = confp; *flp; flp = &(*flp)->f_next)
                    555:                ;
                    556:        *flp = fl;
                    557:        confp = flp;
                    558: }
                    559: 
                    560: struct file_list *
                    561: newswap()
                    562: {
                    563:        struct file_list *fl = (struct file_list *)malloc(sizeof (*fl));
                    564: 
                    565:        fl->f_type = SWAPSPEC;
                    566:        fl->f_next = 0;
                    567:        fl->f_swapdev = NODEV;
                    568:        fl->f_swapsize = 0;
                    569:        fl->f_needs = 0;
                    570:        fl->f_fn = 0;
                    571:        return (fl);
                    572: }
                    573: 
                    574: /*
                    575:  * Add a swap device to the system's configuration
                    576:  */
                    577: mkswap(system, fl, size)
                    578:        struct file_list *system, *fl;
                    579:        int size;
                    580: {
                    581:        register struct file_list **flp;
                    582:        char name[80];
                    583: 
                    584:        if (system == 0 || system->f_type != SYSTEMSPEC) {
                    585:                yyerror("\"swap\" spec precedes \"config\" specification");
                    586:                return;
                    587:        }
                    588:        if (size < 0) {
                    589:                yyerror("illegal swap partition size");
                    590:                return;
                    591:        }
                    592:        /*
                    593:         * Append swap description to the end of the list.
                    594:         */
                    595:        flp = &system->f_next;
                    596:        for (; *flp && (*flp)->f_type == SWAPSPEC; flp = &(*flp)->f_next)
                    597:                ;
                    598:        fl->f_next = *flp;
                    599:        *flp = fl;
                    600:        fl->f_swapsize = size;
                    601:        /*
                    602:         * If first swap device for this system,
                    603:         * set up f_fn field to insure swap
                    604:         * files are created with unique names.
                    605:         */
                    606:        if (system->f_fn)
                    607:                return;
                    608:        if (eq(fl->f_fn, "generic"))
                    609:                system->f_fn = ns(fl->f_fn);
                    610:        else
                    611:                system->f_fn = ns(system->f_needs);
                    612: }
                    613: 
                    614: /*
                    615:  * find the pointer to connect to the given device and number.
                    616:  * returns 0 if no such device and prints an error message
                    617:  */
                    618: struct device *
                    619: connect(dev, num)
                    620:        register char *dev;
                    621:        register int num;
                    622: {
                    623:        register struct device *dp;
                    624:        struct device *huhcon();
                    625: 
                    626:        if (num == QUES)
                    627:                return (huhcon(dev));
                    628:        for (dp = dtab; dp != 0; dp = dp->d_next) {
                    629:                if ((num != dp->d_unit) || !eq(dev, dp->d_name))
                    630:                        continue;
                    631:                if (dp->d_type != CONTROLLER && dp->d_type != MASTER) {
                    632:                        (void) sprintf(errbuf,
                    633:                            "%s connected to non-controller", dev);
                    634:                        yyerror(errbuf);
                    635:                        return (0);
                    636:                }
                    637:                return (dp);
                    638:        }
                    639:        (void) sprintf(errbuf, "%s %d not defined", dev, num);
                    640:        yyerror(errbuf);
                    641:        return (0);
                    642: }
                    643: 
                    644: /*
                    645:  * connect to an unspecific thing
                    646:  */
                    647: struct device *
                    648: huhcon(dev)
                    649:        register char *dev;
                    650: {
                    651:        register struct device *dp, *dcp;
                    652:        struct device rdev;
                    653:        int oldtype;
                    654: 
                    655:        /*
                    656:         * First make certain that there are some of these to wildcard on
                    657:         */
                    658:        for (dp = dtab; dp != 0; dp = dp->d_next)
                    659:                if (eq(dp->d_name, dev))
                    660:                        break;
                    661:        if (dp == 0) {
                    662:                (void) sprintf(errbuf, "no %s's to wildcard", dev);
                    663:                yyerror(errbuf);
                    664:                return (0);
                    665:        }
                    666:        oldtype = dp->d_type;
                    667:        dcp = dp->d_conn;
                    668:        /*
                    669:         * Now see if there is already a wildcard entry for this device
                    670:         * (e.g. Search for a "uba ?")
                    671:         */
                    672:        for (; dp != 0; dp = dp->d_next)
                    673:                if (eq(dev, dp->d_name) && dp->d_unit == -1)
                    674:                        break;
                    675:        /*
                    676:         * If there isn't, make one because everything needs to be connected
                    677:         * to something.
                    678:         */
                    679:        if (dp == 0) {
                    680:                dp = &rdev;
                    681:                init_dev(dp);
                    682:                dp->d_unit = QUES;
                    683:                dp->d_name = ns(dev);
                    684:                dp->d_type = oldtype;
                    685:                newdev(dp);
                    686:                dp = curp;
                    687:                /*
                    688:                 * Connect it to the same thing that other similar things are
                    689:                 * connected to, but make sure it is a wildcard unit
                    690:                 * (e.g. up connected to sc ?, here we make connect sc? to a
                    691:                 * uba?).  If other things like this are on the NEXUS or
                    692:                 * if they aren't connected to anything, then make the same
                    693:                 * connection, else call ourself to connect to another
                    694:                 * unspecific device.
                    695:                 */
                    696:                if (dcp == TO_NEXUS || dcp == 0)
                    697:                        dp->d_conn = dcp;
                    698:                else
                    699:                        dp->d_conn = connect(dcp->d_name, QUES);
                    700:        }
                    701:        return (dp);
                    702: }
                    703: 
                    704: init_dev(dp)
                    705:        register struct device *dp;
                    706: {
                    707: 
                    708:        dp->d_name = "OHNO!!!";
                    709:        dp->d_type = DEVICE;
                    710:        dp->d_conn = 0;
                    711:        dp->d_vec = 0;
                    712:        dp->d_addr = dp->d_pri = dp->d_flags = dp->d_dk = 0;
                    713:        dp->d_slave = dp->d_drive = dp->d_unit = UNKNOWN;
                    714: }
                    715: 
                    716: /*
                    717:  * make certain that this is a reasonable type of thing to connect to a nexus
                    718:  */
                    719: check_nexus(dev, num)
                    720:        register struct device *dev;
                    721:        int num;
                    722: {
                    723: 
                    724:        switch (machine) {
                    725: 
                    726:        case MACHINE_VAX:
                    727:                if (!eq(dev->d_name, "uba") && !eq(dev->d_name, "mba") &&
                    728:                    !eq(dev->d_name, "bi"))
                    729:                        yyerror("only uba's, mba's, and bi's should be connected to the nexus");
                    730:                if (num != QUES)
                    731:                        yyerror("can't give specific nexus numbers");
                    732:                break;
                    733: 
                    734:        case MACHINE_TAHOE:
                    735:                if (!eq(dev->d_name, "vba")) 
                    736:                        yyerror("only vba's should be connected to the nexus");
                    737:                break;
                    738: 
                    739:        case MACHINE_HP300:
                    740:                if (num != QUES)
                    741:                        dev->d_addr = num;
                    742:                break;
                    743:        }
                    744: }
                    745: 
                    746: /*
                    747:  * Check the timezone to make certain it is sensible
                    748:  */
                    749: 
                    750: check_tz()
                    751: {
                    752:        if (abs(timezone) > 12 * 60)
                    753:                yyerror("timezone is unreasonable");
                    754:        else
                    755:                hadtz = 1;
                    756: }
                    757: 
                    758: /*
                    759:  * Check system specification and apply defaulting
                    760:  * rules on root, argument, dump, and swap devices.
                    761:  */
                    762: checksystemspec(fl)
                    763:        register struct file_list *fl;
                    764: {
                    765:        char buf[BUFSIZ];
                    766:        register struct file_list *swap;
                    767:        int generic;
                    768: 
                    769:        if (fl == 0 || fl->f_type != SYSTEMSPEC) {
                    770:                yyerror("internal error, bad system specification");
                    771:                exit(1);
                    772:        }
                    773:        swap = fl->f_next;
                    774:        generic = swap && swap->f_type == SWAPSPEC && eq(swap->f_fn, "generic");
                    775:        if (fl->f_rootdev == NODEV && !generic) {
                    776:                yyerror("no root device specified");
                    777:                exit(1);
                    778:        }
                    779:        /*
                    780:         * Default swap area to be in 'b' partition of root's
                    781:         * device.  If root specified to be other than on 'a'
                    782:         * partition, give warning, something probably amiss.
                    783:         */
                    784:        if (swap == 0 || swap->f_type != SWAPSPEC) {
                    785:                dev_t dev;
                    786: 
                    787:                swap = newswap();
                    788:                dev = fl->f_rootdev;
                    789:                if (minor(dev) & 07) {
                    790:                        (void) sprintf(buf, 
                    791: "Warning, swap defaulted to 'b' partition with root on '%c' partition",
                    792:                                (minor(dev) & 07) + 'a');
                    793:                        yyerror(buf);
                    794:                }
                    795:                swap->f_swapdev =
                    796:                   makedev(major(dev), (minor(dev) &~ 07) | ('b' - 'a'));
                    797:                swap->f_fn = devtoname(swap->f_swapdev);
                    798:                mkswap(fl, swap, 0);
                    799:        }
                    800:        /*
                    801:         * Make sure a generic swap isn't specified, along with
                    802:         * other stuff (user must really be confused).
                    803:         */
                    804:        if (generic) {
                    805:                if (fl->f_rootdev != NODEV)
                    806:                        yyerror("root device specified with generic swap");
                    807:                if (fl->f_argdev != NODEV)
                    808:                        yyerror("arg device specified with generic swap");
                    809:                if (fl->f_dumpdev != NODEV)
                    810:                        yyerror("dump device specified with generic swap");
                    811:                return;
                    812:        }
                    813:        /*
                    814:         * Default argument device and check for oddball arrangements.
                    815:         */
                    816:        if (fl->f_argdev == NODEV)
                    817:                fl->f_argdev = swap->f_swapdev;
                    818:        if (fl->f_argdev != swap->f_swapdev)
                    819:                yyerror("Warning, arg device different than primary swap");
                    820:        /*
                    821:         * Default dump device and warn if place is not a
                    822:         * swap area or the argument device partition.
                    823:         */
                    824:        if (fl->f_dumpdev == NODEV)
                    825:                fl->f_dumpdev = swap->f_swapdev;
                    826:        if (fl->f_dumpdev != swap->f_swapdev && fl->f_dumpdev != fl->f_argdev) {
                    827:                struct file_list *p = swap->f_next;
                    828: 
                    829:                for (; p && p->f_type == SWAPSPEC; p = p->f_next)
                    830:                        if (fl->f_dumpdev == p->f_swapdev)
                    831:                                return;
                    832:                (void) sprintf(buf, "Warning, orphaned dump device, %s",
                    833:                        "do you know what you're doing");
                    834:                yyerror(buf);
                    835:        }
                    836: }
                    837: 
                    838: /*
                    839:  * Verify all devices specified in the system specification
                    840:  * are present in the device specifications.
                    841:  */
                    842: verifysystemspecs()
                    843: {
                    844:        register struct file_list *fl;
                    845:        dev_t checked[50], *verifyswap();
                    846:        register dev_t *pchecked = checked;
                    847: 
                    848:        for (fl = conf_list; fl; fl = fl->f_next) {
                    849:                if (fl->f_type != SYSTEMSPEC)
                    850:                        continue;
                    851:                if (!finddev(fl->f_rootdev))
                    852:                        deverror(fl->f_needs, "root");
                    853:                *pchecked++ = fl->f_rootdev;
                    854:                pchecked = verifyswap(fl->f_next, checked, pchecked);
                    855: #define        samedev(dev1, dev2) \
                    856:        ((minor(dev1) &~ 07) != (minor(dev2) &~ 07))
                    857:                if (!alreadychecked(fl->f_dumpdev, checked, pchecked)) {
                    858:                        if (!finddev(fl->f_dumpdev))
                    859:                                deverror(fl->f_needs, "dump");
                    860:                        *pchecked++ = fl->f_dumpdev;
                    861:                }
                    862:                if (!alreadychecked(fl->f_argdev, checked, pchecked)) {
                    863:                        if (!finddev(fl->f_argdev))
                    864:                                deverror(fl->f_needs, "arg");
                    865:                        *pchecked++ = fl->f_argdev;
                    866:                }
                    867:        }
                    868: }
                    869: 
                    870: /*
                    871:  * Do as above, but for swap devices.
                    872:  */
                    873: dev_t *
                    874: verifyswap(fl, checked, pchecked)
                    875:        register struct file_list *fl;
                    876:        dev_t checked[];
                    877:        register dev_t *pchecked;
                    878: {
                    879: 
                    880:        for (;fl && fl->f_type == SWAPSPEC; fl = fl->f_next) {
                    881:                if (eq(fl->f_fn, "generic"))
                    882:                        continue;
                    883:                if (alreadychecked(fl->f_swapdev, checked, pchecked))
                    884:                        continue;
                    885:                if (!finddev(fl->f_swapdev))
                    886:                        fprintf(stderr,
                    887:                           "config: swap device %s not configured", fl->f_fn);
                    888:                *pchecked++ = fl->f_swapdev;
                    889:        }
                    890:        return (pchecked);
                    891: }
                    892: 
                    893: /*
                    894:  * Has a device already been checked
                    895:  * for it's existence in the configuration?
                    896:  */
                    897: alreadychecked(dev, list, last)
                    898:        dev_t dev, list[];
                    899:        register dev_t *last;
                    900: {
                    901:        register dev_t *p;
                    902: 
                    903:        for (p = list; p < last; p++)
                    904:                if (samedev(*p, dev))
                    905:                        return (1);
                    906:        return (0);
                    907: }
                    908: 
                    909: deverror(systemname, devtype)
                    910:        char *systemname, *devtype;
                    911: {
                    912: 
                    913:        fprintf(stderr, "config: %s: %s device not configured\n",
                    914:                systemname, devtype);
                    915: }
                    916: 
                    917: /*
                    918:  * Look for the device in the list of
                    919:  * configured hardware devices.  Must
                    920:  * take into account stuff wildcarded.
                    921:  */
                    922: /*ARGSUSED*/
                    923: finddev(dev)
                    924:        dev_t dev;
                    925: {
                    926: 
                    927:        /* punt on this right now */
                    928:        return (1);
                    929: }

unix.superglobalmegacorp.com

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