char *protv = /* -*-C-*- */
-"C-Kermit Protocol Module 8.0.158, 11 Sep 2002";
+"C-Kermit Protocol Module 9.0.160, 16 Oct 2009";
int kactive = 0; /* Kermit protocol is active */
Author: Frank da Cruz <fdc@columbia.edu>,
Columbia University Academic Information Systems, New York City.
- Copyright (C) 1985, 2004,
+ Copyright (C) 1985, 2009,
Trustees of Columbia University in the City of New York.
All rights reserved. See the C-Kermit COPYING.TXT file or the
copyright text in the ckcmai.c module for disclaimer and permissions.
extern int timint, rtimo, nfils, hcflg, xflg, flow, mdmtyp, network;
extern int oopts, omode, oname, opath, nopush, isguest, xcmdsrc, rcdactive;
extern int rejection, moving, fncact, bye_active, urserver, fatalio;
- extern int protocol, prefixing, filcnt, carrier, fnspath, interrupted;
+ extern int protocol, prefixing, carrier, fnspath, interrupted;
+ extern long filcnt;
extern int recursive, inserver, nzxopts, idletmo, srvidl, xfrint;
extern struct ck_p ptab[];
extern int remfile, rempipe, xferstat, filestatus, wearealike, fackpath;
#endif /* TCPSOCKET */
extern int cxseen, czseen, server, srvdis, local, displa, bctu, bctr, bctl;
+ extern int bctf;
extern int quiet, tsecs, parity, backgrd, nakstate, atcapu, wslotn, winlo;
extern int wslots, success, xitsta, rprintf, discard, cdtimo, keep, fdispla;
extern int timef, stdinf, rscapu, sendmode, epktflg, epktrcvd, epktsent;
- extern int binary, fncnv;
- extern long speed, ffc, crc16, calibrate, dest;
+ extern int binary, fncnv, dest;
+ extern long speed, crc16;
+ CK_OFF_T calibrate, ffc;
#ifdef COMMENT
extern char *TYPCMD, *DIRCMD, *DIRCM2;
#endif /* COMMENT */
static VOID
wheremsg() {
- extern int quiet, filrej;
- int n;
+ extern int quiet;
+ extern long filrej;
+ long n;
n = filcnt - filrej;
debug(F101,"wheremsg n","",n);
printf(" SENT: [%s]",sfspec);
if (srfspec)
printf(" To: [%s]",srfspec);
- printf(" (%s)\n", success ? "OK" : "FAILED");
+ printf(" (%s)\r\n", success ? "OK" : "FAILED");
}
break;
case 'r':
printf(" RCVD: [%s]",rrfspec);
if (rfspec)
printf(" To: [%s]",rfspec);
- printf(" (%s)\n", success ? "OK" : "FAILED");
+ printf(" (%s)\r\n", success ? "OK" : "FAILED");
}
}
} else if (n > 1) {
switch (myjob) {
case 's':
if (sfspec) {
- printf(" SENT: (%d files)",n);
+ printf(" SENT: (%ld files)",n);
if (srfspec)
printf(" Last: [%s]",srfspec);
- printf(" (%s)\n", success ? "OK" : "FAILED");
+ printf(" (%s)\r\n", success ? "OK" : "FAILED");
}
break;
case 'r':
case 'v':
if (rrfspec) {
- printf(" RCVD: (%d files)",n);
+ printf(" RCVD: (%ld files)",n);
if (rfspec)
printf(" Last: [%s]",rfspec);
- printf(" (%s)\n", success ? "OK" : "FAILED");
+ printf(" (%s)\r\n", success ? "OK" : "FAILED");
}
}
} else if (n == 0) {
if (myjob == 's')
- printf(" SENT: (0 files) \n");
+ printf(" SENT: (0 files) \r\n");
else if (myjob == 'r' || myjob == 'v')
- printf(" RCVD: (0 files) \n");
+ printf(" RCVD: (0 files) \r\n");
}
}
}
a {
int b1 = 0, b2 = 0;
if (!data) TINIT; /* "ABEND" -- Tell other side. */
+
+ if (!bctf) { /* Block check 3 forced on all packets */
#ifndef pdp11
- if (epktflg) { /* If because of E-PACKET command */
- b1 = bctl; b2 = bctu; /* Save block check type */
- bctl = bctu = 1; /* set it to 1 */
- }
+ if (epktflg) { /* If because of E-PACKET command */
+ b1 = bctl; b2 = bctu; /* Save block check type */
+ bctl = bctu = 1; /* set it to 1 */
+ }
#endif /* pdp11 */
+ }
errpkt((CHAR *)"User cancelled"); /* Send the packet */
+ if (!bctf) { /* Block check 3 forced on all packets */
#ifndef pdp11
- if (epktflg) { /* Restore the block check */
- epktflg = 0;
- bctl = b1; bctu = b2;
+ if (epktflg) { /* Restore the block check */
+ epktflg = 0;
+ bctl = b1; bctu = b2;
+ }
}
#endif /* pdp11 */
success = 0;
}
}
} else { /* User doesn't want message */
- p =zgtdir();
+ p = zgtdir();
if (!p) p = "";
success = (*p) ? 1 : 0;
ack1((CHAR *)p);
if (ikdbopen) slotstate(what,"REMOTE HELP", "", "");
#endif /* IKSDB */
#ifndef NOSERVER
- if (sndhlp(NULL)) {
+ if (sndhlp()) {
BEGIN ssinit; /* try to send it */
} else { /* If not ok, */
errpkt((CHAR *)"Can't send help"); /* send error message instead */
if (rc > -1) return(rc);
}
+<generic>M { /* REMOTE MESSAGE command */
+#ifndef NOSERVER
+ debug(F110,"RMSG",(char *)srvcmd+2,0);
+ xxscreen(SCR_MS,0,0L,(char *)(srvcmd+2));
+ ack();
+ RESUME;
+#endif /* NOSERVER */
+}
+
<generic>q { /* Interrupted or connection lost */
#ifndef NOSERVER
if (fatalio) { /* Connection lost */
ack(); /* If OK, acknowledge */
#endif /* CK_RESEND */
} else { /* Otherwise */
- extern long fsize;
+ extern CK_OFF_T fsize;
char *r;
r = getreason(iattr.reply.val);
ack1((CHAR *)iattr.reply.val); /* refuse to accept the file */
<ssinit>Y { /* ACK for Send-Init */
spar(rdatap); /* set parameters from it */
cancel = 0;
- bctu = bctr; /* switch to agreed-upon block check */
- bctl = (bctu == 4) ? 2 : bctu; /* Set block-check length */
+ if (bctf) {
+ bctu = 3;
+ bctl = 3;
+ } else {
+ bctu = bctr; /* switch to agreed-upon block check */
+ bctl = (bctu == 4) ? 2 : bctu; /* Set block-check length */
+ }
+
#ifdef CK_RESEND
if ((sendmode == SM_RESEND) && (!atcapu || !rscapu)) { /* RESEND */
errpkt((CHAR *) "RESEND capabilities not negotiated");
#endif /* CK_TMPDIR */
nakstate = 1; /* Can send NAKs from here. */
rinit(rdatap); /* Set parameters */
- bctu = bctr; /* Switch to agreed-upon block check */
- bctl = (bctu == 4) ? 2 : bctu; /* Set block-check length */
+ if (bctf) {
+ bctu = 3;
+ bctl = 3;
+ } else {
+ bctu = bctr; /* switch to agreed-upon block check */
+ bctl = (bctu == 4) ? 2 : bctu; /* Set block-check length */
+ }
what = W_RECV; /* Remember we're receiving */
lastxfer = W_RECV;
resetc(); /* Reset counters */
}
if (!s) s = "";
if (*s) {
- if (sstate == 's') {
+ if (sstate == 's') { /* Sending */
+ extern int xfermode;
+ int k = 0, x = 0, b = binary;
+ /*
+ If just one file we can scan it to set the xfer mode.
+ Otherwise it's up to the external protocol program.
+ */
+ if (patterns && xfermode == XMODE_A && !iswild(fspec)) {
+ extern int nscanfile;
+ k = scanfile(fspec,&x,nscanfile);
+ if (k > -1) {
+ b = (k == FT_BIN) ? XYFT_B : XYFT_T;
+ s = b ?
+ ptab[protocol].p_b_scmd :
+ ptab[protocol].p_t_scmd;
+ }
+ }
if ((int)strlen(s) + (int)strlen(fspec) < tmpbufsiz) {
sprintf(tmpbuf,s,fspec); /* safe (prechecked) */
tlog(F110,"Sending",fspec,0L);
}
- } else {
+ } else { /* Receiving */
if ((int)strlen(s) + (int)strlen(cmarg2) < tmpbufsiz) {
sprintf(tmpbuf,s,cmarg2); /* safe (prechecked) */
tlog(F110,"Receiving",cmarg2,0L);