xref: /original-bsd/usr.bin/uucp/uucico/tio.c (revision 4ad1d170)
1 #ifndef lint
2 static char sccsid[] = "@(#)tio.c	4.2 (Berkeley) 04/10/85";
3 #endif
4 
5 #include "uucp.h"
6 #include <setjmp.h>
7 #include <signal.h>
8 #include <sys/stat.h>
9 
10 extern int pkfail();
11 extern	time_t	time();
12 #define TPACKSIZE	512
13 #define TBUFSIZE	1024
14 #define min(a,b)	(((a)<(b))?(a):(b))
15 
16 /*
17  *	htonl is a function that converts a long from host
18  *		order to network order
19  *	ntohl is a function that converts a long from network
20  *		order to host order
21  *
22  *	network order is 		0 1 2 3 (bytes in a long)
23  *	host order on a vax is		3 2 1 0
24  *	host order on a pdp11 is	1 0 3 2
25  *	host order on a 68000 is	0 1 2 3
26  *	most other machines are		0 1 2 3
27  */
28 
29 struct tbuf {
30 	long t_nbytes;
31 	char t_data[TBUFSIZE];
32 };
33 
34 jmp_buf Failbuf;
35 
36 tnullf()
37 {
38 	return SUCCESS;
39 }
40 
41 twrmsg(type, str, fn)
42 char type;
43 register char *str;
44 {
45 	char bufr[TBUFSIZE];
46 	register char *s;
47 	int len, i;
48 
49 	if(setjmp(Failbuf))
50 		return FAIL;
51 	signal(SIGALRM, pkfail);
52 	alarm(MAXMSGTIME);
53 	bufr[0] = type;
54 	s = &bufr[1];
55 	while (*str)
56 		*s++ = *str++;
57 	*s = '\0';
58 	if (*(--s) == '\n')
59 		*s = '\0';
60 	len = strlen(bufr) + 1;
61 	if ((i = len % TPACKSIZE)) {
62 		len = len + TPACKSIZE - i;
63 		bufr[len - 1] = '\0';
64 	}
65 	twrblk(bufr, len, fn);
66 	alarm(0);
67 	return SUCCESS;
68 }
69 
70 trdmsg(str, fn)
71 register char *str;
72 {
73 	int len, cnt = 0;
74 
75 	if(setjmp(Failbuf))
76 		return FAIL;
77 	signal(SIGALRM, pkfail);
78 	alarm(MAXMSGTIME);
79 	for (;;) {
80 		len = read(fn, str, TPACKSIZE);
81 		if (len == 0)
82 			continue;
83 		if (len < 0) {
84 			alarm(0);
85 			return FAIL;
86 		}
87 		str += len;
88 		cnt += len;
89 		if (*(str - 1) == '\0' && (cnt % TPACKSIZE) == 0)
90 			break;
91 	}
92 	alarm(0);
93 	return SUCCESS;
94 }
95 
96 twrdata(fp1, fn)
97 FILE *fp1;
98 {
99 	struct tbuf bufr;
100 	register int len;
101 	int ret, mil;
102 	struct timeb t1, t2;
103 	long bytes;
104 	char text[TBUFSIZE];
105 
106 	if(setjmp(Failbuf))
107 		return FAIL;
108 	signal(SIGALRM, pkfail);
109 	bytes = 0L;
110 #ifdef USG
111 	time(&t1.time);
112 	t1.millitm = 0;
113 #else !USG
114 	ftime(&t1);
115 #endif !USG
116 	while ((len = read(fileno(fp1), bufr.t_data, TBUFSIZE)) > 0) {
117 		bytes += len;
118 #if defined(vax) || defined(pdp11)
119 		bufr.t_nbytes = htonl((long)len);
120 #else !vax and !pdp11
121 		bufr.t_nbytes = len;
122 #endif !vax and !pdp11
123 		DEBUG(8,"twrdata sending %d bytes\n",len);
124 		len += sizeof(long);
125 		alarm(MAXMSGTIME);
126 		ret = twrblk(&bufr, len, fn);
127 		alarm(0);
128 		if (ret != len)
129 			return FAIL;
130 		if (len != TBUFSIZE+sizeof(long))
131 			break;
132 	}
133 	bufr.t_nbytes = 0;
134 	len = sizeof(long);
135 	alarm(MAXMSGTIME);
136 	ret = twrblk(&bufr, len, fn);
137 	alarm(0);
138 	if (ret != len)
139 		return FAIL;
140 #ifdef USG
141 	time(&t2.time);
142 	t2.millitm = 0;
143 #else !USG
144 	ftime(&t2);
145 #endif !USG
146 	Now = t2;
147 	t2.time -= t1.time;
148 	mil = t2.millitm - t1.millitm;
149 	if (mil < 0) {
150 		--t2.time;
151 		mil += 1000;
152 	}
153 	sprintf(text, "sent data %ld bytes %ld.%02d secs",
154 				bytes, (long)t2.time, mil/10);
155 	sysacct(bytes, t2.time - t1.time);
156 	DEBUG(1, "%s\n", text);
157 	syslog(text);
158 	return SUCCESS;
159 }
160 
161 
162 trddata(fn, fp2)
163 FILE *fp2;
164 {
165 	register int len, nread;
166 	char bufr[TBUFSIZE];
167 	struct timeb t1, t2;
168 	int mil;
169 	long bytes, Nbytes;
170 
171 	if(setjmp(Failbuf))
172 		return FAIL;
173 	signal(SIGALRM, pkfail);
174 #ifdef USG
175 	time(&t1.time);
176 	t1.millitm = 0;
177 #else !USG
178 	ftime(&t1);
179 #endif !USG
180 	bytes = 0L;
181 	for (;;) {
182 		alarm(MAXMSGTIME);
183 		len = trdblk(&Nbytes,sizeof Nbytes,fn);
184 		alarm(0);
185 		if (len != sizeof Nbytes)
186 			return FAIL;
187 #if defined(vax) || defined(pdp11)
188 		Nbytes = ntohl(Nbytes);
189 #endif vax or pdp11
190 		DEBUG(8,"trddata expecting %ld bytes\n",Nbytes);
191 		nread = Nbytes;
192 		if (nread == 0)
193 			break;
194 		alarm(MAXMSGTIME);
195 		len = trdblk(bufr, nread, fn);
196 		alarm(0);
197 		if (len < 0) {
198 			return FAIL;
199 		}
200 		bytes += len;
201 		DEBUG(11,"trddata got %ld\n",bytes);
202 		if (write(fileno(fp2), bufr, len) != len) {
203 			alarm(0);
204 			return FAIL;
205 		}
206 	}
207 #ifdef USG
208 	time(&t2.time);
209 	t2.millitm = 0;
210 #else !USG
211 	ftime(&t2);
212 #endif !USG
213 	Now = t2;
214 	t2.time -= t1.time;
215 	mil = t2.millitm - t1.millitm;
216 	if (mil < 0) {
217 		--t2.time;
218 		mil += 1000;
219 	}
220 	sprintf(bufr, "received data %ld bytes %ld.%02d secs",
221 				bytes, (long)t2.time, mil/10);
222 	sysacct(bytes, t2.time - t1.time);
223 	DEBUG(1, "%s\n", bufr);
224 	syslog(bufr);
225 	return SUCCESS;
226 }
227 
228 #define	TC	1024
229 static	int tc = TC;
230 
231 trdblk(blk, len,  fn)
232 register int len;
233 char *blk;
234 {
235 	register int i, ret;
236 
237 	/* call ultouch occasionally */
238 	if (--tc < 0) {
239 		tc = TC;
240 		ultouch();
241 	}
242 	for (i = 0; i < len; i += ret) {
243 		ret = read(fn, blk, len - i);
244 		if (ret < 0)
245 			return FAIL;
246 		blk += ret;
247 		if (ret == 0)
248 			return i;
249 	}
250 	return i;
251 }
252 
253 
254 twrblk(blk, len, fn)
255 register char *blk;
256 {
257 	register int ret;
258 	/* call ultouch occasionally */
259 	if (--tc < 0) {
260 		tc = TC;
261 		ultouch();
262 	}
263 	ret = write(fn, blk, len);
264 	return ret;
265 }
266