xref: /csrg-svn/old/cpnull/cpnull.c (revision 6036)
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