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