|
|
1.1 root 1: static char *sccsid = "@(#)mt.c 4.8 (Berkeley) 83/05/08";
2: /*
3: * mt --
4: * magnetic tape manipulation program
5: */
6: #include <stdio.h>
7: #include <ctype.h>
8: #include <sys/types.h>
9: #include <sys/mtio.h>
10: #include <sys/ioctl.h>
11: #include <vba/cipher.h>
12:
13: #define equal(s1,s2) (strcmp(s1, s2) == 0)
14:
15: struct commands {
16: char *c_name;
17: int c_code;
18: int c_ronly;
19: } com[] = {
20: { "weof", MTWEOF, 0 },
21: { "eof", MTWEOF, 0 },
22: { "fsf", MTFSF, 1 },
23: { "bsf", MTBSF, 1 },
24: { "fsr", MTFSR, 1 },
25: { "bsr", MTBSR, 1 },
26: { "rewind", MTREW, 1 },
27: { "offline", MTOFFL, 1 },
28: { "rewoffl", MTOFFL, 1 },
29: { "status", MTNOP, 1 },
30: { 0 }
31: };
32:
33: int mtfd;
34: struct mtop mt_com;
35: struct mtget mt_status;
36: char *tape;
37:
38: main(argc, argv)
39: char **argv;
40: {
41: char line[80], *getenv();
42: register char *cp;
43: register struct commands *comp;
44:
45: if (argc > 2 && (equal(argv[1], "-t") || equal(argv[1], "-f"))) {
46: argc -= 2;
47: tape = argv[2];
48: argv += 2;
49: } else
50: if ((tape = getenv("TAPE")) == NULL)
51: tape = DEFTAPE;
52: if (argc < 2) {
53: fprintf(stderr, "usage: mt [ -f device ] command [ count ]\n");
54: exit(1);
55: }
56: cp = argv[1];
57: for (comp = com; comp->c_name != NULL; comp++)
58: if (strncmp(cp, comp->c_name, strlen(cp)) == 0)
59: break;
60: if (comp->c_name == NULL) exit(1);
61: if ((mtfd = open(tape, comp->c_ronly ? 0 : 2)) < 0) {
62: perror(tape);
63: exit(1);
64: }
65: if (comp->c_code != MTNOP) {
66: mt_com.mt_op = comp->c_code;
67: mt_com.mt_count = (argc > 2 ? atoi(argv[2]) : 1);
68: if (mt_com.mt_count < 0) {
69: fprintf(stderr, "mt: negative repeat count\n");
70: exit(1);
71: }
72: if (ioctl(mtfd, MTIOCTOP, &mt_com) < 0) {
73: fprintf(stderr, "%s %s %d ", tape, comp->c_name,
74: mt_com.mt_count);
75: perror("failed");
76: exit(2);
77: }
78: }
79: else {
80: if (ioctl(mtfd, MTIOCGET, (char *)&mt_status) < 0) {
81: perror("mt");
82: exit(2);
83: }
84: status(&mt_status);
85: }
86: }
87:
88: #define t_type MT_ISCY
89: #define t_name TapeMaster
90:
91: /*
92: * Interpret the status buffer returned
93: */
94: status(bp)
95: register struct mtget *bp;
96: {
97:
98: if (t_type != bp->mt_type) {
99: fprintf(stderr,"unknown tape drive type (%d)\n", bp->mt_type);
100: exit(0);
101: }
102: printf("Cipher tape drive, residual=%x\n", bp->mt_resid);
103: printf("control: %x\n", bp->mt_dsreg);
104: printf("status: %x\n", bp->mt_erreg);
105: printstatus(bp->mt_erreg);
106: }
107:
108: printstatus(value)
109: register unsigned short value;
110: {
111: if((value & (CS_OL | CS_RDY)) != (CS_OL | CS_RDY)) {
112: printf("Drive is not online\n");
113: }
114: if (value & CS_FM) printf("<Filemark Detected> ");
115: if (value & CS_OL) printf("<On line> ");
116: if (value & CS_LP) printf("<Load point> ");
117: if (value & CS_EOT) printf("<End of Tape> ");
118: if (value & CS_RDY) printf("<Ready> ");
119: if (value & CS_FB) printf("<Formatter Busy> ");
120: if (value & CS_P) printf("<Write protected> ");
121: if (value & CS_CR) printf("<Operation Retry> ");
122: printf("\n");
123: switch(value & CS_ERm) {
124: case ER_TIMOUT:
125: case ER_TIMOUT1:
126: case ER_TIMOUT2:
127: case ER_TIMOUT3:
128: case ER_TIMOUT4:
129: printf("Drive timed out during transfer\n");
130: case ER_NEX:
131: printf("Controller referenced non-existant system memory\n");
132: case ER_DIAG:
133: case ER_JUMPER:
134: printf("Controller micro diagnostics failed\n");
135: case ER_HARD:
136: printf("Unrecoverble media error\n");
137: case ER_STROBE:
138: printf("Unsatisfactory media found\n");
139: case ER_FIFO:
140: printf("FIFO error\n");
141: case ER_NOTRDY:
142: printf("Drive is not ready\n");
143: case ER_PROT:
144: printf("Tape is write protected\n");
145: case ER_CHKSUM:
146: printf("Checksum error in controller proms\n");
147: case ER_PARITY:
148: printf("Unrecoverable tape parity error\n");
149: case ER_BLANK:
150: printf("Blank tape found where data was expected\n");
151: case ER_HDWERR:
152: printf("Unrecoverble hardware error\n");
153: default:
154: return;
155: }
156: }
157:
158:
159:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.