📄 zm.c
字号:
{128,0}, {256,0}, {512,0}, {1024,0}, {2048,0}, {4096,0}, {8192,0}, {0,0}};static inline voidcount_blk(int size){ int i; for (i=0;blocksizes[i].size;i++) { if (blocksizes[i].size==size) { blocksizes[i].count++; return; } } blocksizes[i].count++;}static void printout_blocksizes(void) __attribute__((__destructor__));static void printout_blocksizes(void) { int i; for (i=0;blocksizes[i].size;i++) { if (blocksizes[i].count) { lsyslog(LOG_DEBUG,"%4d byte: %ld blocks\n", blocksizes[i].size,blocksizes[i].count); } } if (blocksizes[i].count) { lsyslog(LOG_DEBUG,"unk. byte: %ld blocks", blocksizes[i].count); }}#define COUNT_BLK(x) count_blk(x)#else#define COUNT_BLK(x)#endif/* * Receive array buf of max length with ending ZDLE sequence * and CRC. Returns the ending character or error code. * NB: On errors may store length+1 bytes! */intzrdata(char *buf, int length, size_t *bytes_received){ register int c; register unsigned short crc; register char *end; register int d; *bytes_received=0; if (Rxframeind == ZBIN32) return zrdat32(buf, length, bytes_received); crc = 0; end = buf + length; while (buf <= end) { if ((c = zdlread()) & ~0377) {crcfoo: switch (c) { case GOTCRCE: case GOTCRCG: case GOTCRCQ: case GOTCRCW: { d = c; c &= 0377; crc = updcrc(c, crc); if ((c = zdlread()) & ~0377) goto crcfoo; crc = updcrc(c, crc); if ((c = zdlread()) & ~0377) goto crcfoo; crc = updcrc(c, crc); if (crc & 0xFFFF) { zperr(badcrc); return ERROR; } *bytes_received = length - (end - buf); COUNT_BLK(*bytes_received); VPRINTF(3,("zrdata: %lu %s", (unsigned long) (*bytes_received), Zendnames[(d-GOTCRCE)&3])); return d; } case GOTCAN: zperr(_("Sender Canceled")); return ZCAN; case TIMEOUT: zperr(_("TIMEOUT")); return c; default: zperr(_("Bad data subpacket")); return c; } } *buf++ = c; crc = updcrc(c, crc); } zperr(_("Data subpacket too long")); return ERROR;}static intzrdat32(char *buf, int length, size_t *bytes_received){ register int c; register unsigned long crc; register char *end; register int d; crc = 0xFFFFFFFFL; end = buf + length; while (buf <= end) { if ((c = zdlread()) & ~0377) {crcfoo: switch (c) { case GOTCRCE: case GOTCRCG: case GOTCRCQ: case GOTCRCW: d = c; c &= 0377; crc = UPDC32(c, crc); if ((c = zdlread()) & ~0377) goto crcfoo; crc = UPDC32(c, crc); if ((c = zdlread()) & ~0377) goto crcfoo; crc = UPDC32(c, crc); if ((c = zdlread()) & ~0377) goto crcfoo; crc = UPDC32(c, crc); if ((c = zdlread()) & ~0377) goto crcfoo; crc = UPDC32(c, crc); if (crc != 0xDEBB20E3) { zperr(badcrc); return ERROR; } *bytes_received = length - (end - buf); COUNT_BLK(*bytes_received); VPRINTF(3,("zrdat32: %lu %s", (unsigned long) *bytes_received, Zendnames[(d-GOTCRCE)&3])); return d; case GOTCAN: zperr(_("Sender Canceled")); return ZCAN; case TIMEOUT: zperr(_("TIMEOUT")); return c; default: zperr(_("Bad data subpacket")); return c; } } *buf++ = c; crc = UPDC32(c, crc); } zperr(_("Data subpacket too long")); return ERROR;}/* * Read a ZMODEM header to hdr, either binary or hex. * eflag controls local display of non zmodem characters: * 0: no display * 1: display printing characters only * 2: display all non ZMODEM characters * On success, set Zmodem to 1, set Rxpos and return type of header. * Otherwise return negative on error. * Return ERROR instantly if ZCRCW sequence, for fast error recovery. */intzgethdr(char *hdr, int eflag, size_t *Rxpos){ register int c, cancount; unsigned int max_garbage; /* Max bytes before start of frame */ size_t rxpos=0; /* keep gcc happy */ max_garbage = Zrwindow + Baudrate; Rxframeind = Rxtype = 0;startover: cancount = 5;again: /* Return immediate ERROR if ZCRCW sequence seen */ switch (c = READLINE_PF(Rxtimeout)) { case RCDO: case TIMEOUT: goto fifi; case CAN:gotcan: if (--cancount <= 0) { c = ZCAN; goto fifi; } switch (c = READLINE_PF(1)) { case TIMEOUT: goto again; case ZCRCW: c = ERROR; /* **** FALL THRU TO **** */ case RCDO: goto fifi; default: break; case CAN: if (--cancount <= 0) { c = ZCAN; goto fifi; } goto again; } /* **** FALL THRU TO **** */ default:agn2: if ( --max_garbage == 0) { zperr(_("Garbage count exceeded")); return(ERROR); } if (eflag && ((c &= 0177) & 0140) && Verbose) vchar(c); else if (eflag > 1 && Verbose) vchar(c); goto startover; case ZPAD|0200: /* This is what we want. */ case ZPAD: /* This is what we want. */ break; } cancount = 5;splat: switch (c = noxrd7()) { case ZPAD: goto splat; case RCDO: case TIMEOUT: goto fifi; default: goto agn2; case ZDLE: /* This is what we want. */ break; } switch (c = noxrd7()) { case RCDO: case TIMEOUT: goto fifi; case ZBIN: Rxframeind = ZBIN; Crc32 = FALSE; c = zrbhdr(hdr); break; case ZBIN32: Crc32 = Rxframeind = ZBIN32; c = zrbhdr32(hdr); break; case ZHEX: Rxframeind = ZHEX; Crc32 = FALSE; c = zrhhdr(hdr); break; case CAN: goto gotcan; default: goto agn2; } rxpos = hdr[ZP3] & 0377; rxpos = (rxpos<<8) + (hdr[ZP2] & 0377); rxpos = (rxpos<<8) + (hdr[ZP1] & 0377); rxpos = (rxpos<<8) + (hdr[ZP0] & 0377);fifi: switch (c) { case GOTCAN: c = ZCAN; /* **** FALL THRU TO **** */ case ZNAK: case ZCAN: case ERROR: case TIMEOUT: case RCDO: zperr(_("Got %s"), frametypes[c+FTOFFSET]); /* **** FALL THRU TO **** */ default: if (c >= -3 && c <= FRTYPES) VPRINTF(3,("zgethdr: %s %lx", frametypes[c+FTOFFSET], (unsigned long) rxpos)); else VPRINTF(3,("zgethdr: %d %lx", c, (unsigned long) rxpos)); } if (Rxpos) *Rxpos=rxpos; return c;}/* Receive a binary style header (type and position) */static int zrbhdr(char *hdr){ register int c, n; register unsigned short crc; if ((c = zdlread()) & ~0377) return c; Rxtype = c; crc = updcrc(c, 0); for (n=4; --n >= 0; ++hdr) { if ((c = zdlread()) & ~0377) return c; crc = updcrc(c, crc); *hdr = c; } if ((c = zdlread()) & ~0377) return c; crc = updcrc(c, crc); if ((c = zdlread()) & ~0377) return c; crc = updcrc(c, crc); if (crc & 0xFFFF) { zperr(badcrc); return ERROR; } protocol = ZM_ZMODEM; zmodem_requested=TRUE; return Rxtype;}/* Receive a binary style header (type and position) with 32 bit FCS */static intzrbhdr32(char *hdr){ register int c, n; register unsigned long crc; if ((c = zdlread()) & ~0377) return c; Rxtype = c; crc = 0xFFFFFFFFL; crc = UPDC32(c, crc);#ifdef DEBUGZ VPRINTF(3,("zrbhdr32 c=%X crc=%lX", c, crc)i);#endif for (n=4; --n >= 0; ++hdr) { if ((c = zdlread()) & ~0377) return c; crc = UPDC32(c, crc); *hdr = c;#ifdef DEBUGZ VPRINTF(3,("zrbhdr32 c=%X crc=%lX", c, crc));#endif } for (n=4; --n >= 0;) { if ((c = zdlread()) & ~0377) return c; crc = UPDC32(c, crc);#ifdef DEBUGZ VPRINTF(3,("zrbhdr32 c=%X crc=%lX", c, crc));#endif } if (crc != 0xDEBB20E3) { zperr(badcrc); return ERROR; } protocol = ZM_ZMODEM; zmodem_requested=TRUE; return Rxtype;}/* Receive a hex style header (type and position) */static int zrhhdr(char *hdr){ register int c; register unsigned short crc; register int n; if ((c = zgethex()) < 0) return c; Rxtype = c; crc = updcrc(c, 0); for (n=4; --n >= 0; ++hdr) { if ((c = zgethex()) < 0) return c; crc = updcrc(c, crc); *hdr = c; } if ((c = zgethex()) < 0) return c; crc = updcrc(c, crc); if ((c = zgethex()) < 0) return c; crc = updcrc(c, crc); if (crc & 0xFFFF) { zperr(badcrc); return ERROR; } switch ( c = READLINE_PF(1)) { case 0215: /* **** FALL THRU TO **** */ case 015: /* Throw away possible cr/lf */ READLINE_PF(1); break; } protocol = ZM_ZMODEM; zmodem_requested=TRUE; return Rxtype;}/* Write a byte as two hex digits */static void zputhex(int c, char *pos){ static char digits[] = "0123456789abcdef"; VPRINTF(9,("zputhex: %02X", c)); pos[0]=digits[(c&0xF0)>>4]; pos[1]=digits[c&0x0F];}voidzsendline_init(void){ int i; for (i=0;i<256;i++) { if (i & 0140) zsendline_tab[i]=0; else { switch(i) { case ZDLE: case XOFF: /* ^Q */ case XON: /* ^S */ case (XOFF | 0200): case (XON | 0200): zsendline_tab[i]=1; break; case 020: /* ^P */ case 0220: if (turbo_escape) zsendline_tab[i]=0; else zsendline_tab[i]=1; break; case 015: case 0215: if (Zctlesc) zsendline_tab[i]=1; else if (!turbo_escape) zsendline_tab[i]=2; else zsendline_tab[i]=0; break; default: if (Zctlesc) zsendline_tab[i]=1; else zsendline_tab[i]=0; } } }}/* Store pos in Txhdr */void stohdr(size_t pos){ long lpos=(long) pos; Txhdr[ZP0] = lpos; Txhdr[ZP1] = lpos>>8; Txhdr[ZP2] = lpos>>16; Txhdr[ZP3] = lpos>>24;}/* Recover a long integer from a header */longrclhdr(char *hdr){ long l; l = (hdr[ZP3] & 0377); l = (l << 8) | (hdr[ZP2] & 0377); l = (l << 8) | (hdr[ZP1] & 0377); l = (l << 8) | (hdr[ZP0] & 0377); return l;}/* End of zm.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -