⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zm.c

📁 ZMODEM协议的实现
💻 C
📖 第 1 页 / 共 2 页
字号:
			}			goto again;		}	/* **** FALL THRU TO **** */	default:agn2:		if ( --n == 0) {			c = GCOUNT;  goto fifi;		}		if (eflag && ((c &= 0177) & 0140))			bttyout(c);		else if (eflag > 1)			bttyout(c);#ifdef UNIX		fflush(stderr);#endif		goto startover;	case ZPAD|0200:		/* This is what we want. */		Not8bit = c;	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;	}	Rxhlen = 4;		/* Set default length */	Rxframeind = c = noxrd7();	switch (c) {	case ZVBIN32:		if ((Rxhlen = c = zdlread()) < 0)			goto fifi;		if (c > ZMAXHLEN)			goto agn2;		Crc32r = 1;  c = zrbhd32(hdr); break;	case ZBIN32:		if (Usevhdrs)			goto agn2;		Crc32r = 1;  c = zrbhd32(hdr); break;	case ZVBINR32:		if ((Rxhlen = c = zdlread()) < 0)			goto fifi;		if (c > ZMAXHLEN)			goto agn2;		Crc32r = 2;  c = zrbhd32(hdr); break;	case ZBINR32:		if (Usevhdrs)			goto agn2;		Crc32r = 2;  c = zrbhd32(hdr); break;	case RCDO:	case TIMEOUT:		goto fifi;	case ZVBIN:		if ((Rxhlen = c = zdlread()) < 0)			goto fifi;		if (c > ZMAXHLEN)			goto agn2;		Crc32r = 0;  c = zrbhdr(hdr); break;	case ZBIN:		if (Usevhdrs)			goto agn2;		Crc32r = 0;  c = zrbhdr(hdr); break;	case ZVHEX:		if ((Rxhlen = c = zgethex()) < 0)			goto fifi;		if (c > ZMAXHLEN)			goto agn2;		Crc32r = 0;  c = zrhhdr(hdr); break;	case ZHEX:		if (Usevhdrs)			goto agn2;		Crc32r = 0;  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:	case GCOUNT:		zperr("Got %s", frametypes[c+FTOFFSET]);	/* **** FALL THRU TO **** */#ifndef DSZ	default:		if (c >= -4 && c <= FRTYPES)			vfile("zgethdr: %c %d %s %lx", Rxframeind, Rxhlen,			  frametypes[c+FTOFFSET], Rxpos);		else			vfile("zgethdr: %c %d %lx", Rxframeind, c, Rxpos);#endif	}	/* Use variable length headers if we got one */	if (c >= 0 && c <= FRTYPES && Rxframeind & 040)		Usevhdrs = 1;	return c;}/* Receive a binary style header (type and position) */zrbhdr(hdr)register char *hdr;{	register int c, n;	register unsigned short crc;	if ((c = zdlread()) & ~0377)		return c;	Rxtype = c;	crc = updcrc(c, 0);	for (n=Rxhlen; --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;	}#ifdef ZMODEM	Protocol = ZMODEM;#endif	Zmodem = 1;	return Rxtype;}/* Receive a binary style header (type and position) with 32 bit FCS */zrbhd32(hdr)register char *hdr;{	register int c, n;	register UNSL long crc;	if ((c = zdlread()) & ~0377)		return c;	Rxtype = c;	crc = 0xFFFFFFFFL; crc = UPDC32(c, crc);#ifdef DEBUGZ	vfile("zrbhd32 c=%X  crc=%lX", c, crc);#endif	for (n=Rxhlen; --n >= 0; ++hdr) {		if ((c = zdlread()) & ~0377)			return c;		crc = UPDC32(c, crc);		*hdr = c;#ifdef DEBUGZ		vfile("zrbhd32 c=%X  crc=%lX", c, crc);#endif	}	for (n=4; --n >= 0;) {		if ((c = zdlread()) & ~0377)			return c;		crc = UPDC32(c, crc);#ifdef DEBUGZ		vfile("zrbhd32 c=%X  crc=%lX", c, crc);#endif	}	if (crc != 0xDEBB20E3) {		zperr(badcrc);		return ERROR;	}#ifdef ZMODEM	Protocol = ZMODEM;#endif	Zmodem = 1;	return Rxtype;}/* Receive a hex style header (type and position) */zrhhdr(hdr)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=Rxhlen; --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(1)) {	case 0215:		Not8bit = c;		/* **** FALL THRU TO **** */	case 015:	 	/* Throw away possible cr/lf */		switch (c = readline(1)) {		case 012:			Not8bit |= c;		}	}#ifdef ZMODEM	Protocol = ZMODEM;#endif	Zmodem = 1; return Rxtype;}/* Send a byte as two hex digits */zputhex(c)register int c;{	static char	digits[]	= "0123456789abcdef";#ifdef DEBUGZ	if (Verbose>8)		vfile("zputhex: %02X", c);#endif	sendline(digits[(c&0xF0)>>4]);	sendline(digits[(c)&0xF]);}/* * Send character c with ZMODEM escape sequence encoding. *  Escape XON, XOFF. Escape CR following @ (Telenet net escape) */zsendline(c){	/* Quick check for non control characters */	if (c & 0140)		xsendline(lastsent = c);	else {		switch (c &= 0377) {		case ZDLE:			xsendline(ZDLE);			xsendline (lastsent = (c ^= 0100));			break;		case 015:		case 0215:			if (!Zctlesc && (lastsent & 0177) != '@')				goto sendit;		/* **** FALL THRU TO **** */		case 020:		case 021:		case 023:		case 0220:		case 0221:		case 0223:			xsendline(ZDLE);			c ^= 0100;	sendit:			xsendline(lastsent = c);			break;		default:			if (Zctlesc && ! (c & 0140)) {				xsendline(ZDLE);				c ^= 0100;			}			xsendline(lastsent = c);		}	}}/* Decode two lower case hex digits into an 8 bit byte value */zgethex(){	register int c;	c = zgeth1();#ifdef DEBUGZ	if (Verbose>8)		vfile("zgethex: %02X", c);#endif	return c;}zgeth1(){	register int c, n;	if ((c = noxrd7()) < 0)		return c;	n = c - '0';	if (n > 9)		n -= ('a' - ':');	if (n & ~0xF)		return ERROR;	if ((c = noxrd7()) < 0)		return c;	c -= '0';	if (c > 9)		c -= ('a' - ':');	if (c & ~0xF)		return ERROR;	c += (n<<4);	return c;}/* * Read a byte, checking for ZMODEM escape encoding *  including CAN*5 which represents a quick abort */zdlread(){	register int c;again:	/* Quick check for non control characters */	if ((c = readline(Rxtimeout)) & 0140)		return c;	switch (c) {	case ZDLE:		break;	case 023:	case 0223:	case 021:	case 0221:		goto again;	default:		if (Zctlesc && !(c & 0140)) {			goto again;		}		return c;	}again2:	if ((c = readline(Rxtimeout)) < 0)		return c;	if (c == CAN && (c = readline(Rxtimeout)) < 0)		return c;	if (c == CAN && (c = readline(Rxtimeout)) < 0)		return c;	if (c == CAN && (c = readline(Rxtimeout)) < 0)		return c;	switch (c) {	case CAN:		return GOTCAN;	case ZCRCE:	case ZCRCG:	case ZCRCQ:	case ZCRCW:		return (c | GOTOR);	case ZRUB0:		return 0177;	case ZRUB1:		return 0377;	case 023:	case 0223:	case 021:	case 0221:		goto again2;	default:		if (Zctlesc && ! (c & 0140)) {			goto again2;		}		if ((c & 0140) ==  0100)			return (c ^ 0100);		break;	}	if (Verbose>1)		zperr("Bad escape sequence %x", c);	return ERROR;}/* * Read a character from the modem line with timeout. *  Eat parity, XON and XOFF characters. */noxrd7(){	register int c;	for (;;) {		if ((c = readline(Rxtimeout)) < 0)			return c;		switch (c &= 0177) {		case XON:		case XOFF:			continue;		default:			if (Zctlesc && !(c & 0140))				continue;		case '\r':		case '\n':		case ZDLE:			return c;		}	}}/* Store long integer pos in Txhdr */stohdr(pos)long pos;{	Txhdr[ZP0] = pos;	Txhdr[ZP1] = pos>>8;	Txhdr[ZP2] = pos>>16;	Txhdr[ZP3] = pos>>24;}/* Recover a long integer from a header */longrclhdr(hdr)register char *hdr;{	register 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 + -