Annotation of 42BSD/etc/dump/dumprmt.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)dumprmt.c   1.6 (Berkeley) 7/1/83";
                      2: 
                      3: #include <sys/param.h>
                      4: #include <sys/mtio.h>
                      5: #include <sys/ioctl.h>
                      6: 
                      7: #include <netinet/in.h>
                      8: 
                      9: #include <stdio.h>
                     10: #include <netdb.h>
                     11: 
                     12: #define        TS_CLOSED       0
                     13: #define        TS_OPEN         1
                     14: 
                     15: static int rmtstate = TS_CLOSED;
                     16: int    rmtape;
                     17: int    rmtconnaborted();
                     18: char   *rmtpeer;
                     19: 
                     20: rmthost(host)
                     21:        char *host;
                     22: {
                     23: 
                     24:        rmtpeer = host;
                     25:        signal(SIGPIPE, rmtconnaborted);
                     26:        rmtgetconn();
                     27:        if (rmtape < 0)
                     28:                exit(1);
                     29: }
                     30: 
                     31: rmtconnaborted()
                     32: {
                     33: 
                     34:        fprintf(stderr, "Lost connection to remote host.\n");
                     35:        exit(1);
                     36: }
                     37: 
                     38: rmtgetconn()
                     39: {
                     40:        static struct servent *sp = 0;
                     41: 
                     42:        if (sp == 0) {
                     43:                sp = getservbyname("shell", "tcp");
                     44:                if (sp == 0) {
                     45:                        fprintf(stderr, "rdump: shell/tcp: unknown service\n");
                     46:                        exit(1);
                     47:                }
                     48:        }
                     49:        rmtape = rcmd(&rmtpeer, sp->s_port, "root", "root", "/etc/rmt", 0);
                     50: }
                     51: 
                     52: rmtopen(tape, mode)
                     53:        char *tape;
                     54:        int mode;
                     55: {
                     56:        char buf[256];
                     57: 
                     58:        sprintf(buf, "O%s\n%d\n", tape, mode);
                     59:        rmtcall(tape, buf);
                     60:        rmtstate = TS_OPEN;
                     61: }
                     62: 
                     63: rmtclose()
                     64: {
                     65: 
                     66:        if (rmtstate != TS_OPEN)
                     67:                return;
                     68:        rmtcall("close", "C\n");
                     69:        rmtstate = TS_CLOSED;
                     70: }
                     71: 
                     72: rmtread(buf, count)
                     73:        char *buf;
                     74:        int count;
                     75: {
                     76:        char line[30];
                     77:        int n, i, cc;
                     78:        extern errno;
                     79: 
                     80:        sprintf(line, "R%d\n", count);
                     81:        n = rmtcall("read", line);
                     82:        if (n < 0) {
                     83:                errno = n;
                     84:                return (-1);
                     85:        }
                     86:        for (i = 0; i < n; i += cc) {
                     87:                cc = read(rmtape, buf+i, n - i);
                     88:                if (cc <= 0) {
                     89:                        rmtconnaborted();
                     90:                }
                     91:        }
                     92:        return (n);
                     93: }
                     94: 
                     95: rmtwrite(buf, count)
                     96:        char *buf;
                     97:        int count;
                     98: {
                     99:        char line[30];
                    100: 
                    101:        sprintf(line, "W%d\n", count);
                    102:        write(rmtape, line, strlen(line));
                    103:        write(rmtape, buf, count);
                    104:        return (rmtreply("write"));
                    105: }
                    106: 
                    107: rmtwrite0(count)
                    108:        int count;
                    109: {
                    110:        char line[30];
                    111: 
                    112:        sprintf(line, "W%d\n", count);
                    113:        write(rmtape, line, strlen(line));
                    114: }
                    115: 
                    116: rmtwrite1(buf, count)
                    117:        char *buf;
                    118:        int count;
                    119: {
                    120: 
                    121:        write(rmtape, buf, count);
                    122: }
                    123: 
                    124: rmtwrite2()
                    125: {
                    126:        int i;
                    127: 
                    128:        return (rmtreply("write"));
                    129: }
                    130: 
                    131: rmtseek(offset, pos)
                    132:        int offset, pos;
                    133: {
                    134:        char line[80];
                    135: 
                    136:        sprintf(line, "L%d\n%d\n", offset, pos);
                    137:        return (rmtcall("seek", line));
                    138: }
                    139: 
                    140: struct mtget mts;
                    141: 
                    142: struct mtget *
                    143: rmtstatus()
                    144: {
                    145:        register int i;
                    146:        register char *cp;
                    147: 
                    148:        if (rmtstate != TS_OPEN)
                    149:                return (0);
                    150:        rmtcall("status", "S\n");
                    151:        for (i = 0, cp = (char *)&mts; i < sizeof(mts); i++)
                    152:                *cp++ = rmtgetb();
                    153:        return (&mts);
                    154: }
                    155: 
                    156: rmtioctl(cmd, count)
                    157:        int cmd, count;
                    158: {
                    159:        char buf[256];
                    160: 
                    161:        if (count < 0)
                    162:                return (-1);
                    163:        sprintf(buf, "I%d\n%d\n", cmd, count);
                    164:        return (rmtcall("ioctl", buf));
                    165: }
                    166: 
                    167: rmtcall(cmd, buf)
                    168:        char *cmd, *buf;
                    169: {
                    170: 
                    171:        if (write(rmtape, buf, strlen(buf)) != strlen(buf))
                    172:                rmtconnaborted();
                    173:        return (rmtreply(cmd));
                    174: }
                    175: 
                    176: rmtreply(cmd)
                    177:        char *cmd;
                    178: {
                    179:        register int c;
                    180:        char code[30], emsg[BUFSIZ];
                    181: 
                    182:        rmtgets(code, sizeof (code));
                    183:        if (*code == 'E' || *code == 'F') {
                    184:                rmtgets(emsg, sizeof (emsg));
                    185:                msg("%s: %s\n", cmd, emsg, code + 1);
                    186:                if (*code == 'F') {
                    187:                        rmtstate = TS_CLOSED;
                    188:                        return (-1);
                    189:                }
                    190:                return (-1);
                    191:        }
                    192:        if (*code != 'A') {
                    193:                msg("Protocol to remote tape server botched (code %s?).\n",
                    194:                    code);
                    195:                rmtconnaborted();
                    196:        }
                    197:        return (atoi(code + 1));
                    198: }
                    199: 
                    200: rmtgetb()
                    201: {
                    202:        char c;
                    203: 
                    204:        if (read(rmtape, &c, 1) != 1)
                    205:                rmtconnaborted();
                    206:        return (c);
                    207: }
                    208: 
                    209: rmtgets(cp, len)
                    210:        char *cp;
                    211:        int len;
                    212: {
                    213: 
                    214:        while (len > 1) {
                    215:                *cp = rmtgetb();
                    216:                if (*cp == '\n') {
                    217:                        cp[1] = 0;
                    218:                        return;
                    219:                }
                    220:                cp++;
                    221:                len--;
                    222:        }
                    223:        msg("Protocol to remote tape server botched (in rmtgets).\n");
                    224:        rmtconnaborted();
                    225: }

unix.superglobalmegacorp.com

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