Annotation of 42BSD/etc/dump/dumprmt.c, revision 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.