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