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