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