xref: /csrg-svn/usr.bin/uucp/uucico/gio.c (revision 25150)
113652Ssam #ifndef lint
2*25150Sbloom static char sccsid[] = "@(#)gio.c	5.6 (Berkeley) 10/09/85";
313652Ssam #endif
413652Ssam 
518620Sralph #include "uucp.h"
613652Ssam #include "pk.h"
713652Ssam #include <setjmp.h>
813652Ssam 
913652Ssam jmp_buf Failbuf;
1013652Ssam 
1123606Sbloom int Retries = 0;
1213652Ssam struct pack *Pk;
1313652Ssam 
1413652Ssam pkfail()
1513652Ssam {
1613652Ssam 	longjmp(Failbuf, 1);
1713652Ssam }
1813652Ssam 
1913652Ssam gturnon()
2013652Ssam {
2113652Ssam 	struct pack *pkopen();
2217835Sralph 
2313652Ssam 	if (setjmp(Failbuf))
2417835Sralph 		return FAIL;
2517835Sralph 	Pk = pkopen(Ifn, Ofn);
2617835Sralph 	if (Pk == NULL)
2717835Sralph 		return FAIL;
2817835Sralph 	return SUCCESS;
2913652Ssam }
3013652Ssam 
3113652Ssam gturnoff()
3213652Ssam {
3313652Ssam 	if(setjmp(Failbuf))
3413652Ssam 		return(FAIL);
3517835Sralph 	pkclose(Pk);
3617835Sralph 	return SUCCESS;
3713652Ssam }
3813652Ssam 
3913652Ssam 
4013652Ssam gwrmsg(type, str, fn)
4113652Ssam char type;
4213652Ssam register char *str;
4313652Ssam {
4413652Ssam 	char bufr[BUFSIZ];
4513652Ssam 	register char *s;
4613652Ssam 	int len, i;
4713652Ssam 
4813652Ssam 	if(setjmp(Failbuf))
4913652Ssam 		return(FAIL);
5013652Ssam 	bufr[0] = type;
5113652Ssam 	s = &bufr[1];
5213652Ssam 	while (*str)
5313652Ssam 		*s++ = *str++;
5413652Ssam 	*s = '\0';
5513652Ssam 	if (*(--s) == '\n')
5613652Ssam 		*s = '\0';
5713652Ssam 	len = strlen(bufr) + 1;
5813652Ssam 	if ((i = len % PACKSIZE)) {
5913652Ssam 		len = len + PACKSIZE - i;
6013652Ssam 		bufr[len - 1] = '\0';
6113652Ssam 	}
6213652Ssam 	gwrblk(bufr, len, fn);
6317835Sralph 	return SUCCESS;
6413652Ssam }
6513652Ssam 
6617835Sralph /*ARGSUSED*/
6713652Ssam grdmsg(str, fn)
6813652Ssam register char *str;
6913652Ssam {
7013652Ssam 	unsigned len;
7113652Ssam 
7213652Ssam 	if(setjmp(Failbuf))
7317835Sralph 		return FAIL;
7413652Ssam 	for (;;) {
7517835Sralph 		len = pkread(Pk, str, PACKSIZE);
7613652Ssam 		if (len == 0)
7713652Ssam 			continue;
7813652Ssam 		str += len;
7913652Ssam 		if (*(str - 1) == '\0')
8013652Ssam 			break;
8113652Ssam 	}
8217835Sralph 	return SUCCESS;
8313652Ssam }
8413652Ssam 
8513652Ssam 
8613652Ssam gwrdata(fp1, fn)
8713652Ssam FILE *fp1;
8813652Ssam {
8913652Ssam 	char bufr[BUFSIZ];
9013652Ssam 	register int len;
9117835Sralph 	int ret, mil;
9217835Sralph 	struct timeb t1, t2;
9313652Ssam 	long bytes;
9413652Ssam 	char text[BUFSIZ];
9513652Ssam 
9613652Ssam 	if(setjmp(Failbuf))
9717835Sralph 		return FAIL;
9813652Ssam 	bytes = 0L;
9923606Sbloom 	Retries = 0;
10018620Sralph #ifdef USG
10118620Sralph 	time(&t1.time);
10218620Sralph 	t1.millitm = 0;
10318620Sralph #else !USG
10417835Sralph 	ftime(&t1);
10518620Sralph #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);
11618620Sralph #ifdef USG
11718620Sralph 	time(&t2.time);
11818620Sralph 	t2.millitm = 0;
11918620Sralph #else !USG
12017835Sralph 	ftime(&t2);
12118620Sralph #endif !USG
12218620Sralph 	Now = t2;
12317835Sralph 	t2.time -= t1.time;
12417835Sralph 	mil = t2.millitm - t1.millitm;
12517835Sralph 	if (mil < 0) {
12617835Sralph 		--t2.time;
12717835Sralph 		mil += 1000;
12817835Sralph 	}
12918620Sralph 	sprintf(text, "sent data %ld bytes %ld.%02d secs",
13018620Sralph 				bytes, (long)t2.time, mil/10);
131*25150Sbloom 	sysacct(bytes, t2.time);
13223606Sbloom 	if (Retries > 0)
13323606Sbloom 		sprintf((char *)text+strlen(text)," %d retries", Retries);
13413652Ssam 	DEBUG(1, "%s\n", text);
13513652Ssam 	syslog(text);
13617835Sralph 	return SUCCESS;
13713652Ssam }
13813652Ssam 
13913652Ssam grddata(fn, fp2)
14013652Ssam FILE *fp2;
14113652Ssam {
14213652Ssam 	register int len;
14313652Ssam 	char bufr[BUFSIZ];
14417835Sralph 	struct timeb t1, t2;
14517835Sralph 	int mil;
14613652Ssam 	long bytes;
14713652Ssam 	char text[BUFSIZ];
14813652Ssam 
14913652Ssam 	if(setjmp(Failbuf))
15017835Sralph 		return FAIL;
15113652Ssam 	bytes = 0L;
15223606Sbloom 	Retries = 0;
15318620Sralph #ifdef USG
15418620Sralph 	time(&t1.time);
15518620Sralph 	t1.millitm = 0;
15618620Sralph #else !USG
15717835Sralph 	ftime(&t1);
15818620Sralph #endif !USG
15913652Ssam 	for (;;) {
16013652Ssam 		len = grdblk(bufr, BUFSIZ, fn);
16113652Ssam 		if (len < 0) {
16217835Sralph 			return FAIL;
16313652Ssam 		}
16413652Ssam 		bytes += len;
16517835Sralph 		if (write(fileno(fp2), bufr, len) != len)
16617835Sralph 			return FAIL;
16713652Ssam 		if (len < BUFSIZ)
16813652Ssam 			break;
16913652Ssam 	}
17018620Sralph #ifdef USG
17118620Sralph 	time(&t2.time);
17218620Sralph 	t2.millitm = 0;
17318620Sralph #else !USG
17417835Sralph 	ftime(&t2);
17518620Sralph #endif !USG
17618620Sralph 	Now = t2;
17717835Sralph 	t2.time -= t1.time;
17817835Sralph 	mil = t2.millitm - t1.millitm;
17917835Sralph 	if (mil < 0) {
18017835Sralph 		--t2.time;
18117835Sralph 		mil += 1000;
18217835Sralph 	}
18318620Sralph 	sprintf(text, "received data %ld bytes %ld.%02d secs",
18418620Sralph 				bytes, (long)t2.time, mil/10);
185*25150Sbloom 	sysacct(bytes, t2.time);
18623606Sbloom 	if (Retries > 0)
18723606Sbloom 		sprintf((char *)text+strlen(text)," %d retries", Retries);
18813652Ssam 	DEBUG(1, "%s\n", text);
18913652Ssam 	syslog(text);
19017835Sralph 	return SUCCESS;
19113652Ssam }
19213652Ssam 
19325133Sbloom #if !defined(BSD4_2) && !defined(USG)
19425133Sbloom /* call ultouch every TC calls to either grdblk or gwrblk */
19513652Ssam #define	TC	20
19613652Ssam static	int tc = TC;
19725133Sbloom #endif !BSD4_2 && !USG
19813652Ssam 
19917835Sralph /*ARGSUSED*/
20013652Ssam grdblk(blk, len,  fn)
20113652Ssam register int len;
20213652Ssam char *blk;
20313652Ssam {
20413652Ssam 	register int i, ret;
20513652Ssam 
20625133Sbloom #if !defined(BSD4_2) && !defined(USG)
20717835Sralph 	/* call ultouch occasionally */
20813652Ssam 	if (--tc < 0) {
20913652Ssam 		tc = TC;
21013652Ssam 		ultouch();
21113652Ssam 	}
21225133Sbloom #endif !BSD4_2 && !USG
21313652Ssam 	for (i = 0; i < len; i += ret) {
21417835Sralph 		ret = pkread(Pk, blk, len - i);
21513652Ssam 		if (ret < 0)
21617835Sralph 			return FAIL;
21713652Ssam 		blk += ret;
21813652Ssam 		if (ret == 0)
21917835Sralph 			return i;
22013652Ssam 	}
22117835Sralph 	return i;
22213652Ssam }
22313652Ssam 
22417835Sralph /*ARGSUSED*/
22513652Ssam gwrblk(blk, len, fn)
22613652Ssam register char *blk;
22713652Ssam {
22825133Sbloom #if !defined(BSD4_2) && !defined(USG)
22925133Sbloom 	/* call ultouch occasionally */
23013652Ssam 	if (--tc < 0) {
23113652Ssam 		tc = TC;
23213652Ssam 		ultouch();
23313652Ssam 	}
23425133Sbloom #endif !BSD4_2 && !USG
23525133Sbloom 	return  pkwrite(Pk, blk, len);
23613652Ssam }
237