|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.