|
|
1.1 ! root 1: /* %W% ! 2: */ ! 3: #include "uucp.h" ! 4: VERSION(%W%); ! 5: ! 6: #ifdef DATAKIT ! 7: #include <dk.h> ! 8: ! 9: #define XBUFSIZ 1024 ! 10: time_t time(); ! 11: static jmp_buf Dfailbuf; ! 12: ! 13: /* ! 14: * Datakit protocol ! 15: */ ! 16: static dalarm() {longjmp(Dfailbuf);} ! 17: static int (*dsig)(); ! 18: #ifndef V8 ! 19: static short dkrmode[3] = { DKR_BLOCK, 0, 0 }; ! 20: static short dkeof[3] = { 106, 0, 0 }; /* End of File signal */ ! 21: #endif ! 22: ! 23: /* ! 24: * turn on protocol ! 25: */ ! 26: dturnon() ! 27: { ! 28: ! 29: dsig=signal(SIGALRM, dalarm); ! 30: #ifndef V8 ! 31: if(ioctl(Ofn, DIOCRMODE, dkrmode) < 0) { ! 32: int ret; extern int errno; ! 33: ret=ioctl(Ofn, DIOCRMODE, dkrmode); ! 34: DEBUG(4, "dturnon: ret=%d, ", ret); ! 35: DEBUG(4, "Ofn=%d, ", Ofn); ! 36: DEBUG(4, "errno=%d\n", errno); ! 37: return(-1); ! 38: } ! 39: #endif !V8 ! 40: return(0); ! 41: } ! 42: dturnoff() ! 43: { ! 44: (void) signal(SIGALRM, dsig); ! 45: return(0); ! 46: } ! 47: ! 48: /* ! 49: * write message across Datakit link ! 50: * type -> message type ! 51: * str -> message body (ascii string) ! 52: * fn -> Datakit file descriptor ! 53: * return ! 54: * SUCCESS -> message sent ! 55: * FAIL -> write failed ! 56: */ ! 57: dwrmsg(type, str, fn) ! 58: register char *str; ! 59: int fn; ! 60: char type; ! 61: { ! 62: register char *s; ! 63: char bufr[XBUFSIZ]; ! 64: ! 65: bufr[0] = type; ! 66: s = &bufr[1]; ! 67: while (*str) ! 68: *s++ = *str++; ! 69: *s = '\0'; ! 70: if (*(--s) == '\n') ! 71: *s = '\0'; ! 72: return(write(fn, bufr, (unsigned) strlen(bufr) + 1) < 0 ? FAIL : SUCCESS); ! 73: } ! 74: ! 75: /* ! 76: * read message from Datakit link ! 77: * str -> message buffer ! 78: * fn -> Datakit file descriptor ! 79: * return ! 80: * FAIL -> send timed out ! 81: * SUCCESS -> ok message in str ! 82: */ ! 83: drdmsg(str, fn) ! 84: register char *str; ! 85: { ! 86: ! 87: register int len; ! 88: ! 89: if(setjmp(Dfailbuf)) ! 90: return(FAIL); ! 91: ! 92: (void) alarm(60); ! 93: for (;;) { ! 94: if( (len = read(fn, str, XBUFSIZ)) <= 0) { ! 95: (void) alarm(0); ! 96: return(FAIL); ! 97: } ! 98: str += len; ! 99: if (*(str - 1) == '\0') ! 100: break; ! 101: } ! 102: (void) alarm(0); ! 103: return(SUCCESS); ! 104: } ! 105: ! 106: /* ! 107: * read data from file fp1 and write ! 108: * on Datakit link ! 109: * fp1 -> file descriptor ! 110: * fn -> Datakit descriptor ! 111: * returns: ! 112: * FAIL ->failure in Datakit link ! 113: * SUCCESS -> ok ! 114: */ ! 115: dwrdata(fp1, fn) ! 116: register FILE *fp1; ! 117: { ! 118: register int len, ret; ! 119: long bytes; ! 120: char bufr[XBUFSIZ]; ! 121: char text[128]; ! 122: time_t ticks; ! 123: ! 124: bytes = 0L; ! 125: (void) millitick(); /* set msec timer */ ! 126: while ((len = fread(bufr, sizeof (char), XBUFSIZ, fp1)) > 0) { ! 127: bytes += len; ! 128: ret = write(fn, bufr, (unsigned) len); ! 129: if (ret != len) { ! 130: return(FAIL); ! 131: } ! 132: if (len != XBUFSIZ) ! 133: break; ! 134: } ! 135: #ifndef V8 ! 136: ioctl(fn, DIOCXCTL, dkeof); ! 137: #endif ! 138: ret = write(fn, bufr, (unsigned) 0); ! 139: ticks = millitick(); ! 140: (void) sprintf(text, "-> %ld / %ld.%.3d secs", ! 141: bytes, ticks / 1000, ticks % 1000); ! 142: DEBUG(4, "%s\n", text); ! 143: syslog(text); ! 144: return(SUCCESS); ! 145: } ! 146: ! 147: /* ! 148: * read data from Datakit link and ! 149: * write into file ! 150: * fp2 -> file descriptor ! 151: * fn -> Datakit descriptor ! 152: * returns: ! 153: * SUCCESS -> ok ! 154: * FAIL -> failure on Datakit link ! 155: */ ! 156: drddata(fn, fp2) ! 157: register FILE *fp2; ! 158: { ! 159: register int len; ! 160: long bytes; ! 161: char text[128]; ! 162: char bufr[XBUFSIZ]; ! 163: time_t ticks; ! 164: ! 165: bytes = 0L; ! 166: (void) millitick(); /* set msec timer */ ! 167: for (;;) { ! 168: len = drdblk(bufr, XBUFSIZ, fn); ! 169: if (len < 0) { ! 170: return(FAIL); ! 171: } ! 172: bytes += len; ! 173: fwrite(bufr, sizeof (char), len, fp2); ! 174: if (len < XBUFSIZ) ! 175: break; ! 176: } ! 177: ticks = millitick(); ! 178: (void) sprintf(text, "<- %ld / %ld.%.3d secs", ! 179: bytes, ticks / 1000, ticks % 1000); ! 180: DEBUG(4, "%s\n", text); ! 181: syslog(text); ! 182: return(SUCCESS); ! 183: } ! 184: ! 185: /* ! 186: * read block from Datakit link ! 187: * reads are timed ! 188: * blk -> address of buffer ! 189: * len -> size to read ! 190: * fn -> Datakit descriptor ! 191: * returns: ! 192: * FAIL -> link error timeout on link ! 193: * i -> # of bytes read ! 194: */ ! 195: drdblk(blk, len, fn) ! 196: register char *blk; ! 197: { ! 198: register int i, ret; ! 199: ! 200: if(setjmp(Dfailbuf)) ! 201: return(FAIL); ! 202: ! 203: for (i = 0; i < len; i += ret) { ! 204: (void) alarm(60); ! 205: if ((ret = read(fn, blk, (unsigned) len - i)) < 0) { ! 206: (void) alarm(0); ! 207: return(FAIL); ! 208: } ! 209: blk += ret; ! 210: if (ret == 0) /* zero length block contains only EOF signal */ ! 211: break; ! 212: } ! 213: (void) alarm(0); ! 214: return(i); ! 215: } ! 216: #endif DATAKIT
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.