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