📄 crzsz.sh
字号:
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 + -