xref: /csrg-svn/usr.bin/uucp/uucico/tio.c (revision 33970)
117827Sralph #ifndef lint
2*33970Srick static char sccsid[] = "@(#)tio.c	4.8	(Berkeley) 04/05/88";
317827Sralph #endif
417827Sralph 
523676Sbloom #include <signal.h>
618622Sralph #include "uucp.h"
717827Sralph #include <setjmp.h>
817827Sralph #include <sys/stat.h>
917827Sralph 
1017827Sralph extern int pkfail();
1117827Sralph #define TPACKSIZE	512
1217827Sralph #define TBUFSIZE	1024
1317827Sralph #define min(a,b)	(((a)<(b))?(a):(b))
1417827Sralph 
1517827Sralph /*
1617827Sralph  *	htonl is a function that converts a long from host
1717827Sralph  *		order to network order
1817827Sralph  *	ntohl is a function that converts a long from network
1917827Sralph  *		order to host order
2017827Sralph  *
2117827Sralph  *	network order is 		0 1 2 3 (bytes in a long)
2217827Sralph  *	host order on a vax is		3 2 1 0
2317827Sralph  *	host order on a pdp11 is	1 0 3 2
2417827Sralph  *	host order on a 68000 is	0 1 2 3
2517827Sralph  *	most other machines are		0 1 2 3
2617827Sralph  */
2717827Sralph 
2817827Sralph struct tbuf {
2917827Sralph 	long t_nbytes;
3017827Sralph 	char t_data[TBUFSIZE];
3117827Sralph };
3217827Sralph 
3323676Sbloom extern jmp_buf Failbuf;
3417827Sralph 
3533572Srick extern long Bytes_Sent, Bytes_Received;
3633572Srick 
3717827Sralph twrmsg(type, str, fn)
3817827Sralph char type;
3917827Sralph register char *str;
4017827Sralph {
4117827Sralph 	char bufr[TBUFSIZE];
4217827Sralph 	register char *s;
4317827Sralph 	int len, i;
4417827Sralph 
4517827Sralph 	if(setjmp(Failbuf))
4617827Sralph 		return FAIL;
4717827Sralph 	signal(SIGALRM, pkfail);
4833572Srick 	alarm(MAXMSGTIME*5);
4917827Sralph 	bufr[0] = type;
5017827Sralph 	s = &bufr[1];
5117827Sralph 	while (*str)
5217827Sralph 		*s++ = *str++;
5317827Sralph 	*s = '\0';
5417827Sralph 	if (*(--s) == '\n')
5517827Sralph 		*s = '\0';
5617827Sralph 	len = strlen(bufr) + 1;
5717827Sralph 	if ((i = len % TPACKSIZE)) {
5817827Sralph 		len = len + TPACKSIZE - i;
5917827Sralph 		bufr[len - 1] = '\0';
6017827Sralph 	}
6117827Sralph 	twrblk(bufr, len, fn);
6217827Sralph 	alarm(0);
6317827Sralph 	return SUCCESS;
6417827Sralph }
6517827Sralph 
6617827Sralph trdmsg(str, fn)
6717827Sralph register char *str;
6817827Sralph {
6917827Sralph 	int len, cnt = 0;
7017827Sralph 
7117827Sralph 	if(setjmp(Failbuf))
7217827Sralph 		return FAIL;
7317827Sralph 	signal(SIGALRM, pkfail);
7433572Srick 	alarm(MAXMSGTIME*5);
7517827Sralph 	for (;;) {
7617827Sralph 		len = read(fn, str, TPACKSIZE);
77*33970Srick 		if (len <= 0) {
7817827Sralph 			alarm(0);
7917827Sralph 			return FAIL;
8017827Sralph 		}
8117827Sralph 		str += len;
8217827Sralph 		cnt += len;
8317827Sralph 		if (*(str - 1) == '\0' && (cnt % TPACKSIZE) == 0)
8417827Sralph 			break;
8517827Sralph 	}
8617827Sralph 	alarm(0);
8717827Sralph 	return SUCCESS;
8817827Sralph }
8917827Sralph 
9017827Sralph twrdata(fp1, fn)
9117827Sralph FILE *fp1;
9217827Sralph {
9317827Sralph 	struct tbuf bufr;
9417827Sralph 	register int len;
9517827Sralph 	int ret, mil;
9617827Sralph 	struct timeb t1, t2;
9717827Sralph 	long bytes;
9817827Sralph 	char text[TBUFSIZE];
9933572Srick 	float ft;
10017827Sralph 
10117827Sralph 	if(setjmp(Failbuf))
10217827Sralph 		return FAIL;
10317827Sralph 	signal(SIGALRM, pkfail);
10417827Sralph 	bytes = 0L;
10518622Sralph #ifdef USG
10618622Sralph 	time(&t1.time);
10718622Sralph 	t1.millitm = 0;
10818622Sralph #else !USG
10917827Sralph 	ftime(&t1);
11018622Sralph #endif !USG
11117827Sralph 	while ((len = read(fileno(fp1), bufr.t_data, TBUFSIZE)) > 0) {
11217827Sralph 		bytes += len;
11325967Sbloom #if defined(vax) || defined(pdp11) || defined(ns32000)
11417827Sralph 		bufr.t_nbytes = htonl((long)len);
11525967Sbloom #else !vax and !pdp11 and !ns32000
11617827Sralph 		bufr.t_nbytes = len;
11725967Sbloom #endif !vax and !pdp11 and !ns32000
11817827Sralph 		DEBUG(8,"twrdata sending %d bytes\n",len);
11917827Sralph 		len += sizeof(long);
12033572Srick 		alarm(MAXMSGTIME*5);
12123676Sbloom 		ret = twrblk((char *)&bufr, len, fn);
12217827Sralph 		alarm(0);
12317827Sralph 		if (ret != len)
12417827Sralph 			return FAIL;
12517827Sralph 		if (len != TBUFSIZE+sizeof(long))
12617827Sralph 			break;
12717827Sralph 	}
12817827Sralph 	bufr.t_nbytes = 0;
12917827Sralph 	len = sizeof(long);
13033572Srick 	alarm(MAXMSGTIME*5);
13123676Sbloom 	ret = twrblk((char *)&bufr, len, fn);
13217827Sralph 	alarm(0);
13317827Sralph 	if (ret != len)
13417827Sralph 		return FAIL;
13518622Sralph #ifdef USG
13618622Sralph 	time(&t2.time);
13718622Sralph 	t2.millitm = 0;
13818622Sralph #else !USG
13917827Sralph 	ftime(&t2);
14018622Sralph #endif !USG
14118622Sralph 	Now = t2;
14217827Sralph 	t2.time -= t1.time;
14317827Sralph 	mil = t2.millitm - t1.millitm;
14417827Sralph 	if (mil < 0) {
14517827Sralph 		--t2.time;
14617827Sralph 		mil += 1000;
14717827Sralph 	}
14833572Srick 	ft = (float)t2.time + (float)mil/1000.;
14933572Srick 	sprintf(text, "sent data %ld bytes %.2f secs %ld bps",
15033572Srick 		bytes, ft, (long)((float)bytes*8./ft));
15125150Sbloom 	sysacct(bytes, t2.time);
15233572Srick 	Bytes_Sent += bytes;
15317827Sralph 	DEBUG(1, "%s\n", text);
154*33970Srick 	log_xferstats(text);
15517827Sralph 	return SUCCESS;
15617827Sralph }
15717827Sralph 
15817827Sralph trddata(fn, fp2)
15917827Sralph FILE *fp2;
16017827Sralph {
16117827Sralph 	register int len, nread;
16217827Sralph 	char bufr[TBUFSIZE];
16317827Sralph 	struct timeb t1, t2;
16417827Sralph 	int mil;
16517827Sralph 	long bytes, Nbytes;
16633572Srick 	float ft;
16717827Sralph 
16817827Sralph 	if(setjmp(Failbuf))
16917827Sralph 		return FAIL;
17017827Sralph 	signal(SIGALRM, pkfail);
17118622Sralph #ifdef USG
17218622Sralph 	time(&t1.time);
17318622Sralph 	t1.millitm = 0;
17418622Sralph #else !USG
17517827Sralph 	ftime(&t1);
17618622Sralph #endif !USG
17717827Sralph 	bytes = 0L;
17817827Sralph 	for (;;) {
17933572Srick 		alarm(MAXMSGTIME*5);
18023676Sbloom 		len = trdblk((char *)&Nbytes,sizeof Nbytes,fn);
18117827Sralph 		alarm(0);
18217827Sralph 		if (len != sizeof Nbytes)
18317827Sralph 			return FAIL;
18425967Sbloom #if defined(vax) || defined(pdp11) || defined(ns32000)
18517827Sralph 		Nbytes = ntohl(Nbytes);
18625967Sbloom #endif vax or pdp11 or ns32000
18717827Sralph 		DEBUG(8,"trddata expecting %ld bytes\n",Nbytes);
18817827Sralph 		nread = Nbytes;
18917827Sralph 		if (nread == 0)
19017827Sralph 			break;
19133572Srick 		alarm(MAXMSGTIME*5);
19217827Sralph 		len = trdblk(bufr, nread, fn);
19317827Sralph 		alarm(0);
19417827Sralph 		if (len < 0) {
19517827Sralph 			return FAIL;
19617827Sralph 		}
19717827Sralph 		bytes += len;
19817827Sralph 		DEBUG(11,"trddata got %ld\n",bytes);
19917827Sralph 		if (write(fileno(fp2), bufr, len) != len) {
20017827Sralph 			alarm(0);
20117827Sralph 			return FAIL;
20217827Sralph 		}
20317827Sralph 	}
20418622Sralph #ifdef USG
20518622Sralph 	time(&t2.time);
20618622Sralph 	t2.millitm = 0;
20718622Sralph #else !USG
20817827Sralph 	ftime(&t2);
20918622Sralph #endif !USG
21018622Sralph 	Now = t2;
21117827Sralph 	t2.time -= t1.time;
21217827Sralph 	mil = t2.millitm - t1.millitm;
21317827Sralph 	if (mil < 0) {
21417827Sralph 		--t2.time;
21517827Sralph 		mil += 1000;
21617827Sralph 	}
21733572Srick 	ft = (float)t2.time + (float)mil/1000.;
21833572Srick 	sprintf(bufr, "received data %ld bytes %.2f secs %ld bps",
21933572Srick 		bytes, ft, (long)((float)bytes*8./ft));
22033572Srick 	sysacct(bytes, t2.time);
22133572Srick 	Bytes_Received += bytes;
22217827Sralph 	DEBUG(1, "%s\n", bufr);
223*33970Srick 	log_xferstats(bufr);
22417827Sralph 	return SUCCESS;
22517827Sralph }
22617827Sralph 
22725137Sbloom #if !defined(BSD4_2) && !defined(USG)
22817827Sralph #define	TC	1024
22917827Sralph static	int tc = TC;
23025137Sbloom #endif !BSD4_2 && !USG
23117827Sralph 
23217827Sralph trdblk(blk, len,  fn)
23317827Sralph register int len;
23417827Sralph char *blk;
23517827Sralph {
23617827Sralph 	register int i, ret;
23717827Sralph 
23825137Sbloom #if !defined(BSD4_2) && !defined(USG)
23917827Sralph 	/* call ultouch occasionally */
24017827Sralph 	if (--tc < 0) {
24117827Sralph 		tc = TC;
24217827Sralph 		ultouch();
24317827Sralph 	}
24425137Sbloom #endif !BSD4_2 && !USG
24517827Sralph 	for (i = 0; i < len; i += ret) {
24617827Sralph 		ret = read(fn, blk, len - i);
24717827Sralph 		if (ret < 0)
24817827Sralph 			return FAIL;
24917827Sralph 		blk += ret;
25017827Sralph 		if (ret == 0)
25117827Sralph 			return i;
25217827Sralph 	}
25317827Sralph 	return i;
25417827Sralph }
25517827Sralph 
25617827Sralph 
25717827Sralph twrblk(blk, len, fn)
25817827Sralph register char *blk;
25917827Sralph {
26025137Sbloom #if !defined(BSD4_2) && !defined(USG)
26117827Sralph 	/* call ultouch occasionally */
26217827Sralph 	if (--tc < 0) {
26317827Sralph 		tc = TC;
26417827Sralph 		ultouch();
26517827Sralph 	}
26625137Sbloom #endif !BSD4_2 && !USG
26725137Sbloom 	return write(fn, blk, len);
26817827Sralph }
269