|
|
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.