117827Sralph #ifndef lint 2*25150Sbloom static char sccsid[] = "@(#)tio.c 4.5 (Berkeley) 10/09/85"; 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 3517827Sralph twrmsg(type, str, fn) 3617827Sralph char type; 3717827Sralph register char *str; 3817827Sralph { 3917827Sralph char bufr[TBUFSIZE]; 4017827Sralph register char *s; 4117827Sralph int len, i; 4217827Sralph 4317827Sralph if(setjmp(Failbuf)) 4417827Sralph return FAIL; 4517827Sralph signal(SIGALRM, pkfail); 4617827Sralph alarm(MAXMSGTIME); 4717827Sralph bufr[0] = type; 4817827Sralph s = &bufr[1]; 4917827Sralph while (*str) 5017827Sralph *s++ = *str++; 5117827Sralph *s = '\0'; 5217827Sralph if (*(--s) == '\n') 5317827Sralph *s = '\0'; 5417827Sralph len = strlen(bufr) + 1; 5517827Sralph if ((i = len % TPACKSIZE)) { 5617827Sralph len = len + TPACKSIZE - i; 5717827Sralph bufr[len - 1] = '\0'; 5817827Sralph } 5917827Sralph twrblk(bufr, len, fn); 6017827Sralph alarm(0); 6117827Sralph return SUCCESS; 6217827Sralph } 6317827Sralph 6417827Sralph trdmsg(str, fn) 6517827Sralph register char *str; 6617827Sralph { 6717827Sralph int len, cnt = 0; 6817827Sralph 6917827Sralph if(setjmp(Failbuf)) 7017827Sralph return FAIL; 7117827Sralph signal(SIGALRM, pkfail); 7217827Sralph alarm(MAXMSGTIME); 7317827Sralph for (;;) { 7417827Sralph len = read(fn, str, TPACKSIZE); 7517827Sralph if (len == 0) 7617827Sralph continue; 7717827Sralph 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]; 9917827Sralph 10017827Sralph if(setjmp(Failbuf)) 10117827Sralph return FAIL; 10217827Sralph signal(SIGALRM, pkfail); 10317827Sralph bytes = 0L; 10418622Sralph #ifdef USG 10518622Sralph time(&t1.time); 10618622Sralph t1.millitm = 0; 10718622Sralph #else !USG 10817827Sralph ftime(&t1); 10918622Sralph #endif !USG 11017827Sralph while ((len = read(fileno(fp1), bufr.t_data, TBUFSIZE)) > 0) { 11117827Sralph bytes += len; 11217827Sralph #if defined(vax) || defined(pdp11) 11317827Sralph bufr.t_nbytes = htonl((long)len); 11417827Sralph #else !vax and !pdp11 11517827Sralph bufr.t_nbytes = len; 11617827Sralph #endif !vax and !pdp11 11717827Sralph DEBUG(8,"twrdata sending %d bytes\n",len); 11817827Sralph len += sizeof(long); 11917827Sralph alarm(MAXMSGTIME); 12023676Sbloom ret = twrblk((char *)&bufr, len, fn); 12117827Sralph alarm(0); 12217827Sralph if (ret != len) 12317827Sralph return FAIL; 12417827Sralph if (len != TBUFSIZE+sizeof(long)) 12517827Sralph break; 12617827Sralph } 12717827Sralph bufr.t_nbytes = 0; 12817827Sralph len = sizeof(long); 12917827Sralph alarm(MAXMSGTIME); 13023676Sbloom ret = twrblk((char *)&bufr, len, fn); 13117827Sralph alarm(0); 13217827Sralph if (ret != len) 13317827Sralph return FAIL; 13418622Sralph #ifdef USG 13518622Sralph time(&t2.time); 13618622Sralph t2.millitm = 0; 13718622Sralph #else !USG 13817827Sralph ftime(&t2); 13918622Sralph #endif !USG 14018622Sralph Now = t2; 14117827Sralph t2.time -= t1.time; 14217827Sralph mil = t2.millitm - t1.millitm; 14317827Sralph if (mil < 0) { 14417827Sralph --t2.time; 14517827Sralph mil += 1000; 14617827Sralph } 14718622Sralph sprintf(text, "sent data %ld bytes %ld.%02d secs", 14818622Sralph bytes, (long)t2.time, mil/10); 149*25150Sbloom sysacct(bytes, t2.time); 15017827Sralph DEBUG(1, "%s\n", text); 15117827Sralph syslog(text); 15217827Sralph return SUCCESS; 15317827Sralph } 15417827Sralph 15517827Sralph 15617827Sralph trddata(fn, fp2) 15717827Sralph FILE *fp2; 15817827Sralph { 15917827Sralph register int len, nread; 16017827Sralph char bufr[TBUFSIZE]; 16117827Sralph struct timeb t1, t2; 16217827Sralph int mil; 16317827Sralph long bytes, Nbytes; 16417827Sralph 16517827Sralph if(setjmp(Failbuf)) 16617827Sralph return FAIL; 16717827Sralph signal(SIGALRM, pkfail); 16818622Sralph #ifdef USG 16918622Sralph time(&t1.time); 17018622Sralph t1.millitm = 0; 17118622Sralph #else !USG 17217827Sralph ftime(&t1); 17318622Sralph #endif !USG 17417827Sralph bytes = 0L; 17517827Sralph for (;;) { 17617827Sralph alarm(MAXMSGTIME); 17723676Sbloom len = trdblk((char *)&Nbytes,sizeof Nbytes,fn); 17817827Sralph alarm(0); 17917827Sralph if (len != sizeof Nbytes) 18017827Sralph return FAIL; 18117827Sralph #if defined(vax) || defined(pdp11) 18217827Sralph Nbytes = ntohl(Nbytes); 18317827Sralph #endif vax or pdp11 18417827Sralph DEBUG(8,"trddata expecting %ld bytes\n",Nbytes); 18517827Sralph nread = Nbytes; 18617827Sralph if (nread == 0) 18717827Sralph break; 18817827Sralph alarm(MAXMSGTIME); 18917827Sralph len = trdblk(bufr, nread, fn); 19017827Sralph alarm(0); 19117827Sralph if (len < 0) { 19217827Sralph return FAIL; 19317827Sralph } 19417827Sralph bytes += len; 19517827Sralph DEBUG(11,"trddata got %ld\n",bytes); 19617827Sralph if (write(fileno(fp2), bufr, len) != len) { 19717827Sralph alarm(0); 19817827Sralph return FAIL; 19917827Sralph } 20017827Sralph } 20118622Sralph #ifdef USG 20218622Sralph time(&t2.time); 20318622Sralph t2.millitm = 0; 20418622Sralph #else !USG 20517827Sralph ftime(&t2); 20618622Sralph #endif !USG 20718622Sralph Now = t2; 20817827Sralph t2.time -= t1.time; 20917827Sralph mil = t2.millitm - t1.millitm; 21017827Sralph if (mil < 0) { 21117827Sralph --t2.time; 21217827Sralph mil += 1000; 21317827Sralph } 21418622Sralph sprintf(bufr, "received data %ld bytes %ld.%02d secs", 21518622Sralph bytes, (long)t2.time, mil/10); 21617827Sralph sysacct(bytes, t2.time - t1.time); 21717827Sralph DEBUG(1, "%s\n", bufr); 21817827Sralph syslog(bufr); 21917827Sralph return SUCCESS; 22017827Sralph } 22117827Sralph 22225137Sbloom #if !defined(BSD4_2) && !defined(USG) 22317827Sralph #define TC 1024 22417827Sralph static int tc = TC; 22525137Sbloom #endif !BSD4_2 && !USG 22617827Sralph 22717827Sralph trdblk(blk, len, fn) 22817827Sralph register int len; 22917827Sralph char *blk; 23017827Sralph { 23117827Sralph register int i, ret; 23217827Sralph 23325137Sbloom #if !defined(BSD4_2) && !defined(USG) 23417827Sralph /* call ultouch occasionally */ 23517827Sralph if (--tc < 0) { 23617827Sralph tc = TC; 23717827Sralph ultouch(); 23817827Sralph } 23925137Sbloom #endif !BSD4_2 && !USG 24017827Sralph for (i = 0; i < len; i += ret) { 24117827Sralph ret = read(fn, blk, len - i); 24217827Sralph if (ret < 0) 24317827Sralph return FAIL; 24417827Sralph blk += ret; 24517827Sralph if (ret == 0) 24617827Sralph return i; 24717827Sralph } 24817827Sralph return i; 24917827Sralph } 25017827Sralph 25117827Sralph 25217827Sralph twrblk(blk, len, fn) 25317827Sralph register char *blk; 25417827Sralph { 25525137Sbloom #if !defined(BSD4_2) && !defined(USG) 25617827Sralph /* call ultouch occasionally */ 25717827Sralph if (--tc < 0) { 25817827Sralph tc = TC; 25917827Sralph ultouch(); 26017827Sralph } 26125137Sbloom #endif !BSD4_2 && !USG 26225137Sbloom return write(fn, blk, len); 26317827Sralph } 264