Annotation of 42BSD/etc/rmt.c, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.