1: /* @(#)cpnull.c 4.1 82/03/05 */ 2: 3: #include <stdio.h> 4: #include <signal.h> 5: #include <sys/types.h> 6: #include <stat.h> 7: #include <wellknown.h> 8: #include <sys/ioctl.h> 9: #include <net/in.h> 10: /* 11: * cpnull machine blocks 12: */ 13: int rem; 14: char *index(), *rindex(), *malloc(); 15: int errs; 16: int broken(); 17: int lostconn(); 18: 19: int errno; 20: char sys_errlist[]; 21: int vflag; 22: 23: main(argc, argv) 24: int argc; 25: char **argv; 26: { 27: char *host, *remotedir; 28: int x, i, f; 29: char buf[BUFSIZ]; 30: int blocks; 31: time_t then, now; 32: 33: argc--, argv++; 34: if (argc > 0 && !strcmp(*argv, "-r")) 35: remote(); 36: if (argc > 0 && !strcmp(*argv, "-v")) 37: vflag++, argc--, argv++; 38: if (argc < 2) { 39: fprintf(stderr, "usage: cpnull machine blocks\n"); 40: exit(1); 41: } 42: signal(SIGPIPE, broken); 43: host = *argv++; argc--; 44: rem = rexec(&host, IPPORT_SHELLSERVER, "cpnull -r", 0, 0); 45: if (rem < 0) 46: exit(1); 47: blocks = atoi(*argv); 48: sprintf(buf, "C%d\n", blocks * BUFSIZ); 49: write(rem, buf, strlen(buf)); 50: if (response() < 0) 51: exit(1); 52: printf("sending %d blocks\n", blocks); 53: time(&then); 54: for (i = 0; i < blocks; i++) { 55: if (vflag && (i % 100 == 0)) 56: printf("%d\n", i); 57: write(rem, buf, BUFSIZ); 58: } 59: (void) response(); 60: time(&now); 61: if (then == now) 62: printf("< 1 second to transfer\n"); 63: else 64: printf("%d bytes %d seconds %d baud\n", 65: blocks * BUFSIZ, now - then, 66: (blocks * BUFSIZ * 8) / (now - then)); 67: exit(errs); 68: } 69: 70: response() 71: { 72: char resp, c, rbuf[BUFSIZ], *cp = rbuf; 73: 74: if (read(rem, &resp, 1) != 1) { 75: printf("Response read != 1\n"); 76: lostconn(); 77: } 78: switch (resp) { 79: 80: case 0: 81: return (0); 82: 83: default: 84: *cp++ = resp; 85: /* fall into... */ 86: case 1: 87: case 2: 88: do { 89: if (read(rem, &c, 1) != 1) { 90: printf("response loop != 1\n"); 91: write(2, rbuf, cp-rbuf); 92: write(2, "\n", 1); 93: lostconn(); 94: } 95: *cp++ = c; 96: } while (cp < &rbuf[BUFSIZ] && c != '\n'); 97: write(2, rbuf, cp - rbuf); 98: if (resp == 1) 99: return (-1); 100: exit(1); 101: } 102: } 103: 104: broken() 105: { 106: 107: fprintf(stderr, "SIGPIPE.\n"); 108: } 109: 110: lostconn() 111: { 112: 113: fprintf(stderr, "Lost connection.\n"); 114: exit(1); 115: } 116: 117: remote() 118: { 119: char namebuf[BUFSIZ], buf[BUFSIZ], *name, *cp, c; 120: int i, size; 121: char *whopp; 122: #define SCREWUP(str) { whopp = str; goto screwup; } 123: 124: cp = namebuf; 125: if (read(0, cp, 1) <= 0) 126: exit(0); 127: if (*cp++ == '\n') 128: SCREWUP("unexpected '\\n'"); 129: do 130: if (read(0, cp, 1) != 1) 131: exit(1); 132: while (*cp++ != '\n'); 133: *--cp = 0; 134: cp = namebuf; 135: if (*cp++ != 'C') 136: SCREWUP("expected control record"); 137: size = 0; 138: while (*cp >= '0' && *cp <= '9') 139: size = size * 10 + (*cp++ - '0'); 140: if (*cp++ != 0) 141: SCREWUP("size not delimited"); 142: write(rem, "\0", 1); 143: for (i = 0; i < size; i += BUFSIZ) { 144: int amt = BUFSIZ; 145: char *cp = buf; 146: 147: if (i + amt > size) 148: amt = size - i; 149: do { 150: int j = read(0, cp, amt); 151: 152: if (j <= 0) 153: exit(1); 154: amt -= j; 155: cp += j; 156: } while (amt > 0); 157: amt = BUFSIZ; 158: if (i + amt > size) 159: amt = size - i; 160: } 161: write(rem, "\0", 1); 162: exit(0); 163: perr: 164: sprintf(buf, "\01%s: %s\n", cp, sys_errlist[errno]); 165: write(rem, buf, strlen(buf)); 166: exit(1); 167: screwup: 168: sprintf(buf, "\02Procotol screwup: %s.\n", whopp); 169: write(rem, buf, strlen(buf)); 170: exit(1); 171: }