Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!seismo!uwvax!astroatc!prairie!dan From: dan@prairie.UUCP (Daniel M. Frank) Newsgroups: net.sources Subject: (unauthorized) zmodem patch Message-ID: <266@prairie.UUCP> Date: Mon, 27-Oct-86 11:19:11 EST Article-I.D.: prairie.266 Posted: Mon Oct 27 11:19:11 1986 Date-Received: Mon, 27-Oct-86 22:26:44 EST Reply-To: dan@prairie.UUCP (Daniel M. Frank) Distribution: world Organization: Prairie Computing, Madison, Wisconsin Lines: 157 Keywords: reverse channel, SVR2 The following patch fixes a problem I've been having with sz under System V Release 2. Seems that since SVR2 doesn't have FIONREAD, sz tells the receiver to use ^C interruption on error. Unfortunately, if you are the originator, the tty is probably not the controlling terminal, thus the signal has nowhere to go, and sz never notices there is a transmission problem until it finishes sending the file. The solution is a hack that uses SVR2 non-blocking I/O to check the reverse channel, and saves the character it finds waiting, if any. I've wrung this out, and it seems to work quite well. This is an unauthorized patch; I've mailed it to Chuck, and it awaits his judgement on whether it will become official. Use `patch' to install these changes, then compile sz with -DSVR2. No changes are necessary to rz. *** rbsb.c.00 Sun Oct 26 19:10:13 1986 --- rbsb.c Mon Oct 27 00:05:49 1986 *************** *** 219,224 return ((int) lf); } #endif #ifdef CRCTABLE /* crctab calculated by Mark G. Mendel, Network Systems Corporation */ --- 219,243 ----- return ((int) lf); } #endif + #ifdef SVR2 + #define READCHECK + #include + + char checked = '\0' ; + /* + * Nonblocking I/O is a bit different in System V, Release 2 + */ + rdchk(f) + { + int lf, savestat = fcntl(f, F_GETFL) ; + + fcntl(f, F_SETFL, savestat | O_NDELAY) ; + lf = read(f, &checked, 1) ; + fcntl(f, F_SETFL, savestat) ; + return(lf) ; + } + #endif + #ifdef CRCTABLE /* crctab calculated by Mark G. Mendel, Network Systems Corporation */ *** sz.c.00 Mon Oct 27 00:06:02 1986 --- sz.c Mon Oct 27 00:25:52 1986 *************** *** 6,11 * sz.c By Chuck Forsberg * * cc -O sz.c -o sz USG (SYS III/V) Unix * cc -O -DV7 sz.c -o sz Unix Version 7, 2.8 - 4.3 BSD * * define CRCTABLE to use table driven CRC --- 6,13 ----- * sz.c By Chuck Forsberg * * cc -O sz.c -o sz USG (SYS III/V) Unix + * cc -O -DSVR2 sz.c -o sz Sys V Release 2 with non-blocking input + * Define to allow reverse channel checking * cc -O -DV7 sz.c -o sz Unix Version 7, 2.8 - 4.3 BSD * * define CRCTABLE to use table driven CRC *************** *** 1069,1074 tcount += strlen(qbf); #ifdef READCHECK while (rdchk(iofd)) { switch (readline(1)) { case CAN: case ZPAD: --- 1071,1079 ----- tcount += strlen(qbf); #ifdef READCHECK while (rdchk(iofd)) { + #ifdef SVR2 + switch (checked) { + #else switch (readline(1)) { #endif case CAN: *************** *** 1070,1075 #ifdef READCHECK while (rdchk(iofd)) { switch (readline(1)) { case CAN: case ZPAD: #ifdef TCFLSH --- 1075,1081 ----- switch (checked) { #else switch (readline(1)) { + #endif case CAN: case ZPAD: #ifdef TCFLSH *************** *** 1119,1124 */ fflush(stdout); while (rdchk(iofd)) { switch (readline(1)) { case CAN: case ZPAD: --- 1125,1133 ----- */ fflush(stdout); while (rdchk(iofd)) { + #ifdef SVR2 + switch (checked) { + #else switch (readline(1)) { #endif case CAN: *************** *** 1120,1125 fflush(stdout); while (rdchk(iofd)) { switch (readline(1)) { case CAN: case ZPAD: #ifdef TCFLSH --- 1129,1135 ----- switch (checked) { #else switch (readline(1)) { + #endif case CAN: case ZPAD: #ifdef TCFLSH -- Dan Frank uucp: ... uwvax!prairie!dan arpa: dan%caseus@spool.wisc.edu