|
|
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: ! 12: #define equal(s1,s2) (strcmp(s1, s2) == 0) ! 13: ! 14: struct commands { ! 15: char *c_name; ! 16: int c_code; ! 17: int c_ronly; ! 18: } com[] = { ! 19: { "weof", MTWEOF, 0 }, ! 20: { "eof", MTWEOF, 0 }, ! 21: { "fsf", MTFSF, 1 }, ! 22: { "bsf", MTBSF, 1 }, ! 23: { "fsr", MTFSR, 1 }, ! 24: { "bsr", MTBSR, 1 }, ! 25: { "rewind", MTREW, 1 }, ! 26: { "offline", MTOFFL, 1 }, ! 27: { "rewoffl", MTOFFL, 1 }, ! 28: { "status", MTNOP, 1 }, ! 29: { 0 } ! 30: }; ! 31: ! 32: int mtfd; ! 33: struct mtop mt_com; ! 34: struct mtget mt_status; ! 35: char *tape; ! 36: ! 37: main(argc, argv) ! 38: char **argv; ! 39: { ! 40: char line[80], *getenv(); ! 41: register char *cp; ! 42: register struct commands *comp; ! 43: ! 44: if (argc > 2 && (equal(argv[1], "-t") || equal(argv[1], "-f"))) { ! 45: argc -= 2; ! 46: tape = argv[2]; ! 47: argv += 2; ! 48: } else ! 49: if ((tape = getenv("TAPE")) == NULL) ! 50: tape = DEFTAPE; ! 51: if (argc < 2) { ! 52: fprintf(stderr, "usage: mt [ -f device ] command [ count ]\n"); ! 53: exit(1); ! 54: } ! 55: cp = argv[1]; ! 56: for (comp = com; comp->c_name != NULL; comp++) ! 57: if (strncmp(cp, comp->c_name, strlen(cp)) == 0) ! 58: break; ! 59: if (comp->c_name == NULL) { ! 60: fprintf(stderr, "mt: don't grok \"%s\"\n", cp); ! 61: exit(1); ! 62: } ! 63: if ((mtfd = open(tape, comp->c_ronly ? 0 : 2)) < 0) { ! 64: perror(tape); ! 65: exit(1); ! 66: } ! 67: if (comp->c_code != MTNOP) { ! 68: mt_com.mt_op = comp->c_code; ! 69: mt_com.mt_count = (argc > 2 ? atoi(argv[2]) : 1); ! 70: if (mt_com.mt_count < 0) { ! 71: fprintf(stderr, "mt: negative repeat count\n"); ! 72: exit(1); ! 73: } ! 74: if (ioctl(mtfd, MTIOCTOP, &mt_com) < 0) { ! 75: fprintf(stderr, "%s %s %d ", tape, comp->c_name, ! 76: mt_com.mt_count); ! 77: perror("failed"); ! 78: exit(2); ! 79: } ! 80: } else { ! 81: if (ioctl(mtfd, MTIOCGET, (char *)&mt_status) < 0) { ! 82: perror("mt"); ! 83: exit(2); ! 84: } ! 85: status(&mt_status); ! 86: } ! 87: } ! 88: ! 89: #ifdef vax ! 90: #include <vaxmba/mtreg.h> ! 91: #include <vaxmba/htreg.h> ! 92: ! 93: #include <vaxuba/utreg.h> ! 94: #include <vaxuba/tmreg.h> ! 95: #undef b_repcnt /* argh */ ! 96: #include <vaxuba/tsreg.h> ! 97: #endif ! 98: ! 99: #ifdef sun ! 100: #include <sundev/tmreg.h> ! 101: #include <sundev/arreg.h> ! 102: #endif ! 103: ! 104: struct tape_desc { ! 105: short t_type; /* type of magtape device */ ! 106: char *t_name; /* printing name */ ! 107: char *t_dsbits; /* "drive status" register */ ! 108: char *t_erbits; /* "error" register */ ! 109: } tapes[] = { ! 110: #ifdef vax ! 111: { MT_ISTS, "ts11", 0, TSXS0_BITS }, ! 112: { MT_ISHT, "tm03", HTDS_BITS, HTER_BITS }, ! 113: { MT_ISTM, "tm11", 0, TMER_BITS }, ! 114: { MT_ISMT, "tu78", MTDS_BITS, 0 }, ! 115: { MT_ISUT, "tu45", UTDS_BITS, UTER_BITS }, ! 116: #endif ! 117: #ifdef sun ! 118: { MT_ISCPC, "TapeMaster", TMS_BITS, 0 }, ! 119: { MT_ISAR, "Archive", ARCH_CTRL_BITS, ARCH_BITS }, ! 120: #endif ! 121: { 0 } ! 122: }; ! 123: ! 124: /* ! 125: * Interpret the status buffer returned ! 126: */ ! 127: status(bp) ! 128: register struct mtget *bp; ! 129: { ! 130: register struct tape_desc *mt; ! 131: ! 132: for (mt = tapes; mt->t_type; mt++) ! 133: if (mt->t_type == bp->mt_type) ! 134: break; ! 135: if (mt->t_type == 0) { ! 136: printf("unknown tape drive type (%d)\n", bp->mt_type); ! 137: return; ! 138: } ! 139: printf("%s tape drive, residual=%d\n", mt->t_name, bp->mt_resid); ! 140: printreg("ds", bp->mt_dsreg, mt->t_dsbits); ! 141: printreg("\ner", bp->mt_erreg, mt->t_erbits); ! 142: putchar('\n'); ! 143: } ! 144: ! 145: /* ! 146: * Print a register a la the %b format of the kernel's printf ! 147: */ ! 148: printreg(s, v, bits) ! 149: char *s; ! 150: register char *bits; ! 151: register unsigned short v; ! 152: { ! 153: register int i, any = 0; ! 154: register char c; ! 155: ! 156: if (bits && *bits == 8) ! 157: printf("%s=%o", s, v); ! 158: else ! 159: printf("%s=%x", s, v); ! 160: bits++; ! 161: if (v && bits) { ! 162: putchar('<'); ! 163: while (i = *bits++) { ! 164: if (v & (1 << (i-1))) { ! 165: if (any) ! 166: putchar(','); ! 167: any = 1; ! 168: for (; (c = *bits) > 32; bits++) ! 169: putchar(c); ! 170: } else ! 171: for (; *bits > 32; bits++) ! 172: ; ! 173: } ! 174: putchar('>'); ! 175: } ! 176: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.