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

📄 zm.c

📁 Linux下ztelnet 的rz、sz源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	{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 + -