xref: /csrg-svn/usr.bin/uucp/uucico/tio.c (revision 25150)
117827Sralph #ifndef lint
2*25150Sbloom static char sccsid[] = "@(#)tio.c	4.5 (Berkeley) 10/09/85";
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 
3517827Sralph twrmsg(type, str, fn)
3617827Sralph char type;
3717827Sralph register char *str;
3817827Sralph {
3917827Sralph 	char bufr[TBUFSIZE];
4017827Sralph 	register char *s;
4117827Sralph 	int len, i;
4217827Sralph 
4317827Sralph 	if(setjmp(Failbuf))
4417827Sralph 		return FAIL;
4517827Sralph 	signal(SIGALRM, pkfail);
4617827Sralph 	alarm(MAXMSGTIME);
4717827Sralph 	bufr[0] = type;
4817827Sralph 	s = &bufr[1];
4917827Sralph 	while (*str)
5017827Sralph 		*s++ = *str++;
5117827Sralph 	*s = '\0';
5217827Sralph 	if (*(--s) == '\n')
5317827Sralph 		*s = '\0';
5417827Sralph 	len = strlen(bufr) + 1;
5517827Sralph 	if ((i = len % TPACKSIZE)) {
5617827Sralph 		len = len + TPACKSIZE - i;
5717827Sralph 		bufr[len - 1] = '\0';
5817827Sralph 	}
5917827Sralph 	twrblk(bufr, len, fn);
6017827Sralph 	alarm(0);
6117827Sralph 	return SUCCESS;
6217827Sralph }
6317827Sralph 
6417827Sralph trdmsg(str, fn)
6517827Sralph register char *str;
6617827Sralph {
6717827Sralph 	int len, cnt = 0;
6817827Sralph 
6917827Sralph 	if(setjmp(Failbuf))
7017827Sralph 		return FAIL;
7117827Sralph 	signal(SIGALRM, pkfail);
7217827Sralph 	alarm(MAXMSGTIME);
7317827Sralph 	for (;;) {
7417827Sralph 		len = read(fn, str, TPACKSIZE);
7517827Sralph 		if (len == 0)
7617827Sralph 			continue;
7717827Sralph 		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];
9917827Sralph 
10017827Sralph 	if(setjmp(Failbuf))
10117827Sralph 		return FAIL;
10217827Sralph 	signal(SIGALRM, pkfail);
10317827Sralph 	bytes = 0L;
10418622Sralph #ifdef USG
10518622Sralph 	time(&t1.time);
10618622Sralph 	t1.millitm = 0;
10718622Sralph #else !USG
10817827Sralph 	ftime(&t1);
10918622Sralph #endif !USG
11017827Sralph 	while ((len = read(fileno(fp1), bufr.t_data, TBUFSIZE)) > 0) {
11117827Sralph 		bytes += len;
11217827Sralph #if defined(vax) || defined(pdp11)
11317827Sralph 		bufr.t_nbytes = htonl((long)len);
11417827Sralph #else !vax and !pdp11
11517827Sralph 		bufr.t_nbytes = len;
11617827Sralph #endif !vax and !pdp11
11717827Sralph 		DEBUG(8,"twrdata sending %d bytes\n",len);
11817827Sralph 		len += sizeof(long);
11917827Sralph 		alarm(MAXMSGTIME);
12023676Sbloom 		ret = twrblk((char *)&bufr, len, fn);
12117827Sralph 		alarm(0);
12217827Sralph 		if (ret != len)
12317827Sralph 			return FAIL;
12417827Sralph 		if (len != TBUFSIZE+sizeof(long))
12517827Sralph 			break;
12617827Sralph 	}
12717827Sralph 	bufr.t_nbytes = 0;
12817827Sralph 	len = sizeof(long);
12917827Sralph 	alarm(MAXMSGTIME);
13023676Sbloom 	ret = twrblk((char *)&bufr, len, fn);
13117827Sralph 	alarm(0);
13217827Sralph 	if (ret != len)
13317827Sralph 		return FAIL;
13418622Sralph #ifdef USG
13518622Sralph 	time(&t2.time);
13618622Sralph 	t2.millitm = 0;
13718622Sralph #else !USG
13817827Sralph 	ftime(&t2);
13918622Sralph #endif !USG
14018622Sralph 	Now = t2;
14117827Sralph 	t2.time -= t1.time;
14217827Sralph 	mil = t2.millitm - t1.millitm;
14317827Sralph 	if (mil < 0) {
14417827Sralph 		--t2.time;
14517827Sralph 		mil += 1000;
14617827Sralph 	}
14718622Sralph 	sprintf(text, "sent data %ld bytes %ld.%02d secs",
14818622Sralph 				bytes, (long)t2.time, mil/10);
149*25150Sbloom 	sysacct(bytes, t2.time);
15017827Sralph 	DEBUG(1, "%s\n", text);
15117827Sralph 	syslog(text);
15217827Sralph 	return SUCCESS;
15317827Sralph }
15417827Sralph 
15517827Sralph 
15617827Sralph trddata(fn, fp2)
15717827Sralph FILE *fp2;
15817827Sralph {
15917827Sralph 	register int len, nread;
16017827Sralph 	char bufr[TBUFSIZE];
16117827Sralph 	struct timeb t1, t2;
16217827Sralph 	int mil;
16317827Sralph 	long bytes, Nbytes;
16417827Sralph 
16517827Sralph 	if(setjmp(Failbuf))
16617827Sralph 		return FAIL;
16717827Sralph 	signal(SIGALRM, pkfail);
16818622Sralph #ifdef USG
16918622Sralph 	time(&t1.time);
17018622Sralph 	t1.millitm = 0;
17118622Sralph #else !USG
17217827Sralph 	ftime(&t1);
17318622Sralph #endif !USG
17417827Sralph 	bytes = 0L;
17517827Sralph 	for (;;) {
17617827Sralph 		alarm(MAXMSGTIME);
17723676Sbloom 		len = trdblk((char *)&Nbytes,sizeof Nbytes,fn);
17817827Sralph 		alarm(0);
17917827Sralph 		if (len != sizeof Nbytes)
18017827Sralph 			return FAIL;
18117827Sralph #if defined(vax) || defined(pdp11)
18217827Sralph 		Nbytes = ntohl(Nbytes);
18317827Sralph #endif vax or pdp11
18417827Sralph 		DEBUG(8,"trddata expecting %ld bytes\n",Nbytes);
18517827Sralph 		nread = Nbytes;
18617827Sralph 		if (nread == 0)
18717827Sralph 			break;
18817827Sralph 		alarm(MAXMSGTIME);
18917827Sralph 		len = trdblk(bufr, nread, fn);
19017827Sralph 		alarm(0);
19117827Sralph 		if (len < 0) {
19217827Sralph 			return FAIL;
19317827Sralph 		}
19417827Sralph 		bytes += len;
19517827Sralph 		DEBUG(11,"trddata got %ld\n",bytes);
19617827Sralph 		if (write(fileno(fp2), bufr, len) != len) {
19717827Sralph 			alarm(0);
19817827Sralph 			return FAIL;
19917827Sralph 		}
20017827Sralph 	}
20118622Sralph #ifdef USG
20218622Sralph 	time(&t2.time);
20318622Sralph 	t2.millitm = 0;
20418622Sralph #else !USG
20517827Sralph 	ftime(&t2);
20618622Sralph #endif !USG
20718622Sralph 	Now = t2;
20817827Sralph 	t2.time -= t1.time;
20917827Sralph 	mil = t2.millitm - t1.millitm;
21017827Sralph 	if (mil < 0) {
21117827Sralph 		--t2.time;
21217827Sralph 		mil += 1000;
21317827Sralph 	}
21418622Sralph 	sprintf(bufr, "received data %ld bytes %ld.%02d secs",
21518622Sralph 				bytes, (long)t2.time, mil/10);
21617827Sralph 	sysacct(bytes, t2.time - t1.time);
21717827Sralph 	DEBUG(1, "%s\n", bufr);
21817827Sralph 	syslog(bufr);
21917827Sralph 	return SUCCESS;
22017827Sralph }
22117827Sralph 
22225137Sbloom #if !defined(BSD4_2) && !defined(USG)
22317827Sralph #define	TC	1024
22417827Sralph static	int tc = TC;
22525137Sbloom #endif !BSD4_2 && !USG
22617827Sralph 
22717827Sralph trdblk(blk, len,  fn)
22817827Sralph register int len;
22917827Sralph char *blk;
23017827Sralph {
23117827Sralph 	register int i, ret;
23217827Sralph 
23325137Sbloom #if !defined(BSD4_2) && !defined(USG)
23417827Sralph 	/* call ultouch occasionally */
23517827Sralph 	if (--tc < 0) {
23617827Sralph 		tc = TC;
23717827Sralph 		ultouch();
23817827Sralph 	}
23925137Sbloom #endif !BSD4_2 && !USG
24017827Sralph 	for (i = 0; i < len; i += ret) {
24117827Sralph 		ret = read(fn, blk, len - i);
24217827Sralph 		if (ret < 0)
24317827Sralph 			return FAIL;
24417827Sralph 		blk += ret;
24517827Sralph 		if (ret == 0)
24617827Sralph 			return i;
24717827Sralph 	}
24817827Sralph 	return i;
24917827Sralph }
25017827Sralph 
25117827Sralph 
25217827Sralph twrblk(blk, len, fn)
25317827Sralph register char *blk;
25417827Sralph {
25525137Sbloom #if !defined(BSD4_2) && !defined(USG)
25617827Sralph 	/* call ultouch occasionally */
25717827Sralph 	if (--tc < 0) {
25817827Sralph 		tc = TC;
25917827Sralph 		ultouch();
26017827Sralph 	}
26125137Sbloom #endif !BSD4_2 && !USG
26225137Sbloom 	return write(fn, blk, len);
26317827Sralph }
264