117827Sralph #ifndef lint 2*45947Sbostic static char sccsid[] = "@(#)tio.c 4.10 (Berkeley) 01/14/91"; 317827Sralph #endif 417827Sralph 5*45947Sbostic #include <sys/param.h> 6*45947Sbostic #include <sys/signal.h> 7*45947Sbostic #include <sys/stat.h> 818622Sralph #include "uucp.h" 917827Sralph #include <setjmp.h> 1017827Sralph 1117827Sralph extern int pkfail(); 1217827Sralph #define TPACKSIZE 512 1317827Sralph #define TBUFSIZE 1024 1417827Sralph #define min(a,b) (((a)<(b))?(a):(b)) 1517827Sralph 1617827Sralph /* 1717827Sralph * htonl is a function that converts a long from host 1817827Sralph * order to network order 1917827Sralph * ntohl is a function that converts a long from network 2017827Sralph * order to host order 2117827Sralph * 2217827Sralph * network order is 0 1 2 3 (bytes in a long) 2317827Sralph * host order on a vax is 3 2 1 0 2417827Sralph * host order on a pdp11 is 1 0 3 2 2517827Sralph * host order on a 68000 is 0 1 2 3 2617827Sralph * most other machines are 0 1 2 3 2717827Sralph */ 2817827Sralph 2917827Sralph struct tbuf { 3017827Sralph long t_nbytes; 3117827Sralph char t_data[TBUFSIZE]; 3217827Sralph }; 3317827Sralph 3423676Sbloom extern jmp_buf Failbuf; 3517827Sralph 3633572Srick extern long Bytes_Sent, Bytes_Received; 3733572Srick 3817827Sralph twrmsg(type, str, fn) 3917827Sralph char type; 4017827Sralph register char *str; 4117827Sralph { 4217827Sralph char bufr[TBUFSIZE]; 4317827Sralph register char *s; 4417827Sralph int len, i; 4517827Sralph 4617827Sralph if(setjmp(Failbuf)) 4717827Sralph return FAIL; 4817827Sralph signal(SIGALRM, pkfail); 4933572Srick alarm(MAXMSGTIME*5); 5017827Sralph bufr[0] = type; 5117827Sralph s = &bufr[1]; 5217827Sralph while (*str) 5317827Sralph *s++ = *str++; 5417827Sralph *s = '\0'; 5517827Sralph if (*(--s) == '\n') 5617827Sralph *s = '\0'; 5717827Sralph len = strlen(bufr) + 1; 5817827Sralph if ((i = len % TPACKSIZE)) { 5917827Sralph len = len + TPACKSIZE - i; 6017827Sralph bufr[len - 1] = '\0'; 6117827Sralph } 6217827Sralph twrblk(bufr, len, fn); 6317827Sralph alarm(0); 6417827Sralph return SUCCESS; 6517827Sralph } 6617827Sralph 6717827Sralph trdmsg(str, fn) 6817827Sralph register char *str; 6917827Sralph { 7017827Sralph int len, cnt = 0; 7117827Sralph 7217827Sralph if(setjmp(Failbuf)) 7317827Sralph return FAIL; 7417827Sralph signal(SIGALRM, pkfail); 7533572Srick alarm(MAXMSGTIME*5); 7617827Sralph for (;;) { 7717827Sralph len = read(fn, str, TPACKSIZE); 7833970Srick if (len <= 0) { 7917827Sralph alarm(0); 8017827Sralph return FAIL; 8117827Sralph } 8217827Sralph str += len; 8317827Sralph cnt += len; 8417827Sralph if (*(str - 1) == '\0' && (cnt % TPACKSIZE) == 0) 8517827Sralph break; 8617827Sralph } 8717827Sralph alarm(0); 8817827Sralph return SUCCESS; 8917827Sralph } 9017827Sralph 9117827Sralph twrdata(fp1, fn) 9217827Sralph FILE *fp1; 9317827Sralph { 9417827Sralph struct tbuf bufr; 9517827Sralph register int len; 9617827Sralph int ret, mil; 9717827Sralph struct timeb t1, t2; 9817827Sralph long bytes; 9917827Sralph char text[TBUFSIZE]; 10033572Srick float ft; 10117827Sralph 10217827Sralph if(setjmp(Failbuf)) 10317827Sralph return FAIL; 10417827Sralph signal(SIGALRM, pkfail); 10517827Sralph bytes = 0L; 10618622Sralph #ifdef USG 10718622Sralph time(&t1.time); 10818622Sralph t1.millitm = 0; 10918622Sralph #else !USG 11017827Sralph ftime(&t1); 11118622Sralph #endif !USG 11217827Sralph while ((len = read(fileno(fp1), bufr.t_data, TBUFSIZE)) > 0) { 11317827Sralph bytes += len; 11425967Sbloom #if defined(vax) || defined(pdp11) || defined(ns32000) 11517827Sralph bufr.t_nbytes = htonl((long)len); 11625967Sbloom #else !vax and !pdp11 and !ns32000 11717827Sralph bufr.t_nbytes = len; 11825967Sbloom #endif !vax and !pdp11 and !ns32000 11917827Sralph DEBUG(8,"twrdata sending %d bytes\n",len); 12017827Sralph len += sizeof(long); 12133572Srick alarm(MAXMSGTIME*5); 12223676Sbloom ret = twrblk((char *)&bufr, len, fn); 12317827Sralph alarm(0); 12417827Sralph if (ret != len) 12517827Sralph return FAIL; 12617827Sralph if (len != TBUFSIZE+sizeof(long)) 12717827Sralph break; 12817827Sralph } 12917827Sralph bufr.t_nbytes = 0; 13017827Sralph len = sizeof(long); 13133572Srick alarm(MAXMSGTIME*5); 13223676Sbloom ret = twrblk((char *)&bufr, len, fn); 13317827Sralph alarm(0); 13417827Sralph if (ret != len) 13517827Sralph return FAIL; 13618622Sralph #ifdef USG 13718622Sralph time(&t2.time); 13818622Sralph t2.millitm = 0; 13918622Sralph #else !USG 14017827Sralph ftime(&t2); 14118622Sralph #endif !USG 14218622Sralph Now = t2; 14317827Sralph t2.time -= t1.time; 14417827Sralph mil = t2.millitm - t1.millitm; 14517827Sralph if (mil < 0) { 14617827Sralph --t2.time; 14717827Sralph mil += 1000; 14817827Sralph } 14933572Srick ft = (float)t2.time + (float)mil/1000.; 15033572Srick sprintf(text, "sent data %ld bytes %.2f secs %ld bps", 15133572Srick bytes, ft, (long)((float)bytes*8./ft)); 15225150Sbloom sysacct(bytes, t2.time); 15333572Srick Bytes_Sent += bytes; 15417827Sralph DEBUG(1, "%s\n", text); 15533970Srick log_xferstats(text); 15617827Sralph return SUCCESS; 15717827Sralph } 15817827Sralph 15917827Sralph trddata(fn, fp2) 16017827Sralph FILE *fp2; 16117827Sralph { 16217827Sralph register int len, nread; 16317827Sralph char bufr[TBUFSIZE]; 16417827Sralph struct timeb t1, t2; 16517827Sralph int mil; 16617827Sralph long bytes, Nbytes; 16733572Srick float ft; 16817827Sralph 16917827Sralph if(setjmp(Failbuf)) 17017827Sralph return FAIL; 17117827Sralph signal(SIGALRM, pkfail); 17218622Sralph #ifdef USG 17318622Sralph time(&t1.time); 17418622Sralph t1.millitm = 0; 17518622Sralph #else !USG 17617827Sralph ftime(&t1); 17718622Sralph #endif !USG 17817827Sralph bytes = 0L; 17917827Sralph for (;;) { 18033572Srick alarm(MAXMSGTIME*5); 18123676Sbloom len = trdblk((char *)&Nbytes,sizeof Nbytes,fn); 18217827Sralph alarm(0); 18317827Sralph if (len != sizeof Nbytes) 18417827Sralph return FAIL; 18525967Sbloom #if defined(vax) || defined(pdp11) || defined(ns32000) 18617827Sralph Nbytes = ntohl(Nbytes); 18725967Sbloom #endif vax or pdp11 or ns32000 18817827Sralph DEBUG(8,"trddata expecting %ld bytes\n",Nbytes); 18917827Sralph nread = Nbytes; 19017827Sralph if (nread == 0) 19117827Sralph break; 19233572Srick alarm(MAXMSGTIME*5); 19317827Sralph len = trdblk(bufr, nread, fn); 19417827Sralph alarm(0); 19517827Sralph if (len < 0) { 19617827Sralph return FAIL; 19717827Sralph } 19817827Sralph bytes += len; 19917827Sralph DEBUG(11,"trddata got %ld\n",bytes); 20017827Sralph if (write(fileno(fp2), bufr, len) != len) { 20117827Sralph alarm(0); 20217827Sralph return FAIL; 20317827Sralph } 20417827Sralph } 20518622Sralph #ifdef USG 20618622Sralph time(&t2.time); 20718622Sralph t2.millitm = 0; 20818622Sralph #else !USG 20917827Sralph ftime(&t2); 21018622Sralph #endif !USG 21118622Sralph Now = t2; 21217827Sralph t2.time -= t1.time; 21317827Sralph mil = t2.millitm - t1.millitm; 21417827Sralph if (mil < 0) { 21517827Sralph --t2.time; 21617827Sralph mil += 1000; 21717827Sralph } 21833572Srick ft = (float)t2.time + (float)mil/1000.; 21933572Srick sprintf(bufr, "received data %ld bytes %.2f secs %ld bps", 22033572Srick bytes, ft, (long)((float)bytes*8./ft)); 22133572Srick sysacct(bytes, t2.time); 22233572Srick Bytes_Received += bytes; 22317827Sralph DEBUG(1, "%s\n", bufr); 22433970Srick log_xferstats(bufr); 22517827Sralph return SUCCESS; 22617827Sralph } 22717827Sralph 22825137Sbloom #if !defined(BSD4_2) && !defined(USG) 22917827Sralph #define TC 1024 23017827Sralph static int tc = TC; 23125137Sbloom #endif !BSD4_2 && !USG 23217827Sralph 23317827Sralph trdblk(blk, len, fn) 23417827Sralph register int len; 23517827Sralph char *blk; 23617827Sralph { 23717827Sralph register int i, ret; 23817827Sralph 23925137Sbloom #if !defined(BSD4_2) && !defined(USG) 24017827Sralph /* call ultouch occasionally */ 24117827Sralph if (--tc < 0) { 24217827Sralph tc = TC; 24317827Sralph ultouch(); 24417827Sralph } 24525137Sbloom #endif !BSD4_2 && !USG 24617827Sralph for (i = 0; i < len; i += ret) { 24717827Sralph ret = read(fn, blk, len - i); 24817827Sralph if (ret < 0) 24917827Sralph return FAIL; 25017827Sralph blk += ret; 25117827Sralph if (ret == 0) 25217827Sralph return i; 25317827Sralph } 25417827Sralph return i; 25517827Sralph } 25617827Sralph 25717827Sralph 25817827Sralph twrblk(blk, len, fn) 25917827Sralph register char *blk; 26017827Sralph { 26125137Sbloom #if !defined(BSD4_2) && !defined(USG) 26217827Sralph /* call ultouch occasionally */ 26317827Sralph if (--tc < 0) { 26417827Sralph tc = TC; 26517827Sralph ultouch(); 26617827Sralph } 26725137Sbloom #endif !BSD4_2 && !USG 26825137Sbloom return write(fn, blk, len); 26917827Sralph } 270