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

📄 ckcfns.c

📁 C 语言核心协议的 C 语言源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
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 + -