xref: /csrg-svn/usr.bin/uucp/uucico/gio.c (revision 18620)
113652Ssam #ifndef lint
2*18620Sralph static char sccsid[] = "@(#)gio.c	5.3 (Berkeley) 04/10/85";
313652Ssam #endif
413652Ssam 
5*18620Sralph #include "uucp.h"
613652Ssam #include "pk.h"
713652Ssam #include <setjmp.h>
813652Ssam 
913652Ssam extern	time_t	time();
1013652Ssam 
1113652Ssam jmp_buf Failbuf;
1213652Ssam 
1313652Ssam struct pack *Pk;
1413652Ssam 
1513652Ssam pkfail()
1613652Ssam {
1713652Ssam 	longjmp(Failbuf, 1);
1813652Ssam }
1913652Ssam 
2013652Ssam gturnon()
2113652Ssam {
2213652Ssam 	struct pack *pkopen();
2317835Sralph 
2413652Ssam 	if (setjmp(Failbuf))
2517835Sralph 		return FAIL;
2617835Sralph 	Pk = pkopen(Ifn, Ofn);
2717835Sralph 	if (Pk == NULL)
2817835Sralph 		return FAIL;
2917835Sralph 	return SUCCESS;
3013652Ssam }
3113652Ssam 
3213652Ssam gturnoff()
3313652Ssam {
3413652Ssam 	if(setjmp(Failbuf))
3513652Ssam 		return(FAIL);
3617835Sralph 	pkclose(Pk);
3717835Sralph 	return SUCCESS;
3813652Ssam }
3913652Ssam 
4013652Ssam 
4113652Ssam gwrmsg(type, str, fn)
4213652Ssam char type;
4313652Ssam register char *str;
4413652Ssam {
4513652Ssam 	char bufr[BUFSIZ];
4613652Ssam 	register char *s;
4713652Ssam 	int len, i;
4813652Ssam 
4913652Ssam 	if(setjmp(Failbuf))
5013652Ssam 		return(FAIL);
5113652Ssam 	bufr[0] = type;
5213652Ssam 	s = &bufr[1];
5313652Ssam 	while (*str)
5413652Ssam 		*s++ = *str++;
5513652Ssam 	*s = '\0';
5613652Ssam 	if (*(--s) == '\n')
5713652Ssam 		*s = '\0';
5813652Ssam 	len = strlen(bufr) + 1;
5913652Ssam 	if ((i = len % PACKSIZE)) {
6013652Ssam 		len = len + PACKSIZE - i;
6113652Ssam 		bufr[len - 1] = '\0';
6213652Ssam 	}
6313652Ssam 	gwrblk(bufr, len, fn);
6417835Sralph 	return SUCCESS;
6513652Ssam }
6613652Ssam 
6717835Sralph /*ARGSUSED*/
6813652Ssam grdmsg(str, fn)
6913652Ssam register char *str;
7013652Ssam {
7113652Ssam 	unsigned len;
7213652Ssam 
7313652Ssam 	if(setjmp(Failbuf))
7417835Sralph 		return FAIL;
7513652Ssam 	for (;;) {
7617835Sralph 		len = pkread(Pk, str, PACKSIZE);
7713652Ssam 		if (len == 0)
7813652Ssam 			continue;
7913652Ssam 		str += len;
8013652Ssam 		if (*(str - 1) == '\0')
8113652Ssam 			break;
8213652Ssam 	}
8317835Sralph 	return SUCCESS;
8413652Ssam }
8513652Ssam 
8613652Ssam 
8713652Ssam gwrdata(fp1, fn)
8813652Ssam FILE *fp1;
8913652Ssam {
9013652Ssam 	char bufr[BUFSIZ];
9113652Ssam 	register int len;
9217835Sralph 	int ret, mil;
9317835Sralph 	struct timeb t1, t2;
9413652Ssam 	long bytes;
9513652Ssam 	char text[BUFSIZ];
9613652Ssam 
9713652Ssam 	if(setjmp(Failbuf))
9817835Sralph 		return FAIL;
9913652Ssam 	bytes = 0L;
100*18620Sralph #ifdef USG
101*18620Sralph 	time(&t1.time);
102*18620Sralph 	t1.millitm = 0;
103*18620Sralph #else !USG
10417835Sralph 	ftime(&t1);
105*18620Sralph #endif !USG
10617835Sralph 	while ((len = read(fileno(fp1), bufr, BUFSIZ)) > 0) {
10713652Ssam 		bytes += len;
10813652Ssam 		ret = gwrblk(bufr, len, fn);
10913652Ssam 		if (ret != len) {
11017835Sralph 			return FAIL;
11113652Ssam 		}
11213652Ssam 		if (len != BUFSIZ)
11313652Ssam 			break;
11413652Ssam 	}
11513652Ssam 	ret = gwrblk(bufr, 0, fn);
116*18620Sralph #ifdef USG
117*18620Sralph 	time(&t2.time);
118*18620Sralph 	t2.millitm = 0;
119*18620Sralph #else !USG
12017835Sralph 	ftime(&t2);
121*18620Sralph #endif !USG
122*18620Sralph 	Now = t2;
12317835Sralph 	t2.time -= t1.time;
12417835Sralph 	mil = t2.millitm - t1.millitm;
12517835Sralph 	if (mil < 0) {
12617835Sralph 		--t2.time;
12717835Sralph 		mil += 1000;
12817835Sralph 	}
129*18620Sralph 	sprintf(text, "sent data %ld bytes %ld.%02d secs",
130*18620Sralph 				bytes, (long)t2.time, mil/10);
13117835Sralph 	sysacct(bytes, t2.time - t1.time);
13213652Ssam 	DEBUG(1, "%s\n", text);
13313652Ssam 	syslog(text);
13417835Sralph 	return SUCCESS;
13513652Ssam }
13613652Ssam 
13713652Ssam grddata(fn, fp2)
13813652Ssam FILE *fp2;
13913652Ssam {
14013652Ssam 	register int len;
14113652Ssam 	char bufr[BUFSIZ];
14217835Sralph 	struct timeb t1, t2;
14317835Sralph 	int mil;
14413652Ssam 	long bytes;
14513652Ssam 	char text[BUFSIZ];
14613652Ssam 
14713652Ssam 	if(setjmp(Failbuf))
14817835Sralph 		return FAIL;
14913652Ssam 	bytes = 0L;
150*18620Sralph #ifdef USG
151*18620Sralph 	time(&t1.time);
152*18620Sralph 	t1.millitm = 0;
153*18620Sralph #else !USG
15417835Sralph 	ftime(&t1);
155*18620Sralph #endif !USG
15613652Ssam 	for (;;) {
15713652Ssam 		len = grdblk(bufr, BUFSIZ, fn);
15813652Ssam 		if (len < 0) {
15917835Sralph 			return FAIL;
16013652Ssam 		}
16113652Ssam 		bytes += len;
16217835Sralph 		if (write(fileno(fp2), bufr, len) != len)
16317835Sralph 			return FAIL;
16413652Ssam 		if (len < BUFSIZ)
16513652Ssam 			break;
16613652Ssam 	}
167*18620Sralph #ifdef USG
168*18620Sralph 	time(&t2.time);
169*18620Sralph 	t2.millitm = 0;
170*18620Sralph #else !USG
17117835Sralph 	ftime(&t2);
172*18620Sralph #endif !USG
173*18620Sralph 	Now = t2;
17417835Sralph 	t2.time -= t1.time;
17517835Sralph 	mil = t2.millitm - t1.millitm;
17617835Sralph 	if (mil < 0) {
17717835Sralph 		--t2.time;
17817835Sralph 		mil += 1000;
17917835Sralph 	}
180*18620Sralph 	sprintf(text, "received data %ld bytes %ld.%02d secs",
181*18620Sralph 				bytes, (long)t2.time, mil/10);
18217835Sralph 	sysacct(bytes, t2.time - t1.time);
18313652Ssam 	DEBUG(1, "%s\n", text);
18413652Ssam 	syslog(text);
18517835Sralph 	return SUCCESS;
18613652Ssam }
18713652Ssam 
18813652Ssam /* call ultouch every TC calls to either grdblk or gwrblk -- rti!trt */
18913652Ssam #define	TC	20
19013652Ssam static	int tc = TC;
19113652Ssam 
19217835Sralph /*ARGSUSED*/
19313652Ssam grdblk(blk, len,  fn)
19413652Ssam register int len;
19513652Ssam char *blk;
19613652Ssam {
19713652Ssam 	register int i, ret;
19813652Ssam 
19917835Sralph 	/* call ultouch occasionally */
20013652Ssam 	if (--tc < 0) {
20113652Ssam 		tc = TC;
20213652Ssam 		ultouch();
20313652Ssam 	}
20413652Ssam 	for (i = 0; i < len; i += ret) {
20517835Sralph 		ret = pkread(Pk, blk, len - i);
20613652Ssam 		if (ret < 0)
20717835Sralph 			return FAIL;
20813652Ssam 		blk += ret;
20913652Ssam 		if (ret == 0)
21017835Sralph 			return i;
21113652Ssam 	}
21217835Sralph 	return i;
21313652Ssam }
21413652Ssam 
21517835Sralph /*ARGSUSED*/
21613652Ssam gwrblk(blk, len, fn)
21713652Ssam register char *blk;
21813652Ssam {
21913652Ssam 	register int ret;
22013652Ssam 
22113652Ssam 	/* call ultouch occasionally -- rti!trt */
22213652Ssam 	if (--tc < 0) {
22313652Ssam 		tc = TC;
22413652Ssam 		ultouch();
22513652Ssam 	}
22617835Sralph 	ret = pkwrite(Pk, blk, len);
22717835Sralph 	return ret;
22813652Ssam }
229