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