xref: /csrg-svn/usr.bin/uucp/uucico/gio.c (revision 13652)
1*13652Ssam #ifndef lint
2*13652Ssam static char sccsid[] = "@(#)gio.c	5.1 (Berkeley) 07/02/83";
3*13652Ssam #endif
4*13652Ssam 
5*13652Ssam #define USER 1
6*13652Ssam #include "pk.p"
7*13652Ssam #include <sys/types.h>
8*13652Ssam #include "pk.h"
9*13652Ssam #include <setjmp.h>
10*13652Ssam #include "uucp.h"
11*13652Ssam 
12*13652Ssam extern	time_t	time();
13*13652Ssam 
14*13652Ssam 
15*13652Ssam jmp_buf Failbuf;
16*13652Ssam 
17*13652Ssam struct pack *Pk;
18*13652Ssam 
19*13652Ssam pkfail()
20*13652Ssam {
21*13652Ssam 	longjmp(Failbuf, 1);
22*13652Ssam }
23*13652Ssam 
24*13652Ssam gturnon()
25*13652Ssam {
26*13652Ssam 	int ret;
27*13652Ssam 	struct pack *pkopen();
28*13652Ssam 	if (setjmp(Failbuf))
29*13652Ssam 		return(FAIL);
30*13652Ssam 	if (Pkdrvon) {
31*13652Ssam 		ret = pkon(Ofn, PACKSIZE);
32*13652Ssam 		DEBUG(4, "pkon - %d ", ret);
33*13652Ssam 		DEBUG(4, "Ofn - %d\n", Ofn);
34*13652Ssam 		if (ret <= 0)
35*13652Ssam 			return(FAIL);
36*13652Ssam 	}
37*13652Ssam 	else {
38*13652Ssam 		if (Debug > 4)
39*13652Ssam 			pkdebug = 1;
40*13652Ssam 		Pk = pkopen(Ifn, Ofn);
41*13652Ssam 		if ((int) Pk == NULL)
42*13652Ssam 			return(FAIL);
43*13652Ssam 	}
44*13652Ssam 	return(0);
45*13652Ssam }
46*13652Ssam 
47*13652Ssam 
48*13652Ssam gturnoff()
49*13652Ssam {
50*13652Ssam 	if(setjmp(Failbuf))
51*13652Ssam 		return(FAIL);
52*13652Ssam 	if (Pkdrvon)
53*13652Ssam 		pkoff(Ofn);
54*13652Ssam 	else
55*13652Ssam 		pkclose(Pk);
56*13652Ssam 	return(0);
57*13652Ssam }
58*13652Ssam 
59*13652Ssam 
60*13652Ssam gwrmsg(type, str, fn)
61*13652Ssam char type;
62*13652Ssam register char *str;
63*13652Ssam {
64*13652Ssam 	char bufr[BUFSIZ];
65*13652Ssam 	register char *s;
66*13652Ssam 	int len, i;
67*13652Ssam 
68*13652Ssam 	if(setjmp(Failbuf))
69*13652Ssam 		return(FAIL);
70*13652Ssam 	bufr[0] = type;
71*13652Ssam 	s = &bufr[1];
72*13652Ssam 	while (*str)
73*13652Ssam 		*s++ = *str++;
74*13652Ssam 	*s = '\0';
75*13652Ssam 	if (*(--s) == '\n')
76*13652Ssam 		*s = '\0';
77*13652Ssam 	len = strlen(bufr) + 1;
78*13652Ssam 	if ((i = len % PACKSIZE)) {
79*13652Ssam 		len = len + PACKSIZE - i;
80*13652Ssam 		bufr[len - 1] = '\0';
81*13652Ssam 	}
82*13652Ssam 	gwrblk(bufr, len, fn);
83*13652Ssam 	return(0);
84*13652Ssam }
85*13652Ssam 
86*13652Ssam 
87*13652Ssam grdmsg(str, fn)
88*13652Ssam register char *str;
89*13652Ssam {
90*13652Ssam 	unsigned len;
91*13652Ssam 
92*13652Ssam 	if(setjmp(Failbuf))
93*13652Ssam 		return(FAIL);
94*13652Ssam 	for (;;) {
95*13652Ssam 		if (Pkdrvon)
96*13652Ssam 			len = read(fn, str, PACKSIZE);
97*13652Ssam 		else
98*13652Ssam 			len = pkread(Pk, str, PACKSIZE);
99*13652Ssam 		if (len == 0)
100*13652Ssam 			continue;
101*13652Ssam 		str += len;
102*13652Ssam 		if (*(str - 1) == '\0')
103*13652Ssam 			break;
104*13652Ssam 	}
105*13652Ssam 	return(0);
106*13652Ssam }
107*13652Ssam 
108*13652Ssam 
109*13652Ssam gwrdata(fp1, fn)
110*13652Ssam FILE *fp1;
111*13652Ssam {
112*13652Ssam 	char bufr[BUFSIZ];
113*13652Ssam 	register int len;
114*13652Ssam 	int ret;
115*13652Ssam 	time_t t1, t2;
116*13652Ssam 	long bytes;
117*13652Ssam 	char text[BUFSIZ];
118*13652Ssam 
119*13652Ssam 	if(setjmp(Failbuf))
120*13652Ssam 		return(FAIL);
121*13652Ssam 	bytes = 0L;
122*13652Ssam 	time(&t1);
123*13652Ssam 	while ((len = fread(bufr, sizeof (char), BUFSIZ, fp1)) > 0) {
124*13652Ssam 		bytes += len;
125*13652Ssam 		ret = gwrblk(bufr, len, fn);
126*13652Ssam 		if (ret != len) {
127*13652Ssam 			return(FAIL);
128*13652Ssam 		}
129*13652Ssam 		if (len != BUFSIZ)
130*13652Ssam 			break;
131*13652Ssam 	}
132*13652Ssam 	ret = gwrblk(bufr, 0, fn);
133*13652Ssam 	time(&t2);
134*13652Ssam 	sprintf(text, "sent data %ld bytes %ld secs", bytes, t2 - t1);
135*13652Ssam 	DEBUG(1, "%s\n", text);
136*13652Ssam 	syslog(text);
137*13652Ssam 	sysacct(bytes, t2 - t1);
138*13652Ssam 	return(0);
139*13652Ssam }
140*13652Ssam 
141*13652Ssam 
142*13652Ssam grddata(fn, fp2)
143*13652Ssam FILE *fp2;
144*13652Ssam {
145*13652Ssam 	register int len;
146*13652Ssam 	char bufr[BUFSIZ];
147*13652Ssam 	time_t t1, t2;
148*13652Ssam 	long bytes;
149*13652Ssam 	char text[BUFSIZ];
150*13652Ssam 
151*13652Ssam 	if(setjmp(Failbuf))
152*13652Ssam 		return(FAIL);
153*13652Ssam 	bytes = 0L;
154*13652Ssam 	time(&t1);
155*13652Ssam 	for (;;) {
156*13652Ssam 		len = grdblk(bufr, BUFSIZ, fn);
157*13652Ssam 		if (len < 0) {
158*13652Ssam 			return(FAIL);
159*13652Ssam 		}
160*13652Ssam 		bytes += len;
161*13652Ssam 		/* ittvax!swatt: check return value of fwrite */
162*13652Ssam 		if (fwrite(bufr, sizeof (char), len, fp2) != len)
163*13652Ssam 			return(FAIL);
164*13652Ssam 		if (len < BUFSIZ)
165*13652Ssam 			break;
166*13652Ssam 	}
167*13652Ssam 	time(&t2);
168*13652Ssam 	sprintf(text, "received data %ld bytes %ld secs", bytes, t2 - t1);
169*13652Ssam 	DEBUG(1, "%s\n", text);
170*13652Ssam 	syslog(text);
171*13652Ssam 	sysacct(bytes, t2 - t1);
172*13652Ssam 	return(0);
173*13652Ssam }
174*13652Ssam 
175*13652Ssam 
176*13652Ssam /* call ultouch every TC calls to either grdblk or gwrblk -- rti!trt */
177*13652Ssam #define	TC	20
178*13652Ssam static	int tc = TC;
179*13652Ssam 
180*13652Ssam grdblk(blk, len,  fn)
181*13652Ssam register int len;
182*13652Ssam char *blk;
183*13652Ssam {
184*13652Ssam 	register int i, ret;
185*13652Ssam 
186*13652Ssam 	/* call ultouch occasionally -- rti!trt */
187*13652Ssam 	if (--tc < 0) {
188*13652Ssam 		tc = TC;
189*13652Ssam 		ultouch();
190*13652Ssam 	}
191*13652Ssam 	for (i = 0; i < len; i += ret) {
192*13652Ssam 		if (Pkdrvon)
193*13652Ssam 			ret = read(fn, blk, len - i);
194*13652Ssam 		else
195*13652Ssam 			ret = pkread(Pk, blk, len - i);
196*13652Ssam 		if (ret < 0)
197*13652Ssam 			return(FAIL);
198*13652Ssam 		blk += ret;
199*13652Ssam 		if (ret == 0)
200*13652Ssam 			return(i);
201*13652Ssam 	}
202*13652Ssam 	return(i);
203*13652Ssam }
204*13652Ssam 
205*13652Ssam 
206*13652Ssam gwrblk(blk, len, fn)
207*13652Ssam register char *blk;
208*13652Ssam {
209*13652Ssam 	register int ret;
210*13652Ssam 
211*13652Ssam 	/* call ultouch occasionally -- rti!trt */
212*13652Ssam 	if (--tc < 0) {
213*13652Ssam 		tc = TC;
214*13652Ssam 		ultouch();
215*13652Ssam 	}
216*13652Ssam 	if (Pkdrvon)
217*13652Ssam 		ret = write(fn, blk, len);
218*13652Ssam 	else
219*13652Ssam 		ret = pkwrite(Pk, blk, len);
220*13652Ssam 	return(ret);
221*13652Ssam }
222