|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)gio.c 5.9 (Berkeley) 4/5/88";
3: #endif
4:
5: #include "uucp.h"
6: #include "pk.h"
7: #include <setjmp.h>
8:
9: jmp_buf Failbuf;
10:
11: int Retries = 0;
12: struct pack *Pk;
13:
14: extern long Bytes_Sent, Bytes_Received;
15:
16: pkfail()
17: {
18: longjmp(Failbuf, 1);
19: }
20:
21: gturnon()
22: {
23: struct pack *pkopen();
24:
25: if (setjmp(Failbuf))
26: return FAIL;
27: Pk = pkopen(Ifn, Ofn);
28: if (Pk == NULL)
29: return FAIL;
30: return SUCCESS;
31: }
32:
33: gturnoff()
34: {
35: if(setjmp(Failbuf))
36: return(FAIL);
37: pkclose(Pk);
38: return SUCCESS;
39: }
40:
41:
42: gwrmsg(type, str, fn)
43: char type;
44: register char *str;
45: {
46: char bufr[BUFSIZ];
47: register char *s;
48: int len, i;
49:
50: if(setjmp(Failbuf))
51: return(FAIL);
52: bufr[0] = type;
53: s = &bufr[1];
54: while (*str)
55: *s++ = *str++;
56: *s = '\0';
57: if (*(--s) == '\n')
58: *s = '\0';
59: len = strlen(bufr) + 1;
60: if ((i = len % PACKSIZE)) {
61: len = len + PACKSIZE - i;
62: bufr[len - 1] = '\0';
63: }
64: gwrblk(bufr, len, fn);
65: return SUCCESS;
66: }
67:
68: /*ARGSUSED*/
69: grdmsg(str, fn)
70: register char *str;
71: {
72: unsigned len;
73:
74: if(setjmp(Failbuf))
75: return FAIL;
76: for (;;) {
77: len = pkread(Pk, str, PACKSIZE);
78: if (len == 0)
79: continue;
80: str += len;
81: if (*(str - 1) == '\0')
82: break;
83: }
84: return SUCCESS;
85: }
86:
87:
88: gwrdata(fp1, fn)
89: FILE *fp1;
90: {
91: char bufr[BUFSIZ];
92: register int len;
93: int ret, mil;
94: struct timeb t1, t2;
95: long bytes;
96: char text[BUFSIZ];
97: float ft;
98:
99: if(setjmp(Failbuf))
100: return FAIL;
101: bytes = 0L;
102: Retries = 0;
103: #ifdef USG
104: time(&t1.time);
105: t1.millitm = 0;
106: #else !USG
107: ftime(&t1);
108: #endif !USG
109: while ((len = read(fileno(fp1), bufr, BUFSIZ)) > 0) {
110: bytes += len;
111: ret = gwrblk(bufr, len, fn);
112: if (ret != len) {
113: return FAIL;
114: }
115: if (len != BUFSIZ)
116: break;
117: }
118: ret = gwrblk(bufr, 0, fn);
119: #ifdef USG
120: time(&t2.time);
121: t2.millitm = 0;
122: #else !USG
123: ftime(&t2);
124: #endif !USG
125: Now = t2;
126: t2.time -= t1.time;
127: mil = t2.millitm - t1.millitm;
128: if (mil < 0) {
129: --t2.time;
130: mil += 1000;
131: }
132: ft = (float)t2.time + (float)mil/1000.;
133: sprintf(text, "sent data %ld bytes %.2f secs %ld bps",
134: bytes, ft, (long)((float)bytes*8./ft));
135: sysacct(bytes, t2.time);
136: Bytes_Sent += bytes;
137: if (Retries > 0)
138: sprintf((char *)text+strlen(text)," %d retries", Retries);
139: DEBUG(1, "%s\n", text);
140: log_xferstats(text);
141: return SUCCESS;
142: }
143:
144: grddata(fn, fp2)
145: FILE *fp2;
146: {
147: register int len;
148: char bufr[BUFSIZ];
149: struct timeb t1, t2;
150: int mil;
151: long bytes;
152: char text[BUFSIZ];
153: float ft;
154:
155: if(setjmp(Failbuf))
156: return FAIL;
157: bytes = 0L;
158: Retries = 0;
159: #ifdef USG
160: time(&t1.time);
161: t1.millitm = 0;
162: #else !USG
163: ftime(&t1);
164: #endif !USG
165: for (;;) {
166: len = grdblk(bufr, BUFSIZ, fn);
167: if (len < 0) {
168: return FAIL;
169: }
170: bytes += len;
171: if (write(fileno(fp2), bufr, len) != len)
172: return FAIL;
173: if (len < BUFSIZ)
174: break;
175: }
176: #ifdef USG
177: time(&t2.time);
178: t2.millitm = 0;
179: #else !USG
180: ftime(&t2);
181: #endif !USG
182: Now = t2;
183: t2.time -= t1.time;
184: mil = t2.millitm - t1.millitm;
185: if (mil < 0) {
186: --t2.time;
187: mil += 1000;
188: }
189: ft = (float)t2.time + (float)mil/1000.;
190: sprintf(text, "received data %ld bytes %.2f secs %ld bps",
191: bytes, ft, (long)((float)bytes*8./ft));
192: sysacct(bytes, t2.time);
193: Bytes_Received += bytes;
194: if (Retries > 0)
195: sprintf((char *)text+strlen(text)," %d retries", Retries);
196: DEBUG(1, "%s\n", text);
197: log_xferstats(text);
198: return SUCCESS;
199: }
200:
201: #if !defined(BSD4_2) && !defined(USG)
202: /* call ultouch every TC calls to either grdblk or gwrblk */
203: #define TC 20
204: static int tc = TC;
205: #endif !BSD4_2 && !USG
206:
207: /*ARGSUSED*/
208: grdblk(blk, len, fn)
209: register int len;
210: char *blk;
211: {
212: register int i, ret;
213:
214: #if !defined(BSD4_2) && !defined(USG)
215: /* call ultouch occasionally */
216: if (--tc < 0) {
217: tc = TC;
218: ultouch();
219: }
220: #endif !BSD4_2 && !USG
221: for (i = 0; i < len; i += ret) {
222: ret = pkread(Pk, blk, len - i);
223: if (ret < 0)
224: return FAIL;
225: blk += ret;
226: if (ret == 0)
227: return i;
228: }
229: return i;
230: }
231:
232: /*ARGSUSED*/
233: gwrblk(blk, len, fn)
234: register char *blk;
235: {
236: #if !defined(BSD4_2) && !defined(USG)
237: /* call ultouch occasionally */
238: if (--tc < 0) {
239: tc = TC;
240: ultouch();
241: }
242: #endif !BSD4_2 && !USG
243: return pkwrite(Pk, blk, len);
244: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.