ckuus6.c
资源名称:cku197.tar.Z [点击查看]
上传用户:dufan58
上传日期:2007-01-05
资源大小:3407k
文件大小:216k
源码类别:
通讯/手机编程
开发平台:
Windows_Unix
- extern char ** mtchs;
- #endif /* UNIX */
- int i, j, k, x;
- int fs = 0; /* Need to call fileselect() */
- int getval = 0, asking = 0;
- int simulate = 0, rc = 0;
- long minsize = -1L, maxsize = -1L;
- int havename = 0, confirmed = 0;
- int qflag = 0;
- char c;
- struct FDB sw, fi, fl;
- char
- * del_aft = NULL,
- * del_bef = NULL,
- * del_naf = NULL,
- * del_nbf = NULL,
- * del_exc = NULL;
- int
- x_lis = -1,
- /* x_dot = -1, */
- x_hdg = -1;
- char * dxlist[8];
- for (i = 0; i < 8; i++) dxlist[i] = NULL;
- g_matchdot = matchdot;
- saveask = xaskmore;
- if (del_lis > -1) x_lis = del_lis;
- if (del_dot > -1) matchdot = del_dot;
- if (del_hdg > -1) x_hdg = del_hdg;
- if (del_pag > -1) xaskmore = del_pag;
- if (del_ask > -1) asking = del_ask;
- cmfdbi(&sw, /* First FDB - command switches */
- _CMKEY, /* fcode */
- "File specification;n or switch",
- "", /* default */
- "", /* addtl string data */
- ndeltab, /* addtl numeric data 1: tbl size */
- 4, /* addtl numeric data 2: 4 = cmswi */
- xxstring, /* Processing function */
- deltab, /* Keyword table */
- &fi /* Pointer to next FDB */
- );
- cmfdbi(&fi, /* 2nd FDB - file to delete */
- _CMIFI, /* fcode */
- "File(s) to delete", /* hlpmsg */
- "", /* default */
- "", /* addtl string data */
- 0, /* addtl numeric data 1 */
- 0, /* addtl numeric data 2 */
- xxstring,
- NULL,
- &fl
- );
- cmfdbi(&fl, /* Anything that doesn't match */
- _CMFLD, /* fcode */
- "", /* hlpmsg */
- "", /* default */
- "", /* addtl string data */
- 0, /* addtl numeric data 1 */
- 0, /* addtl numeric data 2 */
- xxstring,
- NULL,
- NULL
- );
- while (!havename && !confirmed) {
- x = cmfdb(&sw); /* Parse something */
- if (x < 0) { /* Error */
- if (x == -3)
- break;
- if (x == -2 || x == -9)
- printf("?Does not match switch or filename: "%s"n",atmbuf);
- return(x);
- }
- if (cmresult.fcode != _CMKEY) /* Break out if not a switch */
- break;
- c = cmgbrk(); /* Get break character */
- if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) {
- printf("?This switch does not take an argumentn");
- rc = -9;
- goto xdelete;
- }
- if (!getval && (cmgkwflgs() & CM_ARG)) {
- printf("?This switch requires an argumentn");
- rc = -9;
- goto xdelete;
- }
- switch (k = cmresult.nresult) {
- case DEL_AFT:
- case DEL_BEF:
- case DEL_NAF:
- case DEL_NBF:
- if (!getval) break;
- if ((x = cmdate("File-time","",&s,0,xxstring)) < 0) {
- if (x == -3) {
- printf("?Date-time requiredn");
- x = -9;
- } else
- rc = x;
- goto xdelete;
- }
- fs++;
- switch (k) {
- case DEL_AFT: makestr(&del_aft,s); break;
- case DEL_BEF: makestr(&del_bef,s); break;
- case DEL_NAF: makestr(&del_naf,s); break;
- case DEL_NBF: makestr(&del_nbf,s); break;
- }
- break;
- case DEL_DOT:
- matchdot = 1;
- break;
- case DEL_NOD:
- matchdot = 0;
- break;
- case DEL_EXC:
- if (!getval) break;
- if ((x = cmfld("Pattern","",&s,xxstring)) < 0) {
- if (x == -3) {
- printf("?Pattern requiredn");
- x = -9;
- } else
- rc = x;
- goto xdelete;
- }
- fs++;
- makestr(&del_exc,s);
- break;
- case DEL_HDG:
- x_hdg = 1;
- break;
- case DEL_LIS:
- x_lis = 1;
- break;
- case DEL_NOL:
- x_lis = 0;
- break;
- #ifndef CK_TTGWSIZ
- case DEL_PAG:
- xaskmore = 1;
- break;
- case DEL_NOP:
- xaskmore = 0;
- break;
- #endif /* CK_TTGWSIZ */
- case DEL_QUI:
- qflag = 1;
- x_lis = 0;
- break;
- case DEL_VRB:
- x_lis = 1;
- break;
- case DEL_SMA:
- case DEL_LAR:
- if (!getval) break;
- if ((x = cmnum("File size in bytes","0",10,&y,xxstring)) < 0)
- return(x);
- fs++;
- switch (cmresult.nresult) {
- case DEL_SMA: minsize = y; break;
- case DEL_LAR: maxsize = y; break;
- }
- break;
- case DEL_SIM:
- simulate = 1;
- x_lis = 1;
- break;
- case DEL_ASK:
- asking = 1;
- break;
- case DEL_NAS:
- asking = 0;
- break;
- default:
- printf("?Not implemented yet - "%s"n",atmbuf);
- return(-9);
- }
- }
- if (qflag && (cmresult.fcode == _CMFLD)) {
- if ((x = cmcfm()) < 0)
- return(x);
- else
- return(success = 0);
- }
- if (cmresult.fcode != _CMIFI) {
- if (*atmbuf)
- printf("?Not a deletable file: %sn",atmbuf);
- else
- printf("?A file specification is requiredn");
- return(-9);
- }
- ckstrncpy(tmpbuf,cmresult.sresult,TMPBUFSIZ); /* Safe copy of filespec */
- if ((x = cmcfm()) < 0)
- return(x);
- #ifdef IKSD
- #ifdef CK_LOGIN
- if (inserver && isguest) {
- printf("?Sorry, DELETE unavailable to guestsn");
- return(-9);
- }
- #endif /* CK_LOGIN */
- #endif /* IKSD */
- #ifndef OS2ORUNIX
- if (simulate) {
- printf("?Sorry, /SIMULATE not implemented on this platformn");
- return(-9);
- }
- #endif /* OS2ORUNIX */
- #ifdef COMMENT
- /* (not needed) */
- if (!iswild(tmpbuf)) {
- char *m;
- x = zchki(tmpbuf);
- if (x < 0) {
- switch (x) {
- case -2: m = "Not a regular file"; break;
- case -1: m = "File not found or not accessible"; break;
- default: m = "Can't delete";
- }
- printf("?%s: "%s"n",m,tmpbuf);
- return(-9);
- }
- }
- #endif /* COMMENT */
- makelist(del_exc,dxlist,8);
- /* tmpbuf[] has the name - now do any needed conversions on it */
- #ifdef OS2
- { /* Lower level functions change / to , not good for CMD.EXE. */
- char *p = tmpbuf;
- while (*p) { /* Change them back to */
- if (*p == '/') *p = '\';
- p++;
- }
- }
- #endif /* OS2 */
- #ifdef VMS
- if (iswild(tmpbuf)) {
- #ifdef COMMENT
- /* Does not handle '.' as version separator */
- char *p = tmpbuf;
- x = 0;
- while (*p) {
- if (*p == ';') {
- x = 1;
- break;
- } else
- p++;
- }
- if (!x) strcat(tmpbuf,";*");
- #else
- j = 0; x = 0; /* for end_dot and number of dots */
- i = strlen(tmpbuf);
- if (tmpbuf[i] == ';') {
- strcat(tmpbuf,"0");
- } else {
- if (tmpbuf[i--] == '.')
- j++;
- for (; i >= 0; i--) {
- if (tmpbuf[i] == ';' || tmpbuf[i] == ':' ||
- tmpbuf[i] == ']' || tmpbuf[i] == '>')
- break;
- else if (tmpbuf[i] == '.')
- x++;
- }
- if (tmpbuf[i] != ';') { /* dot may have been used */
- if (j) { /* last char is dot */
- if (x)
- strcat(tmpbuf,"0"); /* second is version separator */
- else
- strcat(tmpbuf,";0"); /* 'foo.' */
- } else if (x == 1) /* lacking a version separator */
- strcat(tmpbuf,";0");
- else if (x == 0) /* x == 2 has a version */
- strcat(tmpbuf,".*;0");
- }
- }
- #endif /* COMMENT */
- }
- #endif /* VMS */
- debug(F110,"dodel tmpbuf",tmpbuf,0); /* Filename */
- #ifndef OS2ORUNIX /* No built-in DELETE code... */
- sprintf(line,"%s %s",DELCMD,tmpbuf); /* Construct the system command. */
- #ifdef VMS
- if (asking) { /* Maybe overwrite in VMS */
- if (x_lis) /* if options are needed... */
- sprintf(line,"%s /confirm/log %s",DELCMD,tmpbuf);
- else
- sprintf(line,"%s /confirm %s",DELCMD,tmpbuf);
- } else if (x_lis)
- sprintf(line,"%s /log %s",DELCMD,tmpbuf);
- conres();
- #endif /* VMS */
- debug(F110,"dodel line",line,0);
- #endif /* OS2ORUNIX */
- #ifdef MAC
- success = (zdelet(tmpbuf) == 0);
- #else
- #ifdef COMMENT
- nzxopts = ZX_FILONLY; /* Files only for now */
- if (matchdot) nzxopts |= ZX_MATCHDOT;
- /* Note: No recursive -- recursive deleting not supported yet */
- z = nzxpand(s,nzxopts); /* Expand file list */
- #endif /* COMMENT */
- #ifdef OS2ORUNIX
- {
- int filespace = 0;
- int len = 0;
- int count = 0;
- int lines = 0;
- int n = 0;
- s = tmpbuf;
- if (x_hdg > 0) {
- printf("Deleting %s...%sn", s, simulate ? " (SIMULATION)" : "");
- n += 2;
- }
- #ifdef ZXREWIND
- z = zxrewind(); /* Rewind file list */
- #else
- nzxopts = ZX_FILONLY; /* Files only for now */
- if (matchdot) nzxopts |= ZX_MATCHDOT;
- /* Note: No recursive -- recursive deleting not supported yet */
- z = nzxpand(s,nzxopts); /* Expand file list */
- #endif /* ZXREWIND */
- #ifdef UNIX
- sh_sort(mtchs,NULL,z,0,0,filecase);
- #endif /* UNIX */
- if (z > 0) {
- int i;
- success = 1;
- if (x_hdg > 0)
- printf("n");
- while (1) {
- znext(tmpbuf);
- if (!*tmpbuf)
- break;
- if (fs) if (fileselect(tmpbuf,
- del_aft,del_bef,del_naf,del_nbf,
- minsize,maxsize,0,8,dxlist) < 1) {
- if (x_lis > 0) {
- lines++;
- printf(" %s (SKIPPED)n",tmpbuf);
- #ifdef CK_TTGWSIZ
- if (++n > cmd_rows - 3)
- if (!askmore()) goto xdelete; else n = 0;
- #endif /* CK_TTGWSIZ */
- }
- continue;
- }
- if (asking) {
- int x;
- sprintf(line," Delete %s? ",tmpbuf);
- x = getyesno(line,1);
- switch (x) {
- case 0: continue;
- case 1: break;
- case 2: goto xdelete;
- }
- }
- len = zchki(tmpbuf);
- if (simulate) {
- filespace += len;
- count++;
- if (x_lis > 0) {
- lines++;
- printf(" %s (SELECTED)n",tmpbuf);
- if (++n > cmd_rows - 3)
- if (!askmore()) goto xdelete; else n = 0;
- }
- } else if (len >= 0) {
- zdelet(tmpbuf);
- if (zchki(tmpbuf) < 0) {
- filespace += len;
- count++;
- if (x_lis > 0) {
- lines++;
- printf(" %s (OK)n",tmpbuf);
- if (++n > cmd_rows - 3)
- if (!askmore()) goto xdelete; else n = 0;
- }
- } else {
- success = 0;
- if (x_lis > 0) {
- lines++;
- printf(" %s (FAILED)n",tmpbuf);
- if (++n > cmd_rows - 3)
- if (!askmore()) goto xdelete; else n = 0;
- }
- }
- } else if (x_lis > 0) {
- lines++;
- if (isdir(tmpbuf))
- printf(" %s (FAILED: directory)n",tmpbuf);
- else
- printf(" %s (FAILED: not regular file)n",tmpbuf);
- if (++n > cmd_rows - 3)
- if (!askmore()) goto xdelete; else n = 0;
- }
- }
- if (x_hdg > 0) {
- if (lines > 0)
- printf("n");
- if (++n > cmd_rows - 3)
- if (!askmore()) goto xdelete; else n = 0;
- printf("%d file%s %sdeleted, %d byte%s %sfreed%sn",
- count,
- count != 1 ? "s" : "",
- simulate ? "would be " : "",
- filespace,
- filespace != 1 ? "s" : "",
- simulate ? "would be " : "",
- simulate ? " (maybe)" : ""
- );
- }
- } else if (x_lis > 0)
- printf("?Can't delete: %sn",tmpbuf);
- }
- #else /* OS2ORUNIX */
- #ifndef VMS /* Others - let the system do it. */
- xsystem(line);
- x = nzxpand(tmpbuf,nzxopts);
- success = (x > 0) ? 0 : 1;
- if (x_hdg > 0)
- printf("%s - %sdeletedn", tmpbuf, success ? "" : "not ");
- #else
- if (asking)
- printf("n");
- x = xsystem(line); /* zshcmd returns 1 for success */
- success = (x > 0) ? 1 : 0;
- if (x_hdg > 0 && !asking)
- printf("%s - %sdeletedn", tmpbuf, success ? "" : "not ");
- concb((char)escape);
- #endif /* VMS */
- #endif /* OS2ORUNIX */
- #endif /* MAC */
- xdelete:
- if (g_matchdot > -1) {
- matchdot = g_matchdot; /* Restore these... */
- g_matchdot = -1;
- }
- if (saveask > -1) {
- xaskmore = saveask;
- saveask = -1;
- }
- return((rc < 0) ? rc : success);
- }
- #endif /* NOFRILLS */
- #ifndef NOSPL /* The ELSE command */
- _PROTOTYP( VOID pushqcmd, (char *) );
- int
- doelse() {
- if (!ifcmd[cmdlvl]) {
- printf("?ELSE doesn't follow IFn");
- return(-2);
- }
- #ifdef COMMENT
- /*
- Wrong. This prevents IF..ELSE IF...ELSE IF...ELSE IF...ELSE...
- from working.
- */
- ifcmd[cmdlvl] = 0;
- #endif /* COMMENT */
- if (!iftest[cmdlvl]) { /* If IF was false do ELSE part */
- if (maclvl > -1 || tlevel > -1) { /* In macro or command file */
- debug(F100,"doelse pushing","",0);
- #ifdef COMMENT
- pushcmd(NULL); /* save rest of command. */
- #else
- /* This fixes certain obscure problems */
- /* but breaks many other constructions that must work. */
- pushqcmd(NULL);
- #endif /* COMMENT */
- } else { /* If interactive, */
- cmini(ckxech); /* just start a new command */
- printf("n"); /* (like in MS-DOS Kermit) */
- if (pflag) prompt(xxstring);
- }
- } else { /* Condition is false */
- if ((y = cmtxt("command to be ignored","",&s,NULL)) < 0)
- return(y); /* Gobble up rest of line */
- }
- return(0);
- }
- #endif /* NOSPL */
- #ifndef NOSPL
- int
- doswitch() {
- char *lp, *ap; /* Macro argument pointer */
- int x, y, pp = 0;
- /* Get variable name */
- if ((y = cmfld("Variable name","",&s,xxstring)) < 0)
- return(y);
- if (!strcmp(s,"(")) {
- pp++;
- if ((y = cmfld("Variable name","",&s,xxstring)) < 0)
- return(y);
- s = tmpbuf;
- }
- if (*s == CMDQ) {
- if (chkvar(s) < 1) {
- printf("?Variable name requiredn");
- return(-9);
- }
- }
- ckstrncpy(tmpbuf,atmbuf,TMPBUFSIZ);
- if (pp > 0) { /* If open paren given parse closing */
- if ((y = cmfld("Closing parenthesis","",&s,NULL)) < 0)
- return(y);
- if (strcmp(atmbuf,")")) {
- printf("?Closing parenthesis requiredn");
- return(-9);
- }
- }
- lp = line;
- strcpy(lp,"_switx "); /* _switx + space */
- x = strlen(line);
- lp += x;
- ap = lp;
- debug(F110,"SWITCH",tmpbuf,0);
- ckstrncpy(lp,tmpbuf,LINBUFSIZ-x); /* + variable name */
- x = strlen(tmpbuf);
- lp += x;
- strcat(lp," "); /* + space */
- lp++;
- debug(F110,"SWITCH 2",line,0);
- /* Get body */
- if ((y = cmtxt("series of cases","",&s,NULL)) < 0) return(y);
- if ((y = (int)strlen(s)) < 1) return(-2);
- if (s[0] != '{' && s[y-1] != '}') { /* Supply braces if missing */
- sprintf(tmpbuf,"{ %s }",s);
- s = tmpbuf;
- }
- if (litcmd(&s,&lp,(LINBUFSIZ - (lp - (char *)line) - 2)) < 0) {
- printf("?Unbalanced bracesn");
- return(0);
- }
- debug(F110,"SWITCH 3",line,0);
- x = mlook(mactab,"_switx",nmac); /* Look up SWITCH macro definition */
- if (x < 0) { /* Not there? */
- addmmac("_switx",sw_def); /* Put it back. */
- if ((x = mlook(mactab,"_switx",nmac)) < 0) { /* Look it up again. */
- printf("?SWITCH macro definition gone!n"); /* Shouldn't happen. */
- return(success = 0);
- }
- }
- debug(F110,"SWITCH command",line,0); /* Execute the SWITCH macro. */
- return(success = dodo(x,ap,cmdstk[cmdlvl].ccflgs | CF_IMAC));
- }
- int
- dofor() { /* The FOR command. */
- int i, fx, fy, fz; /* loop variables */
- char *ap, *di; /* macro argument pointer */
- int pp = 0; /* Paren level */
- for (i = 0; i < 2; i++) {
- if ((y = cmfld("Variable name","",&s,NULL)) < 0) {
- if (y == -3) {
- printf("?Variable name requiredn");
- return(-9);
- } else
- return(y);
- }
- if (strcmp(s,"("))
- break;
- pp++;
- }
- if ((y = parsevar(s,&x,&z)) < 0) /* Check variable. */
- return(y);
- lp = line; /* Build a copy of the command */
- strcpy(lp,"_forx ");
- lp += (int)strlen(line); /* "_for" macro. */
- ap = lp; /* Save pointer to macro args. */
- if (*s == CMDQ) s++; /* Skip past backslash if any. */
- while (*lp++ = *s++) ; /* copy it */
- lp--; *lp++ = SP; /* add a space */
- if ((y = cmnum("initial value","",10,&fx,xxstring)) < 0) {
- if (y == -3) return(-2);
- else return(y);
- }
- debug(F101,"dofor fx","",fx);
- s = atmbuf; /* Copy the atom buffer */
- if ((int)strlen(s) < 1) goto badfor;
- /*
- In edit 192, we change the loop variables to be evaluated at loop entry,
- not each time through the loop. This was required in order to allow
- v(argc) to be used as a loop variable, or in a loop-variable expression.
- Thus, we can't have FOR loops that modify their own exit conditions by
- changing the final value or the increment. The problem with v(argc) was
- that it is on the macro stack; after entry into the _forx macro, it is at
- the wrong place.
- */
- sprintf(tmpbuf,"%d",fx); /* Substitute actual value */
- s = tmpbuf;
- while (*lp++ = *s++) ; /* (what they actually typed) */
- lp--; *lp++ = SP;
- if ((y = cmnum("final value","",10,&fy,xxstring)) < 0) {
- if (y == -3) return(-2);
- else return(y);
- }
- debug(F101,"dofor fy","",fy);
- s = atmbuf; /* Same deal */
- if ((int)strlen(s) < 1)
- goto badfor;
- sprintf(tmpbuf,"%d",fy);
- s = tmpbuf;
- while (*lp++ = *s++) ;
- lp--;
- *lp++ = SP;
- x_ifnum = 1; /* Increment or parenthesis */
- di = (fx < fy) ? "1" : "-1"; /* Default increment */
- if ((y = cmnum("increment",di,10,&fz,xxstring)) < 0) {
- debug(F111,"dofor increment",atmbuf,y);
- x_ifnum = 0;
- if (y == -3) { /* Premature termination */
- return(-2);
- } else if (y == -2) { /* Maybe closing paren */
- if (!strcmp(atmbuf,")")) {
- pp--; /* Count it */
- s = di; /* supply default interval */
- fz = atoi(s);
- } else /* Not closing paren, invalid */
- return(y);
- } else /* Other error */
- return(y);
- } else { /* Number */
- x_ifnum = 0;
- debug(F101,"dofor fz","",fz);
- s = atmbuf; /* Use it */
- }
- if ((int)strlen(s) < 1)
- goto badfor;
- sprintf(tmpbuf,"%d",fz); /* Same deal */
- s = tmpbuf;
- while (*lp++ = *s++) ;
- lp--; *lp++ = SP;
- /* Insert the appropriate comparison operator */
- if (fz < 0)
- *lp++ = '<';
- else
- *lp++ = '>';
- *lp++ = SP;
- if (pp > 0) { /* If open paren given parse closing */
- if ((y = cmfld("Closing parenthesis","",&s,NULL)) < 0)
- return(y);
- if (strcmp(atmbuf,")")) {
- printf("?Closing parenthesis requiredn");
- return(-9);
- }
- }
- if ((y = cmtxt("Command to execute","",&s,NULL)) < 0) return(y);
- if ((y = (int)strlen(s)) < 1) return(-2);
- if (s[0] != '{' && s[y-1] != '}') { /* Supply braces if missing */
- sprintf(tmpbuf,"{ %s }",s);
- s = tmpbuf;
- }
- if (litcmd(&s,&lp,(LINBUFSIZ - (lp - (char *)line) - 2)) < 0) {
- printf("?Unbalanced bracesn");
- return(0);
- }
- #ifdef COMMENT
- /* Too strict */
- if (fz == 0) {
- printf("?Zero increment not allowedn");
- return(0);
- }
- #endif /* COMMENT */
- x = mlook(mactab,"_forx",nmac); /* Look up FOR macro definition */
- if (x < 0) { /* Not there? */
- addmmac("_forx",for_def); /* Put it back. */
- if ((x = mlook(mactab,"_forx",nmac)) < 0) { /* Look it up again. */
- printf("?FOR macro definition gone!n"); /* Shouldn't happen. */
- return(success = 0);
- }
- }
- debug(F110,"FOR command",line,0); /* Execute the FOR macro. */
- return(success = dodo(x,ap,cmdstk[cmdlvl].ccflgs | CF_IMAC));
- badfor: printf("?Incomplete FOR commandn");
- return(-2);
- }
- #endif /* NOSPL */
- #ifndef NOFRILLS
- /* Do the BUG command */
- int
- dobug() {
- int n;
- char * s = "";
- extern char * k_info_dir;
- if (k_info_dir)
- s = k_info_dir;
- #ifdef COMMENT
- printf("n%s,%sn Numeric: %ld",versio,ckxsys,vernum);
- #endif /* COMMENT */
- printf(
- "nBefore requesting technical support from Columbia U., please consult:nn"
- );
- n = 7;
- #ifdef OS2
- printf(" . Your "Kermit 95" user manual (use the MANUAL command).n");
- printf(" . The technical reference manual, "Using C-Kermit".n");
- printf(" . The README.TXT file in Kermit 95's directory on your disk.n");
- printf(" . The BUGS.TXT file in Kermit 95's directory on your disk.n");
- n += 5;
- #else
- printf(" . The book "Using C-Kermit" (type HELP for more info).n");
- n += 1;
- #ifdef UNIX
- printf(" . The %sckermit2.txt and %sckcbwr.txt files.n",s,s);
- printf(" . The %sckubwr.txt and %sckuins.txt files.n",s,s);
- n += 2;
- #else
- #ifdef VMS
- printf(" . The CKERMIT2.TXT and CKCBWR.TXT files.n");
- printf(" . The CKVBWR.TXT and CKVINS.TXT files.n");
- n += 2;
- #else
- #ifdef datageneral
- printf(" . The ckermit2.txt and ckcbwr.txt files.n");
- printf(" . The ckdbwr.txt file.n");
- n += 2;
- #else
- #ifdef STRATUS
- printf(" . The ckermit2.txt and ckcbwr.txt files.n");
- printf(" . The cklbwr.txt filen");
- n += 2;
- #else
- #ifdef AMIGA
- printf(" . The ckermit2.txt and ckcbwr.txt files.n");
- printf(" . The ckibwr.txt filen");
- n += 2;
- #else
- #ifdef GEMDOS
- printf(" . The CKERMIT2.TXT and CKCBWR.TXT files.n");
- printf(" . The CKSBWR.TXT filen");
- n += 2;
- #else
- #ifdef MAC
- printf(" . The ckermit2.txt and ckcbwr.txt files.n");
- printf(" . The ckmbwr.txt filen");
- n += 2;
- #else
- #ifdef OSK
- printf(" . The ckermit2.txt and ckcbwr.txt files.n");
- printf(" . The ck9bwr.txt filen");
- n += 2;
- #else
- printf(" . The CKERMIT2.TXT and CKCBWR.TXT files.n");
- printf(" . The appropriate system-dependent CK?BWR.TXT file.n");
- n += 2;
- #endif
- #endif
- #endif
- #endif
- #endif
- #endif
- #endif
- #endif
- #endif /* OS2 */
- printf(" . Your own organization's support staff, if any.n");
- printf(
- " . The comp.protocols.kermit.misc newsgroup.n");
- printf(
- " . The Kermit support website, http://www.columbia.edu/kermit/support.html.n"
- );
- printf(
- " . The Kermit FAQ, http://www.columbia.edu/kermit/faq.html.n");
- printf(
- " . The C-Kermit FAQ, http://www.columbia.edu/kermit/ckfaq.html.n");
- n += 4;
- if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
- printf("n
- If you still need help or have a bug to report after consulting these sources,"
- );
- printf("nsend e-mail to:nn");
- n += 2;
- if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
- printf(" kermit-support@columbia.edunn");
- n += 1;
- if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
- printf("Or contact us by post:nn");
- printf(
- " Kermit, Columbia University, 612 W 115 Street, New York NY 10025, USAnn"
- );
- n += 1;
- if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
- printf("Or by fax at +1 (212) 663-8202.nn");
- n += 1;
- if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
- printf("Telephone support is available too:nn");
- n += 1;
- if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
- printf(" +1 (900) 555-5595, USA only, $2.50 per minuten");
- if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
- printf(
- " +1 (212) 854-5126, from anywhere, $25.00 USD per call, MC/Visann");
- n += 1;
- if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
- #ifndef NOSHOW
- #ifndef NOFRILLS
- printf(
- "Before reporting problems, please use the SHOW VERSION and SHOW FEATURESn");
- if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
- printf(
- "commands to get detailed program version and configuration information.nn");
- #endif /* NOFRILLS */
- #endif /* NOSHOW */
- return(1);
- }
- #endif /* NOFRILLS */
- #ifndef NOSPL
- /* T O D 2 S E C -- Convert time of day as hh:mm:ss to secs since midnite */
- /*
- Call with a string hh:mm or hh:mm:ss.
- Returns a 0 to 86400 on success, or a negative number on failure.
- */
- long
- tod2sec(t) char * t; {
- long t2;
- long hh = 0L, mm = 0L, ss = 0L;
- if (!t) t = "";
- if (!*t)
- return(-3);
- debug(F110,"tod2sec",t,0);
- if (isdigit(*t)) /* Get hours from argument */
- hh = *t++ - '0';
- else
- return(-1L);
- if (isdigit(*t))
- hh = hh * 10 + *t++ - '0';
- #ifdef COMMENT
- if (hh > 24L)
- return(-1L);
- #endif /* COMMENT */
- if (*t == ':')
- t++;
- else if (!*t)
- goto xtod2sec;
- else
- return(-1L);
- if (isdigit(*t)) /* Minutes */
- mm = *t++ - '0';
- else
- return(-1L);
- if (isdigit(*t))
- mm = mm * 10 + *t++ - '0';
- if (mm > 60L)
- return(-1L);
- if (*t == ':')
- t++;
- else if (!*t)
- goto xtod2sec;
- else
- return(-1L);
- if (isdigit(*t)) /* Seconds */
- ss = *t++ - '0';
- else
- return(-1L);
- if (isdigit(*t))
- ss = ss * 10 + *t++ - '0';
- if (ss > 60L)
- return(-1L);
- if (*t > 32) /* No trailing junk allowed */
- return(-1L);
- xtod2sec:
- t2 = hh * 3600L + mm * 60L + ss; /* Seconds since midnight from arg */
- debug(F101,"tod2sec t2","",t2);
- return(t2);
- }
- int waitinterval = 1;
- #ifdef OLDWAIT
- #undef OLDWAIT
- #endif /* OLDWAIT */
- int kbchar = NUL;
- int
- dopaus(cx) int cx; {
- long zz;
- extern int sleepcan;
- #ifdef OLDWAIT
- zz = -1L;
- x_ifnum = 1; /* Turn off internal complaints */
- if (cx == XXWAI)
- y = cmnum("seconds to wait, or time of day hh:mm:ss","1",10,&x,xxstring);
- else if (cx == XXPAU)
- y = cmnum("seconds to pause, or time of day hh:mm:ss",
- "1",10,&x,xxstring);
- else
- y = cmnum("milliseconds to sleep, or time of day hh:mm:ss",
- "100",10,&x,xxstring);
- x_ifnum = 0;
- if (y < 0) {
- if (y == -2) { /* Invalid number or expression */
- char *p = tmpbuf; /* Retrieve string from atmbuf */
- int n = TMPBUFSIZ;
- *p = NUL;
- zzstring(atmbuf,&p,&n); /* Evaluate in case it's a variable */
- zz = tod2sec(tmpbuf); /* Convert to secs since midnight */
- if (zz < 0L) {
- printf("?Number, expression, or time of day requiredn");
- return(-9);
- } else {
- char now[32]; /* Current time */
- char *p;
- long tnow;
- p = now;
- ztime(&p);
- tnow = atol(p+11) * 3600L + atol(p+14) * 60L + atol(p+17);
- if (zz < tnow) /* User's time before now */
- zz += 86400L; /* So make it tomorrow */
- zz -= tnow; /* Seconds from now. */
- }
- } else
- return(y);
- }
- if (x < 0) x = 0;
- switch (cx) {
- case XXPAU: /* PAUSE */
- case XXMSL: /* MSLEEP */
- if ((y = cmcfm()) < 0) return(y);
- break;
- case XXWAI: /* WAIT */
- z = 0; /* Modem signal mask */
- while (1) { /* Read zero or more signal names */
- y = cmkey(mstab,nms,"modem signal","",xxstring);
- if (y == -3) break; /* -3 means they typed CR */
- if (y < 0) return(y); /* Other negatives are errors */
- z |= y; /* OR the bit into the signal mask */
- }
- if ((y = cmcfm()) < 0) return(y);
- break;
- default: /* Shouldn't happen */
- return(-2);
- }
- /* Command is entered, now do it. */
- if (zz > -1L) { /* Time of day given? */
- x = zz;
- if (zz != (long) x) {
- printf(
- "Sorry, arithmetic overflow - hh:mm:ss not usable on this platform.n"
- );
- return(-9);
- }
- }
- if (cx == XXMSL) { /* Millisecond sleep */
- msleep(zz < 0 ? x : x * 1000);
- return(success = 1);
- }
- if (cx == XXPAU && !sleepcan) { /* SLEEP CANCELLATION is OFF */
- sleep(x);
- return(success = 1);
- }
- /* WAIT, or else SLEEP with cancellation allowed... */
- do { /* Sleep loop */
- int mdmsig;
- if (sleepcan) { /* Keyboard cancellation allowed? */
- if (y = conchk()) { /* Did they type something? */
- #ifdef COMMENT
- while (y--) coninc(0); /* Yes, gobble it all up */
- #else
- /* There is a debate over whether PAUSE should absorb */
- /* its cancelling character(s). There are several */
- /* reasons why it should gobble at least one character: */
- /* (1) MS-DOS Kermit does it */
- /* (2) if not, subsequent PAUSE commands will terminate */
- /* immediately */
- /* (3) if not, subsequent ASK commands will use it as */
- /* valid input. If 13, then it will get no input */
- /* (4) if not, then the character appears on the command */
- /* line after all enclosing macros are complete. */
- kbchar = coninc(0); /* Gobble one up */
- #endif /* COMMENT */
- break; /* And quit PAUSing or WAITing */
- }
- }
- if (cx == XXWAI) { /* WAIT (z == modem signal mask) */
- debug(F101,"WAIT x","",x);
- if (z > 0) { /* Looking for any modem signals? */
- mdmsig = ttgmdm(); /* Yes, get them */
- if (mdmsig < 0) /* Failed */
- return(success = 0);
- if ((mdmsig & z) == z) /* Got what we wanted? */
- return(success = 1); /* Succeed */
- }
- if (x == 0) /* WAIT 0 and didn't get our signals */
- break;
- }
- sleep(1); /* No interrupt, sleep one second */
- } while (--x > 0);
- if (cx == XXWAI) /* If WAIT and loop exhausted */
- success = (z == 0); /* Fail. */
- else /* */
- success = (x == 0); /* Set SUCCESS/FAILURE for PAUSE. */
- return(success);
- #else /* New code uses chained FDBs and allows FILE waits... */
- char * m = ""; /* Help message */
- struct FDB nu, fl, kw; /* Parse function descriptor blocks */
- int filewait = 0;
- int mdmsig = 0, fs = 0;
- char filedate[32];
- kbchar = 0;
- switch (cx) {
- case XXWAI: m = "seconds to wait, or time of day hh:mm:ss"; break;
- case XXPAU: m = "seconds to pause, or time of day hh:mm:ss"; break;
- case XXMSL: m = "milliseconds to sleep, or time of day hh:mm:ss"; break;
- }
- zz = -1L;
- cmfdbi(&nu,
- _CMNUM, /* Number */
- m, /* Help message */
- (cx == XXMSL) ? "100" : "1", /* Default */
- "", /* N/A */
- 0, /* N/A */
- 0, /* N/A */
- xxstring, /* Processing function */
- NULL, /* N/A */
- &fl /* Next */
- );
- cmfdbi(&fl, /* Time of day */
- _CMFLD, /* Field */
- "", /* hlpmsg */
- "", /* default */
- "", /* addtl string data */
- 0, /* addtl numeric data 1 */
- 0, /* addtl numeric data 2 */
- xxstring, /* processing func */
- NULL, /* N/A */
- NULL /* No next */
- );
- x = cmfdb(&nu); /* Parse a number or a field */
- if (x < 0) {
- if (x == -3)
- x = -2;
- return(x);
- }
- switch (cmresult.fcode) {
- case _CMNUM: /* Number */
- x = cmresult.nresult;
- break;
- case _CMFLD: /* Field */
- zz = tod2sec(cmresult.sresult); /* Convert to secs since midnight */
- if (zz < 0L) {
- printf("?Number, expression, or time of day requiredn");
- return(-9);
- } else {
- char now[32]; /* Current time */
- char *p;
- long tnow;
- p = now;
- ztime(&p);
- tnow = atol(p+11) * 3600L + atol(p+14) * 60L + atol(p+17);
- if (zz < tnow) /* User's time before now */
- zz += 86400L; /* So make it tomorrow */
- zz -= tnow; /* Seconds from now. */
- }
- }
- debug(F101,"PAUSE/WAIT/MSLEEP zz","",zz);
- switch (cx) {
- case XXPAU: /* PAUSE */
- case XXMSL: /* MSLEEP */
- if ((y = cmcfm()) < 0) return(y);
- break;
- case XXWAI: /* WAIT */
- z = 0; /* Modem signal mask */
- y = cmkey(waittab,nwaittab,"","",xxstring);
- if (y < 0) {
- if (y == -3) {
- if ((y = cmcfm()) < 0)
- return(y);
- break;
- } else
- return(y);
- }
- if (y == WAIT_FIL) { /* FILE */
- int wild = 0;
- if ((z = cmkey(wfswi,nwfswi,"event","",xxstring)) < 0)
- return(z);
- filewait = z;
- if (filewait == WF_MOD || filewait == WF_DEL)
- z = cmifi("Filename","",&s,&wild,xxstring);
- else
- z = cmfld("Filename","",&s,xxstring);
- if (z < 0)
- return(z);
- if (wild || (filewait == WF_CRE) && iswild(s)) {
- printf("?Wildcards not valid heren");
- return(-9);
- }
- strcpy(tmpbuf,s);
- if ((z = cmcfm()) < 0)
- return(z);
- break;
- } else if (y != WAIT_MDM) { /* A modem signal */
- z |= y; /* OR the bit into the signal mask */
- }
- if (!filewait) { /* Modem signals... */
- while (1) { /* Get zero or more signal names */
- y = cmkey(mstab,nms,"modem signal","",xxstring);
- if (y == -3) break; /* -3 means they typed CR */
- if (y < 0) return(y); /* Other negatives are errors */
- z |= y; /* OR the bit into the signal mask */
- }
- if ((y = cmcfm()) < 0) return(y);
- break;
- }
- default: /* Shouldn't happen */
- return(-2);
- } /* switch (cx) */
- /* Command is entered, now do it. */
- if (zz > -1L) { /* Time of day given? */
- x = zz;
- if (zz != (long) x) {
- printf(
- "Sorry, arithmetic overflow - hh:mm:ss not usable on this platform.n"
- );
- return(-9);
- }
- }
- if (sleepcan)
- concb((char)escape); /* Ensure single-char wakeup */
- if (cx == XXMSL) { /* Millisecond sleep */
- msleep(zz < 0 ? x : x * 1000);
- return(success = 1);
- }
- if (cx == XXPAU && !sleepcan) { /* SLEEP CANCELLATION is OFF */
- sleep(x);
- return(success = 1);
- }
- if (filewait) { /* FILE... */
- fs = zchki(tmpbuf); /* Check if file exists */
- switch (filewait) {
- case WF_DEL:
- if (fs == -1)
- return(success = 1);
- break;
- case WF_MOD:
- if (fs == -1) {
- printf("?File does not exit: %sn",tmpbuf);
- return(-9);
- }
- s = zfcdat(tmpbuf); /* Get current modification date */
- if (!s) s = "";
- if (ckstrncpy(filedate,s,32) != 17) {
- printf("?Can't get modification time: %sn",tmpbuf);
- return(-9);
- }
- break;
- case WF_CRE:
- if (fs > -1)
- return(success = 1);
- break;
- }
- }
- do { /* Polling loop */
- if (sleepcan) { /* Keyboard cancellation allowed? */
- if ((y = conchk()) > 0) { /* Did they type something? */
- kbchar = coninc(0); /* Yes, get first char they typed */
- debug(F000,"WAIT kbchar","",kbchar);
- #ifdef COMMENT
- while (--y > 0) /* Gobble the rest up */
- coninc(0);
- #endif /* COMMENT */
- return(success = 0); /* And quit PAUSing or WAITing */
- }
- }
- if (filewait == 0) {
- if (cx == XXWAI) { /* WAIT for modem signals */
- if (z != 0) {
- mdmsig = ttgmdm(); /* Get them. */
- debug(F101,"WAIT ttgmdm","",mdmsig);
- if (mdmsig < 0) /* Failure to get them? */
- return(success = 0); /* Fail. */
- if ((mdmsig & z) == z) /* Got desired ones? */
- return(success = 1); /* Succeed. */
- } else if (x == 0)
- return(success = 0);
- }
- } else { /* FILE... */
- fs = zchki(tmpbuf); /* Get file status */
- if (filewait == WF_MOD) { /* Wait for modification */
- if (fs == -1) /* Failure to get status */
- return(success = 0); /* so WAIT fails. */
- s = zfcdat(tmpbuf); /* Get current modification time */
- if (!s) s = ""; /* And compare with the time */
- if (strcmp(s,filedate)) /* when the WAIT started */
- return(success = 1);
- } else if (filewait == WF_DEL) { /* Wait for deletion */
- if (fs == -1) /* If file doesn't exist, */
- return(success = 1); /* succeed. */
- } else if (filewait == WF_CRE) { /* Wait for creation */
- if (fs != -1) /* If file exists */
- return(success = 1); /* succeed. */
- }
- }
- if (x < 1) /* SLEEP/WAIT/PAUSE 0 */
- break;
- sleep(waitinterval); /* No interrupt, sleep */
- x -= waitinterval; /* Deduct sleep time */
- } while (x > 0);
- if (cx == XXWAI) /* WAIT time expired */
- success = (z == 0); /* Succeed if no modem signals */
- else /* For SLEEP or PAUSE, success */
- success = (x == 0); /* depends on whether it was */
- return(success); /* interrupted from the keyboard. */
- #endif /* OLDWAIT */
- }
- #endif /* NOSPL */
- #ifndef NOFRILLS
- #ifdef ZCOPY
- int
- docopy() {
- int i, x, listing = 0, havename = 0;
- struct FDB sw, fi;
- int swapping = 0;
- int appending = 0;
- int fromb64 = 0;
- int tob64 = 0;
- cmfdbi(&sw, /* 2nd FDB - optional /PAGE switch */
- _CMKEY, /* fcode */
- "Filename or switch", /* hlpmsg */
- "", /* default */
- "", /* addtl string data */
- ncopytab, /* addtl numeric data 1: tbl size */
- 4, /* addtl numeric data 2: 4 = cmswi */
- xxstring, /* Processing function */
- copytab, /* Keyword table */
- &fi /* Pointer to next FDB */
- );
- cmfdbi(&fi, /* 1st FDB - file to type */
- _CMIFI, /* fcode */
- "", /* hlpmsg */
- "", /* default */
- "", /* addtl string data */
- 0, /* addtl numeric data 1 */
- 0, /* addtl numeric data 2 */
- xxstring,
- NULL,
- NULL
- );
- while (!havename) {
- x = cmfdb(&sw); /* Parse something */
- if (x < 0) /* Error */
- return(x);
- switch (cmresult.fcode) {
- case _CMKEY:
- switch (cmresult.nresult) {
- case DEL_LIS:
- case DEL_VRB:
- listing = 1;
- break;
- case DEL_NOL:
- case DEL_QUI:
- listing = 0;
- break;
- case 999:
- swapping = 1;
- break;
- case 998:
- appending = 1;
- break;
- #ifndef NOSPL
- case 997:
- fromb64 = 1;
- break;
- case 996:
- tob64 = 1;
- break;
- #endif /* NOSPL */
- }
- break;
- case _CMIFI:
- s = cmresult.sresult;
- havename = 1;
- break;
- default:
- return(-2);
- }
- }
- if (cmresult.nresult > 0) { /* No wildcards allowed */
- printf(
- "n?Multiple files not allowed - please specify a single file.n");
- return(-9);
- }
- ckstrncpy(line,s,LINBUFSIZ); /* Make a safe copy of source name */
- p = line + (int)strlen(line) + 2; /* Place for destination name */
- if ((x = cmofi("destination name and/or directory",
- #ifdef UNIX
- "."
- #else
- ""
- #endif /* UNIX */
- ,&s,xxstring)) < 0) {
- /* Get destination name */
- if (x == -3) {
- printf("?Name for destination file requiredn");
- return(-9);
- } else return(x);
- }
- ckstrncpy(p,s,LINBUFSIZ-(p-line)); /* Safe copy of destination name */
- if ((y = cmcfm()) < 0) return(y);
- if (appending && swapping) {
- printf("?Sorry, /APPEND and /SWAP conflictn");
- return(-9);
- }
- #ifdef VMS
- conres(); /* Let Ctrl-C work. */
- #endif /* VMS */
- debug(F110,"docopy line",line,0);
- debug(F110,"docopy p",p,0);
- if (iswild(line)) {
- printf("?Wildcards not allowedn");
- return(-9);
- }
- #ifdef IKSD
- if (zchki(p) > -1) { /* Destination file exists? */
- if (inserver && (!ENABLED(en_del)
- #ifdef CK_LOGIN
- || isguest
- #endif /* CK_LOGIN */
- )) {
- printf("?Sorry, changing existing files is disabledn");
- return(-9);
- }
- }
- #endif /* IKSD */
- if (listing) printf("%s => %s ",line,p);
- if (tob64 && fromb64) { /* To and from B64 = no conversion */
- tob64 = 0;
- fromb64 = 0;
- }
- if (!swapping && !appending && !fromb64 && !tob64) { /* Straight copy */
- if ((x = zcopy(line,p)) < 0) { /* Let zcopy() do it. */
- switch (x) {
- case -2:
- printf("?Not a regular file - "%s"n", line);
- break;
- case -3:
- printf("?Not found or not accessible - "%s"n", line);
- break;
- case -4:
- printf("?Permission deniedn");
- break;
- case -5:
- printf("?Source and destination are the same filen");
- break;
- case -6:
- printf("?Input/Output errorn");
- break;
- case -7:
- printf("?Error opening output file - "%s"n", p);
- break;
- default:
- printf("?Can't copy %s to %sn",line,p);
- }
- #ifdef VMSORUNIX
- concb((char)escape);
- #endif /* VMSORUNIX */
- return(-9);
- } else {
- #ifdef VMSORUNIX
- concb((char)escape);
- #endif /* VMSORUNIX */
- if (listing) printf("(OK)n");
- return(success = 1);
- }
- } else { /* Special options */
- int prev, y, x = 0; /* Variables needed for them */
- int rc = 0, i, t;
- char ibuf[100];
- char obuf[200];
- FILE * in = NULL;
- FILE * out = NULL;
- errno = 0; /* Reset errno */
- if ((in = fopen(line,"r")) == NULL) { /* Open input file */
- perror(line);
- return(-9);
- }
- if ((out = fopen(p, (appending ? "a" : "w"))) == NULL) {
- fclose(in);
- perror(p);
- return(-9);
- }
- #ifndef NOSPL
- if (tob64) { /* Converting to Base-64 */
- while (1) {
- prev = x;
- if ((x = fread(ibuf,1,54,in)) < 1) {
- rc = 1;
- break;
- }
- if (prev % 3) {
- printf("?Phase error: %dn", prev);
- rc = -9;
- break;
- }
- if (swapping) {
- if (x & 1) {
- printf("?Swap errorn");
- rc = -9;
- break;
- }
- for (i = 0; i < x; i+=2) {
- t = ibuf[i];
- ibuf[i] = ibuf[i+1];
- ibuf[i+1] = t;
- }
- }
- if ((y = b8tob64(ibuf,x,obuf,180)) < 0) {
- printf("?Encoding errorn");
- rc = -9;
- break;
- }
- fprintf(out,"%sn",obuf);
- }
- } else if (fromb64) { /* Converting from Base 64 */
- if ((out = fopen(p,appending ? "a" : "w")) == NULL) {
- fclose(in);
- perror(p);
- return(-9);
- }
- x = 1;
- while (x) {
- x = fread(ibuf,1,80,in);
- if ((y = b64tob8(ibuf,x,obuf,80)) < 0) {
- printf("?Decoding errorn");
- rc = -9;
- break;
- }
- if (swapping) {
- if (x & 1) {
- printf("?Swap errorn");
- rc = -9;
- break;
- }
- for (i = 0; i < y; i+=2) {
- t = obuf[i];
- obuf[i] = obuf[i+1];
- obuf[i+1] = t;
- }
- }
- if (y > 0) {
- if (fwrite(obuf,1,y,out) < 1) {
- perror(p);
- rc = -9;
- break;
- }
- }
- }
- } else
- #endif /* NOSPL */
- if (swapping) { /* Swapping bytes */
- char c[3];
- c[2] = NUL;
- while (1) {
- x = fread((char *)c,1,2,in);
- if (x < 1) {
- rc = 1;
- break;
- } else if (x == 1) {
- c[1] = c[0];
- c[0] = NUL;
- printf(
- "?WARNING: source file contains odd number of bytesn");
- }
- if (fprintf(out,"%c%c",c[1],c[0]) == EOF) {
- perror(p);
- rc = -9;
- break;
- }
- }
- } else if (appending) { /* Appending to target file */
- char c;
- while (1) {
- x = fread(&c,1,1,in);
- if (x < 1) {
- rc = 1;
- break;
- }
- if (fwrite(&c,1,1,out) < 1) {
- perror(p);
- rc = -9;
- break;
- }
- }
- }
- if (out) fclose(out);
- if (in) fclose(in);
- if (rc > -1) success = rc;
- return(rc);
- }
- }
- #endif /* ZCOPY */
- #endif /* NOFRILLS */
- #ifndef NORENAME
- #ifndef NOFRILLS
- #ifdef ZRENAME
- int
- dorenam() {
- /* Parse a file or a directory name */
- int i, x, listing = 0, havename = 0;
- struct FDB sw, fi;
- cmfdbi(&sw, /* 2nd FDB - optional /PAGE switch */
- _CMKEY, /* fcode */
- "Filename or switch", /* hlpmsg */
- "", /* default */
- "", /* addtl string data */
- nqvswtab, /* addtl numeric data 1: tbl size */
- 4, /* addtl numeric data 2: 4 = cmswi */
- xxstring, /* Processing function */
- qvswtab, /* Keyword table */
- &fi /* Pointer to next FDB */
- );
- cmfdbi(&fi, /* 1st FDB - file to type */
- _CMIFI, /* fcode */
- "", /* hlpmsg */
- "", /* default */
- "", /* addtl string data */
- 0, /* addtl numeric data 1 */
- 0, /* addtl numeric data 2 */
- xxstring,
- NULL,
- NULL
- );
- while (!havename) {
- x = cmfdb(&sw); /* Parse something */
- if (x < 0) /* Error */
- return(x);
- switch (cmresult.fcode) {
- case _CMKEY:
- switch (cmresult.nresult) {
- case DEL_LIS:
- case DEL_VRB:
- listing = 1;
- break;
- case DEL_NOL:
- case DEL_QUI:
- listing = 0;
- break;
- }
- break;
- case _CMIFI:
- s = cmresult.sresult;
- havename = 1;
- break;
- default:
- return(-2);
- }
- }
- if (cmresult.nresult > 0) { /* No wildcards allowed */
- printf(
- "n?Multiple files not allowed - please specify a single file.n");
- return(-9);
- }
- ckstrncpy(line,s,LINBUFSIZ); /* Make a safe copy of the old name */
- p = line + (int)strlen(line) + 2; /* Place for new name */
- if ((x = cmofi("New name","",&s,xxstring)) < 0) { /* Get new name */
- if (x == -3) {
- printf("?New name for file requiredn");
- return(-9);
- } else return(x);
- }
- ckstrncpy(p,s,LINBUFSIZ-(p-line)); /* Make a safe copy of the new name */
- if ((y = cmcfm()) < 0) return(y);
- #ifdef VMS
- conres(); /* Let Ctrl-C work. */
- #endif /* VMS */
- debug(F110,"dorename line",line,0);
- debug(F110,"dorename p",p,0);
- if (listing) printf("%s => %s ",line,p);
- if (zrename(line,p) < 0) {
- printf("?Can't rename %s to %sn",line,p);
- #ifdef VMS
- concb((char)escape);
- #endif /* VMS */
- return(-9);
- } else {
- #ifdef VMS
- concb((char)escape);
- #endif /* VMS */
- if (listing) printf("(OK)n");
- return(success = 1);
- }
- }
- #endif /* ZRENAME */
- #endif /* NOFRILLS */
- #endif /* NORENAME */
- #ifndef NOSPL
- /* Do the RETURN command */
- int
- doreturn(s) char *s; {
- int x; char *p;
- extern int tra_asg;
- if (maclvl < 0) {
- printf("n?Can't return from level %dn",maclvl);
- return(success = 0);
- }
- lp = line; /* Expand return value now */
- x = LINBUFSIZ-1;
- if (!s) s = "";
- if (zzstring(s,&lp,&x) > -1) {
- s = line;
- debug(F110,"RETURN parse",s,0);
- }
- /* Pop from all FOR/WHILE/SWITCH/XIFs */
- while ((maclvl > 0) &&
- (m_arg[maclvl-1][0]) &&
- (cmdstk[cmdlvl].src == CMD_MD) &&
- (!strncmp(m_arg[maclvl-1][0],"_xif",4) ||
- !strncmp(m_arg[maclvl-1][0],"_for",4) ||
- !strncmp(m_arg[maclvl-1][0],"_swi",4) ||
- !strncmp(m_arg[maclvl-1][0],"_whi",4))) {
- debug(F110,"RETURN popping",m_arg[maclvl-1][0],0);
- dogta(XXPTA); /* Put args back */
- popclvl(); /* Pop up two levels */
- popclvl();
- debug(F101,"RETURN maclvl 2","",maclvl);
- }
- if (tra_asg) { /* If tracing show return value */
- if (*s)
- printf("<<< %s: "%s"n", m_arg[maclvl][0], s);
- else
- printf("<<< %s: (null)n", m_arg[maclvl][0]);
- }
- popclvl(); /* Pop from enclosing TAKE or macro */
- debug(F101,"RETURN maclvl 3","",maclvl);
- x = (int)strlen(s); /* Length of return value */
- if (x > 0) { /* Have return value? */
- p = malloc(x+2); /* Allocate a place to keep it */
- if (mrval[maclvl+1]) { /* Free old one, if any */
- free(mrval[maclvl+1]);
- mrval[maclvl+1] = NULL;
- }
- if (p) { /* Did we get a place? */
- strcpy(p, s); /* Yes, copy the string into it. */
- mrval[maclvl+1] = p; /* Make return value point to it. */
- debug(F110,"RETURN copy",mrval[maclvl],0);
- } else { /* No, could not get space. */
- mrval[maclvl+1] = NULL; /* Return null pointer. */
- x = 0; /* Set failure return code. */
- }
- } else if (mrval[maclvl+1]) {
- makestr(&(mrval[maclvl+1]),NULL); /* Blank return code */
- }
- #ifdef COMMENT
- /* What the heck is this? */
- return(success = x ? 1 : 0); /* Return status code */
- #else
- /* RETURN should not affect SUCCESS/FAILURE */
- return(0);
- #endif /* COMMENT */
- }
- #endif /* NOSPL */
- #ifndef NOSPL
- /* Do the OPEN command */
- int
- doopen() { /* OPEN { append, read, write } */
- int x, y, z = 0; char *s;
- static struct filinfo fcb; /* (must be static) */
- if ((x = cmkey(opntab,nopn,"mode","",xxstring)) < 0) {
- if (x == -3) {
- printf("?Mode requiredn");
- return(-9);
- } else return(x);
- }
- switch (x) {
- case OPN_FI_R: /* Old file (READ) */
- if (chkfn(ZRFILE) > 0) {
- printf("?Read file already openn");
- return(-2);
- }
- if ((z = cmifi("File to read","",&s,&y,xxstring)) < 0) {
- if (z == -3) {
- printf("?Input filename requiredn");
- return(-9);
- } else return(z);
- }
- if (y) { /* No wildcards allowed */
- printf("n?Please specify a single filen");
- return(-2);
- }
- ckstrncpy(line,s,LINBUFSIZ);
- if ((int)strlen(line) < 1) return(-2);
- if ((z = cmnum("buffer size","4096",10,&y,xxstring)) < 0)
- return(z);
- if (y < 1) {
- printf("?Positive number requiredn");
- return(-9);
- }
- if ((z = cmcfm()) < 0) return(z);
- readblock = y;
- if (readbuf)
- free(readbuf);
- if (!(readbuf = (CHAR *) malloc(readblock+1))) {
- printf("?Can't allocate read buffern");
- return(-9);
- }
- return(success = zopeni(ZRFILE,line));
- #ifndef MAC
- #ifndef NOPUSH
- case OPN_PI_R: /* Pipe/Process (!READ) */
- if (nopush) {
- printf("?Read from pipe disabledn");
- return(success=0);
- }
- if (chkfn(ZRFILE) > 0) {
- printf("?Read file already openn");
- return(-2);
- }
- if ((y = cmtxt("System command to read from","",&s,xxstring)) < 0) {
- if (y == -3) {
- printf("?Command name requiredn");
- return(-9);
- } else return(y);
- }
- ckstrncpy(line,s,LINBUFSIZ);
- if ((int)strlen(line) < 1) return(-2);
- if ((y = cmcfm()) < 0) return(y);
- if (!readbuf) {
- if (!(readbuf = (CHAR *) malloc(readblock+1))) {
- printf("?Can't allocate read buffern");
- return(-9);
- }
- }
- return(success = zxcmd(ZRFILE,line));
- case OPN_PI_W: /* Write to pipe */
- if (nopush) {
- printf("?Write to pipe disabledn");
- return(success=0);
- }
- if (chkfn(ZWFILE) > 0) {
- printf("?Write file already openn");
- return(-2);
- }
- if ((y = cmtxt("System command to write to","",&s,xxstring)) < 0) {
- if (y == -3) {
- printf("?Command name requiredn");
- return(-9);
- } else return(y);
- }
- ckstrncpy(line,s,LINBUFSIZ);
- if ((int)strlen(line) < 1) return(-2);
- if ((y = cmcfm()) < 0) return(y);
- success = zxcmd(ZWFILE,line);
- if (!success && msgflg)
- printf("Can't open process for writing: %sn",line);
- return(success);
- #endif /* NOPUSH */
- #endif /* MAC */
- case OPN_FI_W: /* New file (WRITE) */
- case OPN_FI_A: /* (APPEND) */
- if ((z = cmofi("Name of local file to create","",&s,xxstring)) < 0) {
- if (z == -3) {
- printf("?Filename requiredn");
- return(-9);
- } else return(z);
- }
- if (z == 2) {
- printf("?Sorry, %s is a directory namen",s);
- return(-9);
- }
- if (chkfn(ZWFILE) > 0) {
- printf("?Write/Append file already openn");
- return(-2);
- }
- fcb.bs = fcb.cs = fcb.rl = fcb.fmt = fcb.org = fcb.cc = fcb.typ = 0;
- fcb.lblopts = 0;
- fcb.dsp = (x == OPN_FI_W) ? XYFZ_N : XYFZ_A; /* Create or Append */
- ckstrncpy(line,s,LINBUFSIZ);
- if ((int)strlen(line) < 1) return(-2);
- if ((y = cmcfm()) < 0) return(y);
- return(success = zopeno(ZWFILE,line,NULL,&fcb));
- #ifndef NOLOCAL
- case OPN_SER: /* OPEN PORT or LINE */
- case OPN_NET: { /* OPEN HOST */
- extern int didsetlin, ttnproto;
- if (x == OPN_NET) {
- z = ttnproto;
- ttnproto = NP_NONE;
- }
- if ((y = setlin((x == OPN_SER) ? XYLINE : XYHOST, 1, 0)) < 0) {
- if (x == OPN_NET)
- ttnproto = z;
- success = 0;
- }
- didsetlin++;
- return(y);
- }
- #endif /* NOLOCAL */
- default:
- printf("?Not implemented");
- return(-2);
- }
- }
- #endif /* NOSPL */
- #ifndef NOXFER
- /* D O X G E T -- GET command parser with switches */
- #ifdef CK_LABELED
- int g_lf_opts = -1;
- extern int lf_opts;
- #endif /* CK_LABELED */
- int
- doxget(cx) int cx; {
- extern int /* External variables we need */
- #ifdef RECURSIVE
- recursive,
- #endif /* RECURSIVE */
- xfermode, fdispla, protocol,
- g_binary, g_xfermode, g_displa, g_rpath;
- extern char * rcv_move; /* Directory to move new files to */
- extern char * rcv_rename; /* What to rename new files to */
- extern char * g_rcv_move;
- extern char * g_rcv_rename;
- extern char * rcvexcept[]; /* RECEIVE / GET exception list */
- int opkt = 0; /* Flag for O-Packet needed */
- #ifdef PIPESEND
- extern int pipesend;
- extern char * rcvfilter, * g_rfilter;
- #endif /* PIPESEND */
- extern struct keytab rpathtab[];
- extern int nrpathtab;
- extern long calibrate;
- int asname = 0; /* Flag for have as-name */
- int konly = 0; /* Kermit-only function */
- int c, i, n, confirmed = 0; /* Workers */
- int getval = 0; /* Whether to get switch value */
- int rcvcmd = 0; /* Whether it is the RECEIVE command */
- int mget = 0; /* Whether it is the MGET command */
- struct stringint { /* Temporary array for switch values */
- char * sval;
- int ival;
- } pv[SND_MAX+1];
- struct FDB sw, fl, cm; /* FDBs for each parse function */
- char * cmdstr = "this command";
- debug(F101,"xget cx","",cx);
- oopts = -1;
- omode = -1;
- for (i = 0; i <= SND_MAX; i++) { /* Initialize switch values */
- pv[i].sval = NULL;
- pv[i].ival = -1;
- }
- /* Preset switch values based on top-level command that called us */
- switch (cx) {
- case XXREC: /* RECEIVE */
- cmdstr = "RECEIVE";
- rcvcmd = 1; break;
- case XXGET: /* GET */
- cmdstr = "GET";
- konly = 1;
- break;
- #ifdef CK_RESEND
- case XXREGET: /* REGET */
- cmdstr = "REGET";
- konly = 1;
- pv[SND_BIN].ival = 1; /* Implies /BINARY */
- pv[SND_RES].ival = 1; break;
- #endif /* CK_RESEND */
- case XXRETR: /* RETRIEVE */
- cmdstr = "RETRIEVE";
- konly = 1;
- pv[SND_DEL].ival = 1; break;
- #ifdef PIPESEND
- case XXCREC: /* CRECEIVE */
- cmdstr = "CRECEIVE";
- konly = 1;
- rcvcmd = 1;
- pv[SND_CMD].ival = 1; break;
- case XXCGET: /* CGET */
- cmdstr = "CGET";
- konly = 1;
- pv[SND_CMD].ival = 1; break;
- #endif /* PIPESEND */
- #ifndef NOMGET
- case XXMGET: /* MGET */
- cmdstr = "MGET";
- konly = 1;
- mget = 1; break;
- #endif /* NOMGET */
- }
- debug(F111,"xget rcvcmd",cmdstr,rcvcmd);
- debug(F101,"xget konly","",konly);
- #ifdef CK_XYZ
- if (!rcvcmd && protocol != PROTO_K) {
- printf("?Sorry, %s works only with Kermit protocoln",cmdstr);
- return(-9);
- }
- #endif /* CK_XYZ */
- /* Set up chained parse functions... */
- cmfdbi(&sw, /* First FDB - command switches */
- _CMKEY, /* fcode */
- rcvcmd ?
- "Optional name/template to store incoming files under, or switch" :
- "Remote filename, or switch", /* hlpmsg */
- "", /* default */
- "", /* addtl string data */
- rcvcmd ? nrcvtab : ngettab, /* addtl numeric data 1: tbl size */
- 4, /* addtl numeric data 2: 4 = cmswi */
- xxstring, /* Processing function */
- rcvcmd ? rcvtab : gettab, /* Keyword table */
- &fl /* Pointer to next FDB */
- );
- if (rcvcmd || mget) /* RECEIVE or MGET */
- cmfdbi(&fl,
- _CMTXT, /* fcode */
- rcvcmd ? /* hlpmsg */
- "Output filename or Command" : /* Output filename */
- "File(s) to GET", /* Files we are asking for */
- "", /* default */
- "", /* addtl string data */
- 0, /* addtl numeric data 1 */
- 0, /* addtl numeric data 2 */
- #ifdef CK_XYZ
- (protocol == PROTO_X || protocol == PROTO_XC) ?
- xxstring :
- (rcvcmd ? (xx_strp)0 : xxstring)
- #else
- rcvcmd ? (xx_strp)0 : xxstring /* Processing function */
- #endif /* CK_XYZ */
- ,
- NULL,
- &cm
- );
- else
- cmfdbi(&fl, /* Remote filename or command */
- _CMFLD, /* fcode */
- "Remote filename", /* hlpmsg */
- "", /* default */
- "", /* addtl string data */
- 0, /* addtl numeric data 1 */
- 0, /* addtl numeric data 2 */
- xxstring,
- NULL,
- &cm
- );
- cmfdbi(&cm, /* Confirmation */
- _CMCFM, /* fcode */
- "", /* hlpmsg */
- "", /* default */
- "", /* addtl string data */
- 0, /* addtl numeric data 1 */
- 0, /* addtl numeric data 2 */
- NULL,
- NULL,
- NULL
- );
- /* (See doxsend() for fuller commentary) */
- while (1) { /* Parse 0 or more switches */
- x = cmfdb(&sw); /* Parse something */
- debug(F101,"xget cmfdb","",x);
- if (x < 0) /* Error */
- goto xgetx; /* or reparse needed */
- if (cmresult.fcode != _CMKEY) /* Break out if not a switch */
- break;
- c = cmgbrk(); /* Get break character */
- if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) {
- printf("?This switch does not take an argumentn");
- x = -9;
- goto xgetx;
- }
- if (!getval && (cmgkwflgs() & CM_ARG)) {
- printf("?This switch requires an argumentn");
- x = -9;
- goto xgetx;
- }
- n = cmresult.nresult; /* Numeric result = switch value */
- debug(F101,"xget switch","",n);
- switch (n) { /* Process the switch */
- #ifdef PIPESEND
- case SND_CMD: /* These take no args */
- if (nopush) {
- printf("?Sorry, system command access is disabledn");
- x = -9;
- goto xgetx;
- } else if (rcvfilter) {
- printf(
- "?Sorry, no GET /COMMAND when RECEIVE FILTER selectedn");
- x = -9;
- goto xgetx;
- }
- if (rcvcmd)
- sw.hlpmsg = "Command, or switch"; /* Change help message */
- /* Fall thru... */
- #endif /* PIPESEND */
- case SND_REC: /* /RECURSIVE */
- pv[SND_PTH].ival = PATH_REL; /* Implies relative pathnames */
- pv[n].ival = 1; /* Set the recursive flag */
- break;
- case SND_RES: /* /RECOVER */
- pv[SND_BIN].ival = 1; /* Implies /BINARY */
- pv[n].ival = 1; /* Set the resend flag */
- break;
- case SND_DEL: /* /DELETE */
- case SND_SHH: /* /QUIET */
- case SND_CAL: /* /CALIBRATE */
- pv[n].ival = 1; /* Just set the appropriate flag */
- break;
- /* File transfer modes - each undoes the others */
- case SND_BIN: /* Binary */
- case SND_TXT: /* Text */
- case SND_IMG: /* Image */
- case SND_LBL: /* Labeled */
- pv[SND_BIN].ival = 0; /* Unset all */
- pv[SND_TXT].ival = 0;
- pv[SND_IMG].ival = 0;
- pv[SND_LBL].ival = 0;
- pv[n].ival = 1; /* Set the requested one */
- break;
- case SND_EXC: /* Excludes */
- if (!getval) break;
- if ((x = cmfld("Pattern","",&s,xxstring)) < 0) {
- if (x == -3) {
- printf("?Pattern requiredn");
- x = -9;
- }
- goto xgetx;
- }
- if (pv[n].sval) free(pv[n].sval);
- y = strlen(s);
- if (y > 256) {
- printf("?Pattern too long - 256 maxn");
- x = -9;
- goto xgetx;
- }
- pv[n].sval = malloc(y+1);
- if (pv[n].sval) {
- strcpy(pv[n].sval,s);
- pv[n].ival = 1;
- }
- break;
- #ifdef COMMENT
- /* Not implemented */
- case SND_PRI: /* GET to printer */
- pv[n].ival = 1;
- if (!getval) break;
- if ((x = cmfld("Print options","",&s,xxstring)) < 0)
- goto xgetx;
- pv[n].sval = malloc((int)strlen(s)+1);
- if (pv[n].sval)
- strcpy(pv[n].sval,s);
- break;
- #endif /* COMMENT */
- case SND_MOV: /* MOVE after */
- case SND_REN: /* RENAME after */
- if (!getval) break;
- if ((x = cmfld(n == SND_MOV ?
- "device and/or directory for source file after sending" :
- "new name for source file after sending",
- "",
- &s,
- n == SND_MOV ? xxstring : NULL
- )) < 0) {
- if (x == -3) {
- printf("%sn", n == SND_MOV ?
- "?Destination required" :
- "?New name required"
- );
- x = -9;
- }
- goto xgetx;
- }
- if (pv[n].sval) {
- free(pv[n].sval);
- pv[n].sval = NULL;
- }
- s = brstrip(s);
- y = strlen(s);
- if (y > 0) {
- pv[n].sval = malloc(y+1);
- if (pv[n].sval) {
- strcpy(pv[n].sval,s);
- pv[n].ival = 1;
- }
- }
- break;
- case SND_ASN: /* As-name */
- if (!getval) break;
- if (mget) {
- printf("?Sorry, as-name not allowed with MGETn");
- x = -9;
- goto xgetx;
- }
- if ((x = cmfld("Name to store it under","",&s,NULL)) < 0)
- goto xgetx;
- s = brstrip(s);
- if ((y = strlen(s)) > 0) {
- if (pv[n].sval) free(pv[n].sval);
- pv[n].sval = malloc(y+1);
- if (pv[n].sval) {
- strcpy(pv[n].sval,s);
- pv[n].ival = 1;
- }
- }
- break;
- #ifdef PIPESEND
- case SND_FLT: /* Filter */
- debug(F101,"xget /filter getval","",getval);
- if (!getval) break;
- if ((x = cmfld("Filter program to receive through",
- "",&s,NULL)) < 0) {
- if (x == -3)
- s = "";
- else
- goto xgetx;
- }
- s = brstrip(s);
- y = strlen(s);
- for (x = 0; x < y; x++) { /* Make sure they included "v(...)" */
- if (s[x] != '\') continue;
- if (s[x+1] == 'v') break;
- }
- if (x == y) {
- printf(
- "?Filter must contain a replacement variable for filename.n"
- );
- x = -9;
- goto xgetx;
- }
- pv[n].ival = 1;
- if (pv[n].sval) {
- free(pv[n].sval);
- pv[n].sval = NULL;
- }
- if ((y = strlen(s)) > 0) {
- if (pv[n].sval = malloc(y+1))
- strcpy(pv[n].sval,s);
- }
- break;
- #endif /* PIPESEND */
- case SND_PTH: /* Pathnames */
- if (!getval) {
- pv[n].ival = PATH_REL;
- break;
- }
- if ((x = cmkey(rpathtab,nrpathtab,"","on",xxstring)) < 0)
- goto xgetx;
- pv[n].ival = x; /* Ditto */
- break;
- case SND_NAM: /* Filenames */
- if (!getval) break;
- if ((x = cmkey(fntab,nfntab,"","converted",xxstring)) < 0)
- goto xgetx;
- pv[n].ival = x;
- break;
- case SND_PRO: /* Protocol to use */
- if (!getval) break;
- if ((x = cmkey(protos,nprotos,"File-transfer protocol","",
- xxstring)) < 0) {
- if (x == -3)
- x = 0;
- else
- goto xgetx;
- }
- debug(F111,"xget /proto",atmbuf,x);
- pv[n].ival = x;
- if (konly && x != PROTO_K) {
- printf(
- "?Sorry, this command works only with Kermit protocoln"
- );
- x = -9;
- goto xgetx;
- }
- break;
- default:
- printf("?Unexpected switch value - %dn",cmresult.nresult);
- x = -9;
- goto xgetx;
- }
- }
- debug(F101,"xget cmresult fcode","",cmresult.fcode);
- cmarg = line; /* Initialize string pointers */
- cmarg2 = tmpbuf;
- asname = 0;
- line[0] = NUL; /* and buffers. */
- tmpbuf[0] = NUL;
- switch (cmresult.fcode) { /* How did we get out of switch loop */
- case _CMFLD: /* Remote filespec */
- ckstrncpy(line,cmresult.sresult,LINBUFSIZ);
- break;
- case _CMTXT: /* As-name */
- if (rcvcmd) {
- ckstrncpy(tmpbuf,cmresult.sresult,TMPBUFSIZ);
- if ((int)strlen(tmpbuf) > 0)
- asname = 1;
- } else {
- ckstrncpy(line,cmresult.sresult,LINBUFSIZ);
- }
- case _CMCFM: /* Confirmation */
- confirmed = 1;
- break;
- default:
- printf("?Unexpected function code: %dn",cmresult.fcode);
- x = -9;
- goto xgetx;
- }
- debug(F110,"xget string",cmarg,0);
- debug(F101,"xget confirmed","",confirmed);
- cmarg = brstrip(cmarg); /* Strip any braces */
- if (!confirmed) { /* CR not typed yet, get more fields */
- if (pv[SND_CMD].ival > 0) {
- debug(F100,"xget calling cmtxt","",0);
- x = cmtxt("Local command to pipe into","",&s,NULL);
- if (x < 0 && x != -3) goto xgetx;
- if (x != -3) {
- ckstrncpy(tmpbuf,s,TMPBUFSIZ);
- asname = 1;
- }
- } else if (!rcvcmd) {
- #ifdef VMS
- /* cmofi() fails if you give it a directory name */
- x = cmfld("Name or directory for incoming file","",&s,NULL);
- debug(F111,"xget cmfld",s,x);
- #else
- x = cmofi("Name or directory for incoming file","",&s,NULL);
- debug(F111,"xget cmofi",s,x);
- #endif /* VMS */
- if (x < 0 && x != -3) goto xgetx;
- if (x != -3) {
- ckstrncpy(tmpbuf,s,TMPBUFSIZ);
- if ((x = cmcfm()) < 0) goto xgetx;
- asname = 1;
- }
- }
- }
- /* Arrive here with cmarg and cmarg2 all set */
- debug(F111,"xget asname",cmarg2,asname);
- if (!asname) {
- if (pv[SND_ASN].sval)
- ckstrncpy(tmpbuf,pv[SND_ASN].sval,TMPBUFSIZ);
- else
- tmpbuf[0] = NUL;
- }
- cmarg2 = brstrip(cmarg2); /* Strip outer braces if any. */
- debug(F110,"xget cmarg",cmarg,0);
- debug(F110,"xget cmarg2",cmarg2,0);
- if (!*cmarg &&
- (cx == XXGET || cx == XXREGET || cx == XXCGET || cx == XXMGET)) {
- printf("?A remote file specification is requiredn");
- x = -9;
- goto xgetx;
- }
- #ifdef PIPESEND
- if (pv[SND_CMD].ival > 0) { /* /COMMAND sets pipesend flag */
- x = -9;
- if (!*cmarg2) {
- printf("?Command requiredn");
- goto xgetx;
- } else if (nopush) {
- printf("?Sorry, system command access is disabledn");
- goto xgetx;
- } else if (rcvfilter) {
- printf("?Sorry, no GET /COMMAND while RECEIVE FILTER selectedn");
- goto xgetx;
- } else
- pipesend = 1;
- }
- debug(F101,"xget /COMMAND pipesend","",pipesend);
- #endif /* PIPESEND */
- #ifdef CK_RESEND
- if (pv[SND_RES].ival > 0) { /* REGET or GET /RECOVER */
- #ifdef RECURSIVE
- if (pv[SND_REC].ival > 0) { /* RECURSIVE */
- #ifdef COMMENT
- printf("?Unsupported option combination: /RECOVER /RECURSIVEn");
- x = -9;
- goto xgetx;
- #else
- opkt = 1;
- #endif /* COMMENT */
- }
- #endif /* RECURSIVE */
- if (pv[SND_DEL].ival > 0) { /* /DELETE */
- #ifdef COMMENT
- printf("?Unsupported option combination: /RECOVER /DELETEn");
- x = -9;
- goto xgetx;
- #else
- opkt = 1;
- #endif /* COMMENT */
- }
- }
- #endif /* CK_RESEND */
- if (pv[SND_EXC].ival > 0) /* /EXCEPT */
- makelist(pv[SND_EXC].sval,rcvexcept,8);
- #ifdef IKS_OPTION
- if (!rcvcmd) {
- if (!iks_wait(KERMIT_REQ_START,1)) {
- printf(
- "?A Kermit Server is unavailable to process this commandn");
- x = -9; /* correct the return code */
- goto xgetx;
- }
- }
- #endif /* IKS_OPTION */
- #ifdef CK_XYZ
- if ((pv[SND_PRO].ival < 0 &&
- (protocol == PROTO_X || protocol == PROTO_XC) ||
- pv[SND_PRO].ival > -1 &&
- (pv[SND_PRO].ival == PROTO_X || pv[SND_PRO].ival == PROTO_XC)) &&
- rcvcmd && !*cmarg2) {
- printf(
- "Sorry, you must specify a name when receiving a file with XMODEM protocoln"
- );
- x = -9;
- goto xgetx;
- }
- #endif /* CK_XYZ */
- #ifdef RECURSIVE
- if (pv[SND_REC].ival > 0) { /* RECURSIVE */
- recursive = 1;
- pv[SND_PTH].ival = PATH_REL; /* Implies relative pathnames too */
- }
- #endif /* RECURSIVE */
- /* Save global protocol parameters */
- g_proto = protocol;
- #ifdef CK_LABELED
- g_lf_opts = lf_opts; /* Save labeled transfer options */
- #endif /* CK_LABELED */
- g_urpsiz = urpsiz; /* Receive packet length */
- g_spsizf = spsizf; /* Send packet length flag */
- g_spsiz = spsiz; /* Send packet length */
- g_spsizr = spsizr; /* etc etc */
- g_spmax = spmax;
- g_wslotr = wslotr;
- g_prefixing = prefixing;
- g_fncact = fncact;
- g_fncnv = fncnv;
- g_fnspath = fnspath;
- g_fnrpath = fnrpath;
- if (pv[SND_PRO].ival > -1) { /* Change according to switch */
- protocol = pv[SND_PRO].ival;
- if (ptab[protocol].rpktlen > -1) /* copied from initproto() */
- urpsiz = ptab[protocol].rpktlen;
- if (ptab[protocol].spktflg > -1)
- spsizf = ptab[protocol].spktflg;
- if (ptab[protocol].spktlen > -1) {
- spsiz = ptab[protocol].spktlen;
- if (spsizf)
- spsizr = spmax = spsiz;
- }
- if (ptab[protocol].winsize > -1)
- wslotr = ptab[protocol].winsize;
- if (ptab[protocol].prefix > -1)
- prefixing = ptab[protocol].prefix;
- if (ptab[protocol].fnca > -1)
- fncact = ptab[protocol].fnca;
- if (ptab[protocol].fncn > -1)
- fncnv = ptab[protocol].fncn;
- if (ptab[protocol].fnsp > -1)
- fnspath = ptab[protocol].fnsp;
- if (ptab[protocol].fnrp > -1)
- fnrpath = ptab[protocol].fnrp;
- }
- debug(F101,"xget protocol","",protocol);
- debug(F111,"xget cmarg2",cmarg2,xfermode);
- g_xfermode = xfermode;
- g_binary = binary;
- if (pv[SND_BIN].ival > 0) { /* Change according to switch */
- xfermode = XMODE_M;
- binary = XYFT_B; /* FILE TYPE BINARY */
- omode = GMOD_BIN; /* O-Packet mode */
- debug(F101,"doxget /BINARY xfermode","",xfermode);
- } else if (pv[SND_TXT].ival > 0) { /* Ditto for /TEXT */
- xfermode = XMODE_M;
- binary = XYFT_T;
- omode = GMOD_TXT;
- debug(F101,"doxget /TEXT xfermode","",xfermode);
- } else if (pv[SND_IMG].ival > 0) {
- xfermode = XMODE_M;
- #ifdef VMS
- binary = XYFT_I;
- #else
- binary = XYFT_B;
- #endif /* VMS */
- omode = GMOD_TXT;
- debug(F101,"doxget /IMAGE xfermode","",xfermode);
- }
- #ifdef CK_LABELED
- else if (pv[SND_LBL].ival > 0) {
- xfermode = XMODE_M;
- binary = XYFT_L;
- omode = GMOD_LBL;
- debug(F101,"doxget /LABELED xfermode","",xfermode);
- }
- #endif /* CK_LABELED */
- debug(F101,"xget binary","",binary);
- debug(F101,"xget omode","",omode);
- #ifdef PIPESEND
- if (pv[SND_FLT].ival > 0) {
- g_rfilter = rcvfilter;
- if (!pv[SND_FLT].sval) {
- rcvfilter = NULL;
- } else {
- rcvfilter = (char *) malloc((int) strlen(pv[SND_FLT].sval) + 1);
- if (rcvfilter) strcpy(rcvfilter,pv[SND_FLT].sval);
- }
- }
- #endif /* PIPESEND */
- #ifdef CK_TMPDIR
- if (pv[SND_MOV].ival > 0) {
- int len;
- char * p = pv[SND_MOV].sval;
- #ifdef CK_LOGIN
- if (isguest) {
- printf("?Sorry, /MOVE-TO not available to guestsn");
- x = -9;
- goto xgetx;
- }
- #endif /* CK_LOGIN */
- len = strlen(p);
- if (!isdir(p)) { /* Check directory */
- #ifdef CK_MKDIR
- char * s = NULL;
- s = (char *)malloc(len + 4);
- if (s) {
- strcpy(s,p);
- #ifdef datageneral
- if (s[len-1] != ':') { s[len++] = ':'; s[len] = NUL; }
- #else
- if (s[len-1] != '/') { s[len++] = '/'; s[len] = NUL; }
- #endif /* datageneral */
- s[len++] = 'X';
- s[len] = NUL;
- x = zmkdir(s);
- free(s);
- if (x < 0) {
- printf("?Can't create "%s"n",p);
- x = -9;
- goto xgetx;
- }
- }
- #else
- printf("?Directory "%s" not foundn",p);
- x = -9;
- goto xgetx;
- #endif /* CK_MKDIR */
- }
- makestr(&rcv_move,p);
- }
- #endif /* CK_TMPDIR */
- if (pv[SND_REN].ival > 0) { /* /RENAME-TO:name */
- char * p = pv[SND_REN].sval;
- #ifdef CK_LOGIN
- if (isguest) {
- printf("?Sorry, /RENAME-TO not available to guestsn");
- x = -9;
- goto xgetx;
- }
- #endif /* CK_LOGIN */
- if (!p) p = "";
- if (!*p) {
- printf("?New name required for /RENAMEn");
- x = -9;
- goto xgetx;
- }
- p = brstrip(p);
- makestr(&rcv_rename,p);
- debug(F110,"xget rcv_rename","",0);
- }
- #ifdef CALIBRATE
- if (pv[SND_CAL].ival > 0)
- calibrate = 1L;
- #endif /* CALIBRATE */
- g_displa = fdispla;
- if (pv[SND_SHH].ival > 0)
- fdispla = 0;
- debug(F101,"xget display","",fdispla);
- if (pv[SND_NAM].ival > -1) { /* /FILENAMES */
- g_fncnv = fncnv; /* Save global value */
- fncnv = pv[SND_NAM].ival;
- debug(F101,"xsend fncnv","",fncnv);
- /* We should also handle O packet filename option here */
- /* but we don't really need to since WHATAMI already handles it */
- }
- if (pv[SND_PTH].ival > -1) { /* PATHNAMES */
- g_rpath = fnrpath; /* Save global values */
- fnrpath = pv[SND_PTH].ival;
- debug(F101,"xsend fnrpath","",fnrpath);
- #ifndef NZLTOR
- if (fnrpath != PATH_OFF) {
- g_fncnv = fncnv;
- fncnv = XYFN_L;
- debug(F101,"xsend fncnv","",fncnv);
- }
- /* We should also handle O packet pathname option here */
- /* but we don't really need to since WHATAMI already handles it */
- #endif /* NZLTOR */
- }
- /* Set protocol start state */
- if (opkt) { /* Extended GET Options*/
- sstate = (CHAR) 'o';
- oopts = 0;
- if (pv[SND_DEL].ival > 0) oopts |= GOPT_DEL; /* GET /DELETE */
- if (pv[SND_RES].ival > 0) oopts |= GOPT_RES; /* GET /RECOVER */
- if (pv[SND_REC].ival > 0) oopts |= GOPT_REC; /* GET /RECURSIVE */
- } else if (rcvcmd)
- sstate = (CHAR) 'v'; /* RECEIVE or CRECEIVE */
- else if (pv[SND_DEL].ival > 0)
- sstate = (CHAR) 'h'; /* GET /DELETE (= RETRIEVE) */
- else if (pv[SND_RES].ival > 0)
- sstate = (CHAR) 'j'; /* GET /RECOVER (= REGET) */
- else
- sstate = (CHAR) 'r'; /* Regular GET */
- getcmd = 1;
- debug(F000,"xget sstate","",sstate);
- #ifdef MAC
- what = W_RECV;
- scrcreate();
- #endif /* MAC */
- if (local) {
- if (pv[SND_SHH].ival != 0)
- displa = 1;
- ttflui();
- }
- x = 0;
- #ifdef PIPESEND
- if (pipesend)
- goto xgetx;
- #endif /* PIPESEND */
- #ifdef CK_TMPDIR
- /*
- cmarg2 is also allowed to be a device or directory name;
- even the name of a directory that doesn't exist.
- */
- y = strlen(cmarg2);
- debug(F111,"xget strlen(cmarg2)",cmarg2,y);
- if ((y > 0) &&
- #ifdef OS2
- ((isalpha(cmarg2[0]) &&
- cmarg2[1] == ':' &&
- cmarg2[2] == NUL) ||
- (cmarg[y-1] == '/' || cmarg[y-1] == '\') ||
- isdir(cmarg2))
- #else
- #ifdef UNIXOROSK
- (cmarg2[y-1] == '/' || isdir(cmarg2))
- #else
- #ifdef VMS
- (cmarg2[y-1] == ']' || cmarg2[y-1] == '>' || isdir(cmarg2))
- #else
- #ifdef STRATUS
- (cmarg2[y-1] == '>' || isdir(cmarg2))
- #else
- #ifdef datageneral
- (cmarg2[y-1] == ':' || cmarg[0] == ':' || isdir(cmarg2))
- #else
- isdir(cmarg2)
- #endif /* datageneral */
- #endif /* STRATUS */
- #endif /* VMS */
- #endif /* UNIXOROSK */
- #endif /* OS2 */
- ) {
- debug(F110,"doxget RECEIVE cmarg2 disk or dir",cmarg2,0);
- if (!f_tmpdir) {
- int x;
- s = zgtdir();
- if (s) {
- ckstrncpy(savdir,s,TMPDIRLEN); /* remember old disk/dir */
- f_tmpdir = 1; /* and that we did this */
- } else {
- printf("?Can't get current directoryn");
- cmarg2 = "";
- f_tmpdir = 0;
- x = -9;
- goto xgetx;
- }
- #ifdef CK_MKDIR
- x = zchki(cmarg2); /* Does as-name exist? */
- if (x == -1) { /* Doesn't exist */
- char * p = NULL; /* Try to create it */
- x = strlen(cmarg2);
- if (p = (char *)malloc(x+4)) {
- sprintf(p,"%s%s",cmarg2,"x.x");
- x = zmkdir(p);
- free(p);
- if (x < 0) {
- printf("?Can't create %sn",cmarg2);
- x = -9;
- goto xgetx;
- }
- }
- }
- #endif /* CK_MKDIR */
- if (!zchdir(cmarg2)) { /* change to given disk/directory, */
- printf("?Can't access %sn",cmarg2);
- x = -9;
- goto xgetx;
- }
- cmarg2 = "";
- }
- }
- #endif /* CK_TMPDIR */
- ckstrncpy(fspec,cmarg,CKMAXPATH); /* Note - this is a REMOTE filespec */
- debug(F111,"xget fspec",fspec,fspeclen);
- debug(F110,"xget cmarg2",cmarg2,0);
- xgetx:
- for (i = 0; i < SND_MAX; i++)
- if (pv[i].sval)
- free(pv[i].sval);
- return(x);
- }
- #endif /* NOXFER */
- #ifndef NOSPL
- /*
- D O G T A -- Do _GETARGS or _PUTARGS Command.
- Used by XIF, FOR, WHILE, and SWITCH, each of which are implemented as
- 2-level macros; the first level defines the macro, the second runs it.
- This routine hides the fact that they are macros by importing the
- macro arguments (if any) from two levels up, to make them available
- in the IF, FOR, SWITCH, and WHILE commands themselves; for example as
- loop indices, etc, and within the IF/FOR/WHILE/SWITCH body itself.
- */
- int
- dogta(cx) int cx; {
- int i, n; char c; char mbuf[4]; char *p;
- extern int topargc, cmdint;
- extern char ** topxarg;
- if ((y = cmcfm()) < 0)
- return(y);
- if (cx == XXGTA)
- debug(F101,"dogta _GETARGS maclvl","",maclvl);
- else if (cx == XXPTA)
- debug(F101,"dogta _PUTARGS maclvl","",maclvl);
- else
- return(-2);
- if (maclvl < 1)
- return(success = 0);
- /* Make new copies of macro arguments /%0..9 */
- mbuf[0] = '%'; mbuf[1] = '0'; mbuf[2] = NUL; /* Argument name buf */
- for (i = 0; i < 10; i++) { /* For all args */
- c = (char) (i + '0'); /* Make name */
- mbuf[1] = (char) c; /* Insert digit */
- if (cx == XXGTA) { /* Get arg from level-minus-2 */
- if (maclvl == 1) p = g_var[c]; /* If at level 1 use globals 0..9 */
- else p = m_arg[maclvl-2][i]; /* Otherwise they're on the stack */
- addmac(mbuf,p);
- if (maclvl > 1)
- makestr(&(m_line[maclvl]),m_line[maclvl-2]);
- } else if (cx == XXPTA) { /* Put args level+2 */
- if (cmdint)
- connoi(); /* Turn off interrupts. */
- maclvl -= 2; /* This is gross.. */
- p = m_arg[maclvl+2][i];
- addmac(mbuf,m_arg[maclvl+2][i]);
- maclvl += 2;
- if (cmdint)
- conint(trap,stptrap); /* Restore interrupts */
- count[cmdlvl - 2] = count[cmdlvl];
- intime[cmdlvl - 2] = intime[cmdlvl];
- inpcas[cmdlvl - 2] = inpcas[cmdlvl];
- takerr[cmdlvl - 2] = takerr[cmdlvl];
- merror[cmdlvl - 2] = merror[cmdlvl];
- xquiet[cmdlvl - 2] = xquiet[cmdlvl];
- } else return(success = 0); /* Bad call to this routine */
- }
- /* Now take care of the argument vector array &_[] and v(return) */
- /* Here we just copy the pointers */
- if (cx == XXGTA) { /* GETARGS from 2 levels up */
- if (maclvl == 1) {
- a_ptr[0] = topxarg; /* &_[] array */
- a_dim[0] = topargc - 1; /* Dimension doesn't include [0] */
- m_xarg[maclvl] = topxarg;
- n_xarg[maclvl] = topargc; /* But v(argc) does include %0 */
- macargc[maclvl] = topargc;
- makestr(&(mrval[maclvl+1]),mrval[0]); /* (see vnlook()) */
- } else {
- a_ptr[0] = m_xarg[maclvl-2];
- a_dim[0] = n_xarg[maclvl-2];
- m_xarg[maclvl] = m_xarg[maclvl-2];
- n_xarg[maclvl] = n_xarg[maclvl-2];
- macargc[maclvl] = n_xarg[maclvl-2];
- makestr(&(mrval[maclvl+1]),mrval[maclvl-1]); /* (see vnlook()) */
- }
- } else { /* PUTARGS 2 levels down */
- if (maclvl+2 >= MACLEVEL)
- return(success = 0);
- a_ptr[0] = m_xarg[maclvl+2];
- m_xarg[maclvl] = m_xarg[maclvl+2];
- a_dim[0] = n_xarg[maclvl+2];
- n_xarg[maclvl] = n_xarg[maclvl+2];
- macargc[maclvl] = n_xarg[maclvl+2];
- }
- return(1); /* Internal command - don't change success */
- }
- #endif /* NOSPL */
- #ifndef NOSPL
- /*
- Do the GOTO and [_]FORWARD commands.
- s = Label to search for, cx = function code: XXGOTO, XXFWD, or XXXFWD.
- */
- #ifdef BIGBUFOK
- #define LBLMAXLEN 255 /* Max label length */
- #else
- #define LBLMAXLEN 63
- #endif /* BIGBUFOK */
- int
- dogoto(s, cx) char *s; int cx; {
- int i, j, x, y, z, bc;
- int stopflg = 0;
- char * cmd; /* Name of this command */
- char tmplbl[LBLMAXLEN+1], *lp; /* Current label from command stream */
- char tmp2[LBLMAXLEN+1]; /* SWITCH label conversion buffer */
- char tmp3[LBLMAXLEN+1]; /* Target label */
- stopflg = (cx == XXXFWD); /* _FORWARD (used in SWITCH) */
- bc = 0; /* Brace counter */
- cmd = (cx == XXGOTO) ? "GOTO" : ((cx == XXFWD) ? "FORWARD" : "_FORWARD");
- #ifdef DEBUG
- if (deblog) {
- debug(F111,"GOTO command",cmd,cx);
- debug(F101,"GOTO cmdlvl","",cmdlvl);
- debug(F101,"GOTO maclvl","",maclvl);
- debug(F101,"GOTO tlevel","",tlevel);
- }
- #endif /* DEBUG */
- debug(F110,cmd,s,0);
- ckstrncpy(tmp3+1,s,LBLMAXLEN-1);
- s = tmp3+1;
- if (*s != ':') { /* Make copy of label */
- tmp3[0] = ':'; /* guaranteed to start with ":" */
- s--;
- }
- if (s[1] == '.' || s[1] == SP || s[1] == NUL) {
- printf("?Bad label syntax - '%s'n",s);
- return(success = 0);
- }
- if (cmdlvl == 0) {
- printf("?Sorry, %s only works in a command file or macron",cmd);
- return(success = 0);
- }
- y = strlen(s); /* y = length of target label */
- debug(F111,cmd,s,y);
- while (cmdlvl > 0) { /* As long as not at top level... */
- if (cmdstk[cmdlvl].src == CMD_MD) { /* GOTO inside macro */
- int i, m, flag;
- char *xp, *tp;
- /* GOTO: rewind the macro; FORWARD: start at current position */
- lp = (cx == XXGOTO) ? macx[maclvl] : macp[maclvl];
- m = (int)strlen(lp) - y + 1;
- debug(F111,"GOTO in macro",lp,m);
- flag = 1; /* flag for valid label position */
- for (i = 0; i < m; i++,lp++) { /* search for label in macro body */
- if (*lp == '{') /* But only at this level */
- bc++; /* Anything inside braces is off */
- else if (*lp == '}') /* limits. */
- bc--;
- if (stopflg && bc > 0) /* This is good for SWITCH */
- continue; /* but interferes with WHILE, etc. */
- if (*lp == ',') {
- flag = 1;
- continue;
- }
- if (flag) { /* If in valid label position */
- if (*lp == SP) /* eat leading spaces */
- continue;
- if (*lp != ':') { /* Look for label introducer */
- flag = 0; /* this isn't it */
- continue; /* keep looking */
- }
- }
- if (!flag) /* We don't have a label */
- continue; /* so keep looking... */
- xp = lp; tp = tmplbl; /* Copy the label from the macro */
- j = 0; /* to make it null-terminated */
- while (*tp = *xp) {
- if (j++ > LBLMAXLEN) /* j = length of word from macro */
- break;
- if (*tp < 33 || *tp == ',') /* Look for end of word */
- break;
- else tp++, xp++; /* Next character */
- }
- *tp = NUL; /* In case we stopped early */
- /* Now do caseless string comparison, using longest length */
- debug(F111,"macro GOTO label",s,y);
- debug(F111,"macro target label",tmplbl,j);
- if (stopflg) { /* Allow variables as SWITCH labels */
- int n = LBLMAXLEN - 1;
- char * p = tmp2;
- zzstring(tmplbl,&p,&n);
- ckstrncpy(tmplbl,tmp2,LBLMAXLEN);
- tmp2[49] = NUL;
- }
- debug(F111,"GOTO s",s,y);
- debug(F111,"GOTO tmplbl",tmplbl,j);
- if (stopflg) {
- z = ckmatch(tmplbl,s,inpcas[cmdlvl],1) ? 0 : 1;
- } else {
- z = (stopflg && inpcas[cmdlvl]) ?
- strcmp(s,tmplbl) :
- ckstrcmp(s,tmplbl,(y > j) ? y : j, 0);
- }
- if (!z)
- break;
- else if (stopflg &&
- !ckstrcmp(":default",tmplbl,(8 > j) ? 8 : j, 0))
- break;
- else
- flag = 0;
- }
- debug(F111,"GOTO macro i",cmd,i);
- debug(F111,"GOTO macro m",cmd,m);
- if (i >= m) { /* Didn't find the label */
- debug(F101,"GOTO failed cmdlvl","",cmdlvl);
- if (stopflg)
- return(0);
- if ((maclvl > 0) &&
- (m_arg[maclvl-1][0]) &&
- (cmdstk[cmdlvl].src == CMD_MD) &&
- (!strncmp(m_arg[maclvl-1][0],"_xif",4) ||
- !strncmp(m_arg[maclvl-1][0],"_for",4) ||
- !strncmp(m_arg[maclvl-1][0],"_swi",4) ||
- !strncmp(m_arg[maclvl-1][0],"_whi",4))) {
- dogta(XXPTA); /* Restore args */
- debug(F101,"GOTO in XIF/FOR/WHI/SWI popping","",cmdlvl);
- popclvl(); /* Pop an extra level */
- }
- debug(F101,"GOTO popping","",cmdlvl);
- if (!popclvl()) { /* pop up to next higher level */
- printf("?Label '%s' not foundn",s); /* if none */
- return(0); /* quit */
- } else continue; /* otherwise look again */
- }
- debug(F110,"GOTO found macro label",tmplbl,0);
- macp[maclvl] = lp; /* set macro buffer pointer */
- return(1);
- } else if (cmdstk[cmdlvl].src == CMD_TF) {
- x = 0; /* GOTO issued in take file */
- debug(F111,"GOTO in TAKE file",cmd,cx);
- if (cx == XXGOTO) { /* If GOTO, but not FORWARD, */
- rewind(tfile[tlevel]); /* search file from beginning */
- tfline[tlevel] = 0;
- }
- while (! feof(tfile[tlevel])) {
- if (fgets(line,LINBUFSIZ,tfile[tlevel]) == NULL) /* Get line */
- break; /* If no more, done, label not found */
- tfline[tlevel]++;
- lp = line; /* Got line */
- while (*lp == SP || *lp == HT)
- lp++; /* Strip leading whitespace */
- if (*lp != ':') continue; /* Check for label introducer */
- tp = lp; /* Get end of word */
- j = 0;
- while (*tp) { /* And null-terminate it */
- if (*tp < 33) {
- *tp = NUL;
- break;
- } else tp++, j++;
- }
- if (!ckstrcmp(lp,s,(y > j) ? y : j,0)) { /* Caseless compare */
- x = 1; /* Got it */
- break; /* done. */
- } else if (stopflg &&
- !ckstrcmp(":default",tmplbl,(8 > j) ? 8 : j,0)) {
- x = 1;
- break;
- }
- }
- if (x == 0) { /* If not found, print message */
- debug(F101,"GOTO failed at cmdlvl","",cmdlvl);
- if (stopflg)
- return(0);
- if (!popclvl()) { /* pop up to next higher level */
- printf("?Label '%s' not foundn",s); /* if none */
- return(0); /* quit */
- } else continue; /* otherwise look again */
- }
- return(x); /* Send back return code */
- }
- }
- printf("?Stack problem in GOTO %sn",s); /* Shouldn't see this */
- return(0);
- }
- #endif /* NOSPL */
- /* Finish parsing and do the IF, XIF, and WHILE commands */
- #ifndef NOSPL
- /* C H K V A R -- Check (if it's a) Variable */
- #ifdef OLDCHKVAR
- /*
- Crude and disgusting, but needed for OS/2, DOS, and Windows, where filenames
- have backslashes in them. How do we know if a backslash in a filename is a
- directory separator, or if it's a Kermit backslash? This routine does a
- rough syntax check of the next few characters and if it looks like it MIGHT
- be a variable, then it tries to evaluate it, and if the result is not empty,
- we say it's a variable, although sometimes it might not be -- some cases are
- truly ambiguous. For example there might a DOS directory called %a, and
- we also have a variable with the same name. This is all for the sake of not
- having to tell PC users that they have to double all backslashes in file
- and directory names.
- */
- #else
- /*
- Somewhat less crude & disgusting. The previous method was nondeterministic
- and (worse) it interfered with macro argument passing. So now we only
- check the syntax of backslash-items to see if they are variables, but we
- do NOT check their values.
- */
- #endif /* OLDCHKVAR */
- /*
- Call with a string pointer pointing at the backslash of the purported
- variable. Returns 1 if it has the syntax of a variable, 0 if not.
- */
- int
- chkvar(s) char *s; {
- int z = 0; /* Return code - assume failure. */
- if (!s) s = ""; /* Watch our for null pointers. */
- if (!*s) return(0); /* Empty arg so not a variable. */
- if (*s == CMDQ) { /* Object begins with backslash. */
- char c;
- c = s[1]; /* Character following backslash. */
- if (c) {
- int t = 0;
- if (c == CMDQ) /* Quoted backslash */
- return(1);
- c = (char) (islower(c) ? toupper(c) : c); /* Otherwise... */
- if (c == '%') { /* Simple variable */
- #ifdef OLDCHKVAR
- t = 1;
- #else
- return(1);
- #endif /* OLDCHKVAR */
- } else if (c == '&') { /* Array */
- if (s[3] == '[')
- t = ckindex("]",s,4,0,1);
- #ifndef OLDCHKVAR
- return((t > 0) ? 1 : 0);
- #endif /* OLDCHKVAR */
- } else if (c == '$' || /* Environment variable */
- c == 'V' || /* Built-in variable */
- c == 'M') { /* Macro name */
- t = (s[2] == '(');
- #ifndef OLDCHKVAR
- return((t > 0) ? 1 : 0);
- #endif /* OLDCHKVAR */
- } else if (c == 'F') { /* Function reference */
- /* Don't actually call it - it might have side effects */
- int x;
- if (x = ckindex("(",s,3,0,1)) /* Just check syntax */
- if (x = ckindex(")",s,x,0,1))
- z = 1;
- /* Insert a better syntax check here if necessary */
- }
- #ifdef OLDCHKVAR
- if (t) {
- t = 255; /* This lets us test v(xxx) */
- lp = line; /* and even f...(xxx) */
- zzstring(s,&lp,&t); /* Evaluate it, whatever it is. */
- t = strlen(line); /* Get its length. */
- debug(F111,"chkvar",line,t);
- z = t > 0; /* If length > 0, it's defined */
- }
- #endif /* OLDCHKVAR */
- }
- }
- return(z);
- }
- /* B O O L E X P -- Evaluate a Boolean expression */
- #define BOOLLEN 1024
- static char boolval[BOOLLEN];
- int
- boolexp(cx) int cx; {
- int x, y, z; char *s, *p;
- int parens = 0, pcount = 0, ecount = 0;
- extern int cmfldflgs;
- char *q, *bx;
- struct FDB kw, nu, fl;
- #ifdef FNFLOAT
- CKFLOAT f1 = 0.0, f2 = 0.0;
- int f1flag = 0, f2flag = 0;
- #endif /* FNFLOAT */
- #ifdef OS2
- extern int keymac;
- #endif /* OS2 */
- not = 0; /* Flag for whether "NOT" was seen */
- z = 0; /* Initial IF condition */
- ifargs = 0; /* Count of IF condition words */
- bx = boolval; /* Initialize boolean value */
- *bx = NUL;
- ifagain:
- cmfdbi(&kw, /* First FDB - command switches */
- _CMKEY, /* fcode */
- "Number, numeric-valued variable, Boolean expression, or keyword",
- "", /* default */
- "", /* addtl string data */
- nif, /* addtl numeric data 1: tbl size */
- 0, /* addtl numeric data 2: 4 = silent */
- xxstring, /* Processing function */
- iftab, /* Keyword table */
- &nu /* Pointer to next FDB */
- );
- cmfdbi(&nu, /* 2nd FDB - An integer */
- _CMNUM, /* fcode */
- "", /* hlpmsg */
- "", /* Default */
- "", /* addtl string data */
- 0,
- 0,
- xxstring,
- NULL,
- #ifndef FNFLOAT
- &fl
- #else
- NULL
- #endif /* FNFLOAT */
- );
- #ifndef FNFLOAT
- cmfdbi(&fl, /* A floating-point number */
- _CMFLD, /* fcode */
- "", /* hlpmsg */
- "", /* default */
- "", /* addtl string data */
- 0, /* addtl numeric data 1 */
- 0, /* addtl numeric data 2 */
- xxstring,
- NULL,
- NULL
- );
- #endif /* FNFLOAT */
- x = cmfdb(&kw); /* Parse a keyword or a number */
- if (x < 0) {
- if (x == -3)
- x = -2;
- return(x);
- }
- debug(F111,"boolval switch","",cmresult.fcode);
- switch (cmresult.fcode) { /* What did we get? */
- #ifdef FNFLOAT
- case _CMFLD: /* A "field" */
- if (isfloat(cmresult.sresult,0)) { /* A floating-point number? */
- f1 = floatval; /* Yes, get its value */
- f1flag = 1; /* remember we did this */
- ifc = 9999; /* Set special "if-code" */
- } else
- return(-2);
- #endif /* FNFLOAT */
- case _CMNUM: /* A number... */
- ifc = 9999; /* Set special "if-code" */
- break;
- case _CMKEY: /* A keyword */
- ifc = cmresult.nresult; /* Get if-code */
- break;
- default:
- return(-2);
- }
- switch (ifc) { /* set z = 1 for true, 0 for false */
- case 9999: /* Number */
- #ifdef FNFLOAT
- if (f1flag) {
- z = (f1 == 0.0) ? 0 : 1;
- } else
- #endif /* FNFLOAT */
- z = (cmresult.nresult == 0) ? 0 : 1;
- break;
- case XXIFLP: /* Left paren */
- if (pcount == 0 && ifargs > 0)
- return(-2);
- parens = 1;
- pcount++;
- ifargs++;
- *bx++ = '(';
- goto ifagain;
- case XXIFRP: /* Right paren */
- if (!parens)
- return(-2);
- if (--pcount < 0)
- return(-2);
- ifargs++;
- *bx++ = ')';
- *bx = NUL;
- if (pcount == 0)
- goto ifend;
- goto ifagain;
- case XXIFAN: /* AND (&&) */
- ifargs++;
- if (!ecount)
- return(-2);
- *bx++ = '&';
- goto ifagain;
- case XXIFOR: /* OR (||) */
- ifargs++;
- if (!ecount)
- return(-2);
- *bx++ = '|';
- goto ifagain;
- case XXIFNO: /* IF NOT [ NOT [ NOT ... ] ] */
- if (bx > boolval) { /* evala() doesn't like cascaded */
- if (*(bx-1) == '!') { /* unary operators... */
- *(bx-1) = NUL; /* So here, two wrongs make a right. */
- bx--;
- } else {
- *bx++ = '!';
- }
- } else {
- *bx++ = '!';
- }
- ifargs++;
- goto ifagain;
- case XXIFTR: /* IF TRUE */
- z = 1;
- debug(F101,"if true","",z);
- ifargs += 1;
- break;
- case XXIFNT: /* IF FALSE */
- z = 0;
- debug(F101,"if true","",z);
- ifargs += 1;
- break;
- case XXIFSU: /* IF SUCCESS */
- z = ( success != 0 ) ? 1 : 0;
- debug(F101,"if success","",z);
- ifargs += 1;
- break;
- case XXIFFA: /* IF FAILURE */
- z = ( success == 0 ) ? 1 : 0;
- debug(F101,"if failure","",z);
- ifargs += 1;
- break;
- case XXIFDE: /* IF DEFINED */
- if ((x = cmfld("Macro or variable name","",&s,NULL)) < 0) {
- if (x == -3) return(-2);
- else return(x);
- }
- if (*s == CMDQ) {
- z = chkvar(s); /* Starts with backslash */
- if (z > 0) { /* Yes... */
- int t, x; /* Get its value into a local buffer */
- char * lp;
- char line[256]; /* Note that value might be longer */
- t = 255; /* than buffer so if zzstring fails */
- lp = line; /* check for that -- overflow means */
- line[0] = NUL; /* the quantity is defined. */
- x = zzstring(s,&lp,&t);
- if ((x < 0 && t != 255) || !line[0])
- z = 0;
- debug(F111,"if defined zzstring",line,z);
- debug(F101,"if defined zzstring t","",t);
- }
- } else {
- z = (mxlook(mactab,s,nmac) > -1); /* Look for exact match */
- }
- debug(F111,"if defined final",s,z);
- ifargs += 2;
- break;
- case XXIFBG: /* IF BACKGROUND */
- case XXIFFG: /* IF FOREGROUND */
- bgchk(); /* Check background status */
- if (ifc == XXIFFG) /* Foreground */
- z = pflag ? 1 : 0;
- else z = pflag ? 0 : 1; /* Background */
- ifargs += 1;
- break;
- case XXIFCO: /* IF COUNT */
- z = ( --count[cmdlvl] > 0 );
- if (cx == XXWHI) count[cmdlvl] += 2; /* Don't ask... */
- debug(F101,"if count","",z);
- ifargs += 1;
- break;
- case XXIFEX: /* IF EXIST */
- #ifdef CK_TMPDIR
- case XXIFDI: /* IF DIRECTORY */
- #endif /* CK_TMPDIR */
- case XXIFAB: /* IF ABSOLUTE */
- if ((x = cmfld(
- ((ifc == XXIFDI) ? "Directory name" : "File"),
- "",&s,
- #ifdef OS2
- NULL /* This allows 's in filenames */
- #else
- xxstring
- #endif /* OS2 */
- )) < 0) {
- if (x == -3) {
- extern int cmflgs;
- if (cmflgs == 1) {
- printf("?File or directory name requiredn");
- return(-9);
- }
- } else return(x);
- }
- s = brstrip(s);
- if (ifc == XXIFAB) {
- z = isabsolute(s);
- } else if (ifc == XXIFEX) {
- z = (zchki(s) > -1L);
- debug(F101,"if exist 1","",z);
- #ifdef OS2
- if (!z) { /* File not found. */
- int t; /* Try expanding variables */
- t = LINBUFSIZ-1; /* and looking again. */
- lp = line;
- zzstring(s,&lp,&t);
- s = line;
- z = ( zchki(s) > -1L );
- debug(F101,"if exist 2","",z);
- }
- #endif /* OS2 */
- #ifdef CK_TMPDIR
- } else {
- #ifdef VMS
- z = (zchki(s) == -2)
- #else
- /* Because this doesn't catch $DISK1:[FOO]BLAH.DIR;1 */
- z = isdir(s)
- #ifdef OS2
- || (isalpha(s[0]) && s[1] == ':' && s[2] == NUL)
- #endif /* OS2 */
- #endif /* VMS */
- ;
- debug(F101,"if directory 1","",z);
- if (!z) { /* File not found. */
- int t; /* Try expanding variables */
- t = LINBUFSIZ-1; /* and looking again. */
- lp = line;
- zzstring(s,&lp,&t);
- s = line;
- z = isdir(s)
- #ifdef OS2
- || (isalpha(s[0]) && s[1] == ':' && s[2] == NUL)
- #endif /* OS2 */
- ;
- debug(F101,"if directory 2","",z);
- }
- #endif /* CK_TMPDIR */
- }
- ifargs += 2;
- break;
- case XXIFEQ: /* IF EQUAL (string comparison) */
- case XXIFLL: /* IF Lexically Less Than */
- case XXIFLG: /* If Lexically Greater Than */
- if ((x = cmfld("first word or variable name","",&s,xxstring)) < 0) {
- if (x == -3) {
- printf("?Text requiredn");
- return(-9);
- } else return(x);
- }
- s = brstrip(s); /* Strip braces */
- x = (int)strlen(s);
- if (x > LINBUFSIZ-1) {
- printf("?IF: strings too longn");
- return(-2);
- }
- lp = line; /* lp points to first string */
- ckstrncpy(line,s,LINBUFSIZ);
- if ((y = cmfld("second word or variable name","",&s,xxstring)) < 0) {
- if (y == -3) {
- printf("?Text requiredn");
- return(-9);
- } else return(y);
- }
- s = brstrip(s);
- y = (int)strlen(s);
- if (x + y + 2 > LINBUFSIZ) {
- printf("?IF: strings too longn");
- return(-2);
- }
- tp = lp + x + 2; /* tp points to second string */
- strcpy(tp,s);
- x = ckstrcmp(lp,tp,-1,inpcas[cmdlvl]); /* Use longest length */
- switch (ifc) {
- case XXIFEQ: /* IF EQUAL (string comparison) */
- z = (x == 0);
- break;
- case XXIFLL: /* IF Lexically Less Than */
- z = (x < 0);
- break;
- case XXIFLG: /* If Lexically Greater Than */
- z = (x > 0);
- break;
- }
- debug(F101,"IF EQ result","",z);
- ifargs += 3;
- break;
- case XXIFAE: /* IF (arithmetically) = */
- case XXIFNQ: /* IF != (not arithmetically equal) */
- case XXIFLT: /* IF < */
- case XXIFLE: /* IF <= */
- case XXIFGE: /* IF >= */
- case XXIFGT: { /* IF > */
- /* Really should use longs here... */
- /* But cmnum parses ints. */
- int n1 = 0, n2 = 0;
- x = cmfld("first number or variable name","",&s,xxstring);
- if (x == -3) {
- printf("?Quantity requiredn");
- return(-9);
- }
- if (x < 0) return(x);
- debug(F101,"xxifgt cmfld","",x);
- lp = line;
- ckstrncpy(line,s,LINBUFSIZ);
- debug(F110,"xxifgt exp1",lp,0);
- /* The following bit is for compatibility with old versions of MS-DOS Kermit */
- if (!ckstrcmp(lp,"count",5,0)) {
- n1 = count[cmdlvl];
- } else if (!ckstrcmp(lp,"version",7,0)) {
- n1 = (int) vernum;
- } else if (!ckstrcmp(lp,"argc",4,0)) {
- n1 = (int) macargc[maclvl];
- } else {
- /* End of compatibility bit */
- #ifdef FNFLOAT
- /* Allow floating-point comparisons. */
- /* ckstrchr() test is used in addition to isfloat() since */
- /* isfloat() succeeds also for integers and we don't want to */
- /* do floating-point comparisons unless we have to. */
- if (ckstrchr(lp,'.') && isfloat(lp,0)) {
- f1 = floatval;
- f1flag = 1;
- } else
- #endif /* FNFLOAT */
- if (chknum(lp)) {
- n1 = atoi(lp);
- } else { /* Check for arithmetic expression */
- q = evala(lp); /* cmnum() does this but ... */
- if (chknum(q)) /* we're not using cmnum(). */
- n1 = atoi(q);
- else
- return(-2);
- }
- }
- y = cmfld("second number or variable name","",&s,xxstring);
- if (y == -3) {
- printf("?Quantity requiredn");
- return(-9);
- }
- if (y < 0) return(y);
- if ((int)strlen(s) < 1) return(-2);
- x = (int)strlen(lp);
- tp = line + x + 2;
- strcpy(tp,s);
- debug(F110,"xxifgt exp2",tp,0);
- if (!ckstrcmp(tp,"count",5,0)) {
- n2 = count[cmdlvl];
- } else if (!ckstrcmp(tp,"version",7,0)) {
- n2 = (int) vernum;
- } else if (!ckstrcmp(tp,"argc",4,0)) {
- n2 = (int) macargc[maclvl];
- } else {
- #ifdef FNFLOAT
- if (ckstrchr(lp,'.') && isfloat(tp,0)) {
- f2 = floatval;
- f2flag = 1;
- } else
- #endif /* FNFLOAT */
- if (chknum(tp)) {
- n2 = atoi(tp);
- } else {
- q = evala(tp);
- if (chknum(q))
- n2 = atoi(q);
- else
- return(-2);
- }
- }
- debug(F101,"xxifft ifc","",ifc);
- #ifdef FNFLOAT
- if (f1flag && !f2flag) {
- f2 = (CKFLOAT)n2;
- f2flag = 1;
- }
- if (f2flag && !f1flag)
- f1 = (CKFLOAT)n1;
- if (f1flag)
- z = ((f1 < f2 && ifc == XXIFLT)
- || (f1 != f2 && ifc == XXIFNQ)
- || (f1 <= f2 && ifc == XXIFLE)
- || (f1 == f2 && ifc == XXIFAE)
- || (f1 >= f2 && ifc == XXIFGE)
- || (f1 > f2 && ifc == XXIFGT));
- else
- #endif /* FNFLOAT */
- z = ((n1 < n2 && ifc == XXIFLT)
- || (n1 != n2 && ifc == XXIFNQ)
- || (n1 <= n2 && ifc == XXIFLE)
- || (n1 == n2 && ifc == XXIFAE)
- || (n1 >= n2 && ifc == XXIFGE)
- || (n1 > n2 && ifc == XXIFGT));
- debug(F101,"xxifft z","",z);
- ifargs += 3;
- break; }
- case XXIFNU: /* IF NUMERIC */
- x = cmfld("variable name or constant","",&s,NULL);
- if (x == -3) {
- extern int cmflgs;
- if (cmflgs == 1) {
- printf("?Quantity requiredn");
- return(-9);
- }
- } else if (x < 0)
- return(x);
- x = LINBUFSIZ-1;
- lp = line;
- zzstring(s,&lp,&x);
- lp = line;
- debug(F110,"xxifnu quantity",lp,0);
- z = chknum(lp);
- #ifdef COMMENT
- /*
- This works, but it's not wise -- IF NUMERIC is mostly used to see if a
- string really does contain only numeric characters. If they want to force
- evaluation, they can use feval() on the argument string.
- */
- if (!z) { /* Not a number */
- x_ifnum = 1; /* Avoid "eval" error messages */
- q = evala(lp); /* Maybe it's an expression */
- z = chknum(q); /* that evaluates to a number */
- x_ifnum = 0; /* Put eval messages back to normal */
- if (z) debug(F110,"xxifnu exp",lp,0);
- }
- #endif /* COMMENT */
- debug(F101,"xxifnu chknum","",z);
- ifargs += 2;
- break;
- #ifdef ZFCDAT
- case XXIFNE: { /* IF NEWER */
- char d1[20], * d2; /* Buffers for 2 dates */
- if ((z = cmifi("First file","",&s,&y,xxstring)) < 0)
- return(z);
- strcpy(d1,zfcdat(s));
- if ((z = cmifi("Second file","",&s,&y,xxstring)) < 0)
- return(z);
- d2 = zfcdat(s);
- if ((int)strlen(d1) != 17 || (int)strlen(d2) != 17) {
- printf("?Failure to get file daten");
- return(-9);
- }
- debug(F110,"xxifnewer d1",d1,0);
- debug(F110,"xxifnewer d2",d2,0);
- z = (strcmp(d1,d2) > 0) ? 1 : 0;
- debug(F101,"xxifnewer","",z);
- ifargs += 2;
- break;
- }
- #endif /* ZFCDAT */
- #ifdef CK_IFRO
- case XXIFRO: /* REMOTE-ONLY advisory */
- ifargs++;
- #ifdef NOLOCAL
- z = 1;
- #else
- z = remonly;
- #endif /* NOLOCAL */
- break;
- #endif /* CK_IFRO */
- case XXIFAL: /* ALARM */
- ifargs++;
- debug(F101,"IF ALARM ck_alarm","",ck_alarm);
- debug(F110,"IF ALARM alrm_date",alrm_date,0);
- debug(F110,"IF ALARM alrm_time",alrm_time,0);
- if (ck_alarm < 1L || alrm_date[0] < '0' || alrm_time[0] < '0') {
- z = 0; /* ALARM not SET */
- break; /* so IF ALARM fails */
- }
- strcpy(tmpbuf,ckcvtdate("",1)); /* Get current date and time */
- s = tmpbuf;
- s[8] = NUL;
- z = (int) strncmp(tmpbuf,alrm_date,8); /* Compare dates */
- debug(F101,"IF ALARM date z","",z);
- if (z == 0) { /* Dates are the same */
- /* Compare times */
- z = (tod2sec(tmpbuf+9) >= atol(alrm_time)) ? 1 : -1;
- debug(F101,"IF ALARM time z","",z);
- }
- tmpbuf[0] = NUL; /* z >= 0 if alarm is passed */
- z = ((z >= 0) ? 1 : 0); /* z < 0 otherwise */
- debug(F101,"IF ALARM final z","",z);
- break;
- case XXIFOP: /* IF OPEN */
- if ((x = cmkey(iotab,niot,"file or log","",xxstring)) < 0)
- return(x);
- if (x == 9999 || x == ZSTDIO) {
- bgchk(); /* Check background status */
- z = pflag ? 1 : 0;
- } else if (x == 8888) {
- z = local ? ttchk() > -1 : 0;
- #ifdef CKLOGDIAL
- } else if (x == 7777) {
- extern int dialog;
- z = dialog ? 1 : 0;
- #endif /* CKLOGDIAL */
- } else
- z = (chkfn(x) > 0) ? 1 : 0;
- ifargs += 1;
- break;
- #ifdef OS2
- case XXIFSD: /* Started-From-Dialer */
- ifargs++;
- z = StartedFromDialer;
- break;
- case XXIFTM: /* Terminal-Macro */
- ifargs++;
- z = cmdstk[cmdlvl].ccflgs & CF_KMAC;
- break;
- #endif /* OS2 */
- case XXIFEM: /* Emulation is active */
- #ifdef OS2
- z = 1;
- #else
- z = 0;
- #endif /* OS2 */
- break;
- case XXIFIK: /* Running as IKSD? */
- z = inserver;
- break;
- case XXIFTA: /* Connection is TAPI */
- z = 0;
- #ifdef NT
- if (local && !network && tttapi)
- z = 1;
- #endif /* NT */
- break;
- case XXIFMA: /* IF MATCH */
- x = cmfld("String or variable","",&s,xxstring);
- if (x == -3) {
- extern int cmflgs;
- if (cmflgs == 1) {
- printf("?String requiredn");
- return(-9);
- }
- } else if (x < 0)
- return(x);
- ckstrncpy(line,s,LINBUFSIZ);
- s = brstrip(line);
- debug(F110,"xxifma string",line,0);
- x = cmfld("Pattern","",&p,xxstring);
- if (x == -3) {
- extern int cmflgs;
- if (cmflgs == 1) {
- printf("?Pattern requiredn");
- return(-9);
- }
- } else if (x < 0)
- return(x);
- ckstrncpy(tmpbuf,p,TMPBUFSIZ);
- p = brstrip(tmpbuf);
- debug(F110,"xxifma pattern",tmpbuf,0);
- z = ckmatch(p,s,inpcas[cmdlvl],1);
- break;
- case XXIFFL: { /* IF FLAG */
- extern int ooflag;
- z = ooflag;
- break;
- }
- case XXIFAV: { /* IF AVAILABLE */
- if ((x = cmkey(availtab,availtabn,"","",xxstring)) < 0)
- return(x);
- switch (x) {
- case AV_KRB4:
- z = ck_krb4_is_installed();
- break;
- case AV_KRB5:
- z = ck_krb5_is_installed();
- break;
- case AV_SRP:
- z = ck_srp_is_installed();
- break;
- case AV_SSL:
- z = ck_ssleay_is_installed();
- break;
- case AV_NTLM:
- z = ck_ntlm_is_installed();
- break;
- case AV_CRYPTO:
- z = ck_crypt_is_installed();
- break;
- default:
- z = 0;
- }
- break;
- }
- case XXIFAT: /* IF ASKTIMEOUT */
- z = asktimedout;
- break;
- case XXIFRD: /* IF READABLE */
- case XXIFWR: /* IF WRITEABLE */
- if ((x = cmfld("File or directory name",
- "",
- &s,
- #ifdef OS2
- NULL /* This allows 's in filenames */
- #else
- xxstring
- #endif /* OS2 */
- )) < 0) {
- if (x == -3) {
- extern int cmflgs;
- if (cmflgs == 1) {
- printf("?File or directory name requiredn");
- return(-9);
- }
- } else return(x);
- }
- s = brstrip(s);
- /*
- zchk[io]() do not do what we want here for directories, so we set
- a global flag telling it to behave specially in this case. Othewise
- we'd have to change the API and change all ck?fio.c modules accordingly.
- */
- y = 0; /* Try-again control */
- #ifdef OS2
- ifrdagain:
- #endif /* OS2 */
- if (ifc == XXIFRD) { /* IF READABLE */
- zchkid = 1;
- z = zchki(s) > -1;
- zchkid = 0;
- } else if (ifc == XXIFWR) { /* IF WRITEABLE */
- zchkod = 1;
- z = zchko(s) > -1;
- zchkod = 0;
- }
- #ifdef OS2
- if (!z && !y) { /* File not found. */
- int t; /* Try expanding variables */
- t = LINBUFSIZ-1; /* and looking again. */
- lp = line;
- zzstring(s,&lp,&t);
- s = line;
- z = zchko(s) > -1;
- y++;
- goto ifrdagain;
- }
- #endif /* OS2 */
- ifargs += 2;
- break;
- case XXIFQU: /* IF QUIET */
- z = quiet ? 1 : 0;
- debug(F101,"if quiet","",z);
- ifargs += 1;
- break;
- case XXIFWI: /* WILD */
- if ((x = cmfld("File specification","",&s,xxstring)) < 0) return(x);
- z = iswild(s);
- break;
- case XXIFCK: /* C-KERMIT */
- #ifdef OS2
- z = 0;
- #else
- z = 1;
- #endif /* OS2 */
- break;
- case XXIFK9: /* K-95 */
- #ifdef OS2
- z = 1;
- #else
- z = 0;
- #endif /* OS2 */
- break;
- case XXIFMS: /* MS-KERMIT */
- z = 0;
- break;
- case XXIFLO: /* IF LOCAL */
- z = local ? 1 : 0;
- break;
- case XXIFCM: { /* IF COMMAND */
- extern struct keytab cmdtab[];
- extern int ncmd;
- if ((x = cmfld("Word","",&s,xxstring)) < 0)
- return(x);
- z = lookup(cmdtab,s,ncmd,&y);
- z = (z == -2 || z > -1) ? 1 : 0;
- break;
- }
- #ifdef CKFLOAT
- case XXIFFP: /* IF FLOAT */
- if ((x = cmfld("Number","",&s,xxstring)) < 0)
- if (x != -3) /* e.g. empty variable */
- return(x);
- z = isfloat(s,0);
- break;
- #endif /* CKFLOAT */
- default: /* Shouldn't happen */
- return(-2);
- } /* end of switch */
- if (z)
- *bx++ = '1';
- else
- *bx++ = '0';
- *bx = NUL;
- if (bx > boolval + BOOLLEN - 2) {
- printf("?Boolean expression too long");
- return(-9);
- }
- ecount++; /* Expression counter */
- debug(F101,"boolexp parens","",parens);
- debug(F101,"boolexp pcount","",pcount);
- if (parens && pcount > 0)
- goto ifagain;
- ifend: /* No more - done */
- *bx = NUL;
- z = atoi(evalx(boolval));
- debug(F111,"boolexp boolval",boolval,z);
- return(z);
- }
- /* D O I F -- Do the IF command */
- int
- doif(cx) int cx; {
- int x, y, z; char *s, *p;
- char *q;
- #ifdef OS2
- extern int keymac;
- #endif /* OS2 */
- debug(F101,"doif cx","",cx);
- z = boolexp(cx); /* Evaluate the condition(s) */
- debug(F101,"doif boolexp","",z);
- if (z < 0)
- return(z);
- if (cx == XXIF) { /* Allow IF to have XIF semantics. */
- char * p;
- p = cmpeek();
- if (!p) p = "";
- while (*p) {
- if (*p == SP || *p == HT)
- p++;
- else
- break;
- }
- if (*p == '{')
- cx = XXIFX;
- }
- switch (cx) { /* Separate handling for IF and XIF */
- case XXASSER: /* And ASSERT */
- if ((x = cmcfm()) < 0)
- return(x);
- return(success = z);
- case XXIF: /* This is IF... */
- ifcmd[cmdlvl] = 1; /* We just completed an IF command */
- debug(F101,"doif condition","",z);
- if (z) { /* Condition is true */
- iftest[cmdlvl] = 1; /* Remember that IF succeeded */
- if (maclvl > -1) { /* In macro, */
- pushcmd(NULL); /* save rest of command. */
- } else if (tlevel > -1) { /* In take file, */
- debug(F100, "doif: pushing command", "", 0);
- pushcmd(NULL); /* save rest of command. */
- } else { /* If interactive, */
- cmini(ckxech); /* just start a new command */
- printf("n"); /* (like in MS-DOS Kermit) */
- if (pflag) prompt(xxstring);
- }
- } else { /* Condition is false */
- iftest[cmdlvl] = 0; /* Remember command failed. */
- if ((y = cmtxt("command to be ignored","",&s,NULL)) < 0)
- return(y); /* Gobble up rest of line */
- }
- return(0);
- case XXIFX: { /* This is XIF (Extended IF) */
- char *p;
- char e[5];
- int i;
- if ((y = cmtxt("Object command","",&s,NULL)) < 0)
- return(y); /* Get object command. */
- p = s;
- lp = line;
- debug(F111,"doif THEN part 1",s,z);
- if (litcmd(&p,&lp,LINBUFSIZ - 1) < 0) { /* Quote THEN-part */
- return(-2);
- }
- debug(F111,"doif THEN part 2",line,z);
- while (*p == SP) p++; /* Strip trailing spaces */
- ifcmd[cmdlvl] = 0; /* Assume ELSE part in same line */
- iftest[cmdlvl] = z ? 1 : 0;
- if (*p) { /* At end? */
- if (!z) { /* No, use ELSE-part, if any */
- for (i = 0; i < 4; i++) e[i] = *p++;
- if (ckstrcmp(e,"else",4,0)) /* See if we have an ELSE */
- return(-2); /* Something else - error. */
- debug(F110,"doif ELSE line 1",p,0);
- while (*p == SP) p++; /* Skip spaces */
- if (*p != '{') { /* Brace ELSE part if necessary */
- sprintf(tmpbuf,"{ %s }",p);
- p = tmpbuf;
- debug(F110,"doif ELSE line 2",p,0);
- }
- lp = line; /* Write over THEN part... */
- *lp = NUL; /* with ELSE part. */
- if (litcmd(&p,&lp,LINBUFSIZ - 2) < 0) {
- return(-2);
- }
- while (*p == SP) p++; /* Strip trailing spaces */
- if (*p) return(-2); /* Should be nothing here. */
- debug(F110,"doif ELSE line 3",line,0);
- }
- } else { /* At end, treat like an IF command */
- if (!z) line[0] = NUL; /* Condition not true and no ELSE */
- ifcmd[cmdlvl] = 1; /* Allow ELSE on next line */
- debug(F101,"IF condition","",z);
- }
- if (line[0]) {
- x = mlook(mactab,"_xif",nmac); /* Get index of "_xif" macro. */
- if (x < 0) { /* Not there? */
- addmmac("_xif",xif_def); /* Put it back. */
- if (mlook(mactab,"_xif",nmac) < 0) { /* Look it up again. */
- printf("?XIF macro gone!n");
- return(success = 0);
- }
- }
- dodo(x,line,cmdstk[cmdlvl].ccflgs | CF_IMAC);
- }
- return(0);
- }
- case XXWHI: { /* WHILE Command */
- p = cmdbuf; /* Capture IF condition */
- ifcond[0] = NUL; /* from command buffer */
- while (*p == SP) p++;
- while (*p != SP) p++;
- ifcp = ifcond;
- strcpy(ifcp,"{ \flit(if ( not ");
- ifcp += (int)strlen(ifcp);
- #ifdef COMMENT
- /*
- This doesn't work because it breaks on the first left brace, which does
- not necessarily start the command list, e.g. "while equal %a {35}".
- */
- while (*p != '{' && *p != NUL) *ifcp++ = *p++;
- p = " ) goto _..bot) } ";
- while (*ifcp++ = *p++) ;
- #else
- /*
- The command parser sets cmbptr to the spot where it left off parsing in
- the command buffer.
- */
- {
- extern char * cmbptr;
- if (cmbptr) {
- while (p < cmbptr && *p != NUL)
- *ifcp++ = *p++;
- p = " ) goto _..bot) } ";
- while (*ifcp++ = *p++) ;
- } else {
- printf("?Internal error parsing WHILE conditionn");
- return(-9);
- }
- }
- #endif /* COMMENT */
- debug(F110,"WHILE cmd",ifcond,0);
- if ((y = cmtxt("Object command","",&s,NULL)) < 0)
- return(y); /* Get object command. */
- p = s;
- lp = line;
- if (litcmd(&p,&lp,LINBUFSIZ - 2) < 0) { /* Quote object command */
- return(-2);
- }
- debug(F110,"WHILE body",line,0);
- if (line[0]) {
- char *p;
- x = mlook(mactab,"_while",nmac); /* index of "_while" macro. */
- if (x < 0) { /* Not there? */
- addmmac("_while",whil_def); /* Put it back. */
- if (mlook(mactab,"_while",nmac) < 0) { /* Look it up again */
- printf("?WHILE macro definition gone!n");
- return(success = 0);
- }
- }
- p = malloc((int)strlen(ifcond) + (int)strlen(line) + 2);
- if (p) {
- strcpy(p,ifcond);
- strcat(p,line);
- debug(F110,"WHILE dodo",p,0);
- dodo(x,p,cmdstk[cmdlvl].ccflgs | CF_IMAC);
- free(p);
- p = NULL;
- } else {
- printf("?Can't allocate storage for WHILE command");
- return(success = 0);
- }
- }
- return(0);
- }
- default:
- return(-2);
- }
- }
- #endif /* NOSPL */
- /* Set up a TAKE command file */
- int
- dotake(s) char *s; {
- #ifndef NOSPL
- extern int tra_cmd;
- #endif /* NOSPL */
- #ifdef OS2
- extern int term_io;
- int term_io_sav = term_io;
- #endif /* OS2 */
- debug(F111,"dotake file",s,cmdlvl);
- if ((tfile[++tlevel] = fopen(s,"r")) == NULL) {
- perror(s);
- debug(F110,"dotake fail",s,0);
- tlevel--;
- return(success = 0);
- } else {
- tfline[tlevel] = 0; /* Line counter */
- #ifdef VMS
- conres(); /* So Ctrl-C will work */
- #endif /* VMS */
- #ifdef OS2
- term_io = 0; /* Disable Terminal Emulator I/O */
- #endif /* OS2 */
- #ifndef NOSPL
- cmdlvl++; /* Entering a new command level */
- debug(F101,"dotake cmdlvl","",cmdlvl);
- debug(F101,"dotake tlevel","",tlevel);
- if (cmdlvl > CMDSTKL) {
- debug(F100,"dotake stack overflow","",0);
- cmdlvl--;
- fclose(tfile[tlevel--]);
- printf("?TAKE files and/or DO commands nested too deeplyn");
- return(success = 0);
- }
- if (tfnam[tlevel]) { /* Copy the filename */
- free(tfnam[tlevel]);
- tfnam[tlevel] = NULL;
- }
- if (tfnam[tlevel] = malloc(strlen(s) + 1))
- strcpy(tfnam[tlevel],s);
- ifcmd[cmdlvl] = 0; /* Set variables for this cmd file */
- iftest[cmdlvl] = 0;
- count[cmdlvl] = count[cmdlvl-1]; /* Inherit this */
- intime[cmdlvl] = intime[cmdlvl-1]; /* Inherit this */
- inpcas[cmdlvl] = inpcas[cmdlvl-1]; /* Inherit this */
- takerr[cmdlvl] = takerr[cmdlvl-1]; /* Inherit this */
- merror[cmdlvl] = merror[cmdlvl-1]; /* Inherit this */
- xquiet[cmdlvl] = quiet;
- cmdstk[cmdlvl].src = CMD_TF; /* Say we're in a TAKE file */
- cmdstk[cmdlvl].lvl = tlevel; /* nested at this level */
- cmdstk[cmdlvl].ccflgs = cmdstk[cmdlvl-1].ccflgs;
- #else
- takerr[tlevel] = takerr[tlevel-1]; /* Inherit this */
- #endif /* NOSPL */
- }
- #ifndef NOSPL
- if (tra_cmd)
- printf("[%d] +F: "%s"n",cmdlvl,s);
- #endif /* NOSPL */
- #ifdef OS2
- term_io = term_io_sav;
- #endif /* OS2 */
- return(1);
- }
- #endif /* NOICP */