1*6884Ssam static char *sccsid = "@(#)dumprmt.c 1.2 (Berkeley) 05/20/82"; 26645Ssam 3*6884Ssam #include <stdio.h> 4*6884Ssam #include <sys/param.h> 56645Ssam #include <sys/mtio.h> 66645Ssam #include <sys/ioctl.h> 76645Ssam #include <net/in.h> 86645Ssam 96645Ssam #define TS_CLOSED 0 106645Ssam #define TS_OPEN 1 116645Ssam 126645Ssam static int rmtstate = TS_CLOSED; 136645Ssam int rmtape; 146645Ssam int rmtconnaborted(); 156645Ssam char *rmtpeer; 166645Ssam 176645Ssam rmthost(host) 186645Ssam char *host; 196645Ssam { 206645Ssam 216645Ssam rmtpeer = host; 226645Ssam sigset(SIGPIPE, rmtconnaborted); 236645Ssam rmtgetconn(); 246645Ssam if (rmtape < 0) 25*6884Ssam exit(1); 266645Ssam } 276645Ssam 286645Ssam rmtconnaborted() 296645Ssam { 306645Ssam 31*6884Ssam fprintf(stderr, "Lost connection to remote host.\n"); 32*6884Ssam exit(1); 336645Ssam } 346645Ssam 356645Ssam rmtgetconn() 366645Ssam { 376645Ssam 386645Ssam rmtape = rcmd(&rmtpeer, IPPORT_CMDSERVER, 396645Ssam "root", "root", "/etc/rmt", 0); 406645Ssam } 416645Ssam 426645Ssam rmtopen(tape, mode) 436645Ssam char *tape; 446645Ssam int mode; 456645Ssam { 466645Ssam char buf[256]; 476645Ssam 486645Ssam sprintf(buf, "O%s\n%d\n", tape, mode); 496645Ssam rmtcall(tape, buf); 506645Ssam rmtstate = TS_OPEN; 516645Ssam } 526645Ssam 536645Ssam rmtclose() 546645Ssam { 556645Ssam 566645Ssam if (rmtstate != TS_OPEN) 576645Ssam return; 586645Ssam rmtcall("close", "C\n"); 596645Ssam rmtstate = TS_CLOSED; 606645Ssam } 616645Ssam 626645Ssam rmtread(buf, count) 636645Ssam char *buf; 646645Ssam int count; 656645Ssam { 666645Ssam char line[30]; 676645Ssam int n, i, cc; 68*6884Ssam extern errno; 696645Ssam 706645Ssam sprintf(line, "R%d\n", count); 716645Ssam n = rmtcall("read", line); 72*6884Ssam if (n < 0) { 73*6884Ssam errno = n; 746645Ssam return (-1); 75*6884Ssam } 766645Ssam for (i = 0; i < n; i += cc) { 776645Ssam cc = read(rmtape, buf+i, n - i); 78*6884Ssam if (cc <= 0) { 796645Ssam rmtconnaborted(); 80*6884Ssam } 816645Ssam } 826645Ssam return (n); 836645Ssam } 846645Ssam 856645Ssam rmtwrite(buf, count) 866645Ssam char *buf; 876645Ssam int count; 886645Ssam { 896645Ssam char line[30]; 906645Ssam 916645Ssam sprintf(line, "W%d\n", count); 926645Ssam write(rmtape, line, strlen(line)); 936645Ssam write(rmtape, buf, count); 946645Ssam return (rmtreply("write")); 956645Ssam } 966645Ssam 976645Ssam rmtwrite0(count) 986645Ssam int count; 996645Ssam { 1006645Ssam char line[30]; 1016645Ssam 1026645Ssam sprintf(line, "W%d\n", count); 1036645Ssam write(rmtape, line, strlen(line)); 1046645Ssam } 1056645Ssam 1066645Ssam rmtwrite1(buf, count) 1076645Ssam char *buf; 1086645Ssam int count; 1096645Ssam { 1106645Ssam 1116645Ssam write(rmtape, buf, count); 1126645Ssam } 1136645Ssam 1146645Ssam rmtwrite2() 1156645Ssam { 1166645Ssam int i; 1176645Ssam 1186645Ssam return (rmtreply("write")); 1196645Ssam } 1206645Ssam 1216645Ssam rmtseek(offset, pos) 1226645Ssam int offset, pos; 1236645Ssam { 1246645Ssam char line[80]; 1256645Ssam 1266645Ssam sprintf(line, "L%d\n%d\n", offset, pos); 1276645Ssam return (rmtcall("seek", line)); 1286645Ssam } 1296645Ssam 1306645Ssam struct mtget mts; 1316645Ssam 1326645Ssam struct mtget * 1336645Ssam rmtstatus() 1346645Ssam { 1356645Ssam register int i; 1366645Ssam register char *cp; 1376645Ssam 1386645Ssam if (rmtstate != TS_OPEN) 1396645Ssam return (0); 1406645Ssam rmtcall("status", "S\n"); 1416645Ssam for (i = 0, cp = (char *)&mts; i < sizeof(mts); i++) 1426645Ssam *cp++ = rmtgetb(); 1436645Ssam return (&mts); 1446645Ssam } 1456645Ssam 1466645Ssam rmtioctl(cmd, count) 1476645Ssam int cmd, count; 1486645Ssam { 1496645Ssam char buf[256]; 1506645Ssam 1516645Ssam if (count < 0) 1526645Ssam return (-1); 1536645Ssam sprintf(buf, "I%d\n%d\n", cmd, count); 1546645Ssam rmtcall("ioctl", buf); 1556645Ssam } 1566645Ssam 1576645Ssam rmtcall(cmd, buf) 1586645Ssam char *cmd, *buf; 1596645Ssam { 1606645Ssam 1616645Ssam if (write(rmtape, buf, strlen(buf)) != strlen(buf)) 1626645Ssam rmtconnaborted(); 1636645Ssam return (rmtreply(cmd)); 1646645Ssam } 1656645Ssam 1666645Ssam rmtreply(cmd) 1676645Ssam char *cmd; 1686645Ssam { 1696645Ssam register int c; 1706645Ssam char code[30], emsg[BUFSIZ]; 1716645Ssam 1726645Ssam rmtgets(code, sizeof (code)); 1736645Ssam if (*code == 'E' || *code == 'F') { 1746645Ssam rmtgets(emsg, sizeof (emsg)); 1756645Ssam msg("%s: %s\n", cmd, emsg, code + 1); 1766645Ssam if (*code == 'F') { 1776645Ssam rmtstate = TS_CLOSED; 1786645Ssam return (-1); 1796645Ssam } 1806645Ssam return (-1); 1816645Ssam } 1826645Ssam if (*code != 'A') { 1836645Ssam msg("Protocol to remote tape server botched (code %s?).\n", 1846645Ssam code); 1856645Ssam rmtconnaborted(); 1866645Ssam } 1876645Ssam return (atoi(code + 1)); 1886645Ssam } 1896645Ssam 1906645Ssam rmtgetb() 1916645Ssam { 1926645Ssam char c; 1936645Ssam 1946645Ssam if (read(rmtape, &c, 1) != 1) 1956645Ssam rmtconnaborted(); 1966645Ssam return (c); 1976645Ssam } 1986645Ssam 1996645Ssam rmtgets(cp, len) 2006645Ssam char *cp; 2016645Ssam int len; 2026645Ssam { 2036645Ssam 2046645Ssam while (len > 1) { 2056645Ssam *cp = rmtgetb(); 2066645Ssam if (*cp == '\n') { 2076645Ssam cp[1] = 0; 2086645Ssam return; 2096645Ssam } 2106645Ssam cp++; 2116645Ssam len--; 2126645Ssam } 2136645Ssam msg("Protocol to remote tape server botched (in rmtgets).\n"); 2146645Ssam rmtconnaborted(); 2156645Ssam } 216*6884Ssam 217*6884Ssam msg(cp, a1, a2, a3) 218*6884Ssam char *cp; 219*6884Ssam { 220*6884Ssam 221*6884Ssam fprintf(stderr, cp, a1, a2, a3); 222*6884Ssam } 223