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