ckuusr.c
上传用户:dufan58
上传日期:2007-01-05
资源大小:3407k
文件大小:233k
源码类别:

通讯/手机编程

开发平台:

Windows_Unix

  1.     printf("?Unexpected switch value - %dn",cmresult.nresult);
  2.     x = -9;
  3.     goto xconnx;
  4. }
  5.     }
  6.     debug(F101,"doxconn cmresult.fcode","",cmresult.fcode);
  7.     if (cmresult.fcode != _CMCFM) {
  8. printf("?Unexpected function code: %dn",cmresult.fcode);
  9. x = -9;
  10. goto xconnx;
  11.     }
  12. #ifdef OS2 /* Make results available globally */
  13.     if (pv[CONN_IL].ival > -1) /* Idle limit */
  14.       tt_idlelimit = pv[CONN_IL].ival;
  15.     if (pv[CONN_II].ival > -1) /* Idle limit */
  16.       tt_idlesnd_tmo = pv[CONN_II].ival;
  17.     if (pv[CONN_IS].sval) /* Idle string */
  18.       if (tt_idlesnd_str = (char *)malloc((int)strlen(pv[CONN_IS].sval)+1))
  19. strcpy(tt_idlesnd_str,pv[CONN_IS].sval);
  20.     if (pv[CONN_TL].ival > -1) /* Session limit */
  21.       tt_timelimit = pv[CONN_TL].ival;
  22. #endif /* OS2 */
  23. #ifdef CK_TRIGGER
  24.     if (pv[CONN_TS].sval) /* Trigger strings */
  25.       makelist(pv[CONN_TS].sval,tt_trigger,TRIGGERS);
  26.     for (i = 0; i < TRIGGERS; i++) /* Trigger match pointers */
  27.       tt_trmatch[i] = NULL;
  28.     if (triggerval) { /* Reset trigger value */
  29. free(triggerval);
  30. triggerval = NULL;
  31.     }
  32. #endif /* CK_TRIGGER */
  33.     x = doconect((pv[CONN_NV].ival > 0) ? 1 : 0);
  34. #ifdef CKLOGDIAL
  35.     {
  36. int xx;
  37. debug(F101,"doxconn doconect returns","",x);
  38. if ((xx = ttchk()) < 0) dologend();
  39. debug(F101,"doxconn ttchk returns","",xx);
  40.     }
  41. #endif /* CKLOGDIAL */
  42. #ifdef CK_TRIGGER
  43.     debug(F111,"doxconn doconect triggerval",triggerval,x);
  44. #endif /* CK_TRIGGER */
  45.     /* Back from CONNECT -- Restore global settings */
  46. #ifdef OS2
  47.     tt_idlelimit   = g_tt_idlelimit;
  48.     tt_idlesnd_tmo = g_tt_idlesnd_tmo;
  49.     tt_timelimit   = g_tt_timelimit;
  50.     tt_idlesnd_str = g_tt_idlesnd_str;
  51. #endif /* OS2 */
  52. #ifdef CK_TRIGGER
  53.     for (i = 0; i < TRIGGERS; i++)
  54.       tt_trigger[i] = g_tt_trigger[i];
  55. #endif /* CK_TRIGGER */
  56.   xconnx:
  57.     for (i = 0; i <= CONN_MAX; i++) { /* Free malloc'd memory */
  58. if (pv[i].sval)
  59.   free(pv[i].sval);
  60.     }
  61.     success = (x > 0) ? 1 : 0;
  62.     return(x);
  63. }
  64. #endif /* NOLOCAL */
  65. #ifdef ADDCMD
  66. /* cx == XXADD or XXREMV */
  67. /* fc == ADD_BIN or ADD_TXT */
  68. static int
  69. doadd(cx,fc) int cx, fc; {
  70. #ifdef PATTERNS
  71.     char * tmp[FTPATTERNS];
  72.     char **p = NULL;
  73.     int i, n = 0, x = 0, last;
  74. #endif /* PATTERNS */
  75.     if (cx != XXADD && cx != XXREMV) {
  76. printf("?Unexpected function code: %dn",cx);
  77. return(-9);
  78.     }
  79. #ifdef PATTERNS
  80.     while (n < FTPATTERNS) { /* Collect new patterns */
  81. tmp[n] = NULL;
  82. if ((x = cmfld("Pattern","",&s,xxstring)) < 0)
  83.   break;
  84. strcpy(line,s);
  85. s = brstrip(line);
  86. makestr(&(tmp[n++]),s);
  87.     }
  88.     if (x == -3)
  89.       x = cmcfm();
  90.     if (x < 0)
  91.       goto xdoadd;
  92.     p = (fc == ADD_BIN) ? binpatterns : txtpatterns; /* Which list */
  93.     last = 0;
  94.     for (i = 0; i < FTPATTERNS; i++) { /* Find last one in list */
  95. if (!p[i]) {
  96.     last = i;
  97.     break;
  98. }
  99.     }
  100.     if (cx == XXADD) { /* Adding */
  101. if (last + n > FTPATTERNS) { /* Check if too many */
  102.     printf("?Too many patterns - %d is the maximumn", FTPATTERNS);
  103.     goto xdoadd;
  104. }
  105. for (i = 0; i < n; i++) /* Copy in the new ones. */
  106.   makestr(&(p[i+last]),tmp[i]);
  107. makestr(&(p[i+last]),NULL); /* Null-terminate the list */
  108. x = 1;
  109. goto xdoadd; /* Done */
  110.     } else if (cx == XXREMV) { /* Remove something(s) */
  111. int j, k;
  112. if (last == 0)         /* List is empty */
  113.   goto xdoadd;         /* Nothing to remove */
  114. for (i = 0; i < n; i++) {         /* i = Patterns they typed */
  115.     for (j = 0; j < last; j++) {        /* j = Patterns in list */
  116. /* Change this to ckstrcmp()... */
  117. if (filecase)
  118.   x = !strcmp(tmp[i],p[j]);     /* Case-sensitive match */
  119. else
  120.   x = ckstrcmp(tmp[i],p[j],-1,0); /* Case-independent match */
  121. if (x) {              /* This one matches */
  122.     makestr(&(p[j]),NULL);      /* Free it */
  123.     for (k = j; k < last; k++)  /* Move the rest up */
  124.       p[k] = p[k+1];
  125.     p[k] = NULL;         /* Erase last one */
  126.     if (!p[k])
  127.       break;
  128. }
  129.     }
  130. }
  131.     }
  132.   xdoadd: /* Common exit */
  133.     for (i = 0; i < n; i++)
  134.       if (tmp[i])
  135. free(tmp[i]);
  136.     return(x);
  137. #endif /* PATTERNS */
  138. }
  139. /* ADD SEND-LIST */
  140. static int
  141. addsend(cx) int cx; {
  142. #ifndef NOMSEND
  143.     extern struct keytab fttab[];
  144.     extern int nfttyp;
  145.     struct filelist * flp;
  146.     char * fmode = "";
  147.     int xmode = 0;
  148.     int xbinary = 0;
  149. #endif /* NOMSEND */
  150. #ifdef NOMSEND
  151.     printf("?Sorry, ADD/REMOVE SEND-LIST not available.n");
  152.     return(-9);
  153. #endif /* NOMSEND */
  154.     if (cx == XXREMV) {
  155. printf("?Sorry, REMOVE SEND-LIST not implemented yet.n");
  156. return(-9);
  157.     }
  158. #ifndef NOMSEND
  159. #ifndef XYZ_INTERNAL
  160.     if (protocol != PROTO_K) {
  161.        printf("?Sorry, ADD SEND-LIST does not work with external protocolsn");
  162.        return(-9);
  163.     }
  164. #endif /* XYZ_INTERNAL */
  165.     x = cmifi("File specification to add","", &s,&y,xxstring);
  166.     if (x < 0) {
  167. if (x == -3) {
  168.     printf("?A file specification is requiredn");
  169.     return(-9);
  170. } else
  171.   return(x);
  172.     }
  173.     strcpy(tmpbuf,s);
  174.     s = tmpbuf;
  175.     if (filesinlist == 0) /* Take care of v(filespec) */
  176.       fspec[0] = NUL;
  177.     zfnqfp(s,LINBUFSIZ,line);
  178.     s = line;
  179.     if (((int)strlen(fspec) + (int)strlen(s) + 1) < fspeclen) {
  180. strcat(fspec,s);
  181. strcat(fspec," ");
  182.     } else
  183.       printf("WARNING - \v(filespec) buffer overflown");
  184.     xbinary = binary;
  185. #ifdef PATTERNS
  186.     if (patterns /* PATTERNS are ON */
  187. #ifdef CK_LABELED
  188. && binary != XYFT_L /* And not if FILE TYPE LABELED */
  189. #endif /* CK_LABELED */
  190. #ifdef VMS
  191. && binary != XYFT_I /* or FILE TYPE IMAGE */
  192. #endif /* VMS */
  193. ) {
  194. if (binary != XYFT_T && txtpatterns[0]) {
  195.     int i;
  196.     for (i = 0; i < FTPATTERNS && txtpatterns[i]; i++) {
  197. if (ckmatch(txtpatterns[i],line,filecase,1)) {
  198.     xbinary = XYFT_T;
  199.     break;
  200. }
  201.     }
  202. }
  203. if (binary != XYFT_B && binpatterns[0]) {
  204.     int i;
  205.     for (i = 0; i < FTPATTERNS && binpatterns[i]; i++) {
  206. if (ckmatch(binpatterns[i],line,filecase,1)) {
  207.     xbinary = XYFT_B;
  208.     break;
  209. }
  210.     }
  211. }
  212.     }
  213. #endif /* PATTERNS */
  214.     fmode = gfmode(xbinary,0);
  215.     if ((x = cmkey(fttab,nfttyp,
  216.    "type of file transfer", fmode, xxstring)) < 0)
  217.       return(x);
  218.     xmode = x;
  219.     cmarg2 = "";
  220.     if ((x = cmfld(y ?
  221.   "nAs-name template containing replacement variables such as \v(filename)" :
  222.   "Name to send it with", "",&s,NULL)) < 0)
  223.       if (x != -3)
  224. return(x);
  225. #ifndef NOSPL
  226.     if (y && *s) {
  227. char * p = tmpbuf;
  228. x = TMPBUFSIZ;
  229. zzstring(s,&p,&x);
  230. if (!strcmp(tmpbuf,s)) {
  231.     printf(
  232.   "?As-name for file group must contain variables such as \v(filename)n"
  233.    );
  234.     return(-9);
  235. }
  236.     }
  237. #endif /* NOSPL */
  238.     strcpy(tmpbuf,s);
  239.     cmarg2 = tmpbuf;
  240.     if ((x = cmcfm()) < 0)
  241.       return(x);
  242.     flp = (struct filelist *) malloc(sizeof(struct filelist));
  243.     if (flp) {
  244. if (filetail)
  245.   filetail->fl_next = flp;
  246. filetail = flp;
  247. if (!filehead)
  248.   filehead = flp;
  249. x = (int) strlen(line); /* Length of filename */
  250. s = (char *) malloc(x + 1);
  251. if (s) {
  252.     strcpy(s,line);
  253.     flp->fl_name = s;
  254.     flp->fl_mode = xmode;
  255.     x = (int) strlen(cmarg2); /* Length of as-name */
  256.     if (x < 1) {
  257. flp->fl_alias = NULL;
  258.     } else {
  259. s = (char *) malloc(x + 1);
  260. if (s) {
  261.     strcpy(s,cmarg2);
  262.     flp->fl_alias = s;
  263. } else {
  264.     printf("Sorry, can't allocate space for as-name");
  265.     return(-9);
  266. }
  267.     }
  268.     flp->fl_next = NULL;
  269.     filesinlist++; /* Count this node */
  270.     return(success = 1); /* Finished adding this node */
  271. } else {
  272.     printf("Sorry, can't allocate space for name");
  273.     return(-9);
  274. }
  275.     } else {
  276. printf("Sorry, can't allocate file list node");
  277. return(-9);
  278.     }
  279. #endif /* NOMSEND */
  280. }
  281. #endif /* ADDCMD */
  282. #ifndef NOHTTP /* HTTP ops... */
  283. #ifdef TCPSOCKET
  284. #define HTTP_GET 0 /* GET */
  285. #define HTTP_PUT 1 /* PUT */
  286. #define HTTP_POS 2 /* POST */
  287. #define HTTP_IDX 3 /* INDEX */
  288. #define HTTP_HED 4                      /* HEAD */
  289. #define HTTP_DEL 5                      /* DELETE */
  290. static struct keytab httptab[] = {
  291.     "delete", HTTP_DEL, 0,
  292.     "get",    HTTP_GET, 0,
  293.     "head",   HTTP_HED, 0,
  294.     "index",  HTTP_IDX, 0,
  295.     "put",    HTTP_PUT, 0,
  296.     "post",   HTTP_POS, 0
  297. };
  298. static int nhttptab = sizeof(httptab)/sizeof(struct keytab);
  299. /* HTTP switches */
  300. #define HT_SW_AG 0 /* /AGENT */
  301. #define HT_SW_HD 1 /* /HEADER */
  302. #define HT_SW_US 2 /* /USER */
  303. #define HT_SW_PW 3 /* /PASSWORD */
  304. #define HT_SW_AR 4
  305. static struct keytab httpswtab[] = {
  306.     "/agent",    HT_SW_AG, CM_ARG,
  307. #ifndef NOSPL
  308.     "/array",    HT_SW_AR, CM_ARG,
  309. #endif /* NOSPL */
  310.     "/header",   HT_SW_HD, CM_ARG,
  311.     "/password", HT_SW_PW, CM_ARG,
  312.     "/user",     HT_SW_US, CM_ARG,
  313.     "", 0, 0
  314. };
  315. static int nhttpswtab = sizeof(httpswtab)/sizeof(struct keytab) - 1;
  316. /* HTTP PUT/POST switches */
  317. #define HT_PP_MT 0 /* /MIME-TYPE */
  318. static struct keytab httpptab[] = {
  319.     "/mime-type", HT_PP_MT, CM_ARG,
  320.     "", 0, 0
  321. };
  322. static int nhttpptab = sizeof(httpptab)/sizeof(struct keytab) - 1;
  323. #define HTTP_MAXHDR 8
  324. static int
  325. dohttp(action, lfile, rf, agent, hdr, user, pass, mime, array)
  326.     int action; char *lfile, *rf, *agent, *hdr, *user, *pass, *mime, array;
  327. /* dohttp */ {
  328.     int i, rc = 0;
  329.     char * hdrlist[HTTP_MAXHDR];
  330.     char rfile[CKMAXPATH+1];
  331.     /* Check for a valid state to execute the command */
  332.     if (inserver) {
  333.         printf("?The HTTP command may not be used from the IKSrn");
  334.     } else if (!local || ttchk() < 0) {
  335. printf("?No connectionn");
  336.     } else if (!network) {
  337. printf("?The HTTP command is not for serial connectionsn");
  338.     } else if (nettype != NET_TCPB && nettype != NET_TCPA) {
  339. printf("?The HTTP command only for TCP/IP connectionsn");
  340.     } else {
  341. rc = 1;
  342.     }
  343.     /* If the command is not valid, exit with failure */
  344.     if (rc == 0)
  345.         return(success = 0);
  346.     if (rf[0] != '/') {
  347.         rfile[0] = '/';
  348.         ckstrncpy(&rfile[1],rf,CKMAXPATH);
  349.     } else {
  350.         ckstrncpy(rfile,rf,CKMAXPATH);
  351.     }
  352.     for (i = 0; i < HTTP_MAXHDR; i++) /* Initialize header list */
  353.       hdrlist[i] = NULL;
  354.     makelist(hdr,hdrlist,HTTP_MAXHDR); /* Make header list */
  355. #ifdef BETATEST
  356.     for (i = 0; i < nhttptab; i++) /* Find action keyword */
  357.       if (httptab[i].kwval == action)
  358. break;
  359.     if (i == nhttptab) { /* Shouldn't happen... */
  360. printf("?Invalid action - %dn",action);
  361. return(success = 0);
  362.     }
  363.     printf("HTTP action:  %sn",httptab[i].kwd);
  364.     printf(" Agent:       %sn",agent ? agent : "(null)");
  365.     if (hdrlist[1]) {
  366. printf(" Header list: 1. %sn",hdrlist[0]);
  367. for (i = 1; i < HTTP_MAXHDR && hdrlist[i]; i++)
  368.   printf("%15d. %sn",i+1,hdrlist[i]);
  369.     } else
  370.       printf(" Header:      %sn",hdrlist[0] ? hdrlist[0] : "(null)");
  371.     printf(" User:        %sn",user ? user : "(null)");
  372.     printf(" Password:    %sn",pass ? pass : "(null)");
  373. #ifndef NOSPL
  374.     if (array)
  375.       printf(" Array:       \%%%c[]n", array);
  376.     else
  377.       printf(" Array:       (none)n");
  378. #endif /* NOSPL */
  379.     if (action == HTTP_PUT || action == HTTP_POS)
  380.       printf(" Mime-type:   %sn",mime ? mime : "(null)");
  381.     printf(" Local file:  %sn",lfile ? lfile : "(null)");
  382.     printf(" Remote file: %sn",rfile ? rfile : "(null)");
  383. #endif /* BETATEST */
  384.     switch (action) {
  385.       case HTTP_DEL:
  386.         rc = http_delete(agent,hdrlist,user,pass,array,rfile);
  387.         break;
  388.       case HTTP_GET:
  389.         rc = http_get(agent,hdrlist,user,pass,array,lfile,rfile);
  390.         break;
  391.       case HTTP_HED:
  392.         rc = http_head(agent,hdrlist,user,pass,array,lfile,rfile);
  393.         break;
  394.       case HTTP_PUT:
  395.         rc = http_put(agent,hdrlist,mime,user,pass,array,lfile,rfile);
  396.         break;
  397.       case HTTP_POS:
  398.         rc = http_post(agent,hdrlist,mime,user,pass,array,lfile,rfile);
  399.         break;
  400.       case HTTP_IDX:
  401.         rc = http_index(agent,hdrlist,user,pass,array,lfile,rfile);
  402.         break;
  403.     }
  404.     return(success = ((rc < 0) ? 0 : 1));
  405. }
  406. #endif /* TCPSOCKET */
  407. #endif /* NOHTTP */
  408. #ifndef NOSPL /* ARRAY ops... */
  409. static struct keytab arraytab[] = {
  410.     "clear",    ARR_CLR, 0,
  411.     "copy",     ARR_CPY, 0,
  412.     "dcl",      ARR_DCL, CM_INV,
  413.     "declare",  ARR_DCL, 0,
  414.     "destroy",  ARR_DST, 0,
  415.     "resize",   ARR_RSZ, 0,
  416.     "set",      ARR_SET, 0,
  417. #ifndef NOSHOW
  418.     "show",     ARR_SHO, 0,
  419. #endif /* NOSHOW */
  420.     "sort",     ARR_SRT, 0,
  421.     "", 0, 0
  422. };
  423. static int narraytab = sizeof(arraytab)/sizeof(struct keytab) - 1;
  424. int
  425. arrayitoa(x) int x; { /* Array index to array letter */
  426.     if (x == 1)
  427.       return(64);
  428.     else if (x < 0 || x > (122 - ARRAYBASE))
  429.       return(-1);
  430.     else
  431.       return(x + ARRAYBASE);
  432. }
  433. int
  434. arrayatoi(c) int c; { /* Array letter to array index */
  435.     if (c == 64)
  436.       c = 96;
  437.     if (c > 63 && c < 91)
  438.       c += 32;
  439.     if (c < ARRAYBASE || c > 122)
  440.       return(-1);
  441.     return(c - ARRAYBASE);
  442. }
  443. static int
  444. dodcl() {
  445.     int i, n, v, lo, hi, rc = 0;
  446.     int isdynamic = 0;
  447.     char ** p = NULL;
  448.     char tmp[64]; /* Local temporary string buffer */
  449.     if ((y = cmfld("Array name","",&s,NULL)) < 0) { /* Parse array name */
  450. if (y == -3) {
  451.     printf("?Array name requiredn");
  452.     return(-9);
  453. } else return(y);
  454.     }
  455. #ifdef COMMENT
  456.     if ((y = arraynam(s,&x,&n)) < 0) { /* Check it */
  457. if (y == -2 && n == -17) { /* Secret code for emtpy brackets */
  458.     isdynamic = 1;
  459.     n = CMDBL / 5;
  460. } else {
  461.     return(y);
  462. }
  463.     }
  464.     debug(F111,"DCL",s,n);
  465. #else
  466.     ckstrncpy(line,s,LINBUFSIZ);
  467.     s = line;
  468.     x = arraybounds(s,&lo,&hi);
  469.     if (lo < 0 && hi < 0) {
  470. isdynamic = 1;
  471. n = CMDBL / 5;
  472.     } else if (hi > -1) {
  473. printf("?Segment notation not allowed in array declarationsn");
  474. return(-9);
  475.     } else
  476.       n = lo;
  477.     x = arrayitoa(x);
  478. #endif /* COMMENT */
  479.     p = (char **)malloc(sizeof(char **)*(n+1));
  480.     if (!p) {
  481. printf("?Memory allocation errorn");
  482. return(-9);
  483.     }
  484.     v = 0; /* Highest initialized member */
  485.     p[0] = NULL; /* Element 0 */
  486.     while (n > 0 && v < n) { /* Parse initializers */
  487. p[v+1] = NULL;
  488. sprintf(tmp,"Initial value for \&%c[%d]",x,v+1); /* Help string */
  489. if ((rc = cmfld((char *)tmp,"",&s,xxstring)) < 0) { /* Get field */
  490.     if (rc == -3) /* If answer is empty, we're done */
  491.       break;
  492.     else /* Parse error, free temp pointers */
  493.       goto dclx;
  494. }
  495. rc = 1;
  496. if (v == 0 && !strcmp(s,"=")) /* Skip the = sign. */
  497.   continue;
  498. s = brstrip(s); /* Strip any braces */
  499. makestr(&(p[++v]),s);
  500.     }
  501.     if ((y = cmtxt("Carriage return to confirm","",&s,NULL)) < 0)
  502.       return(y);
  503.     if (isdynamic)
  504.       n = v;
  505.     if (dclarray((char)x,n) < 0) { /* Declare the array */
  506. printf("?Declare failedn");
  507. goto dclx;
  508.     }
  509.     for (i = 1; i <= v; i++) { /* Add any initial values */
  510. sprintf(tmp,"&%c[%d]",(char)x,i);
  511. if (addmac(tmp,p[i]) < 0) {
  512.     printf("Array initialization error: %s %sn",tmp,p[i]);
  513.     rc = -9;
  514.     goto dclx;
  515. }
  516.     }
  517.   dclx:
  518.     if (p) {
  519. for (i = 1; i <= v; i++)
  520.   if (p[i]) free(p[i]);
  521. free(p);
  522.     }
  523.     debug(F101,"DCL rc","",rc);
  524.     return(success = rc);
  525. }
  526. static int
  527. rszarray() {
  528.     int i, x, y, n, lo, hi;
  529.     char c, * s, ** ap = NULL;
  530.     if ((x = cmfld("Array name","",&s,NULL)) < 0) { /* Parse array name */
  531. if (x == -3) {
  532.     printf("?Array name requiredn");
  533.     return(-9);
  534. } else return(x);
  535.     }
  536.     ckstrncpy(line,s,LINBUFSIZ); /* Make safe copy of name */
  537.     s = line;
  538.     x = arraybounds(s,&lo,&hi);
  539.     if (lo < 0 && hi < 0) {
  540. y = cmnum("New size","",10,&lo,xxstring);
  541. if (y < 0) {
  542.     if (y == -3)
  543.       printf("?New size requiredn");
  544.     return(y);
  545. }
  546.     }
  547.     if ((y = cmcfm()) < 0)
  548.       return(y);
  549.     if (x < 0) { /* Parse the name, get index */
  550. printf("?Bad array reference - "%s"n", s);
  551. return(-9);
  552.     }
  553.     if (!a_ptr[x]) {
  554. printf("?Array not declared - "%s"n", s);
  555. return(-9);
  556.     }
  557.     if (lo < 0) {
  558. printf("?New size requiredn");
  559. return(-9);
  560.     }
  561.     if (hi > -1) {
  562. printf("?Array segments not allowed for this operationn");
  563. return(-9);
  564.     }
  565.     c = arrayitoa(x); /* Get array letter */
  566.     if (c == '@') { /* Argument vector array off limits */
  567. printf("?Sorry, \&@[] is read-onlyn");
  568. return(-9);
  569.     }
  570.     if (lo == 0) { /* If new size is 0... */
  571. dclarray(c,0); /* Undeclare the array */
  572. return(success = 1);
  573.     }
  574.     n = a_dim[x]; /* Current size */
  575.     ap = (char **) malloc((lo+1) * sizeof(char *)); /* New array */
  576.     y = (n < lo) ? n : lo;
  577.     for (i = 0; i <= y; i++) /* Copy the part that fits */
  578.       ap[i] = a_ptr[x][i];
  579.     if (n < lo) { /* If original array smaller */
  580. for (; i <= lo; i++) /* initialize extra elements in */
  581.   ap[i] = NULL; /* new array to NULL. */
  582.     } else if (n > lo) { /* If new array smaller */
  583. for (; i <= lo; i++) /* deallocate leftover elements */
  584.   makestr(&(a_ptr[x][i]),NULL); /* from original array. */
  585.     }
  586.     free(a_ptr[x]); /* Free original array list */
  587.     a_ptr[x] = ap; /* Replace with new one */
  588.     a_dim[x] = lo; /* Record the new dimension */
  589.     return(success = 1);
  590. }
  591. static int
  592. copyarray() {
  593.     int i, j, x1, lo1, hi1, x2, lo2, hi2, whole = 0;
  594.     char c1, c2, * a1, * a2;
  595.     if ((y = cmfld("Name of source array","",&s,NULL)) < 0)
  596.       return(y);
  597.     ckstrncpy(line,s,LINBUFSIZ);
  598.     a1 = line;
  599.     if ((x1 = arraybounds(a1,&lo1,&hi1)) < 0) {
  600. printf("?Bad array reference - "%s"n", a1);
  601. return(-9);
  602.     } else if (!a_ptr[x1]) {
  603. printf("?Array not declared - "%s"n", a1);
  604. return(-9);
  605.     }
  606.     c1 = arrayitoa(x1);
  607.     if ((y = cmfld("Name of destination array","",&s,NULL)) < 0)
  608.       return(y);
  609.     ckstrncpy(tmpbuf,s,TMPBUFSIZ);
  610.     a2 = tmpbuf;
  611.     if ((x2 = arraybounds(a2,&lo2,&hi2)) < 0) {
  612. printf("?Bad array reference - "%s"n", a2);
  613. return(-9);
  614.     }
  615.     c2 = arrayitoa(x2);
  616.     if ((x = cmcfm()) < 0)
  617.       return(x);
  618.     if (c2 == '@') { /* Argument vector array off limits */
  619. printf("?Sorry, \&@[] is read-onlyn");
  620. return(-9);
  621.     }
  622.     if (lo1 < 0 && lo2 < 0 && hi1 < 0 && hi2 < 0) /* Special case for */
  623.       whole = 1;           /* whole array... */
  624.     if (lo1 < 0) lo1 = whole ? 0 : 1; /* Supply lower bound of source */
  625.     if (hi1 < 0) hi1 = a_dim[x1]; /* Supply upper bound of source */
  626.     if (lo2 < 0) lo2 = whole ? 0 : 1; /* Lower bound of target */
  627.     if (hi2 < 0) hi2 = lo2 + hi1 - lo1; /* Upper bound of target */
  628.     if (a_ptr[x2]) { /* Target array is already declared? */
  629. if (hi2 > a_dim[x2]) /* If upper bound out of range */
  630.   hi2 = a_dim[x2]; /* shrink to fit */
  631.     } else { /* Otherwise... */
  632. x2 = dclarray(c2, hi2); /* declare the target array */
  633.     }
  634.     for (i = lo1, j = lo2; i <= hi1 && j <= hi2; i++,j++) { /* Copy */
  635. makestr(&(a_ptr[x2][j]),a_ptr[x1][i]);
  636.     }
  637.     return(success = 1);
  638. }
  639. static int /* Undeclare an array */
  640. unarray() {
  641.     int x, y, n, rc = 0;
  642.     char c, * s;
  643.     if ((y = cmfld("Array name","",&s,NULL)) < 0) { /* Parse array name */
  644. if (y == -3) {
  645.     printf("?Array name requiredn");
  646.     return(-9);
  647. } else return(y);
  648.     }
  649.     ckstrncpy(line,s,LINBUFSIZ); /* Make safe copy of name */
  650.     s = line;
  651.     if ((y = cmcfm()) < 0)
  652.       return(y);
  653.     if ((x = arraybounds(s,&y,&n)) < 0) { /* Parse the name, get index */
  654. printf("?Bad array reference - "%s"n", s);
  655. return(-9);
  656.     }
  657.     if (y > 0 || n > 0) {
  658. printf("?Partial arrays can not be destroyedn");
  659. return(-9);
  660.     }
  661.     c = arrayitoa(x); /* Get array letter */
  662.     if (a_ptr[x]) { /* If array is declared */
  663. if (c == '@') { /* Argument vector array off limits */
  664.     printf("?Sorry, \&@[] is read-onlyn");
  665.     return(-9);
  666. }
  667. rc = dclarray(c,0); /* Undeclare the array */
  668.     } else /* It wasn't declared */
  669.       rc = 1;
  670.     if (rc > -1) { /* Set return code and success */
  671. success = 1;
  672. rc = 1;
  673.     } else {
  674. success = 0;
  675. printf("?Failed - destroy "\&%c[]"n", c);
  676. rc = -9;
  677.     }
  678.     return(rc);
  679. }
  680. static int
  681. clrarray(cx) int cx; {
  682.     int i, x, lo, hi;
  683.     char c, * s, * val = NULL;
  684.     if ((x = cmfld("Array name","",&s,NULL)) < 0) { /* Parse array name */
  685. if (x == -3) {
  686.     printf("?Array name requiredn");
  687.     return(-9);
  688. } else return(x);
  689.     }
  690.     ckstrncpy(line,s,LINBUFSIZ); /* Make safe copy of name */
  691.     s = line;
  692.     if (cx == ARR_SET) { /* SET */
  693. if ((x = cmtxt("Value","",&val,xxstring)) < 0)
  694.   return(x);
  695. ckstrncpy(tmpbuf,val,TMPBUFSIZ); /* Value to set */
  696. val = tmpbuf;
  697. if (!*val) val = NULL;
  698.     } else if ((x = cmcfm()) < 0) /* CLEAR */
  699.       return(x);
  700.     if ((x = arraybounds(s,&lo,&hi)) < 0) { /* Parse the name */
  701. printf("?Bad array reference - "%s"n", s);
  702. return(-9);
  703.     }
  704.     c = arrayitoa(x); /* Get array letter */
  705.     if (!a_ptr[x]) { /* If array is declared */
  706. printf("?Array %s is not declaredn", s);
  707. return(-9);
  708.     } else if (c == '@') { /* Argument vector array off limits */
  709. printf("?Sorry, \&@[] is read-onlyn");
  710. return(-9);
  711.     }
  712.     if (lo < 0) lo = 0;
  713.     if (hi < 0) hi = a_dim[x];
  714.     for (i = lo; i <= hi; i++) /* Clear/Set selected range */
  715.       makestr(&(a_ptr[x][i]),val);
  716.     return(success = 1);
  717. }
  718. #endif /* NOSPL */
  719. /*  D O C M D  --  Do a command  */
  720. /*
  721.  Returns:
  722.    -2: user typed an illegal command
  723.    -1: reparse needed
  724.     0: parse was successful (even tho command may have failed).
  725. */
  726. int
  727. docmd(cx) int cx; {
  728.     debug(F101,"docmd entry, cx","",cx);
  729.     activecmd = cx;
  730.     doconx = ((activecmd == XXCON)  || (activecmd == XXTEL) ||
  731.       (activecmd == XXRLOG) || (activecmd == XXPIPE) ||
  732.               (activecmd == XXIKSD) || (activecmd == XXPTY));
  733. /*
  734.   Massive switch() broken up into many smaller ones, for the benefit of
  735.   compilers that run out of space when trying to handle large switch
  736.   statements.
  737. */
  738.     switch (cx) {
  739.       case -4: /* EOF */
  740. #ifdef OSK
  741. if (msgflg)  printf("n");
  742. #else
  743. if (msgflg)  printf("rn");
  744. #endif /* OSK */
  745.   doexit(GOOD_EXIT,xitsta);
  746.       case -3: /* Null command */
  747. return(0);
  748.       case -9: /* Like -2, but errmsg already done */
  749.       case -1: /* Reparse needed */
  750. return(cx);
  751.       case -6: /* Special */
  752.       case -2: /* Error, maybe */
  753. #ifndef NOSPL
  754. /*
  755.   Maybe they typed a macro name.  Let's look it up and see.
  756. */
  757. if (cx == -6) /* If they typed CR */
  758.   strcat(cmdbuf,"15"); /*  add it back to command buffer. */
  759. if (ifcmd[cmdlvl] == 2) /* Watch out for IF commands. */
  760.   ifcmd[cmdlvl]--;
  761. repars = 1; /* Force reparse */
  762. cmres();
  763. cx = XXDO; /* Try DO command */
  764. #else
  765. return(cx);
  766. #endif /* NOSPL */
  767.       default:
  768. break;
  769.     }
  770. #ifndef NOSPL
  771. /* Copy macro args from/to two levels up, used internally by _floop et al. */
  772.     if (cx == XXGTA || cx == XXPTA) { /* _GETARGS, _PUTARGS */
  773. int x;
  774. debug(F101,"docmd XXGTA","",XXGTA);
  775. debug(F101,"docmd cx","",cx);
  776. debug(F101,"docmd XXGTA maclvl","",maclvl);
  777. x = dogta(cx);
  778. debug(F101,"docmd dogta returns","",x);
  779. debug(F101,"docmd dogta maclvl","",maclvl);
  780. return(x);
  781.     }
  782. #endif /* NOSPL */
  783. #ifndef NOSPL
  784. #ifdef CKCHANNELIO
  785.     if (cx == XXFILE)
  786.       return(dofile(cx));
  787.     else if (cx == XXF_RE || cx == XXF_WR || cx == XXF_OP ||
  788.      cx == XXF_CL || cx == XXF_SE || cx == XXF_RW ||
  789.      cx == XXF_FL || cx == XXF_LI || cx == XXF_ST || cx == XXF_CO)
  790.       return(dofile(cx));
  791. #endif /* CKCHANNELIO */
  792. /* ASK, ASKQ, READ */
  793.     if (cx == XXASK  || cx == XXASKQ || cx == XXREA ||
  794. cx == XXRDBL || cx == XXGETC || cx == XXGETK) {
  795. return(doask(cx));
  796.     }
  797. #endif /* NOSPL */
  798. #ifndef NOFRILLS
  799.     if (cx == XXBUG) { /* BUG */
  800. if ((x = cmcfm()) < 0) return(x);
  801. return(dobug());
  802.     }
  803. #endif /* NOFRILLS */
  804. #ifndef NOXFER
  805.     if (cx == XXBYE) { /* BYE */
  806. bye_active = 1;
  807. #ifdef CK_XYZ
  808. if (protocol != PROTO_K) {
  809.     printf("Sorry, BYE only works with Kermit protocoln");
  810.     return(-9);
  811. }
  812. #endif /* CK_XYZ */
  813. if ((x = cmcfm()) < 0) return(x);
  814. #ifdef IKS_OPTION
  815.         if (!iks_wait(KERMIT_REQ_START,1)) {
  816.     printf(
  817.      "?A Kermit Server is unavailable to process this commandn");
  818.     return(-9); /* Correct the return code */
  819.         }
  820. #endif /* IKS_OPTION */
  821. sstate = setgen('L',"","","");
  822. if (local) ttflui(); /* If local, flush tty input buffer */
  823. return(0);
  824.     }
  825. #endif /* NOXFER */
  826.     if (cx == XXBEEP) { /* BEEP */
  827.         int x;
  828. #ifdef OS2
  829. int y;
  830.         if ((y = cmkey(beeptab, nbeeptab, "which kind of beep", "information",
  831.        xxstring)) < 0 )
  832.   return (y);
  833.      if ((x = cmcfm()) < 0) return(x);
  834.         bleep((short)y); /* y is one of the BP_ values */
  835. #else  /* OS2 */
  836.      if ((x = cmcfm()) < 0) return(x);
  837. #ifndef NOSPL
  838.         bleep(BP_NOTE);
  839. #else
  840. putchar('7');
  841. #endif /* NOSPL */
  842. #endif /* OS2 */
  843.         return(0);
  844.     }
  845. #ifndef NOFRILLS
  846.     if (cx == XXCLE) { /* CLEAR */
  847. if ((x = cmkey(clrtab,nclear,"item to clear",
  848. #ifdef NOSPL
  849.   "device-buffer"
  850. #else
  851.   "device-and-input"
  852. #endif /* NOSPL */
  853.   ,xxstring)) < 0) return(x);
  854. #ifndef NOSPL
  855. #ifdef OS2
  856.         if (x == CLR_CMD || x == CLR_TRM) {
  857.             if ((z = cmkey(clrcmdtab,nclrcmd,"how much screen to clearn",
  858.    "all",xxstring)) < 0)
  859.       return(z);
  860.         }
  861. #endif /* OS2 */
  862. #endif /* NOSPL */
  863. if ((y = cmcfm()) < 0) return(y);
  864. /* Clear device input buffer if requested */
  865. y = (x & CLR_DEV) ? ttflui() : 0;
  866. if (x & CLR_SCR) /* CLEAR SCREEN */
  867.   y = ck_cls(); /* (= SCREEN CLEAR = CLS) */
  868. #ifndef NOSPL
  869. /* Clear INPUT command buffer if requested */
  870. if (x & CLR_INP) {
  871.     for (z = 0; z < inbufsize; z++)
  872.       inpbuf[z] = NUL;
  873.     inpbp = inpbuf;
  874.     y = 0;
  875. }
  876. #ifdef CK_APC
  877. if (x & CLR_APC) {
  878.     debug(F101,"Executing CLEAR APC","",apcactive);
  879.     apcactive = 0;
  880.     y = 0;
  881. }
  882. #endif /* CK_APC */
  883. if (x & CLR_ALR) {
  884.     setalarm(0L);
  885.     y = 0;
  886. }
  887. #endif /* NOSPL */
  888. #ifdef PATTERNS
  889. if (x & CLR_TXT|CLR_BIN) {
  890.     int i;
  891.     for (i = 0; i < FTPATTERNS; i++) {
  892. if (x & CLR_TXT)
  893.   makestr(&txtpatterns[i],NULL);
  894. if (x & CLR_BIN)
  895.   makestr(&binpatterns[i],NULL);
  896.     }
  897.     y = 0;
  898. }
  899. #endif /* PATTERNS */
  900. #ifndef NODIAL
  901. if (x & CLR_DIA) {
  902.     dialsta = DIA_UNK;
  903.     y = 0;
  904. }
  905. #endif /* NODIAL */
  906. #ifndef NOMSEND
  907. if (x & CLR_SFL) { /* CLEAR SEND-LIST */
  908.     if (filehead) {
  909. struct filelist * flp, * next;
  910. flp = filehead;
  911. while (flp) {
  912.     if (flp->fl_name)
  913.       free(flp->fl_name);
  914.     if (flp->fl_alias)
  915.       free(flp->fl_alias);
  916.     next = flp->fl_next;
  917.     free(flp);
  918.     flp = next;
  919. }
  920.     }
  921.     filesinlist = 0;
  922.     filehead = NULL;
  923.     filetail = NULL;
  924.     y = 0;
  925. }
  926. #endif /* NOMSEND */
  927. #ifdef OS2
  928. switch (x) {
  929.   case CLR_SCL:
  930.     clearscrollback(VTERM);
  931.     break;
  932.   case CLR_CMD:
  933.     switch ( z ) {
  934.       case CLR_C_ALL:
  935. clear();
  936. break;
  937.       case CLR_C_BOS:
  938. clrboscr_escape(VCMD,SP);
  939. break;
  940.       case CLR_C_BOL:
  941. clrbol_escape(VCMD,SP);
  942. break;
  943.       case CLR_C_EOL:
  944. clrtoeoln(VCMD,SP);
  945. break;
  946.       case CLR_C_EOS:
  947. clreoscr_escape(VCMD,SP);
  948. break;
  949.       case CLR_C_LIN:
  950. clrline_escape(VCMD,SP);
  951. break;
  952.       case CLR_C_SCR:
  953. clearscrollback(VCMD);
  954. break;
  955.             default:
  956. printf("Not implemented yet, sorry.n");
  957. break;
  958.     }
  959.     break;
  960.   case CLR_TRM:
  961.              switch ( z ) {
  962.       case CLR_C_ALL:
  963.                  if (VscrnGetBufferSize(VTERM) > 0 ) {
  964.                      VscrnScroll(VTERM, UPWARD, 0,
  965.  VscrnGetHeight(VTERM)-(tt_status?2:1),
  966.  VscrnGetHeight(VTERM) -
  967.  (tt_status?1:0), TRUE, SP
  968.  );
  969.                      cleartermscreen(VTERM);
  970.                  }
  971.                  break;
  972.       case CLR_C_BOS:
  973. clrboscr_escape(VTERM,SP);
  974. break;
  975.       case CLR_C_BOL:
  976. clrbol_escape(VTERM,SP);
  977. break;
  978.       case CLR_C_EOL:
  979. clrtoeoln(VTERM,SP);
  980. break;
  981.       case CLR_C_EOS:
  982. clreoscr_escape(VTERM,SP);
  983. break;
  984.       case CLR_C_LIN:
  985. clrline_escape(VTERM,SP);
  986. break;
  987.              case CLR_C_SCR:
  988.                  clearscrollback(VTERM);
  989.                  break;
  990.              default:
  991.                  printf("Not implemented yet, sorry.n");
  992.                  break;
  993.     }
  994.     break;
  995. }
  996. y = 0;
  997. #endif /* OS2 */
  998. return(success = (y == 0));
  999.     }
  1000. #endif /* NOFRILLS */
  1001.     if (cx == XXCOM) { /* COMMENT */
  1002. if ((x = cmtxt("Text of comment line","",&s,NULL)) < 0)
  1003.   return(x);
  1004. /* Don't change SUCCESS flag for this one */
  1005. return(0);
  1006.     }
  1007. #ifndef NOLOCAL
  1008.     if (cx == XXCON || cx == XXCQ) /* CONNECT or CONNECT /QUIETLY */
  1009.       return(doxconn(cx));
  1010. #endif /* NOLOCAL */
  1011. #ifndef NOFRILLS
  1012. #ifdef ZCOPY
  1013.     if (cx == XXCPY) { /* COPY a file */
  1014. #ifdef IKSD
  1015. if (inserver && !ENABLED(en_cpy)) {
  1016.     printf("?Sorry, COPY is disabledn");
  1017.     return(-9);
  1018. }
  1019. #endif /* IKSD */
  1020. #ifdef CK_APC
  1021. if (apcactive == APC_LOCAL ||
  1022.     (apcactive == APC_REMOTE && apcstatus != APC_UNCH)
  1023.     )
  1024.   return(success = 0);
  1025. #endif /* CK_APC */
  1026. return(docopy());
  1027.     }
  1028. #endif /* ZCOPY */
  1029. #endif /* NOFRILLS */
  1030.     if (cx == XXCWD || cx == XXBACK) { /* CD or BACK */
  1031. #ifdef IKSD
  1032. if (inserver && !ENABLED(en_cwd)) {
  1033.     printf("?Sorry, changing directories is disabledn");
  1034.     return(-9);
  1035. }
  1036. #endif /* IKSD */
  1037. return(success = docd(cx));
  1038.     }
  1039.     if (cx == XXCHK) /* CHECK */
  1040.       return(success = dochk());
  1041.     if (cx == XXCLO) { /* CLOSE */
  1042. x = cmkey(clstab,ncls,""CONNECTION", or log or file to close",
  1043.   "connection",xxstring);
  1044. if (x == -3) {
  1045.     printf("?You must say which file or logn");
  1046.     return(-9);
  1047. }
  1048. if (x < 0) return(x);
  1049. if ((y = cmcfm()) < 0) return(y);
  1050. #ifndef NOLOCAL
  1051. if (x == 9999) { /* CLOSE CONNECTION */
  1052.     x = clsconnx(0);
  1053.     switch (x) {
  1054.       case 0:
  1055. if (msgflg) printf("?Connection was not openn");
  1056.       case -1:
  1057. return(0);
  1058.       case 1:
  1059. whyclosed = WC_CLOS;
  1060. return(1);
  1061.     }
  1062.     return(0);
  1063. }
  1064. #endif /* NOLOCAL */
  1065. y = doclslog(x);
  1066. success = (y == 1);
  1067. return(success);
  1068.     }
  1069. #ifndef NOSPL
  1070.     if (cx == XX_INCR || cx == XXINC  || /* _INCREMENT, INCREMENT */
  1071. cx == XX_DECR || cx == XXDEC)  /* _DECREMENT, DECREMENT */
  1072.       return(doincr(cx));
  1073.     if (cx == XXEVAL || cx == XX_EVAL) { /* _EVALUATE,  EVALUATE  */
  1074. char *p;
  1075. char vnambuf[VNAML], * vnp = NULL; /* These must be on the stack */
  1076. if (!oldeval) {
  1077.     if ((y = cmfld("Variable name","",&s,
  1078.    ((cx == XX_EVAL) ? xxstring : NULL))) < 0) {
  1079. if (y == -3) {
  1080.     printf("?Variable name requiredn");
  1081.     return(-9);
  1082. } else return(y);
  1083.     }
  1084.     ckstrncpy(vnambuf,s,VNAML); /* Make a copy. */
  1085.     vnp = vnambuf;
  1086.     if (vnambuf[0] == CMDQ &&
  1087. (vnambuf[1] == '%' || vnambuf[1] == '&'))
  1088.       vnp++;
  1089.     y = 0;
  1090.     if (*vnp == '%' || *vnp == '&') {
  1091. if ((y = parsevar(vnp,&x,&z)) < 0)
  1092.   return(y);
  1093.     }
  1094. }
  1095. if ((x = cmtxt("Integer arithmetic expression","",&s,xxstring)) < 0)
  1096.   return(x);
  1097. p = evala(s);
  1098. if (!p) p = "";
  1099. if (oldeval && *p)
  1100.   printf("%sn", p);
  1101. ckstrncpy(evalbuf,p,32);
  1102. if (!oldeval)
  1103.   return(success = addmac(vnambuf,p));
  1104. else
  1105.   return(success = *p ? 1 : 0);
  1106.     }
  1107. #endif /* NOSPL */
  1108. #ifndef NOSPL
  1109.     if (cx == XXDEF || cx == XXASS ||
  1110. cx == XXDFX || cx == XXASX || cx == XXUNDEF) {
  1111. #ifdef IKSD
  1112. if (inserver && !ENABLED(en_asg)) {
  1113.     printf("?Sorry, DEFINE/ASSIGN disabledn");
  1114.     return(-9);
  1115. }
  1116. #endif /* IKSD */
  1117. if (atmbuf[0] == '.' && !atmbuf[1]) /* "." entered as keyword */
  1118.   xxdot = 1; /* i.e. with space after it... */
  1119. return(dodef(cx)); /* DEFINE, ASSIGN, etc... */
  1120.     }
  1121. #endif /* NOSPL */
  1122. #ifndef NOSPL
  1123.     if (cx == XXDCL) { /* DECLARE an array */
  1124. return(dodcl());
  1125.     }
  1126. #endif /* NOSPL */
  1127. #ifndef NODIAL
  1128.     if (cx == XXRED  || cx == XXDIAL || cx == XXPDIA ||
  1129. cx == XXANSW || cx == XXLOOK) { /* DIAL, REDIAL etc */
  1130. #ifdef VMS
  1131. extern int batch;
  1132. #else
  1133. #ifdef UNIXOROSK
  1134. extern int backgrd;
  1135. #endif /* UNIXOROSK */
  1136. #endif /* VMS */
  1137. x = dodial(cx);
  1138. debug(F101,"dodial returns","",x);
  1139. if ((cx == XXDIAL || cx == XXRED || cx == XXANSW) &&
  1140.     (x > 0) && /* If DIAL or REDIAL succeeded */
  1141.     (dialsta != DIA_PART) && /* and it wasn't partial */
  1142.     (dialcon > 0)) {
  1143.     if ((dialcon == 1 || /* And DIAL CONNECT is ON, */
  1144. (dialcon == 2) && /* or DIAL CONNECT is AUTO */
  1145.  !cmdsrc() /* and we're at top level... */
  1146. #ifdef VMS
  1147.  && !batch /* Not if running from batch */
  1148. #else
  1149. #ifdef UNIXOROSK
  1150.  && !backgrd /* Not if running in background */
  1151. #endif /* UNIXOROSK */
  1152. #endif /* VMS */
  1153.  )) /* Or AUTO */
  1154.       x = doconect(dialcq); /* Then also CONNECT */
  1155. #ifdef CKLOGDIAL
  1156.     if (ttchk() < 0)
  1157.       dologend();
  1158. #endif /* CKLOGDIAL */
  1159. }
  1160. return(success = x);
  1161.     }
  1162. #endif /* NODIAL */
  1163. #ifndef NOPUSH
  1164. #ifdef CK_REXX
  1165.     if (cx == XXREXX) { /* REXX */
  1166.         extern int nopush;
  1167.         if ( nopush )
  1168.           return(success=0);
  1169.         return(dorexx());
  1170.     }
  1171. #endif /* CK_REXX */
  1172. #endif /* NOPUSH */
  1173. #ifndef NOFRILLS
  1174.     if (cx == XXDEL) { /* DELETE */
  1175. #ifdef IKSD
  1176. if (inserver && (!ENABLED(en_del)
  1177. #ifdef CK_LOGIN
  1178.  || isguest
  1179. #endif /* CK_LOGIN */
  1180.  )) {
  1181.     printf("?Sorry, DELETE is disabledn");
  1182.     return(-9);
  1183. }
  1184. #endif /* IKSD */
  1185. #ifdef CK_APC
  1186. if (apcactive == APC_LOCAL ||
  1187.         apcactive == APC_REMOTE && apcstatus != APC_UNCH) return(success = 0);
  1188. #endif /* CK_APC */
  1189. return(dodel());
  1190.     }
  1191. #endif /* NOFRILLS */
  1192.     if (cx == XXDIR || cx == XXLS) { /* DIRECTORY or LS */
  1193. #ifdef IKSD
  1194. if (inserver && !ENABLED(en_dir)) {
  1195.     printf("?Sorry, DIRECTORY is disabledn");
  1196.     return(-9);
  1197. }
  1198. #endif /* IKSD */
  1199. return(dodir(cx));
  1200.     }
  1201. #ifndef NOSPL
  1202.     if (cx == XXELS) /* ELSE */
  1203.       return(doelse());
  1204. #endif /* NOSPL */
  1205. #ifndef NOSERVER
  1206. #ifndef NOFRILLS
  1207.     if (cx == XXENA || cx == XXDIS) { /* ENABLE, DISABLE */
  1208. s = (cx == XXENA) ?
  1209.   "Server function to enable" :
  1210.     "Server function to disable";
  1211. if ((x = cmkey(enatab,nena,s,"",xxstring)) < 0) {
  1212.     if (x == -3) {
  1213. printf("?Name of server function requiredn");
  1214. return(-9);
  1215.     } else return(x);
  1216. }
  1217. if ((y = cmkey(kmstab,3,"mode","both",xxstring)) < 0) {
  1218.     if (y == -3) {
  1219. printf("?Please specify remote, local, or bothn");
  1220. return(-9);
  1221.     } else return(y);
  1222. }
  1223. if (cx == XXDIS) /* Disabling, not enabling */
  1224.   y = 3 - y;
  1225. if ((z = cmcfm()) < 0) return(z);
  1226. #ifdef CK_APC
  1227. if (apcactive == APC_LOCAL ||
  1228.         apcactive == APC_REMOTE && apcstatus != APC_UNCH)
  1229.   return(success = 0);
  1230. #endif /* CK_APC */
  1231. #ifdef IKSD
  1232.         /* This may seem like it duplicates the work in doenable()  */
  1233.         /* but this code returns failure whereas doenable() returns */
  1234.         /* success.                                                 */
  1235.         if (inserver &&
  1236.             (x == EN_HOS || x == EN_PRI || x == EN_MAI || x == EN_WHO))
  1237.             return(success = 0);
  1238. #endif /* IKSD */
  1239. return(doenable(y,x));
  1240.     }
  1241. #endif /* NOFRILLS */
  1242. #endif /* NOSERVER */
  1243. #ifndef NOSPL
  1244.     if (cx == XXRET) { /* RETURN */
  1245. if ((x = cmtxt("optional return value","",&s,NULL)) < 0)
  1246.   return(x);
  1247. s = brstrip(s); /* Strip braces */
  1248. if (cmdlvl == 0) { /* At top level, nothing happens... */
  1249.     return(success = 1);
  1250. } else if (cmdstk[cmdlvl].src == CMD_TF) { /* In TAKE file, like POP */
  1251.     popclvl(); /* pop command level */
  1252.     return(success = 1); /* always succeeds */
  1253. } else if (cmdstk[cmdlvl].src == CMD_MD) { /* Within macro */
  1254.     return(doreturn(s)); /* Trailing text is return value. */
  1255. } else return(-2);
  1256.     }
  1257. #endif /* NOSPL */
  1258. #ifndef NOSPL
  1259.     if (cx == XXDO || cx == XXMACRO) { /* DO (a macro) */
  1260. char mnamebuf[16];
  1261. struct FDB kw, fl;
  1262. if (cx == XXDO) {
  1263.     if (nmac == 0) {
  1264. printf("n?No macros definedn");
  1265. return(-9);
  1266.     }
  1267.     for (y = 0; y < nmac; y++) { /* copy the macro table into a */
  1268. mackey[y].kwd = mactab[y].kwd; /* regular keyword table */
  1269. mackey[y].kwval = y; /* with value = pointer to macro tbl */
  1270. mackey[y].flgs = mactab[y].flgs;
  1271.     }
  1272.     cmfdbi(&kw, /* First FDB - command switches */
  1273.    _CMKEY, /* fcode */
  1274.    "Macro", /* hlpmsg */
  1275.    "", /* default */
  1276.    "", /* addtl string data */
  1277.    nmac, /* addtl numeric data 1: tbl size */
  1278.    0, /* addtl numeric data 2: 0 = cmkey */
  1279.    xxstring, /* Processing function */
  1280.    mackey, /* Keyword table */
  1281.    &fl /* Pointer to next FDB */
  1282.    );
  1283.     cmfdbi(&fl, /* 2nd FDB - for "{" */
  1284.    _CMFLD, /* fcode */
  1285.    "", /* hlpmsg */
  1286.    "",
  1287.    "", /* addtl string data */
  1288.    0, /* addtl numeric data 1 */
  1289.    0, /* addtl numeric data 2 */
  1290.    xxstring,
  1291.    NULL,
  1292.    NULL
  1293.    );
  1294.     x = cmfdb(&kw); /* Parse something */
  1295.     if (x < 0) { /* Error */
  1296. if (x == -3) {
  1297.     printf("?Macro name requiredn");
  1298.     return(-9);
  1299. } else
  1300.   return(x);
  1301.     }
  1302.     if (cmresult.fcode == _CMKEY) {
  1303. if ((y = cmtxt("optional arguments","",&s,xxstring)) < 0)
  1304.   return(y); /* get args */
  1305. return(dodo(x,s,cmdstk[cmdlvl].ccflgs) < 1 ?
  1306.        (success = 0) : 1);
  1307.     }
  1308.     ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* _CMFLD */
  1309.     if (atmbuf[0] == '{') {
  1310. if ((y = cmcfm()) < 0)
  1311.   return(y);
  1312.     }
  1313. } else { /* XXMACRO */
  1314.     int k = 0;
  1315.     line[k++] = '{';
  1316.     line[k++] = SP;
  1317.     if ((y = cmtxt("braced list of commands","",&s,xxstring)) < 0)
  1318.       return(y);
  1319.     ckstrncpy(line+k,s,LINBUFSIZ);
  1320. }
  1321. x = strlen(line);
  1322. if (line[0] != '{' && line[x-1] != '}') {
  1323.             if (x > 0)
  1324.       printf("?Not a command or macro name: "%s"n",line);
  1325.             else
  1326.       printf("?Not a command or macro name.n");
  1327.     return(-9);
  1328. }
  1329. s = brstrip(line);
  1330. sprintf(mnamebuf," ..tmp:%03d",cmdlvl);
  1331. x = addmac(mnamebuf,s);
  1332. return(dodo(x,NULL,cmdstk[cmdlvl].ccflgs) < 1 ?
  1333.        (success = 0) : 1);
  1334.     }
  1335. #endif /* NOSPL */
  1336.     if (cx == XXECH || cx == XXXECH
  1337. #ifndef NOSPL
  1338. || cx == XXAPC
  1339. #endif /* NOSPL */
  1340. ) { /* ECHO or APC */
  1341. if ((x = cmtxt((cx == XXECH || cx == XXXECH) ?
  1342.        "Text to be echoed" :
  1343.        "Application Program Command text",
  1344.        "",&s,xxstring)) < 0)
  1345.   return(x);
  1346. s = brstrip(s); /* Strip braces */
  1347. if (cx == XXECH) { /* ECHO */
  1348. #ifndef NOSPL
  1349.     if (!fndiags || fnsuccess)
  1350. #endif /* NOSPL */
  1351.       printf("%sn",s);
  1352. } else if (cx == XXXECH) { /* XECHO */
  1353.     printf("%s",s);
  1354. #ifdef UNIX
  1355.     fflush(stdout);
  1356. #endif /* UNIX */
  1357. } else { /* APC */
  1358. #ifdef CK_APC
  1359.     if (apcactive == APC_LOCAL ||
  1360.             apcactive == APC_REMOTE && apcstatus != APC_UNCH)
  1361.       return(success = 0);
  1362. #endif /* CK_APC */
  1363.     if (!local) {
  1364. printf("%c_%s%c\",ESC,s,ESC);
  1365. #ifdef UNIX
  1366. fflush(stdout);
  1367. #endif /* UNIX */
  1368.     } else {
  1369. #ifndef NOSPL
  1370. sprintf(tmpbuf,"%c_%s%c\",ESC,s,ESC);
  1371. return(success = dooutput(tmpbuf, XXOUT));
  1372. #else
  1373. printf("%c_%s%c\",ESC,s,ESC);
  1374. #endif /* NOSPL */
  1375.     }
  1376. }
  1377. return(success = 1); /* Always succeeds */
  1378.     }
  1379. #ifndef NOSPL
  1380.     if (cx == XXOPE) /* OPEN */
  1381.       return(doopen());
  1382. #endif /* NOSPL */
  1383. #ifndef NOSPL
  1384.     if (cx == XXOUT || cx == XXLNOUT) { /* OUTPUT or LINEOUT */
  1385. if ((x = cmtxt("Text to be output","",&s,NULL)) < 0)
  1386.   return(x);
  1387. #ifdef CK_APC
  1388. if (apcactive == APC_LOCAL ||
  1389.         apcactive == APC_REMOTE && apcstatus != APC_UNCH)
  1390.   return(success = 0);
  1391. #endif /* CK_APC */
  1392. debug(F110,"OUTPUT 1",s,0);
  1393. s = brstrip(s); /* Strip enclosing braces, */
  1394. debug(F110,"OUTPUT 2",s,0);
  1395. /*
  1396.   I don't think I could ever fully explain this in a million years...
  1397.   We have read the user's string without calling the variable-expander
  1398.   function.  Now, before we call it, we have to double backslashes that
  1399.   appear before N, B, L, and  itself, so the expander function will
  1400.   reduce them back to single backslashes, so when we call dooutput()...
  1401.   But it's more complicated than that.
  1402. */
  1403. if (cmdgquo()) { /* Only if COMMAND QUOTING ON ... */
  1404.     for (x = 0, y = 0; s[x]; x++, y++) {
  1405. if (s[x] == CMDQ) {
  1406.     char c = s[x+1];
  1407.     if (c == 'n' || c == 'N' ||
  1408. c == 'b' || c == 'B' ||
  1409. c == 'l' || c == 'L' ||
  1410. c == CMDQ)
  1411.       line[y++] = CMDQ;
  1412. }
  1413. line[y] = s[x];
  1414.     }
  1415.     line[y++] = ''; /* Now expand variables, etc. */
  1416.     debug(F110,"OUTPUT 3",line,0);
  1417.     s = line+y+1;
  1418.     x = LINBUFSIZ - (int) strlen(line) - 1;
  1419.     debug(F101,"OUTPUT size","",x);
  1420.     if (zzstring(line,&s,&x) < 0)
  1421.       return(success = 0);
  1422.     s = line+y+1;
  1423.     debug(F110,"OUTPUT 4",s,0);
  1424. }
  1425. success = dooutput(s,cx);
  1426. return(success);
  1427.     }
  1428. #endif /* NOSPL */
  1429. #ifdef ANYX25
  1430. #ifndef IBMX25
  1431.     if (cx == XXPAD) { /* PAD commands */
  1432. x = cmkey(padtab,npadc,"PAD command","",xxstring);
  1433. if (x == -3) {
  1434.     printf("?You must specify a PAD command to executen");
  1435.     return(-9);
  1436. }
  1437. if (x < 0) return(x);
  1438. switch (x) {
  1439.   case XYPADL:
  1440.     if (x25stat() < 0)
  1441.       printf("Sorry, you must 'set network' & 'set host' firstrn");
  1442.     else {
  1443. x25clear();
  1444. initpad();
  1445.     }
  1446.     break;
  1447.   case XYPADS:
  1448.     if (x25stat() < 0)
  1449.       printf("Not connectedrn");
  1450.     else {
  1451. extern int linkid, lcn;
  1452. conol("Connected thru ");
  1453. conol(ttname);
  1454. printf(", Link id %d, Logical channel number %drn",
  1455.        linkid,lcn);
  1456.     }
  1457.     break;
  1458.   case XYPADR:
  1459.     if (x25stat() < 0)
  1460.       printf("Sorry, you must 'set network' & 'set host' firstrn");
  1461.     else
  1462.       x25reset(0,0);
  1463.     break;
  1464.   case XYPADI:
  1465.     if (x25stat() < 0)
  1466.       printf("Sorry, you must 'set network' & 'set host' firstrn");
  1467.     else
  1468.       x25intr(0);
  1469. }
  1470. return(0);
  1471.     }
  1472. #endif /* IBMX25 */
  1473. #endif /* ANYX25 */
  1474. #ifndef NOSPL
  1475.     if (cx == XXPAU || cx == XXWAI || cx == XXMSL) /* PAUSE, WAIT, etc */
  1476.       return(dopaus(cx));
  1477. #endif /* NOSPL */
  1478. #ifndef NOFRILLS
  1479.     if (cx == XXPRI) {
  1480. #ifdef IKSD
  1481. #ifdef CK_LOGIN
  1482. if (inserver && (isguest || !ENABLED(en_pri))) {
  1483.     printf("?Sorry, printing is disabledn");
  1484.     return(-9);
  1485. }
  1486. #endif /* CK_LOGIN */
  1487. #endif /* IKSD */
  1488. if ((x = cmifi("File to print","",&s,&y,xxstring)) < 0) {
  1489.     if (x == -3) {
  1490. printf("?A file specification is requiredn");
  1491. return(-9);
  1492.     } else return(x);
  1493. }
  1494. if (y != 0) {
  1495.     printf("?Wildcards not allowedn");
  1496.     return(-9);
  1497. }
  1498. ckstrncpy(line,s,LINBUFSIZ);
  1499. s = "";
  1500. #ifndef NT
  1501. if ((x = cmtxt("Local print command options, or carriage return","",&s,
  1502.        xxstring)) < 0)
  1503.   return(x);
  1504. #endif /* NT */
  1505. if ((x = cmcfm()) < 0)
  1506.   return(x);
  1507. return(success = (zprint(s,line) == 0) ? 1 : 0);
  1508.     }
  1509. #endif /* NOFRILLS */
  1510. #ifndef NOPUSH
  1511. #ifdef TCPSOCKET
  1512.     if (cx == XXPNG)  /* PING an IP host */
  1513.       return(doping());
  1514.     if (cx == XXFTP) /* FTP an IP host */
  1515.       return(doftp());
  1516. #endif /* TCPSOCKET */
  1517. #endif /* NOPUSH */
  1518.     if (cx == XXPWD) { /* PWD */
  1519. char *pwp;
  1520. if ((x = cmcfm()) < 0)
  1521.   return(x);
  1522. #ifndef MAC
  1523. #ifndef OS2
  1524. #ifdef UNIX
  1525. printf("%sn",zgtdir());
  1526. #else
  1527. xsystem(PWDCMD);
  1528. #endif /* UNIX */
  1529. return(success = 1); /* Blind faith */
  1530. #else  /* OS2 */
  1531. if (pwp = zgtdir()) {
  1532.     printf("%sn",pwp);
  1533.     return(success = ((int)strlen(pwp) > 0));
  1534. } else return(success = 0);
  1535. #endif /* OS2 */
  1536. #else  /* MAC */
  1537. if (pwp = zgtdir()) {
  1538.     printf("%sn",pwp);
  1539.     return(success = ((int)strlen(pwp) > 0));
  1540. } else return(success = 0);
  1541. #endif /* MAC */
  1542.     }
  1543.     if (cx == XXQUI || cx == XXEXI) { /* EXIT, QUIT */
  1544. if ((y = cmnum("exit status code","",10,&x,xxstring)) < 0) {
  1545.     if (y == -3)
  1546.       x = xitsta;
  1547.     else return(y);
  1548. }
  1549. if ((y = cmtxt("Optional EXIT message","",&s,xxstring)) < 0)
  1550.   return(y);
  1551. s = brstrip(s);
  1552. ckstrncpy(line,s,LINBUFSIZ);
  1553. if ((y = cmcfm()) < 0) return(y);
  1554. if (!hupok(0)) /* Check if connection still open */
  1555.   return(success = 0);
  1556. if (line[0]) /* Print EXIT message if given */
  1557.   printf("%sn",(char *)line);
  1558. #ifdef VMS
  1559. doexit(GOOD_EXIT,x);
  1560. #else
  1561. #ifdef OSK
  1562. /* Returning any codes here makes the OS-9 shell print an error message. */
  1563. doexit(GOOD_EXIT,-1);
  1564. #else
  1565. #ifdef datageneral
  1566.         doexit(GOOD_EXIT,x);
  1567. #else
  1568. doexit(x,-1);
  1569. #endif /* datageneral */
  1570. #endif /* OSK */
  1571. #endif /* VMS */
  1572.     }
  1573. #ifndef NOXFER
  1574. #ifndef NOFRILLS
  1575.     if (cx == XXERR) { /* ERROR */
  1576. #ifdef CK_XYZ
  1577. if (protocol != PROTO_K) {
  1578.     printf("Sorry, E-PACKET only works with Kermit protocoln");
  1579.     return(-9);
  1580. }
  1581. #endif /* CK_XYZ */
  1582. if ((x = cmcfm()) < 0) return(x);
  1583. ttflui();
  1584. epktflg = 1;
  1585. sstate = 'a';
  1586. return(0);
  1587.     }
  1588. #endif /* NOFRILLS */
  1589.     if (cx == XXFIN) { /* FINISH */
  1590. #ifdef CK_XYZ
  1591. if (protocol != PROTO_K) {
  1592.     printf("Sorry, FINISH only works with Kermit protocoln");
  1593.     return(-9);
  1594. }
  1595. #endif /* CK_XYZ */
  1596. if ((x = cmcfm()) < 0) return(x);
  1597. #ifdef IKS_OPTION
  1598.         if (!iks_wait(KERMIT_REQ_START,1)) {
  1599.     printf(
  1600.               "?A Kermit Server is unavailable to process this commandn");
  1601.     return(-9); /* Correct the return code */
  1602.         }
  1603. #endif /* IKS_OPTION */
  1604. sstate = setgen('F',"","","");
  1605. if (local) ttflui(); /* If local, flush tty input buffer */
  1606. return(0);
  1607.     }
  1608. #endif /* NOXFER */
  1609. #ifndef NOSPL
  1610.     if (cx == XXFOR) /* FOR loop */
  1611.       return(dofor());
  1612. #endif /* NOSPL */
  1613. #ifndef NOXFER
  1614.     /* GET MGET REGET RETRIEVE etc */
  1615.     if (cx == XXGET || cx == XXMGET || cx == XXREGET || cx == XXRETR) {
  1616. #ifdef IKSD
  1617. if (inserver && !ENABLED(en_sen)) {
  1618.     printf("?Sorry, reception of files is disabledn");
  1619.     return(-9);
  1620. }
  1621. #endif /* IKSD */
  1622. return(doxget(cx));
  1623.     }
  1624. #endif /* NOXFER */
  1625. #ifndef NOSPL
  1626. #ifndef NOFRILLS
  1627.     if (cx == XXGOK) { /* GETOK */
  1628. return(success = doask(cx));
  1629.     }
  1630. #endif /* NOFRILLS */
  1631. #endif /* NOSPL */
  1632.     if (cx == XXHLP) { /* HELP */
  1633. #ifdef NOHELP
  1634. return(dohlp(XXHLP));
  1635. #else
  1636. x = cmkey2(cmdtab,ncmd,"C-Kermit command","help",toktab,xxstring,3);
  1637. debug(F101,"HELP command x","",x);
  1638. if (x == -5) {
  1639.     y = chktok(toktab);
  1640.     debug(F101,"top-level cmkey token","",y);
  1641.     ungword();
  1642.     switch (y) {
  1643. #ifndef NOPUSH
  1644.       case '!': x = XXSHE; break;
  1645. #endif /* NOPUSH */
  1646.       case '#': x = XXCOM; break;
  1647.       case ';': x = XXCOM; break;
  1648. #ifndef NOSPL
  1649.               case '.': x = XXDEF; break;
  1650.       case ':': x = XXLBL; break;
  1651. #endif /* NOSPL */
  1652.       case '&': x = XXECH; break;
  1653.       default:
  1654. printf("n?Invalid - %sn",cmdbuf);
  1655. x = -2;
  1656.     }
  1657. }
  1658. return(dohlp(x));
  1659. #endif /* NOHELP */
  1660.     }
  1661. #ifndef NOHELP
  1662.     if (cx == XXINT) /* INTRO */
  1663.       return(hmsga(introtxt));
  1664.     if (cx == XXNEW) { /* NEWS */
  1665. int x;
  1666. extern char * k_info_dir;
  1667. x = hmsga(newstxt);
  1668. if (k_info_dir) {
  1669.     printf("The ckermit2.txt file can be found in %s.n",
  1670.    k_info_dir
  1671.    );
  1672. }
  1673. #ifdef UNIX
  1674. printf(
  1675. "Type "man kermit" at the shell prompt to view the Kermit man page.nn"
  1676.        );
  1677. #else
  1678. #ifdef VMS
  1679. printf(
  1680. "Type "help kermit" at the DCL prompt to view the Kermit help topic.nn"
  1681.        );
  1682. #endif /* VMS */
  1683. #endif /* UNIX */
  1684. return(x);
  1685.     }
  1686. #ifdef OS2ONLY
  1687.     if (cx == XXUPD) { /* View UPDATE file */
  1688.         extern char exedir[];
  1689.         char * pTopic;
  1690.         char updstr[2048];
  1691.         if ((x = cmtxt("topic name","",&pTopic,xxstring)) < 0)
  1692.             return x;
  1693. sprintf(updstr,
  1694. "start view %s\docs\k2.inf+%s\docs\using_ck.inf+
  1695. %s\docs\dialing.inf+%s\docs\modems.inf %s",
  1696. exedir,exedir,exedir,exedir,pTopic
  1697. );
  1698.         system(updstr);
  1699.         return(success = 1);
  1700.     }
  1701. #endif /* OS2ONLY */
  1702. #endif /* NOHELP */
  1703. #ifndef NOLOCAL
  1704.     if (cx == XXHAN) { /* HANGUP */
  1705. if ((x = cmcfm()) < 0) return(x);
  1706. #ifndef NODIAL
  1707. if ((x = mdmhup()) < 1)
  1708. #endif /* NODIAL */
  1709.   x = (tthang() > -1);
  1710. #ifndef NODIAL
  1711. dialsta = DIA_UNK;
  1712. #endif /* NODIAL */
  1713. whyclosed = WC_CLOS;
  1714. ttchk(); /* In case of CLOSE-ON-DISCONNECT */
  1715. #ifdef CKLOGDIAL
  1716. dologend();
  1717. #endif /* CKLOGDIAL */
  1718. #ifdef OS2
  1719. if (x)
  1720.   DialerSend(OPT_KERMIT_HANGUP, 0);
  1721. #endif /* OS2 */
  1722. if (x) haveline = 0;
  1723. return(success = x);
  1724.     }
  1725. #endif /* NOLOCAL */
  1726. #ifndef NOSPL
  1727.     if (cx == XXGOTO || cx == XXFWD || cx == XXXFWD) { /* GOTO or FORWARD */
  1728. /* Note, here we don't set SUCCESS/FAILURE flag */
  1729. if ((y = cmfld("label","",&s,xxstring)) < 0) {
  1730.     if (y == -3) {
  1731. printf("?Label name requiredn");
  1732. return(-9);
  1733.     } else return(y);
  1734. }
  1735. ckstrncpy(lblbuf,s,LBLSIZ);
  1736. if ((x = cmcfm()) < 0) return(x);
  1737. s = lblbuf;
  1738. return(dogoto(s,cx));
  1739.     }
  1740. #endif /* NOSPL */
  1741. #ifndef NOSPL
  1742. /* IF, Extended IF, WHILE */
  1743.     if (cx == XXIF || cx == XXIFX || cx == XXWHI || cx == XXASSER) {
  1744. return(doif(cx));
  1745.     }
  1746.     if (cx == XXSWIT) {
  1747. return(doswitch());
  1748.     }
  1749. #endif /* NOSPL */
  1750. #ifndef NOSPL
  1751.     /* INPUT, REINPUT, and MINPUT */
  1752.     if (cx == XXINP || cx == XXREI
  1753. #ifdef CK_MINPUT
  1754. || cx == XXMINP
  1755. #endif /* CK_MINPUT */
  1756. ) {
  1757. long zz;
  1758. extern int x_ifnum, ispattern;
  1759. zz = -1L;
  1760. x_ifnum = 1; /* Turn off internal complaints */
  1761. y = cmnum("Seconds to wait for input,n or time of day hh:mm:ss",
  1762.   ckitoa(indef), 10, &x, xxstring
  1763.   );
  1764. x_ifnum = 0;
  1765. if (y < 0) {
  1766.     if (y == -2) { /* Invalid number or expression */
  1767. zz = tod2sec(atmbuf); /* Convert to secs since midnight */
  1768. if (zz < 0L) {
  1769.     printf("?Number, expression, or time of day requiredn");
  1770.     return(-9);
  1771. } else {
  1772.     char now[32]; /* Current time */
  1773.     char *p;
  1774.     long tnow;
  1775.     p = now;
  1776.     ztime(&p);
  1777.     tnow = atol(p+11) * 3600L + atol(p+14) * 60L + atol(p+17);
  1778.     if (zz < tnow) /* User's time before now */
  1779.       zz += 86400L; /* So make it tomorrow */
  1780.     zz -= tnow; /* Seconds from now. */
  1781. }
  1782.     } else
  1783.       return(y);
  1784. }
  1785. if (zz > -1L) {
  1786.     x = zz;
  1787.     if (zz != (long) x) {
  1788. printf(
  1789. "Sorry, arithmetic overflow - hh:mm:ss not usable on this platform.n"
  1790.        );
  1791. return(-9);
  1792.     }
  1793. }
  1794. #ifdef CK_MINPUT
  1795. for (y = 0; y < MINPMAX; y++) { /* Initialize strings */
  1796.     mp[y] = 0; /* Assume it's not a pattern */
  1797.     if (ms[y]) {
  1798. free(ms[y]); /* Free old strings, if any */
  1799. ms[y] = NULL;
  1800.     }
  1801. }
  1802. if (cx == XXMINP) { /* MINPUT */
  1803.     int rc = 0, cfm = 1;
  1804.     for (y = 0; y < MINPMAX; y++) { /* Parse up to MINPMAX strings */
  1805.                 rc = cmfld("List of input strings","",&s,xxstring);
  1806. debug(F111,"MINPUT cmfld returns",s,rc);
  1807.                 if (rc < 0) return(rc);
  1808.                 if (*s == '{') {
  1809.     char *ss;
  1810.     int n;
  1811.     ss = s; n = 0;
  1812.     while (*ss) {*ss = *(ss+1); ss++; n++; }
  1813.     while (--n > 0) if (s[n] == '}') break;
  1814.     if (n > 0) {
  1815. ss = s + n;
  1816. while (*ss) {*ss = *(ss+1); ss++; n++; }
  1817.     }
  1818.                 }
  1819. if (!(ms[y] = malloc((int)strlen(s) + 1))) { /* Get memory */
  1820.     printf("?Memory allocation failuren");
  1821.     return(-9);
  1822. }
  1823. strcpy(ms[y],s); /* Got memory, copy. */
  1824. mp[y] = ispattern ? 1 : 0; /* Mark whether it's a pattern */
  1825.                 if (rc == 1) { /* List terminated by CR */
  1826.     cfm = cmcfm(); /* Always call cmcfm() */
  1827.     debug(F101,"MINPUT cmcfm","",cfm);
  1828.     break;
  1829. }
  1830.             }
  1831.     for (y++; y < MINPMAX; y++) { /* Clean up old strings */
  1832. if (ms[y]) {
  1833.     free(ms[y]); /* Free old strings, if any */
  1834.     ms[y] = NULL;
  1835. }
  1836.             }
  1837.     debug(F101,"MINPUT end parse x","",x);
  1838.     if (cfm < 0)
  1839.       return(cfm);
  1840. #ifdef DEBUG
  1841.     if (deblog) { /* Check the parsing */
  1842. for (y = 0; y < MINPMAX; y++)
  1843.   if (ms[y]) debug(F111,"MINPUT",ms[y],mp[y]);
  1844.     }
  1845. #endif /* DEBUG */
  1846. } else
  1847. #endif /* CK_MINPUT */
  1848. {
  1849.     if ((y = cmtxt("Material to be input","",&s,xxstring)) < 0)
  1850.       return(y);
  1851.     mp[0] = ispattern ? 1 : 0;
  1852.     s = brstrip(s);
  1853.     if (!(ms[0] = malloc((int)strlen(s) + 1))) { /* Get memory */
  1854. printf("?Memory allocation failuren");
  1855. return(-9);
  1856.     }
  1857.     strcpy(ms[0],s); /* Got memory, copy. */
  1858.     ms[1] = NULL;
  1859. }
  1860. if (cx == XXINP /* INPUT */
  1861. #ifdef CK_MINPUT
  1862.     || cx == XXMINP /* or MINPUT */
  1863. #endif /* CK_MINPUT */
  1864.     ) {
  1865.     i_active = 1;
  1866.     success = doinput(x,ms,mp); /* Go try to input the search string */
  1867.     i_active = 0;
  1868. } else { /* REINPUT */
  1869.     debug(F110,"xxrei line",s,0);
  1870.     success = doreinp(x,s,ispattern);
  1871. }
  1872. if (intime[cmdlvl] && !success) { /* TIMEOUT-ACTION = QUIT? */
  1873.     popclvl(); /* If so, pop command level. */
  1874.     if (pflag && cmdlvl == 0) {
  1875. if (cx == XXINP)  printf("?INPUT timed outn");
  1876. if (cx == XXMINP) printf("?MINPUT timed outn");
  1877. if (cx == XXREI)  printf("?REINPUT failedn");
  1878.     }
  1879. }
  1880. return(success); /* Return do(re)input's return code */
  1881.     }
  1882. #endif /* NOSPL */
  1883. #ifndef NOSPL
  1884.     if (cx == XXLBL) { /* LABEL */
  1885. if ((x = cmfld("label","",&s,xxstring)) < 0) {
  1886.     if (x == -3) {
  1887. printf("?Label name requiredn");
  1888. return(-9);
  1889.     } else return(x);
  1890. }
  1891. if ((x = cmcfm()) < 0) return(x);
  1892. return(0);
  1893.     }
  1894. #endif /* NOSPL */
  1895.     if (cx == XXLOG) { /* LOG */
  1896. x = cmkey(logtab,nlog,"What to log","",xxstring);
  1897. if (x == -3) {
  1898.     printf("?Type of log requiredn");
  1899.     return(-9);
  1900. }
  1901. if (x < 0) return(x);
  1902. x = dolog(x);
  1903. if (x < 0)
  1904.   return(x);
  1905. else
  1906.   return(success = x);
  1907.     }
  1908.     if (cx == XXLOGIN) { /* (REMOTE) LOGIN */
  1909. #ifdef IKSD
  1910. if (inserver) {
  1911.     printf("?Already logged inn");
  1912.     return(-9);
  1913. } else
  1914. #endif /* IKSD */
  1915. {
  1916. #ifdef NOXFER
  1917.     return(-2);
  1918. #else
  1919.     return(dormt(XZLGI));
  1920. #endif /* NOXFER */
  1921. }
  1922.     }
  1923.     if (cx == XXLOGOUT) { /* (REMOTE) LOGOUT */
  1924. #ifdef IKSD
  1925.         if (inserver) {
  1926.     if ((x = cmcfm()) < 0)
  1927.       return(x);
  1928.     doexit(GOOD_EXIT,xitsta);
  1929. } else
  1930. #endif /* IKSD */
  1931. if (!local || (network && ttchk() < 0)) {
  1932.     printf("?No connection.n");
  1933.     return(-9);
  1934. } else {
  1935. #ifdef NOXFER
  1936.     return(-2);
  1937. #else
  1938.     return(dormt(XZLGO));
  1939. #endif /* NOXFER */
  1940. }
  1941.     }
  1942. #ifndef NOSCRIPT
  1943.     if (cx == XXLOGI) { /* UUCP-style script */
  1944. if ((x = cmtxt("expect-send expect-send ...","",&s,xxstring)) < 0)
  1945.   return(x);
  1946. #ifdef CK_APC
  1947. if (apcactive == APC_LOCAL ||
  1948.         apcactive == APC_REMOTE && apcstatus != APC_UNCH) return(success = 0);
  1949. #endif /* CK_APC */
  1950. #ifdef VMS
  1951. conres(); /* For Ctrl-C to work... */
  1952. #endif /* VMS */
  1953. return(success = dologin(s)); /* Return 1=completed, 0=failed */
  1954.     }
  1955. #endif /* NOSCRIPT */
  1956. #ifndef NOXFER
  1957. #ifdef PIPESEND
  1958.     if (cx == XXCREC) { /* CRECEIVE */
  1959. if (protocol != PROTO_K) {
  1960.     printf("?Sorry, CRECEIVE works only with Kermit protocoln");
  1961.     return(-9);
  1962. }
  1963.     }
  1964.     if (cx == XXCGET) { /* CGET */
  1965. return(doxget(cx));
  1966.     }
  1967. #endif /* PIPESEND */
  1968.     if (cx == XXREC) /* RECEIVE */
  1969.       return(doxget(cx));
  1970. #endif /* NOXFER */
  1971. #ifndef NOXFER
  1972.     if (cx == XXREM) { /* REMOTE */
  1973. #ifdef CK_XYZ
  1974. if (protocol != PROTO_K) {
  1975.     printf("Sorry, REMOTE commands only work with Kermit protocoln");
  1976.     return(-9);
  1977. }
  1978. #endif /* CK_XYZ */
  1979. x = cmkey(remcmd,nrmt,"Remote Kermit server command","",xxstring);
  1980. if (x == -3) {
  1981.     printf("?You must specify a command for the remote servern");
  1982.     return(-9);
  1983. }
  1984. return(dormt(x));
  1985.     }
  1986. #endif /* NOXFER */
  1987. #ifndef NORENAME
  1988. #ifndef NOFRILLS
  1989.     if (cx == XXREN) { /* RENAME */
  1990. #ifdef IKSD
  1991. if (inserver && (!ENABLED(en_ren)
  1992. #ifdef CK_LOGIN
  1993.  || isguest
  1994. #endif /* CK_LOGIN */
  1995.  )) {
  1996.     printf("?Sorry, renaming of files is disabledn");
  1997.     return(-9);
  1998. }
  1999. #endif /* IKSD */
  2000. #ifdef CK_APC
  2001. if (apcactive == APC_LOCAL ||
  2002.     apcactive == APC_REMOTE && apcstatus != APC_UNCH)
  2003.   return(success = 0);
  2004. #endif /* CK_APC */
  2005. return(dorenam());
  2006.     }
  2007. #endif /* NOFRILLS */
  2008. #endif /* NORENAME */
  2009.     if (cx == XXEIGHT) { /* EIGHTBIT */
  2010. extern int parity, cmask, cmdmsk;
  2011. if ((x = cmcfm()) < 0)
  2012.   return(x);
  2013. parity = 0;
  2014. cmask = 0xff;
  2015. cmdmsk = 0xff;
  2016. return(success = 1);
  2017.     }
  2018. #ifndef NOXFER
  2019. /* SEND, CSEND, MOVE, MAIL, and RESEND use the new common code */
  2020.     if (cx == XXSEN /* SEND */
  2021. #ifdef PIPESEND
  2022. || cx == XXCSEN /* CSEND */
  2023. #endif /* PIPESEND */
  2024. || cx == XXMOVE /* MOVE */
  2025. || cx == XXMAI /* MAIL */
  2026. #ifdef CK_RESEND
  2027. || cx == XXRSEN /* RESEND */
  2028. #endif /* CK_RESEND */
  2029. ) {
  2030. #ifdef IKSD
  2031. if (inserver && !ENABLED(en_get)) {
  2032.     printf("?Sorry, sending files is disabledn");
  2033.     return(-9);
  2034. }
  2035. #endif /* IKSD */
  2036. return(doxsend(cx));
  2037.     }
  2038. /* PSEND, ADD, and REMOVE use special parsing */
  2039. #ifdef ADDCMD
  2040.     /* ADD and REMOVE */
  2041.     if (cx == XXADD || cx == XXREMV) {
  2042. char * m;
  2043. m = (cx == XXADD) ? "Add to which list?" : "Remove from which list?";
  2044. x = cmkey(addtab,naddtab,m,"",xxstring);
  2045. if (x < 0)
  2046.   return(x);
  2047. #ifndef NOMSEND
  2048. if (x == ADD_SND)
  2049.   return(addsend(cx));
  2050. else
  2051. #endif /* NOMSEND */
  2052.   return(doadd(cx,x));
  2053.     }
  2054. #endif /* ADDCMD */
  2055. #ifdef CK_RESEND
  2056.     if (cx == XXPSEN) { /* PSEND */
  2057. int seekto = 0;
  2058. cmarg = cmarg2 = "";
  2059. x = cmifi("File to partially send", "", &s, &y, xxstring);
  2060. if (x < 0) {
  2061.     if (x == -3) {
  2062. printf("?A file specification is requiredn");
  2063. return(-9);
  2064.     } else return(x);
  2065. }
  2066. nfils = -1; /* Files come from internal list. */
  2067. #ifndef NOMSEND
  2068.         addlist = 0; /* Don't use SEND-LIST. */
  2069.         filenext = NULL;
  2070. #endif /* NOMSEND */
  2071. ckstrncpy(line,s,LINBUFSIZ); /* Save copy of string just parsed. */
  2072. debug(F110,"PSEND line",line,0);
  2073. if (y != 0) {
  2074.     printf("?Sorry, wildcards not permitted in this commandn");
  2075.     return(-9);
  2076. }
  2077. if (sizeof(int) < 4) {
  2078.     printf("?Sorry, this command needs 32-bit integersn");
  2079.     return(-9);
  2080. }
  2081. x = cmnum("starting position (byte number)",
  2082.   "",10,&seekto,xxstring);
  2083. if (x < 0)
  2084.   return(x);
  2085. zfnqfp(s,fspeclen,fspec); /* Get full path */
  2086. if ((x = cmtxt("Name to send it with","",&s,NULL)) < 0)
  2087.   return(x);
  2088. ckstrncpy(tmpbuf,s,TMPBUFSIZ);
  2089. #ifdef IKSD
  2090. if (inserver && !ENABLED(en_get)) {
  2091.     printf("?Sorry, sending files is disabledn");
  2092.     return(-9);
  2093. }
  2094. #endif /* IKSD */
  2095. #ifdef PIPESEND
  2096. if (sndfilter) {
  2097.     printf("?Sorry, no PSEND while SEND FILTER selectedn");
  2098.     return(-9);
  2099. }
  2100. #endif /* PIPESEND */
  2101. #ifdef CK_XYZ
  2102. if ((protocol == PROTO_X || protocol == PROTO_XC)) {
  2103.     printf("Sorry, PSEND works only with Kermit protocoln");
  2104.     return(-9);
  2105. }
  2106. #endif /* CK_XYZ */
  2107. cmarg2 = brstrip(tmpbuf); /* Strip braces */
  2108. cmarg = line; /* File to send */
  2109. debug(F110,"PSEND filename",cmarg,0);
  2110. debug(F110,"PSEND as-name",cmarg2,0);
  2111. sendstart = seekto;
  2112. sstate = 's'; /* Set start state to SEND */
  2113. #ifndef NOMSEND
  2114. addlist = 0;
  2115. filenext = NULL;
  2116. #endif /* NOMSEND */
  2117. sendmode = SM_PSEND;
  2118. #ifdef MAC
  2119. what = W_SEND;
  2120. scrcreate();
  2121. #endif /* MAC */
  2122. if (local) { /* If in local mode, */
  2123.     displa = 1; /* enable file transfer display */
  2124. }
  2125. return(0);
  2126.     }
  2127. #endif /* CK_RESEND */
  2128. #endif /* NOXFER */
  2129. #ifndef NOXFER
  2130. #ifndef NOMSEND
  2131.     if (cx == XXMSE || cx == XXMMOVE) {
  2132. #ifdef CK_XYZ
  2133. if (protocol == PROTO_X || protocol == PROTO_XC) {
  2134.     printf(
  2135. "Sorry, you can only send one file at a time with XMODEM protocoln"
  2136.    );
  2137.     return(-9);
  2138. }
  2139. #endif /* CK_XYZ */
  2140.         return(doxsend(cx));
  2141.     }
  2142. #ifdef COMMENT /* (moved to doxsend) */
  2143.     if (cx == XXMSE || cx == XXMMOVE) { /* MSEND and MMOVE commands */
  2144. nfils = 0; /* Like getting a list of */
  2145. lp = line; /* files on the command line */
  2146. addlist = 0; /* Do not use SEND-LIST */
  2147. filenext = NULL; /* Ditto ! */
  2148. while (1) {
  2149.     char *p;
  2150.     if ((x = cmifi("Names of files to send, separated by spaces","",
  2151.    &s,&y,xxstring)) < 0) {
  2152. if (x == -3) {
  2153.     if (nfils <= 0) {
  2154. printf("?A file specification is requiredn");
  2155. return(-9);
  2156.     } else break;
  2157. }
  2158. return(x);
  2159.     }
  2160.     msfiles[nfils++] = lp; /* Got one, count it, point to it, */
  2161.     p = lp; /* remember pointer, */
  2162.     while (*lp++ = *s++) /* and copy it into buffer */
  2163.       if (lp > (line + LINBUFSIZ)) { /* Avoid memory leak */
  2164.   printf("?MSEND list too longn");
  2165.   line[0] = NUL;
  2166.   return(-9);
  2167.       }
  2168.     debug(F111,"msfiles",msfiles[nfils-1],nfils-1);
  2169.     if (nfils == 1) *fspec = NUL; /* Take care of v(filespec) */
  2170. #ifdef ZFNQFP
  2171.     zfnqfp(p,TMPBUFSIZ,tmpbuf);
  2172.     p = tmpbuf;
  2173. #endif /* ZFNQFP */
  2174.     if (((int)strlen(fspec) + (int)strlen(p) + 1) < fspeclen) {
  2175. strcat(fspec,p);
  2176. strcat(fspec," ");
  2177.     } else printf("WARNING - \v(filespec) buffer overflown");
  2178. }
  2179. cmlist = msfiles; /* Point cmlist to pointer array */
  2180. cmarg2 = ""; /* No internal expansion list (yet) */
  2181. sndsrc = nfils; /* Filenames come from cmlist */
  2182. sendmode = SM_MSEND; /* Remember this kind of SENDing */
  2183. sstate = 's'; /* Set start state for SEND */
  2184. if (cx == XXMMOVE) /* If MMOVE'ing, */
  2185.   moving = 1; /*  set this flag. */
  2186. #ifdef MAC
  2187. what = W_SEND;
  2188. scrcreate();
  2189. #endif /* MAC */
  2190. if (local) { /* If in local mode, */
  2191.     displa = 1; /* turn on file transfer display */
  2192.     ttflui(); /* and flush tty input buffer. */
  2193. }
  2194. return(0);
  2195.     }
  2196. #endif /* COMMENT */
  2197. #endif /* NOMSEND */
  2198. #endif /* NOXFER */
  2199. #ifndef NOSERVER
  2200.     if (cx == XXSER) { /* SERVER */
  2201. #ifdef CK_XYZ
  2202. if (protocol != PROTO_K) {
  2203.     printf("Sorry, SERVER only works with Kermit protocoln");
  2204.     return(-9);
  2205. }
  2206. #endif /* CK_XYZ */
  2207. #ifdef COMMENT
  2208. /*
  2209.   Parse for time limit, but since we don't use it yet,
  2210.   the parsing is commented out.
  2211. */
  2212. x_ifnum = 1; /* Turn off internal complaints */
  2213. y = cmnum("optional time limit, seconds, or time of day as hh:mm:ss",
  2214.   "0", 10, &x, xxstring
  2215.   );
  2216. x_ifnum = 0;
  2217. if (y < 0) {
  2218.     if (y == -2) { /* Invalid number or expression */
  2219. zz = tod2sec(atmbuf); /* Convert to secs since midnight */
  2220. if (zz < 0L) {
  2221.     printf("?Number, expression, or time of day requiredn");
  2222.     return(-9);
  2223. } else {
  2224.     char now[32]; /* Current time */
  2225.     char *p;
  2226.     long tnow;
  2227.     p = now;
  2228.     ztime(&p);
  2229.     tnow = atol(p+11) * 3600L + atol(p+14) * 60L + atol(p+17);
  2230.     if (zz < tnow) /* User's time before now */
  2231.       zz += 86400L; /* So make it tomorrow */
  2232.     zz -= tnow; /* Seconds from now. */
  2233. }
  2234.     } else
  2235.       return(y);
  2236. }
  2237. if (zz > -1L) {
  2238.     x = zz;
  2239.     if (zz != (long) x) {
  2240. printf(
  2241. "Sorry, arithmetic overflow - hh:mm:ss not usable on this platform.n"
  2242.        );
  2243. return(-9);
  2244.     }
  2245. }
  2246. if (x < 0)
  2247.   x = 0;
  2248. #endif /* COMMENT */
  2249. if ((x = cmcfm()) < 0) return(x);
  2250. sstate = 'x';
  2251. #ifdef MAC
  2252. what = W_RECV;
  2253. scrcreate();
  2254. #endif /* MAC */
  2255. if (local) displa = 1;
  2256. #ifdef AMIGA
  2257. reqoff(); /* No DOS requestors while server */
  2258. #endif /* AMIGA */
  2259. return(0);
  2260.     }
  2261. #endif /* NOSERVER */
  2262.     if (cx == XXSAVE) { /* SAVE command */
  2263. x = cmkey(savtab,nsav,"option","keymap",xxstring);
  2264. if (x == -3) {
  2265.     printf("?You must specify an option to saven");
  2266.     return(-9);
  2267. }
  2268. if (x < 0) return(x);
  2269. /* have to set success separately for each item in doprm()... */
  2270. /* actually not really, could have just had doprm return 0 or 1 */
  2271. /* and set success here... */
  2272. y = dosave(x);
  2273. if (y == -3) {
  2274.     printf("?More fields requiredn");
  2275.     return(-9);
  2276. } else return(y);
  2277.     }
  2278.     if (cx == XXSET) { /* SET command */
  2279. x = cmkey(prmtab,nprm,"Parameter","",xxstring);
  2280. if (x == -3) {
  2281.     printf("?You must specify a parameter to setn");
  2282.     return(-9);
  2283. }
  2284. if (x < 0) return(x);
  2285. /* have to set success separately for each item in doprm()... */
  2286. /* actually not really, could have just had doprm return 0 or 1 */
  2287. /* and set success here... */
  2288. y = doprm(x,0);
  2289. if (y == -3) {
  2290.     printf("?More fields requiredn");
  2291.     return(-9);
  2292. } else return(y);
  2293.     }
  2294. #ifndef NOPUSH
  2295.     if (cx == XXSHE /* SHELL (system) command */
  2296. || cx == XXEXEC /* exec() */
  2297. ) {
  2298. int rx = 0;
  2299. char * p = NULL;
  2300. int i,n;
  2301. #ifdef UNIXOROSK
  2302. char * args[256];
  2303. #endif /* UNIXOROSK */
  2304. #ifdef IKSD
  2305. if (inserver && (nopush || !ENABLED(en_hos))) {
  2306.     printf("?Sorry, host command access is disabledn");
  2307.     return(-9);
  2308. }
  2309. #endif /* IKSD */
  2310. #ifdef CKEXEC
  2311. if (cx == XXEXEC) { /* EXEC (overlay ourselves) */
  2312.     struct FDB sw, fl;
  2313.     cmfdbi(&sw, /* First FDB - command switches */
  2314.    _CMKEY, /* fcode */
  2315.    "Command to overlay C-Kermitn or switch", /* hlpmsg */
  2316.    "", /* default */
  2317.    "", /* addtl string data */
  2318.    1, /* addtl numeric data 1: tbl size */
  2319.    4, /* addtl numeric data 2: 4 = cmswi */
  2320.    xxstring, /* Processing function */
  2321.    redirsw, /* Keyword table */
  2322.    &fl /* Pointer to next FDB */
  2323.    );
  2324.     cmfdbi(&fl, /* 2nd FDB - command to exec */
  2325.    _CMFLD, /* fcode */
  2326.    "Command to overlay C-Kermit", /* hlpmsg */
  2327.    "", /* default */
  2328.    "", /* addtl string data */
  2329.    0, /* addtl numeric data 1 */
  2330.    0, /* addtl numeric data 2 */
  2331.    xxstring,
  2332.    NULL,
  2333.    NULL /* No more after this */
  2334.    );
  2335.     while (1) {
  2336. x = cmfdb(&sw); /* Parse something */
  2337. debug(F101,"exec cmfdb","",x);
  2338. if (x < 0)
  2339.   return(x);
  2340. /* Generalize this if we add more switches */
  2341. if (cmresult.fcode == _CMKEY) {
  2342.     rx = 1;
  2343.     continue;
  2344. }
  2345. if (cmresult.fcode == _CMFLD)
  2346.   break;
  2347. return(-2);
  2348.     }
  2349.     ckstrncpy(tmpbuf,cmresult.sresult,TMPBUFSIZ);
  2350.     if (!tmpbuf[0]) {
  2351. printf("?Command requiredn");
  2352. return(-9);
  2353.     }
  2354.     p = brstrip(tmpbuf);
  2355.     args[0] = NULL; /* Set argv[0] to it */
  2356.     makestr(&args[0],p);
  2357.     for (i = 1; i < 255; i++) { /* Get arguments for command */
  2358. if ((x = cmfld("Argument","",&s,xxstring)) < 0) {
  2359.     if (x == -3) {
  2360. if ((x = cmcfm()) < 0)
  2361.   return(x);
  2362. break;
  2363.     } else
  2364.       return(x);
  2365. }
  2366. args[i] = NULL;
  2367. s = brstrip(s);
  2368. makestr(&args[i],s);
  2369.     }
  2370.     args[i] = NULL;
  2371. } else {
  2372. #endif /* CKEXEC */
  2373.     if ((x = cmtxt("System command to execute","",&s,xxstring)) < 0)
  2374.       return(x);
  2375. #ifdef CKEXEC
  2376. }
  2377. #endif /* CKEXEC */
  2378.         if (nopush)
  2379.           return(success = 0);
  2380. #ifdef CK_APC
  2381. if (apcactive == APC_REMOTE && apcstatus != APC_UNCH)
  2382.   return(success = 0);
  2383. #endif /* CK_APC */
  2384. conres(); /* Make console normal  */
  2385. #ifdef OS2
  2386. if (!(s && *s)) {
  2387.     os2push();
  2388.     x = 1;
  2389. } else
  2390. #endif /* OS2 */
  2391.   if (cx == XXSHE) {
  2392.       x = zshcmd(s);
  2393.       debug(F101,"RUN zshcmd code","",x);
  2394.       concb((char)escape);
  2395.       return(success = x);
  2396. #ifdef CKEXEC
  2397.   } else {
  2398. #ifdef DEBUG
  2399.       if (deblog) {
  2400.   debug(F111,"EXEC cmd",p,0);
  2401.   for (i = 0; i < 256 && args[i]; i++)
  2402.     debug(F111,"EXEC arg",args[i],i);
  2403.       }
  2404. #endif /* DEBUG */
  2405.       if (p) {
  2406.   z_exec(p,args,rx); /* Overlay ourself */
  2407.   debug(F100,"EXEC fails","",0);
  2408.   concb((char)escape); /* In case it returns */
  2409.       }
  2410.       return(success = 0);
  2411. #endif /* CKEXEC */
  2412.   }
  2413.     }
  2414. #ifdef CK_REDIR
  2415.     if (cx == XXFUN) { /* REDIRECT */
  2416. #ifdef CK_APC
  2417. if (apcactive == APC_LOCAL ||
  2418.         apcactive == APC_REMOTE && apcstatus != APC_UNCH) return(success = 0);
  2419. #endif /* CK_APC */
  2420. sprintf(tmpbuf,
  2421. "Local command to run,n
  2422. with its standard input/output redirected to %sn",
  2423. ttname);
  2424. if ((x = cmtxt(tmpbuf,"",&s,xxstring)) < 0)
  2425.   return(x);
  2426.         if (nopush) {
  2427.             printf("?REDIRECT disabledn");
  2428.             return(success=0);
  2429.         }
  2430. if (!local) {
  2431.     printf("?SET LINE or SET HOST required firstn");
  2432.     return(-9);
  2433. }
  2434. return(success = ttruncmd(s));
  2435.     }
  2436. #endif /* CK_REDIR */
  2437. #endif /* NOPUSH */
  2438. #ifndef NOSHOW
  2439.     if (cx == XXSHO) { /* SHOW */
  2440. x = cmkey(shotab,nsho,"","parameters",xxstring);
  2441. if (x < 0) return(x);
  2442. return(doshow(x));
  2443.     }
  2444. #endif /* NOSHOW */
  2445. #ifndef MAC
  2446.     if (cx == XXSPA) { /* SPACE */
  2447. #ifdef IKSD
  2448. if (inserver && !ENABLED(en_spa)) {
  2449.     printf("?Sorry, SPACE command disabledn");
  2450.     return(-9);
  2451. }
  2452. #endif /* IKSD */
  2453. #ifdef datageneral
  2454. /* AOS/VS can take an argument after its "space" command. */
  2455. if ((x = cmtxt("Confirm, or local directory name","",&s,xxstring)) < 0)
  2456.   return(x);
  2457. if (nopush) {
  2458.     printf("?Sorry, SPACE command disabledn");
  2459.     return(-9);
  2460. } else if (*s == NUL) {
  2461.     xsystem(SPACMD);
  2462. } else {
  2463.     sprintf(line,"space %s",s);
  2464.     xsystem(line);
  2465. }
  2466. #else
  2467. #ifdef OS2
  2468. if ((x = cmtxt("Press Enter for current disk,n
  2469.  or specify a disk letter like A:","",&s,xxstring)) < 0)
  2470.   return(x);
  2471. if (*s == NUL) { /* Current disk */
  2472.     printf(" Free space: %ldKn", zdskspace(0)/1024L);
  2473. } else {
  2474.     int drive = toupper(*s);
  2475.     printf(" Drive %c: %ldK freen", drive,
  2476.    zdskspace(drive - 'A' + 1) / 1024L);
  2477. }
  2478. #else
  2479. #ifdef UNIXOROSK
  2480. x = cmdir("Confirm for current disk,n
  2481.  or specify a disk device or directory","",&s,xxstring);
  2482. if (x == -3)
  2483.   s = "";
  2484. else if (x < 0)
  2485.   return(x);
  2486.         ckstrncpy(tmpbuf,s,TMPBUFSIZ);
  2487.         s = tmpbuf;
  2488. if ((x = cmcfm()) < 0) return(x);
  2489. if (nopush) {
  2490.     printf("?Sorry, SPACE command disabledn");
  2491.     return(-9);
  2492. }
  2493. if (!*s) { /* Current disk */
  2494.     xsystem(SPACMD);
  2495. } else { /* Specified disk */
  2496.     sprintf(line,"%s %s",SPACM2,s);
  2497.     xsystem(line);
  2498. }
  2499. #else
  2500. if ((x = cmcfm()) < 0) return(x);
  2501. if (nopush) {
  2502.     printf("?Sorry, SPACE command disabledn");
  2503.     return(-9);
  2504. }
  2505. xsystem(SPACMD);
  2506. #endif /* UNIXOROSK */
  2507. #endif /* OS2 */
  2508. #endif /* datageneral */
  2509. return(success = 1); /* Pretend it worked */
  2510.     }
  2511. #endif /* MAC */
  2512. #ifndef NOXFER
  2513.     if (cx == XXSTA) { /* STATISTICS */
  2514. if ((x = cmkey(stattab,2,"Carriage return, or option",
  2515.        "/brief",xxstring)) < 0)
  2516.   return(x);
  2517. if ((y = cmcfm()) < 0) return(y);
  2518. return(success = dostat(x));
  2519.     }
  2520. #endif /* NOXFER */
  2521.     if (cx == XXSTO || cx == XXEND) { /* STOP, END, or POP */
  2522. if ((y = cmnum("exit status code","0",10,&x,xxstring)) < 0)
  2523.   return(y);
  2524. if ((y = cmtxt("Message to print","",&s,xxstring)) < 0)
  2525.   return(y);
  2526. s = brstrip(s);
  2527. if (*s) printf("%sn",s);
  2528. if (cx == XXSTO) {
  2529.     dostop();
  2530. } else {
  2531. #ifndef NOSPL
  2532.     /* Pop from all FOR/WHILE/XIF/SWITCH's */
  2533.     debug(F101,"END maclvl 1","",maclvl);
  2534.     while ((maclvl > 0) &&
  2535.    (m_arg[maclvl-1][0]) &&
  2536.    (cmdstk[cmdlvl].src == CMD_MD) &&
  2537.      (!strncmp(m_arg[maclvl-1][0],"_xif",4) ||
  2538.       !strncmp(m_arg[maclvl-1][0],"_for",4) ||
  2539.       !strncmp(m_arg[maclvl-1][0],"_whi",4) ||
  2540.       !strncmp(m_arg[maclvl-1][0],"_swi",4))) {
  2541. debug(F110,"END popping",m_arg[maclvl-1][0],0);
  2542. dogta(XXPTA); /* Put args back */
  2543. popclvl(); /* Pop up two levels */
  2544. popclvl();
  2545. debug(F101,"END maclvl 2","",maclvl);
  2546.     }
  2547.             if (maclvl > -1) {
  2548. if (mrval[maclvl]) /* Free previous retval if any */
  2549.   free(mrval[maclvl]);
  2550. mrval[maclvl] = malloc(16); /* Room for up to 15 digits */
  2551. if (mrval[maclvl])
  2552.   sprintf(mrval[maclvl],"%d",x); /* Record current retval */
  2553.     }
  2554. #endif /* NOSPL */
  2555.     popclvl(); /* Now pop out of macro or TAKE file */
  2556. #ifndef NOSPL
  2557. #ifdef DEBUG
  2558.     if (deblog) {
  2559. debug(F101,"END maclvl 3","",maclvl);
  2560. debug(F111,"END mrval[maclvl]",mrval[maclvl],maclvl);
  2561. debug(F111,"END mrval[maclvl+1]",mrval[maclvl+1],maclvl+1);
  2562.     }
  2563. #endif /* DEBUG */
  2564. #endif /* NOSPL */
  2565. }
  2566. return(success = (x == 0));
  2567.     }
  2568.     if (cx == XXSUS) { /* SUSPEND */
  2569. if ((y = cmcfm()) < 0) return(y);
  2570. #ifdef NOJC
  2571. printf("Sorry, this version of Kermit cannot be suspendedn");
  2572. #else
  2573. #ifdef IKSD
  2574. if (inserver) {
  2575.     printf("?Sorry, IKSD can not be suspendedn");
  2576.     return(-9);
  2577. } else
  2578. #endif /* IKSD */
  2579.   if (nopush) {
  2580.     printf("?Sorry, access to system is disabledn");
  2581.     return(-9);
  2582. }
  2583. stptrap(0);
  2584. #endif /* NOJC */
  2585. return(0);
  2586.     }
  2587.     if (cx == XXTAK) { /* TAKE */
  2588. #ifdef OS2
  2589. extern char startupdir[],exedir[],inidir[];
  2590. char * scriptenv, * keymapenv;
  2591. #endif /* OS2 */
  2592. char takepath[1024];
  2593. if (tlevel >= MAXTAKE-1) {
  2594.     printf("?Take files nested too deeplyn");
  2595.     return(-9);
  2596. }
  2597. #ifdef OS2
  2598. #ifdef NT
  2599. scriptenv = getenv("K95SCRIPTS");
  2600. keymapenv = getenv("K95KEYMAPS");
  2601. #else /* NT */
  2602. scriptenv = getenv("K2SCRIPTS");
  2603. keymapenv = getenv("K2KEYMAPS");
  2604. #endif /* NT */
  2605. if (!scriptenv)
  2606.   scriptenv = getenv("CK_SCRIPTS");
  2607. if (!keymapenv)
  2608.   keymapenv = getenv("CK_KEYMAPS");
  2609. sprintf(takepath,
  2610.                 /* semicolon-separated path list */
  2611.                 "%s%s%s%s%s;%s%s;%s%s;%s;%s%s;%s%s;%s;%s%s;%s%s",
  2612.                 scriptenv?scriptenv:"",
  2613.                 (scriptenv && scriptenv[strlen(scriptenv)-1]==';')?"":";",
  2614.                 keymapenv?keymapenv:"",
  2615.                 (keymapenv && keymapenv[strlen(keymapenv)-1]==';')?"":";",
  2616.                 startupdir,
  2617.                 startupdir, "SCRIPTS/",
  2618.                 startupdir, "KEYMAPS/",
  2619.                 inidir,
  2620.                 inidir, "SCRIPTS/",
  2621.                 inidir, "KEYMAPS/",
  2622.                 zhome(),
  2623.                 zhome(), "SCRIPTS/",
  2624.                 zhome(), "KEYMAPS/",
  2625.                 exedir,
  2626.                 exedir, "SCRIPTS/",
  2627.                 exedir, "KEYMAPS/"
  2628.                 );
  2629. #else /* not OS2 */
  2630. y = 1024;
  2631. s = takepath;
  2632. zzstring("\v(home)",&s,&y);
  2633. #endif /* OS2 */
  2634. if ((y = cmifip("C-Kermit command file",
  2635. "",&s,&x,0,takepath,xxstring)) < 0) {
  2636.     if (y == -3) {
  2637. printf("?A file name is requiredn");
  2638. return(-9);
  2639.     } else
  2640.       return(y);
  2641. }
  2642. if (x != 0) {
  2643.     printf("?Wildcards not allowed in command file namen");
  2644.     return(-9);
  2645. }
  2646. ckstrncpy(line,s,LINBUFSIZ);
  2647. debug(F110,"take file",s,0);
  2648. if (isdir(s)) {
  2649.     printf("?Can't execute a directory - "%s"n", s);
  2650.     return(-9);
  2651. }
  2652. #ifndef NOTAKEARGS
  2653. {
  2654.     char * p;
  2655.     /* extern char **m_xarg[]; */
  2656.     x = strlen(line);
  2657.     p = line + x + 1;
  2658.     if ((y = cmtxt("Optional arguments","",&s,xxstring)) < 0)
  2659.       return(y);
  2660.     if (*s) { /* Args given? */
  2661. ckstrncpy(p,s,LINBUFSIZ-x-1);
  2662. #ifdef ZFNQFP
  2663. zfnqfp(line,TMPBUFSIZ,tmpbuf);
  2664. s = tmpbuf;
  2665. #else
  2666. s = line;
  2667. #endif /* ZFNQFP */
  2668. addmac("%0",s); /* Define %0 = name of file */
  2669. varnam[0] = '%';
  2670. varnam[2] = '';
  2671. debug(F110,"take arg 0",s,0);
  2672. debug(F110,"take args",p,0);
  2673. for (y = 1; y < 10; y++) { /* Clear current args %1..%9 */
  2674.     varnam[1] = (char) (y + '0');
  2675.     delmac(varnam);
  2676. }
  2677. xwords(p,MAXARGLIST,NULL,0); /* Assign new args */
  2678. debug(F110,"take args",p,0);
  2679.     }
  2680. }
  2681. #else
  2682. if ((y = cmcfm()) < 0) return(y);
  2683. #endif /* NOTAKEARGS */
  2684. return(success = dotake(line));
  2685.     }
  2686. #ifndef NOLOCAL
  2687. #ifdef OS2
  2688.     if (cx == XXVIEW) { /* VIEW Only Terminal mode */
  2689. viewonly = TRUE;
  2690. success = doconect(0);
  2691. viewonly = FALSE;
  2692. return success;
  2693.     }
  2694. #endif /* OS2 */
  2695. #ifdef NETCONN
  2696.     if (cx == XXTEL || cx == XXIKSD) { /* TELNET */
  2697. int x,z;
  2698. #ifdef OS2
  2699.     if (!tcp_avail) {
  2700.         printf("?Sorry, either TCP/IP is not available on this system orn
  2701. necessary DLLs did not load.  Use SHOW NETWORK to check network status.n");
  2702.         success = 0;
  2703.         return(-9);
  2704.     } else
  2705. #endif /* OS2 */
  2706.       {
  2707.   x = nettype; /* Save net type in case of failure */
  2708.   z = ttnproto; /* Save protocol in case of failure */
  2709.   nettype = NET_TCPB;
  2710.   ttnproto = (cx == XXTEL) ? NP_TELNET : NP_KERMIT;
  2711.   if ((y = setlin(XYHOST,0,1)) < 0) {
  2712.               nettype = x; /* Failed, restore net type. */
  2713.               ttnproto = z; /* and protocol */
  2714.               success = 0;
  2715.   }
  2716.   didsetlin++;
  2717.         }
  2718. return(y);
  2719.     }
  2720. #ifndef PTYORPIPE
  2721. #ifdef NETCMD
  2722. #define PTYORPIPE
  2723. #else
  2724. #ifdef NETPTY
  2725. #define PTYORPIPE
  2726. #endif /* NETPTY */
  2727. #endif /* NETCMD */
  2728. #endif /* PTYORPIPE */
  2729. #ifdef PTYORPIPE
  2730.     if (cx == XXPIPE || cx == XXPTY) { /* PIPE or PTY */
  2731. int x;
  2732. extern int netsave;
  2733. x = nettype; /* Save net type in case of failure */
  2734. nettype = (cx == XXPIPE) ? NET_CMD : NET_PTY;
  2735. if ((y = setlin(XYHOST,0,1)) < 0) {
  2736.     nettype = x; /* Failed, restore net type. */
  2737.     ttnproto = z; /* and protocol */
  2738.     success = 0;
  2739. }
  2740. didsetlin++;
  2741. netsave = x;
  2742. return(y);
  2743.     }
  2744. #endif /* PTYORPIPE */
  2745.     if (cx == XXRLOG) { /* RLOGIN */
  2746. #ifdef RLOGCODE
  2747. int x,z;
  2748. #ifdef OS2
  2749. if (!tcp_avail) {
  2750.     printf("?Sorry, either TCP/IP is not available on this system orn
  2751. necessary DLLs did not load.  Use SHOW NETWORK to check network status.n"
  2752.    );
  2753.     success = 0;
  2754.     return(-9);
  2755. } else {
  2756. #endif /* OS2 */
  2757.     x = nettype; /* Save net type in case of failure */
  2758.     z = ttnproto; /* Save protocol in case of failure */
  2759.     nettype = NET_TCPB;
  2760.     ttnproto = NP_RLOGIN;
  2761.     if ((y = setlin(XYHOST,0,1)) < 0) {
  2762. nettype = x; /* Failed, restore net type. */
  2763. ttnproto = z; /* and protocol */
  2764. success = 0;
  2765.     }
  2766.     didsetlin++;
  2767. #ifdef OS2
  2768. }
  2769. #endif /* OS2 */
  2770. return(y);
  2771. #else
  2772. printf("?Sorry, RLOGIN is not configured in this copy of C-Kermit.n");
  2773. return(-9);
  2774. #endif /* RLOGCODE */
  2775.     }
  2776. #endif /* NETCONN */
  2777. #endif /* NOLOCAL */
  2778. #ifndef NOXMIT
  2779.     if (cx == XXTRA) { /* TRANSMIT */
  2780. int i, n, xpipe = 0, xbinary = 0, xxlate = 1, xxnowait = 0, getval;
  2781. char c;
  2782. struct FDB sf, sw, tx; /* FDBs for parse functions */
  2783. #ifndef NOCSETS
  2784. extern int tcs_transp; /* Term charset is transparent */
  2785. #else
  2786. int tcs_transp = 1;
  2787. #endif /* NOCSETS */
  2788. #ifdef COMMENT
  2789. xbinary = binary; /* Default text/binary mode */
  2790. #else
  2791. xbinary = 0; /* Default is text */
  2792. #endif /* COMMENT */
  2793. cmfdbi(&sw, /* First FDB - command switches */
  2794.        _CMKEY, /* fcode */
  2795.        "Filename, or switch", /* hlpmsg */
  2796.        "", /* default */
  2797.        "", /* addtl string data */
  2798.        nxmitsw, /* addtl numeric data 1: tbl size */
  2799.        4, /* addtl numeric data 2: 4 = cmswi */
  2800.        xxstring, /* Processing function */
  2801.        xmitsw, /* Keyword table */
  2802.        &sf /* Pointer to next FDB */
  2803.        );
  2804. cmfdbi(&sf, /* 2nd FDB - file to send */
  2805.        _CMIFI, /* fcode */
  2806.        "File to transmit", /* hlpmsg */
  2807.        "", /* default */
  2808.        "", /* addtl string data */
  2809.        0, /* addtl numeric data 1 */
  2810.        0, /* addtl numeric data 2 */
  2811.        xxstring,
  2812.        NULL,
  2813. #ifdef PIPESEND
  2814.        &tx
  2815. #else
  2816.        NULL
  2817. #endif /* PIPESEND */
  2818.        );
  2819. #ifdef PIPESEND
  2820. cmfdbi(&tx,
  2821.      _CMTXT, /* fcode */
  2822.      "Command", /* hlpmsg */
  2823.        "", /* default */
  2824.        "", /* addtl string data */
  2825.        0, /* addtl numeric data 1 */
  2826.        0, /* addtl numeric data 2 */
  2827.        xxstring,
  2828.        NULL,
  2829.        NULL
  2830.        );
  2831. #endif /* PIPESEND */
  2832. while (1) {
  2833.     x = cmfdb(&sw);
  2834.     if (x < 0)
  2835.       return(x);
  2836.     if (cmresult.fcode != _CMKEY)
  2837.       break;
  2838.     c = cmgbrk(); /* Have switch, get break character */
  2839.     if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) {
  2840. printf("?This switch does not take an argumentn");
  2841. return(-9);
  2842.     }
  2843.     if (!getval && (cmgkwflgs() & CM_ARG)) {
  2844. printf("?This switch requires an argumentn");
  2845. return(-9);
  2846.     }
  2847.     n = cmresult.nresult; /* Numeric result = switch ID */
  2848.     switch (n) { /* Process the switch */
  2849. #ifdef PIPESEND
  2850.       case XMI_CMD: /* Transmit from a command */
  2851. if (nopush) {
  2852.     printf("?Sorry, system command access is disabledn");
  2853.     return(-9);
  2854. }
  2855. sw.hlpmsg = "Command, or switch"; /* Change help message */
  2856. xpipe = 1; /* (No way to undo this one) */
  2857. break;
  2858. #endif /* PIPESEND */
  2859.       case XMI_BIN: /* Binary */
  2860. xbinary = 1;
  2861. xxlate = 0; /* Don't translate charsets */
  2862. break;
  2863.       case XMI_TXT: /* Text */
  2864. xbinary = 0;
  2865. xxlate = !tcs_transp; /* Translate if TERM CHAR not TRANSP */
  2866. break;
  2867.       case XMI_TRA: /* Transparent text */
  2868. xbinary = 0;
  2869. xxlate = 0; /* But don't translate charsets */
  2870. break;
  2871. #ifdef COMMENT
  2872.       case XMI_VRB: /* /VERBOSE */
  2873.       case XMI_QUI: /* /QUIET */
  2874. break; /* (not implemented yet) */
  2875. #endif /* COMMENT */
  2876.       case XMI_NOW: /* /NOWAIT */
  2877. xxnowait = 1;
  2878. break;
  2879.       default:
  2880. return(-2);
  2881.     }
  2882. }
  2883. if (cmresult.fcode != _CMIFI && cmresult.fcode != _CMTXT)
  2884.   return(-2);
  2885. ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* Filename */
  2886. s = line;
  2887. if ((y = cmcfm()) < 0) /* Confirm */
  2888.   return(y);
  2889. #ifdef CK_APC
  2890. if (apcactive == APC_LOCAL ||
  2891.         apcactive == APC_REMOTE && apcstatus != APC_UNCH)
  2892.   return(success = 0);
  2893. #endif /* CK_APC */
  2894. if (cmresult.nresult != 0) {
  2895.     printf("?Only a single file may be transmittedn");
  2896.     return(-9);
  2897. }
  2898. #ifdef PIPESEND
  2899. if (xpipe) {
  2900.     s = brstrip(s);
  2901.     if (!*s) {
  2902. printf("?Sorry, a command to send from is requiredn");
  2903. return(-9);
  2904.     }
  2905.     pipesend = 1;
  2906. }
  2907. #endif /* PIPESEND */
  2908. success = transmit(s,
  2909.    (xxnowait ? (char)0 : (char)xmitp),
  2910.    xxlate,
  2911.    xbinary
  2912.    );
  2913. return(success);
  2914.     }
  2915. #endif /* NOXMIT */
  2916. #ifndef NOFRILLS
  2917.     if (cx == XXTYP || cx == XXMORE) { /* TYPE or MORE */
  2918. int paging = 0, havename = 0, head = 0, width = 0, count = 0;
  2919. char pfxbuf[64], * prefix = NULL;
  2920. extern int xaskmore;
  2921. struct FDB sf, sw;
  2922. char * pat = NULL;
  2923. if (cx == XXMORE)
  2924.   paging = 1;
  2925. else
  2926.   paging = (typ_page < 0) ? xaskmore : typ_page;
  2927. #ifdef IKSD
  2928. if (inserver && !ENABLED(en_typ)) {
  2929.     printf("?Sorry, TYPE command disabledn");
  2930.     return(-9);
  2931. }
  2932. #endif /* IKSD */
  2933.     cmfdbi(&sw, /* 2nd FDB - optional /PAGE switch */
  2934.    _CMKEY, /* fcode */
  2935.    "Filename or switch", /* hlpmsg */
  2936.    "", /* default */
  2937.    "", /* addtl string data */
  2938.    ntypetab, /* addtl numeric data 1: tbl size */
  2939.    4, /* addtl numeric data 2: 4 = cmswi */
  2940.    xxstring, /* Processing function */
  2941.    typetab, /* Keyword table */
  2942.    &sf /* Pointer to next FDB */
  2943.    );
  2944.     cmfdbi(&sf, /* 1st FDB - file to type */
  2945.    _CMIFI, /* fcode */
  2946.    "", /* hlpmsg */
  2947.    "", /* default */
  2948.    "", /* addtl string data */
  2949.    0, /* addtl numeric data 1 */
  2950.    0, /* addtl numeric data 2 */
  2951.    xxstring,
  2952.    NULL,
  2953.    NULL
  2954.    );
  2955. while (!havename) {
  2956.     x = cmfdb(&sw); /* Parse something */
  2957.     debug(F101,"dotype cmfdb","",x);
  2958.     debug(F101,"dotype cmresult.fcode","",cmresult.fcode);
  2959.     debug(F101,"dotype cmresult.nresult","",cmresult.nresult);
  2960.     if (x < 0) /* Error */
  2961.       return(x);
  2962.     else if (cmresult.fcode == _CMKEY) {
  2963. char c; int getval;
  2964. c = cmgbrk();
  2965. getval = (c == ':' || c == '=');
  2966. if (getval && !(cmgkwflgs() & CM_ARG)) {
  2967.     printf("?This switch does not take an argumentn");
  2968.     return(-9);
  2969. }
  2970. #ifdef COMMENT
  2971. if (!getval && (cmgkwflgs() & CM_ARG)) {
  2972.     printf("?This switch requires an argumentn");
  2973.     /* Not if it has a default! */
  2974.     return(-9);
  2975. }
  2976. #endif /* COMMENT */
  2977. switch (cmresult.nresult) {
  2978. #ifdef CK_TTGWSIZ
  2979.   case TYP_PAG:
  2980.     paging = 1;
  2981.     break;
  2982.   case TYP_NOP:
  2983.     paging = 0;
  2984.     break;
  2985. #endif /* CK_TTGWSIZ */
  2986.   case TYP_COU:
  2987.     count = 1;
  2988.     break;
  2989.   case TYP_HEA:
  2990.   case TYP_TAI:
  2991.     y = 10;
  2992.     if (getval)
  2993.       if ((x = cmnum("Number of lines",
  2994.      "10",10,&y,xxstring)) < 0)
  2995. return(x);
  2996.     head = (cmresult.nresult == TYP_TAI) ? -y : y;
  2997.     break;
  2998.   case TYP_WID:
  2999.     y = typ_wid > -1 ? typ_wid : cmd_cols;
  3000.     if (getval)
  3001.       if ((x = cmnum("Column at which to truncate",
  3002.      ckitoa(y),10,&y,xxstring)) < 0)
  3003. return(x);
  3004.     width = y;
  3005.     break;
  3006.   case TYP_PAT:
  3007.     if (!getval && (cmgkwflgs() & CM_ARG)) {
  3008. printf("?This switch requires an argumentn");
  3009. return(-9);
  3010.     }
  3011.     if ((x = cmfld("pattern","",&s,xxstring)) < 0)
  3012.       return(x);
  3013.     ckstrncpy(tmpbuf,s,TMPBUFSIZ);
  3014.     pat = tmpbuf;
  3015.     break;
  3016.   case TYP_PFX:
  3017.     if (!getval && (cmgkwflgs() & CM_ARG)) {
  3018. printf("?This switch requires an argumentn");
  3019. return(-9);
  3020.     }
  3021.     if ((x = cmfld("prefix for each line","",&s,xxstring)) < 0)
  3022.       return(x);
  3023.     if ((int)strlen(s) > 63) {
  3024. printf("?Too long - 63 maxn");
  3025. return(-9);
  3026.     }
  3027.     ckstrncpy(pfxbuf,s,64);
  3028.     prefix = brstrip(pfxbuf);
  3029.     break;
  3030. }
  3031.     } else if (cmresult.fcode == _CMIFI)
  3032.       havename = 1;
  3033.     else
  3034.       return(-2);
  3035. }
  3036. if (havename) {
  3037.     ckstrncpy(line,cmresult.sresult,LINBUFSIZ);
  3038.     y = cmresult.nresult;
  3039. } else {
  3040.     if ((x = cmifi("Filename","",&s,&y,xxstring)) < 0) {
  3041. if (x == -3) {
  3042.     printf("?Name of an existing file requiredn");
  3043.     return(-9);
  3044. } else return(x);
  3045.     }
  3046.     ckstrncpy(line,s,LINBUFSIZ);
  3047. }
  3048. if (y != 0) {
  3049.     printf("?A single file pleasen");
  3050.     return(-9);
  3051. }
  3052. if ((y = cmcfm()) < 0) /* Confirm the command */
  3053.   return(y);
  3054. if (count) paging = -1;
  3055. debug(F111,"dotype",line,paging);
  3056. return(success = dotype(line,paging,0,head,pat,width,prefix));
  3057.     }
  3058. #endif /* NOFRILLS */
  3059. #ifndef NOCSETS
  3060.     if (cx == XXXLA)  {    /* TRANSLATE <ifn> from-cs to-cs <ofn> */
  3061. #ifdef OS2ONLY
  3062.         extern int tt_font;
  3063. #endif /* OS2ONLY */
  3064. int incs, outcs;
  3065.         char * tocs = "";
  3066. if ((x = cmifi("File to translate","",&s,&y,xxstring)) < 0) {
  3067.     if (x == -3) {
  3068. printf("?Name of an existing filen");
  3069. return(-9);
  3070.     } else return(x);
  3071. }
  3072. if (y != 0) {
  3073.     printf("?A single file pleasen");
  3074.     return(-9);
  3075. }
  3076. ckstrncpy(line,s,LINBUFSIZ); /* Save copy of string just parsed. */
  3077. if ((incs = cmkey(fcstab,nfilc,"from character-set","",xxstring)) < 0)
  3078.   return(incs);
  3079. #ifdef OS2
  3080.         if (isunicode()) {
  3081.     tocs = "ucs2";
  3082.         } else {
  3083.             y = os2getcp(); /* Default is current code page */
  3084.             switch (y) {
  3085.       case 437: tocs = "cp437"; break;
  3086.       case 850: tocs = "cp850"; break;
  3087.       case 852: tocs = "cp852"; break;
  3088.       case 857: tocs = "cp857"; break;
  3089.       case 858: tocs = "cp858"; break;
  3090.       case 862: tocs = "cp862"; break;
  3091.       case 866: tocs = "cp866"; break;
  3092.       case 869: tocs = "cp869"; break;
  3093.       case 1250: tocs = "cp1250"; break;
  3094.       case 1251: tocs = "cp1251"; break;
  3095.       case 1252: tocs = "cp1252"; break;
  3096.       case 1253: tocs = "cp1253"; break;
  3097.       case 1254: tocs = "cp1254"; break;
  3098.       case 1255: tocs = "cp1255"; break;
  3099.       case 1256: tocs = "cp1256"; break;
  3100.       case 1257: tocs = "cp1257"; break;
  3101.       case 1258: tocs = "cp1258"; break;
  3102.             }
  3103.         }
  3104. #ifdef OS2ONLY
  3105. /*
  3106.    If the user has loaded a font with SET TERMINAL FONT then we want
  3107.    to change the default code page to the font that was loaded.
  3108. */
  3109. if (tt_font != TTF_ROM) {
  3110.             extern struct keytab termfont[];
  3111.             extern int ntermfont;
  3112.     for (y = 0; y < ntermfont; y++) {
  3113. if (termfont[y].kwval == tt_font) {
  3114.     tocs = termfont[y].kwd;
  3115.     break;
  3116. }
  3117.     }
  3118. }
  3119. #endif /* OS2ONLY */
  3120. #else /* OS2 */
  3121. /* Make current file char set */
  3122. for (y = 0; y <= nfilc; y++) /* be the default... */
  3123.   if (fcstab[y].kwval == fcharset) {
  3124.       tocs = fcstab[y].kwd;
  3125.       break;
  3126.   }
  3127. #endif /* OS2 */
  3128. if ((outcs = cmkey(fcstab,nfilc,"to character-set",tocs,xxstring)) < 0)
  3129.   return(outcs);
  3130. if ((x = cmofi("output file",CTTNAM,&s,xxstring)) < 0) return(x);
  3131. if (x > 1) {
  3132.     printf("?Directory name not allowedn");
  3133.     return(-9);
  3134. }
  3135. ckstrncpy(tmpbuf,s,TMPBUFSIZ);
  3136. if ((y = cmcfm()) < 0) return(y); /* Confirm the command */
  3137. return(success = xlate(line,tmpbuf,incs,outcs)); /* Execute it */
  3138.     }
  3139. #endif /* NOCSETS */
  3140.     if (cx == XXVER) { /* VERSION */
  3141. int n = 0;
  3142. extern char * ck_patch, * ck_s_test;
  3143. extern int hmtopline;
  3144. if ((y = cmcfm()) < 0)
  3145.           return(y);
  3146. printf("n%s, for%sn Numeric: %ld",versio,ckxsys,vernum);
  3147. printf("n");
  3148. n = 3;
  3149. if (*ck_s_test) {
  3150.     printf("n THIS IS A TEST VERSION, NOT FOR PRODUCTION USE.n");
  3151.     n += 2;
  3152. }
  3153. if (*ck_patch) {
  3154.     printf(" Patches: %sn", ck_patch);
  3155.     n++;
  3156. }
  3157. #ifdef OS2
  3158. printf(" Type COPYRIGHT for copyright information.nn");
  3159. shoreg();
  3160. #else
  3161. hmtopline = n+1;
  3162. hmsga(copyright);
  3163. hmtopline = 0;
  3164. #endif /* OS2 */
  3165. return(success = 1);
  3166.     }
  3167.     if (cx == XXCPR) { /* COPYRIGHT */
  3168. if ((y = cmcfm()) < 0)
  3169.           return(y);
  3170. hmsga(copyright);
  3171. return(success = 1);
  3172.     }
  3173. #ifndef MAC /* Only for multiuser systems */
  3174. #ifndef OS2
  3175. #ifndef NOFRILLS
  3176.     if (cx == XXWHO) { /* WHO */
  3177. char *wc;
  3178. #ifdef IKSD
  3179. if (inserver && !ENABLED(en_who)) {
  3180.     printf("?Sorry, WHO command disabledn");
  3181.     return(-9);
  3182. }
  3183. #endif /* IKSD */
  3184. #ifdef datageneral
  3185. if ((z = cmcfm()) < 0) return(z);
  3186. if (nopush) {
  3187.     printf("?Sorry, who not allowedn");
  3188.     return(success = 0);
  3189. }
  3190.         xsystem(WHOCMD);
  3191. #else
  3192. if ((y = cmtxt("user name","",&s,xxstring)) < 0) return(y);
  3193.         if (nopush) {
  3194.     printf("?Sorry, WHO command disabledn");
  3195.     return(success = 0);
  3196. }
  3197. if (!(wc = getenv("CK_WHO"))) wc = WHOCMD;
  3198. if (wc)
  3199.   if ((int) strlen(wc) > 0) {
  3200.       sprintf(line,"%s %s",wc,s);
  3201.       xsystem(line);
  3202.   }
  3203. #endif /* datageneral */
  3204. return(success = 1);
  3205.     }
  3206. #endif /* NOFRILLS */
  3207. #endif /* OS2 */
  3208. #endif /* MAC */
  3209. #ifndef NOFRILLS
  3210.     if (cx == XXWRI || cx == XXWRL || cx == XXWRBL) { /* WRITE */
  3211. if ((x = cmkey(writab,nwri,"to file or log","",xxstring)) < 0) {
  3212.     if (x == -3) printf("?Write to what?n");
  3213.     return(x);
  3214. }
  3215. if ((y = cmtxt("text","",&s,xxstring)) < 0) return(y);
  3216. s = brstrip(s);
  3217. switch (x) {
  3218.   case LOGD: y = ZDFILE; break;
  3219.   case LOGP: y = ZPFILE; break;
  3220. #ifndef NOLOCAL
  3221.   case LOGS: y = ZSFILE; break;
  3222. #endif /* NOLOCAL */
  3223.   case LOGT: y = ZTFILE; break;
  3224. #ifndef NOSPL
  3225.   case LOGW: y = ZWFILE; break;
  3226. #endif /* NOSPL */
  3227.   case LOGX: /* SCREEN (stdout) */
  3228.   case LOGE: /* ERROR  (stderr) */
  3229.     if (x == LOGE) {
  3230. debug(F110,
  3231.       (cx == XXWRL) ? "WRITELN ERROR" : "WRITE ERROR", s,0);
  3232. fprintf(stderr,"%s%s",s,(cx == XXWRL) ? "n" : "");
  3233.     } else {
  3234. debug(F110,
  3235.       (cx == XXWRL) ? "WRITELN SCREEN" : "WRITE SCREEN", s,0);
  3236. printf("%s%s",s,(cx == XXWRL) ? "n" : "");
  3237.     }
  3238.     return(success = 1);
  3239.   default: return(-2);
  3240. }
  3241. if (chkfn(y) > 0) {
  3242.     x = (cx == XXWRI) ? zsout(y,s) : zsoutl(y,s);
  3243.     if (x < 0) printf("?Write errorn");
  3244. } else {
  3245.     x = -1;
  3246.     printf("?File or log not openn");
  3247. }
  3248. return(success = (x == 0) ? 1 : 0);
  3249.     }
  3250. #endif /* NOFRILLS */
  3251. #ifndef NOXFER
  3252.     if (cx == XXASC || cx == XXBIN) {
  3253. if ((x = cmcfm()) < 0) return(x);
  3254. binary = (cx == XXASC) ? XYFT_T : XYFT_B;
  3255. return(success = 1);
  3256.     }
  3257. #endif /* NOXFER */
  3258.     if (cx == XXCLS) {
  3259. if ((x = cmcfm()) < 0) return(x);
  3260. y = ck_cls();
  3261. return(success = (y > -1) ? 1 : 0);
  3262.     }
  3263. #ifdef CK_MKDIR
  3264.     if (cx == XXMKDIR) {
  3265. char *p;
  3266. #ifdef IKSD
  3267. if (inserver && !ENABLED(en_mkd)) {
  3268.     printf("?Sorry, directory creation is disabledn");
  3269.     return(-9);
  3270. }
  3271. #endif /* IKSD */
  3272. if ((x = cmfld("Name for new directory","",&s,xxstring)) < 0) {
  3273.     if (x != -3) {
  3274. return(x);
  3275.     } else {
  3276. printf("?Directory name requiredn");
  3277. return(-9);
  3278.     }
  3279. }
  3280. ckstrncpy(line,s,LINBUFSIZ);
  3281. s = line;
  3282. if ((x = cmcfm()) < 0) return(x);
  3283. s = brstrip(s);
  3284. x = ckmkdir(0,s,&p,msgflg,0);
  3285. #ifdef COMMENT
  3286. if (msgflg && x == 0)
  3287.   printf("?Directory already existsn");
  3288. #endif /* COMMENT */
  3289. return(success = (x < 0) ? 0 : 1);
  3290.     }
  3291.     if (cx == XXRMDIR) { /* RMDIR */
  3292. char *p;
  3293. #ifdef IKSD
  3294. if (inserver && !ENABLED(en_rmd)) {
  3295.     printf("?Sorry, directory removal is disabledn");
  3296.     return(-9);
  3297. }
  3298. #endif /* IKSD */
  3299. if ((x = cmdir("Name of directory to be removed","",&s,xxstring)) < 0)
  3300.   return(x);
  3301. ckstrncpy(line,s,LINBUFSIZ);
  3302. s = line;
  3303. if ((x = cmcfm()) < 0) return(x);
  3304. s = brstrip(s);
  3305. x = ckmkdir(1,s,&p,msgflg,0);
  3306. return(success = (x < 0) ? 0 : 1);
  3307.     }
  3308. #endif /* CK_MKDIR */
  3309. #ifdef TCPSOCKET
  3310.     if (cx == XXTELOP) {
  3311.         if ((x = cmkey(telcmd, ntelcmd, "TELNET command", "", xxstring)) < 0 )
  3312.   return(x);
  3313.         switch (x) {
  3314.           case WILL:
  3315.           case WONT:
  3316.           case DO:
  3317.           case DONT:
  3318.             if ((y = cmkey(tnopts,ntnopts,"TELNET option","",xxstring)) < 0)
  3319.       return(y);
  3320.             if ((z = cmcfm()) < 0) return(z);
  3321.             switch (x) {
  3322.       case WILL:
  3323. if (TELOPT_UNANSWERED_WILL(y))
  3324.   return(success = 0);
  3325. break;
  3326.       case WONT:
  3327. if (TELOPT_UNANSWERED_WONT(y))
  3328.   return(success = 0);
  3329. break;
  3330.       case DO:
  3331. if (TELOPT_UNANSWERED_DO(y))
  3332.   return(success = 0);
  3333. break;
  3334.       case DONT:
  3335. if (TELOPT_UNANSWERED_DONT(y))
  3336.   return(success = 0);
  3337. break;
  3338.             }
  3339.             if (local) {
  3340. success = ((tn_sopt(x,y) > -1) ? 1 : 0);
  3341.             } else {
  3342. printf("ff%02x%02xn",x,y);
  3343. success = 1;
  3344.             }
  3345.             if (success) {
  3346. switch (x) {
  3347.   case WILL:
  3348.     TELOPT_UNANSWERED_WILL(y) = 1;
  3349.     break;
  3350.   case WONT:
  3351.     TELOPT_UNANSWERED_WONT(y) = 1;
  3352.     break;
  3353.   case DO:
  3354.     TELOPT_UNANSWERED_DO(y) = 1;
  3355.     break;
  3356.   case DONT:
  3357.     TELOPT_UNANSWERED_DONT(y) = 1;
  3358.     break;
  3359. }
  3360. if (tn_wait("XXTELOP") < 0) {
  3361.     tn_push();
  3362.     success = 0;
  3363. }
  3364.             }
  3365.             return(success);
  3366.           case SB:
  3367.             if ((y=cmkey(tnsbopts,ntnsbopts,"TELNET option","",xxstring)) < 0)
  3368.       return(y);
  3369.             switch (y) {
  3370.       case TELOPT_NAWS:
  3371. /* Some compilers require switch() to have at least 1 case */
  3372. #ifdef CK_NAWS
  3373.                 TELOPT_SB(TELOPT_NAWS).naws.x = 0;
  3374.                 TELOPT_SB(TELOPT_NAWS).naws.y = 0;
  3375.                 if (local)
  3376.   return(success = ((tn_snaws() > -1) ? 1 : 0));
  3377.                 else
  3378.   return(success = 0);
  3379.                 break;
  3380. #else
  3381. return(success = 0);
  3382. #endif /* CK_NAWS */
  3383.       default:
  3384.                 return(success = 0);
  3385.             }
  3386.             break;
  3387.   default:
  3388.             if ((z = cmcfm()) < 0) return(z);
  3389.             if (local) {
  3390.                 CHAR temp[3];
  3391.                 if (network && ttnproto == NP_TELNET) { /* TELNET */
  3392.                     temp[0] = (CHAR) IAC;
  3393.                     temp[1] = x;
  3394.                     temp[2] = NUL;
  3395.                     success = (ttol((CHAR *)temp,2) > -1 ? 1 : 0);
  3396.                     if (tn_deb || debses || deblog) {
  3397.                         sprintf(tn_msg,"TELNET SENT %s",TELCMD(x));
  3398.                         debug(F101,tn_msg,"",x);
  3399.                         if (debses || tn_deb) tn_debug(tn_msg);
  3400.                     }
  3401.                     return(success);
  3402.                 }
  3403.             } else {
  3404.                 printf("ff%02xn",x);
  3405.                 return(success = 1);
  3406.             }
  3407.         }
  3408.     }
  3409. #endif /* TCPSOCKET */
  3410. #ifndef NOPUSH
  3411.     if (cx == XXNPSH) {
  3412. if ((z = cmcfm()) < 0) return(z);
  3413.         nopush = 1;
  3414. #ifndef NOSERVER
  3415.         en_hos = 0;
  3416. #endif /* NOSERVER */
  3417. #ifdef PIPESEND
  3418. usepipes = 0;
  3419. #endif /* PIPESEND */
  3420.         return(success = 1);
  3421.     }
  3422. #endif /* NOPUSH */
  3423. #ifndef NOSPL
  3424.     if (cx == XXLOCAL) /* LOCAL variable declarations */
  3425.       return(success = dolocal());
  3426. #endif /* NOSPL */
  3427.     if (cx == XXKERMI) { /* The KERMIT command */
  3428. char * list[65];
  3429. extern char **xargv;
  3430. extern int xargc;
  3431. int i;
  3432. if ((y = cmtxt("kermit command-line arguments, -h for help",
  3433.        "",&s,xxstring)) < 0)
  3434.   return(y);
  3435. strcpy(line,"kermit ");
  3436. strncat(line,s,LINBUFSIZ-8);
  3437. xwords(line,64,list,0);
  3438. for (i = 1; i < 64; i++) {
  3439.     if (!list[i])
  3440.       break;
  3441. }
  3442. i--;
  3443. xargc = i;
  3444. xargv = list;
  3445. xargv++;
  3446. sstate = cmdlin();
  3447. if (sstate) {
  3448.     extern int justone;
  3449.     debug(F000,"KERMIT sstate","",sstate);
  3450.     justone = 1; /* Force return to command mode */
  3451.     proto(); /* after protocol */
  3452.     return(success);
  3453. } else {
  3454.     debug(F101,"KERMIT sstate","",sstate);
  3455.     return(success = 1); /* Not exactly right, but... */
  3456. }
  3457.     }
  3458.     if (cx == XXDATE) { /* DATE command */
  3459. if ((y = cmtxt("date and/or time, or carriage return for current",
  3460.        "",&s,xxstring)) < 0)
  3461.   return(y);
  3462. s = ckcvtdate(s,1);
  3463. printf("%sn",s);
  3464. return(success = ((int)strcmp(s,"<BAD_DATE>") ? 1 : 0));
  3465.     }
  3466. #ifndef NOPUSH
  3467. #ifndef NOFRILLS
  3468.     if (cx == XXEDIT) {
  3469. char * p = NULL;
  3470. if (!editor[0]) {
  3471.     s = getenv("EDITOR");
  3472.     if (s) ckstrncpy(editor,s,CKMAXPATH);
  3473.     editor[CKMAXPATH] = NUL;
  3474.     if (!editor[0]) {
  3475. printf("?Editor not defined - use SET EDITOR to definen");
  3476. return(-9);
  3477.     }
  3478. }
  3479. ckstrncpy(tmpbuf,editfile,TMPBUFSIZ);
  3480. /*
  3481.    cmiofi() lets us parse the name of an existing file, or the name of
  3482.    a nonexistent file to be created.
  3483. */
  3484. x = cmiofi("File to edit", (char *)tmpbuf, &s, &y, xxstring);
  3485. if (x < 0) {
  3486.     if (x == -9) {
  3487. if (zchko(s) < 0) {
  3488.     printf("Can't create "%s"n",s);
  3489.     return(x);
  3490. }
  3491.     } else if (x != -3)
  3492.       return(x);
  3493. }
  3494. if (x == -3)
  3495.   tmpbuf[0] = NUL;
  3496. else {
  3497.     ckstrncpy(tmpbuf,s,TMPBUFSIZ);
  3498.     if (iswild((char *)tmpbuf)) {
  3499. printf("?A single file pleasen");
  3500. return(-9);
  3501.     }
  3502. }
  3503. if ((z = cmcfm()) < 0) return(z);
  3504. if (nopush) {
  3505.     printf("?Sorry, editing not allowedn");
  3506.     return(success = 0);
  3507. }
  3508. if (tmpbuf[0]) {
  3509. /* Get full path in case we change directories between EDIT commands */
  3510.     zfnqfp(tmpbuf, CKMAXPATH, editfile);
  3511.     editfile[CKMAXPATH] = NUL;
  3512. #ifdef OS2
  3513.             p = editfile; /* Flip the stupid slashes */
  3514.             while (*p) {
  3515.                 if (*p == '/') *p = '\';
  3516.                 p++;
  3517.             }
  3518. #endif /* OS2 */
  3519. } else
  3520.   editfile[0] = NUL;
  3521. s = line;
  3522. x = 0;
  3523. if (editopts[0]) {
  3524. #ifdef OS2
  3525.     x = ckindex("%1",(char *)editopts,0,0,1);
  3526.     if (x > 0)
  3527.       editopts[x] = 's';
  3528.     else
  3529. #endif /* OS2 */
  3530.       x = ckindex("%s",(char *)editopts,0,0,1);
  3531. }
  3532. if (x)
  3533.   sprintf(tmpbuf,editopts,editfile);
  3534. else
  3535.   sprintf(tmpbuf,"%s %s",editopts,editfile);
  3536. sprintf(s,"%s %s",editor,tmpbuf);
  3537. #ifdef OS2
  3538.         p = s + strlen(editor); /* And again with the slashes */
  3539.         while (p != s) {
  3540.             if (*p == '/') *p = '\';
  3541.             p--;
  3542.         }
  3543. #endif /* OS2 */
  3544. conres();
  3545. x = zshcmd(s);
  3546. concb((char)escape);
  3547. return(x);
  3548.     }
  3549. #endif /* NOFRILLS */
  3550. #endif /* NOPUSH */
  3551. #ifdef BROWSER /* Defined only ifndef NOPUSH */
  3552.     if (cx == XXBROWS) {
  3553. #ifdef OS2
  3554.         char * p = NULL;
  3555. #endif /* OS2 */
  3556. if (nopush) {
  3557.     printf("?Sorry, browsing not allowedn");
  3558.     return(success = 0);
  3559. }
  3560. #ifndef NT
  3561.         /* Windows lets the Shell Execute the URL if no Browser is defined */
  3562. if (!browser[0]) {
  3563.     s = getenv("BROWSER");
  3564.     if (s) ckstrncpy(browser,s,CKMAXPATH);
  3565.     browser[CKMAXPATH] = NUL;
  3566.     if (!browser[0]) {
  3567. printf("?Browser not defined - use SET BROWSER to definen");
  3568. return(-9);
  3569.     }
  3570. }
  3571. #endif /* NT */
  3572. ckstrncpy(tmpbuf,browsurl,TMPBUFSIZ);
  3573. if ((x = cmtxt("URL",(char *)browsurl,&s,xxstring)) < 0)
  3574.   return(x);
  3575. ckstrncpy(browsurl,s,4096);
  3576. s = line;
  3577. x = 0;
  3578. if (browsopts[0]) {
  3579. #ifdef OS2
  3580.     x = ckindex("%1",(char *)browsopts,0,0,1);
  3581.     if (x > 0)
  3582.       browsopts[x] = 's';
  3583.     else
  3584. #endif /* OS2 */
  3585.       x = ckindex("%s",(char *)browsopts,0,0,1);
  3586. }
  3587. if (x)
  3588.   sprintf(tmpbuf,browsopts,browsurl);
  3589. else
  3590.   sprintf(tmpbuf,"%s %s",browsopts,browsurl);
  3591. #ifdef NT
  3592.         if ( !browser[0] ) {
  3593.             return(success = Win32ShellExecute( browsurl ));
  3594.         }
  3595. #endif /* NT */
  3596. sprintf(s,"%s %s",browser,tmpbuf);
  3597. #ifdef OS2
  3598.         p = line + strlen(browser); /* Flip slashes */
  3599.         while (p != line) {
  3600.             if (*p == '/') *p = '\';
  3601.             p--;
  3602.         }
  3603. #endif /* OS2 */
  3604. conres();
  3605. x = zshcmd(s);
  3606. concb((char)escape);
  3607. return(x);
  3608.     }
  3609. #endif /* BROWSER */
  3610. #ifdef CK_TAPI
  3611.     if (cx == XXTAPI) { /* Microsoft TAPI */
  3612. return (success = dotapi());
  3613.     }
  3614. #endif /* CK_TAPI */
  3615. #ifndef NOXFER
  3616.     if (cx == XXWHERE) {
  3617. extern char * rfspec, * sfspec, * srfspec, * rrfspec;
  3618. if ((x = cmcfm()) < 0) return(x);
  3619. printf("nFile most recently...nn");
  3620. printf("  Sent:       %sn",   sfspec ? sfspec : "(none)");
  3621. if (sfspec && srfspec) {
  3622.     printf("  Stored as:  %sn",   srfspec);
  3623.     printf("n");
  3624. }
  3625. printf("  Received:   %sn",   rrfspec ? rrfspec : "(none)");
  3626. if (rfspec && rrfspec)
  3627. printf("  Stored as:  %sn",   rfspec);
  3628. printf(
  3629. "nIf the full path is not shown, then the file is probably in your currentn"
  3630.        );
  3631. printf(
  3632. "directory or your download directory (if any - SHOW FILE to find out).nn"
  3633.        );
  3634. return(success = 1);
  3635.     }
  3636. #endif /* NOXFER */
  3637. #ifdef CK_RECALL
  3638.     if (cx == XXREDO) { /* Find a previous cmd and redo it */
  3639. extern int on_recall, in_recall;
  3640. int x;
  3641. char * p;
  3642. if ((x = cmtxt(
  3643. "pattern, or first few characters of a previous command",
  3644.        "*",&s,xxstring)) < 0)
  3645.   return(x);
  3646. ckstrncpy(line,s,LINBUFSIZ);
  3647. x = strlen(s);
  3648. s = line;
  3649. if (*s == '{') { /* Braces disable adding * to end */
  3650.     if (s[x-1] == '}') {
  3651. s[x-1] = NUL;
  3652. s++;
  3653. x--;
  3654.     }
  3655. } else { /* No braces, add * to end. */
  3656.     s[x] = '*';
  3657.     s[x+1] = NUL;
  3658. }
  3659. while (x > 0 && s[x] == '*' && s[x-1] == '*') s[x--] = NUL;
  3660. if (!on_recall || !in_recall) {
  3661.     printf("?Sorry, command recall can't be used now.n");
  3662.     return(-9);
  3663. }
  3664. if (p = cmgetcmd(s)) { /* Look for it history buffer */
  3665.     sprintf(cmdbuf,"%s%c",p,'r'); /* Found - copy to command buffer */
  3666.     cmaddnext(); /* Force re-add to history buffer */
  3667.     return(cmflgs = -1); /* Force reparse */
  3668. } else {
  3669.     printf("?Sorry - "%s" not foundn", s);
  3670.     return(-9);
  3671. }
  3672.     }
  3673. #endif /* CK_RECALL */
  3674. /* This is useless unless user is root.  Too bad, it's just what we need. */
  3675. #ifdef COMMENT
  3676.     if (cx == XXCHRT) { /* Change root directory */
  3677. #ifdef UNIX
  3678. if ((x = cmdir("Name of new root directory","",&s,xxstring)) < 0)
  3679.   return(x);
  3680. ckstrncpy(line,s,LINBUFSIZ);
  3681. s = line;
  3682. if ((x = cmcfm()) < 0) return(x);
  3683. s = brstrip(s);
  3684. priv_on(); /* This doesn't work if setuid root */
  3685. x = chroot(s); /* See priv_ini() in ckutio.c. */
  3686. priv_off();
  3687. if (x) {
  3688.     printf("Error %dn",errno); /* 1 = EPERM (i.e. "not root") */
  3689.     perror("chroot");
  3690.     return(success = 0);
  3691. }
  3692. return(success = zchdir(s));
  3693. #else
  3694. printf("?Sorry, not implementedn");
  3695. return(-9);
  3696. #endif /* UNIX */
  3697.     }
  3698. #endif /* COMMENT */
  3699. #ifdef CK_KERBEROS
  3700.     if (cx == XXAUTH) { /* KERBEROS */
  3701. x = cp_auth(); /* Parse it */
  3702. if (x < 0) /* Pass parse errors back */
  3703.   return(x);
  3704. #ifdef IKSD
  3705.         if (inserver) {
  3706.             printf("?Command disabled in IKSD.rn");
  3707.             return(success = 0);
  3708.         }
  3709. #endif /* IKSD */
  3710. return(success = doauth(cx));
  3711.     }
  3712. #endif /* CK_KERBEROS */
  3713. #ifndef NOLOCAL
  3714.     if (cx == XXTERM) {
  3715. return(settrmtyp());
  3716.     }
  3717. #endif /* NOLOCAL */
  3718.     if (cx == XXSTATUS) {
  3719. if ((x = cmcfm()) < 0) return(x);
  3720. printf( " %sn", success ? "SUCCESS" : "FAILURE" );
  3721. return(0); /* Don't change it */
  3722.     }
  3723.     if (cx == XXFAIL) {
  3724. if ((x = cmcfm()) < 0) return(x);
  3725. return(success = 0);
  3726.     }
  3727.     if (cx == XXSUCC) {
  3728. if ((x = cmcfm()) < 0) return(x);
  3729. return(success = 1);
  3730.     }
  3731.     if (cx == XXNLCL) {
  3732. extern int nolocal;
  3733. if ((x = cmcfm()) < 0) return(x);
  3734. nolocal = 1;
  3735. return(success = 1);
  3736.     }
  3737. #ifndef NOXFER
  3738.     if (cx == XXRASG) /* Shortcuts for REMOTE commands */
  3739.       return(dormt(XZASG));
  3740.     if (cx == XXRCWD)
  3741.       return(dormt(XZCWD));
  3742.     if (cx == XXRCPY)
  3743.       return(dormt(XZCPY));
  3744.     if (cx == XXRDEL)
  3745.       return(dormt(XZDEL));
  3746.     if (cx == XXRDIR)
  3747.       return(dormt(XZDIR));
  3748.     if (cx == XXRXIT)
  3749.       return(dormt(XZXIT));
  3750.     if (cx == XXRHLP)
  3751.       return(dormt(XZHLP));
  3752.     if (cx == XXRHOS)
  3753.       return(dormt(XZHOS));
  3754.     if (cx == XXRKER)
  3755.       return(dormt(XZKER));
  3756.     if (cx == XXRPWD)
  3757.       return(dormt(XZPWD));
  3758.     if (cx == XXRQUE)
  3759.       return(dormt(XZQUE));
  3760.     if (cx == XXRREN)
  3761.       return(dormt(XZREN));
  3762.     if (cx == XXRMKD)
  3763.       return(dormt(XZMKD));
  3764.     if (cx == XXRRMD)
  3765.       return(dormt(XZRMD));
  3766.     if (cx == XXRSET)
  3767.       return(dormt(XZSET));
  3768.     if (cx == XXRSPA)
  3769.       return(dormt(XZSPA));
  3770.     if (cx == XXRTYP)
  3771.       return(dormt(XZTYP));
  3772.     if (cx == XXRWHO)
  3773.       return(dormt(XZWHO));
  3774. #endif /* NOXFER */
  3775.     if (cx == XXRESET) { /* RESET */
  3776. if ((x = cmcfm()) < 0)
  3777.   return(x);
  3778. doclean(0); /* Close all files */
  3779. return(success = 1);
  3780.     }
  3781. #ifndef NOXFER
  3782. #ifndef NOCSETS
  3783.     if (cx == XXASSOC) { /* ASSOCIATE */
  3784. extern struct keytab tcstab[];
  3785. extern int ntcs;
  3786.         if ((x = cmkey(assoctab, nassoc, "", "", xxstring)) < 0 )
  3787.   return(x);
  3788. switch (x) { /* Associate what? */
  3789.   case ASSOC_TC: /* Transfer character-set... */
  3790.     if ((x = cmkey(tcstab, ntcs,
  3791.    "transfer character-set name","",xxstring)) < 0)
  3792.       return(x);
  3793.     if ((y = cmkey(fcstab, nfilc,
  3794.    "with file character-set","", xxstring)) < 0)
  3795.       if (y != -3)
  3796. return(y);
  3797.     if ((z = cmcfm()) < 0)
  3798.       return(z);
  3799.     axcset[x] = y;
  3800.     return(success = 1);
  3801.   case ASSOC_FC: /* File character-set... */
  3802.     if ((x = cmkey(fcstab, nfilc,
  3803.    "file character-set name","",xxstring)) < 0)
  3804.       return(x);
  3805.     if ((y = cmkey(tcstab, ntcs,
  3806.    "with transfer character-set","", xxstring)) < 0)
  3807.       if (y != -3)
  3808. return(y);
  3809.     if ((z = cmcfm()) < 0)
  3810.       return(z);
  3811.     afcset[x] = y;
  3812.     return(success = 1);
  3813.   default:
  3814.     return(-2);
  3815. }
  3816.     }
  3817. #endif /* NOCSETS */
  3818. #endif /* NOXFER */
  3819. #ifndef NOSPL
  3820.     if (cx == XXSHIFT) { /* SHIFT */
  3821. if ((y = cmnum("Number of arguments to shift","1",10,&x,xxstring)) < 0)
  3822.   return(y);
  3823. if ((z = cmcfm()) < 0)
  3824.   return(z);
  3825. return(success = doshift(x));
  3826.     }
  3827. #endif /* NOSPL */
  3828. #ifndef NOHELP
  3829.     if (cx == XXMAN) {
  3830. #ifdef OS2
  3831. if ((x = cmcfm()) < 0)
  3832.   return(x);
  3833. if (nopush) {
  3834.     printf("?Sorry, access to system commands is disabled.n");
  3835.     return(-9);
  3836. }
  3837.         y = mxlook(mactab,"manual",nmac);
  3838.         if (y > -1) {
  3839.             z = maclvl; /* save the current maclvl */
  3840.             dodo(y,NULL,cmdstk[cmdlvl].ccflgs); /* Run the macro */
  3841.             while (maclvl > z) {
  3842.                 debug(F101,"XXMAN loop maclvl 1","",maclvl);
  3843.                 sstate = (CHAR) parser(1);
  3844.                 debug(F101,"XXMAN loop maclvl 2","",maclvl);
  3845.                 if (sstate) proto();
  3846.             }
  3847.             debug(F101,"XXMAN loop exit maclvl","",maclvl);
  3848.             return(success);
  3849.         }
  3850.         return(success = 0);
  3851. #else
  3852. if ((x = cmtxt(
  3853. #ifdef UNIX
  3854.     "Carriage return to confirm the command, or manual topic",
  3855. #else
  3856.     "Carriage return to confirm the command, or help topic",
  3857. #endif /* UNIX */
  3858.        "kermit",
  3859.        &s,
  3860.        xxstring
  3861.        )
  3862.      ) < 0)
  3863.   return(x);
  3864. #endif /* OS2 */
  3865. #ifdef UNIX
  3866. sprintf(tmpbuf,"man %s",s);
  3867. #else
  3868. sprintf(tmpbuf,"help %s",s);
  3869. #endif /* UNIX */
  3870. debug(F110,"MANUAL",tmpbuf,0);
  3871. if (nopush) {
  3872.     printf("?Sorry, access to system commands is disabled.n");
  3873.     return(-9);
  3874. } else {
  3875.     conres(); /* Restore the console */
  3876.     success = zshcmd(tmpbuf);
  3877.     concb((char)escape); /* Restore CBREAK mode */
  3878.     return(success);
  3879. }
  3880.     }
  3881. #endif /* NOHELP */
  3882. #ifndef NOSPL
  3883.     if (cx == XXSORT) /* SORT an array */
  3884.       return(dosort());
  3885. #endif /* NOSPL */
  3886.     if (cx == XXPURGE) {
  3887. #ifdef IKSD
  3888. if (inserver && (!ENABLED(en_del)
  3889. #ifdef CK_LOGIN
  3890.                           || isguest
  3891. #endif /* CK_LOGIN */
  3892.  )) {
  3893.     printf("?Sorry, DELETE is disabledn");
  3894.     return(-9);
  3895. }
  3896. #endif /* IKSD */
  3897. #ifdef CK_APC
  3898. if (apcactive == APC_LOCAL ||
  3899.         apcactive == APC_REMOTE && apcstatus != APC_UNCH) return(success = 0);
  3900. #endif /* CK_APC */
  3901. #ifdef CKPURGE
  3902.         return(dopurge());
  3903. #else
  3904. #ifdef VMS
  3905. if ((x = cmtxt("optional switches followed by filespec",
  3906.        "",&s,xxstring)) < 0)
  3907.   return(x);
  3908. if (nopush) {
  3909.     printf("?Sorry, DCL access is disabledn");
  3910.     return(-9);
  3911. }
  3912. ckstrncpy(line,s,LINBUFSIZ);
  3913. s = line;
  3914. x = mlook(mactab,"purge",nmac);
  3915. return(success = dodo(x,s,cmdstk[cmdlvl].ccflgs));
  3916. #else
  3917. return(-2);
  3918. #endif /* VMS */
  3919. #endif /* CKPURGE */
  3920.     }
  3921. #ifndef NOSPL
  3922.     if (cx == XXFAST) {
  3923. if ((x = cmcfm()) < 0) return(x);
  3924. x = mlook(mactab,"fast",nmac);
  3925. return(success = dodo(x,NULL,cmdstk[cmdlvl].ccflgs));
  3926.     }
  3927.     if (cx == XXCAU) {
  3928. if ((x = cmcfm()) < 0) return(x);
  3929. x = mlook(mactab,"cautious",nmac);
  3930. return(success = dodo(x,NULL,cmdstk[cmdlvl].ccflgs));
  3931.     }
  3932.     if (cx == XXROB) {
  3933. if ((x = cmcfm()) < 0) return(x);
  3934. x = mlook(mactab,"robust",nmac);
  3935. return(success = dodo(x,NULL,cmdstk[cmdlvl].ccflgs));
  3936.     }
  3937. #endif /* NOSPL */
  3938.     if (cx == XXSCRN) { /* SCREEN */
  3939. int row, col;
  3940. if ((x = cmkey(scntab, nscntab,"screen action","", xxstring)) < 0)
  3941.   return(x);
  3942. switch (x) { /* MOVE-TO (cursor position) */
  3943.   case SCN_MOV:
  3944.     if ((y = cmnum("Row (1-based)","",10,&z,xxstring)) < 0)
  3945.       return(y);
  3946.     row = z;
  3947.     y = cmnum("Column (1-based)","1",10,&z,xxstring);
  3948.     if (y < 0)
  3949.       return(y);
  3950.     col = z;
  3951.     if ((y = cmcfm()) < 0)
  3952.       return(y);
  3953.     if (row < 0 || col < 0) {
  3954. printf("?Row and Column must be 1 or greatern");
  3955. return(-9);
  3956.     }
  3957.     if (cmd_rows > 0 && row > cmd_rows)
  3958.       row = cmd_rows;
  3959.     if (cmd_cols > 0 && col > cmd_cols)
  3960.       col = cmd_cols;
  3961.     y = ck_curpos(row,col);
  3962.     return(success = (y > -1) ? 1 : 0);
  3963.   case SCN_CLR: /* CLEAR */
  3964.     if ((y = cmcfm()) < 0)
  3965.       return(y);
  3966.     debug(F100,"screen calling ck_cls()","",0);
  3967.     y = ck_cls();
  3968.     return(success = (y > -1) ? 1 : 0);
  3969.   case SCN_CLE: /* CLEOL */
  3970.     if ((y = cmcfm()) < 0)
  3971.       return(y);
  3972.     y = ck_cleol();
  3973.     return(success = (y > -1) ? 1 : 0);
  3974. }
  3975.     }
  3976. #ifndef NOHTTP
  3977. #ifdef TCPSOCKET
  3978.     if (cx == XXHTTP) { /* HTTP */
  3979. struct FDB sw, kw, fi;
  3980. int n, getval;
  3981. char c, * p;
  3982. char * http_agent = NULL; /* Parse results */
  3983. char * http_hdr   = NULL;
  3984. char * http_user  = NULL;
  3985. char * http_pass  = NULL;
  3986. char * http_mime  = NULL;
  3987. char * http_lfile = NULL;
  3988. char * http_rfile = NULL;
  3989. char http_array = NUL;
  3990. int http_action = -1;
  3991. #ifdef OS2
  3992. p = "Kermit 95"; /* Default user agent */
  3993. #else
  3994. p = "C-Kermit";
  3995. #endif /* OS2 */
  3996. makestr(&http_agent,p);
  3997. makestr(&http_mime,"text/HTML"); /* MIME type default */
  3998. cmfdbi(&sw, /* 1st FDB - general switches */
  3999.    _CMKEY, /* fcode */
  4000.    "GET, HEAD, PUT, INDEX, or POST,n or switch", /* hlpmsg */
  4001.    "", /* default */
  4002.    "", /* addtl string data */
  4003.    nhttpswtab, /* addtl numeric data 1: tbl size */
  4004.    4, /* addtl numeric data 2: 4 = cmswi */
  4005.    xxstring, /* Processing function */
  4006.    httpswtab, /* Keyword table */
  4007.    &kw /* Pointer to next FDB */
  4008.    );
  4009. cmfdbi(&kw, /* 2nd FDB - commands */
  4010.    _CMKEY, /* fcode */
  4011.    "Command", /* hlpmsg */
  4012.    "", /* default */
  4013.    "", /* addtl string data */
  4014.    nhttptab, /* addtl numeric data 1: tbl size */
  4015.    0, /* addtl numeric data 2: 0 = keyword */
  4016.    xxstring, /* Processing function */
  4017.    httptab, /* Keyword table */
  4018.    NULL /* Pointer to next FDB */
  4019.    );
  4020. while (1) {
  4021.     x = cmfdb(&sw); /* Parse something */
  4022.     if (x < 0) /* Error */
  4023.       goto xhttp;
  4024.     n = cmresult.nresult;
  4025.     if (cmresult.fdbaddr == &kw) /* Command - exit this loop */
  4026.       break;
  4027.     c = cmgbrk(); /* Switch... */
  4028.     getval = (c == ':' || c == '=');
  4029.     if (getval && !(cmgkwflgs() & CM_ARG)) {
  4030. printf("?This switch does not take an argumentn");
  4031. x = -9;
  4032. goto xhttp;
  4033.     }
  4034.     switch (cmresult.nresult) { /* Handle each switch */
  4035.       case HT_SW_AG: /* /AGENT */
  4036. if (getval) {
  4037.     if ((x = cmfld("User agent",p,&s,xxstring)) < 0)
  4038.       goto xhttp;
  4039. } else
  4040.   s = p;
  4041. makestr(&http_agent,s);
  4042. break;
  4043.       case HT_SW_HD: /* /HEADER */
  4044. s = NULL;
  4045. if (getval) {
  4046.     if ((x = cmfld("Header line","",&s,xxstring)) < 0) {
  4047. if (x == -3)
  4048.   s = NULL;
  4049. else
  4050.   goto xhttp;
  4051.     }
  4052. }
  4053. makestr(&http_hdr,s);
  4054. break;
  4055.       case HT_SW_US: /* /USER */
  4056. s = NULL;
  4057. if (getval) {
  4058.     if ((x = cmfld("User ID","",&s,xxstring)) < 0)
  4059.       goto xhttp;
  4060. }
  4061. makestr(&http_user,s);
  4062. break;
  4063.       case HT_SW_PW: /* /PASSWORD */
  4064. s = NULL;
  4065. if (getval) {
  4066.     if ((x = cmfld("Password","",&s,xxstring)) < 0)
  4067.       goto xhttp;
  4068. }
  4069. makestr(&http_pass,s);
  4070. break;
  4071. #ifndef NOSPL
  4072.       case HT_SW_AR: { /* /ARRAY: */
  4073.   char * s2, array = NUL;
  4074.   if (!getval) {
  4075.       printf("?This switch requires an argumentn");
  4076.       x = -9;
  4077.       goto xhttp;
  4078.   }
  4079.   if ((x = cmfld("Array name (a single letter will do)",
  4080.  "",
  4081.  &s,
  4082.  NULL
  4083.  )) < 0) {
  4084.       if (x == -3) {
  4085.   printf("?Array name requiredn");
  4086.   x = -9;
  4087.   goto xhttp;
  4088.       } else
  4089. goto xhttp;
  4090.   }
  4091.   if (!*s) {
  4092.       printf("?Array name requiredn");
  4093.       x = -9;
  4094.       goto xhttp;
  4095.   }
  4096.   s2 = s;
  4097.   if (*s == CMDQ) s++;
  4098.   if (*s == '&') s++;
  4099.   if (!isalpha(*s)) {
  4100.       printf("?Bad array name - "%s"n",s2);
  4101.       x = -9;
  4102.       goto xhttp;
  4103.   }
  4104.   array = *s++;
  4105.   if (isupper(array))
  4106.     array = tolower(array);
  4107.   if (*s && (*s != '[' || *(s+1) != ']')) {
  4108.       printf("?Bad array name - "%s"n",s2);
  4109.       http_array = NUL;
  4110.       x = -9;
  4111.       goto xhttp;
  4112.   }
  4113.   http_array = array;
  4114.   break;
  4115.       }
  4116. #endif /* NOSPL */
  4117.       default:
  4118. x = -2;
  4119. goto xhttp;
  4120.     }
  4121. }
  4122. http_action = n; /* Save the action */
  4123. if (http_action == HTTP_PUT || http_action == HTTP_POS) {
  4124.     cmfdbi(&sw, /* 1st FDB - switch */
  4125.    _CMKEY, /* fcode */
  4126.    "Local filenamen Or switch", /* help */
  4127.    "", /* default */
  4128.    "", /* addtl string data */
  4129.    nhttpptab, /* keyword table size */
  4130.    4, /* addtl numeric data 2: 4 = cmswi */
  4131.    xxstring, /* Processing function */
  4132.    httpptab, /* Keyword table */
  4133.    &fi /* Pointer to next FDB */
  4134.    );
  4135.     cmfdbi(&fi, /* 2nd FDB - filename */
  4136.    _CMIFI, /* fcode */
  4137.    "Local filename", /* hlpmsg */
  4138.    "", /* default */
  4139.    "", /* addtl string data */
  4140.    0, /* addtl numeric data 1 */
  4141.    0, /* addtl numeric data 2 */
  4142.    xxstring,
  4143.    NULL,
  4144.    NULL
  4145.    );
  4146.     while (1) {
  4147. x = cmfdb(&sw);
  4148. if (x < 0)
  4149.   goto xhttp; /* Free any malloc'd temp strings */
  4150. n = cmresult.nresult;
  4151. if (cmresult.fcode != _CMKEY)
  4152.   break;
  4153. c = cmgbrk(); /* Switch... */
  4154. getval = (c == ':' || c == '=');
  4155. if (getval && !(cmgkwflgs() & CM_ARG)) {
  4156.     printf("?This switch does not take an argumentn");
  4157.     x = -9;
  4158.     goto xhttp;
  4159. }
  4160. switch (n) {
  4161.   case HT_PP_MT:
  4162.     s = "text/HTML";
  4163.     if (getval) {
  4164. if ((x = cmfld("MIME type",
  4165.        "text/HTML",&s,xxstring)) < 0)
  4166.   goto xhttp;
  4167.     }
  4168.     makestr(&http_mime,s);
  4169.     break;
  4170.   default:
  4171.     x = -2;
  4172.     goto xhttp;
  4173. }
  4174.     }
  4175.     makestr(&http_lfile,cmresult.sresult);
  4176.     if ((x = cmtxt("Remote filename","",&s,xxstring)) < 0)
  4177.       goto xhttp;
  4178.     if (!*s) s = http_lfile;
  4179.     makestr(&http_rfile,s);
  4180. }
  4181. switch (http_action) {
  4182.           case HTTP_DEL:                /* DELETE */
  4183.     if ((x = cmfld("Remote source file","",&s,xxstring)) < 0)
  4184.       goto xhttp;
  4185.     makestr(&http_rfile,s);
  4186.             break;
  4187.           case HTTP_HED:                /* HEAD */
  4188.               if ((x = cmfld("Remote source file","",&s,xxstring)) < 0)
  4189.                 goto xhttp;
  4190.               makestr(&http_rfile,s);
  4191.               n = ckindex("/",http_rfile,-1,1,0);
  4192.               if ( n )
  4193.                   p = &http_rfile[n];
  4194.               else
  4195.                   p = http_rfile;
  4196.               if ((x = cmofi("Local filename",p,&s,xxstring)) < 0)
  4197.                 goto xhttp;
  4198.               makestr(&http_lfile,s);
  4199.               break;
  4200.           case HTTP_GET: /* GET */
  4201.           case HTTP_IDX:                /* INDEX */
  4202.     if ((x = cmfld("Remote source file","",&s,xxstring)) < 0)
  4203.       goto xhttp;
  4204.     makestr(&http_rfile,s);
  4205.     if ((x = cmofi("Local filename","",&s,xxstring)) < 0)
  4206.               if (x != -3)
  4207.                 goto xhttp;
  4208.     makestr(&http_lfile,s);
  4209.     break;
  4210. }
  4211. if ((x = cmcfm()) < 0)
  4212.   goto xhttp;
  4213. x = dohttp(http_action,
  4214.    http_lfile,
  4215.    http_rfile,
  4216.    http_agent,
  4217.    http_hdr,
  4218.    http_user,
  4219.    http_pass,
  4220.    http_mime,
  4221.    http_array
  4222.    );
  4223.       xhttp:
  4224. if (http_agent) free(http_agent);
  4225. if (http_hdr)   free(http_hdr);
  4226. if (http_user)  free(http_user);
  4227. if (http_pass)  free(http_pass);
  4228. if (http_mime)  free(http_mime);
  4229. if (http_lfile) free(http_lfile);
  4230. if (http_rfile) free(http_rfile);
  4231. if (x > -1)
  4232.   success = x;
  4233. return(x);
  4234.     }
  4235. #endif /* TCPSOCKET */
  4236. #endif /* NOHTTP */
  4237. #ifndef NOSPL
  4238.     if (cx == XXARRAY) { /* ARRAY */
  4239. #ifndef NOSHOW
  4240. extern int showarray();
  4241. #endif /* NOSHOW */
  4242. if ((x = cmkey(arraytab, narraytab,"Array operation","",xxstring)) < 0)
  4243.   return(x);
  4244. switch (x) {
  4245.   case ARR_DCL:
  4246.     return(dodcl());
  4247.   case ARR_SRT:
  4248.     return(dosort());
  4249. #ifndef NOSHOW
  4250.   case ARR_SHO:
  4251.     return(showarray());
  4252. #endif /* NOSHOW */
  4253.   case ARR_CPY:
  4254.     return(copyarray());
  4255.   case ARR_SET:
  4256.   case ARR_CLR:
  4257.     return(clrarray(x));
  4258.   case ARR_DST:
  4259.     return(unarray());
  4260.   case ARR_RSZ:
  4261.     return(rszarray());
  4262.   default:
  4263.     printf("?Sorry, not implemented yet - "%s"n",cmdbuf);
  4264.     return(-9);
  4265. }
  4266.     }
  4267.     if (cx == XXTRACE) {
  4268. int on = 1;
  4269. struct FDB sw, kw;
  4270. cmfdbi(&sw, /* 1st FDB - switch */
  4271.        _CMKEY, /* fcode */
  4272.        "Trace object;n Or switch", /* help */
  4273.        "", /* default */
  4274.        "", /* addtl string data */
  4275.        2, /* keyword table size */
  4276.        4, /* addtl numeric data 2: 4 = cmswi */
  4277.        xxstring, /* Processing function */
  4278.        onoffsw, /* Keyword table */
  4279.        &kw /* Pointer to next FDB */
  4280.        );
  4281. cmfdbi(&kw, /* 2nd FDB - Trace object */
  4282.        _CMKEY, /* fcode */
  4283.        "Trace object", /* help */
  4284.        "all", /* default */
  4285.        "", /* addtl string data */
  4286.        ntracetab, /* keyword table size */
  4287.        0, /* addtl numeric data 2: 0 = keyword */
  4288.        xxstring, /* Processing function */
  4289.        tracetab, /* Keyword table */
  4290.        NULL /* Pointer to next FDB */
  4291.        );
  4292. if ((x = cmfdb(&sw)) < 0)
  4293.   return(x);
  4294. if (cmresult.fdbaddr == &sw) {
  4295.     on = cmresult.nresult;
  4296.     if ((x = cmkey(tracetab, ntracetab,"","all",xxstring)) < 0)
  4297.       return(x);
  4298. } else {
  4299.     x = cmresult.nresult;
  4300. }
  4301. if ((y = cmcfm()) < 0)
  4302.   return(y);
  4303. switch (x) {
  4304.   case TRA_ASG:
  4305.     tra_asg = on;
  4306.     break;
  4307.   case TRA_CMD:
  4308.     tra_cmd = on;
  4309.     break;
  4310.   case TRA_ALL:
  4311.     tra_asg = on;
  4312.     tra_cmd = on;
  4313.     break;
  4314.   default:
  4315.     return(-2);
  4316. }
  4317. printf("TRACE %sn", on ? "ON" : "OFF");
  4318. return(success = 1);
  4319.     }
  4320.     if (cx == XXNOTAV) { /* Command in table not available */
  4321. ckstrncpy(tmpbuf,atmbuf,TMPBUFSIZ);
  4322. if ((x = cmtxt("Rest of command","",&s,NULL)) < 0)
  4323.   return(x);
  4324. printf("Sorry, "%s" not configured in this version of Kermit.n",
  4325.        tmpbuf
  4326.        );
  4327. return(success = 0);
  4328.     }
  4329. #endif /* NOSPL */
  4330.     return(-2); /* None of the above */
  4331. } /* end of docmd() */
  4332. #endif /* NOICP */