1*13032Ssam static char *sccsid = "@(#)dumprmt.c 1.5 (Berkeley) 06/12/83"; 26645Ssam 36884Ssam #include <sys/param.h> 46645Ssam #include <sys/mtio.h> 56645Ssam #include <sys/ioctl.h> 66645Ssam 79306Ssam #include <netinet/in.h> 89306Ssam 99306Ssam #include <stdio.h> 109306Ssam #include <netdb.h> 119306Ssam 126645Ssam #define TS_CLOSED 0 136645Ssam #define TS_OPEN 1 146645Ssam 156645Ssam static int rmtstate = TS_CLOSED; 166645Ssam int rmtape; 176645Ssam int rmtconnaborted(); 186645Ssam char *rmtpeer; 196645Ssam 206645Ssam rmthost(host) 216645Ssam char *host; 226645Ssam { 236645Ssam 246645Ssam rmtpeer = host; 25*13032Ssam signal(SIGPIPE, rmtconnaborted); 266645Ssam rmtgetconn(); 276645Ssam if (rmtape < 0) 286884Ssam exit(1); 296645Ssam } 306645Ssam 316645Ssam rmtconnaborted() 326645Ssam { 336645Ssam 346884Ssam fprintf(stderr, "Lost connection to remote host.\n"); 356884Ssam exit(1); 366645Ssam } 376645Ssam 386645Ssam rmtgetconn() 396645Ssam { 409306Ssam static struct servent *sp = 0; 416645Ssam 429306Ssam if (sp == 0) { 439306Ssam sp = getservbyname("shell", "tcp"); 449306Ssam if (sp == 0) { 459306Ssam fprintf(stderr, "rdump: shell/tcp: unknown service\n"); 469306Ssam exit(1); 479306Ssam } 489306Ssam } 499306Ssam rmtape = rcmd(&rmtpeer, sp->s_port, "root", "root", "/etc/rmt", 0); 506645Ssam } 516645Ssam 526645Ssam rmtopen(tape, mode) 536645Ssam char *tape; 546645Ssam int mode; 556645Ssam { 566645Ssam char buf[256]; 576645Ssam 586645Ssam sprintf(buf, "O%s\n%d\n", tape, mode); 596645Ssam rmtcall(tape, buf); 606645Ssam rmtstate = TS_OPEN; 616645Ssam } 626645Ssam 636645Ssam rmtclose() 646645Ssam { 656645Ssam 666645Ssam if (rmtstate != TS_OPEN) 676645Ssam return; 686645Ssam rmtcall("close", "C\n"); 696645Ssam rmtstate = TS_CLOSED; 706645Ssam } 716645Ssam 726645Ssam rmtread(buf, count) 736645Ssam char *buf; 746645Ssam int count; 756645Ssam { 766645Ssam char line[30]; 776645Ssam int n, i, cc; 786884Ssam extern errno; 796645Ssam 806645Ssam sprintf(line, "R%d\n", count); 816645Ssam n = rmtcall("read", line); 826884Ssam if (n < 0) { 836884Ssam errno = n; 846645Ssam return (-1); 856884Ssam } 866645Ssam for (i = 0; i < n; i += cc) { 876645Ssam cc = read(rmtape, buf+i, n - i); 886884Ssam if (cc <= 0) { 896645Ssam rmtconnaborted(); 906884Ssam } 916645Ssam } 926645Ssam return (n); 936645Ssam } 946645Ssam 956645Ssam rmtwrite(buf, count) 966645Ssam char *buf; 976645Ssam int count; 986645Ssam { 996645Ssam char line[30]; 1006645Ssam 1016645Ssam sprintf(line, "W%d\n", count); 1026645Ssam write(rmtape, line, strlen(line)); 1036645Ssam write(rmtape, buf, count); 1046645Ssam return (rmtreply("write")); 1056645Ssam } 1066645Ssam 1076645Ssam rmtwrite0(count) 1086645Ssam int count; 1096645Ssam { 1106645Ssam char line[30]; 1116645Ssam 1126645Ssam sprintf(line, "W%d\n", count); 1136645Ssam write(rmtape, line, strlen(line)); 1146645Ssam } 1156645Ssam 1166645Ssam rmtwrite1(buf, count) 1176645Ssam char *buf; 1186645Ssam int count; 1196645Ssam { 1206645Ssam 1216645Ssam write(rmtape, buf, count); 1226645Ssam } 1236645Ssam 1246645Ssam rmtwrite2() 1256645Ssam { 1266645Ssam int i; 1276645Ssam 1286645Ssam return (rmtreply("write")); 1296645Ssam } 1306645Ssam 1316645Ssam rmtseek(offset, pos) 1326645Ssam int offset, pos; 1336645Ssam { 1346645Ssam char line[80]; 1356645Ssam 1366645Ssam sprintf(line, "L%d\n%d\n", offset, pos); 1376645Ssam return (rmtcall("seek", line)); 1386645Ssam } 1396645Ssam 1406645Ssam struct mtget mts; 1416645Ssam 1426645Ssam struct mtget * 1436645Ssam rmtstatus() 1446645Ssam { 1456645Ssam register int i; 1466645Ssam register char *cp; 1476645Ssam 1486645Ssam if (rmtstate != TS_OPEN) 1496645Ssam return (0); 1506645Ssam rmtcall("status", "S\n"); 1516645Ssam for (i = 0, cp = (char *)&mts; i < sizeof(mts); i++) 1526645Ssam *cp++ = rmtgetb(); 1536645Ssam return (&mts); 1546645Ssam } 1556645Ssam 1566645Ssam rmtioctl(cmd, count) 1576645Ssam int cmd, count; 1586645Ssam { 1596645Ssam char buf[256]; 1606645Ssam 1616645Ssam if (count < 0) 1626645Ssam return (-1); 1636645Ssam sprintf(buf, "I%d\n%d\n", cmd, count); 1646645Ssam rmtcall("ioctl", buf); 1656645Ssam } 1666645Ssam 1676645Ssam rmtcall(cmd, buf) 1686645Ssam char *cmd, *buf; 1696645Ssam { 1706645Ssam 1716645Ssam if (write(rmtape, buf, strlen(buf)) != strlen(buf)) 1726645Ssam rmtconnaborted(); 1736645Ssam return (rmtreply(cmd)); 1746645Ssam } 1756645Ssam 1766645Ssam rmtreply(cmd) 1776645Ssam char *cmd; 1786645Ssam { 1796645Ssam register int c; 1806645Ssam char code[30], emsg[BUFSIZ]; 1816645Ssam 1826645Ssam rmtgets(code, sizeof (code)); 1836645Ssam if (*code == 'E' || *code == 'F') { 1846645Ssam rmtgets(emsg, sizeof (emsg)); 1856645Ssam msg("%s: %s\n", cmd, emsg, code + 1); 1866645Ssam if (*code == 'F') { 1876645Ssam rmtstate = TS_CLOSED; 1886645Ssam return (-1); 1896645Ssam } 1906645Ssam return (-1); 1916645Ssam } 1926645Ssam if (*code != 'A') { 1936645Ssam msg("Protocol to remote tape server botched (code %s?).\n", 1946645Ssam code); 1956645Ssam rmtconnaborted(); 1966645Ssam } 1976645Ssam return (atoi(code + 1)); 1986645Ssam } 1996645Ssam 2006645Ssam rmtgetb() 2016645Ssam { 2026645Ssam char c; 2036645Ssam 2046645Ssam if (read(rmtape, &c, 1) != 1) 2056645Ssam rmtconnaborted(); 2066645Ssam return (c); 2076645Ssam } 2086645Ssam 2096645Ssam rmtgets(cp, len) 2106645Ssam char *cp; 2116645Ssam int len; 2126645Ssam { 2136645Ssam 2146645Ssam while (len > 1) { 2156645Ssam *cp = rmtgetb(); 2166645Ssam if (*cp == '\n') { 2176645Ssam cp[1] = 0; 2186645Ssam return; 2196645Ssam } 2206645Ssam cp++; 2216645Ssam len--; 2226645Ssam } 2236645Ssam msg("Protocol to remote tape server botched (in rmtgets).\n"); 2246645Ssam rmtconnaborted(); 2256645Ssam } 226