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

1.1       root        1: /*
                      2:  * Copyright (c) 1983 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: char copyright[] =
                      9: "@(#) Copyright (c) 1983 Regents of the University of California.\n\
                     10:  All rights reserved.\n";
                     11: #endif not lint
                     12: 
                     13: #ifndef lint
                     14: static char sccsid[] = "@(#)rmt.c      5.2 (Berkeley) 1/7/86";
                     15: #endif not lint
                     16: 
                     17: /*
                     18:  * rmt
                     19:  */
                     20: #include <stdio.h>
                     21: #include <sgtty.h>
                     22: #include <sys/types.h>
                     23: #include <sys/socket.h>
                     24: #include <sys/mtio.h>
                     25: #include <errno.h>
                     26: 
                     27: int    tape = -1;
                     28: 
                     29: char   *record;
                     30: int    maxrecsize = -1;
                     31: char   *checkbuf();
                     32: 
                     33: #define        SSIZE   64
                     34: char   device[SSIZE];
                     35: char   count[SSIZE], mode[SSIZE], pos[SSIZE], op[SSIZE];
                     36: 
                     37: extern errno;
                     38: char   *sys_errlist[];
                     39: char   resp[BUFSIZ];
                     40: 
                     41: char   *sprintf();
                     42: long   lseek();
                     43: 
                     44: FILE   *debug;
                     45: #define        DEBUG(f)        if (debug) fprintf(debug, f)
                     46: #define        DEBUG1(f,a)     if (debug) fprintf(debug, f, a)
                     47: #define        DEBUG2(f,a1,a2) if (debug) fprintf(debug, f, a1, a2)
                     48: 
                     49: main(argc, argv)
                     50:        int argc;
                     51:        char **argv;
                     52: {
                     53:        int rval;
                     54:        char c;
                     55:        int n, i, cc;
                     56: 
                     57:        argc--, argv++;
                     58:        if (argc > 0) {
                     59:                debug = fopen(*argv, "w");
                     60:                if (debug == 0)
                     61:                        exit(1);
                     62:                (void) setbuf(debug, (char *)0);
                     63:        }
                     64: top:
                     65:        errno = 0;
                     66:        rval = 0;
                     67:        if (read(0, &c, 1) != 1)
                     68:                exit(0);
                     69:        switch (c) {
                     70: 
                     71:        case 'O':
                     72:                if (tape >= 0)
                     73:                        (void) close(tape);
                     74:                getstring(device); getstring(mode);
                     75:                DEBUG2("rmtd: O %s %s\n", device, mode);
                     76:                tape = open(device, atoi(mode));
                     77:                if (tape < 0)
                     78:                        goto ioerror;
                     79:                goto respond;
                     80: 
                     81:        case 'C':
                     82:                DEBUG("rmtd: C\n");
                     83:                getstring(device);              /* discard */
                     84:                if (close(tape) < 0)
                     85:                        goto ioerror;
                     86:                tape = -1;
                     87:                goto respond;
                     88: 
                     89:        case 'L':
                     90:                getstring(count); getstring(pos);
                     91:                DEBUG2("rmtd: L %s %s\n", count, pos);
                     92:                rval = lseek(tape, (long) atoi(count), atoi(pos));
                     93:                if (rval < 0)
                     94:                        goto ioerror;
                     95:                goto respond;
                     96: 
                     97:        case 'W':
                     98:                getstring(count);
                     99:                n = atoi(count);
                    100:                DEBUG1("rmtd: W %s\n", count);
                    101:                record = checkbuf(record, n);
                    102:                for (i = 0; i < n; i += cc) {
                    103:                        cc = read(0, &record[i], n - i);
                    104:                        if (cc <= 0) {
                    105:                                DEBUG("rmtd: premature eof\n");
                    106:                                exit(2);
                    107:                        }
                    108:                }
                    109:                rval = write(tape, record, n);
                    110:                if (rval < 0)
                    111:                        goto ioerror;
                    112:                goto respond;
                    113: 
                    114:        case 'R':
                    115:                getstring(count);
                    116:                DEBUG1("rmtd: R %s\n", count);
                    117:                n = atoi(count);
                    118:                record = checkbuf(record, n);
                    119:                rval = read(tape, record, n);
                    120:                if (rval < 0)
                    121:                        goto ioerror;
                    122:                (void) sprintf(resp, "A%d\n", rval);
                    123:                (void) write(1, resp, strlen(resp));
                    124:                (void) write(1, record, rval);
                    125:                goto top;
                    126: 
                    127:        case 'I':
                    128:                getstring(op); getstring(count);
                    129:                DEBUG2("rmtd: I %s %s\n", op, count);
                    130:                { struct mtop mtop;
                    131:                  mtop.mt_op = atoi(op);
                    132:                  mtop.mt_count = atoi(count);
                    133:                  if (ioctl(tape, MTIOCTOP, (char *)&mtop) < 0)
                    134:                        goto ioerror;
                    135:                  rval = mtop.mt_count;
                    136:                }
                    137:                goto respond;
                    138: 
                    139:        case 'S':               /* status */
                    140:                DEBUG("rmtd: S\n");
                    141:                { struct mtget mtget;
                    142:                  if (ioctl(tape, MTIOCGET, (char *)&mtget) < 0)
                    143:                        goto ioerror;
                    144:                  rval = sizeof (mtget);
                    145:                  (void) sprintf(resp, "A%d\n", rval);
                    146:                  (void) write(1, resp, strlen(resp));
                    147:                  (void) write(1, (char *)&mtget, sizeof (mtget));
                    148:                  goto top;
                    149:                }
                    150: 
                    151:        default:
                    152:                DEBUG1("rmtd: garbage command %c\n", c);
                    153:                exit(3);
                    154:        }
                    155: respond:
                    156:        DEBUG1("rmtd: A %d\n", rval);
                    157:        (void) sprintf(resp, "A%d\n", rval);
                    158:        (void) write(1, resp, strlen(resp));
                    159:        goto top;
                    160: ioerror:
                    161:        error(errno);
                    162:        goto top;
                    163: }
                    164: 
                    165: getstring(bp)
                    166:        char *bp;
                    167: {
                    168:        int i;
                    169:        char *cp = bp;
                    170: 
                    171:        for (i = 0; i < SSIZE; i++) {
                    172:                if (read(0, cp+i, 1) != 1)
                    173:                        exit(0);
                    174:                if (cp[i] == '\n')
                    175:                        break;
                    176:        }
                    177:        cp[i] = '\0';
                    178: }
                    179: 
                    180: char *
                    181: checkbuf(record, size)
                    182:        char *record;
                    183:        int size;
                    184: {
                    185:        extern char *malloc();
                    186: 
                    187:        if (size <= maxrecsize)
                    188:                return (record);
                    189:        if (record != 0)
                    190:                free(record);
                    191:        record = malloc(size);
                    192:        if (record == 0) {
                    193:                DEBUG("rmtd: cannot allocate buffer space\n");
                    194:                exit(4);
                    195:        }
                    196:        maxrecsize = size;
                    197:        while (size > 1024 &&
                    198:               setsockopt(0, SOL_SOCKET, SO_RCVBUF, &size, sizeof (size)) < 0)
                    199:                size -= 1024;
                    200:        return (record);
                    201: }
                    202: 
                    203: error(num)
                    204:        int num;
                    205: {
                    206: 
                    207:        DEBUG2("rmtd: E %d (%s)\n", num, sys_errlist[num]);
                    208:        (void) sprintf(resp, "E%d\n%s\n", num, sys_errlist[num]);
                    209:        (void) write(1, resp, strlen (resp));
                    210: }

unix.superglobalmegacorp.com

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