|
|
1.1 root 1: /*
2: * mkdev.c
3: * 06/28/93
4: *
5: * Allow the user to configure devices requiring loadable drivers.
6: * Uses common routines in build0.c: cc -o mkdev mkdev.c build0.c
7: * Usage: mkdev [ -bdv ] { scsi | at | floppytape } ...
8: * Options:
9: * -b Use special processing when invoked from /etc/build
10: * -d Debug; echo commands without executing
11: * -v Verbose
12: *
13: * Roughly, do the following for device "foo" ( at | aha154x | ss )
14: *
15: * cp /drv/foo /tmp/drv/foo
16: * make necessary patches "xxx" to /tmp/drv/foo
17: * if not "at" device
18: * make nodes (mknod -f) for the device
19: * if build mode (bflag)
20: * if rootdev
21: * append to LDKERFILE:
22: * HD=foo.a
23: * HDUNDEF="-u foocon_"
24: * HDPATCH="drvl_+xx0=foocon_"
25: * /etc/drvld -r /tmp/drv/foo
26: * append to PATCHFILE:
27: * cp /tmp/drv/foo /mnt/drv/foo
28: * if rootdev, also append to PATCHFILE:
29: * /conf/patch /mnt/coherent xxx
30: * else - not build mode
31: * display message saying patched driver is at /tmp/drv/foo
32: */
33:
34: #define __KERNEL__ 1
35:
36: #include <stdio.h>
37: #include <sys/devices.h>
38: #include <sys/con.h>
39: #include <string.h>
40:
41: #include "build0.h"
42:
43: #define VERSION "V4" /* version number */
44: #define USAGEMSG "Usage:\t/etc/mkdev [ -bdv ] [ scsi | at | floppytape ] ...\n"
45: #define BUFLEN 50
46: #define AHA_HDS 64
47: #define AHA_DMA 5
48: #define AHA_IRQ 11
49: #define AHA_BASE 0x330
50: #define TANDY_HDS 16
51:
52: /*
53: * calculate the minor number for the specified floppy tape device:
54: * uu: unit # (0-3)
55: * vv: brand of drive: 0=Archive/Mountain/Summit, 1=CMS, 2&3=rsvd
56: * s: select: 0=hard select, 1=soft select
57: * r: rewind: 0=no rewind on close, 1=rewind on close
58: */
59: #define FL_TAPE_MINOR(uu,vv,s,r) ((1<<6)|((uu)<<4)|((s)<<3)|((r)<<2)|(vv))
60: #define FL_TAPE_HARD_SEL 0
61: #define FL_TAPE_SOFT_SEL 1
62: #define FL_TAPE_NOREW 0
63: #define FL_TAPE_REW 1
64:
65: /* Forward. */
66: void scsi();
67: void at();
68: void floppy_tape();
69:
70: /* Globals. */
71: int bflag; /* Invoked from /etc/build. */
72:
73: main(argc, argv) int argc; char *argv[];
74: {
75: register char *s;
76:
77: argv0 = argv[0];
78: usagemsg = USAGEMSG;
79: if (argc > 1 && argv[1][0] == '-') {
80: for (s = &argv[1][1]; *s; ++s) {
81: switch(*s) {
82: case 'b': ++bflag; break;
83: case 'd': ++dflag; break;
84: case 'v': ++vflag; break;
85: case 'V':
86: fprintf(stderr, "mkdev: %s\n", VERSION);
87: break;
88: default: usage(); break;
89: }
90: }
91: --argc;
92: ++argv;
93: }
94:
95: if (argc == 1) {
96: usage();
97: } else {
98: /* Do specified things. */
99: while (--argc > 0) {
100: if (strcmp (argv [1], "scsi") == 0)
101: scsi ();
102: else if (strcmp (argv [1], "at") == 0)
103: at ();
104: else if (strcmp (argv [1], "floppytape") == 0)
105: floppy_tape ();
106: else
107: usage ();
108: ++argv;
109: }
110: }
111: exit (0);
112: }
113:
114: void
115: scsi()
116: {
117: char *dev;
118: int i, id, lun;
119: int ss_dev = 0;
120: int fut_dev = 0;
121: unsigned nsdrive = 0;
122: int ss_int = 5, new_int;
123: unsigned int ss_base = 0xCA00, new_base;
124: unsigned char ss_patch[200], buf[BUFLEN];
125: FILE *fp;
126: int aha_dev = 0, sd_hds = AHA_HDS, sd_dma = AHA_DMA;
127: int hai_dev = 0;
128: int sd_irq = AHA_IRQ, sd_base = AHA_BASE;
129: int hai_tape = 0;
130: int hai_disk = 0;
131: int unit;
132: int tape_dev;
133: int choice;
134:
135: static int sd_irq_list[] = { 9, 10, 11, 12, 14, 15 };
136: int sd_irq_ct = sizeof(sd_irq_list)/sizeof(sd_irq_list[0]);
137:
138: static int sd_base_list[] =
139: { 0x130, 0x134, 0x230, 0x234, 0x330, 0x334 };
140: int sd_base_ct = sizeof(sd_base_list)/sizeof(sd_base_list[0]);
141:
142: static int sd_dma_list[] = { 0, 5, 6, 7 };
143: int sd_dma_ct = sizeof(sd_dma_list)/sizeof(sd_dma_list[0]);
144:
145: cls(0);
146: printf(
147: "COHERENT currently supports the following SCSI host adapters:\n"
148: "\n"
149: "(1) Adaptec AHA-154x series, no tape support\n"
150: "(2) Adaptec AHA-154x series, with tape support\n\n"
151: "(3) Seagate ST01 or ST02\n"
152: "(4) Future Domain TMC-845/850/860/875/885\n"
153: "(5) Future Domain TMC-840/841/880/881\n"
154: "\n"
155: );
156: retry:
157: switch(get_int(0, 5, "Enter a number from the above list or 0 to exit:")) {
158: case 0:
159: return;
160: case 1:
161: aha_dev = 1;
162: break;
163: case 2:
164: hai_dev = 1;
165: break;
166: case 3:
167: ss_dev = 1;
168: break;
169: case 4:
170: ss_dev = 1;
171: fut_dev = 1;
172: nsdrive |= 0x8000;
173: break;
174: case 5:
175: ss_dev = 1;
176: fut_dev = 1;
177: nsdrive |= 0x4000;
178: break;
179: default:
180: goto retry; /* should never happen */
181: }
182:
183: /*
184: * If Adaptec, allow patching host adapter variables SD_HDS
185: * for Tandy variant of host BIOS.
186: */
187: if (aha_dev) {
188: printf("\nMost versions of the Adaptec BIOS use 64-head translation mode.\n");
189: printf("A few, including some Tandy variants, use 16-head translation mode.\n\n");
190: if (!yes_no("Do you want 64-head translation mode"))
191: sd_hds = TANDY_HDS;
192: }
193:
194: if (aha_dev || hai_dev) {
195: sd_irq = get_allowed_int(sd_irq_list, sd_irq_ct, ga_dec,
196: sd_irq, ga_nonstrict,
197: "\nWhich IRQ does the host adapter use? ");
198: sd_base = get_allowed_int(sd_base_list, sd_base_ct, ga_hex,
199: sd_base, ga_nonstrict,
200: "\nWhat is the hexadecimal host adapter base port address? ");
201: sd_dma = get_allowed_int(sd_dma_list, sd_dma_ct, ga_hex,
202: sd_dma, ga_nonstrict,
203: "\nWhich DMA channel does the host adapter use? ");
204: }
205:
206: /*
207: * If Seagate or Future Domain, allow patching host adapter
208: * variables SS_INT and SS_BASE.
209: */
210: if (ss_dev) {
211: printf("\nPlease refer to the installation guide for your host adapter.\n");
212:
213: /* Get value to patch for SS_INT */
214: printf("\nWhich IRQ number does the host adapter use [%d]? ", ss_int);
215: while (1) {
216: new_int = ss_int;
217: fgets(buf, BUFLEN, stdin);
218: sscanf(buf, "%d", &new_int);
219: if (new_int < 3 || new_int > 15)
220: printf("Type a number between 3 and 15 or just <Enter> for the default: ");
221: else
222: break;
223: } /* endwhile */
224: ss_int = new_int;
225:
226: /* Get value to patch for SS_BASE */
227: printf("Your host adapter is configured for a base segment address. Possible\n");
228: printf("values are: C800, CA00, CC00, CE00, DC00, and DE00.\n");
229: printf("What is your 4-digit hexadecimal base address [%04lx]? ", ss_base);
230: while (1) {
231: new_base = ss_base;
232: fgets(buf, BUFLEN, stdin);
233: sscanf(buf, "%x", &new_base);
234: if (new_base < 0xC800 || new_base > 0xDE00)
235: printf("Type a number between C800 and DE00 or just <Enter> for the default: ");
236: else
237: break;
238: } /* endwhile */
239: ss_base = new_base;
240: }
241:
242: /* Make device nodes. */
243: cls(0);
244: if (hai_dev) {
245: printf(
246: "You must specify a SCSI-ID (0 through 7) for each SCSI hard disk or tape\n"
247: "device. Each SCSI hard disk device can contain up to four partitions.\n"
248: "Tape devices must be configured as logical unit number (LUN) 0. All current\n"
249: "SCSI tape drives with embedded SCSI controllers default to LUN 0.\n\n"
250: );
251: } else {
252: printf(
253: "You must specify a SCSI-ID (0 through 7) for each SCSI hard disk device.\n"
254: "Each SCSI hard disk device can contain up to four partitions.\n\n"
255: );
256: }
257:
258: for (;;) {
259: tape_dev = 0;
260:
261: if (hai_dev) {
262: printf(
263: "1) Enter SCSI ID for SCSI hard disk (fixed or removable media)\n"
264: "2) Enter SCSI ID for SCSI tape drive\n\n"
265: "3) End entering SCSI ID values.\n\n"
266: );
267: choice = get_int(1, 3, "Your choice:");
268: } else {
269: printf(
270: "1) Enter SCSI ID for SCSI hard disk (fixed or removable media)\n"
271: "2) End entering SCSI ID values.\n\n"
272: );
273: choice = get_int(1, 2, "Your choice:");
274: }
275:
276: if (hai_dev) {
277: if (choice == 2)
278: tape_dev = 1;
279: if (choice == 3)
280: break;
281: } else {
282: if (choice == 2)
283: break;
284: }
285:
286: if (tape_dev) {
287: id = get_int(0, 7, "\nEnter the next tape device SCSI-ID:");
288: hai_tape |= (1 << id);
289: } else {
290: id = get_int(0, 7, "\nEnter the next disk device SCSI-ID:");
291: hai_disk |= (1 << id);
292: }
293:
294: lun = 0;
295: nsdrive |= (1 << id);
296:
297: /* Make /tmp/dev if bflag. */
298: if (bflag) {
299: if ((i = is_dir("/tmp/dev")) == 0)
300: sys("/bin/mkdir /tmp/dev", S_FATAL);
301: else if (i == -1)
302: fatal("/tmp/dev is not a directory");
303: }
304: dev = (bflag) ? "/tmp/dev" : "/dev";
305:
306: /*
307: * If we are creating a SCSI tape device (Adaptec only),
308: * create special raw device nodes and generate links
309: * for /dev/tape and /dev/ntape to make it easy on the user.
310: */
311: #if !TEST
312: if (tape_dev) {
313: sprintf(cmd, "/etc/mknod -f %s/rst%d c %d %d",
314: dev, id, SCSI_MAJOR, SCSI_minor(1, id, lun, 3));
315: sys(cmd, S_NONFATAL);
316: sprintf(cmd, "/etc/mknod -f %s/rst%dn c %d %d",
317: dev, id, SCSI_MAJOR, SCSI_minor(1, id, lun, 1));
318: sys(cmd, S_NONFATAL);
319: sprintf(cmd, "/bin/ln -f %s/rst%d %s/tape",
320: dev, id, dev);
321: sys(cmd, S_NONFATAL);
322: sprintf(cmd, "/bin/ln -f %s/rst%dn %s/ntape",
323: dev, id, dev);
324: sys(cmd, S_NONFATAL);
325:
326: /* set the device permissions. */
327: sprintf(cmd, "/bin/chmog 600 sys sys %s/rst%d*", dev, id);
328: sys(cmd, S_NONFATAL);
329: } else {
330: /*
331: * SCSI disk device:
332: * Make the cooked devices.
333: */
334: for (i = 0; i < 4; i++) {
335: sprintf(cmd, "/etc/mknod -f %s/sd%d%c b %d %d",
336: dev, id, 'a'+i, SCSI_MAJOR, SCSI_minor(0, id, lun, i));
337: sys(cmd, S_NONFATAL);
338: }
339: sprintf(cmd, "/etc/mknod -f %s/sd%dx b %d %d",
340: dev, id, SCSI_MAJOR, SCSI_minor(1, id, lun, 0));
341: sys(cmd, S_NONFATAL);
342:
343: /* make the raw devices. */
344: for (i = 0; i < 4; i++) {
345: sprintf(cmd, "/etc/mknod -f %s/rsd%d%c c %d %d",
346: dev, id, 'a'+i, SCSI_MAJOR, SCSI_minor(0, id, lun, i));
347: sys(cmd, S_NONFATAL);
348: }
349: sprintf(cmd, "/etc/mknod -f %s/rsd%dx c %d %d",
350: dev, id, SCSI_MAJOR, SCSI_minor(1, id, lun, 0));
351: sys(cmd, S_NONFATAL);
352:
353: /* set the device permissions. */
354: sprintf(cmd, "/bin/chmog 600 sys sys %s/sd*[a-d] %s/rsd*[a-d]",dev,dev);
355: sys(cmd, S_NONFATAL);
356: sprintf(cmd, "/bin/chmog 600 root root %s/sd*x %s/rsd*x", dev, dev);
357: sys(cmd, S_NONFATAL);
358: } /* !(tape_dev) */
359:
360: /* append lines to /tmp/devices to pass device info to /etc/build. */
361: if (bflag && !tape_dev) {
362: for (i = 0; i < 4; i++) {
363: sprintf(cmd, "/bin/echo sd%dx sd%d%c %d %d >>/tmp/devices",
364: id, id, 'a'+i, SCSI_MAJOR, SCSI_minor(0, id, lun, i));
365: sys(cmd, S_NONFATAL);
366: }
367: }
368: #endif
369: cls(0);
370: printf("%s device has been installed at id %d\n\n",
371: tape_dev ? "Tape" : "Disk", id);
372: }
373:
374: /* At this point all SCSI id's attached to the host are known. */
375:
376: /*
377: * Ugly patching stuff specific to "ss" driver.
378: */
379: if (ss_dev) {
380:
381: /* "ss" device driver requires patching to work at all. */
382: sprintf (ss_patch,
383: "NSDRIVE=0x%04x SS_INT=%d SS_BASE=0x%04x",
384: nsdrive, ss_int, ss_base);
385:
386: /* for target kernel */
387:
388: idenable_dev ("ss");
389:
390: sprintf (buf, "unsigned int\tNSDRIVE = 0x%04x;", nsdrive);
391: cohtune_ent ("ss", "NSDRIVE", buf);
392:
393: sprintf (buf, "unsigned int\tSS_INT = %d;", ss_int);
394: cohtune_ent ("ss", "SS_INT", buf);
395:
396: sprintf (buf, "unsigned int\tSS_BASE = %d;", ss_base);
397: cohtune_ent ("ss", "SS_BASE", buf);
398:
399: /* for second boot kernel */
400: fp = fopen(PATCHFILE,"a");
401:
402: fprintf (fp, "/conf/patch /mnt/coherent drvl+%d=sscon \n",
403: SCSI_MAJOR * sizeof (DRV));
404:
405: fprintf (fp, "/conf/patch /mnt/coherent %s\n", ss_patch);
406:
407: fclose (fp);
408:
409: /* for first boot kernel */
410:
411: sprintf (cmd, "/conf/kpatch -v %s", ss_patch);
412: sys (cmd, S_FATAL);
413: sprintf (cmd, "/conf/kpatch -v sscon:%d:in", SCSI_MAJOR);
414: sys (cmd, S_FATAL);
415:
416: /*
417: * Allow patching of the loaded driver parameters.
418: */
419: for (unit = 0; unit < 7; unit++) {
420: if (nsdrive & (1 << unit)) {
421: sprintf (cmd, "/etc/hdparms -%c%c %s/sd%dx",
422: 'r', fut_dev ? 'f' : 's', dev, unit);
423: sys (cmd, S_NONFATAL);
424: }
425: }
426: } /* end of "ss" stuff */
427:
428: /*
429: * Ugly patching stuff specific to "aha154x" driver.
430: * At this point all SCSI id's attached to the host are known.
431: */
432: if (aha_dev) {
433: /*
434: * Tandy Adaptec BIOS spoofs different head count than
435: * Adaptec's Own Translation Mode.
436: */
437:
438: sprintf (ss_patch, "SD_HDS=%d SDDMA=%d SDIRQ=%d SDBASE=0x%x ",
439: sd_hds, sd_dma, sd_irq, sd_base);
440:
441: /* for target kernel */
442:
443: idenable_dev ("aha");
444:
445: sprintf (buf, "int\tSD_HDS = %d;", sd_hds);
446: cohtune_ent ("aha", "SD_HDS", buf);
447:
448: sprintf (buf, "int\tSDDMA = %d;", sd_dma);
449: cohtune_ent ("aha", "SDDMA", buf);
450:
451: sprintf (buf, "int\tSDIRQ = %d;", sd_irq);
452: cohtune_ent ("aha", "SDIRQ", buf);
453:
454: sprintf (buf, "int\tSDBASE = 0x%x;", sd_base);
455: cohtune_ent ("aha", "SDBASE", buf);
456:
457: /* for second boot kernel */
458: fp = fopen (PATCHFILE,"a");
459:
460: fprintf (fp, "/conf/patch /mnt/coherent drvl+%d=sdcon\n",
461: SCSI_MAJOR * sizeof (DRV));
462:
463: fprintf (fp, "/conf/patch /mnt/coherent %s\n", ss_patch);
464:
465: fclose (fp);
466:
467: /* for first boot kernel */
468:
469: sprintf (cmd, "/conf/kpatch -v %s", ss_patch);
470: sys (cmd, S_FATAL);
471: sprintf (cmd, "/conf/kpatch -v sdcon:%d:in", SCSI_MAJOR);
472: sys (cmd, S_FATAL);
473: }
474:
475: /*
476: * Ugly patching stuff specific to "hai" driver.
477: * At this point all SCSI id's attached to the host are known.
478: */
479: if (hai_dev) {
480: /*
481: * Tandy Adaptec BIOS spoofs different head count than
482: * Adaptec's Own Translation Mode.
483: */
484: sprintf (ss_patch, "AHADMACHAN=%d:s AHAINTR=%d:s "
485: "AHABASE=0x%x:s HAI_DISK=%d HAI_TAPE=%d ",
486: sd_dma, sd_irq, sd_base, hai_disk, hai_tape);
487:
488: /* for target kernel */
489:
490: idenable_dev ("hai");
491:
492: sprintf (buf, "int\tAHADMACHAN = %d;", sd_dma);
493: cohtune_ent ("hai", "AHADMACHAN", buf);
494:
495: sprintf (buf, "int\tAHAINTR = %d;", sd_irq);
496: cohtune_ent ("hai", "AHAINTR", buf);
497:
498: sprintf (buf, "int\tAHABASE = %d;", sd_base);
499: cohtune_ent ("hai", "AHABASE", buf);
500:
501: sprintf (buf, "int\tHAI_DISK = %d;", hai_disk);
502: cohtune_ent ("hai", "HAI_DISK", buf);
503:
504: sprintf (buf, "int\tHAI_TAPE = %d;", hai_tape);
505: cohtune_ent ("hai", "HAI_TAPE", buf);
506:
507: /* for second boot kernel */
508: fp = fopen (PATCHFILE,"a");
509:
510: fprintf (fp, "/conf/patch /mnt/coherent drvl+%d=scsicon \n",
511: SCSI_MAJOR * sizeof (DRV));
512:
513: fprintf (fp, "/conf/patch /mnt/coherent %s\n", ss_patch);
514:
515: fclose (fp);
516:
517: /* for first boot kernel */
518:
519: sprintf (cmd, "/conf/kpatch -v %s", ss_patch);
520: sys (cmd, S_FATAL);
521: sprintf (cmd, "/conf/kpatch -v scsicon:%d:in", SCSI_MAJOR);
522: sys (cmd, S_FATAL);
523:
524: } /* end of "hai" stuff */
525: }
526:
527: void
528: at()
529: {
530: unsigned char at_patch[80];
531: FILE *fp;
532: int at_poll;
533: char line[512];
534: int normal_at_poll;
535: int fl_dsk_ch_prob;
536: int use_ps1;
537: int at_drive_ct;
538:
539: /* Normal vs. alternate polling. */
540: cls(0);
541: printf(
542: "Most AT-compatible controllers work with NORMAL polling.\n\n"
543: "Perstor controllers and some IDE hard drives require ALTERNATE polling.\n\n"
544: "If you get \"<Watchdog Timeout>\" or \"at0:TO\" errors with normal polling,\n"
545: "use alternate polling.\n\n");
546:
547: if (normal_at_poll = yes_no ("Use NORMAL polling")) {
548: strcpy (at_patch, "ATSREG=0x3F6 ");
549: at_poll = 0x3F6;
550: } else {
551: strcpy (at_patch, "ATSREG=0x1F7 ");
552: at_poll = 0x1F7;
553: }
554: cls(0);
555: printf("%s polling will be used.\n\n",
556: normal_at_poll ? "NORMAL" : "ALTERNATE");
557:
558: /* Normal vs. PS1 hard disk counts. */
559: if (use_ps1 = yes_no(
560: "Are you installing on an IBM PS1 or ValuePoint?")) {
561: at_drive_ct = get_int(1, 2,
562: "Enter number of non-SCSI hard drives:");
563: fl_dsk_ch_prob = 1;
564: } else {
565: fl_dsk_ch_prob = 0;
566: }
567:
568: /* for target kernel */
569:
570: idenable_dev ("at");
571: sprintf (line, "int\tATSREG = 0x%x;", at_poll);
572: cohtune_ent ("at", "ATSREG", line);
573: if (use_ps1)
574: idtune_var("AT_DRIVE_CT", at_drive_ct);
575: idtune_var("FL_DSK_CH_PROB", fl_dsk_ch_prob);
576:
577: /* for second boot kernel */
578: fp = fopen (PATCHFILE,"a");
579: fprintf (fp, "/conf/patch /mnt/coherent drvl+%d=atcon \n",
580: AT_MAJOR * sizeof (DRV));
581: fprintf (fp, "/conf/patch /mnt/coherent %s\n", at_patch);
582: fprintf (fp, "/conf/patch /mnt/coherent fl_dsk_ch_prob=%d\n",
583: fl_dsk_ch_prob);
584: if (use_ps1)
585: fprintf (fp, "/conf/patch /mnt/coherent at_drive_ct=%d\n",
586: at_drive_ct);
587: fclose (fp);
588:
589: /* for first boot kernel */
590:
591: sprintf (cmd, "/conf/kpatch -v %s", at_patch);
592: sys (cmd, S_FATAL);
593: sprintf (cmd, "/conf/kpatch -v fl_dsk_ch_prob=%d", fl_dsk_ch_prob);
594: sys (cmd, S_FATAL);
595: if (use_ps1) {
596: sprintf (cmd, "/conf/kpatch -v at_drive_ct=%d", at_drive_ct);
597: sys (cmd, S_FATAL);
598: }
599: /* For PS1, this step must come AFTER at_drive_ct is fixed. */
600: sprintf (cmd, "/conf/kpatch -v atcon:%d:in", AT_MAJOR);
601: sys (cmd, S_FATAL);
602: }
603:
604: /*
605: * floppy_tape: add support for floppy tape (a really disgusting device)
606: *
607: * 1) give user some info regarding COH support for floppy tape
608: * 2) display a list of supported drives
609: * 3) query the user for type of drive
610: * 4) create device nodes for specified drive
611: * 5) (optional) test for which unit number the drive is seen as
612: */
613: void
614: floppy_tape()
615: {
616: int brand; /* which brand of drive (from menu) */
617: int i; /* loop counter */
618:
619: cls(0);
620: printf(
621: "The COHERENT system supports several brands of \"floppy tape backup\" drives,\n"
622: "including QIC-40 and QIC-80 models from Archive, Colorado Memory Systems (CMS),\n"
623: "Mountain, and Summit.\n\n"
624: "Please specify the brand of floppy tape drive on this computer:\n\n"
625: "\t0) Archive, Mountain, or Summit\n"
626: "\t1) Colorado Memory Systems (CMS)\n"
627: "\t2) Other\n\n"
628: );
629: brand = get_int(0, 2, "Enter drive type:");
630: if (brand == 2) {
631: printf(
632: "\nYou have specified a brand of tape drive which is currently unsupported.\n"
633: );
634: return;
635: }
636:
637: /*
638: * now create the following nodes for the specified drive brand:
639: * Rewind No Rewind Unit #
640: * -------- --------- ---------
641: * DEV/rct0 DEV/nrct0 (unit #0)
642: * DEV/rct1 DEV/nrct1 (unit #1)
643: * DEV/rct2 DEV/nrct2 (unit #2)
644: * DEV/rct3 DEV/nrct3 (unit #3)
645: * DEV/rctss DEV/nrctss (soft select)
646: *
647: * where DEV is /mnt/dev if called from /etc/build and /dev otherwise.
648: */
649: for (i = 0; i <= 3; ++i) {
650: sprintf(cmd, "/etc/mknod -f %s/rct%d c %d %d",
651: (bflag) ? "/mnt/dev" : "/dev", i, FL_MAJOR,
652: FL_TAPE_MINOR(i, brand, FL_TAPE_HARD_SEL, FL_TAPE_REW));
653: sys(cmd, S_NONFATAL);
654: sprintf(cmd, "/etc/mknod -f %s/nrct%d c %d %d",
655: (bflag) ? "/mnt/dev" : "/dev", i, FL_MAJOR,
656: FL_TAPE_MINOR(i, brand, FL_TAPE_HARD_SEL, FL_TAPE_NOREW));
657: sys(cmd, S_NONFATAL);
658: }
659: sprintf(cmd, "/etc/mknod -f %s/rctss c %d %d",
660: (bflag) ? "/mnt/dev" : "/dev", FL_MAJOR,
661: FL_TAPE_MINOR(0, brand, FL_TAPE_SOFT_SEL, FL_TAPE_REW));
662: sys(cmd, S_NONFATAL);
663: sprintf(cmd, "/etc/mknod -f %s/nrctss c %d %d",
664: (bflag) ? "/mnt/dev" : "/dev", FL_MAJOR,
665: FL_TAPE_MINOR(0, brand, FL_TAPE_SOFT_SEL, FL_TAPE_NOREW));
666: sys(cmd, S_NONFATAL);
667: }
668:
669: /* end of mkdev.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.