113652Ssam #ifndef lint 2*18620Sralph static char sccsid[] = "@(#)gio.c 5.3 (Berkeley) 04/10/85"; 313652Ssam #endif 413652Ssam 5*18620Sralph #include "uucp.h" 613652Ssam #include "pk.h" 713652Ssam #include <setjmp.h> 813652Ssam 913652Ssam extern time_t time(); 1013652Ssam 1113652Ssam jmp_buf Failbuf; 1213652Ssam 1313652Ssam struct pack *Pk; 1413652Ssam 1513652Ssam pkfail() 1613652Ssam { 1713652Ssam longjmp(Failbuf, 1); 1813652Ssam } 1913652Ssam 2013652Ssam gturnon() 2113652Ssam { 2213652Ssam struct pack *pkopen(); 2317835Sralph 2413652Ssam if (setjmp(Failbuf)) 2517835Sralph return FAIL; 2617835Sralph Pk = pkopen(Ifn, Ofn); 2717835Sralph if (Pk == NULL) 2817835Sralph return FAIL; 2917835Sralph return SUCCESS; 3013652Ssam } 3113652Ssam 3213652Ssam gturnoff() 3313652Ssam { 3413652Ssam if(setjmp(Failbuf)) 3513652Ssam return(FAIL); 3617835Sralph pkclose(Pk); 3717835Sralph return SUCCESS; 3813652Ssam } 3913652Ssam 4013652Ssam 4113652Ssam gwrmsg(type, str, fn) 4213652Ssam char type; 4313652Ssam register char *str; 4413652Ssam { 4513652Ssam char bufr[BUFSIZ]; 4613652Ssam register char *s; 4713652Ssam int len, i; 4813652Ssam 4913652Ssam if(setjmp(Failbuf)) 5013652Ssam return(FAIL); 5113652Ssam bufr[0] = type; 5213652Ssam s = &bufr[1]; 5313652Ssam while (*str) 5413652Ssam *s++ = *str++; 5513652Ssam *s = '\0'; 5613652Ssam if (*(--s) == '\n') 5713652Ssam *s = '\0'; 5813652Ssam len = strlen(bufr) + 1; 5913652Ssam if ((i = len % PACKSIZE)) { 6013652Ssam len = len + PACKSIZE - i; 6113652Ssam bufr[len - 1] = '\0'; 6213652Ssam } 6313652Ssam gwrblk(bufr, len, fn); 6417835Sralph return SUCCESS; 6513652Ssam } 6613652Ssam 6717835Sralph /*ARGSUSED*/ 6813652Ssam grdmsg(str, fn) 6913652Ssam register char *str; 7013652Ssam { 7113652Ssam unsigned len; 7213652Ssam 7313652Ssam if(setjmp(Failbuf)) 7417835Sralph return FAIL; 7513652Ssam for (;;) { 7617835Sralph len = pkread(Pk, str, PACKSIZE); 7713652Ssam if (len == 0) 7813652Ssam continue; 7913652Ssam str += len; 8013652Ssam if (*(str - 1) == '\0') 8113652Ssam break; 8213652Ssam } 8317835Sralph return SUCCESS; 8413652Ssam } 8513652Ssam 8613652Ssam 8713652Ssam gwrdata(fp1, fn) 8813652Ssam FILE *fp1; 8913652Ssam { 9013652Ssam char bufr[BUFSIZ]; 9113652Ssam register int len; 9217835Sralph int ret, mil; 9317835Sralph struct timeb t1, t2; 9413652Ssam long bytes; 9513652Ssam char text[BUFSIZ]; 9613652Ssam 9713652Ssam if(setjmp(Failbuf)) 9817835Sralph return FAIL; 9913652Ssam bytes = 0L; 100*18620Sralph #ifdef USG 101*18620Sralph time(&t1.time); 102*18620Sralph t1.millitm = 0; 103*18620Sralph #else !USG 10417835Sralph ftime(&t1); 105*18620Sralph #endif !USG 10617835Sralph while ((len = read(fileno(fp1), bufr, BUFSIZ)) > 0) { 10713652Ssam bytes += len; 10813652Ssam ret = gwrblk(bufr, len, fn); 10913652Ssam if (ret != len) { 11017835Sralph return FAIL; 11113652Ssam } 11213652Ssam if (len != BUFSIZ) 11313652Ssam break; 11413652Ssam } 11513652Ssam ret = gwrblk(bufr, 0, fn); 116*18620Sralph #ifdef USG 117*18620Sralph time(&t2.time); 118*18620Sralph t2.millitm = 0; 119*18620Sralph #else !USG 12017835Sralph ftime(&t2); 121*18620Sralph #endif !USG 122*18620Sralph Now = t2; 12317835Sralph t2.time -= t1.time; 12417835Sralph mil = t2.millitm - t1.millitm; 12517835Sralph if (mil < 0) { 12617835Sralph --t2.time; 12717835Sralph mil += 1000; 12817835Sralph } 129*18620Sralph sprintf(text, "sent data %ld bytes %ld.%02d secs", 130*18620Sralph bytes, (long)t2.time, mil/10); 13117835Sralph sysacct(bytes, t2.time - t1.time); 13213652Ssam DEBUG(1, "%s\n", text); 13313652Ssam syslog(text); 13417835Sralph return SUCCESS; 13513652Ssam } 13613652Ssam 13713652Ssam grddata(fn, fp2) 13813652Ssam FILE *fp2; 13913652Ssam { 14013652Ssam register int len; 14113652Ssam char bufr[BUFSIZ]; 14217835Sralph struct timeb t1, t2; 14317835Sralph int mil; 14413652Ssam long bytes; 14513652Ssam char text[BUFSIZ]; 14613652Ssam 14713652Ssam if(setjmp(Failbuf)) 14817835Sralph return FAIL; 14913652Ssam bytes = 0L; 150*18620Sralph #ifdef USG 151*18620Sralph time(&t1.time); 152*18620Sralph t1.millitm = 0; 153*18620Sralph #else !USG 15417835Sralph ftime(&t1); 155*18620Sralph #endif !USG 15613652Ssam for (;;) { 15713652Ssam len = grdblk(bufr, BUFSIZ, fn); 15813652Ssam if (len < 0) { 15917835Sralph return FAIL; 16013652Ssam } 16113652Ssam bytes += len; 16217835Sralph if (write(fileno(fp2), bufr, len) != len) 16317835Sralph return FAIL; 16413652Ssam if (len < BUFSIZ) 16513652Ssam break; 16613652Ssam } 167*18620Sralph #ifdef USG 168*18620Sralph time(&t2.time); 169*18620Sralph t2.millitm = 0; 170*18620Sralph #else !USG 17117835Sralph ftime(&t2); 172*18620Sralph #endif !USG 173*18620Sralph Now = t2; 17417835Sralph t2.time -= t1.time; 17517835Sralph mil = t2.millitm - t1.millitm; 17617835Sralph if (mil < 0) { 17717835Sralph --t2.time; 17817835Sralph mil += 1000; 17917835Sralph } 180*18620Sralph sprintf(text, "received data %ld bytes %ld.%02d secs", 181*18620Sralph bytes, (long)t2.time, mil/10); 18217835Sralph sysacct(bytes, t2.time - t1.time); 18313652Ssam DEBUG(1, "%s\n", text); 18413652Ssam syslog(text); 18517835Sralph return SUCCESS; 18613652Ssam } 18713652Ssam 18813652Ssam /* call ultouch every TC calls to either grdblk or gwrblk -- rti!trt */ 18913652Ssam #define TC 20 19013652Ssam static int tc = TC; 19113652Ssam 19217835Sralph /*ARGSUSED*/ 19313652Ssam grdblk(blk, len, fn) 19413652Ssam register int len; 19513652Ssam char *blk; 19613652Ssam { 19713652Ssam register int i, ret; 19813652Ssam 19917835Sralph /* call ultouch occasionally */ 20013652Ssam if (--tc < 0) { 20113652Ssam tc = TC; 20213652Ssam ultouch(); 20313652Ssam } 20413652Ssam for (i = 0; i < len; i += ret) { 20517835Sralph ret = pkread(Pk, blk, len - i); 20613652Ssam if (ret < 0) 20717835Sralph return FAIL; 20813652Ssam blk += ret; 20913652Ssam if (ret == 0) 21017835Sralph return i; 21113652Ssam } 21217835Sralph return i; 21313652Ssam } 21413652Ssam 21517835Sralph /*ARGSUSED*/ 21613652Ssam gwrblk(blk, len, fn) 21713652Ssam register char *blk; 21813652Ssam { 21913652Ssam register int ret; 22013652Ssam 22113652Ssam /* call ultouch occasionally -- rti!trt */ 22213652Ssam if (--tc < 0) { 22313652Ssam tc = TC; 22413652Ssam ultouch(); 22513652Ssam } 22617835Sralph ret = pkwrite(Pk, blk, len); 22717835Sralph return ret; 22813652Ssam } 229