w8sdz@brl-smoke.ARPA (Keith B. Petersen ) (04/28/88)
Chuck Forsberg has just released Zmodem for Unix and VAX/VMS, dated 23-Apr-88. Since this program is used by many MSDOS users for downloading and uploading from/to mainframes, it is being posted to this newsgroup. Keith Petersen Arpa: W8SDZ@SIMTEL20.ARPA Uucp: {bellcore,decwrl,harvard,lll-crg,ucbvax,uw-beaver}!simtel20.arpa!w8sdz GEnie: W8SDZ ---- Cut Here and unpack ---- #!/bin/sh # shar: Shell Archiver (v1.18) # # This is part 1 of a four part archive. # this archive has been broken into four parts. # DO NOT combine them, unpack them in order # # Run the following text with /bin/sh to create: # Makefile # README # crc.1 # crc.c # crctab.c # gz # minirb.1 # minirb.c # ptest.sh # rbsb.c # rz.1 # rz.c # sz.1 # sz.c # vmodem.h # vrzsz.c # vvmodem.c # zm.c # zmodem.h # zupl.t # if test -r ._seq_ then echo "Must unpack archives in sequence!" next=`cat ._seq_`; echo "Please unpack part $next next" exit 1; fi if test -f Makefile; then echo "File Makefile exists"; else echo "x - extracting Makefile (Text)" sed 's/^X//' << 'SHAR_EOF' > Makefile && X# Makefile for Unix/Xenix rz and sz programs X# the makefile is not too well tested yet X Xnothing: X @echo X @echo "Please study the #ifdef's in crctab.c rbsb.c, rz.c and sz.c," X @echo "then type 'make system' where system is one of:" X @echo " sysvr3 SYSTEM 5.3 Unix with mkdir(2)" X @echo " sysv SYSTEM 3/5 Unix" X @echo " xenix Xenix" X @echo " x386 386 Xenix" X @echo " bsd Berkeley 4.x BSD, Ultrix, V7" X @echo X Xusenet: X shar -f /tmp/rzsz README Makefile zmodem.h zm.c sz.c rz.c rbsb.c \ X crc.c vmodem.h vvmodem.c vrzsz.c crctab.c minirb.c \ X *.1 gz ptest.sh zupl.t X Xshar: X shar -f /tmp/rzsz -m 2000000 README Makefile zmodem.h zm.c \ X vmodem.h vvmodem.c vrzsz.c sz.c rz.c crctab.c \ X crc.c rbsb.c minirb.c *.1 gz ptest.sh zupl.t X Xunixforum: shar X compress -b12 /tmp/rzsz.sh X Xarc: X rm -f /tmp/rzsz.arc X arc a /tmp/rzsz README Makefile zmodem.h zm.c sz.c rz.c \ X vmodem.h vvmodem.c vrzsz.c crctab.c rbsb.c \ X crc.c *.1 gz ptest.sh zupl.t minirb.c X chmod og-w /tmp/rzsz.arc X mv /tmp/rzsz.arc /t/yam X Xzoo: X rm -f /tmp/rzsz.zoo X zoo a /tmp/rzsz README Makefile zmodem.h zm.c sz.c rz.c \ X vmodem.h vvmodem.c vrzsz.c crctab.c rbsb.c *.1 \ X crc.c gz ptest.sh zupl.t minirb.c X chmod og-w /tmp/rzsz.zoo X mv /tmp/rzsz.zoo /t/yam X X.PRECIOUS:rz sz X Xxenix: X cc -M0 -Ox -K -i -DNFGVMIN -DREADCHECK sz.c -lx -o sz X size sz X -ln sz sb X -ln sz sx X cc -M0 -Ox -K -i -DMD rz.c -o rz X size rz X -ln rz rb X -ln rz rx X Xx386: X cc -Ox -DMD rz.c -o rz X size rz X -ln rz rb X -ln rz rx X cc -Ox -DNFGVMIN -DREADCHECK sz.c -lx -o sz X size sz X -ln sz sb X -ln sz sx X Xsysv: X cc -O -DMD rz.c -o rz X size rz X -ln rz rb X -ln rz rx X cc -DSV -O -DNFGVMIN sz.c -o sz X size sz X -ln sz sb X -ln sz sx X Xsysvr3: X cc -O -DMD=2 rz.c -o rz X size rz X -ln rz rb X -ln rz rx X cc -DSV -O -DNFGVMIN sz.c -o sz X size sz X -ln sz sb X -ln sz sx X Xbsd: X cc -DMD=2 -Dstrchr=index -DV7 -O rz.c -o rz X size rz X -ln rz rb X -ln rz rx X cc -DV7 -O -DNFGVMIN sz.c -o sz X size sz X -ln sz sb X -ln sz sx X Xsz: nothing Xsb: nothing Xrz: nothing Xrb: nothing SHAR_EOF chmod 0644 Makefile || echo "restore of Makefile fails" fi if test -f README; then echo "File README exists"; else echo "x - extracting README (Text)" sed 's/^X//' << 'SHAR_EOF' > README && XNew for April 1988: VMS C flavors of rz and sz especially for tired Xfrog stompers. The following performance log entries give the story! X X 2400 Z splat.arc 3968 220 18 0 0 0 512 30 (rz) 0 ccvax off X 2400 K splat.arc 3968 110 36 0 0 0 89 -1 get -1 ccvax off X XThe contents of RZSZ.ARC are designed to be uploaded to a Unix or Xenix Xsystem by ZCOMM or Professional-YAM using the supplied zupl.t script. XConnect to your Unix/Xenix system, select an empty directory, and then Xgive the YAM/ZCOMM command: "source zupl.t". This will upload minirb.c, Xcompile it, and then use minirb to upload the rz/sz files. X XOnce these files are on your Unix system, you can type "make". XThe Makefile will list the various systems it knows how to Xcompile the programs for, and the command to do so (e.g., "make bsd"). X XThe Makefile is self explanatory; just say "make". X XNaturally, rz and sz work best with comm programs that seamlessly Xsupport ZMODEM command and file AutoDownload (Pro-YAM and ZCOMM). X XThe "DSZ" shareware program allows ZMODEM file transfers with Xtraditional DOS comm programs, but it must be called manually. X(The computer should do that for you!) DSZ provides a "mini term Xfunction" that supports ZMODEM AutoDownload. DSZ (part of DSZ.ARC) and Xthe ZMODEM protocol description (YZMODEM.ARC) are on TeleGodzilla and Xother fine bulletin boards. X XChuck Forsberg WA7KGX Author of Pro-YAM communications Tools for PCDOS and Unix X...!tektronix!reed!omen!caf Omen Technology Inc "The High Reliability Software" X 17505-V Northwest Sauvie Island Road Portland OR 97231 Voice: 503-621-3406 XTeleGodzilla BBS: 621-3746 2400/1200 CIS:70007,2304 Genie:CAF Source:TCE022 X omen Any ACU 1200 1-503-621-3746 se:--se: link ord: Giznoid in:--in: uucp X omen!/usr/spool/uucppublic/FILES lists all uucp-able files, updated hourly SHAR_EOF chmod 0644 README || echo "restore of README fails" fi if test -f crc.1; then echo "File crc.1 exists"; else echo "x - extracting crc.1 (Text)" sed 's/^X//' << 'SHAR_EOF' > crc.1 && X.TH CRC 1 OMEN X.SH NAME Xcrc \- checksum files X.SH SYNOPSIS X.B crc Xfile ... X.SH DESCRIPTION XFor each file, X.I crc\^ Xcalculates and prints a 32-bit CRC, Xthe byte count, and the file name. XIt is typically used to validate files transferred between Xdifferent systems, and is useful in detecting subtle disk corruption. X.I Crc\^ Xuses a checksum compatible with the XDOS Xversion of crc, Xas well as the "crc" command in ZCOMM and Professional-YAM X(high reliability communications programs). X XThe 32-bit CRC used is the frame Xcheck sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 Xand FED-STD-1003, the U.S. versions of CCITT's X.25 link-level Xprotocol). X X32 bit CRC code courtesy Gary S. Brown. X.SH BUGS XAlthough most unlikely, Xfiles with different data may still produce the same crc value. X.SH "SEE ALSO" Xchek(1), tocpm(1), sum(1), wc(1). SHAR_EOF chmod 0644 crc.1 || echo "restore of crc.1 fails" fi if test -f crc.c; then echo "File crc.c exists"; else echo "x - extracting crc.c (Text)" sed 's/^X//' << 'SHAR_EOF' > crc.c && X/*% cc -O -K -dos % -o crc.exe X*/ X X/* X * Crc - 32 BIT ANSI X3.66 CRC checksum files X */ X#include <stdio.h> X#define OK 0 X#define ERROR (-1) X#define LINT_ARGS X X/**********************************************************************\ X|* *| X|* Demonstration program to compute the 32-bit CRC used as the frame *| X|* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 *| X|* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level *| X|* protocol). The 32-bit FCS was added via the Federal Register, *| X|* 1 June 1982, p.23798. I presume but don't know for certain that *| X|* this polynomial is or will be included in CCITT V.41, which *| X|* defines the 16-bit CRC (often called CRC-CCITT) polynomial. FIPS *| X|* PUB 78 says that the 32-bit FCS reduces otherwise undetected *| X|* errors by a factor of 10^-5 over 16-bit FCS. *| X|* *| X\**********************************************************************/ X X/* Need an unsigned type capable of holding 32 bits; */ Xtypedef unsigned long int UNS_32_BITS; X X/* X * Copyright (C) 1986 Gary S. Brown. You may use this program, or X * code or tables extracted from it, as desired without restriction. X */ X/* First, the polynomial itself and its table of feedback terms. The */ X/* polynomial is */ X/* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */ X/* Note that we take it "backwards" and put the highest-order term in */ X/* the lowest-order bit. The X^32 term is "implied"; the LSB is the */ X/* X^31 term, etc. The X^0 term (usually shown as "+1") results in */ X/* the MSB being 1. */ X X/* Note that the usual hardware shift register implementation, which */ X/* is what we're using (we're merely optimizing it by doing eight-bit */ X/* chunks at a time) shifts bits into the lowest-order term. In our */ X/* implementation, that means shifting towards the right. Why do we */ X/* do it this way? Because the calculated CRC must be transmitted in */ X/* order from highest-order term to lowest-order term. UARTs transmit */ X/* characters in order from LSB to MSB. By storing the CRC this way, */ X/* we hand it to the UART in the order low-byte to high-byte; the UART */ X/* sends each low-bit to hight-bit; and the result is transmission bit */ X/* by bit from highest- to lowest-order term without requiring any bit */ X/* shuffling on our part. Reception works similarly. */ X X/* The feedback terms table consists of 256, 32-bit entries. Notes: */ X/* */ X/* 1. The table can be generated at runtime if desired; code to do so */ X/* is shown later. It might not be obvious, but the feedback */ X/* terms simply represent the results of eight shift/xor opera- */ X/* tions for all combinations of data and CRC register values. */ X/* */ X/* 2. The CRC accumulation logic is the same for all CRC polynomials, */ X/* be they sixteen or thirty-two bits wide. You simply choose the */ X/* appropriate table. Alternatively, because the table can be */ X/* generated at runtime, you can start by generating the table for */ X/* the polynomial in question and use exactly the same "updcrc", */ X/* if your application needn't simultaneously handle two CRC */ X/* polynomials. (Note, however, that XMODEM is strange.) */ X/* */ X/* 3. For 16-bit CRCs, the table entries need be only 16 bits wide; */ X/* of course, 32-bit entries work OK if the high 16 bits are zero. */ X/* */ X/* 4. The values must be right-shifted by eight bits by the "updcrc" */ X/* logic; the shift must be unsigned (bring in zeroes). On some */ X/* hardware you could probably optimize the shift in assembler by */ X/* using byte-swap instructions. */ X Xstatic UNS_32_BITS crc_32_tab[] = { /* CRC polynomial 0xedb88320 */ X0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, X0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, X0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, X0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, X0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, X0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, X0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, X0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, X0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, X0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, X0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, X0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, X0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, X0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, X0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, X0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, X0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, X0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, X0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, X0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, X0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, X0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, X0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, X0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, X0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, X0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, X0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, X0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, X0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, X0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, X0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, X0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d X}; X X#define UPDC32(octet, crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8)) X Xmain(argc, argp) Xchar **argp; X{ X register errors = 0; X X while( --argc > 0) X errors |= crc32file( *++argp); X exit(errors != 0); X} X Xcrc32file(name) Xchar *name; X{ X register FILE *fin; X register unsigned long oldcrc32; X register unsigned long crc32; X register unsigned long oldcrc; X register c; X register long charcnt; X X oldcrc32 = 0xFFFFFFFF; charcnt = 0; X#ifdef M_I86SM X if ((fin=fopen(name, "rb"))==NULL) X#else X if ((fin=fopen(name, "r"))==NULL) X#endif X { X perror(name); X return ERROR; X } X while ((c=getc(fin))!=EOF) { X ++charcnt; X oldcrc32 = UPDC32(c, oldcrc32); X } X X if (ferror(fin)) { X perror(name); X charcnt = -1; X } X fclose(fin); X X crc32 = oldcrc32; oldcrc = oldcrc32 = ~oldcrc32; X X/* X crc32 = UPDC32((oldcrc32 & 0377), crc32); oldcrc32 >>=8; X crc32 = UPDC32((oldcrc32 & 0377), crc32); oldcrc32 >>=8; X crc32 = UPDC32((oldcrc32 & 0377), crc32); oldcrc32 >>=8; X crc32 = UPDC32((oldcrc32 & 0377), crc32); oldcrc32 >>=8; X printf("%08lX ", crc32); X*/ X X printf("%08lX %7ld %s\n", oldcrc, charcnt, name); X X return OK; X} X SHAR_EOF chmod 0644 crc.c || echo "restore of crc.c fails" fi if test -f crctab.c; then echo "File crctab.c exists"; else echo "x - extracting crctab.c (Text)" sed 's/^X//' << 'SHAR_EOF' > crctab.c && X/* X * Crc calculation stuff X */ X X/* crctab calculated by Mark G. Mendel, Network Systems Corporation */ Xstatic unsigned short crctab[256] = { X 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, X 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, X 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, X 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, X 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, X 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, X 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, X 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, X 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, X 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, X 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, X 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, X 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, X 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, X 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, X 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, X 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, X 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, X 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, X 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, X 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, X 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, X 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, X 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, X 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, X 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, X 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, X 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, X 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, X 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, X 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, X 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 X}; X X/* X * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell. X * NOTE: First srgument must be in range 0 to 255. X * Second argument is referenced twice. X * X * Programmers may incorporate any or all code into their programs, X * giving proper credit within the source. Publication of the X * source routines is permitted so long as proper credit is given X * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg, X * Omen Technology. X */ X X#define updcrc(cp, crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp) X X/* X * Copyright (C) 1986 Gary S. Brown. You may use this program, or X * code or tables extracted from it, as desired without restriction. X */ X X/* First, the polynomial itself and its table of feedback terms. The */ X/* polynomial is */ X/* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */ X/* Note that we take it "backwards" and put the highest-order term in */ X/* the lowest-order bit. The X^32 term is "implied"; the LSB is the */ X/* X^31 term, etc. The X^0 term (usually shown as "+1") results in */ X/* the MSB being 1. */ X X/* Note that the usual hardware shift register implementation, which */ X/* is what we're using (we're merely optimizing it by doing eight-bit */ X/* chunks at a time) shifts bits into the lowest-order term. In our */ X/* implementation, that means shifting towards the right. Why do we */ X/* do it this way? Because the calculated CRC must be transmitted in */ X/* order from highest-order term to lowest-order term. UARTs transmit */ X/* characters in order from LSB to MSB. By storing the CRC this way, */ X/* we hand it to the UART in the order low-byte to high-byte; the UART */ X/* sends each low-bit to hight-bit; and the result is transmission bit */ X/* by bit from highest- to lowest-order term without requiring any bit */ X/* shuffling on our part. Reception works similarly. */ X X/* The feedback terms table consists of 256, 32-bit entries. Notes: */ X/* */ X/* The table can be generated at runtime if desired; code to do so */ X/* is shown later. It might not be obvious, but the feedback */ X/* terms simply represent the results of eight shift/xor opera- */ X/* tions for all combinations of data and CRC register values. */ X/* */ X/* The values must be right-shifted by eight bits by the "updcrc" */ X/* logic; the shift must be unsigned (bring in zeroes). On some */ X/* hardware you could probably optimize the shift in assembler by */ X/* using byte-swap instructions. */ X Xstatic long cr3tab[] = { /* CRC polynomial 0xedb88320 */ X0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, X0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, X0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, X0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, X0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, X0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, X0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, X0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, X0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, X0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, X0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, X0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, X0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, X0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, X0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, X0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, X0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, X0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, X0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, X0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, X0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, X0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, X0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, X0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, X0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, X0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, X0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, X0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, X0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, X0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, X0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, X0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d X}; X X#ifdef NFGM Xlong XUPDC32(b, c) Xlong c; X{ X return (cr3tab[((int)c ^ b) & 0xff] ^ ((c >> 8) & 0x00FFFFFF)); X} X X#else X X#define UPDC32(b, c) (cr3tab[((int)c ^ b) & 0xff] ^ ((c >> 8) & 0x00FFFFFF)) X#endif X X/* End of crctab.c */ SHAR_EOF chmod 0644 crctab.c || echo "restore of crctab.c fails" fi if test -f gz; then echo "File gz exists"; else echo "x - extracting gz (Text)" sed 's/^X//' << 'SHAR_EOF' > gz && Xexec sz -c "sz $*" SHAR_EOF chmod 0644 gz || echo "restore of gz fails" fi if test -f minirb.1; then echo "File minirb.1 exists"; else echo "x - extracting minirb.1 (Text)" sed 's/^X//' << 'SHAR_EOF' > minirb.1 && X'\" Revision Level X'\" Last Delta 09-08-87 X.TH MINIRB 1 OMEN X.SH NAME Xminirb \- Bootstrap YMODEM Batch file receive X.SH SYNOPSIS X.B minirb X.SH DESCRIPTION X.I Minirb Xreceives one or more files with YMODEM batch file transfer protocol. X.I Minirb Xwas developed for use as a bootstrap to simplify uploading of the longer X.I rz Xand X.I sz Xprograms, such as are contained in the X.I rzsz.zoo X"zoo" archive or the X.I rzsz.sh Xshell archive. X.SH SEE ALSO XYMODEM.DOC, XProfessional-YAM manual, Xsz(omen) X.SH NOTES XThe source file X.I minirb.c Xhas been ruthlessly pruned X(4k, 175 lines) Xto simplify uploading without benefit of Xan error correcting file transfer protocol. XDo not reformat or add tabs to the source file Xas this would complicate uploading. X XPlease read the uploading suggestions in the chapter X.I "File Transfer Basics" Xin the Professional-YAM or ZCOMM user's manual. X X.I Minirb Xuses 8 bit checksum which may not be compatible with some programs Xclaiming to support YMODEM batch transfers. X X.I Minirb Xuses the XYMODEM header Xfile length information Xto avoid storing extraneous characters. X.I Minirb Xdeletes carriage returns and CPMEOF (^Z) characters Xencountered in uploaded files. X X.I Minirb Xcalls stty(1) to set and reset raw tty mode. SHAR_EOF chmod 0644 minirb.1 || echo "restore of minirb.1 fails" fi if test -f minirb.c; then echo "File minirb.c exists"; else echo "x - extracting minirb.c (Text)" sed 's/^X//' << 'SHAR_EOF' > minirb.c && X/* X * minirb.c By Chuck Forsberg Omen Technology INC X * "The High Reliability Communications Software" X * X * A bootstrap program for Unix to receive files from computers running X * YMODEM Batch (Professional-YAM, PowerCom, ZCOMM, etc.). X * X * Minirb uses system(3) to call stty, avoiding system dependent code. X * program strips CR and CPMEOF (^Z) characters (see putsec()). X * Please refer to rz.c for comments, etc. X */ Xchar * Version = "minirb 2.00 05-25-87"; X X#include <stdio.h> X#include <signal.h> X#include <setjmp.h> X X#define OK 0 X#define FALSE 0 X#define TRUE 1 X#define ERROR (-1) X#define CAN ('X'&037) X#define SOH 1 X#define STX 2 X#define EOT 4 X#define ACK 6 X#define NAK 025 X#define TIMEOUT (-2) X#define RETRYMAX 9 X#define WCEOT (-10) X XFILE *fout; Xlong Bytesleft; Xint Blklen; Xchar secbuf[1024]; Xchar linbuf[1024]; Xint Lleft=0; Xjmp_buf tohere; X Xalrm() { longjmp(tohere, -1); } X Xbibi(n) { X canit(); mode(0); X fprintf(stderr, "minirb: caught signal %d; exiting", n); X exit(128+n); X} X Xmode(n) { X if (n) system("stty raw -echo"); X else system("stty echo -raw"); X} X Xmain() { X mode(1); X if (signal(SIGINT, bibi) == SIG_IGN) { X signal(SIGINT, SIG_IGN); signal(SIGKILL, SIG_IGN); X } else { X signal(SIGINT, bibi); signal(SIGKILL, bibi); X } X printf("minirb: Now send file(s) with \042sb file ...\042 command\r\n"); X X if (wcreceive()==ERROR) X canit(); X mode(0); exit(0); X} X Xwcreceive() { X for (;;) { X if (wcrxpn(secbuf) == ERROR) break; X if (secbuf[0]==0) return OK; X if (procheader(secbuf)==ERROR || wcrx()==ERROR) break; X } X canit(); return ERROR; X} X X Xwcrxpn(rpn) char *rpn; { X register c; X X purgeline(); Xet_tu: X sendline(NAK); Lleft=0; X while ((c = wcgetsec(rpn, 100)) != 0) { X if (c == WCEOT) { sendline(ACK); Lleft=0; readline(1); goto et_tu; } X return ERROR; X } X sendline(ACK); return OK; X} X Xwcrx() { X register int sectnum, sectcurr, sendchar, cblklen; X X sectnum=0; sendchar=NAK; X for (;;) { X sendline(sendchar); Lleft=0; X sectcurr=wcgetsec(secbuf, 50); X if (sectcurr==(sectnum+1 & 0377)) { X sectnum++; cblklen = Bytesleft>Blklen ? Blklen:Bytesleft; X putsec(secbuf, cblklen); X if ((Bytesleft-=cblklen) < 0) Bytesleft = 0; X sendchar=ACK; X } X else if (sectcurr==(sectnum&0377)) sendchar=ACK; X else if (sectcurr==WCEOT) { X if (fclose(fout)==ERROR) return ERROR; X sendline(ACK); Lleft=0; return OK; X } X else if (sectcurr==ERROR) return ERROR; X else return ERROR; X } X} X Xwcgetsec(rxbuf, maxtime) char *rxbuf; int maxtime; { X register checksum, wcj, firstch; register char *p; int sectcurr, errors; X for (errors=0; errors<RETRYMAX; errors++) { X if ((firstch=readline(maxtime))==STX) { Blklen=1024; goto get2; } X if (firstch==SOH) { X Blklen=128; Xget2: X sectcurr=readline(1); checksum=0; X if ((sectcurr+(readline(1)))==0377) { X for (p=rxbuf,wcj=Blklen; --wcj>=0; ) { X if ((firstch=readline(1)) < 0) goto bilge; X checksum += (*p++ = firstch); X } X if ((firstch=readline(1)) < 0) goto bilge; X if (((checksum-firstch)&0377)==0) return sectcurr; X } X } X else if (firstch==EOT) return WCEOT; X else if (firstch==CAN) return ERROR; Xbilge: X while(readline(1)!=TIMEOUT) X ; X maxtime=40; sendline(NAK); Lleft=0; X } X canit(); return ERROR; X} X Xreadline(timeout) int timeout; { X register n; static char *cdq; X X if (--Lleft >= 0) return (*cdq++ & 0377); X n = timeout/10; X if (n < 2) n = 3; X if (setjmp(tohere)) { Lleft = 0; return TIMEOUT; } X signal(SIGALRM, alrm); alarm(n); X Lleft=read(0, cdq=linbuf, 1024); alarm(0); X if (Lleft < 1) return TIMEOUT; X --Lleft; return (*cdq++ & 0377); X} X Xpurgeline() { Lleft = 0; lseek(0, 0L, 2); } X X Xprocheader(name) char *name; { X register char *p; X X Bytesleft = 2000000000L; p = name + 1 + strlen(name); X if (*p) sscanf(p, "%ld", &Bytesleft); X if ((fout=fopen(name, "w")) == NULL) return ERROR; X return OK; X} X Xputsec(p, n) char *p; int n; X{ for (; --n>=0; ++p) if (*p != 015 && *p != 032) putc(*p, fout); } X Xsendline(c) { char d; d = c; write(1, &d, 1); } X Xchar canistr[] = { 24,24,24,24,24,24,24,24,0 }; X Xcanit() { printf(canistr); Lleft=0; } X X/* END of minirb.c */ X SHAR_EOF chmod 0644 minirb.c || echo "restore of minirb.c fails" fi if test -f ptest.sh; then echo "File ptest.sh exists"; else echo "x - extracting ptest.sh (Text)" sed 's/^X//' << 'SHAR_EOF' > ptest.sh && X#a short test for sz and rz using a named pipe - no modem used. X/etc/mknod fifo p Xsz <fifo /etc/motd |rz >fifo Xrm fifo SHAR_EOF chmod 0644 ptest.sh || echo "restore of ptest.sh fails" fi if test -f rbsb.c; then echo "File rbsb.c exists"; else echo "x - extracting rbsb.c (Text)" sed 's/^X//' << 'SHAR_EOF' > rbsb.c && X/* X * X * Rev 03-06-1988 X * This file contains Unix specific code for setting terminal modes, X * very little is specific to ZMODEM or YMODEM per se (that code is in X * sz.c and rz.c). The CRC-16 routines used by XMODEM, YMODEM, and ZMODEM X * are also in this file, a fast table driven macro version X * X * V7/BSD HACKERS: SEE NOTES UNDER mode(2) !!! X * X * This file is #included so the main file can set parameters such as HOWMANY. X * See the main files (rz.c/sz.c) for compile instructions. X */ X X#ifdef V7 X#include <sys/types.h> X#include <sys/stat.h> X#include <sgtty.h> X#define OS "V7/BSD" X#ifdef LLITOUT Xlong Locmode; /* Saved "local mode" for 4.x BSD "new driver" */ Xlong Locbit = LLITOUT; /* Bit SUPPOSED to disable output translations */ X#include <strings.h> X#endif X#endif X X#ifndef OS X#ifndef USG X#define USG X#endif X#endif X X#ifdef USG X#include <sys/types.h> X#include <sys/stat.h> X#include <termio.h> X#include <sys/ioctl.h> X#define OS "SYS III/V" X#define MODE2OK X#include <string.h> X#endif X X#if HOWMANY > 255 XHowmany must be 255 or less X#endif X X/* X * return 1 iff stdout and stderr are different devices X * indicating this program operating with a modem on a X * different line X */ Xint Fromcu; /* Were called from cu or yam */ Xfrom_cu() X{ X struct stat a, b; X X fstat(1, &a); fstat(2, &b); X Fromcu = a.st_rdev != b.st_rdev; X return; X} Xcucheck() X{ X if (Fromcu) X fprintf(stderr,"Please read the manual page BUGS chapter!\r\n"); X} X X Xstruct { X unsigned baudr; X int speedcode; X} speeds[] = { X 110, B110, X 300, B300, X 600, B600, X 1200, B1200, X 2400, B2400, X 4800, B4800, X 9600, B9600, X 19200, EXTA, X 38400, EXTB, X 0, X}; X Xint Twostop; /* Use two stop bits */ X X X#ifndef READCHECK X#ifdef FIONREAD X#define READCHECK X/* X * Return non 0 iff something to read from io descriptor f X */ Xrdchk(f) X{ X static long lf; X X ioctl(f, FIONREAD, &lf); X return ((int) lf); X} X#endif X#ifdef SV X#define READCHECK X#include <fcntl.h> X Xchar checked = '\0' ; X/* X * Nonblocking I/O is a bit different in System V, Release 2 X */ Xrdchk(f) X{ X int lf, savestat; X X savestat = fcntl(f, F_GETFL) ; X fcntl(f, F_SETFL, savestat | O_NDELAY) ; X lf = read(f, &checked, 1) ; X fcntl(f, F_SETFL, savestat) ; X return(lf) ; X} X#endif X#endif X X Xstatic unsigned Xgetspeed(code) X{ X register n; X X for (n=0; speeds[n].baudr; ++n) X if (speeds[n].speedcode == code) X return speeds[n].baudr; X return 38400; /* Assume fifo if ioctl failed */ X} X X X X#ifdef ICANON Xstruct termio oldtty, tty; X#else Xstruct sgttyb oldtty, tty; Xstruct tchars oldtch, tch; X#endif X Xint iofd = 0; /* File descriptor for ioctls & reads */ X X/* X * mode(n) X * 3: save old tty stat, set raw mode with flow control X * 2: set XON/XOFF for sb/sz with ZMODEM or YMODEM-g X * 1: save old tty stat, set raw mode X * 0: restore original tty mode X */ Xmode(n) X{ X static did0 = FALSE; X X vfile("mode:%d", n); X switch(n) { X#ifdef USG X case 2: /* Un-raw mode used by sz, sb when -g detected */ X if(!did0) X (void) ioctl(iofd, TCGETA, &oldtty); X tty = oldtty; X X tty.c_iflag = BRKINT|IXON; X X tty.c_oflag = 0; /* Transparent output */ X X tty.c_cflag &= ~PARENB; /* Disable parity */ X tty.c_cflag |= CS8; /* Set character size = 8 */ X if (Twostop) X tty.c_cflag |= CSTOPB; /* Set two stop bits */ X X X#ifdef READCHECK X tty.c_lflag = Zmodem ? 0 : ISIG; X tty.c_cc[VINTR] = Zmodem ? -1:030; /* Interrupt char */ X#else X tty.c_lflag = ISIG; X tty.c_cc[VINTR] = Zmodem ? 03:030; /* Interrupt char */ X#endif X tty.c_cc[VQUIT] = -1; /* Quit char */ X#ifdef NFGVMIN X tty.c_cc[VMIN] = 1; X#else X tty.c_cc[VMIN] = 3; /* This many chars satisfies reads */ X#endif X tty.c_cc[VTIME] = 1; /* or in this many tenths of seconds */ X X (void) ioctl(iofd, TCSETAW, &tty); X did0 = TRUE; X return OK; X case 1: X case 3: X if(!did0) X (void) ioctl(iofd, TCGETA, &oldtty); X tty = oldtty; X X tty.c_iflag = n==3 ? (IGNBRK|IXOFF) : IGNBRK; X X /* No echo, crlf mapping, INTR, QUIT, delays, no erase/kill */ X tty.c_lflag &= ~(ECHO | ICANON | ISIG); X X tty.c_oflag = 0; /* Transparent output */ X X tty.c_cflag &= ~PARENB; /* Same baud rate, disable parity */ X tty.c_cflag |= CS8; /* Set character size = 8 */ X if (Twostop) X tty.c_cflag |= CSTOPB; /* Set two stop bits */ X#ifdef NFGVMIN X tty.c_cc[VMIN] = 1; /* This many chars satisfies reads */ X#else X tty.c_cc[VMIN] = HOWMANY; /* This many chars satisfies reads */ X#endif X tty.c_cc[VTIME] = 1; /* or in this many tenths of seconds */ X (void) ioctl(iofd, TCSETAW, &tty); X did0 = TRUE; X Baudrate = getspeed(tty.c_cflag & CBAUD); X return OK; X#endif X#ifdef V7 X /* X * NOTE: this should transmit all 8 bits and at the same time X * respond to XOFF/XON flow control. If no FIONREAD or other X * READCHECK alternative, also must respond to INTRRUPT char X * This doesn't work with V7. It should work with LLITOUT, X * but LLITOUT was broken on the machine I tried it on. X */ X case 2: /* Un-raw mode used by sz, sb when -g detected */ X if(!did0) { X ioctl(iofd, TIOCEXCL, 0); X ioctl(iofd, TIOCGETP, &oldtty); X ioctl(iofd, TIOCGETC, &oldtch); X#ifdef LLITOUT X ioctl(TIOCLGET, &Locmode); /* Get "local mode" */ X#endif X } X tty = oldtty; X tch = oldtch; X#ifdef READCHECK X tch.t_intrc = Zmodem ? -1:030; /* Interrupt char */ X#else X tch.t_intrc = Zmodem ? 03:030; /* Interrupt char */ X#endif X tty.sg_flags |= (ODDP|EVENP|CBREAK); X tty.sg_flags &= ~(ALLDELAY|CRMOD|ECHO|LCASE); X ioctl(iofd, TIOCSETP, &tty); X ioctl(iofd, TIOCSETC, &tch); X#ifdef LLITOUT X ioctl(TIOCLBIS, &Locbit); X#endif X bibi(99); /* un-raw doesn't work w/o lit out */ X did0 = TRUE; X return OK; X case 1: X case 3: X if(!did0) { X ioctl(iofd, TIOCEXCL, 0); X ioctl(iofd, TIOCGETP, &oldtty); X ioctl(iofd, TIOCGETC, &oldtch); X#ifdef LLITOUT X ioctl(TIOCLGET, &Locmode); /* Get "local mode" */ X#endif X } X tty = oldtty; X tty.sg_flags |= RAW; X tty.sg_flags &= ~ECHO; X ioctl(iofd, TIOCSETP, &tty); X did0 = TRUE; X Baudrate = getspeed(tty.sg_ospeed); X return OK; X#endif X case 0: X if(!did0) X return ERROR; X#ifdef USG X (void) ioctl(iofd, TCSBRK, 1); /* Wait for output to drain */ X (void) ioctl(iofd, TCFLSH, 1); /* Flush input queue */ X (void) ioctl(iofd, TCSETAW, &oldtty); /* Restore modes */ X (void) ioctl(iofd, TCXONC,1); /* Restart output */ X#endif X#ifdef V7 X ioctl(iofd, TIOCSETP, &oldtty); X ioctl(iofd, TIOCSETC, &oldtch); X ioctl(iofd, TIOCNXCL, 0); X#ifdef LLITOUT X ioctl(TIOCLSET, &Locmode); /* Restore "local mode" */ X#endif X#endif X X return OK; X default: X return ERROR; X } X} X Xsendbrk() X{ X#ifdef V7 X#ifdef TIOCSBRK X#define CANBREAK X sleep(1); X ioctl(iofd, TIOCSBRK, 0); X sleep(1); X ioctl(iofd, TIOCCBRK, 0); X#endif X#endif X#ifdef USG X#define CANBREAK X ioctl(iofd, TCSBRK, 0); X#endif X} X X/* End of rbsb.c */ SHAR_EOF chmod 0644 rbsb.c || echo "restore of rbsb.c fails" fi if test -f rz.1; then echo "File rz.1 exists"; else echo "x - extracting rz.1 (Text)" sed 's/^X//' << 'SHAR_EOF' > rz.1 && X'\" Revision Level X'\" Last Delta 04-22-88 X.TH RZ 1 OMEN X.SH NAME Xrx, rb, rz \- XMODEM, YMODEM, ZMODEM (Batch) file receive X.SH SYNOPSIS X.B rz X.RB [\- "\ +abepqtuvy" ] X.br X.B rb X.RB [\- "\ +abqtuvy" ] X.br X.B rx X.RB [\- "\ abceqtuv" ] X.I file X.br X.B gz X.I "file ..." X.br X.RB [ \- ][ v ] rzCOMMAND X.SH DESCRIPTION XThis program uses error correcting protocols to receive Xfiles over a dial-in serial port from a variety of programs running under XPC-DOS, CP/M, X.SM Unix, Xand other operating systems. XIt is invoked from a shell prompt Xmanually, or automatically as a result of an X"sz file ..." command given to the calling program. X XWhile X.I rz Xis smart enough to be called from X.I cu(1), Xvery few versions of X.I cu(1) Xare smart enough to allow X.I rz Xto work properly. XUnix flavors of Professional-YAM are available for such dial-out application. X X X.B Rz X(Receive ZMODEM) Xreceives files with the ZMODEM batch protocol. XPathnames are supplied by the sending program, Xand directories are made if necessary (and possible). XNormally, the X"rz" command is automatically issued by the calling ZMODEM program, Xbut some defective ZMODEM implementations may require starting X.I rz Xthe old fashioned way. X X X.B Rb Xreceives file(s) with YMODEM, Xaccepting either standard 128 byte sectors or X1024 byte sectors X(YAM sb X.B -k Xoption). XThe user should determine when Xthe 1024 byte block length Xactually improves throughput without causing lost data Xor even system crashes. X XIf True YMODEM (Omen Technology trademark) file information (file length, etc.) Xis received, Xthe file length controls the number of bytes written to Xthe output dataset, Xand the modify time and file mode X(iff non zero) Xare set accordingly. X XIf no True YMODEM file information is received, Xslashes in the pathname are changed to underscore, Xand any trailing period in the pathname is eliminated. XThis conversion is useful for files received from CP/M systems. XWith YMODEM, each file name is converted to lower case Xunless it contains one or more lower case letters. X X X.B Rx Xreceives a single X.I file Xwith XMODEM or XMODEM-1k protocol. XThe user should determine when Xthe 1024 byte block length Xactually improves throughput without causing problems. XThe user must supply the file name to both sending and receiving programs. XUp to 1023 garbage characters may be added to the received file. X X.B Gz Xis a shell script which calls X.I sz Xto command Pro-YAM or ZCOMM to transmit the specified files. XPathnames used with X.I gz Xmust be escaped if they have special significance to the Unix shell. X.br XEXAMPLE: Xgz "-a C:*.c D:*.h" X X X.B Rz Xmay be invoked as X.B rzCOMMAND X(with an optional leading \- as generated by login(1)). XFor each received file, X.I rz Xwill pipe the file to ``COMMAND filename'' Xwhere filename is the name of the transmitted file Xwith the file contents as standard input. X XEach file transfer is acknowledged when COMMAND exits with 0 status. XA non zero exit status terminates transfers. X XA typical use for this form is X.I rzrmail Xwhich calls rmail(1) Xto post mail to the user specified by the transmitted file name. XFor example, sending the file "caf" from a PC-DOS system to X.I rzrmail Xon a X.SM Unix Xsystem Xwould result in the contents of the DOS file "caf" being mailed to user "caf". X XOn some X.SM Unix Xsystems, the login directory must contain a link to XCOMMAND as login sets SHELL=rsh which disallows absolute Xpathnames. XIf invoked with a leading ``v'', X.I rz Xwill report progress to /tmp/rzlog. XThe following entry works for X.SM Unix XSYS III/V: X.ce Xrzrmail::5:1::/bin:/usr/local/rzrmail XIf the SHELL environment variable includes X.I "rsh" Xor X.I "rksh" X(restricted shell), X.I rz Xwill not accept absolute pathnames Xor references to a parent directory, Xwill not modify an existing file, and Xremoves any files received in error. X XIf X.B rz Xis invoked with stdout and stderr to different datasets, XVerbose is set to 2, causing frame by frame progress reports Xto stderr. XThis may be disabled with the X.B q Xoption. X X.PP XThe meanings of the available options are: X.PP X.PD 0 X.TP X.B a XConvert files to X.SM Unix Xconventions by stripping carriage returns and all characters Xbeginning with the first Control Z (CP/M end of file). X.TP X.B b XBinary X(tell it like it is) Xfile transfer override. X.TP X.B c XRequest 16 bit CRC. XXMODEM file transfers default to 8 bit checksum. XYMODEM and ZMODEM normally use 16 bit CRC. X.TP X.B D XOutput file data to /dev/null; for testing. X(Unix only) X.TP X.B e XForce sender to escape all control characters; Xnormally XON, XOFF, DLE, CR-@-CR, and Ctrl-X are escaped. X.TP X.B p X(ZMODEM) Protect: skip file if destination file exists. X.TP X.B q XQuiet suppresses verbosity. X.TP X.B "t tim" XChange timeout to X.I tim Xtenths of seconds. X.TP X.B v XVerbose Xcauses a list of file Xnames to be appended to X/tmp/rzlog . XMore v's generate more output. X.TP X.B y XYes, clobber any existing files with the same name. X.PD X.ne 6 X.SH EXAMPLES X.RE X(Pro-YAM command) X.RS X.I <ALT-2> X.br XPro-YAM Command: X.I "sz *.h *.c" X.br X(This automatically invokes X.I rz Xon the connected system.) X.RE X.SH SEE ALSO XZMODEM.DOC, XYMODEM.DOC, XProfessional-YAM, Xcrc(omen), Xsz(omen), Xusq(omen), Xundos(omen) X XCompile time options required Xfor various operating systems are described in the Xsource file. X.SH NOTES XSending serial data to timesharing minicomputers Xat sustained high speeds Xhas been known to cause lockups, system halts, kernel panics, Xand occasional antisocial behaviour. XWhen experimenting with high speed input to a Xsystem, consider rebooting the system Xif the file transfers are not successful, Xespecially if the personality of the system appears altered. X XThe Unix "ulimit" parameter must be set high enough Xto permit large file transfers. X XThe TTY input buffering on some systems may not allow long blocks Xor streaming input at high speed. XYou should suspect this problem when you Xcan't send data to the Unix system at high speeds using ZMODEM, XYMODEM-1k or XMODEM-1k, Xwhen YMODEM with 128 byte blocks works properly. XIf the system's tty line handling is really broken, the serial port Xor the entire system may not survive the onslaught of long bursts Xof high speed data. X XThe DSZ or Pro-YAM X.B "zmodem l" Xnumeric parameter may be set to a value between 64 and 1024 to limit the Xburst length ("zmodem pl128"). X X32 bit CRC code courtesy Gary S. Brown. XDirectory creation code from John Gilmore's PD TAR program. X.SH BUGS XCalling X.I rz Xfrom most versions of cu(1) doesn't work because cu's receive process Xfights X.I rz Xfor characters from the modem. X XPrograms that do not properly implement the specified file transfer protocol Xmay cause X.I sz Xto "hang" the port for a minute or two. XEvery reported instance of this problem has been corrected by using XZCOMM, Pro-YAM, or other program with a correct implementation Xof the specified protocol. X XMany programs claiming to support YMODEM only support XMODEM with 1k blocks, Xand they often don't get that quite right. X XPathnames are restricted to 127 characters. XIn XMODEM single file mode, the pathname given on the command line Xis still processed as described above. XThe ASCII option\'s CR/LF to NL translation merely deletes CR\'s; Xundos(omen) performs a more intelligent translation. X.SH "VMS VERSION" XThe VMS version does not set the file time. X XVMS C Standard I/O and RMS may interact to modify Xfile contents unexpectedly. X XThe VMS version does not support invocation as X.B rzCOMMAND . XThe current VMS version does not support XMODEM, XMODEM-1k, or YMODEM. X XAccording to the VMS documentation, Xthe buffered input routine used on the VMS version of X.I rz Xintroduces a delay Xof up to one second for each protocol transaction. XThis delay may be significant for very short files. XRemoving the "#define BUFREAD" line from rz.c will Xeliminate this delay at the expense of increased SHAR_EOF echo "End of part 1" echo "File rz.1 is continued in part 2" echo "2" > ._seq_ -- Keith Petersen Arpa: W8SDZ@SIMTEL20.ARPA Uucp: {bellcore,decwrl,harvard,lll-crg,ucbvax,uw-beaver}!simtel20.arpa!w8sdz GEnie: W8SDZ