xref: /csrg-svn/usr.bin/uucp/uucico/tio.c (revision 18622)
117827Sralph #ifndef lint
2*18622Sralph static char sccsid[] = "@(#)tio.c	4.2 (Berkeley) 04/10/85";
317827Sralph #endif
417827Sralph 
5*18622Sralph #include "uucp.h"
617827Sralph #include <setjmp.h>
717827Sralph #include <signal.h>
817827Sralph #include <sys/stat.h>
917827Sralph 
1017827Sralph extern int pkfail();
1117827Sralph extern	time_t	time();
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 
3417827Sralph jmp_buf Failbuf;
3517827Sralph 
3617827Sralph tnullf()
3717827Sralph {
3817827Sralph 	return SUCCESS;
3917827Sralph }
4017827Sralph 
4117827Sralph twrmsg(type, str, fn)
4217827Sralph char type;
4317827Sralph register char *str;
4417827Sralph {
4517827Sralph 	char bufr[TBUFSIZE];
4617827Sralph 	register char *s;
4717827Sralph 	int len, i;
4817827Sralph 
4917827Sralph 	if(setjmp(Failbuf))
5017827Sralph 		return FAIL;
5117827Sralph 	signal(SIGALRM, pkfail);
5217827Sralph 	alarm(MAXMSGTIME);
5317827Sralph 	bufr[0] = type;
5417827Sralph 	s = &bufr[1];
5517827Sralph 	while (*str)
5617827Sralph 		*s++ = *str++;
5717827Sralph 	*s = '\0';
5817827Sralph 	if (*(--s) == '\n')
5917827Sralph 		*s = '\0';
6017827Sralph 	len = strlen(bufr) + 1;
6117827Sralph 	if ((i = len % TPACKSIZE)) {
6217827Sralph 		len = len + TPACKSIZE - i;
6317827Sralph 		bufr[len - 1] = '\0';
6417827Sralph 	}
6517827Sralph 	twrblk(bufr, len, fn);
6617827Sralph 	alarm(0);
6717827Sralph 	return SUCCESS;
6817827Sralph }
6917827Sralph 
7017827Sralph trdmsg(str, fn)
7117827Sralph register char *str;
7217827Sralph {
7317827Sralph 	int len, cnt = 0;
7417827Sralph 
7517827Sralph 	if(setjmp(Failbuf))
7617827Sralph 		return FAIL;
7717827Sralph 	signal(SIGALRM, pkfail);
7817827Sralph 	alarm(MAXMSGTIME);
7917827Sralph 	for (;;) {
8017827Sralph 		len = read(fn, str, TPACKSIZE);
8117827Sralph 		if (len == 0)
8217827Sralph 			continue;
8317827Sralph 		if (len < 0) {
8417827Sralph 			alarm(0);
8517827Sralph 			return FAIL;
8617827Sralph 		}
8717827Sralph 		str += len;
8817827Sralph 		cnt += len;
8917827Sralph 		if (*(str - 1) == '\0' && (cnt % TPACKSIZE) == 0)
9017827Sralph 			break;
9117827Sralph 	}
9217827Sralph 	alarm(0);
9317827Sralph 	return SUCCESS;
9417827Sralph }
9517827Sralph 
9617827Sralph twrdata(fp1, fn)
9717827Sralph FILE *fp1;
9817827Sralph {
9917827Sralph 	struct tbuf bufr;
10017827Sralph 	register int len;
10117827Sralph 	int ret, mil;
10217827Sralph 	struct timeb t1, t2;
10317827Sralph 	long bytes;
10417827Sralph 	char text[TBUFSIZE];
10517827Sralph 
10617827Sralph 	if(setjmp(Failbuf))
10717827Sralph 		return FAIL;
10817827Sralph 	signal(SIGALRM, pkfail);
10917827Sralph 	bytes = 0L;
110*18622Sralph #ifdef USG
111*18622Sralph 	time(&t1.time);
112*18622Sralph 	t1.millitm = 0;
113*18622Sralph #else !USG
11417827Sralph 	ftime(&t1);
115*18622Sralph #endif !USG
11617827Sralph 	while ((len = read(fileno(fp1), bufr.t_data, TBUFSIZE)) > 0) {
11717827Sralph 		bytes += len;
11817827Sralph #if defined(vax) || defined(pdp11)
11917827Sralph 		bufr.t_nbytes = htonl((long)len);
12017827Sralph #else !vax and !pdp11
12117827Sralph 		bufr.t_nbytes = len;
12217827Sralph #endif !vax and !pdp11
12317827Sralph 		DEBUG(8,"twrdata sending %d bytes\n",len);
12417827Sralph 		len += sizeof(long);
12517827Sralph 		alarm(MAXMSGTIME);
12617827Sralph 		ret = twrblk(&bufr, len, fn);
12717827Sralph 		alarm(0);
12817827Sralph 		if (ret != len)
12917827Sralph 			return FAIL;
13017827Sralph 		if (len != TBUFSIZE+sizeof(long))
13117827Sralph 			break;
13217827Sralph 	}
13317827Sralph 	bufr.t_nbytes = 0;
13417827Sralph 	len = sizeof(long);
13517827Sralph 	alarm(MAXMSGTIME);
13617827Sralph 	ret = twrblk(&bufr, len, fn);
13717827Sralph 	alarm(0);
13817827Sralph 	if (ret != len)
13917827Sralph 		return FAIL;
140*18622Sralph #ifdef USG
141*18622Sralph 	time(&t2.time);
142*18622Sralph 	t2.millitm = 0;
143*18622Sralph #else !USG
14417827Sralph 	ftime(&t2);
145*18622Sralph #endif !USG
146*18622Sralph 	Now = t2;
14717827Sralph 	t2.time -= t1.time;
14817827Sralph 	mil = t2.millitm - t1.millitm;
14917827Sralph 	if (mil < 0) {
15017827Sralph 		--t2.time;
15117827Sralph 		mil += 1000;
15217827Sralph 	}
153*18622Sralph 	sprintf(text, "sent data %ld bytes %ld.%02d secs",
154*18622Sralph 				bytes, (long)t2.time, mil/10);
15517827Sralph 	sysacct(bytes, t2.time - t1.time);
15617827Sralph 	DEBUG(1, "%s\n", text);
15717827Sralph 	syslog(text);
15817827Sralph 	return SUCCESS;
15917827Sralph }
16017827Sralph 
16117827Sralph 
16217827Sralph trddata(fn, fp2)
16317827Sralph FILE *fp2;
16417827Sralph {
16517827Sralph 	register int len, nread;
16617827Sralph 	char bufr[TBUFSIZE];
16717827Sralph 	struct timeb t1, t2;
16817827Sralph 	int mil;
16917827Sralph 	long bytes, Nbytes;
17017827Sralph 
17117827Sralph 	if(setjmp(Failbuf))
17217827Sralph 		return FAIL;
17317827Sralph 	signal(SIGALRM, pkfail);
174*18622Sralph #ifdef USG
175*18622Sralph 	time(&t1.time);
176*18622Sralph 	t1.millitm = 0;
177*18622Sralph #else !USG
17817827Sralph 	ftime(&t1);
179*18622Sralph #endif !USG
18017827Sralph 	bytes = 0L;
18117827Sralph 	for (;;) {
18217827Sralph 		alarm(MAXMSGTIME);
18317827Sralph 		len = trdblk(&Nbytes,sizeof Nbytes,fn);
18417827Sralph 		alarm(0);
18517827Sralph 		if (len != sizeof Nbytes)
18617827Sralph 			return FAIL;
18717827Sralph #if defined(vax) || defined(pdp11)
18817827Sralph 		Nbytes = ntohl(Nbytes);
18917827Sralph #endif vax or pdp11
19017827Sralph 		DEBUG(8,"trddata expecting %ld bytes\n",Nbytes);
19117827Sralph 		nread = Nbytes;
19217827Sralph 		if (nread == 0)
19317827Sralph 			break;
19417827Sralph 		alarm(MAXMSGTIME);
19517827Sralph 		len = trdblk(bufr, nread, fn);
19617827Sralph 		alarm(0);
19717827Sralph 		if (len < 0) {
19817827Sralph 			return FAIL;
19917827Sralph 		}
20017827Sralph 		bytes += len;
20117827Sralph 		DEBUG(11,"trddata got %ld\n",bytes);
20217827Sralph 		if (write(fileno(fp2), bufr, len) != len) {
20317827Sralph 			alarm(0);
20417827Sralph 			return FAIL;
20517827Sralph 		}
20617827Sralph 	}
207*18622Sralph #ifdef USG
208*18622Sralph 	time(&t2.time);
209*18622Sralph 	t2.millitm = 0;
210*18622Sralph #else !USG
21117827Sralph 	ftime(&t2);
212*18622Sralph #endif !USG
213*18622Sralph 	Now = t2;
21417827Sralph 	t2.time -= t1.time;
21517827Sralph 	mil = t2.millitm - t1.millitm;
21617827Sralph 	if (mil < 0) {
21717827Sralph 		--t2.time;
21817827Sralph 		mil += 1000;
21917827Sralph 	}
220*18622Sralph 	sprintf(bufr, "received data %ld bytes %ld.%02d secs",
221*18622Sralph 				bytes, (long)t2.time, mil/10);
22217827Sralph 	sysacct(bytes, t2.time - t1.time);
22317827Sralph 	DEBUG(1, "%s\n", bufr);
22417827Sralph 	syslog(bufr);
22517827Sralph 	return SUCCESS;
22617827Sralph }
22717827Sralph 
22817827Sralph #define	TC	1024
22917827Sralph static	int tc = TC;
23017827Sralph 
23117827Sralph trdblk(blk, len,  fn)
23217827Sralph register int len;
23317827Sralph char *blk;
23417827Sralph {
23517827Sralph 	register int i, ret;
23617827Sralph 
23717827Sralph 	/* call ultouch occasionally */
23817827Sralph 	if (--tc < 0) {
23917827Sralph 		tc = TC;
24017827Sralph 		ultouch();
24117827Sralph 	}
24217827Sralph 	for (i = 0; i < len; i += ret) {
24317827Sralph 		ret = read(fn, blk, len - i);
24417827Sralph 		if (ret < 0)
24517827Sralph 			return FAIL;
24617827Sralph 		blk += ret;
24717827Sralph 		if (ret == 0)
24817827Sralph 			return i;
24917827Sralph 	}
25017827Sralph 	return i;
25117827Sralph }
25217827Sralph 
25317827Sralph 
25417827Sralph twrblk(blk, len, fn)
25517827Sralph register char *blk;
25617827Sralph {
25717827Sralph 	register int ret;
25817827Sralph 	/* call ultouch occasionally */
25917827Sralph 	if (--tc < 0) {
26017827Sralph 		tc = TC;
26117827Sralph 		ultouch();
26217827Sralph 	}
26317827Sralph 	ret = write(fn, blk, len);
26417827Sralph 	return ret;
26517827Sralph }
266