📄 ckcfns.c
字号:
/* Returns 1 on success, 0 on failure */
sfile(x) int x; {
char pktnam[100]; /* Local copy of name */
char *s;
if (x == 0) { /* F-Packet setup */
if (*cmarg2 != '\0') { /* If we have a send-as name, */
strcpy(pktnam,cmarg2); /* copy it literally, */
cmarg2 = ""; /* and blank it out for next time. */
} else { /* Otherwise use actual file name: */
if (fncnv) { /* If converting names, */
zltor(filnam,pktnam); /* convert it to common form, */
} else { /* otherwise, */
strcpy(pktnam,filnam); /* copy it literally. */
}
}
debug(F110,"sfile",filnam,0); /* Log debugging info */
debug(F110," pktnam",pktnam,0);
if (openi(filnam) == 0) /* Try to open the file */
return(0);
s = pktnam; /* Name for packet data field */
} else { /* X-packet setup */
debug(F110,"sxpack",cmdstr,0); /* Log debugging info */
s = cmdstr; /* Name for data field */
}
flci = flco = ffc = 0; /* Init counters, etc. */
encstr(s); /* Encode the name into data[]. */
nxtpkt(&pktnum); /* Increment the packet number */
spack(x ? 'X' : 'F', pktnum, size, data); /* Send the F or X packet */
if (x == 0) { /* Display for F packet */
if (displa) { /* Screen */
screen(SCR_FN,'F',(long)pktnum,filnam);
screen(SCR_AN,0,0l,pktnam);
screen(SCR_FS,0,(long)fsize,"");
}
tlog(F110,"Sending",filnam,0l); /* Transaction log entry */
tlog(F110," as",pktnam,0l);
} else { /* Display for X-packet */
screen(SCR_XD,'X',(long)pktnum,cmdstr); /* Screen */
tlog(F110,"Sending from:",cmdstr,0l); /* Transaction log */
}
intmsg(++filcnt); /* Count file, give interrupt msg */
first = 1; /* Init file character lookahead. */
return(1);
}
/* S D A T A -- Send a data packet */
/* Return -1 if no data to send, else send packet and return length */
sdata() {
int len;
if (cxseen || czseen) return(-1); /* If interrupted, done. */
if ((len = getpkt(spsiz-chklen-3)) == 0) /* Done if no data. */
return(-1);
nxtpkt(&pktnum); /* Increment the packet number */
spack('D',pktnum,len,data); /* Send the packet */
return(len);
}
/* S E O F -- Send an End-Of-File packet */
/* Call with a string pointer to character to put in the data field, */
/* or else a null pointer or "" for no data. */
seof(s) char *s; {
nxtpkt(&pktnum); /* Increment the packet number */
if ((s != NULL) && (*s != '\0')) {
spack('Z',pktnum,1,s);
tlog(F100," *** interrupted, sending discard request","",0l);
} else {
spack('Z',pktnum,0,"");
fstats();
}
}
/* S E O T -- Send an End-Of-Transaction packet */
seot() {
nxtpkt(&pktnum); /* Increment the packet number */
spack('B',pktnum,0,""); /* Send the EOT packet */
cxseen = czseen = 0; /* Reset interruption flags */
tstats(); /* Log timing info */
}
/* F S T A T S -- Record file statistics in transaction log */
fstats() {
tlog(F100," end of file","",0l);
tlog(F101," file characters ","",ffc);
tlog(F101," communication line in ","",flci);
tlog(F101," communication line out ","",flco);
}
/* T S T A T S -- Record statistics in transaction log */
tstats() {
char *tp; int x;
ztime(&tp); /* Get time stamp */
tlog(F110,"End of transaction",tp,0l); /* Record it */
if (filcnt < 1) return; /* If no files, done. */
/* If multiple files, record character totals for all files */
if (filcnt > 1) {
tlog(F101," files","",filcnt);
tlog(F101," total file characters ","",tfc);
tlog(F101," communication line in ","",tlci);
tlog(F101," communication line out ","",tlco);
}
/* Record timing info for one or more files */
tlog(F101," elapsed time (seconds) ","",tsecs);
if (tsecs > 0) {
x = (tfc / tsecs) * 10;
tlog(F101," effective baud rate ","",x);
if (speed > 0) {
x = (x * 100) / speed;
tlog(F101," efficiency (percent) ","",x);
}
}
tlog(F100,"","",0); /* Leave a blank line */
}
/* R P A R -- Fill the data array with my send-init parameters */
rpar(data) char data[]; {
data[0] = tochar(rpsiz); /* Biggest packet I can receive */
data[1] = tochar(rtimo); /* When I want to be timed out */
data[2] = tochar(mypadn); /* How much padding I need (none) */
data[3] = ctl(mypadc); /* Padding character I want */
data[4] = tochar(eol); /* End-Of-Line character I want */
data[5] = CTLQ; /* Control-Quote character I send */
if (parity || ebqflg) { /* 8-bit quoting... */
data[6] = '&'; /* If parity or flag on, send &. */
if ((ebq > 0040 && ebq < 0100) || /* If flag off, then turn it on */
(ebq > 0140 && ebq < 0177) || /* if other side has asked us to */
(ebq == 'Y')) ebqflg = 1;
} else { /* Normally, */
data[6] = 'Y'; /* just say we're willing. */
}
data[7] = bctr + '0'; /* Block check type */
data[8] = MYRPTQ; /* Do repeat counts */
data[9] = '\0';
return(9); /* Return the length. */
}
/* S P A R -- Get the other system's Send-Init parameters. */
spar(data) char data[]; {
int len, x;
len = strlen(data); /* Number of fields */
x = (len-- > 0) ? unchar(data[0]) : DSPSIZ; /* Packet size */
if (spsizf == 0)
spsiz = (x < 10) ? DSPSIZ : x;
x = (len-- > 0) ? unchar(data[1]) : DMYTIM; /* Timeout */
if (timef == 0)
timint = (x < 0) ? DMYTIM : x;
npad = 0; padch = '\0'; /* Padding */
if (len-- > 0) {
npad = unchar(data[2]);
if (len-- > 0) padch = ctl(data[3]); else padch = 0;
}
seol = (len-- > 0) ? unchar(data[4]) : '\r'; /* Terminator */
if ((seol < 2) || (seol > 037)) seol = '\r';
ctlq = (len-- > 0) ? data[5] : CTLQ; /* Control prefix */
if (len-- > 0) { /* 8th-bit prefix */
ebq = data[6];
if ((ebq > 040 && ebq < 0100) || (ebq > 0140 && ebq < 0177)) {
ebqflg = 1;
} else if ((parity || ebqflg) && (ebq == 'Y')) {
ebqflg = 1;
ebq = '&';
} else if (ebq == 'N') {
ebqflg = 0;
} else ebqflg = 0;
} else ebqflg = 0;
chklen = 1; /* Block check */
if (len-- > 0) {
chklen = data[7] - '0';
if ((chklen < 1) || (chklen > 3)) chklen = 1;
}
bctr = chklen;
if (len-- > 0) { /* Repeat prefix */
rptq = data[8];
rptflg = ((rptq > 040 && rptq < 0100) || (rptq > 0140 && rptq < 0177));
} else rptflg = 0;
if (deblog) sdebu(len);
}
/* S D E B U -- Record spar results in debugging log */
sdebu(len) int len; {
debug(F111,"spar: data",data,len);
debug(F101," spsiz ","",spsiz);
debug(F101," timint","",timint);
debug(F101," npad ","",npad);
debug(F101," padch ","",padch);
debug(F101," eol ","",eol);
debug(F101," ctlq ","",ctlq);
debug(F101," ebq ","",ebq);
debug(F101," ebqflg","",ebqflg);
debug(F101," chklen","",chklen);
debug(F101," rptq ","",rptq);
debug(F101," rptflg","",rptflg);
}
/* G N F I L E -- Get the next file name from a file group. */
/* Returns 1 if there's a next file, 0 otherwise */
gnfile() {
int x; long y;
/* If file group interruption (C-Z) occured, fail. */
debug(F101,"gnfile: czseen","",czseen);
if (czseen) {
tlog(F100,"Transaction cancelled","",0l);
return(0);
}
/* If input was stdin or memory string, there is no next file. */
if (sndsrc == 0) return(0);
/* If file list comes from command line args, get the next list element. */
y = -1;
while (y < 0) { /* Keep trying till we get one... */
if (sndsrc > 0) {
if (nfils-- > 0) {
strcpy(filnam,*cmlist++);
debug(F111,"gnfile: cmlist filnam",filnam,nfils);
} else {
*filnam = '\0';
debug(F101,"gnfile cmlist: nfils","",nfils);
return(0);
}
}
/* Otherwise, step to next element of internal wildcard expansion list. */
if (sndsrc < 0) {
x = znext(filnam);
debug(F111,"gnfile znext: filnam",filnam,x);
if (x == 0) return(0);
}
/* Get here with a filename. */
y = zchki(filnam); /* Check if file readable */
if (y < 0) {
debug(F110,"gnfile skipping:",filnam,0);
tlog(F111,filnam,"not sent, reason",(long)y);
screen(SCR_ST,ST_SKIP,0l,filnam);
} else fsize = y;
}
return(1);
}
/* O P E N I -- Open an existing file for input */
openi(name) char *name; {
int x, filno;
if (memstr) return(1); /* Just return if file is memory. */
debug(F110,"openi",name,0);
debug(F101," sndsrc","",sndsrc);
filno = (sndsrc == 0) ? ZSTDIO : ZIFILE; /* ... */
debug(F101," file number","",filno);
if (zopeni(filno,name)) { /* Otherwise, try to open it. */
debug(F110," ok",name,0);
return(1);
} else { /* If not found, */
char xname[100]; /* convert the name */
zrtol(name,xname); /* to local form and then */
x = zopeni(filno,xname); /* try opening it again. */
debug(F101," zopeni","",x);
if (x) {
debug(F110," ok",xname,0);
return(1); /* It worked. */
} else {
screen(SCR_EM,0,0l,"Can't open file"); /* It didn't work. */
tlog(F110,xname,"could not be opened",0l);
debug(F110," openi failed",xname,0);
return(0);
}
}
}
/* O P E N O -- Open a new file for output. */
/* Returns actual name under which the file was opened in string 'name2'. */
openo(name,name2) char *name, *name2; {
char xname[100], *xp;
if (stdouf) /* Receiving to stdout? */
return(zopeno(ZSTDIO,""));
debug(F110,"openo: name",name,0);
if (cxseen || czseen) { /* If interrupted, get out before */
debug(F100," open cancelled","",0); /* destroying existing file. */
return(1); /* Pretend to succeed. */
}
xp = xname; /* OK to proceed. */
if (fncnv) /* If desired, */
zrtol(name,xp); /* convert name to local form */
else /* otherwise, */
strcpy(xname,name); /* use it literally */
debug(F110,"openo: xname",xname,0);
if (warn) { /* File collision avoidance? */
if (zchki(xname) != -1) { /* Yes, file exists? */
znewn(xname,&xp); /* Yes, make new name. */
strcpy(xname,xp);
debug(F110," exists, new name ",xname,0);
}
}
if (zopeno(ZOFILE,xname) == 0) { /* Try to open the file */
debug(F110,"openo failed",xname,0);
tlog(F110,"Failure to open",xname,0l);
return(0);
} else {
strcpy(name2,xname);
debug(F110,"openo ok, name2",name2,0);
return(1);
}
}
/* O P E N T -- Open the terminal for output, in place of a file */
opent() {
ffc = tfc = 0;
return(zopeno(ZCTERM,""));
}
/* C L S I F -- Close the current input file. */
clsif() {
if (memstr) { /* If input was memory string, */
memstr = 0; /* indicate no more. */
} else zclose(ZIFILE); /* else close input file. */
if (czseen || cxseen)
screen(SCR_ST,ST_DISC,0l,"");
else
screen(SCR_ST,ST_OK,0l,"");
cxseen = hcflg = 0; /* Reset flags, */
*filnam = '\0'; /* and current file name */
}
/* C L S O F -- Close an output file. */
/* Call with disp != 0 if file is to be discarded. */
/* Returns -1 upon failure to close, 0 or greater on success. */
clsof(disp) int disp; {
int x;
if ((x = zclose(ZOFILE)) < 0) { /* Try to close the file */
tlog(F100,"Failure to close",filnam,0l);
screen(SCR_ST,ST_ERR,0l,"");
} else if (disp && (keep == 0)) { /* Delete it if interrupted, */
if (*filnam) zdelet(filnam); /* and not keeping incomplete files */
debug(F100,"Discarded","",0);
tlog(F100,"Discarded","",0l);
screen(SCR_ST,ST_DISC,0l,"");
} else { /* Nothing wrong, just keep it */
debug(F100,"Closed","",0); /* and give comforting messages. */
screen(SCR_ST,ST_OK,0l,"");
}
*filnam = '\0'; /* Zero the current file name. */
return(x); /* Send back zclose() return code. */
}
/* S N D H L P -- Routine to send builtin help */
sndhlp() {
nfils = 0; /* No files, no lists. */
xflg = 1; /* Flag we must send X packet. */
strcpy(cmdstr,"help text"); /* Data for X packet. */
first = 1; /* Init getchx lookahead */
memstr = 1; /* Just set the flag. */
memptr = hlptxt; /* And the pointer. */
if (binary) { /* If file mode is binary, */
binary = 0; /* turn it back to text for this, */
savmod = 1; /* remember to restore it later. */
}
return(sinit());
}
/* C W D -- Change current working directory */
/*
String passed has first byte as length of directory name, rest of string
is name. Fails if can't connect, else ACKs (with name) and succeeds.
*/
cwd(vdir) char *vdir; {
vdir[unchar(*vdir) + 1] = '\0'; /* End with a null */
if (zchdir(vdir+1)) {
encstr(vdir+1);
ack1(data);
tlog(F110,"Changed directory to",vdir+1,0l);
return(1);
} else {
tlog(F110,"Failed to change directory to",vdir+1,0l);
return(0);
}
}
/* S Y S C M D -- Do a system command */
/* Command string is formed by concatenating the two arguments. */
syscmd(prefix,suffix) char *prefix, *suffix; {
char *cp;
if (prefix == NULL || *prefix == '\0') return(0);
for (cp = cmdstr; *prefix != '\0'; *cp++ = *prefix++) ;
while (*cp++ = *suffix++) ;
debug(F110,"syscmd",cmdstr,0);
if (zopeni(ZSYSFN,cmdstr) > 0) {
debug(F100,"syscmd zopeni ok",cmdstr,0);
nfils = sndsrc = 0; /* Flag that input from stdin */
xflg = hcflg = 1; /* And special flags for pipe */
if (binary) { /* If file mode is binary, */
binary = 0; /* turn it back to text for this, */
savmod = 1; /* remember to restore it later. */
}
return (sinit()); /* Send S packet */
} else {
debug(F100,"syscmd zopeni failed",cmdstr,0);
return(0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -