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

📄 crzsz.sh

📁 Linux下基于Z-MODEM的串口通讯程序源码
💻 SH
📖 第 1 页 / 共 5 页
字号:
X					if (blkopt<24 || blkopt>1024)X						usage();X					break;X				case 'l':X					if (isdigit(*cp))X						Tframlen = atol(cp);X					else {X						if (--argc < 1)X							usage();X						Tframlen = atol(*++argv);X					}X					if (Tframlen<32 || Tframlen>65535L)X						usage();X					break;X				case 'N':X					Lzmanag = ZMNEWL;  break;X				case 'n':X					Lzmanag = ZMNEW;  break;X				case 'o':X					Wantfcs32 = FALSE; break;X				case 'p':X					Lzmanag = ZMPROT;  break;X				case 'r':X					if (Lzconv == ZCRESUM)X						Lzmanag = (Lzmanag & ZMMASK) | ZMCRC;X					Lzconv = ZCRESUM; break;X				case 'u':X					++Unlinkafter; break;X				case 'v':X					++Verbose; break;X				case 'w':X					if (isdigit(*cp))X						Txwindow = atoi(cp);X					else {X						if (--argc < 1)X							usage();X						Txwindow = atoi(*++argv);X					}X					if (Txwindow < 256)X						Txwindow = 256;X					Txwindow = (Txwindow/64) * 64;X					Txwspac = Txwindow/4;X					if (blkopt > TxwspacX					 || (!blkopt && Txwspac < 1024))X						blkopt = Txwspac;X					break;X				case 'x':X					Skipbitch = 1;  break;X				case 'Y':X					Lskipnocor = TRUE;X					/* **** FALLL THROUGH TO **** */X				case 'y':X					Lzmanag = ZMCLOB; break;X				case 'Z':X				case 'z':X					Lztrans = ZTRLE;  break;X				default:X					usage();X				}X			}X		}X		else if (Command) {X			if (argc != 1) {X				usage();X			}X			Cmdstr = *argv;X		}X		else if ( !npats && argc>0) {X			if (argv[0][0]) {X				npats=argc;X				patts=argv;X			}X		}X	}X	if (npats < 1 && !Command) X		usage();/*X	if (Verbose) {X		if (freopen(LOGFILE, "a", stderr)==NULL)X			if (freopen(LOGFILE2, "a", stderr)==NULL) {X				printf("Can't open log file!");X				exit(2);X			}X		setbuf(stderr, NULL);X	}*/X	vfile("%s %s for %s tty=%s\n", Progname, VERSION, OS, Nametty);XX	mode(3);XX	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	}#ifdef SIGQUITX	signal(SIGQUIT, SIG_IGN);#endif#ifdef SIGTERMX	signal(SIGTERM, bibi);#endifXX	countem(npats, patts);XX	if (!Modem2 && !Nozmodem) {X		printf("rz\r");  fflush(stdout);X		stohdr(0x80L);	/* Show we can var header */X		if (Command)X			Txhdr[ZF0] = ZCOMMAND;X		zshhdr(4, ZRQINIT, Txhdr);X	}X	fflush(stdout);XXX	if (Command) {X		if (getzrxinit()) {X			Exitcode=1; canit();X		}X		else if (zsendcmd(Cmdstr, 1+strlen(Cmdstr))) {X			Exitcode=1; canit();X		}X	} else if (wcsend(npats, patts)==ERROR) {X		Exitcode=1;X		canit();X		sleep(20);X	}X	if (Skipcount) {X		fprintf(stderr,X		  "%d file(s) skipped by receiver request\r\n", Skipcount);X	}X	fprintf(stderr, "%s %s finished.\r\n", Progname, VERSION);X	mode(0);X	if(errcnt || Exitcode)X		exit(1);X#ifndef REGISTEREDX	/* Removing or disabling this code without registering is theft */X	fprintf(stderr, "\n\n\n**** UNREGISTERED COPY *****\r\n");X	fprintf(stderr, "\n\n\nPlease read the License Agreement in csz.doc\n");X	sleep(10);#endifX	exit(0);X	/*NOTREACHED*/}X/* Say "bibi" to the receiver, try to do it cleanly */voidsaybibi(){X	for (;;) {X		stohdr(0L);		/* CAF Was zsbhdr - minor change */X		zshhdr(4, ZFIN, Txhdr);	/*  to make debugging easier */X		switch (zgethdr(Rxhdr)) {X		case ZFIN:X			sendline('O'); sendline('O'); flushmo();X		case ZCAN:X		case TIMEOUT:X			return;X		}X	}}Xwcsend(argc, argp)char *argp[];{X	register n;XX	Crcflg=FALSE;X	firstsec=TRUE;X	bytcnt = maxbytcnt = -1;X	vfile("wcsend: argc=%d", argc);X	if (Nozmodem) {X		purgeline();X	}X	for (n=0; n<argc; ++n) {X		Totsecs = 0;X		if (wcs(argp[n])==ERROR)X			return ERROR;X	}X	Totsecs = 0;X	if (Filcnt==0) {	/* bitch if we couldn't open ANY files */X		canit();X		fprintf(stderr, "Can't open any requested files\n");X		return ERROR;X	}X	if (Zmodem)X		saybibi();X	else if ( !Modem2)X		wctxpn("");X	return OK;}Xwcs(oname)char *oname;{X	register c;X	register char *p;X	struct stat f;X	char name[PATHLEN];XX	strcpy(name, oname);X	fprintf(stderr, "Sending name=%s\n", name);X#ifdef TXBSIZEX	if ( !strcmp(name, "-")) {X		if ((p = getenv("ONAME")) && *p)X			strcpy(name, p);X		elseX			sprintf(name, "s%d.sz", getpid());X		in = stdin;X	}X	else#endifX		in=fopen(name, "r");XX	if (in==NULL) {X		++errcnt;X		return OK;	/* pass over it, there may be others */X	}X	BEofseen = Eofseen = 0;  vpos = 0;XX	/* Check for directory */X	fstat(fileno(in), &f);#ifdef POSIXX	if (S_ISDIR(f.st_mode))#elseX	c = f.st_mode & S_IFMT;X	if (c == S_IFDIR || c == S_IFBLK)#endifX	{X		fclose(in);X		return OK;X	}XX	++Filcnt;X	switch (wctxpn(name)) {X	case ZSKIP:X	case ZFERR:X		return OK;X	case OK:X		break;X	default:X		return ERROR;X	}X	if (!Zmodem && wctx(f.st_size))X		return ERROR;XX	if (Unlinkafter)X		unlink(oname);XX	return 0;}X/*X * generate and transmit pathname block consisting ofX *  pathname (null terminated),X *  file length, mode time and file mode in octalX *  as provided by the Unix fstat call.X *  N.B.: modifies the passed name, may extend it!X */wctxpn(name)char *name;{X	register char *p, *q;X	char name2[PATHLEN];X	struct stat f;XX	vfile("wctxpn: %s", name);X	if (Modem2) {X		if (*name && fstat(fileno(in), &f)!= -1) {X			fprintf(stderr, "Sending %s, %ld XMODEM blocks. ",X			  name, (127+f.st_size)>>7);X		}X		fflush(stdout);X		return OK;X	}X	zperr2("Awaiting pathname nak for %s", *name?name:"<END>");X	if ( !Zmodem)X		if (getnak())X			return ERROR;XX	q = (char *) 0;XX	for (p=name, q=txbuf ; *p; )X		if ((*q++ = *p++) == '/' && !Fullname)X			q = txbuf;X	*q++ = 0;X	p=q;X	while (q < (txbuf + 1024))X		*q++ = 0;X	if (*name) {X		if (fstat(fileno(in), &f)!= -1)X			sprintf(p, "%lu %lo %o 3 %d %ld", f.st_size, f.st_mtime,X			  f.st_mode, Filesleft, Totalleft);X		Totalleft -= f.st_size;X	}X	if (--Filesleft <= 0)X		Filesleft = Totalleft = 0;X	if (Totalleft < 0)X		Totalleft = 0;XX	/* force 1k blocks if name won't fit in 128 byte block */X	if (txbuf[125])X		blklen=1024;X	else {		/* A little goodie for IMP/KMD */X		txbuf[127] = (f.st_size + 127) >>7;X		txbuf[126] = (f.st_size + 127) >>15;X	}X	vfile("wctxpn: %s", p);X	if (Zmodem)X		return zsendfile(txbuf, 1+strlen(p)+(p-txbuf));X	if (wcputsec(txbuf, 0, 128)==ERROR)X		return ERROR;X	return OK;}Xgetnak(){X	register firstch;XX	Lastrx = 0;X	for (;;) {X		switch (firstch = readline(800)) {X		case ZPAD:X			if (getzrxinit())X				return ERROR;X			return FALSE;X		case TIMEOUT:X			fprintf(stderr, "Timeout waiting for ZRINIT\n");X			return TRUE;X		case WANTG:#ifdef MODE2OKX			mode(2);	/* Set cbreak, XON/XOFF, etc. */#endifX			Optiong = TRUE;X			blklen=1024;X		case WANTCRC:X			Crcflg = TRUE;X		case NAK:X			return FALSE;X		case CAN:X			if ((firstch = readline(20)) == CAN && Lastrx == CAN) {X				fprintf(stderr, "Got CAN waiting to send file\n");X				return TRUE;X			}X		default:X			break;X		}X		Lastrx = firstch;X	}}XXwctx(flen)long flen;{X	register int thisblklen;X	register int sectnum, attempts, firstch;X	long charssent;XX	charssent = 0;  firstsec=TRUE;  thisblklen = blklen;X	vfile("wctx:file length=%ld", flen);XX	while ((firstch=readline(Rxtimeout))!=NAK && firstch != WANTCRCX	  && firstch != WANTG && firstch!=TIMEOUT && firstch!=CAN)X		;X	if (firstch==CAN) {X		zperr1("Receiver CANcelled");X		return ERROR;X	}X	if (firstch==WANTCRC)X		Crcflg=TRUE;X	if (firstch==WANTG)X		Crcflg=TRUE;X	sectnum=0;X	for (;;) {X		if (flen <= (charssent + 896L))X			thisblklen = 128;X		if ( !filbuf(txbuf, thisblklen))X			break;X		if (wcputsec(txbuf, ++sectnum, thisblklen)==ERROR)X			return ERROR;X		charssent += thisblklen;X	}X	fclose(in);X	attempts=0;X	do {X		purgeline();X		sendline(EOT);X		flushmo();X		++attempts;X	}X		while ((firstch=(readline(Rxtimeout)) != ACK) && attempts < RETRYMAX);X	if (attempts == RETRYMAX) {X		zperr1("No ACK on EOT");X		return ERROR;X	}X	elseX		return OK;}Xwcputsec(buf, sectnum, cseclen)char *buf;int sectnum;int cseclen;	/* data length of this sector to send */{X	register checksum, wcj;X	register char *cp;X	unsigned oldcrc;X	int firstch;X	int attempts;XX	firstch=0;	/* part of logic to detect CAN CAN */XX	fprintf(stderr, "Sector %3d %2dk\n", Totsecs, Totsecs/8 );X	for (attempts=0; attempts <= RETRYMAX; attempts++) {X		Lastrx= firstch;X		sendline(cseclen==1024?STX:SOH);X		sendline(sectnum);X		sendline(-sectnum -1);X		oldcrc=checksum=0;X		for (wcj=cseclen,cp=buf; --wcj>=0; ) {X			sendline(*cp);X			oldcrc=updcrc((0377& *cp), oldcrc);X			checksum += *cp++;X		}X		if (Crcflg) {X			oldcrc=updcrc(0,updcrc(0,oldcrc));X			sendline((int)oldcrc>>8);X			sendline((int)oldcrc);X		}X		elseX			sendline(checksum);X		flushmo();XX		if (Optiong) {X			firstsec = FALSE; return OK;X		}X		firstch = readline(Rxtimeout);gotnak:X		switch (firstch) {X		case CAN:X			if(Lastrx == CAN) {cancan:X				zperr1("Cancelled");  return ERROR;X			}X			break;X		case TIMEOUT:X			zperr1("Timeout on sector ACK"); continue;X		case WANTCRC:X			if (firstsec)X				Crcflg = TRUE;X		case NAK:X			zperr1("NAK on sector"); continue;X		case ACK: X			firstsec=FALSE;X			Totsecs += (cseclen>>7);X			return OK;X		case ERROR:X			zperr1("Got burst for sector ACK"); break;X		default:X			zperr2("Got %02x for sector ACK", firstch); break;X		}X		for (;;) {X			Lastrx = firstch;X			if ((firstch = readline(Rxtimeout)) == TIMEOUT)X				break;X			if (firstch == NAK || firstch == WANTCRC)X				goto gotnak;X			if (firstch == CAN && Lastrx == CAN)X				goto cancan;X		}X	}X	zperr1("Retry Count Exceeded");X	return ERROR;}X/* fill buf with count chars padding with ^Z for CPM */filbuf(buf, count)register char *buf;{X	register m;XX	m = read(fileno(in), buf, count);X	if (m <= 0)X		return 0;X	while (m < count)X		buf[m++] = 032;X	return count;}X/* Fill buffer with blklen chars */zfilbuf(){X	int n;X#ifdef TXBSIZEX	vfile("zfilbuf: bytcnt =%lu vpos=%lu blklen=%d", bytcnt, vpos, blklen);X	/* We assume request is within buffer, or just beyond */X	txbuf = Txb + (bytcnt & TXBMASK);X	if (vpos <= bytcnt) {X		n = fread(txbuf, 1, blklen, in);XX		vpos += n;X		if (n < blklen)X			Eofseen = 1;X		vfile("zfilbuf: n=%d vpos=%lu Eofseen=%d", n, vpos, Eofseen);X		return n;X	}X	if (vpos >= (bytcnt+blklen))X		return blklen;X	/* May be a short block if crash recovery etc. */X	Eofseen = BEofseen;X	return (vpos - bytcnt);#elseX	n = fread(txbuf, 1, blklen, in);X	if (n < blklen) {X		Eofseen = 1;X		vfile("zfilbuf: n=%d vpos=%lu Eofseen=%d", n, vpos, Eofseen);X	}X	return n;#endif}X#ifdef TXBSIZE/* Replacement for brain damaged fseek function.  Returns 0==success */fooseek(fptr, pos, whence)FILE *fptr;long pos;{X	long m, n;XX	vfile("fooseek: pos =%lu vpos=%lu Canseek=%d", pos, vpos, Canseek);X	/* Seek offset < current buffer */X	if (pos < (vpos -TXBSIZE +1024)) {X		BEofseen = 0;X		if (Canseek > 0) {X			vpos = pos & ~TXBMASK;X			if (vpos > pos)X				vpos -= TXBSIZE;X			vfile("seek to vpos=%ld", vpos);X			if (fseek(fptr, vpos, 0))X				return 1;X		}X		else if (Canseek == 0) {X			vfile("seek to 00000");X			if (fseek(fptr, vpos = 0L, 0))X				return 1;X		} els

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -