113652Ssam #ifndef lint 2*25150Sbloom static char sccsid[] = "@(#)gio.c 5.6 (Berkeley) 10/09/85"; 313652Ssam #endif 413652Ssam 518620Sralph #include "uucp.h" 613652Ssam #include "pk.h" 713652Ssam #include <setjmp.h> 813652Ssam 913652Ssam jmp_buf Failbuf; 1013652Ssam 1123606Sbloom int Retries = 0; 1213652Ssam struct pack *Pk; 1313652Ssam 1413652Ssam pkfail() 1513652Ssam { 1613652Ssam longjmp(Failbuf, 1); 1713652Ssam } 1813652Ssam 1913652Ssam gturnon() 2013652Ssam { 2113652Ssam struct pack *pkopen(); 2217835Sralph 2313652Ssam if (setjmp(Failbuf)) 2417835Sralph return FAIL; 2517835Sralph Pk = pkopen(Ifn, Ofn); 2617835Sralph if (Pk == NULL) 2717835Sralph return FAIL; 2817835Sralph return SUCCESS; 2913652Ssam } 3013652Ssam 3113652Ssam gturnoff() 3213652Ssam { 3313652Ssam if(setjmp(Failbuf)) 3413652Ssam return(FAIL); 3517835Sralph pkclose(Pk); 3617835Sralph return SUCCESS; 3713652Ssam } 3813652Ssam 3913652Ssam 4013652Ssam gwrmsg(type, str, fn) 4113652Ssam char type; 4213652Ssam register char *str; 4313652Ssam { 4413652Ssam char bufr[BUFSIZ]; 4513652Ssam register char *s; 4613652Ssam int len, i; 4713652Ssam 4813652Ssam if(setjmp(Failbuf)) 4913652Ssam return(FAIL); 5013652Ssam bufr[0] = type; 5113652Ssam s = &bufr[1]; 5213652Ssam while (*str) 5313652Ssam *s++ = *str++; 5413652Ssam *s = '\0'; 5513652Ssam if (*(--s) == '\n') 5613652Ssam *s = '\0'; 5713652Ssam len = strlen(bufr) + 1; 5813652Ssam if ((i = len % PACKSIZE)) { 5913652Ssam len = len + PACKSIZE - i; 6013652Ssam bufr[len - 1] = '\0'; 6113652Ssam } 6213652Ssam gwrblk(bufr, len, fn); 6317835Sralph return SUCCESS; 6413652Ssam } 6513652Ssam 6617835Sralph /*ARGSUSED*/ 6713652Ssam grdmsg(str, fn) 6813652Ssam register char *str; 6913652Ssam { 7013652Ssam unsigned len; 7113652Ssam 7213652Ssam if(setjmp(Failbuf)) 7317835Sralph return FAIL; 7413652Ssam for (;;) { 7517835Sralph len = pkread(Pk, str, PACKSIZE); 7613652Ssam if (len == 0) 7713652Ssam continue; 7813652Ssam str += len; 7913652Ssam if (*(str - 1) == '\0') 8013652Ssam break; 8113652Ssam } 8217835Sralph return SUCCESS; 8313652Ssam } 8413652Ssam 8513652Ssam 8613652Ssam gwrdata(fp1, fn) 8713652Ssam FILE *fp1; 8813652Ssam { 8913652Ssam char bufr[BUFSIZ]; 9013652Ssam register int len; 9117835Sralph int ret, mil; 9217835Sralph struct timeb t1, t2; 9313652Ssam long bytes; 9413652Ssam char text[BUFSIZ]; 9513652Ssam 9613652Ssam if(setjmp(Failbuf)) 9717835Sralph return FAIL; 9813652Ssam bytes = 0L; 9923606Sbloom Retries = 0; 10018620Sralph #ifdef USG 10118620Sralph time(&t1.time); 10218620Sralph t1.millitm = 0; 10318620Sralph #else !USG 10417835Sralph ftime(&t1); 10518620Sralph #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); 11618620Sralph #ifdef USG 11718620Sralph time(&t2.time); 11818620Sralph t2.millitm = 0; 11918620Sralph #else !USG 12017835Sralph ftime(&t2); 12118620Sralph #endif !USG 12218620Sralph Now = t2; 12317835Sralph t2.time -= t1.time; 12417835Sralph mil = t2.millitm - t1.millitm; 12517835Sralph if (mil < 0) { 12617835Sralph --t2.time; 12717835Sralph mil += 1000; 12817835Sralph } 12918620Sralph sprintf(text, "sent data %ld bytes %ld.%02d secs", 13018620Sralph bytes, (long)t2.time, mil/10); 131*25150Sbloom sysacct(bytes, t2.time); 13223606Sbloom if (Retries > 0) 13323606Sbloom sprintf((char *)text+strlen(text)," %d retries", Retries); 13413652Ssam DEBUG(1, "%s\n", text); 13513652Ssam syslog(text); 13617835Sralph return SUCCESS; 13713652Ssam } 13813652Ssam 13913652Ssam grddata(fn, fp2) 14013652Ssam FILE *fp2; 14113652Ssam { 14213652Ssam register int len; 14313652Ssam char bufr[BUFSIZ]; 14417835Sralph struct timeb t1, t2; 14517835Sralph int mil; 14613652Ssam long bytes; 14713652Ssam char text[BUFSIZ]; 14813652Ssam 14913652Ssam if(setjmp(Failbuf)) 15017835Sralph return FAIL; 15113652Ssam bytes = 0L; 15223606Sbloom Retries = 0; 15318620Sralph #ifdef USG 15418620Sralph time(&t1.time); 15518620Sralph t1.millitm = 0; 15618620Sralph #else !USG 15717835Sralph ftime(&t1); 15818620Sralph #endif !USG 15913652Ssam for (;;) { 16013652Ssam len = grdblk(bufr, BUFSIZ, fn); 16113652Ssam if (len < 0) { 16217835Sralph return FAIL; 16313652Ssam } 16413652Ssam bytes += len; 16517835Sralph if (write(fileno(fp2), bufr, len) != len) 16617835Sralph return FAIL; 16713652Ssam if (len < BUFSIZ) 16813652Ssam break; 16913652Ssam } 17018620Sralph #ifdef USG 17118620Sralph time(&t2.time); 17218620Sralph t2.millitm = 0; 17318620Sralph #else !USG 17417835Sralph ftime(&t2); 17518620Sralph #endif !USG 17618620Sralph Now = t2; 17717835Sralph t2.time -= t1.time; 17817835Sralph mil = t2.millitm - t1.millitm; 17917835Sralph if (mil < 0) { 18017835Sralph --t2.time; 18117835Sralph mil += 1000; 18217835Sralph } 18318620Sralph sprintf(text, "received data %ld bytes %ld.%02d secs", 18418620Sralph bytes, (long)t2.time, mil/10); 185*25150Sbloom sysacct(bytes, t2.time); 18623606Sbloom if (Retries > 0) 18723606Sbloom sprintf((char *)text+strlen(text)," %d retries", Retries); 18813652Ssam DEBUG(1, "%s\n", text); 18913652Ssam syslog(text); 19017835Sralph return SUCCESS; 19113652Ssam } 19213652Ssam 19325133Sbloom #if !defined(BSD4_2) && !defined(USG) 19425133Sbloom /* call ultouch every TC calls to either grdblk or gwrblk */ 19513652Ssam #define TC 20 19613652Ssam static int tc = TC; 19725133Sbloom #endif !BSD4_2 && !USG 19813652Ssam 19917835Sralph /*ARGSUSED*/ 20013652Ssam grdblk(blk, len, fn) 20113652Ssam register int len; 20213652Ssam char *blk; 20313652Ssam { 20413652Ssam register int i, ret; 20513652Ssam 20625133Sbloom #if !defined(BSD4_2) && !defined(USG) 20717835Sralph /* call ultouch occasionally */ 20813652Ssam if (--tc < 0) { 20913652Ssam tc = TC; 21013652Ssam ultouch(); 21113652Ssam } 21225133Sbloom #endif !BSD4_2 && !USG 21313652Ssam for (i = 0; i < len; i += ret) { 21417835Sralph ret = pkread(Pk, blk, len - i); 21513652Ssam if (ret < 0) 21617835Sralph return FAIL; 21713652Ssam blk += ret; 21813652Ssam if (ret == 0) 21917835Sralph return i; 22013652Ssam } 22117835Sralph return i; 22213652Ssam } 22313652Ssam 22417835Sralph /*ARGSUSED*/ 22513652Ssam gwrblk(blk, len, fn) 22613652Ssam register char *blk; 22713652Ssam { 22825133Sbloom #if !defined(BSD4_2) && !defined(USG) 22925133Sbloom /* call ultouch occasionally */ 23013652Ssam if (--tc < 0) { 23113652Ssam tc = TC; 23213652Ssam ultouch(); 23313652Ssam } 23425133Sbloom #endif !BSD4_2 && !USG 23525133Sbloom return pkwrite(Pk, blk, len); 23613652Ssam } 237