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