117827Sralph #ifndef lint 2*18622Sralph static char sccsid[] = "@(#)tio.c 4.2 (Berkeley) 04/10/85"; 317827Sralph #endif 417827Sralph 5*18622Sralph #include "uucp.h" 617827Sralph #include <setjmp.h> 717827Sralph #include <signal.h> 817827Sralph #include <sys/stat.h> 917827Sralph 1017827Sralph extern int pkfail(); 1117827Sralph extern time_t time(); 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 3417827Sralph jmp_buf Failbuf; 3517827Sralph 3617827Sralph tnullf() 3717827Sralph { 3817827Sralph return SUCCESS; 3917827Sralph } 4017827Sralph 4117827Sralph twrmsg(type, str, fn) 4217827Sralph char type; 4317827Sralph register char *str; 4417827Sralph { 4517827Sralph char bufr[TBUFSIZE]; 4617827Sralph register char *s; 4717827Sralph int len, i; 4817827Sralph 4917827Sralph if(setjmp(Failbuf)) 5017827Sralph return FAIL; 5117827Sralph signal(SIGALRM, pkfail); 5217827Sralph alarm(MAXMSGTIME); 5317827Sralph bufr[0] = type; 5417827Sralph s = &bufr[1]; 5517827Sralph while (*str) 5617827Sralph *s++ = *str++; 5717827Sralph *s = '\0'; 5817827Sralph if (*(--s) == '\n') 5917827Sralph *s = '\0'; 6017827Sralph len = strlen(bufr) + 1; 6117827Sralph if ((i = len % TPACKSIZE)) { 6217827Sralph len = len + TPACKSIZE - i; 6317827Sralph bufr[len - 1] = '\0'; 6417827Sralph } 6517827Sralph twrblk(bufr, len, fn); 6617827Sralph alarm(0); 6717827Sralph return SUCCESS; 6817827Sralph } 6917827Sralph 7017827Sralph trdmsg(str, fn) 7117827Sralph register char *str; 7217827Sralph { 7317827Sralph int len, cnt = 0; 7417827Sralph 7517827Sralph if(setjmp(Failbuf)) 7617827Sralph return FAIL; 7717827Sralph signal(SIGALRM, pkfail); 7817827Sralph alarm(MAXMSGTIME); 7917827Sralph for (;;) { 8017827Sralph len = read(fn, str, TPACKSIZE); 8117827Sralph if (len == 0) 8217827Sralph continue; 8317827Sralph if (len < 0) { 8417827Sralph alarm(0); 8517827Sralph return FAIL; 8617827Sralph } 8717827Sralph str += len; 8817827Sralph cnt += len; 8917827Sralph if (*(str - 1) == '\0' && (cnt % TPACKSIZE) == 0) 9017827Sralph break; 9117827Sralph } 9217827Sralph alarm(0); 9317827Sralph return SUCCESS; 9417827Sralph } 9517827Sralph 9617827Sralph twrdata(fp1, fn) 9717827Sralph FILE *fp1; 9817827Sralph { 9917827Sralph struct tbuf bufr; 10017827Sralph register int len; 10117827Sralph int ret, mil; 10217827Sralph struct timeb t1, t2; 10317827Sralph long bytes; 10417827Sralph char text[TBUFSIZE]; 10517827Sralph 10617827Sralph if(setjmp(Failbuf)) 10717827Sralph return FAIL; 10817827Sralph signal(SIGALRM, pkfail); 10917827Sralph bytes = 0L; 110*18622Sralph #ifdef USG 111*18622Sralph time(&t1.time); 112*18622Sralph t1.millitm = 0; 113*18622Sralph #else !USG 11417827Sralph ftime(&t1); 115*18622Sralph #endif !USG 11617827Sralph while ((len = read(fileno(fp1), bufr.t_data, TBUFSIZE)) > 0) { 11717827Sralph bytes += len; 11817827Sralph #if defined(vax) || defined(pdp11) 11917827Sralph bufr.t_nbytes = htonl((long)len); 12017827Sralph #else !vax and !pdp11 12117827Sralph bufr.t_nbytes = len; 12217827Sralph #endif !vax and !pdp11 12317827Sralph DEBUG(8,"twrdata sending %d bytes\n",len); 12417827Sralph len += sizeof(long); 12517827Sralph alarm(MAXMSGTIME); 12617827Sralph ret = twrblk(&bufr, len, fn); 12717827Sralph alarm(0); 12817827Sralph if (ret != len) 12917827Sralph return FAIL; 13017827Sralph if (len != TBUFSIZE+sizeof(long)) 13117827Sralph break; 13217827Sralph } 13317827Sralph bufr.t_nbytes = 0; 13417827Sralph len = sizeof(long); 13517827Sralph alarm(MAXMSGTIME); 13617827Sralph ret = twrblk(&bufr, len, fn); 13717827Sralph alarm(0); 13817827Sralph if (ret != len) 13917827Sralph return FAIL; 140*18622Sralph #ifdef USG 141*18622Sralph time(&t2.time); 142*18622Sralph t2.millitm = 0; 143*18622Sralph #else !USG 14417827Sralph ftime(&t2); 145*18622Sralph #endif !USG 146*18622Sralph Now = t2; 14717827Sralph t2.time -= t1.time; 14817827Sralph mil = t2.millitm - t1.millitm; 14917827Sralph if (mil < 0) { 15017827Sralph --t2.time; 15117827Sralph mil += 1000; 15217827Sralph } 153*18622Sralph sprintf(text, "sent data %ld bytes %ld.%02d secs", 154*18622Sralph bytes, (long)t2.time, mil/10); 15517827Sralph sysacct(bytes, t2.time - t1.time); 15617827Sralph DEBUG(1, "%s\n", text); 15717827Sralph syslog(text); 15817827Sralph return SUCCESS; 15917827Sralph } 16017827Sralph 16117827Sralph 16217827Sralph trddata(fn, fp2) 16317827Sralph FILE *fp2; 16417827Sralph { 16517827Sralph register int len, nread; 16617827Sralph char bufr[TBUFSIZE]; 16717827Sralph struct timeb t1, t2; 16817827Sralph int mil; 16917827Sralph long bytes, Nbytes; 17017827Sralph 17117827Sralph if(setjmp(Failbuf)) 17217827Sralph return FAIL; 17317827Sralph signal(SIGALRM, pkfail); 174*18622Sralph #ifdef USG 175*18622Sralph time(&t1.time); 176*18622Sralph t1.millitm = 0; 177*18622Sralph #else !USG 17817827Sralph ftime(&t1); 179*18622Sralph #endif !USG 18017827Sralph bytes = 0L; 18117827Sralph for (;;) { 18217827Sralph alarm(MAXMSGTIME); 18317827Sralph len = trdblk(&Nbytes,sizeof Nbytes,fn); 18417827Sralph alarm(0); 18517827Sralph if (len != sizeof Nbytes) 18617827Sralph return FAIL; 18717827Sralph #if defined(vax) || defined(pdp11) 18817827Sralph Nbytes = ntohl(Nbytes); 18917827Sralph #endif vax or pdp11 19017827Sralph DEBUG(8,"trddata expecting %ld bytes\n",Nbytes); 19117827Sralph nread = Nbytes; 19217827Sralph if (nread == 0) 19317827Sralph break; 19417827Sralph alarm(MAXMSGTIME); 19517827Sralph len = trdblk(bufr, nread, fn); 19617827Sralph alarm(0); 19717827Sralph if (len < 0) { 19817827Sralph return FAIL; 19917827Sralph } 20017827Sralph bytes += len; 20117827Sralph DEBUG(11,"trddata got %ld\n",bytes); 20217827Sralph if (write(fileno(fp2), bufr, len) != len) { 20317827Sralph alarm(0); 20417827Sralph return FAIL; 20517827Sralph } 20617827Sralph } 207*18622Sralph #ifdef USG 208*18622Sralph time(&t2.time); 209*18622Sralph t2.millitm = 0; 210*18622Sralph #else !USG 21117827Sralph ftime(&t2); 212*18622Sralph #endif !USG 213*18622Sralph Now = t2; 21417827Sralph t2.time -= t1.time; 21517827Sralph mil = t2.millitm - t1.millitm; 21617827Sralph if (mil < 0) { 21717827Sralph --t2.time; 21817827Sralph mil += 1000; 21917827Sralph } 220*18622Sralph sprintf(bufr, "received data %ld bytes %ld.%02d secs", 221*18622Sralph bytes, (long)t2.time, mil/10); 22217827Sralph sysacct(bytes, t2.time - t1.time); 22317827Sralph DEBUG(1, "%s\n", bufr); 22417827Sralph syslog(bufr); 22517827Sralph return SUCCESS; 22617827Sralph } 22717827Sralph 22817827Sralph #define TC 1024 22917827Sralph static int tc = TC; 23017827Sralph 23117827Sralph trdblk(blk, len, fn) 23217827Sralph register int len; 23317827Sralph char *blk; 23417827Sralph { 23517827Sralph register int i, ret; 23617827Sralph 23717827Sralph /* call ultouch occasionally */ 23817827Sralph if (--tc < 0) { 23917827Sralph tc = TC; 24017827Sralph ultouch(); 24117827Sralph } 24217827Sralph for (i = 0; i < len; i += ret) { 24317827Sralph ret = read(fn, blk, len - i); 24417827Sralph if (ret < 0) 24517827Sralph return FAIL; 24617827Sralph blk += ret; 24717827Sralph if (ret == 0) 24817827Sralph return i; 24917827Sralph } 25017827Sralph return i; 25117827Sralph } 25217827Sralph 25317827Sralph 25417827Sralph twrblk(blk, len, fn) 25517827Sralph register char *blk; 25617827Sralph { 25717827Sralph register int ret; 25817827Sralph /* call ultouch occasionally */ 25917827Sralph if (--tc < 0) { 26017827Sralph tc = TC; 26117827Sralph ultouch(); 26217827Sralph } 26317827Sralph ret = write(fn, blk, len); 26417827Sralph return ret; 26517827Sralph } 266