|
|
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: #include <pwd.h> ! 12: ! 13: #define TS_CLOSED 0 ! 14: #define TS_OPEN 1 ! 15: ! 16: static int rmtstate = TS_CLOSED; ! 17: int rmtape; ! 18: int rmtconnaborted(); ! 19: char *rmtpeer; ! 20: struct passwd *getpwuid(); ! 21: ! 22: /*--------------------------------------------------------------------- ! 23: * Changes to this file: ! 24: * ! 25: * 08/15/85 - Add rmtcreat to implement remote tape dev creation. ! 26: * - Get user's name instead of assuming that he is root. ! 27: * This modification is neccessary when this program is ! 28: * used by rtar. (Peter Pham) ! 29: *--------------------------------------------------------------------*/ ! 30: ! 31: rmthost(host) ! 32: char *host; ! 33: { ! 34: ! 35: rmtpeer = host; ! 36: signal(SIGPIPE, rmtconnaborted); ! 37: rmtgetconn(); ! 38: if (rmtape < 0) ! 39: exit(1); ! 40: } ! 41: ! 42: rmtconnaborted() ! 43: { ! 44: ! 45: fprintf(stderr, "Lost connection to remote host.\n"); ! 46: exit(1); ! 47: } ! 48: ! 49: rmtgetconn() ! 50: { ! 51: static struct servent *sp = 0; ! 52: struct passwd *pwd; ! 53: ! 54: if (sp == 0) { ! 55: sp = getservbyname("shell", "tcp"); ! 56: if (sp == 0) { ! 57: fprintf(stderr, "rdump: shell/tcp: unknown service\n"); ! 58: exit(1); ! 59: } ! 60: } ! 61: pwd = (struct passwd *)getpwuid(getuid()); ! 62: if (pwd == 0) { ! 63: fprintf(stderr, "Who are you?\n"); ! 64: exit(1); ! 65: } ! 66: rmtape = rcmd(&rmtpeer, sp->s_port, pwd->pw_name, ! 67: pwd->pw_name, "/etc/rmt", 0); ! 68: } ! 69: ! 70: rmtopen(tape, mode) ! 71: char *tape; ! 72: int mode; ! 73: { ! 74: char buf[256]; ! 75: ! 76: sprintf(buf, "O%s\n%d\n", tape, mode); ! 77: rmtcall(tape, buf); ! 78: rmtstate = TS_OPEN; ! 79: } ! 80: ! 81: rmtclose() ! 82: { ! 83: ! 84: if (rmtstate != TS_OPEN) ! 85: return; ! 86: rmtcall("close", "C\n"); ! 87: rmtstate = TS_CLOSED; ! 88: } ! 89: ! 90: rmtcreat(tape, mode) ! 91: char *tape; ! 92: int mode; ! 93: { ! 94: char buf[256]; ! 95: ! 96: sprintf(buf, "N%s\n%d\n", tape, mode); ! 97: rmtcall(tape, buf); ! 98: rmtstate = TS_OPEN; ! 99: } ! 100: ! 101: rmtread(buf, count) ! 102: char *buf; ! 103: int count; ! 104: { ! 105: char line[30]; ! 106: int n, i, cc; ! 107: extern errno; ! 108: ! 109: sprintf(line, "R%d\n", count); ! 110: n = rmtcall("read", line); ! 111: if (n < 0) { ! 112: errno = n; ! 113: return (-1); ! 114: } ! 115: for (i = 0; i < n; i += cc) { ! 116: cc = read(rmtape, buf+i, n - i); ! 117: if (cc <= 0) { ! 118: rmtconnaborted(); ! 119: } ! 120: } ! 121: return (n); ! 122: } ! 123: ! 124: rmtwrite(buf, count) ! 125: char *buf; ! 126: int count; ! 127: { ! 128: char line[30]; ! 129: ! 130: sprintf(line, "W%d\n", count); ! 131: write(rmtape, line, strlen(line)); ! 132: write(rmtape, buf, count); ! 133: return (rmtreply("write")); ! 134: } ! 135: ! 136: rmtwrite0(count) ! 137: int count; ! 138: { ! 139: char line[30]; ! 140: ! 141: sprintf(line, "W%d\n", count); ! 142: write(rmtape, line, strlen(line)); ! 143: } ! 144: ! 145: rmtwrite1(buf, count) ! 146: char *buf; ! 147: int count; ! 148: { ! 149: ! 150: write(rmtape, buf, count); ! 151: } ! 152: ! 153: rmtwrite2() ! 154: { ! 155: int i; ! 156: ! 157: return (rmtreply("write")); ! 158: } ! 159: ! 160: rmtseek(offset, pos) ! 161: int offset, pos; ! 162: { ! 163: char line[80]; ! 164: ! 165: sprintf(line, "L%d\n%d\n", offset, pos); ! 166: return (rmtcall("seek", line)); ! 167: } ! 168: ! 169: struct mtget mts; ! 170: ! 171: struct mtget * ! 172: rmtstatus() ! 173: { ! 174: register int i; ! 175: register char *cp; ! 176: ! 177: if (rmtstate != TS_OPEN) ! 178: return (0); ! 179: if (rmtcall("status", "S\n") < 0) ! 180: return (0); ! 181: for (i = 0, cp = (char *)&mts; i < sizeof(mts); i++) ! 182: *cp++ = rmtgetb(); ! 183: return (&mts); ! 184: } ! 185: ! 186: rmtioctl(cmd, count) ! 187: int cmd, count; ! 188: { ! 189: char buf[256]; ! 190: ! 191: if (count < 0) ! 192: return (-1); ! 193: sprintf(buf, "I%d\n%d\n", cmd, count); ! 194: return (rmtcall("ioctl", buf)); ! 195: } ! 196: ! 197: rmtcall(cmd, buf) ! 198: char *cmd, *buf; ! 199: { ! 200: if (write(rmtape, buf, strlen(buf)) != strlen(buf)) ! 201: rmtconnaborted(); ! 202: return (rmtreply(cmd)); ! 203: } ! 204: ! 205: rmtreply(cmd) ! 206: char *cmd; ! 207: { ! 208: register int c; ! 209: char code[30], emsg[BUFSIZ]; ! 210: ! 211: rmtgets(code, sizeof (code)); ! 212: if (*code == 'E' || *code == 'F') { ! 213: rmtgets(emsg, sizeof (emsg)); ! 214: msg("rmpreply: %s: %s - %d\n", cmd, emsg, atoi(code + 1)); ! 215: if (*code == 'F') { ! 216: rmtstate = TS_CLOSED; ! 217: return (-1); ! 218: } ! 219: return (-1); ! 220: } ! 221: if (*code != 'A') { ! 222: msg("Protocol to remote tape server botched (code %s?).\n", ! 223: code); ! 224: rmtconnaborted(); ! 225: } ! 226: return (atoi(code + 1)); ! 227: } ! 228: ! 229: rmtgetb() ! 230: { ! 231: char c; ! 232: ! 233: if (read(rmtape, &c, 1) != 1) ! 234: rmtconnaborted(); ! 235: return (c); ! 236: } ! 237: ! 238: rmtgets(cp, len) ! 239: char *cp; ! 240: int len; ! 241: { ! 242: ! 243: while (len > 1) { ! 244: *cp = rmtgetb(); ! 245: if (*cp == '\n') { ! 246: cp[1] = 0; ! 247: return; ! 248: } ! 249: cp++; ! 250: len--; ! 251: } ! 252: msg("Protocol to remote tape server botched (in rmtgets).\n"); ! 253: rmtconnaborted(); ! 254: } ! 255: ! 256: #ifdef RTAR ! 257: msg(cp, a1, a2, a3) ! 258: char *cp; ! 259: { ! 260: ! 261: fprintf(stderr, cp, a1, a2, a3); ! 262: } ! 263: #endif RTAR
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.