xref: /csrg-svn/usr.bin/uucp/uucico/gio.c (revision 33564)
113652Ssam #ifndef lint
2*33564Srick static char sccsid[] = "@(#)gio.c	5.6 (Berkeley) 10/9/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 
14*33564Srick extern long Bytes_Sent, Bytes_Received;
15*33564Srick 
1613652Ssam pkfail()
1713652Ssam {
1813652Ssam 	longjmp(Failbuf, 1);
1913652Ssam }
2013652Ssam 
2113652Ssam gturnon()
2213652Ssam {
2313652Ssam 	struct pack *pkopen();
2417835Sralph 
2513652Ssam 	if (setjmp(Failbuf))
2617835Sralph 		return FAIL;
2717835Sralph 	Pk = pkopen(Ifn, Ofn);
2817835Sralph 	if (Pk == NULL)
2917835Sralph 		return FAIL;
3017835Sralph 	return SUCCESS;
3113652Ssam }
3213652Ssam 
3313652Ssam gturnoff()
3413652Ssam {
3513652Ssam 	if(setjmp(Failbuf))
3613652Ssam 		return(FAIL);
3717835Sralph 	pkclose(Pk);
3817835Sralph 	return SUCCESS;
3913652Ssam }
4013652Ssam 
4113652Ssam 
4213652Ssam gwrmsg(type, str, fn)
4313652Ssam char type;
4413652Ssam register char *str;
4513652Ssam {
4613652Ssam 	char bufr[BUFSIZ];
4713652Ssam 	register char *s;
4813652Ssam 	int len, i;
4913652Ssam 
5013652Ssam 	if(setjmp(Failbuf))
5113652Ssam 		return(FAIL);
5213652Ssam 	bufr[0] = type;
5313652Ssam 	s = &bufr[1];
5413652Ssam 	while (*str)
5513652Ssam 		*s++ = *str++;
5613652Ssam 	*s = '\0';
5713652Ssam 	if (*(--s) == '\n')
5813652Ssam 		*s = '\0';
5913652Ssam 	len = strlen(bufr) + 1;
6013652Ssam 	if ((i = len % PACKSIZE)) {
6113652Ssam 		len = len + PACKSIZE - i;
6213652Ssam 		bufr[len - 1] = '\0';
6313652Ssam 	}
6413652Ssam 	gwrblk(bufr, len, fn);
6517835Sralph 	return SUCCESS;
6613652Ssam }
6713652Ssam 
6817835Sralph /*ARGSUSED*/
6913652Ssam grdmsg(str, fn)
7013652Ssam register char *str;
7113652Ssam {
7213652Ssam 	unsigned len;
7313652Ssam 
7413652Ssam 	if(setjmp(Failbuf))
7517835Sralph 		return FAIL;
7613652Ssam 	for (;;) {
7717835Sralph 		len = pkread(Pk, str, PACKSIZE);
7813652Ssam 		if (len == 0)
7913652Ssam 			continue;
8013652Ssam 		str += len;
8113652Ssam 		if (*(str - 1) == '\0')
8213652Ssam 			break;
8313652Ssam 	}
8417835Sralph 	return SUCCESS;
8513652Ssam }
8613652Ssam 
8713652Ssam 
8813652Ssam gwrdata(fp1, fn)
8913652Ssam FILE *fp1;
9013652Ssam {
9113652Ssam 	char bufr[BUFSIZ];
9213652Ssam 	register int len;
9317835Sralph 	int ret, mil;
9417835Sralph 	struct timeb t1, t2;
9513652Ssam 	long bytes;
9613652Ssam 	char text[BUFSIZ];
97*33564Srick 	float ft;
9813652Ssam 
9913652Ssam 	if(setjmp(Failbuf))
10017835Sralph 		return FAIL;
10113652Ssam 	bytes = 0L;
10223606Sbloom 	Retries = 0;
10318620Sralph #ifdef USG
10418620Sralph 	time(&t1.time);
10518620Sralph 	t1.millitm = 0;
10618620Sralph #else !USG
10717835Sralph 	ftime(&t1);
10818620Sralph #endif !USG
10917835Sralph 	while ((len = read(fileno(fp1), bufr, BUFSIZ)) > 0) {
11013652Ssam 		bytes += len;
11113652Ssam 		ret = gwrblk(bufr, len, fn);
11213652Ssam 		if (ret != len) {
11317835Sralph 			return FAIL;
11413652Ssam 		}
11513652Ssam 		if (len != BUFSIZ)
11613652Ssam 			break;
11713652Ssam 	}
11813652Ssam 	ret = gwrblk(bufr, 0, fn);
11918620Sralph #ifdef USG
12018620Sralph 	time(&t2.time);
12118620Sralph 	t2.millitm = 0;
12218620Sralph #else !USG
12317835Sralph 	ftime(&t2);
12418620Sralph #endif !USG
12518620Sralph 	Now = t2;
12617835Sralph 	t2.time -= t1.time;
12717835Sralph 	mil = t2.millitm - t1.millitm;
12817835Sralph 	if (mil < 0) {
12917835Sralph 		--t2.time;
13017835Sralph 		mil += 1000;
13117835Sralph 	}
132*33564Srick 	ft = (float)t2.time + (float)mil/1000.;
133*33564Srick 	sprintf(text, "sent data %ld bytes %.2f secs %ld bps",
134*33564Srick 		bytes, ft, (long)((float)bytes*8./ft));
13525150Sbloom 	sysacct(bytes, t2.time);
136*33564Srick 	Bytes_Sent += bytes;
13723606Sbloom 	if (Retries > 0)
13823606Sbloom 		sprintf((char *)text+strlen(text)," %d retries", Retries);
13913652Ssam 	DEBUG(1, "%s\n", text);
14013652Ssam 	syslog(text);
14117835Sralph 	return SUCCESS;
14213652Ssam }
14313652Ssam 
14413652Ssam grddata(fn, fp2)
14513652Ssam FILE *fp2;
14613652Ssam {
14713652Ssam 	register int len;
14813652Ssam 	char bufr[BUFSIZ];
14917835Sralph 	struct timeb t1, t2;
15017835Sralph 	int mil;
15113652Ssam 	long bytes;
15213652Ssam 	char text[BUFSIZ];
153*33564Srick 	float ft;
15413652Ssam 
15513652Ssam 	if(setjmp(Failbuf))
15617835Sralph 		return FAIL;
15713652Ssam 	bytes = 0L;
15823606Sbloom 	Retries = 0;
15918620Sralph #ifdef USG
16018620Sralph 	time(&t1.time);
16118620Sralph 	t1.millitm = 0;
16218620Sralph #else !USG
16317835Sralph 	ftime(&t1);
16418620Sralph #endif !USG
16513652Ssam 	for (;;) {
16613652Ssam 		len = grdblk(bufr, BUFSIZ, fn);
16713652Ssam 		if (len < 0) {
16817835Sralph 			return FAIL;
16913652Ssam 		}
17013652Ssam 		bytes += len;
17117835Sralph 		if (write(fileno(fp2), bufr, len) != len)
17217835Sralph 			return FAIL;
17313652Ssam 		if (len < BUFSIZ)
17413652Ssam 			break;
17513652Ssam 	}
17618620Sralph #ifdef USG
17718620Sralph 	time(&t2.time);
17818620Sralph 	t2.millitm = 0;
17918620Sralph #else !USG
18017835Sralph 	ftime(&t2);
18118620Sralph #endif !USG
18218620Sralph 	Now = t2;
18317835Sralph 	t2.time -= t1.time;
18417835Sralph 	mil = t2.millitm - t1.millitm;
18517835Sralph 	if (mil < 0) {
18617835Sralph 		--t2.time;
18717835Sralph 		mil += 1000;
18817835Sralph 	}
189*33564Srick 	ft = (float)t2.time + (float)mil/1000.;
190*33564Srick 	sprintf(text, "received data %ld bytes %.2f secs %ld bps",
191*33564Srick 		bytes, ft, (long)((float)bytes*8./ft));
19225150Sbloom 	sysacct(bytes, t2.time);
193*33564Srick 	Bytes_Received += bytes;
19423606Sbloom 	if (Retries > 0)
19523606Sbloom 		sprintf((char *)text+strlen(text)," %d retries", Retries);
19613652Ssam 	DEBUG(1, "%s\n", text);
19713652Ssam 	syslog(text);
19817835Sralph 	return SUCCESS;
19913652Ssam }
20013652Ssam 
20125133Sbloom #if !defined(BSD4_2) && !defined(USG)
20225133Sbloom /* call ultouch every TC calls to either grdblk or gwrblk */
20313652Ssam #define	TC	20
20413652Ssam static	int tc = TC;
20525133Sbloom #endif !BSD4_2 && !USG
20613652Ssam 
20717835Sralph /*ARGSUSED*/
20813652Ssam grdblk(blk, len,  fn)
20913652Ssam register int len;
21013652Ssam char *blk;
21113652Ssam {
21213652Ssam 	register int i, ret;
21313652Ssam 
21425133Sbloom #if !defined(BSD4_2) && !defined(USG)
21517835Sralph 	/* call ultouch occasionally */
21613652Ssam 	if (--tc < 0) {
21713652Ssam 		tc = TC;
21813652Ssam 		ultouch();
21913652Ssam 	}
22025133Sbloom #endif !BSD4_2 && !USG
22113652Ssam 	for (i = 0; i < len; i += ret) {
22217835Sralph 		ret = pkread(Pk, blk, len - i);
22313652Ssam 		if (ret < 0)
22417835Sralph 			return FAIL;
22513652Ssam 		blk += ret;
22613652Ssam 		if (ret == 0)
22717835Sralph 			return i;
22813652Ssam 	}
22917835Sralph 	return i;
23013652Ssam }
23113652Ssam 
23217835Sralph /*ARGSUSED*/
23313652Ssam gwrblk(blk, len, fn)
23413652Ssam register char *blk;
23513652Ssam {
23625133Sbloom #if !defined(BSD4_2) && !defined(USG)
23725133Sbloom 	/* call ultouch occasionally */
23813652Ssam 	if (--tc < 0) {
23913652Ssam 		tc = TC;
24013652Ssam 		ultouch();
24113652Ssam 	}
24225133Sbloom #endif !BSD4_2 && !USG
24325133Sbloom 	return  pkwrite(Pk, blk, len);
24413652Ssam }
245