117827Sralph #ifndef lint 2*33970Srick static char sccsid[] = "@(#)tio.c 4.8 (Berkeley) 04/05/88"; 317827Sralph #endif 417827Sralph 523676Sbloom #include <signal.h> 618622Sralph #include "uucp.h" 717827Sralph #include <setjmp.h> 817827Sralph #include <sys/stat.h> 917827Sralph 1017827Sralph extern int pkfail(); 1117827Sralph #define TPACKSIZE 512 1217827Sralph #define TBUFSIZE 1024 1317827Sralph #define min(a,b) (((a)<(b))?(a):(b)) 1417827Sralph 1517827Sralph /* 1617827Sralph * htonl is a function that converts a long from host 1717827Sralph * order to network order 1817827Sralph * ntohl is a function that converts a long from network 1917827Sralph * order to host order 2017827Sralph * 2117827Sralph * network order is 0 1 2 3 (bytes in a long) 2217827Sralph * host order on a vax is 3 2 1 0 2317827Sralph * host order on a pdp11 is 1 0 3 2 2417827Sralph * host order on a 68000 is 0 1 2 3 2517827Sralph * most other machines are 0 1 2 3 2617827Sralph */ 2717827Sralph 2817827Sralph struct tbuf { 2917827Sralph long t_nbytes; 3017827Sralph char t_data[TBUFSIZE]; 3117827Sralph }; 3217827Sralph 3323676Sbloom extern jmp_buf Failbuf; 3417827Sralph 3533572Srick extern long Bytes_Sent, Bytes_Received; 3633572Srick 3717827Sralph twrmsg(type, str, fn) 3817827Sralph char type; 3917827Sralph register char *str; 4017827Sralph { 4117827Sralph char bufr[TBUFSIZE]; 4217827Sralph register char *s; 4317827Sralph int len, i; 4417827Sralph 4517827Sralph if(setjmp(Failbuf)) 4617827Sralph return FAIL; 4717827Sralph signal(SIGALRM, pkfail); 4833572Srick alarm(MAXMSGTIME*5); 4917827Sralph bufr[0] = type; 5017827Sralph s = &bufr[1]; 5117827Sralph while (*str) 5217827Sralph *s++ = *str++; 5317827Sralph *s = '\0'; 5417827Sralph if (*(--s) == '\n') 5517827Sralph *s = '\0'; 5617827Sralph len = strlen(bufr) + 1; 5717827Sralph if ((i = len % TPACKSIZE)) { 5817827Sralph len = len + TPACKSIZE - i; 5917827Sralph bufr[len - 1] = '\0'; 6017827Sralph } 6117827Sralph twrblk(bufr, len, fn); 6217827Sralph alarm(0); 6317827Sralph return SUCCESS; 6417827Sralph } 6517827Sralph 6617827Sralph trdmsg(str, fn) 6717827Sralph register char *str; 6817827Sralph { 6917827Sralph int len, cnt = 0; 7017827Sralph 7117827Sralph if(setjmp(Failbuf)) 7217827Sralph return FAIL; 7317827Sralph signal(SIGALRM, pkfail); 7433572Srick alarm(MAXMSGTIME*5); 7517827Sralph for (;;) { 7617827Sralph len = read(fn, str, TPACKSIZE); 77*33970Srick if (len <= 0) { 7817827Sralph alarm(0); 7917827Sralph return FAIL; 8017827Sralph } 8117827Sralph str += len; 8217827Sralph cnt += len; 8317827Sralph if (*(str - 1) == '\0' && (cnt % TPACKSIZE) == 0) 8417827Sralph break; 8517827Sralph } 8617827Sralph alarm(0); 8717827Sralph return SUCCESS; 8817827Sralph } 8917827Sralph 9017827Sralph twrdata(fp1, fn) 9117827Sralph FILE *fp1; 9217827Sralph { 9317827Sralph struct tbuf bufr; 9417827Sralph register int len; 9517827Sralph int ret, mil; 9617827Sralph struct timeb t1, t2; 9717827Sralph long bytes; 9817827Sralph char text[TBUFSIZE]; 9933572Srick float ft; 10017827Sralph 10117827Sralph if(setjmp(Failbuf)) 10217827Sralph return FAIL; 10317827Sralph signal(SIGALRM, pkfail); 10417827Sralph bytes = 0L; 10518622Sralph #ifdef USG 10618622Sralph time(&t1.time); 10718622Sralph t1.millitm = 0; 10818622Sralph #else !USG 10917827Sralph ftime(&t1); 11018622Sralph #endif !USG 11117827Sralph while ((len = read(fileno(fp1), bufr.t_data, TBUFSIZE)) > 0) { 11217827Sralph bytes += len; 11325967Sbloom #if defined(vax) || defined(pdp11) || defined(ns32000) 11417827Sralph bufr.t_nbytes = htonl((long)len); 11525967Sbloom #else !vax and !pdp11 and !ns32000 11617827Sralph bufr.t_nbytes = len; 11725967Sbloom #endif !vax and !pdp11 and !ns32000 11817827Sralph DEBUG(8,"twrdata sending %d bytes\n",len); 11917827Sralph len += sizeof(long); 12033572Srick alarm(MAXMSGTIME*5); 12123676Sbloom ret = twrblk((char *)&bufr, len, fn); 12217827Sralph alarm(0); 12317827Sralph if (ret != len) 12417827Sralph return FAIL; 12517827Sralph if (len != TBUFSIZE+sizeof(long)) 12617827Sralph break; 12717827Sralph } 12817827Sralph bufr.t_nbytes = 0; 12917827Sralph len = sizeof(long); 13033572Srick alarm(MAXMSGTIME*5); 13123676Sbloom ret = twrblk((char *)&bufr, len, fn); 13217827Sralph alarm(0); 13317827Sralph if (ret != len) 13417827Sralph return FAIL; 13518622Sralph #ifdef USG 13618622Sralph time(&t2.time); 13718622Sralph t2.millitm = 0; 13818622Sralph #else !USG 13917827Sralph ftime(&t2); 14018622Sralph #endif !USG 14118622Sralph Now = t2; 14217827Sralph t2.time -= t1.time; 14317827Sralph mil = t2.millitm - t1.millitm; 14417827Sralph if (mil < 0) { 14517827Sralph --t2.time; 14617827Sralph mil += 1000; 14717827Sralph } 14833572Srick ft = (float)t2.time + (float)mil/1000.; 14933572Srick sprintf(text, "sent data %ld bytes %.2f secs %ld bps", 15033572Srick bytes, ft, (long)((float)bytes*8./ft)); 15125150Sbloom sysacct(bytes, t2.time); 15233572Srick Bytes_Sent += bytes; 15317827Sralph DEBUG(1, "%s\n", text); 154*33970Srick log_xferstats(text); 15517827Sralph return SUCCESS; 15617827Sralph } 15717827Sralph 15817827Sralph trddata(fn, fp2) 15917827Sralph FILE *fp2; 16017827Sralph { 16117827Sralph register int len, nread; 16217827Sralph char bufr[TBUFSIZE]; 16317827Sralph struct timeb t1, t2; 16417827Sralph int mil; 16517827Sralph long bytes, Nbytes; 16633572Srick float ft; 16717827Sralph 16817827Sralph if(setjmp(Failbuf)) 16917827Sralph return FAIL; 17017827Sralph signal(SIGALRM, pkfail); 17118622Sralph #ifdef USG 17218622Sralph time(&t1.time); 17318622Sralph t1.millitm = 0; 17418622Sralph #else !USG 17517827Sralph ftime(&t1); 17618622Sralph #endif !USG 17717827Sralph bytes = 0L; 17817827Sralph for (;;) { 17933572Srick alarm(MAXMSGTIME*5); 18023676Sbloom len = trdblk((char *)&Nbytes,sizeof Nbytes,fn); 18117827Sralph alarm(0); 18217827Sralph if (len != sizeof Nbytes) 18317827Sralph return FAIL; 18425967Sbloom #if defined(vax) || defined(pdp11) || defined(ns32000) 18517827Sralph Nbytes = ntohl(Nbytes); 18625967Sbloom #endif vax or pdp11 or ns32000 18717827Sralph DEBUG(8,"trddata expecting %ld bytes\n",Nbytes); 18817827Sralph nread = Nbytes; 18917827Sralph if (nread == 0) 19017827Sralph break; 19133572Srick alarm(MAXMSGTIME*5); 19217827Sralph len = trdblk(bufr, nread, fn); 19317827Sralph alarm(0); 19417827Sralph if (len < 0) { 19517827Sralph return FAIL; 19617827Sralph } 19717827Sralph bytes += len; 19817827Sralph DEBUG(11,"trddata got %ld\n",bytes); 19917827Sralph if (write(fileno(fp2), bufr, len) != len) { 20017827Sralph alarm(0); 20117827Sralph return FAIL; 20217827Sralph } 20317827Sralph } 20418622Sralph #ifdef USG 20518622Sralph time(&t2.time); 20618622Sralph t2.millitm = 0; 20718622Sralph #else !USG 20817827Sralph ftime(&t2); 20918622Sralph #endif !USG 21018622Sralph Now = t2; 21117827Sralph t2.time -= t1.time; 21217827Sralph mil = t2.millitm - t1.millitm; 21317827Sralph if (mil < 0) { 21417827Sralph --t2.time; 21517827Sralph mil += 1000; 21617827Sralph } 21733572Srick ft = (float)t2.time + (float)mil/1000.; 21833572Srick sprintf(bufr, "received data %ld bytes %.2f secs %ld bps", 21933572Srick bytes, ft, (long)((float)bytes*8./ft)); 22033572Srick sysacct(bytes, t2.time); 22133572Srick Bytes_Received += bytes; 22217827Sralph DEBUG(1, "%s\n", bufr); 223*33970Srick log_xferstats(bufr); 22417827Sralph return SUCCESS; 22517827Sralph } 22617827Sralph 22725137Sbloom #if !defined(BSD4_2) && !defined(USG) 22817827Sralph #define TC 1024 22917827Sralph static int tc = TC; 23025137Sbloom #endif !BSD4_2 && !USG 23117827Sralph 23217827Sralph trdblk(blk, len, fn) 23317827Sralph register int len; 23417827Sralph char *blk; 23517827Sralph { 23617827Sralph register int i, ret; 23717827Sralph 23825137Sbloom #if !defined(BSD4_2) && !defined(USG) 23917827Sralph /* call ultouch occasionally */ 24017827Sralph if (--tc < 0) { 24117827Sralph tc = TC; 24217827Sralph ultouch(); 24317827Sralph } 24425137Sbloom #endif !BSD4_2 && !USG 24517827Sralph for (i = 0; i < len; i += ret) { 24617827Sralph ret = read(fn, blk, len - i); 24717827Sralph if (ret < 0) 24817827Sralph return FAIL; 24917827Sralph blk += ret; 25017827Sralph if (ret == 0) 25117827Sralph return i; 25217827Sralph } 25317827Sralph return i; 25417827Sralph } 25517827Sralph 25617827Sralph 25717827Sralph twrblk(blk, len, fn) 25817827Sralph register char *blk; 25917827Sralph { 26025137Sbloom #if !defined(BSD4_2) && !defined(USG) 26117827Sralph /* call ultouch occasionally */ 26217827Sralph if (--tc < 0) { 26317827Sralph tc = TC; 26417827Sralph ultouch(); 26517827Sralph } 26625137Sbloom #endif !BSD4_2 && !USG 26725137Sbloom return write(fn, blk, len); 26817827Sralph } 269