xref: /csrg-svn/usr.bin/uucp/uucico/tio.c (revision 45947)
117827Sralph #ifndef lint
2*45947Sbostic static char sccsid[] = "@(#)tio.c	4.10	(Berkeley) 01/14/91";
317827Sralph #endif
417827Sralph 
5*45947Sbostic #include <sys/param.h>
6*45947Sbostic #include <sys/signal.h>
7*45947Sbostic #include <sys/stat.h>
818622Sralph #include "uucp.h"
917827Sralph #include <setjmp.h>
1017827Sralph 
1117827Sralph extern int pkfail();
1217827Sralph #define TPACKSIZE	512
1317827Sralph #define TBUFSIZE	1024
1417827Sralph #define min(a,b)	(((a)<(b))?(a):(b))
1517827Sralph 
1617827Sralph /*
1717827Sralph  *	htonl is a function that converts a long from host
1817827Sralph  *		order to network order
1917827Sralph  *	ntohl is a function that converts a long from network
2017827Sralph  *		order to host order
2117827Sralph  *
2217827Sralph  *	network order is 		0 1 2 3 (bytes in a long)
2317827Sralph  *	host order on a vax is		3 2 1 0
2417827Sralph  *	host order on a pdp11 is	1 0 3 2
2517827Sralph  *	host order on a 68000 is	0 1 2 3
2617827Sralph  *	most other machines are		0 1 2 3
2717827Sralph  */
2817827Sralph 
2917827Sralph struct tbuf {
3017827Sralph 	long t_nbytes;
3117827Sralph 	char t_data[TBUFSIZE];
3217827Sralph };
3317827Sralph 
3423676Sbloom extern jmp_buf Failbuf;
3517827Sralph 
3633572Srick extern long Bytes_Sent, Bytes_Received;
3733572Srick 
3817827Sralph twrmsg(type, str, fn)
3917827Sralph char type;
4017827Sralph register char *str;
4117827Sralph {
4217827Sralph 	char bufr[TBUFSIZE];
4317827Sralph 	register char *s;
4417827Sralph 	int len, i;
4517827Sralph 
4617827Sralph 	if(setjmp(Failbuf))
4717827Sralph 		return FAIL;
4817827Sralph 	signal(SIGALRM, pkfail);
4933572Srick 	alarm(MAXMSGTIME*5);
5017827Sralph 	bufr[0] = type;
5117827Sralph 	s = &bufr[1];
5217827Sralph 	while (*str)
5317827Sralph 		*s++ = *str++;
5417827Sralph 	*s = '\0';
5517827Sralph 	if (*(--s) == '\n')
5617827Sralph 		*s = '\0';
5717827Sralph 	len = strlen(bufr) + 1;
5817827Sralph 	if ((i = len % TPACKSIZE)) {
5917827Sralph 		len = len + TPACKSIZE - i;
6017827Sralph 		bufr[len - 1] = '\0';
6117827Sralph 	}
6217827Sralph 	twrblk(bufr, len, fn);
6317827Sralph 	alarm(0);
6417827Sralph 	return SUCCESS;
6517827Sralph }
6617827Sralph 
6717827Sralph trdmsg(str, fn)
6817827Sralph register char *str;
6917827Sralph {
7017827Sralph 	int len, cnt = 0;
7117827Sralph 
7217827Sralph 	if(setjmp(Failbuf))
7317827Sralph 		return FAIL;
7417827Sralph 	signal(SIGALRM, pkfail);
7533572Srick 	alarm(MAXMSGTIME*5);
7617827Sralph 	for (;;) {
7717827Sralph 		len = read(fn, str, TPACKSIZE);
7833970Srick 		if (len <= 0) {
7917827Sralph 			alarm(0);
8017827Sralph 			return FAIL;
8117827Sralph 		}
8217827Sralph 		str += len;
8317827Sralph 		cnt += len;
8417827Sralph 		if (*(str - 1) == '\0' && (cnt % TPACKSIZE) == 0)
8517827Sralph 			break;
8617827Sralph 	}
8717827Sralph 	alarm(0);
8817827Sralph 	return SUCCESS;
8917827Sralph }
9017827Sralph 
9117827Sralph twrdata(fp1, fn)
9217827Sralph FILE *fp1;
9317827Sralph {
9417827Sralph 	struct tbuf bufr;
9517827Sralph 	register int len;
9617827Sralph 	int ret, mil;
9717827Sralph 	struct timeb t1, t2;
9817827Sralph 	long bytes;
9917827Sralph 	char text[TBUFSIZE];
10033572Srick 	float ft;
10117827Sralph 
10217827Sralph 	if(setjmp(Failbuf))
10317827Sralph 		return FAIL;
10417827Sralph 	signal(SIGALRM, pkfail);
10517827Sralph 	bytes = 0L;
10618622Sralph #ifdef USG
10718622Sralph 	time(&t1.time);
10818622Sralph 	t1.millitm = 0;
10918622Sralph #else !USG
11017827Sralph 	ftime(&t1);
11118622Sralph #endif !USG
11217827Sralph 	while ((len = read(fileno(fp1), bufr.t_data, TBUFSIZE)) > 0) {
11317827Sralph 		bytes += len;
11425967Sbloom #if defined(vax) || defined(pdp11) || defined(ns32000)
11517827Sralph 		bufr.t_nbytes = htonl((long)len);
11625967Sbloom #else !vax and !pdp11 and !ns32000
11717827Sralph 		bufr.t_nbytes = len;
11825967Sbloom #endif !vax and !pdp11 and !ns32000
11917827Sralph 		DEBUG(8,"twrdata sending %d bytes\n",len);
12017827Sralph 		len += sizeof(long);
12133572Srick 		alarm(MAXMSGTIME*5);
12223676Sbloom 		ret = twrblk((char *)&bufr, len, fn);
12317827Sralph 		alarm(0);
12417827Sralph 		if (ret != len)
12517827Sralph 			return FAIL;
12617827Sralph 		if (len != TBUFSIZE+sizeof(long))
12717827Sralph 			break;
12817827Sralph 	}
12917827Sralph 	bufr.t_nbytes = 0;
13017827Sralph 	len = sizeof(long);
13133572Srick 	alarm(MAXMSGTIME*5);
13223676Sbloom 	ret = twrblk((char *)&bufr, len, fn);
13317827Sralph 	alarm(0);
13417827Sralph 	if (ret != len)
13517827Sralph 		return FAIL;
13618622Sralph #ifdef USG
13718622Sralph 	time(&t2.time);
13818622Sralph 	t2.millitm = 0;
13918622Sralph #else !USG
14017827Sralph 	ftime(&t2);
14118622Sralph #endif !USG
14218622Sralph 	Now = t2;
14317827Sralph 	t2.time -= t1.time;
14417827Sralph 	mil = t2.millitm - t1.millitm;
14517827Sralph 	if (mil < 0) {
14617827Sralph 		--t2.time;
14717827Sralph 		mil += 1000;
14817827Sralph 	}
14933572Srick 	ft = (float)t2.time + (float)mil/1000.;
15033572Srick 	sprintf(text, "sent data %ld bytes %.2f secs %ld bps",
15133572Srick 		bytes, ft, (long)((float)bytes*8./ft));
15225150Sbloom 	sysacct(bytes, t2.time);
15333572Srick 	Bytes_Sent += bytes;
15417827Sralph 	DEBUG(1, "%s\n", text);
15533970Srick 	log_xferstats(text);
15617827Sralph 	return SUCCESS;
15717827Sralph }
15817827Sralph 
15917827Sralph trddata(fn, fp2)
16017827Sralph FILE *fp2;
16117827Sralph {
16217827Sralph 	register int len, nread;
16317827Sralph 	char bufr[TBUFSIZE];
16417827Sralph 	struct timeb t1, t2;
16517827Sralph 	int mil;
16617827Sralph 	long bytes, Nbytes;
16733572Srick 	float ft;
16817827Sralph 
16917827Sralph 	if(setjmp(Failbuf))
17017827Sralph 		return FAIL;
17117827Sralph 	signal(SIGALRM, pkfail);
17218622Sralph #ifdef USG
17318622Sralph 	time(&t1.time);
17418622Sralph 	t1.millitm = 0;
17518622Sralph #else !USG
17617827Sralph 	ftime(&t1);
17718622Sralph #endif !USG
17817827Sralph 	bytes = 0L;
17917827Sralph 	for (;;) {
18033572Srick 		alarm(MAXMSGTIME*5);
18123676Sbloom 		len = trdblk((char *)&Nbytes,sizeof Nbytes,fn);
18217827Sralph 		alarm(0);
18317827Sralph 		if (len != sizeof Nbytes)
18417827Sralph 			return FAIL;
18525967Sbloom #if defined(vax) || defined(pdp11) || defined(ns32000)
18617827Sralph 		Nbytes = ntohl(Nbytes);
18725967Sbloom #endif vax or pdp11 or ns32000
18817827Sralph 		DEBUG(8,"trddata expecting %ld bytes\n",Nbytes);
18917827Sralph 		nread = Nbytes;
19017827Sralph 		if (nread == 0)
19117827Sralph 			break;
19233572Srick 		alarm(MAXMSGTIME*5);
19317827Sralph 		len = trdblk(bufr, nread, fn);
19417827Sralph 		alarm(0);
19517827Sralph 		if (len < 0) {
19617827Sralph 			return FAIL;
19717827Sralph 		}
19817827Sralph 		bytes += len;
19917827Sralph 		DEBUG(11,"trddata got %ld\n",bytes);
20017827Sralph 		if (write(fileno(fp2), bufr, len) != len) {
20117827Sralph 			alarm(0);
20217827Sralph 			return FAIL;
20317827Sralph 		}
20417827Sralph 	}
20518622Sralph #ifdef USG
20618622Sralph 	time(&t2.time);
20718622Sralph 	t2.millitm = 0;
20818622Sralph #else !USG
20917827Sralph 	ftime(&t2);
21018622Sralph #endif !USG
21118622Sralph 	Now = t2;
21217827Sralph 	t2.time -= t1.time;
21317827Sralph 	mil = t2.millitm - t1.millitm;
21417827Sralph 	if (mil < 0) {
21517827Sralph 		--t2.time;
21617827Sralph 		mil += 1000;
21717827Sralph 	}
21833572Srick 	ft = (float)t2.time + (float)mil/1000.;
21933572Srick 	sprintf(bufr, "received data %ld bytes %.2f secs %ld bps",
22033572Srick 		bytes, ft, (long)((float)bytes*8./ft));
22133572Srick 	sysacct(bytes, t2.time);
22233572Srick 	Bytes_Received += bytes;
22317827Sralph 	DEBUG(1, "%s\n", bufr);
22433970Srick 	log_xferstats(bufr);
22517827Sralph 	return SUCCESS;
22617827Sralph }
22717827Sralph 
22825137Sbloom #if !defined(BSD4_2) && !defined(USG)
22917827Sralph #define	TC	1024
23017827Sralph static	int tc = TC;
23125137Sbloom #endif !BSD4_2 && !USG
23217827Sralph 
23317827Sralph trdblk(blk, len,  fn)
23417827Sralph register int len;
23517827Sralph char *blk;
23617827Sralph {
23717827Sralph 	register int i, ret;
23817827Sralph 
23925137Sbloom #if !defined(BSD4_2) && !defined(USG)
24017827Sralph 	/* call ultouch occasionally */
24117827Sralph 	if (--tc < 0) {
24217827Sralph 		tc = TC;
24317827Sralph 		ultouch();
24417827Sralph 	}
24525137Sbloom #endif !BSD4_2 && !USG
24617827Sralph 	for (i = 0; i < len; i += ret) {
24717827Sralph 		ret = read(fn, blk, len - i);
24817827Sralph 		if (ret < 0)
24917827Sralph 			return FAIL;
25017827Sralph 		blk += ret;
25117827Sralph 		if (ret == 0)
25217827Sralph 			return i;
25317827Sralph 	}
25417827Sralph 	return i;
25517827Sralph }
25617827Sralph 
25717827Sralph 
25817827Sralph twrblk(blk, len, fn)
25917827Sralph register char *blk;
26017827Sralph {
26125137Sbloom #if !defined(BSD4_2) && !defined(USG)
26217827Sralph 	/* call ultouch occasionally */
26317827Sralph 	if (--tc < 0) {
26417827Sralph 		tc = TC;
26517827Sralph 		ultouch();
26617827Sralph 	}
26725137Sbloom #endif !BSD4_2 && !USG
26825137Sbloom 	return write(fn, blk, len);
26917827Sralph }
270