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