113652Ssam #ifndef lint 2*33564Srick static char sccsid[] = "@(#)gio.c 5.6 (Berkeley) 10/9/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 14*33564Srick extern long Bytes_Sent, Bytes_Received; 15*33564Srick 1613652Ssam pkfail() 1713652Ssam { 1813652Ssam longjmp(Failbuf, 1); 1913652Ssam } 2013652Ssam 2113652Ssam gturnon() 2213652Ssam { 2313652Ssam struct pack *pkopen(); 2417835Sralph 2513652Ssam if (setjmp(Failbuf)) 2617835Sralph return FAIL; 2717835Sralph Pk = pkopen(Ifn, Ofn); 2817835Sralph if (Pk == NULL) 2917835Sralph return FAIL; 3017835Sralph return SUCCESS; 3113652Ssam } 3213652Ssam 3313652Ssam gturnoff() 3413652Ssam { 3513652Ssam if(setjmp(Failbuf)) 3613652Ssam return(FAIL); 3717835Sralph pkclose(Pk); 3817835Sralph return SUCCESS; 3913652Ssam } 4013652Ssam 4113652Ssam 4213652Ssam gwrmsg(type, str, fn) 4313652Ssam char type; 4413652Ssam register char *str; 4513652Ssam { 4613652Ssam char bufr[BUFSIZ]; 4713652Ssam register char *s; 4813652Ssam int len, i; 4913652Ssam 5013652Ssam if(setjmp(Failbuf)) 5113652Ssam return(FAIL); 5213652Ssam bufr[0] = type; 5313652Ssam s = &bufr[1]; 5413652Ssam while (*str) 5513652Ssam *s++ = *str++; 5613652Ssam *s = '\0'; 5713652Ssam if (*(--s) == '\n') 5813652Ssam *s = '\0'; 5913652Ssam len = strlen(bufr) + 1; 6013652Ssam if ((i = len % PACKSIZE)) { 6113652Ssam len = len + PACKSIZE - i; 6213652Ssam bufr[len - 1] = '\0'; 6313652Ssam } 6413652Ssam gwrblk(bufr, len, fn); 6517835Sralph return SUCCESS; 6613652Ssam } 6713652Ssam 6817835Sralph /*ARGSUSED*/ 6913652Ssam grdmsg(str, fn) 7013652Ssam register char *str; 7113652Ssam { 7213652Ssam unsigned len; 7313652Ssam 7413652Ssam if(setjmp(Failbuf)) 7517835Sralph return FAIL; 7613652Ssam for (;;) { 7717835Sralph len = pkread(Pk, str, PACKSIZE); 7813652Ssam if (len == 0) 7913652Ssam continue; 8013652Ssam str += len; 8113652Ssam if (*(str - 1) == '\0') 8213652Ssam break; 8313652Ssam } 8417835Sralph return SUCCESS; 8513652Ssam } 8613652Ssam 8713652Ssam 8813652Ssam gwrdata(fp1, fn) 8913652Ssam FILE *fp1; 9013652Ssam { 9113652Ssam char bufr[BUFSIZ]; 9213652Ssam register int len; 9317835Sralph int ret, mil; 9417835Sralph struct timeb t1, t2; 9513652Ssam long bytes; 9613652Ssam char text[BUFSIZ]; 97*33564Srick float ft; 9813652Ssam 9913652Ssam if(setjmp(Failbuf)) 10017835Sralph return FAIL; 10113652Ssam bytes = 0L; 10223606Sbloom Retries = 0; 10318620Sralph #ifdef USG 10418620Sralph time(&t1.time); 10518620Sralph t1.millitm = 0; 10618620Sralph #else !USG 10717835Sralph ftime(&t1); 10818620Sralph #endif !USG 10917835Sralph while ((len = read(fileno(fp1), bufr, BUFSIZ)) > 0) { 11013652Ssam bytes += len; 11113652Ssam ret = gwrblk(bufr, len, fn); 11213652Ssam if (ret != len) { 11317835Sralph return FAIL; 11413652Ssam } 11513652Ssam if (len != BUFSIZ) 11613652Ssam break; 11713652Ssam } 11813652Ssam ret = gwrblk(bufr, 0, fn); 11918620Sralph #ifdef USG 12018620Sralph time(&t2.time); 12118620Sralph t2.millitm = 0; 12218620Sralph #else !USG 12317835Sralph ftime(&t2); 12418620Sralph #endif !USG 12518620Sralph Now = t2; 12617835Sralph t2.time -= t1.time; 12717835Sralph mil = t2.millitm - t1.millitm; 12817835Sralph if (mil < 0) { 12917835Sralph --t2.time; 13017835Sralph mil += 1000; 13117835Sralph } 132*33564Srick ft = (float)t2.time + (float)mil/1000.; 133*33564Srick sprintf(text, "sent data %ld bytes %.2f secs %ld bps", 134*33564Srick bytes, ft, (long)((float)bytes*8./ft)); 13525150Sbloom sysacct(bytes, t2.time); 136*33564Srick Bytes_Sent += bytes; 13723606Sbloom if (Retries > 0) 13823606Sbloom sprintf((char *)text+strlen(text)," %d retries", Retries); 13913652Ssam DEBUG(1, "%s\n", text); 14013652Ssam syslog(text); 14117835Sralph return SUCCESS; 14213652Ssam } 14313652Ssam 14413652Ssam grddata(fn, fp2) 14513652Ssam FILE *fp2; 14613652Ssam { 14713652Ssam register int len; 14813652Ssam char bufr[BUFSIZ]; 14917835Sralph struct timeb t1, t2; 15017835Sralph int mil; 15113652Ssam long bytes; 15213652Ssam char text[BUFSIZ]; 153*33564Srick float ft; 15413652Ssam 15513652Ssam if(setjmp(Failbuf)) 15617835Sralph return FAIL; 15713652Ssam bytes = 0L; 15823606Sbloom Retries = 0; 15918620Sralph #ifdef USG 16018620Sralph time(&t1.time); 16118620Sralph t1.millitm = 0; 16218620Sralph #else !USG 16317835Sralph ftime(&t1); 16418620Sralph #endif !USG 16513652Ssam for (;;) { 16613652Ssam len = grdblk(bufr, BUFSIZ, fn); 16713652Ssam if (len < 0) { 16817835Sralph return FAIL; 16913652Ssam } 17013652Ssam bytes += len; 17117835Sralph if (write(fileno(fp2), bufr, len) != len) 17217835Sralph return FAIL; 17313652Ssam if (len < BUFSIZ) 17413652Ssam break; 17513652Ssam } 17618620Sralph #ifdef USG 17718620Sralph time(&t2.time); 17818620Sralph t2.millitm = 0; 17918620Sralph #else !USG 18017835Sralph ftime(&t2); 18118620Sralph #endif !USG 18218620Sralph Now = t2; 18317835Sralph t2.time -= t1.time; 18417835Sralph mil = t2.millitm - t1.millitm; 18517835Sralph if (mil < 0) { 18617835Sralph --t2.time; 18717835Sralph mil += 1000; 18817835Sralph } 189*33564Srick ft = (float)t2.time + (float)mil/1000.; 190*33564Srick sprintf(text, "received data %ld bytes %.2f secs %ld bps", 191*33564Srick bytes, ft, (long)((float)bytes*8./ft)); 19225150Sbloom sysacct(bytes, t2.time); 193*33564Srick Bytes_Received += bytes; 19423606Sbloom if (Retries > 0) 19523606Sbloom sprintf((char *)text+strlen(text)," %d retries", Retries); 19613652Ssam DEBUG(1, "%s\n", text); 19713652Ssam syslog(text); 19817835Sralph return SUCCESS; 19913652Ssam } 20013652Ssam 20125133Sbloom #if !defined(BSD4_2) && !defined(USG) 20225133Sbloom /* call ultouch every TC calls to either grdblk or gwrblk */ 20313652Ssam #define TC 20 20413652Ssam static int tc = TC; 20525133Sbloom #endif !BSD4_2 && !USG 20613652Ssam 20717835Sralph /*ARGSUSED*/ 20813652Ssam grdblk(blk, len, fn) 20913652Ssam register int len; 21013652Ssam char *blk; 21113652Ssam { 21213652Ssam register int i, ret; 21313652Ssam 21425133Sbloom #if !defined(BSD4_2) && !defined(USG) 21517835Sralph /* call ultouch occasionally */ 21613652Ssam if (--tc < 0) { 21713652Ssam tc = TC; 21813652Ssam ultouch(); 21913652Ssam } 22025133Sbloom #endif !BSD4_2 && !USG 22113652Ssam for (i = 0; i < len; i += ret) { 22217835Sralph ret = pkread(Pk, blk, len - i); 22313652Ssam if (ret < 0) 22417835Sralph return FAIL; 22513652Ssam blk += ret; 22613652Ssam if (ret == 0) 22717835Sralph return i; 22813652Ssam } 22917835Sralph return i; 23013652Ssam } 23113652Ssam 23217835Sralph /*ARGSUSED*/ 23313652Ssam gwrblk(blk, len, fn) 23413652Ssam register char *blk; 23513652Ssam { 23625133Sbloom #if !defined(BSD4_2) && !defined(USG) 23725133Sbloom /* call ultouch occasionally */ 23813652Ssam if (--tc < 0) { 23913652Ssam tc = TC; 24013652Ssam ultouch(); 24113652Ssam } 24225133Sbloom #endif !BSD4_2 && !USG 24325133Sbloom return pkwrite(Pk, blk, len); 24413652Ssam } 245