1 #ifndef lint 2 static char sccsid[] = "@(#)gio.c 5.1 (Berkeley) 07/02/83"; 3 #endif 4 5 #define USER 1 6 #include "pk.p" 7 #include <sys/types.h> 8 #include "pk.h" 9 #include <setjmp.h> 10 #include "uucp.h" 11 12 extern time_t time(); 13 14 15 jmp_buf Failbuf; 16 17 struct pack *Pk; 18 19 pkfail() 20 { 21 longjmp(Failbuf, 1); 22 } 23 24 gturnon() 25 { 26 int ret; 27 struct pack *pkopen(); 28 if (setjmp(Failbuf)) 29 return(FAIL); 30 if (Pkdrvon) { 31 ret = pkon(Ofn, PACKSIZE); 32 DEBUG(4, "pkon - %d ", ret); 33 DEBUG(4, "Ofn - %d\n", Ofn); 34 if (ret <= 0) 35 return(FAIL); 36 } 37 else { 38 if (Debug > 4) 39 pkdebug = 1; 40 Pk = pkopen(Ifn, Ofn); 41 if ((int) Pk == NULL) 42 return(FAIL); 43 } 44 return(0); 45 } 46 47 48 gturnoff() 49 { 50 if(setjmp(Failbuf)) 51 return(FAIL); 52 if (Pkdrvon) 53 pkoff(Ofn); 54 else 55 pkclose(Pk); 56 return(0); 57 } 58 59 60 gwrmsg(type, str, fn) 61 char type; 62 register char *str; 63 { 64 char bufr[BUFSIZ]; 65 register char *s; 66 int len, i; 67 68 if(setjmp(Failbuf)) 69 return(FAIL); 70 bufr[0] = type; 71 s = &bufr[1]; 72 while (*str) 73 *s++ = *str++; 74 *s = '\0'; 75 if (*(--s) == '\n') 76 *s = '\0'; 77 len = strlen(bufr) + 1; 78 if ((i = len % PACKSIZE)) { 79 len = len + PACKSIZE - i; 80 bufr[len - 1] = '\0'; 81 } 82 gwrblk(bufr, len, fn); 83 return(0); 84 } 85 86 87 grdmsg(str, fn) 88 register char *str; 89 { 90 unsigned len; 91 92 if(setjmp(Failbuf)) 93 return(FAIL); 94 for (;;) { 95 if (Pkdrvon) 96 len = read(fn, str, PACKSIZE); 97 else 98 len = pkread(Pk, str, PACKSIZE); 99 if (len == 0) 100 continue; 101 str += len; 102 if (*(str - 1) == '\0') 103 break; 104 } 105 return(0); 106 } 107 108 109 gwrdata(fp1, fn) 110 FILE *fp1; 111 { 112 char bufr[BUFSIZ]; 113 register int len; 114 int ret; 115 time_t t1, t2; 116 long bytes; 117 char text[BUFSIZ]; 118 119 if(setjmp(Failbuf)) 120 return(FAIL); 121 bytes = 0L; 122 time(&t1); 123 while ((len = fread(bufr, sizeof (char), BUFSIZ, fp1)) > 0) { 124 bytes += len; 125 ret = gwrblk(bufr, len, fn); 126 if (ret != len) { 127 return(FAIL); 128 } 129 if (len != BUFSIZ) 130 break; 131 } 132 ret = gwrblk(bufr, 0, fn); 133 time(&t2); 134 sprintf(text, "sent data %ld bytes %ld secs", bytes, t2 - t1); 135 DEBUG(1, "%s\n", text); 136 syslog(text); 137 sysacct(bytes, t2 - t1); 138 return(0); 139 } 140 141 142 grddata(fn, fp2) 143 FILE *fp2; 144 { 145 register int len; 146 char bufr[BUFSIZ]; 147 time_t t1, t2; 148 long bytes; 149 char text[BUFSIZ]; 150 151 if(setjmp(Failbuf)) 152 return(FAIL); 153 bytes = 0L; 154 time(&t1); 155 for (;;) { 156 len = grdblk(bufr, BUFSIZ, fn); 157 if (len < 0) { 158 return(FAIL); 159 } 160 bytes += len; 161 /* ittvax!swatt: check return value of fwrite */ 162 if (fwrite(bufr, sizeof (char), len, fp2) != len) 163 return(FAIL); 164 if (len < BUFSIZ) 165 break; 166 } 167 time(&t2); 168 sprintf(text, "received data %ld bytes %ld secs", bytes, t2 - t1); 169 DEBUG(1, "%s\n", text); 170 syslog(text); 171 sysacct(bytes, t2 - t1); 172 return(0); 173 } 174 175 176 /* call ultouch every TC calls to either grdblk or gwrblk -- rti!trt */ 177 #define TC 20 178 static int tc = TC; 179 180 grdblk(blk, len, fn) 181 register int len; 182 char *blk; 183 { 184 register int i, ret; 185 186 /* call ultouch occasionally -- rti!trt */ 187 if (--tc < 0) { 188 tc = TC; 189 ultouch(); 190 } 191 for (i = 0; i < len; i += ret) { 192 if (Pkdrvon) 193 ret = read(fn, blk, len - i); 194 else 195 ret = pkread(Pk, blk, len - i); 196 if (ret < 0) 197 return(FAIL); 198 blk += ret; 199 if (ret == 0) 200 return(i); 201 } 202 return(i); 203 } 204 205 206 gwrblk(blk, len, fn) 207 register char *blk; 208 { 209 register int ret; 210 211 /* call ultouch occasionally -- rti!trt */ 212 if (--tc < 0) { 213 tc = TC; 214 ultouch(); 215 } 216 if (Pkdrvon) 217 ret = write(fn, blk, len); 218 else 219 ret = pkwrite(Pk, blk, len); 220 return(ret); 221 } 222