?? sz.c
字號:
#define VERSION "3.48 01-27-98"#define PUBDIR "/usr/spool/uucppublic"/* ************************************************************************** * * sz.c By Chuck Forsberg, Omen Technology INC * Copyright 1997 Omen Technology Inc All Rights Reserved * ********************************************************************* ********************************************************************* * * * This version implements numerous enhancements including ZMODEM * Run Length Encoding and variable length headers. These * features were not funded by the original Telenet development * contract. * * * This software may be freely used for educational (didactic * only) purposes. "Didactic" means it is used as a study item * in a course teaching the workings of computer protocols. * * This software may also be freely used to support file transfer * operations to or from duly licensed Omen Technology products. * This includes DSZ, GSZ, ZCOMM, Professional-YAM and PowerCom. * Institutions desiring to use rz/sz this way should add the * following to the sz compile line: -DCOMPL * Programs based on stolen or public domain ZMODEM materials are * not included. Use with other commercial or shareware programs * (Crosstalk, Procomm, etc.) REQUIRES REGISTRATION. * * * Any programs which incorporate part or all of this code must be * provided in source form with this notice intact except by * prior written permission from Omen Technology Incorporated. * This includes compiled executables of this program. * * The .doc files and the file "mailer.rz" must also be included. * * Use of this software for commercial or administrative purposes * except when exclusively limited to interfacing Omen Technology * products requires license payment of $20.00 US per user * (less in quantity, see mailer.rz). Use of this code by * inclusion, decompilation, reverse engineering or any other means * constitutes agreement to these conditions and acceptance of * liability to license the materials and payment of reasonable * legal costs necessary to enforce this license agreement. * * * Omen Technology Inc * Post Office Box 4681 * Portland OR 97208 * * This code is made available in the hope it will be useful, * BUT WITHOUT ANY WARRANTY OF ANY KIND OR LIABILITY FOR ANY * DAMAGES OF ANY KIND. * * USG UNIX (3.0) ioctl conventions courtesy Jeff Martin */char *Copyrsz = "Copyright 1997 Omen Technology Inc All Rights Reserved";char *substr();#define LOGFILE "/tmp/szlog"#define LOGFILE2 "szlog"#include <stdio.h>#include <signal.h>#include <ctype.h>#include <errno.h>extern int errno;#define STATIC#define PATHLEN 1000#define OK 0#define FALSE 0#ifdef TRUE#undef TRUE#endif#define TRUE 1#define ERROR (-1)/* Ward Christensen / CP/M parameters - Don't change these! */#define ENQ 005#define CAN ('X'&037)#define XOFF ('s'&037)#define XON ('q'&037)#define SOH 1#define STX 2#define EOT 4#define ACK 6#define NAK 025#define SYN 026#define CPMEOF 032#define WANTCRC 0103 /* send C not NAK to get crc not checksum */#define WANTG 0107 /* Send G not NAK to get nonstop batch xmsn */#define TIMEOUT (-2)#define RCDO (-3)#define GCOUNT (-4)#define RETRYMAX 10#define HOWMANY 2STATIC int Zmodem=0; /* ZMODEM protocol requested by receiver */unsigned Baudrate = 9600; /* Default, set by first mode() call */STATIC unsigned Txwindow; /* Control the size of the transmitted window */STATIC unsigned Txwspac; /* Spacing between zcrcq requests */STATIC unsigned Txwcnt; /* Counter used to space ack requests */STATIC long Lrxpos; /* Receiver's last reported offset */STATIC int errors;char endmsg[80] = {0}; /* Possible message to display on exit */char Zsendmask[33]; /* Additional control chars to mask */#include "rbsb.c" /* most of the system dependent stuff here */#include "crctab.c"STATIC int Filesleft;STATIC long Totalleft;/* * Attention string to be executed by receiver to interrupt streaming data * when an error is detected. A pause (0336) may be needed before the * ^C (03) or after it. */#ifdef READCHECKSTATIC char Myattn[] = { 0 };#else#ifdef USGSTATIC char Myattn[] = { 03, 0336, 0 };#endif#endifFILE *in;STATIC int Canseek = 1; /* 1: Can seek 0: only rewind -1: neither (pipe) */#ifndef SMALL#ifndef TXBSIZE#define TXBSIZE 32768#endif#define TXBMASK (TXBSIZE-1)STATIC char Txb[TXBSIZE + 1024]; /* Circular buffer for file reads */STATIC char *txbuf = Txb; /* Pointer to current file segment */#elsechar txbuf[1024];#endifSTATIC long vpos = 0; /* Number of bytes read from file */STATIC char Lastrx;STATIC char Crcflg;STATIC int Modem2=0; /* XMODEM Protocol - don't send pathnames */STATIC int Restricted=0; /* restricted; no /.. or ../ in filenames */STATIC int Fullname=0; /* transmit full pathname */STATIC int Unlinkafter=0; /* Unlink file after it is sent */STATIC int Dottoslash=0; /* Change foo.bar.baz to foo/bar/baz */STATIC int firstsec;STATIC int errcnt=0; /* number of files unreadable */STATIC int Skipbitch=0;STATIC int Skipcount=0; /* Count of skipped files */STATIC int blklen=128; /* length of transmitted records */STATIC int Optiong; /* Let it rip no wait for sector ACK's */STATIC int Eofseen; /* EOF seen on input set by zfilbuf */STATIC int BEofseen; /* EOF seen on input set by fooseek */STATIC int Totsecs; /* total number of sectors this file */STATIC int Filcnt=0; /* count of number of files opened */STATIC unsigned Rxbuflen=16384; /* Receiver's max buffer length */STATIC long Tframlen = 0; /* Override for tx frame length */STATIC int blkopt=0; /* Override value for zmodem blklen */STATIC int Rxflags = 0;STATIC long bytcnt, maxbytcnt;STATIC int Wantfcs32 = TRUE; /* want to send 32 bit FCS */STATIC char Lzconv; /* Local ZMODEM file conversion request */STATIC char Lzmanag; /* Local ZMODEM file management request */STATIC int Lskipnocor;STATIC char Lztrans;STATIC int Command; /* Send a command, then exit. */STATIC char *Cmdstr; /* Pointer to the command string */STATIC int Cmdack1; /* Rx ACKs command, then do it */STATIC int Exitcode;STATIC int Test; /* 1= Force receiver to send Attn, etc with qbf. */ /* 2= Character transparency test */STATIC char *qbf= "The quick brown fox jumped over the lazy dog's back 1234567890\r\n";STATIC long Lastsync; /* Last offset to which we got a ZRPOS */STATIC int Beenhereb4; /* How many times we've been ZRPOS'd here */STATIC int Ksendstr; /* 1= Send esc-?-3-4-l to remote kermit */STATIC char *ksendbuf = "\033[?34l";STATIC jmp_buf intrjmp; /* For the interrupt on RX CAN *//* called by signal interrupt or terminate to clean things up */voidbibi(n){ canit(); fflush(stdout); mode(0); fprintf(stderr, "sz: caught signal %d; exiting\n", n); if (n == SIGQUIT) abort(); if (n == 99) fprintf(stderr, "mode(2) in rbsb.c not implemented!!\n"); exit(3);}/* Called when ZMODEM gets an interrupt (^X) */voidonintr(c){ signal(SIGINT, SIG_IGN); longjmp(intrjmp, -1);}STATIC int Zctlesc; /* Encode control characters */STATIC int Nozmodem = 0; /* If invoked as "sb" */STATIC char *Progname = "sz";STATIC int Zrwindow = 1400; /* RX window size (controls garbage count) *//* * Log an error */voidzperr1(s,p,u)char *s, *p, *u;{ if (Verbose <= 0) return; fprintf(stderr, "Retry %d: ", errors); fprintf(stderr, s); fprintf(stderr, "\n");}voidzperr2(s,p,u)char *s, *p, *u;{ if (Verbose <= 0) return; fprintf(stderr, "Retry %d: ", errors); fprintf(stderr, s, p); fprintf(stderr, "\n");}voidzperr3(s,p,u)char *s, *p, *u;{ if (Verbose <= 0) return; fprintf(stderr, "Retry %d: ", errors); fprintf(stderr, s, p, u); fprintf(stderr, "\n");}#include "zm.c"#include "zmr.c"main(argc, argv)char *argv[];{ register char *cp; register npats; char **patts; if ((cp = getenv("ZNULLS")) && *cp) Znulls = atoi(cp); if ((cp=getenv("SHELL")) && (substr(cp, "rsh") || substr(cp, "rksh"))) Restricted=TRUE; inittty(); chkinvok(argv[0]); Rxtimeout = 600; npats=0; if (argc<2) usage(); while (--argc) { cp = *++argv; if (*cp++ == '-' && *cp) { while ( *cp) { if (isdigit(*cp)) { ++cp; continue; } switch(*cp++) { case '\\': *cp = toupper(*cp); continue; case '+': Lzmanag = ZMAPND; break; case 'a': if (Nozmodem || Modem2) usage(); Lzconv = ZCNL; break; case 'b': Lzconv = ZCBIN; break; case 'c': Lzmanag = ZMCHNG; break; case 'd': ++Dottoslash; /* **** FALL THROUGH TO **** */ case 'f': Fullname=TRUE; break; case 'g' : Ksendstr = TRUE; break; case 'e': Zctlesc = 1; break; case 'k': blklen=1024; break; case 'L': if (isdigit(*cp)) blkopt = atoi(cp); else { if (--argc < 1) usage(); blkopt = atoi(*++argv); } if (blkopt<24 || blkopt>1024) usage(); break; case 'l': if (isdigit(*cp)) Tframlen = atol(cp); else { if (--argc < 1) usage(); Tframlen = atol(*++argv); } if (Tframlen<32 || Tframlen>65535L) usage(); break; case 'N': Lzmanag = ZMNEWL; break; case 'n': Lzmanag = ZMNEW; break; case 'o': Wantfcs32 = FALSE; break; case 'p': Lzmanag = ZMPROT; break; case 'r': if (Lzconv == ZCRESUM) Lzmanag = (Lzmanag & ZMMASK) | ZMCRC; Lzconv = ZCRESUM; break; case 'T': chartest(1); chartest(2); mode(0); exit(0); case 'u': ++Unlinkafter; break; case 'v': ++Verbose; break; case 'w': if (isdigit(*cp)) Txwindow = atoi(cp); else { if (--argc < 1) usage(); Txwindow = atoi(*++argv); } if (Txwindow < 256) Txwindow = 256; Txwindow = (Txwindow/64) * 64; Txwspac = Txwindow/4; if (blkopt > Txwspac || (!blkopt && Txwspac < 1024)) blkopt = Txwspac; break; case 'x': Skipbitch = 1; break; case 'Y': Lskipnocor = TRUE; /* **** FALLL THROUGH TO **** */ case 'y': Lzmanag = ZMCLOB; break; case 'Z': case 'z': Lztrans = ZTRLE; break; default: usage(); } } } else if (Command) { if (argc != 1) { usage(); } Cmdstr = *argv; } else if ( !npats && argc>0) { if (argv[0][0]) { npats=argc; patts=argv; } } } if (npats < 1 && !Command && !Test) usage(); if (Verbose) { if (freopen(LOGFILE, "a", stderr)==NULL) if (freopen(LOGFILE2, "a", stderr)==NULL) { printf("Can't open log file!"); exit(2); } setbuf(stderr, NULL); } vfile("%s %s for %s tty=%s\n", Progname, VERSION, OS, Nametty); mode(3); if (signal(SIGINT, bibi) == SIG_IGN) { signal(SIGINT, SIG_IGN); signal(SIGKILL, SIG_IGN); } else { signal(SIGINT, bibi); signal(SIGKILL, bibi); }#ifdef SIGQUIT signal(SIGQUIT, SIG_IGN);#endif#ifdef SIGTERM signal(SIGTERM, bibi);#endif countem(npats, patts); if (!Modem2 && !Nozmodem) { if (Ksendstr) printf(ksendbuf); printf("rz\r"); fflush(stdout); stohdr(0x80L); /* Show we can var header */ if (Command) Txhdr[ZF0] = ZCOMMAND; zshhdr(4, ZRQINIT, Txhdr); } fflush(stdout); if (Command) { if (getzrxinit()) { Exitcode=1; canit(); } else if (zsendcmd(Cmdstr, 1+strlen(Cmdstr))) { Exitcode=1; canit(); } } else if (wcsend(npats, patts)==ERROR) { Exitcode=1; canit(); sleep(20); } if (Skipcount) { printf("%d file(s) skipped by receiver request\r\n", Skipcount); if (Verbose) fprintf(stderr, "%d file(s) skipped by receiver request\r\n", Skipcount); } if (endmsg[0]) { printf("\r\n%s: %s\r\n", Progname, endmsg); if (Verbose) fprintf(stderr, "%s\r\n", endmsg); } printf("%s %s finished.\r\n", Progname, VERSION); fflush(stdout); mode(0); if(errcnt || Exitcode) exit(1);#ifndef REGISTERED /* Removing or disabling this code without registering is theft */ if (!Usevhdrs) { printf("\n\n\n**** UNREGISTERED COPY *****\r\n"); printf("\n\n\nPlease read the License Agreement in sz.doc\n"); fflush(stdout); sleep(10); }#endif exit(0); /*NOTREACHED*/}/* Say "bibi" to the receiver, try to do it cleanly */voidsaybibi(){ for (;;) { stohdr(0L); /* CAF Was zsbhdr - minor change */ zshhdr(4, ZFIN, Txhdr); /* to make debugging easier */ switch (zgethdr(Rxhdr)) { case ZFIN: sendline('O'); sendline('O'); flushmo(); case ZCAN: case TIMEOUT: return; } }}wcsend(argc, argp)char *argp[];{ register n; Crcflg=FALSE; firstsec=TRUE; bytcnt = maxbytcnt = -1; vfile("wcsend: argc=%d", argc); if (Nozmodem) { printf("Start your local YMODEM receive. "); fflush(stdout); } for (n=0; n<argc; ++n) { Totsecs = 0; if (wcs(argp[n])==ERROR) return ERROR; } Totsecs = 0; if (Filcnt==0) { /* bitch if we couldn't open ANY files */ if (!Nozmodem && !Modem2) { Command = TRUE; Cmdstr = "echo \"sz: Can't open any requested files\""; if (getnak()) { Exitcode=1; canit(); } if (!Zmodem) canit(); else if (zsendcmd(Cmdstr, 1+strlen(Cmdstr))) { Exitcode=1; canit(); } Exitcode = 1; return OK; } canit(); sprintf(endmsg, "Can't open any requested files"); return ERROR; } if (Zmodem) saybibi(); else if ( !Modem2) wctxpn(""); return OK;}wcs(oname)char *oname;{ register c; register char *p; struct stat f; char name[PATHLEN]; strcpy(name, oname); vfile("wcs: name=%s", name); if (Restricted) { /* restrict pathnames to current tree or uucppublic */ if ( substr(name, "../") || (name[0]== '/' && strncmp(name, PUBDIR, strlen(PUBDIR))) ) { canit(); sprintf(endmsg,"Security Violation"); return ERROR; } }#ifdef TXBSIZE if ( !strcmp(name, "-")) { if ((p = getenv("ONAME")) && *p) strcpy(name, p); else sprintf(name, "s%d.sz", getpid()); in = stdin; } else#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -