📄 rzsz.sh
字号:
X }X elseX xsendline(ZBIN);X zsendline(type);X crc = updcrc(type, 0);XX for (n=len; --n >= 0; ++hdr) {X zsendline(*hdr);X crc = updcrc((0377& *hdr), crc);X }X crc = updcrc(0,updcrc(0,crc));X zsendline(((int)(crc>>8)));X zsendline(crc);X }X if (type != ZDATA)X flushmo();}XX/* Send ZMODEM binary header hdr of type type */zsbh32(len, hdr, type, flavour)register char *hdr;{X register int n;X register unsigned long crc;XX xsendline(flavour); X if (Usevhdrs) X zsendline(len);X zsendline(type);X crc = 0xFFFFFFFFL; crc = UPDC32(type, crc);XX for (n=len; --n >= 0; ++hdr) {X crc = UPDC32((0377 & *hdr), crc);X zsendline(*hdr);X }X crc = ~crc;X for (n=4; --n >= 0;) {X zsendline((int)crc);X crc >>= 8;X }}X/* Send ZMODEM HEX header hdr of type type */zshhdr(len, type, hdr)register char *hdr;{X register int n;X register unsigned short crc;X#ifndef DSZX vfile("zshhdr: %c %d %s %lx", Usevhdrs?'v':'f', len,X frametypes[type+FTOFFSET], rclhdr(hdr));#endifX sendline(ZPAD); sendline(ZPAD); sendline(ZDLE);X if (Usevhdrs) {X sendline(ZVHEX);X zputhex(len);X }X elseX sendline(ZHEX);X zputhex(type);X Crc32t = 0;XX crc = updcrc(type, 0);X for (n=len; --n >= 0; ++hdr) {X zputhex(*hdr); crc = updcrc((0377 & *hdr), crc);X }X crc = updcrc(0,updcrc(0,crc));X zputhex(((int)(crc>>8))); zputhex(crc);XX /* Make it printable on remote machine */X sendline(015); sendline(0212);X /*X * Uncork the remote in case a fake XOFF has stopped data flowX */X if (type != ZFIN && type != ZACK)X sendline(021);X flushmo();}X/*X * Send binary array buf of length length, with ending ZDLE sequence frameendX */static char *Zendnames[] = { "ZCRCE", "ZCRCG", "ZCRCQ", "ZCRCW"};zsdata(buf, length, frameend)register char *buf;{X register unsigned short crc;X#ifndef DSZX vfile("zsdata: %d %s", length, Zendnames[frameend-ZCRCE&3]);#endifX switch (Crc32t) {X case 1:X zsda32(buf, length, frameend); break;X case 2:X zsdar32(buf, length, frameend); break;X default:X crc = 0;X for (;--length >= 0; ++buf) {X zsendline(*buf); crc = updcrc((0377 & *buf), crc);X }X xsendline(ZDLE); xsendline(frameend);X crc = updcrc(frameend, crc);XX crc = updcrc(0,updcrc(0,crc));X zsendline(((int)(crc>>8))); zsendline(crc);X }X if (frameend == ZCRCW)X xsendline(XON);X if (frameend != ZCRCG)X flushmo();}Xzsda32(buf, length, frameend)register char *buf;{X register int c;X register unsigned long crc;XX crc = 0xFFFFFFFFL;X for (;--length >= 0; ++buf) {X c = *buf & 0377;X zsendline(c);X crc = UPDC32(c, crc);X }X xsendline(ZDLE); xsendline(frameend);X crc = UPDC32(frameend, crc);XX crc = ~crc;X for (c=4; --c >= 0;) {X zsendline((int)crc); crc >>= 8;X }}X/*X * Receive array buf of max length with ending ZDLE sequenceX * and CRC. Returns the ending character or error code.X * NB: On errors may store length+1 bytes!X */zrdata(buf, length)register char *buf;{X register int c;X register unsigned short crc;X register char *end;X register int d;XX switch (Crc32r) {X case 1:X return zrdat32(buf, length);X case 2:X return zrdatr32(buf, length);X }XX crc = Rxcount = 0; end = buf + length;X while (buf <= end) {X if ((c = zdlread()) & ~0377) {crcfoo:X switch (c) {X case GOTCRCE:X case GOTCRCG:X case GOTCRCQ:X case GOTCRCW:X crc = updcrc((d=c)&0377, crc);X if ((c = zdlread()) & ~0377)X goto crcfoo;X crc = updcrc(c, crc);X if ((c = zdlread()) & ~0377)X goto crcfoo;X crc = updcrc(c, crc);X if (crc & 0xFFFF) {X zperr1(badcrc);X return ERROR;X }X Rxcount = length - (end - buf);#ifndef DSZX vfile("zrdata: %d %s", Rxcount,X Zendnames[d-GOTCRCE&3]);#endifX return d;X case GOTCAN:X zperr1("Sender Canceled");X return ZCAN;X case TIMEOUT:X zperr1("TIMEOUT");X return c;X default:X garbitch(); return c;X }X }X *buf++ = c;X crc = updcrc(c, crc);X }#ifdef DSZX garbitch(); #elseX zperr1("Data subpacket too long");#endifX return ERROR;}Xzrdat32(buf, length)register char *buf;{X register int c;X register unsigned long crc;X register char *end;X register int d;XX crc = 0xFFFFFFFFL; Rxcount = 0; end = buf + length;X while (buf <= end) {X if ((c = zdlread()) & ~0377) {crcfoo:X switch (c) {X case GOTCRCE:X case GOTCRCG:X case GOTCRCQ:X case GOTCRCW:X d = c; c &= 0377;X crc = UPDC32(c, crc);X if ((c = zdlread()) & ~0377)X goto crcfoo;X crc = UPDC32(c, crc);X if ((c = zdlread()) & ~0377)X goto crcfoo;X crc = UPDC32(c, crc);X if ((c = zdlread()) & ~0377)X goto crcfoo;X crc = UPDC32(c, crc);X if ((c = zdlread()) & ~0377)X goto crcfoo;X crc = UPDC32(c, crc);X if (crc != 0xDEBB20E3) {X zperr1(badcrc);X return ERROR;X }X Rxcount = length - (end - buf);#ifndef DSZX vfile("zrdat32: %d %s", Rxcount,X Zendnames[d-GOTCRCE&3]);#endifX return d;X case GOTCAN:X zperr1("Sender Canceled");X return ZCAN;X case TIMEOUT:X zperr1("TIMEOUT");X return c;X default:X garbitch(); return c;X }X }X *buf++ = c;X crc = UPDC32(c, crc);X }X zperr1("Data subpacket too long");X return ERROR;}Xgarbitch(){X zperr1("Garbled data subpacket");}X/*X * Read a ZMODEM header to hdr, either binary or hex.X *X * Set Rxhlen to size of header (default 4) (valid iff good hdr)X * On success, set Zmodem to 1, set Rxpos and return type of header.X * Otherwise return negative on error.X * Return ERROR instantly if ZCRCW sequence, for fast error recovery.X */zgethdr(hdr)char *hdr;{X register int c, n, cancount;XX n = Zrwindow + Baudrate;X Rxframeind = Rxtype = 0;Xstartover:X cancount = 5;again:X switch (c = readline(Rxtimeout)) {X case 021: case 0221:X goto again;X case RCDO:X case TIMEOUT:X goto fifi;X case CAN:gotcan:X if (--cancount <= 0) {X c = ZCAN; goto fifi;X }X switch (c = readline(Rxtimeout)) {X case TIMEOUT:X goto again;X case ZCRCW:X switch (readline(Rxtimeout)) {X case TIMEOUT:X c = ERROR; goto fifi;X case RCDO:X goto fifi;X default:X goto agn2;X }X case RCDO:X goto fifi;X default:X break;X case CAN:X if (--cancount <= 0) {X c = ZCAN; goto fifi;X }X goto again;X }X /* **** FALL THRU TO **** */X default:agn2:X if ( --n == 0) {X c = GCOUNT; goto fifi;X }X goto startover;X case ZPAD: /* This is what we want. */X break;X }X cancount = 5;splat:X switch (c = noxrd7()) {X case ZPAD:X goto splat;X case RCDO:X case TIMEOUT:X goto fifi;X default:X goto agn2;X case ZDLE: /* This is what we want. */X break;X }XXX Rxhlen = 4; /* Set default length */X Rxframeind = c = noxrd7();X switch (c) {X case ZVBIN32:X if ((Rxhlen = c = zdlread()) < 0)X goto fifi;X if (c > ZMAXHLEN)X goto agn2;X Crc32r = 1; c = zrbhd32(hdr); break;X case ZBIN32:X if (Usevhdrs)X goto agn2;X Crc32r = 1; c = zrbhd32(hdr); break;X case ZVBINR32:X if ((Rxhlen = c = zdlread()) < 0)X goto fifi;X if (c > ZMAXHLEN)X goto agn2;X Crc32r = 2; c = zrbhd32(hdr); break;X case ZBINR32:X if (Usevhdrs)X goto agn2;X Crc32r = 2; c = zrbhd32(hdr); break;X case RCDO:X case TIMEOUT:X goto fifi;X case ZVBIN:X if ((Rxhlen = c = zdlread()) < 0)X goto fifi;X if (c > ZMAXHLEN)X goto agn2;X Crc32r = 0; c = zrbhdr(hdr); break;X case ZBIN:X if (Usevhdrs)X goto agn2;X Crc32r = 0; c = zrbhdr(hdr); break;X case ZVHEX:X if ((Rxhlen = c = zgethex()) < 0)X goto fifi;X if (c > ZMAXHLEN)X goto agn2;X Crc32r = 0; c = zrhhdr(hdr); break;X case ZHEX:X if (Usevhdrs)X goto agn2;X Crc32r = 0; c = zrhhdr(hdr); break;X case CAN:X goto gotcan;X default:X goto agn2;X }X for (n = Rxhlen; ++n < ZMAXHLEN; ) /* Clear unused hdr bytes */X hdr[n] = 0;X Rxpos = hdr[ZP3] & 0377;X Rxpos = (Rxpos<<8) + (hdr[ZP2] & 0377);X Rxpos = (Rxpos<<8) + (hdr[ZP1] & 0377);X Rxpos = (Rxpos<<8) + (hdr[ZP0] & 0377);fifi:X switch (c) {X case GOTCAN:X c = ZCAN;X /* **** FALL THRU TO **** */X case ZNAK:X case ZCAN:X case ERROR:X case TIMEOUT:X case RCDO:X case GCOUNT:X zperr2("Got %s", frametypes[c+FTOFFSET]);X /* **** FALL THRU TO **** */#ifndef DSZX default:X if (c >= -4 && c <= FRTYPES)X vfile("zgethdr: %c %d %s %lx", Rxframeind, Rxhlen,X frametypes[c+FTOFFSET], Rxpos);X elseX vfile("zgethdr: %c %d %lx", Rxframeind, c, Rxpos);#endifX }X /* Use variable length headers if we got one */X if (c >= 0 && c <= FRTYPES && Rxframeind & 040)X Usevhdrs = 1;X return c;}X/* Receive a binary style header (type and position) */zrbhdr(hdr)register char *hdr;{X register int c, n;X register unsigned short crc;XX if ((c = zdlread()) & ~0377)X return c;X Rxtype = c;X crc = updcrc(c, 0);XX for (n=Rxhlen; --n >= 0; ++hdr) {X if ((c = zdlread()) & ~0377)X return c;X crc = updcrc(c, crc);X *hdr = c;X }X if ((c = zdlread()) & ~0377)X return c;X crc = updcrc(c, crc);X if ((c = zdlread()) & ~0377)X return c;X crc = updcrc(c, crc);X if (crc & 0xFFFF) {X zperr1(badcrc);X return ERROR;X }#ifdef ZMODEMX Protocol = ZMODEM;#endifX Zmodem = 1;X return Rxtype;}X/* Receive a binary style header (type and position) with 32 bit FCS */zrbhd32(hdr)register char *hdr;{X register int c, n;X register unsigned long crc;XX if ((c = zdlread()) & ~0377)X return c;X Rxtype = c;X crc = 0xFFFFFFFFL; crc = UPDC32(c, crc);#ifdef DEBUGZX vfile("zrbhd32 c=%X crc=%lX", c, crc);#endifXX for (n=Rxhlen; --n >= 0; ++hdr) {X if ((c = zdlread()) & ~0377)X return c;X crc = UPDC32(c, crc);X *hdr = c;#ifdef DEBUGZX vfile("zrbhd32 c=%X crc=%lX", c, crc);#endifX }X for (n=4; --n >= 0;) {X if ((c = zdlread()) & ~0377)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -