📄 ckcfns.c
字号:
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 + -