1*16376Skarels static char *sccsid = "@(#)dumprmt.c 1.7 (Berkeley) 04/12/84"; 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> 10*16376Skarels #include <pwd.h> 119306Ssam #include <netdb.h> 129306Ssam 136645Ssam #define TS_CLOSED 0 146645Ssam #define TS_OPEN 1 156645Ssam 166645Ssam static int rmtstate = TS_CLOSED; 176645Ssam int rmtape; 186645Ssam int rmtconnaborted(); 196645Ssam char *rmtpeer; 206645Ssam 216645Ssam rmthost(host) 226645Ssam char *host; 236645Ssam { 246645Ssam 256645Ssam rmtpeer = host; 2613032Ssam signal(SIGPIPE, rmtconnaborted); 276645Ssam rmtgetconn(); 286645Ssam if (rmtape < 0) 296884Ssam exit(1); 306645Ssam } 316645Ssam 326645Ssam rmtconnaborted() 336645Ssam { 346645Ssam 356884Ssam fprintf(stderr, "Lost connection to remote host.\n"); 366884Ssam exit(1); 376645Ssam } 386645Ssam 396645Ssam rmtgetconn() 406645Ssam { 419306Ssam static struct servent *sp = 0; 42*16376Skarels struct passwd *pw; 43*16376Skarels char *name = "root"; 446645Ssam 459306Ssam if (sp == 0) { 469306Ssam sp = getservbyname("shell", "tcp"); 479306Ssam if (sp == 0) { 489306Ssam fprintf(stderr, "rdump: shell/tcp: unknown service\n"); 499306Ssam exit(1); 509306Ssam } 519306Ssam } 52*16376Skarels pw = getpwuid(getuid()); 53*16376Skarels if (pw && pw->pw_name) 54*16376Skarels name = pw->pw_name; 55*16376Skarels rmtape = rcmd(&rmtpeer, sp->s_port, name, name, "/etc/rmt", 0); 566645Ssam } 576645Ssam 586645Ssam rmtopen(tape, mode) 596645Ssam char *tape; 606645Ssam int mode; 616645Ssam { 626645Ssam char buf[256]; 636645Ssam 646645Ssam sprintf(buf, "O%s\n%d\n", tape, mode); 656645Ssam rmtcall(tape, buf); 666645Ssam rmtstate = TS_OPEN; 676645Ssam } 686645Ssam 696645Ssam rmtclose() 706645Ssam { 716645Ssam 726645Ssam if (rmtstate != TS_OPEN) 736645Ssam return; 746645Ssam rmtcall("close", "C\n"); 756645Ssam rmtstate = TS_CLOSED; 766645Ssam } 776645Ssam 786645Ssam rmtread(buf, count) 796645Ssam char *buf; 806645Ssam int count; 816645Ssam { 826645Ssam char line[30]; 836645Ssam int n, i, cc; 846884Ssam extern errno; 856645Ssam 866645Ssam sprintf(line, "R%d\n", count); 876645Ssam n = rmtcall("read", line); 886884Ssam if (n < 0) { 896884Ssam errno = n; 906645Ssam return (-1); 916884Ssam } 926645Ssam for (i = 0; i < n; i += cc) { 936645Ssam cc = read(rmtape, buf+i, n - i); 946884Ssam if (cc <= 0) { 956645Ssam rmtconnaborted(); 966884Ssam } 976645Ssam } 986645Ssam return (n); 996645Ssam } 1006645Ssam 1016645Ssam rmtwrite(buf, count) 1026645Ssam char *buf; 1036645Ssam int count; 1046645Ssam { 1056645Ssam char line[30]; 1066645Ssam 1076645Ssam sprintf(line, "W%d\n", count); 1086645Ssam write(rmtape, line, strlen(line)); 1096645Ssam write(rmtape, buf, count); 1106645Ssam return (rmtreply("write")); 1116645Ssam } 1126645Ssam 1136645Ssam rmtwrite0(count) 1146645Ssam int count; 1156645Ssam { 1166645Ssam char line[30]; 1176645Ssam 1186645Ssam sprintf(line, "W%d\n", count); 1196645Ssam write(rmtape, line, strlen(line)); 1206645Ssam } 1216645Ssam 1226645Ssam rmtwrite1(buf, count) 1236645Ssam char *buf; 1246645Ssam int count; 1256645Ssam { 1266645Ssam 1276645Ssam write(rmtape, buf, count); 1286645Ssam } 1296645Ssam 1306645Ssam rmtwrite2() 1316645Ssam { 1326645Ssam int i; 1336645Ssam 1346645Ssam return (rmtreply("write")); 1356645Ssam } 1366645Ssam 1376645Ssam rmtseek(offset, pos) 1386645Ssam int offset, pos; 1396645Ssam { 1406645Ssam char line[80]; 1416645Ssam 1426645Ssam sprintf(line, "L%d\n%d\n", offset, pos); 1436645Ssam return (rmtcall("seek", line)); 1446645Ssam } 1456645Ssam 1466645Ssam struct mtget mts; 1476645Ssam 1486645Ssam struct mtget * 1496645Ssam rmtstatus() 1506645Ssam { 1516645Ssam register int i; 1526645Ssam register char *cp; 1536645Ssam 1546645Ssam if (rmtstate != TS_OPEN) 1556645Ssam return (0); 1566645Ssam rmtcall("status", "S\n"); 1576645Ssam for (i = 0, cp = (char *)&mts; i < sizeof(mts); i++) 1586645Ssam *cp++ = rmtgetb(); 1596645Ssam return (&mts); 1606645Ssam } 1616645Ssam 1626645Ssam rmtioctl(cmd, count) 1636645Ssam int cmd, count; 1646645Ssam { 1656645Ssam char buf[256]; 1666645Ssam 1676645Ssam if (count < 0) 1686645Ssam return (-1); 1696645Ssam sprintf(buf, "I%d\n%d\n", cmd, count); 17013545Ssam return (rmtcall("ioctl", buf)); 1716645Ssam } 1726645Ssam 1736645Ssam rmtcall(cmd, buf) 1746645Ssam char *cmd, *buf; 1756645Ssam { 1766645Ssam 1776645Ssam if (write(rmtape, buf, strlen(buf)) != strlen(buf)) 1786645Ssam rmtconnaborted(); 1796645Ssam return (rmtreply(cmd)); 1806645Ssam } 1816645Ssam 1826645Ssam rmtreply(cmd) 1836645Ssam char *cmd; 1846645Ssam { 1856645Ssam register int c; 1866645Ssam char code[30], emsg[BUFSIZ]; 1876645Ssam 1886645Ssam rmtgets(code, sizeof (code)); 1896645Ssam if (*code == 'E' || *code == 'F') { 1906645Ssam rmtgets(emsg, sizeof (emsg)); 1916645Ssam msg("%s: %s\n", cmd, emsg, code + 1); 1926645Ssam if (*code == 'F') { 1936645Ssam rmtstate = TS_CLOSED; 1946645Ssam return (-1); 1956645Ssam } 1966645Ssam return (-1); 1976645Ssam } 1986645Ssam if (*code != 'A') { 1996645Ssam msg("Protocol to remote tape server botched (code %s?).\n", 2006645Ssam code); 2016645Ssam rmtconnaborted(); 2026645Ssam } 2036645Ssam return (atoi(code + 1)); 2046645Ssam } 2056645Ssam 2066645Ssam rmtgetb() 2076645Ssam { 2086645Ssam char c; 2096645Ssam 2106645Ssam if (read(rmtape, &c, 1) != 1) 2116645Ssam rmtconnaborted(); 2126645Ssam return (c); 2136645Ssam } 2146645Ssam 2156645Ssam rmtgets(cp, len) 2166645Ssam char *cp; 2176645Ssam int len; 2186645Ssam { 2196645Ssam 2206645Ssam while (len > 1) { 2216645Ssam *cp = rmtgetb(); 2226645Ssam if (*cp == '\n') { 2236645Ssam cp[1] = 0; 2246645Ssam return; 2256645Ssam } 2266645Ssam cp++; 2276645Ssam len--; 2286645Ssam } 2296645Ssam msg("Protocol to remote tape server botched (in rmtgets).\n"); 2306645Ssam rmtconnaborted(); 2316645Ssam } 232