|
|
1.1 root 1: /*
2: * Copyright (c) 1993 NeXT Computer, Inc. All rights reserved.
3: *
4: * Post-Load command for SCSITape. Creates device nodes /dev/rst<n>,
5: * /dev/nrst<n>, /dev/rxt<n>, and /dev/nrxt<n> for up to 4 SCSI tape
6: * units.
7: *
8: * HISTORY
9: * 20-Apr-93 Phillip Dibner at NeXT
10: * Created.
11: */
12:
13: #import <driverkit/IODeviceMaster.h>
14: #import <driverkit/IODevice.h>
15: #import "SCSITapeTypes.h"
16: #import <errno.h>
17: #import <libc.h>
18:
19:
20: #define PATH_NAME_SIZE 10
21: #define DEV_STRING "/dev/"
22: #define INSTANCE_STRING "Instance="
23: #define ST_INIT_ERR_STRING "Error initializing SCSI Tape driver"
24: #define NTAPE_NAMES 4
25:
26: #define DEV_MOD 020666
27: #define DEV_UMASK 0
28:
29: char path [PATH_NAME_SIZE];
30: char *scsiTapeNames[] = {"rst", "nrst", "rxt", "nrxt"};
31: int scsiTapeDevFlags[] = {0, 1, 2, 3}; /* bit 0 = no rewind, bit 1 = Exabyte */
32:
33: int
34: main(int argc, char **argv)
35: {
36: IOReturn ret = IO_R_INVALID;
37: IOObjectNumber tag;
38: IOString kind;
39: int major, minor, iUnit, iRet = 0;
40: unsigned int count = 1;
41: IODeviceMaster *devMaster;
42: int i;
43:
44: devMaster = [IODeviceMaster new];
45:
46: for (iUnit = 0; iUnit < NST; iUnit ++) {
47: bzero (path, PATH_NAME_SIZE);
48: sprintf (path, "%s%s%d", DEV_STRING, "st", iUnit);
49:
50: /*
51: * Find this instance of the SCSI Tape driver
52: */
53:
54: ret = [devMaster lookUpByDeviceName: path + strlen (DEV_STRING)
55: objectNumber: &tag
56: deviceKind: &kind];
57:
58: #ifdef DEBUG
59: printf (" unit %d, obj name %s\n", iUnit, path);
60: printf (" ret = %d\n", ret);
61: #endif DEBUG
62:
63: /*
64: * Special work to do for the first SCSITape object
65: */
66: if (iUnit == 0) {
67:
68: /*
69: * If we couldn't find the first one, we will return failure.
70: */
71: if (ret != IO_R_SUCCESS) {
72: printf ("%s: couldn't find driver. Returned %d\n",
73: ST_INIT_ERR_STRING, ret);
74: iRet = -1;
75: }
76:
77: /*
78: * Query the object for its major device number
79: */
80: major = -1;
81: ret = [devMaster getIntValues:&major
82: forParameter:"IOMajorDevice" objectNumber:tag
83: count:&count];
84: if (ret != IO_R_SUCCESS) {
85: printf ("%s: couldn't get major number: Returned %d.\n",
86: ST_INIT_ERR_STRING, ret);
87: iRet = -1;
88: }
89: }
90:
91: /*
92: * Remove old devs and create new ones for this unit.
93: */
94: for (i = 0; i < NTAPE_NAMES; i++) {
95:
96: bzero (path, PATH_NAME_SIZE);
97: sprintf (path, "%s%s%d", DEV_STRING, scsiTapeNames [i], iUnit);
98:
99: if (unlink (path)) {
100: if (errno != ENOENT) {
101: printf ("%s: could not delete old %s. Errno is %d\n",
102: ST_INIT_ERR_STRING, path, errno);
103: iRet = -1;
104: }
105: }
106:
107:
108: /*
109: * If we found this object, create new device nodes
110: */
111: if (ret == IO_R_SUCCESS) {
112: minor = (iUnit << 3) | scsiTapeDevFlags [i];
113:
114: umask (DEV_UMASK);
115: if (mknod(path, DEV_MOD, (major << 8) | minor)) {
116: printf ("%s: could not create %s. Errno is %d\n",
117: ST_INIT_ERR_STRING, path, errno);
118: iRet = -1;
119: }
120: }
121: }
122: } /* for iUnit */
123: return iRet;
124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.