|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)rmt.c 4.3 82/05/19"; ! 3: #endif ! 4: ! 5: /* ! 6: * rmt ! 7: */ ! 8: #include <stdio.h> ! 9: #include <sgtty.h> ! 10: #include <sys/types.h> ! 11: #include <sys/mtio.h> ! 12: #include <errno.h> ! 13: ! 14: int tape = -1; ! 15: ! 16: #define MAXRECSIZ (10*1024) /* small enuf for pdp-11's too */ ! 17: char record[MAXRECSIZ]; ! 18: ! 19: #define SSIZE 64 ! 20: char device[SSIZE]; ! 21: char count[SSIZE], mode[SSIZE], pos[SSIZE], op[SSIZE]; ! 22: ! 23: extern errno; ! 24: char *sys_errlist[]; ! 25: char resp[BUFSIZ]; ! 26: ! 27: char *sprintf(); ! 28: long lseek(); ! 29: ! 30: FILE *debug; ! 31: ! 32: main(argc, argv) ! 33: int argc; ! 34: char **argv; ! 35: { ! 36: int rval; ! 37: char c; ! 38: int n, i, cc; ! 39: ! 40: argc--, argv++; ! 41: if (argc > 0) { ! 42: debug = fopen(*argv, "w"); ! 43: if (debug == 0) ! 44: exit(1); ! 45: (void) setbuf(debug, (char *)0); ! 46: } ! 47: top: ! 48: errno = 0; ! 49: rval = 0; ! 50: if (read(0, &c, 1) != 1) ! 51: exit(0); ! 52: switch (c) { ! 53: ! 54: case 'O': ! 55: if (tape >= 0) ! 56: (void) close(tape); ! 57: gets(device); gets(mode); ! 58: if (debug) fprintf(debug, "rmtd: O %s %s\n", device, mode); ! 59: tape = open(device, atoi(mode)); ! 60: if (tape < 0) ! 61: goto ioerror; ! 62: goto respond; ! 63: ! 64: case 'C': ! 65: if (debug) fprintf(debug, "rmtd: C\n"); ! 66: gets(device); /* discard */ ! 67: if (close(tape) < 0) ! 68: goto ioerror; ! 69: tape = -1; ! 70: goto respond; ! 71: ! 72: case 'L': ! 73: gets(count); gets(pos); ! 74: if (debug) fprintf(debug, "rmtd: L %s %s\n", count, pos); ! 75: rval = lseek(tape, (long) atoi(count), atoi(pos)); ! 76: if (rval < 0) ! 77: goto ioerror; ! 78: goto respond; ! 79: ! 80: case 'W': ! 81: gets(count); ! 82: n = atoi(count); ! 83: if (debug) fprintf(debug, "rmtd: W %s\n", count); ! 84: for (i = 0; i < n; i += cc) { ! 85: cc = read(0, &record[i], n - i); ! 86: if (cc <= 0) { ! 87: if (debug) fprintf(debug, "rmtd: premature eof\n"); ! 88: exit(1); ! 89: } ! 90: } ! 91: rval = write(tape, record, n); ! 92: if (rval < 0) ! 93: goto ioerror; ! 94: goto respond; ! 95: ! 96: case 'R': ! 97: gets(count); ! 98: if (debug) fprintf(debug, "rmtd: R %s\n", count); ! 99: n = atoi(count); ! 100: if (n > sizeof (record)) ! 101: n = sizeof (record); ! 102: rval = read(tape, record, n); ! 103: if (rval < 0) ! 104: goto ioerror; ! 105: (void) sprintf(resp, "A%d\n", rval); ! 106: (void) write(1, resp, strlen(resp)); ! 107: (void) write(1, record, rval); ! 108: goto top; ! 109: ! 110: case 'I': ! 111: gets(op); gets(count); ! 112: if (debug) fprintf(debug, "rmtd: I %s %s\n", op, count); ! 113: { struct mtop mtop; ! 114: mtop.mt_op = atoi(op); ! 115: mtop.mt_count = atoi(count); ! 116: if (ioctl(tape, MTIOCTOP, (char *)&mtop) < 0) ! 117: goto ioerror; ! 118: rval = mtop.mt_count; ! 119: } ! 120: goto respond; ! 121: ! 122: case 'S': /* status */ ! 123: if (debug) fprintf(debug, "rmtd: S\n"); ! 124: { struct mtget mtget; ! 125: if (ioctl(tape, MTIOCGET, (char *)&mtget) < 0) ! 126: goto ioerror; ! 127: rval = sizeof (mtget); ! 128: (void) write(1, (char *)&mtget, sizeof (mtget)); ! 129: goto respond; ! 130: } ! 131: ! 132: default: ! 133: if (debug) fprintf(debug, "rmtd: garbage command %c\n", c); ! 134: exit(1); ! 135: } ! 136: respond: ! 137: if (debug) fprintf(debug, "rmtd: A %d\n", rval); ! 138: (void) sprintf(resp, "A%d\n", rval); ! 139: (void) write(1, resp, strlen(resp)); ! 140: goto top; ! 141: ioerror: ! 142: error(errno); ! 143: goto top; ! 144: } ! 145: ! 146: gets(bp) ! 147: char *bp; ! 148: { ! 149: int i; ! 150: char *cp = bp; ! 151: ! 152: for (i = 0; i < SSIZE; i++) { ! 153: if (read(0, cp+i, 1) != 1) ! 154: exit(0); ! 155: if (cp[i] == '\n') ! 156: break; ! 157: } ! 158: cp[i] = '\0'; ! 159: } ! 160: ! 161: error(num) ! 162: int num; ! 163: { ! 164: ! 165: if (debug) fprintf(debug, "rmtd: E %d (%s)\n", num, sys_errlist[num]); ! 166: (void) sprintf(resp, "E%d\n%s\n", num, sys_errlist[num]); ! 167: (void) write(1, resp, strlen (resp)); ! 168: } ! 169:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.