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

通讯/手机编程

开发平台:

Windows_Unix

  1. x = cmfdb(&sw); /* Parse switch or other thing */
  2. debug(F101,"setprinter cmfdb","",x);
  3. if (x < 0) /* Error */
  4.   goto xsetprn; /* or reparse needed */
  5. if (cmresult.fcode != _CMKEY) /* Break out if not a switch */
  6.   break;
  7. if (cmresult.fdbaddr != &sw) /* Advanced usage :-) */
  8.   break;
  9. c = cmgbrk(); /* Get break character */
  10. getval = (c == ':' || c == '='); /* to see how they ended the switch */
  11. n = cmresult.nresult; /* Numeric result = switch value */
  12. debug(F101,"setprinter switch","",n);
  13. switch (n) { /* Process the switch */
  14.   case PRN_PS:                  /* Text to Postscript */
  15.             pv[PRN_PS].ival = 1;
  16.     pv[PRN_BID].ival = 0;
  17.     pv[PRN_OUT].ival = 1;
  18.             pv[PRN_RAW].ival = 0;
  19.             break;
  20.   case PRN_RAW: /* Non-Postscript */
  21.             pv[PRN_PS].ival = 0;
  22.             pv[PRN_RAW].ival = 1;
  23.             break;
  24.   case PRN_BID: /* Bidirectional */
  25.     pv[PRN_BID].ival = 1;
  26.     pv[PRN_OUT].ival = 0;
  27.             pv[PRN_PS].ival = 0;
  28.             pv[PRN_RAW].ival = 1;
  29.     break;
  30.   case PRN_OUT: /* Output-only */
  31.     pv[PRN_OUT].ival = 1;
  32.     pv[PRN_BID].ival = 0;
  33.             pv[PRN_PS].ival = 0;
  34.             pv[PRN_RAW].ival = 1;
  35.     break;
  36.   case PRN_NON: /* NONE */
  37.     pv[n].ival = 1;
  38.     pv[PRN_SPD].ival = 0;
  39.     pv[PRN_PAR].ival = 0;
  40.     pv[PRN_FLO].ival = FLO_KEEP;
  41.     break;
  42. #ifdef UNIX
  43.   case PRN_WIN:
  44. #endif /* UNIX */
  45.   case PRN_DOS: /* DOS printer name */
  46.   case PRN_FIL: /* Or filename */
  47.   case PRN_PIP:
  48.     if (pv[n].sval) free(pv[n].sval);
  49.     pv[n].sval = NULL;
  50.     pv[PRN_NON].ival = 0; /* Zero any previous selections */
  51.     pv[PRN_WIN].ival = 0;
  52.     pv[PRN_DOS].ival = 0;
  53.     pv[PRN_FIL].ival = 0;
  54.     pv[PRN_PIP].ival = 0;
  55.     pv[n].ival = 1; /* Flag this one */
  56.     if (!getval) break; /* No value wanted */
  57.     if (n == PRN_FIL) { /* File, check accessibility */
  58. int wild = 0;
  59. if ((x = cmiofi("Filename","kermit.prn",&s,&wild,xxstring))< 0)
  60.   if (x == -9) {
  61.       if (zchko(s) < 0) {
  62.   printf("Can't create "%s"n",s);
  63.   return(x);
  64.       }
  65.   } else goto xsetprn;
  66. if (iswild(s)) {
  67.     printf("?A single file pleasen");
  68.     return(-9);
  69. }
  70.                 pv[PRN_SPD].ival = 0;
  71.                 pv[PRN_PAR].ival = 0;
  72.                 pv[PRN_FLO].ival = FLO_KEEP;
  73.     } else if ((x = cmfld(n == PRN_DOS ? /* Value wanted - parse it */
  74.    "DOS printer device name" : /* Help message */
  75.    (n == PRN_PIP ?
  76.    "Program name" :
  77.    "Filename"),
  78.    n == PRN_DOS ?
  79.    "PRN" : /* Default */
  80.    "",
  81.    &s,
  82.    xxstring
  83.    )) < 0)
  84.       goto xsetprn;
  85.     s = brstrip(s); /* Strip enclosing braces */
  86.     while (*s == SP) /* Strip leading blanks */
  87.       s++;
  88.     if (n == PRN_PIP) { /* If /PIPE: */
  89. if (*s == '|') { /* strip any extraneous pipe sign */
  90.     s++;
  91.     while (*s == SP)
  92.       s++;
  93. }
  94.                 pv[PRN_SPD].ival = 0;
  95.                 pv[PRN_PAR].ival = 0;
  96.                 pv[PRN_FLO].ival = FLO_KEEP;
  97.     }
  98.     if ((y = strlen(s)) > 0) /* Anything left? */
  99.       if (pv[n].sval = (char *) malloc(y+1)) /* Yes, keep it */
  100. strcpy(pv[n].sval,s);
  101.     break;
  102. #ifdef NT
  103.   case PRN_WIN: /* Windows queue name */
  104.     if (pv[n].sval) free(pv[n].sval);
  105.     pv[n].sval = NULL;
  106.     pv[PRN_NON].ival = 0;
  107.     pv[PRN_DOS].ival = 0;
  108.     pv[PRN_FIL].ival = 0;
  109.     pv[n].ival = 1;
  110.             pv[PRN_SPD].ival = 0;
  111.             pv[PRN_PAR].ival = 0;
  112.             pv[PRN_FLO].ival = FLO_KEEP;
  113.     if (!getval || !haveque)
  114.       break;
  115.     if ((x = cmkey(_printtab,nprint,"Print queue name",
  116.    _printtab[printdef].kwd,xxstring)) < 0) {
  117. if (x != -2)
  118.   goto xsetprn;
  119. if (pv[PRN_WIN].sval) free(pv[PRN_WIN].sval);
  120. s = atmbuf;
  121. if ((y = strlen(s)) > 0)
  122.   if (pv[n].sval = (char *)malloc(y+1))
  123.     strcpy(pv[n].sval,s);
  124.     } else {
  125. if (pv[PRN_WIN].sval) free(pv[PRN_WIN].sval);
  126. s = printtab[x].kwd;
  127. if ((y = strlen(s)) > 0)
  128.   if (pv[n].sval = (char *)malloc(y+1))
  129.     strcpy(pv[n].sval,s);
  130.     }
  131.     break;
  132. #endif /* NT */
  133.   case PRN_SEP: /* /JOB-HEADER (separator) */
  134.     if (pv[n].sval) free(pv[n].sval);
  135.     pv[n].sval = NULL;
  136.     pv[n].ival = 1;
  137.     if (!getval) break;
  138.     if ((x = cmifi("Filename","",&s,&y,xxstring)) < 0)
  139.       goto xsetprn;
  140.     if (y) {
  141. printf("?Wildcards not allowedn");
  142. x = -9;
  143. goto xsetprn;
  144.     }
  145.     if ((y = strlen(s)) > 0)
  146.       if (pv[n].sval = (char *) malloc(y+1))
  147. strcpy(pv[n].sval,s);
  148.     break;
  149.   case PRN_TMO: /* /TIMEOUT:number */
  150.     pv[n].ival = 0;
  151.     if (!getval) break;
  152.     if ((x = cmnum("Seconds","0",10,&y,xxstring)) < 0)
  153.       goto xsetprn;
  154.     if (y > 999) {
  155. printf("?Sorry - 999 is the maximumn");
  156. x = -9;
  157. goto xsetprn;
  158.     } else
  159.       pv[n].ival = y;
  160.     break;
  161.   case PRN_TRM: /* /END-OF-JOB:string */
  162.     if (pv[n].sval) free(pv[n].sval);
  163.     pv[n].sval = NULL;
  164.     pv[n].ival = 1;
  165.     if (!getval) break;
  166.     if ((x = cmfld("String (enclose in braces if it contains spaces)",
  167.    "",&s,xxstring)) < 0)
  168.       goto xsetprn;
  169.     s = brstrip(s);
  170.     if ((y = strlen(s)) > 0)
  171.       if (pv[n].sval = (char *) malloc(y+1))
  172. strcpy(pv[n].sval,s);
  173.     break;
  174. #ifdef BPRINT
  175.   case PRN_FLO:
  176.     if (!getval) break;
  177.     if ((x = cmkey(flotab,nflo,
  178.       "Serial printer-port flow control",
  179.       "rts/cts",xxstring)) < 0)
  180.       goto xsetprn;
  181.     pv[n].ival = x;
  182.     break;
  183. #ifndef NOLOCAL
  184.   case PRN_SPD:
  185.     if (!getval) break;
  186.     if ((x = cmkey(spdtab, /* Speed (no default) */
  187.    nspd,
  188.    "Serial printer-port interface speed",
  189.    "9600",
  190.    xxstring)
  191.  ) < 0)
  192.       goto xsetprn;
  193.     pv[n].ival = x;
  194.     break;
  195. #endif /* NOLOCAL */
  196.   case PRN_PAR:
  197.     pv[n].ival = 0;
  198.     if (!getval) break;
  199.     if ((x = cmkey(partbl,npar,"Serial printer-port parity",
  200.    "none",xxstring)) < 0)
  201.       goto xsetprn;
  202.     pv[n].ival = x;
  203.     break;
  204. #endif /* BPRINT */
  205. #ifdef OS2
  206.   case PRN_LEN:
  207.     if (!getval) break;
  208.             if ((x = cmnum("PS page length", "66",10,&y,xxstring)) < 0)
  209.       goto xsetprn;
  210.     pv[n].ival = y;
  211.     break;
  212.   case PRN_WID:
  213.     if (!getval) break;
  214.             if ((x = cmnum("PS page width", "80",10,&y,xxstring)) < 0)
  215.       goto xsetprn;
  216.     pv[n].ival = y;
  217.             break;
  218. #endif /* OS2 */
  219.   default:
  220.     printf("?Unexpected switch value - %dn",cmresult.nresult);
  221.     x = -9;
  222.     goto xsetprn;
  223. }
  224.     }
  225.     line[0] = NUL; /* Initialize printer name value */
  226.     switch (cmresult.fcode) { /* How did we get here? */
  227.       case _CMOFI: /* They typed a filename */
  228. strcpy(line,cmresult.sresult); /* Name */
  229. wild = cmresult.nresult; /* Wild flag */
  230. if ((x = cmcfm()) < 0) /* Confirm the command */
  231.   goto xsetprn;
  232. break;
  233.       case _CMCFM: /* They entered the command */
  234. if (pv[PRN_DOS].ival > 0)
  235.   strcpy(line,pv[PRN_DOS].sval ? pv[PRN_DOS].sval : "");
  236. else if (pv[PRN_WIN].ival > 0)
  237.   strcpy(line,pv[PRN_WIN].sval ? pv[PRN_WIN].sval : "");
  238. else if (pv[PRN_FIL].ival > 0)
  239.   strcpy(line,pv[PRN_FIL].sval ? pv[PRN_FIL].sval : "");
  240. else if (pv[PRN_PIP].ival > 0)
  241.   strcpy(line,pv[PRN_PIP].sval ? pv[PRN_PIP].sval : "");
  242. break;
  243.       default: /* By mistake */
  244. printf("?Unexpected function code: %dn",cmresult.fcode);
  245. x = -9;
  246. goto xsetprn;
  247.     }
  248. #else  /* No PRINTSWI */
  249.     if ((x = cmofi("Printer or file name",defname,&s,xxstring)) < 0)
  250.       return(x);
  251.     if (x > 1) {
  252. printf("?Directory names not allowedn");
  253. return(-9);
  254.     }
  255.     while (*s == SP || *s == HT) s++; /* Trim leading whitespace */
  256.     strcpy(line,s); /* Make a temporary safe copy */
  257.     if ((x = cmcfm()) < 0) return(x); /* Confirm the command */
  258. #endif /* PRINTSWI */
  259. #ifdef IKSD
  260.     if (inserver && (isguest
  261. #ifndef NOSERVER
  262.      || !ENABLED(en_pri)
  263. #endif /* NOSERVER */
  264.      )) {
  265.         printf("Sorry, printing disabledrn");
  266.         return(success = 0);
  267.     }
  268. #endif /* ISKD */
  269. #ifdef PRINTSWI
  270. #ifdef BPRINT
  271.     if (printbidi) { /* If bidi printing active */
  272. #ifndef UNIX
  273. bprtstop(); /* Stop it before proceeding */
  274. #endif /* UNIX */
  275. printbidi = 0;
  276.     }
  277.     if (pv[PRN_SPD].ival > 0) {
  278.         portspeed = (long) pv[PRN_SPD].ival * 10L;
  279.         if (portspeed == 70L) portspeed = 75L;
  280.     }
  281.     if (pv[PRN_PAR].ival > 0)
  282.         portparity = pv[PRN_PAR].ival;
  283.     if (pv[PRN_FLO].ival > 0)
  284.         portflow = pv[PRN_FLO].ival;
  285. #endif /* BPRINT */
  286. #endif /* PRINTSWI */
  287.     s = line; /* Printer name, if given */
  288. #ifdef OS2ORUNIX
  289. #ifdef PRINTSWI
  290.     if (pv[PRN_PIP].ival > 0) { /* /PIPE was given? */
  291. printpipe = 1;
  292. noprinter = 0;
  293. if (*s ==  '|') { /* It might still have a pipe sign */
  294.     s++; /* if name give later */
  295.     while (*s == SP) /* so remove it and spaces */
  296.       s++;
  297. }
  298.     } else
  299. #endif /* PRINTSWI */
  300.       if (*s == '|') { /* Or pipe implied by name? */
  301. s++; /* Point past pipe sign */
  302. while (*s == SP) /* Gobble whitespace */
  303.   s++;
  304. if (*s) {
  305.     printpipe = 1;
  306.     noprinter = 0;
  307. }
  308.     }
  309. #ifdef PRINTSWI
  310. #ifdef BPRINT
  311.     if (printpipe && pv[PRN_BID].ival > 0) {
  312. printf("?Sorry, pipes not allowed for bidirectional printern");
  313. return(-9);
  314.     }
  315. #endif /* BPRINT */
  316. #endif /* PRINTSWI */
  317. #endif /* OS2ORUNIX */
  318. #ifdef OS2
  319.     if ( pv[PRN_PS].ival > 0 ) {
  320.         txt2ps = 1;
  321.         ps_width = pv[PRN_WID].ival <= 0 ? 80 : pv[PRN_WID].ival;
  322.         ps_length = pv[PRN_LEN].ival <= 0 ? 66 : pv[PRN_LEN].ival;
  323.     }
  324. #endif /* OS2 */
  325.     y = strlen(s); /* Length of name of new print file */
  326.     if (y > 0
  327. #ifdef OS2
  328. && ((y != 3) || (ckstrcmp(s,"PRN",3,0) != 0))
  329. #endif /* OS2 */
  330. ) {
  331. if (printername) { /* Had a print file before? */
  332.     free(printername); /* Remove its name */
  333.     printername = NULL;
  334. }
  335. printername = (char *) malloc(y + 1); /* Allocate space for it */
  336. if (!printername) {
  337.     printf("?Memory allocation failuren");
  338.     return(-9);
  339. }
  340. strcpy(printername,s); /* Copy new name to new space */
  341. debug(F110,"printername",printername,0);
  342.     }
  343. #ifdef PRINTSWI
  344.     /* Set printer type from switches that were given explicitly */
  345.     if (pv[PRN_NON].ival > 0) { /* No printer */
  346. printertype = PRT_NON;
  347. noprinter = 1;
  348. printpipe = 0;
  349.     } else if (pv[PRN_FIL].ival > 0) { /* File */
  350. printertype = PRT_FIL;
  351. noprinter = 0;
  352. printpipe = 0;
  353.     } else if (pv[PRN_PIP].ival > 0) { /* Pipe */
  354. printertype = PRT_PIP;
  355. noprinter = 0;
  356. printpipe = 1;
  357.     } else if (pv[PRN_WIN].ival > 0) { /* Windows print queue */
  358. printertype = PRT_WIN;
  359. noprinter = 0;
  360. printpipe = 0;
  361.     } else if (pv[PRN_DOS].ival > 0) { /* DOS device */
  362. printertype = PRT_DOS;
  363. noprinter = 0;
  364. printpipe = 0;
  365.     } else if (line[0]) { /* Name given without switches */
  366. noprinter = 0;
  367. printertype = printpipe ? PRT_PIP : PRT_DOS;
  368. #ifdef NT
  369.         if (!lookup(_printtab,line,nprint,&x)) {
  370.             printertype = PRT_WIN;
  371.             if (pv[PRN_WIN].sval) free(pv[PRN_WIN].sval);
  372.             if (printername) { /* Had a print file before? */
  373.                 free(printername); /* Remove its name */
  374.                 printername = NULL;
  375.             }
  376.             pv[PRN_WIN].sval = NULL;
  377.             pv[PRN_WIN].ival = 1;
  378. #ifdef COMMENT
  379.             pv[PRN_NON].ival = 0; /* These aren't needed */
  380.             pv[PRN_DOS].ival = 0;
  381.             pv[PRN_FIL].ival = 0;
  382. #endif /* COMMENT */
  383.             s = printtab[x].kwd; /* Get full new name */
  384.             if ((y = strlen(s)) > 0) {
  385.                 makestr(&pv[PRN_WIN].sval,s);
  386.                 makestr(&printername,s);
  387.                 if (!printername) {
  388.                     printf("?Memory allocation failuren");
  389.                     return(-9);
  390.                 }
  391.                 debug(F110,"printername",printername,0);
  392.             }
  393.         }
  394. #endif /* NT */
  395.     }
  396. #ifdef BPRINT
  397.     /* Port parameters may be set for non-bidi mode */
  398.     pportspeed = portspeed; /* Set parameters */
  399.     pportparity = portparity;
  400.     pportflow = portflow;
  401.     if (pv[PRN_BID].ival > 0) { /* Bidirectional */
  402. #ifdef UNIX
  403. printbidi = 1; /* (just to test parsing...) */
  404. #else
  405. printbidi = bprtstart(); /* Start bidirectional printer */
  406. #endif /* UNIX */
  407. return(success = printbidi);
  408.     } else
  409.       printbidi = 0; /* Not BPRINTER, unset flag */
  410. #endif /* BPRINT */
  411.     if (pv[PRN_TMO].ival > -1) { /* Take care of timeout */
  412. printtimo = pv[PRN_TMO].ival;
  413.     }
  414.     if (pv[PRN_TRM].ival > 0) { /* Termination string */
  415. if (printterm) {
  416.     free(printterm);
  417.     printterm = NULL;
  418. }
  419. if (pv[PRN_TRM].sval)
  420.   makestr(&printterm,pv[PRN_TRM].sval);
  421.     }
  422.     if (pv[PRN_SEP].ival > 0) { /* and separator file */
  423. if (printsep) {
  424.     free(printsep);
  425.     printsep = NULL;
  426. }
  427. if (pv[PRN_SEP].sval)
  428.   makestr(&printsep,pv[PRN_SEP].sval);
  429.     }
  430. #endif /* PRINTSWI */
  431. #ifdef UNIXOROSK
  432.     if (!printpipe
  433. #ifdef PRINTSWI
  434. && !noprinter
  435. #endif /* PRINTSWI */
  436. ) { /* File - check access */
  437. if (zchko(s) < 0) {
  438.     printf("?Access denied - %sn",s);
  439.     x = -9;
  440.     goto xsetprn;
  441. }
  442.     }
  443. #endif /* UNIXOROSK */
  444.     x = 1; /* Return code */
  445.   xsetprn: /* Common exit */
  446. #ifdef PRINTSWI
  447.     for (i = 0; i <= PRN_MAX; i++) { /* Free malloc'd memory */
  448. if (pv[i].sval)
  449.   free(pv[i].sval);
  450.     }
  451. #endif /* PRINTSWI */
  452.     success = (x > 0) ? 1 : 0;
  453.     return(x);
  454. }
  455. /*  D O P R M  --  Set a parameter.  */
  456. /*
  457.  Returns:
  458.   -2: illegal input
  459.   -1: reparse needed
  460.    0: success
  461. */
  462. int
  463. doprm(xx,rmsflg) int xx, rmsflg; {
  464.     int i = 0, x = 0, y = 0, z = 0;
  465.     long zz = 0L;
  466.     char *s = NULL, *p = NULL;
  467. #ifdef OS2
  468.     char portbuf[64];
  469.     long portspeed = 0L;
  470.     int portparity = 0;
  471.     int portflow = 0;
  472. #endif /* OS2 */
  473. #ifdef OS2
  474.     if (xx == XYMSK)
  475.       return(setmsk());
  476. #endif /* OS2 */
  477.     if (xx == XYFLAG) { /* SET FLAG */
  478. extern int ooflag;
  479. return(success = seton(&ooflag));
  480.     }
  481.     if (xx == XYPRTR /* SET PRINTER (or BPRINTER) */
  482. #ifdef BPRINT
  483. || xx == XYBDCP
  484. #endif /* BPRINT */
  485. )
  486.       return(setprinter(xx));
  487. switch (xx) {
  488. #ifdef ANYX25 /* SET X25 ... */
  489. case XYX25:
  490.     return(setx25());
  491. #ifndef IBMX25
  492. case XYPAD: /* SET PAD ... */
  493.     return(setpadp());
  494. #endif /* IBMX25 */
  495. #endif /* ANYX25 */
  496. #ifndef NOXFER
  497. case XYEOL: /* These have all been moved to set send/receive... */
  498. case XYLEN:  /* Let the user know what to do. */
  499. case XYMARK:
  500. case XYNPAD:
  501. case XYPADC:
  502. case XYTIMO:
  503.     printf("...Use SET SEND or SET RECEIVE instead.n");
  504.     printf("Type HELP SET SEND or HELP SET RECEIVE for more info.n");
  505.     return(success = 0);
  506. case XYATTR: /* File Attribute packets */
  507.     return(setat(rmsflg));
  508. case XYIFD: /* Incomplete file disposition */
  509.     if ((y = cmkey(ifdatab,3,"","auto",xxstring)) < 0) return(y);
  510.     if ((x = cmcfm()) < 0) return(x);
  511.     if (rmsflg) {
  512. sstate = setgen('S',
  513. "310",
  514. y == 0 ? "0" : (y == 1 ? "1" : "2"),
  515.  ""
  516. );
  517. return((int) sstate);
  518.     } else {
  519. keep = y;
  520. return(success = 1);
  521.     }
  522. #endif /* NOXFER */
  523. #ifndef NOSPL
  524. case XYINPU: /* SET INPUT */
  525.     return(setinp());
  526. #endif /* NOSPL */
  527. #ifdef NETCONN
  528. case XYNET: { /* SET NETWORK */
  529.     struct FDB k1, k2;
  530.     cmfdbi(&k1,_CMKEY,"","","",nnetkey, 0, xxstring, netkey, &k2);
  531.     cmfdbi(&k2,_CMKEY,"","","",nnets,   0, xxstring, netcmd, NULL);
  532. #ifdef OS2     /* Hide network-type keywords for networks not installed */
  533.     for (z = 0; z < nnets; z++) {
  534. if (netcmd[z].kwval == NET_TCPB && tcp_avail == 0)
  535.   netcmd[z].flgs =  CM_INV;
  536. #ifdef DECNET
  537. else if (netcmd[z].kwval == NET_DEC  && dnet_avail == 0)
  538.   netcmd[z].flgs =  CM_INV;
  539. #endif /* DECNET */
  540. #ifdef CK_NETBIOS
  541. else if (netcmd[z].kwval == NET_BIOS && netbiosAvail == 0)
  542.   netcmd[z].flgs =  CM_INV;
  543. #endif /* CK_NETBIOS */
  544. #ifdef SUPERLAT
  545. else if (netcmd[z].kwval == NET_SLAT  && slat_avail == 0)
  546.   netcmd[z].flgs =  CM_INV;
  547. #endif /* SUPERLAT */
  548.     }
  549.     if (tcp_avail) /* Default network type */
  550.       strcpy(tmpbuf,"tcp/ip");
  551. #ifdef DECNET
  552.     else if (dnet_avail)
  553.       strcpy(tmpbuf,"decnet");
  554. #endif /* DECNET */
  555. #ifdef SUPERLAT
  556.     else if (slat_avail)
  557.       strcpy(tmpbuf,"superlat");
  558. #endif /* SUPERLAT */
  559. #ifdef CK_NETBIOS
  560.     else if (netbiosAvail)
  561.       strcpy(tmpbuf,"netbios");
  562. #endif /* CK_NETBIOS */
  563.     else strcpy(tmpbuf,"named-pipe");
  564. #else
  565. #ifdef TCPSOCKET
  566.     strcpy(tmpbuf,"tcp/ip");
  567. #else
  568. #ifdef ANYX25
  569.     strcpy(tmpbuf,"x.25");
  570. #else
  571.     strcpy(tmpbuf,"");
  572. #endif /* ANYX25 */
  573. #endif /* TCPSOCKET */
  574. #endif /* OS2 */
  575.     x = cmfdb(&k1);
  576.     if (x < 0) { /* Error */
  577. if (x == -2 || x == -9)
  578.   printf("?No keywords match: "%s"n",atmbuf);
  579. return(x);
  580.     }
  581.     z = cmresult.nresult; /* Keyword value */
  582.     if (cmresult.fdbaddr == &k1) { /* Which table? */
  583. #ifndef NOSPL
  584. #ifndef NODIAL
  585. if (z == XYNET_D)
  586.   return(parsdir(1));
  587. #endif /* NODIAL */
  588. #endif /* NOSPL */
  589. if ((z = cmkey(netcmd,nnets,"",tmpbuf,xxstring)) < 0)
  590.   return(z);
  591.     }
  592. #ifdef NETCMD
  593.     if (z == NET_CMD && nopush) {
  594.         printf("n?Sorry, access to external commands is disabledn");
  595. return(-9);
  596.     }
  597. #endif /* NETCMD */
  598. #ifndef NOPUSH
  599. #ifdef NETPTY
  600.     if (z == NET_PTY && nopush) {
  601.         printf("n?Sorry, access to external commands is disabledn");
  602. return(-9);
  603.     }
  604. #endif /* NETPTY */
  605. #endif /* NOPUSH */
  606. #ifdef OS2
  607.     if (z == NET_TCPB && tcp_avail == 0) {
  608.         printf("n?Sorry, either TCP/IP is not available on this system orn
  609. necessary DLLs did not load.  Use SHOW NETWORK to check network status.n");
  610. return(-9);
  611. #ifdef CK_NETBIOS
  612.     } else if (z == NET_BIOS && netbiosAvail == 0) {
  613. printf("n?Sorry, NETBIOS is not available on this system.n") ;
  614. return(-9);
  615. #endif /* CK_NETBIOS */
  616. #ifdef DECNET
  617.     } else if (z == NET_DEC && dnet_avail == 0) {
  618. printf("n?Sorry, DECnet is not available on this system.n") ;
  619. return(-9);
  620. #endif /* DECNET */
  621. #ifdef SUPERLAT
  622.     } else if (z == NET_SLAT && slat_avail == 0) {
  623. printf("n?Sorry, SuperLAT is not available on this system.n") ;
  624. return(-9);
  625. #endif /* SUPERLAT */
  626.     }
  627. #endif /* OS2 */
  628. #ifdef NPIPEORBIOS
  629.     if (z == NET_PIPE ||  /* Named pipe -- also get pipename */
  630. z == NET_BIOS) { /* NETBIOS -- also get local name */
  631. char *defnam;
  632. #ifdef CK_NETBIOS
  633. char tmpnbnam[NETBIOS_NAME_LEN+1];
  634. #endif /* CK_NETBIOS */
  635. /* Construct default name  */
  636. if (z == NET_PIPE) { /* Named pipe */
  637.     defnam = "kermit"; /* Default name is always "kermit" */
  638. } else { /* NetBIOS */
  639.     if (NetBiosName[0] != SP) { /* If there is already a name, */
  640. char *p = NULL;
  641.                 int n; /* use it as the default. */
  642. ckstrncpy(tmpnbnam,NetBiosName,NETBIOS_NAME_LEN+1);
  643.                 /* convert trailing spaces to NULs */
  644. p = &tmpnbnam[NETBIOS_NAME_LEN-1];
  645. while (*p == SP) {
  646.     *p = NUL;
  647.     p--;
  648. }
  649. defnam = tmpnbnam;
  650.     } else if (*myhost) /* Otherwise use this PC's host name */
  651.       defnam = (char *) myhost;
  652.     else /* Otherwise use "kermit" */
  653.       defnam = "kermit";
  654. }
  655. if ((y = cmtxt((z == NET_PIPE) ? "pipe name" : "local NETBIOS name",
  656.        defnam, &s, xxstring)) < 0)
  657.   return(y);
  658. #ifdef NPIPE
  659. pipename[0] = NUL;
  660. #endif /* NPIPE */
  661. if ((y = (int) strlen(s)) < 1) {
  662.     printf("?You must also specify a %s namen",
  663.    (z == NET_PIPE) ? "pipe" : "local NETBIOS" );
  664.       return(-9);
  665. }
  666. #ifdef CK_NETBIOS
  667. if (z == NET_BIOS) {
  668.     if ( !netbiosAvail ) {
  669. printf("?NETBIOS support is not available on this system.n") ;
  670. return(-9) ;
  671.     }
  672.     if ( y - NETBIOS_NAME_LEN > 0) {
  673. printf("?NETBIOS name too long, %ld maximumn",
  674.        NETBIOS_NAME_LEN);
  675. return(-9);
  676.     } else if ( !strcmp(s,tmpnbnam) ) {
  677.        nettype = z; /* Returning to old connection... */
  678. return(success = 1); /* Done */
  679.     } else if (strcmp("                ",NetBiosName)) {
  680.    printf("?Local NETBIOS name already assigned to "%s"n",
  681.        NetBiosName);
  682.    return(-9) ;
  683.    } else {
  684. NCB ncb ;
  685. APIRET rc ;
  686. strcpy(NetBiosName,s);
  687. for (x = y; x < NETBIOS_NAME_LEN; x++)
  688.   NetBiosName[x] = SP;
  689. NetBiosName[NETBIOS_NAME_LEN] = NUL;
  690. printf("Verifying "%s" is a unique NetBIOS node name ...n",
  691.        NetBiosName) ;
  692. rc = NCBAddName( NetbeuiAPI,
  693. &ncb, NetBiosAdapter, NetBiosName ) ;
  694. if ( rc ) {
  695.     printf(
  696. "?Sorry, "%s" is already in use by another NetBIOS node.n",
  697.    NetBiosName);
  698.     for ( x=0; x < NETBIOS_NAME_LEN; x++)
  699.       NetBiosName[x] = SP ;
  700.     return(-9) ;
  701. }
  702.     }
  703. }
  704. #endif /* CK_NETBIOS */
  705. #ifdef NPIPE
  706. if (z == NET_PIPE)
  707.   ckstrncpy(pipename,s,PIPENAML);
  708. #endif /* NPIPE */
  709.     } else
  710. #endif /* NPIPEORBIOS */
  711. #ifdef DECNET
  712.       if (z == NET_DEC) {
  713.           /* Determine if we are using LAT or CTERM */
  714.           if ((y = cmkey(dnettab,ndnet,"DECNET protocol","lat",xxstring)) < 0)
  715.               return(y);
  716.           if ((x = cmcfm()) < 0) return(x);
  717.           ttnproto = y;
  718.       } else
  719. #endif /* DECNET */
  720. #ifdef NETDLL
  721.     if (z == NET_DLL) {
  722.         /* Find out which DLL they are using */
  723.         char dllname[256]="";
  724.         char * p=NULL;
  725. if ((x = cmifi("Dynamic load library","",&p,&y,xxstring)) < 0) {
  726.     if (x == -3) {
  727. printf("?Name of dynamic load library (dll) requiredn");
  728. return(-9);
  729.     }
  730.     return(x);
  731. }
  732.         ckstrncpy(dllname,p,256);
  733.         if ((x = cmcfm()) < 0) return(x);
  734.         /* Try to load the dll */
  735.         if (netdll_load(dllname) < 0)
  736.             return(success = 0);
  737.         else {
  738.             nettype = z;
  739.             return(success = 1);
  740.         }
  741.     } else
  742. #endif /* NETDLL */
  743.       if ((x = cmcfm()) < 0) return(x);
  744.     nettype = z;
  745.     if (
  746. #ifdef DECNET
  747. (nettype != NET_DEC)  &&
  748. #endif /* DECNET */
  749. #ifdef NPIPE
  750. (nettype != NET_PIPE) &&
  751. #endif /* NPIPE */
  752. #ifdef CK_NETBIOS
  753. (nettype != NET_BIOS) &&
  754. #endif /* CK_NETBIOS */
  755. #ifdef NETFILE
  756. (nettype != NET_FILE) &&
  757. #endif /* NETFILE */
  758. #ifdef NETCMD
  759.         (nettype != NET_CMD) &&
  760. #endif /* NETCMD */
  761. #ifdef NETPTY
  762.         (nettype != NET_PTY) &&
  763. #endif /* NETPTY */
  764. #ifdef NETDLL
  765.         (nettype != NET_DLL) &&
  766. #endif /* NETDLL */
  767. #ifdef SSH
  768.         (nettype != NET_SSH) &&
  769. #endif /* SSH */
  770. #ifdef SUPERLAT
  771. (nettype != NET_SLAT) &&
  772. #endif /* SUPERLAT */
  773. (nettype != NET_SX25) &&
  774. (nettype != NET_VX25) &&
  775. #ifdef IBMX25
  776. (nettype != NET_IX25) &&
  777. #endif /* IBMX25 */
  778.         (nettype != NET_TCPB)) {
  779. printf("?Network type not supportedn");
  780. return(success = 0);
  781.     } else {
  782. return(success = 1);
  783.     }
  784. }
  785. #ifndef NOTCPOPTS
  786. #ifdef TCPSOCKET
  787. case XYTCP:
  788. if ((z = cmkey(tcpopt,ntcpopt,"TCP option","nodelay",xxstring)) < 0)
  789.    return(z);
  790.    switch (z) {
  791.      case XYTCP_ADDRESS:
  792.        if ((y = cmtxt("preferred IP Address for TCP connections","",
  793.       &s,xxstring)) < 0)
  794.  return(y);
  795.        if (tcp_address) {
  796.    free(tcp_address); /* Free any previous storage */
  797.    tcp_address = NULL;
  798.        }
  799.        if (s == NULL || *s == NUL) { /* If none given */
  800.    tcp_address = NULL; /* remove the override string */
  801.    return(success = 1);
  802.        } else if (tcp_address = malloc(strlen(s)+1)) { /* Make new storage */
  803.    strcpy(tcp_address,s); /* Copy string to new storage */
  804.    return(success = 1);
  805.        } else
  806.  return(success = 0);
  807. #ifdef SO_KEEPALIVE
  808.    case XYTCP_KEEPALIVE:
  809.       if ((z = cmkey(onoff,2,"","on",xxstring)) < 0) return(z);
  810.       if ((y = cmcfm()) < 0) return(y);
  811.       success = keepalive(z) ;
  812.       return(success);
  813. #endif /* SO_KEEPALIVE */
  814. #ifdef SO_DONTROUTE
  815.    case XYTCP_DONTROUTE:
  816.       if ((z = cmkey(onoff,2,"","off",xxstring)) < 0) return(z);
  817.       if ((y = cmcfm()) < 0) return(y);
  818.       success = dontroute(z) ;
  819.       return(success);
  820. #endif /* SO_DONTROUTE */
  821. #ifdef TCP_NODELAY
  822.    case XYTCP_NODELAY:
  823.       if ((z = cmkey(onoff,2,"","off",xxstring)) < 0) return(z);
  824.       if ((y = cmcfm()) < 0) return(y);
  825.       success = no_delay(z) ;
  826.       return(success);
  827.    case XYTCP_NAGLE: /* The inverse of NODELAY */
  828.       if ((z = cmkey(onoff,2,"","on",xxstring)) < 0) return(z);
  829.       if ((y = cmcfm()) < 0) return(y);
  830.       success = no_delay(!z) ;
  831.       return(success);
  832. #endif /* TCP_NODELAY */
  833. #ifdef SO_LINGER
  834.     case XYTCP_LINGER:
  835.       if ((z = cmkey(onoff,2,"","on",xxstring)) < 0)
  836. return(z);
  837.       if (z) { /* if on, we need a timeout value */
  838.   if ((x = cmnum("Linger timeout in 10th of a millisecond",
  839.  "0",10,&y,xxstring)) < 0)
  840.     return(x);
  841.       } else
  842. y = 0;
  843.       if ((x = cmcfm()) < 0)
  844. return(x);
  845.       success = ck_linger(z,y);
  846.       return(success);
  847. #endif /* SO_LINGER */
  848. #ifdef SO_SNDBUF
  849.    case XYTCP_SENDBUF:
  850.       x = cmnum("Send buffer size, bytes","8192",10,&z,xxstring);
  851.       if (x < 0) return(x);
  852.       if ((x = cmcfm()) < 0) return(x);
  853.       success = sendbuf(z);
  854.       return(success);
  855. #endif /* SO_SNDBUF */
  856. #ifdef SO_RCVBUF
  857.    case XYTCP_RECVBUF:
  858.       x = cmnum("Receive buffer size, bytes","8192",10,&z,xxstring);
  859.       if (x < 0) return(x);
  860.       if ((x = cmcfm()) < 0) return(x);
  861. /* Note: The following is not 16-bit safe */
  862. #ifndef QNX16
  863.       if (x > 52248) {
  864.           printf("?Warning: receive buffers larger than 52248 bytesn");
  865.           printf(" may not be understood by all hosts.  Performancen");
  866.           printf(" may suffer.n");
  867.           return(-9);
  868.       }
  869. #endif /* QNX16 */
  870.       success = recvbuf(z);
  871.       return(success);
  872. #endif /* SO_RCVBUF */
  873. #ifdef VMS
  874. #ifdef DEC_TCPIP
  875.     case XYTCP_UCX: { /* UCX 2.0 port swabbing bug */
  876. extern int ucx_port_bug;
  877. return(success = seton(&ucx_port_bug));
  878.     }
  879. #endif /* DEC_TCPIP */
  880. #endif /* VMS */
  881.     case XYTCP_RDNS: {
  882. extern int tcp_rdns;
  883. return(success = setonaut(&tcp_rdns));
  884.     }
  885. #ifdef CK_DNS_SRV
  886.      case XYTCP_DNS_SRV: {
  887.        extern int tcp_dns_srv;
  888.        return(success = setonaut(&tcp_dns_srv));
  889.      }
  890. #endif /* CK_DNS_SRV */
  891.      default:
  892.        return(0);
  893.    }
  894. #endif /* TCPSOCKET */
  895. #endif /* NOTCPOPTS */
  896. #endif /* NETCONN */
  897. }
  898. switch (xx) {
  899. #ifndef NOLOCAL
  900. #ifdef NETCONN
  901. case XYHOST: /* SET HOST */
  902. {
  903.     z = ttnproto; /* Save protocol in case of failure */
  904. #ifdef DECNET
  905.     if (nettype != NET_DEC)
  906. #endif /* DECNET */
  907.       ttnproto = NP_NONE;
  908.     if ((y = setlin(XYHOST,1,0)) < 0) {
  909. debug(F101,"SET HOST fail mdmtyp","",mdmtyp);
  910.         ttnproto = z;         /* Failed, restore protocol */
  911.         success = 0;
  912.     }
  913.     didsetlin++;
  914.     debug(F101,"SET HOST OK mdmtyp","",mdmtyp);
  915.     return(y);
  916. }
  917. #endif /* NETCONN */
  918. case XYLINE: /* SET LINE (= SET PORT) */
  919.     debug(F101,"setlin flow 1","",flow);
  920.     x = setlin(xx,1,0);
  921.     if (x > -1) didsetlin++;
  922.     debug(F101,"setlin returns","",x);
  923.     debug(F101,"setlin flow 2","",flow);
  924.     debug(F101,"setlin local","",local);
  925.     return(x);
  926. #endif /* NOLOCAL */
  927. #ifndef NOSETKEY
  928. case XYKEY: /* SET KEY */
  929.     return(dosetkey());
  930. #endif /* NOSETKEY */
  931. #ifndef NOCSETS
  932. case XYLANG:  /* Language */
  933.     if ((y = cmkey(lngtab,nlng,"","none",xxstring)) < 0) /* language code */
  934.       return(y);
  935.     if ((x = cmcfm()) < 0) return(x); /* And confirmation of command */
  936.     /* Look up language and get associated character sets */
  937.     for (i = 0; (i < nlangs) && (langs[i].id != y); i++) ;
  938.     if (i >= nlangs) {
  939. printf("?internal error, sorryn");
  940. return(success = 0);
  941.     }
  942.     language = i; /* All good, set the language, */
  943.     return(success = 1);
  944. #endif /* NOCSETS */
  945. #ifndef MAC
  946. case XYBACK: /* BACKGROUND */
  947.     if ((z = cmkey(onoff,2,"","",xxstring)) < 0) return(z);
  948.     if ((y = cmcfm()) < 0) return(y);
  949.     bgset = z;
  950. #ifdef VMS
  951.     if (batch && bgset == 0) /* To enable echoing of commands */
  952.       ckxech = 1; /* in VMS batch logs */
  953. #endif /* VMS */
  954.     success = 1;
  955.     bgchk();
  956.     return(success);
  957. #endif /* MAC */
  958. case XYQUIE: { /* QUIET */
  959. #ifdef DCMDBUF
  960.       extern int * xquiet;
  961. #else
  962.       extern int xquiet[];
  963. #endif /* DCMDBUF */
  964.       x = seton(&quiet);
  965.       if (x < 0) return(x);
  966.       xquiet[cmdlvl] = quiet;
  967.       return(success = x);
  968.     }
  969. #ifndef NOXFER
  970. case XYBUF: { /* BUFFERS */
  971. #ifdef DYNAMIC
  972.     int sb, rb;
  973.     if ((y = cmnum("Send buffer size","",10,&sb,xxstring)) < 0) {
  974. if (y == -3) printf("?Buffer size requiredn");
  975. return(y);
  976.     }
  977.     if (sb < 0) {
  978. if (*atmbuf == '-') printf("?Negative numbers can't be used heren");
  979. else printf("?Integer overflow, use a smaller number pleasen");
  980. return(-9);
  981.     } else if (sb < 80) {
  982. printf("?Too smalln");
  983. return(-9);
  984.     }
  985.     if ((y = cmnum("Receive buffer size",ckitoa(sb),10,&rb,xxstring)) < 0)
  986.       return(y);
  987.     if (rb < 0) {
  988. if (*atmbuf == '-') printf("?Negative numbers can't be used heren");
  989. else printf("?Integer overflow, use a smaller number pleasen");
  990. return(-9);
  991.     } else if (rb < 80) {
  992. printf("?Too smalln");
  993. return(-9);
  994.     }
  995.     if ((y = cmcfm()) < 0) return(y);
  996.     if ((y = inibufs(sb,rb)) < 0) return(y);
  997.     y = adjpkl(urpsiz,wslotr,bigrbsiz); /* Maybe adjust packet sizes */
  998.     if (y != urpsiz) urpsiz = y;
  999.     y = adjpkl(spsiz,wslotr,bigsbsiz);
  1000.     if (y != spsiz) spsiz = spmax = spsizr = y;
  1001.     return(success = 1);
  1002. #else
  1003.     printf("?Sorry, not availablen");
  1004.     return(success = 0);
  1005. #endif /* DYNAMIC */
  1006. }
  1007. case XYCHKT: /* BLOCK-CHECK */
  1008.     if ((x = cmkey(chktab,4,"","3",xxstring)) < 0) return(x);
  1009.     if ((y = cmcfm()) < 0) return(y);
  1010.     bctr = x;      /* Set locally too, even if REMOTE SET */
  1011.     if (rmsflg) {
  1012. if (x == 4) {
  1013.     tmpbuf[0] = 'B';
  1014.     tmpbuf[1] = '';
  1015. } else sprintf(tmpbuf,"%d",x);
  1016. sstate = setgen('S', "400", tmpbuf, "");
  1017. return((int) sstate);
  1018.     } else {
  1019. return(success = 1);
  1020.     }
  1021. #endif /* NOXFER */
  1022. #ifndef NOLOCAL
  1023. #ifndef MAC /* The Mac has no RS-232 */
  1024. case XYCARR: /* CARRIER-WATCH */
  1025.     return(setdcd());
  1026. #endif /* MAC */
  1027. #endif /* NOLOCAL */
  1028. }
  1029. #ifdef TNCODE
  1030. switch (xx) { /* Avoid long switch statements... */
  1031.     case XYTELOP: {
  1032.         int c, n; /* Workers */
  1033.         int getval = 0; /* Whether to get switch value */
  1034.         int tnserver = 0;               /* Client by default */
  1035.         int opt = -1;                   /* Telnet Option */
  1036.         struct FDB sw, op; /* FDBs for each parse function */
  1037. #ifdef CK_AUTHENTICATION
  1038.         extern int sl_topt_a_s_saved;
  1039.         extern int sl_topt_a_c_saved;
  1040.         extern int sl_topt_e_s_saved;
  1041.         extern int sl_topt_e_c_saved;
  1042. #endif /* CK_AUTHENTICATION */
  1043. #ifdef IKSD
  1044.         if (inserver) /* Server by default when IKSD */
  1045.   tnserver = 1;
  1046. #endif /* IKSD */
  1047.         /* Set up chained parse functions... */
  1048.         cmfdbi(&op, /* First fdb - telopts*/
  1049.        _CMKEY, /* fcode */
  1050.        "/client, /server or", /* hlpmsg */
  1051.        "", /* default */
  1052.        "", /* addtl string data */
  1053.        ntnopt, /* addtl numeric data 1 */
  1054.        0, /* addtl numeric data 2 */
  1055.        xxstring,
  1056.        tnopttab,
  1057.        &sw
  1058.        );
  1059.         cmfdbi(&sw, /* Second FDB - command switches */
  1060.        _CMKEY, /* fcode */
  1061.        "",      /* hlpmsg */
  1062.        "", /* default */
  1063.        "", /* addtl string data */
  1064.        ntnoptsw, /* addtl numeric data 1: tbl size */
  1065.        4, /* addtl numeric data 2: 4 = cmswi */
  1066.        xxstring, /* Processing function */
  1067.        tnoptsw, /* Keyword table */
  1068.        NULL /* Pointer to next FDB */
  1069.        );
  1070.         while (opt < 0) { /* Parse 0 or more switches */
  1071.             x = cmfdb(&op); /* Parse switch or other thing */
  1072.             debug(F101,"XYTELOP cmfdb","",x);
  1073.             if (x < 0) /* Error */
  1074.       return(x); /* or reparse needed */
  1075.             if (cmresult.fcode != _CMKEY) /* Break out if not a switch */
  1076.       break;
  1077.             c = cmgbrk(); /* Get break character */
  1078.             getval = (c == ':' || c == '='); /* see how switch ended */
  1079.             if (getval && !(cmresult.kflags & CM_ARG)) {
  1080.                 printf("?This switch does not take argumentsn");
  1081.                 return(-9);
  1082.             }
  1083.             z = cmresult.nresult; /* Numeric result = switch value */
  1084.             debug(F101,"XYTELOP switch","",z);
  1085.             switch (z) { /* Process the switch */
  1086.       case CK_TN_CLIENT:
  1087.                 tnserver = 0;
  1088.                 break;
  1089.       case CK_TN_SERVER:
  1090.                 tnserver = 1;
  1091.                 break;
  1092.       case CK_TN_EC:
  1093.                 opt = TELOPT_ECHO;
  1094.                 break;
  1095.       case CK_TN_TT:
  1096.                 opt = TELOPT_TTYPE;
  1097.                 break;
  1098.       case CK_TN_BM:
  1099.                 opt = TELOPT_BINARY;
  1100.                 break;
  1101.       case CK_TN_ENV:
  1102.                 opt = TELOPT_NEWENVIRON;
  1103.                 break;
  1104.       case CK_TN_LOC:
  1105.                 opt = TELOPT_SNDLOC;
  1106.                 break;
  1107.       case CK_TN_AU:
  1108.                 opt = TELOPT_AUTHENTICATION;
  1109.                 break;
  1110.               case CK_TN_FX:
  1111.                 opt = TELOPT_FORWARD_X;
  1112.                 break;
  1113.       case CK_TN_ENC:
  1114.                 opt = TELOPT_ENCRYPTION;
  1115.                 break;
  1116.       case CK_TN_IKS:
  1117.                 opt = TELOPT_KERMIT;
  1118.                 break;
  1119.       case CK_TN_TLS:
  1120.                 opt = TELOPT_START_TLS;
  1121.                 break;
  1122.       case CK_TN_XD:
  1123.                 opt = TELOPT_XDISPLOC;
  1124.                 break;
  1125.       case CK_TN_NAWS:
  1126.                 opt = TELOPT_NAWS;
  1127.                 break;
  1128.       case CK_TN_SGA:
  1129.                 opt = TELOPT_SGA;
  1130.                 break;
  1131.               case CK_TN_PHR:
  1132.                 opt = TELOPT_PRAGMA_HEARTBEAT;
  1133.                 break;
  1134.               case CK_TN_PSP:
  1135.                 opt = TELOPT_SSPI_LOGON;
  1136.                 break;
  1137.               case CK_TN_PLG:
  1138.                 opt = TELOPT_PRAGMA_LOGON;
  1139.                 break;
  1140.               case CK_TN_SAK:
  1141.                 opt = TELOPT_IBM_SAK;
  1142.                 break;
  1143.               case CK_TN_CPC:
  1144.                 opt = TELOPT_COM_PORT;
  1145.                 break;
  1146.               case CK_TN_FLW:
  1147.                 opt = TELOPT_LFLOW;
  1148.                 break;
  1149.       default:
  1150.                 printf("?Unexpected value - %dn",z);
  1151.                 return(-9);
  1152.             }
  1153. #ifdef COMMENT
  1154.             if (cmresult.fdbaddr == &op)
  1155.       break;
  1156. #endif /* COMMENT */
  1157.         }
  1158.         switch (opt) {
  1159.   case TELOPT_ECHO: /* Options only the Server WILL */
  1160.           case TELOPT_FORWARD_X:
  1161.   case TELOPT_SEND_URL:
  1162.           case TELOPT_IBM_SAK:
  1163.             if ((x = cmkey(tnnegtab,
  1164.    ntnnegtab,
  1165.    "desired server state",
  1166.    TELOPT_MODE(tnserver?TELOPT_DEF_S_ME_MODE(opt):TELOPT_DEF_C_U_MODE(opt)),
  1167.    xxstring)
  1168.  ) < 0)
  1169.       return(x);
  1170.             if ((z = cmcfm()) < 0)
  1171.       return(z);
  1172.             if (tnserver) {
  1173.                 TELOPT_DEF_S_ME_MODE(opt) = x;
  1174.                 TELOPT_ME_MODE(opt) = x;
  1175.             } else {
  1176.                 TELOPT_DEF_C_U_MODE(opt) = x;
  1177.                 TELOPT_U_MODE(opt) = x;
  1178.             }
  1179.             break;
  1180.   case TELOPT_TTYPE: /* Options only the Client WILL */
  1181.   case TELOPT_NEWENVIRON:
  1182.   case TELOPT_SNDLOC:
  1183.   case TELOPT_AUTHENTICATION:
  1184.   case TELOPT_START_TLS:
  1185.   case TELOPT_XDISPLOC:
  1186.   case TELOPT_NAWS:
  1187.           case TELOPT_LFLOW:
  1188.           case TELOPT_COM_PORT:
  1189.             if ((x = cmkey(tnnegtab,
  1190.    ntnnegtab,
  1191.    "desired client state",
  1192.     TELOPT_MODE(!tnserver?TELOPT_DEF_S_U_MODE(opt):TELOPT_DEF_C_ME_MODE(opt)),
  1193.                             xxstring)
  1194.  ) < 0)
  1195.       return(x);
  1196.             if ((z = cmcfm()) < 0)
  1197.       return(z);
  1198.             if (tnserver) {
  1199.                 TELOPT_DEF_S_U_MODE(opt) = x;
  1200.                 TELOPT_U_MODE(opt) = x;
  1201. #ifdef CK_AUTHENTICATION
  1202.                 if (opt == TELOPT_AUTHENTICATION)
  1203.   sl_topt_a_s_saved = 0;
  1204. #endif /* CK_AUTHENTICATION */
  1205.             } else {
  1206.                 TELOPT_DEF_C_ME_MODE(opt) = x;
  1207.                 TELOPT_ME_MODE(opt) = x;
  1208. #ifdef CK_AUTHENTICATION
  1209.                 if (opt == TELOPT_AUTHENTICATION)
  1210.   sl_topt_a_c_saved = 0;
  1211. #endif /* CK_AUTHENTICATION */
  1212.             }
  1213.             break;
  1214.   default:
  1215.             if ((x = cmkey(tnnegtab,
  1216.    ntnnegtab,
  1217.    tnserver ?
  1218.    "desired server state" :
  1219.    "desired client state",
  1220.     TELOPT_MODE(tnserver?TELOPT_DEF_S_ME_MODE(opt):TELOPT_DEF_C_ME_MODE(opt)),
  1221.    xxstring
  1222.    )
  1223.  ) < 0)
  1224.       return(x);
  1225.             if ((y = cmkey(tnnegtab,
  1226.    ntnnegtab,
  1227.    !tnserver ? "desired server state" :
  1228.    "desired client state",
  1229.     TELOPT_MODE(!tnserver?TELOPT_DEF_S_U_MODE(opt):TELOPT_DEF_C_U_MODE(opt)),
  1230.    xxstring
  1231.    )
  1232.  ) < 0)
  1233.       return(y);
  1234.             if ((z = cmcfm()) < 0)
  1235.       return(z);
  1236.             if (tnserver) {
  1237.                 TELOPT_DEF_S_ME_MODE(opt) = x;
  1238.                 TELOPT_ME_MODE(opt) = x;
  1239.                 TELOPT_DEF_S_U_MODE(opt) = y;
  1240.                 TELOPT_U_MODE(opt) = y;
  1241. #ifdef CK_ENCRYPTION
  1242.                 if (opt == TELOPT_ENCRYPTION)
  1243.   sl_topt_e_s_saved = 0;
  1244. #endif /* CK_ENCRYPTION */
  1245.             } else {
  1246.                 TELOPT_DEF_C_ME_MODE(opt) = x;
  1247.                 TELOPT_ME_MODE(opt) = x;
  1248.                 TELOPT_DEF_C_U_MODE(opt) = y;
  1249.                 TELOPT_U_MODE(opt) = y;
  1250. #ifdef CK_ENCRYPTION
  1251.                 if (opt == TELOPT_ENCRYPTION)
  1252.   sl_topt_e_c_saved = 0;
  1253. #endif /* CK_ENCRYPTION */
  1254.             }
  1255.         }
  1256.         return(success = 1);
  1257.     }
  1258.   case XYTEL: /* TELNET */
  1259.     if ((z = cmkey(tntab,ntn,"parameter for TELNET negotiations", "",
  1260.    xxstring)) < 0)
  1261.       return(z);
  1262.     switch (z) {
  1263.       case CK_TN_EC: /* ECHO */
  1264. if ((x = cmkey(rltab,nrlt,
  1265.        "initial TELNET echoing state","local",xxstring)) < 0)
  1266.   return(x);
  1267. if ((y = cmcfm()) < 0) return(y);
  1268. tn_duplex = x;
  1269. return(success = 1);
  1270.       case CK_TN_RE:                    /* REMOTE-ECHO */
  1271.         return(success = seton(&tn_rem_echo));
  1272.       case CK_TN_DB:                    /* DEBUG */
  1273.           return(success = seton(&tn_deb));
  1274.       case CK_TN_TT: /* TERMINAL TYPE */
  1275. if ((y = cmtxt("terminal type for TELNET connections","",
  1276.        &s,xxstring)) < 0)
  1277.   return(y);
  1278. if (tn_term) {
  1279.     free(tn_term); /* Free any previous storage */
  1280.     tn_term = NULL;
  1281. }
  1282. if (s == NULL || *s == NUL) { /* If none given */
  1283.     tn_term = NULL; /* remove the override string */
  1284.     return(success = 1);
  1285. } else if (tn_term = malloc(strlen(s)+1)) { /* Make storage for new */
  1286.     strcpy(tn_term,s); /* Copy string into new storage */
  1287.     return(success = 1);
  1288. } else return(success = 0);
  1289.       case CK_TN_NL: /* TELNET NEWLINE-MODE */
  1290.         if ((x = cmkey(tn_nlmtab,ntn_nlm,"","nvt",xxstring)) < 0)
  1291.   return(x);
  1292. if (x == TN_NL_BIN) {
  1293.     if ((x = cmkey(tnlmtab,ntnlm,"","raw",xxstring)) < 0)
  1294.       return(x);
  1295.     if ((y = cmcfm()) < 0)
  1296.       return(y);
  1297.     tn_b_nlm = x;
  1298.     return(success = 1);
  1299. } else if (x == TN_NL_NVT) {
  1300.     if ((x = cmkey(tnlmtab,ntnlm,"","on",xxstring)) < 0)
  1301.       return(x);
  1302.     if ((y = cmcfm()) < 0)
  1303.       return(y);
  1304.     tn_nlm = x;
  1305.     return(success = 1);
  1306. } else {
  1307.     if ((y = cmcfm()) < 0)
  1308.       return(y);
  1309.     tn_nlm = x;
  1310.     return(success = 1);
  1311. }
  1312.       case CK_TN_XF: /* BINARY-TRANSFER-MODE */
  1313.           if ((z = cmkey(onoff,2,"","on",xxstring)) < 0) return(z);
  1314.           if ((y = cmcfm()) < 0) return(y);
  1315.           tn_b_xfer = z;
  1316.           return(success = 1);
  1317.       case CK_TN_NE: /* NO-ENCRYPT-DURING-XFER */
  1318.           if ((z = cmkey(onoff,2,"","on",xxstring)) < 0) return(z);
  1319.           if ((y = cmcfm()) < 0) return(y);
  1320. #ifdef CK_APC
  1321.           /* Don't let this be set remotely */
  1322.           if (apcactive == APC_LOCAL ||
  1323.                apcactive == APC_REMOTE && apcstatus != APC_UNCH)
  1324.               return(success = 0);
  1325. #endif /* CK_APC */
  1326.           tn_no_encrypt_xfer = z;
  1327.           return(success = 1);
  1328.       case CK_TN_BM: /* BINARY-MODE */
  1329.         if ((x = cmkey(tnnegtab,ntnnegtab,"","refused",xxstring)) < 0)
  1330.   return(x);
  1331. if ((y = cmcfm()) < 0)
  1332.   return(y);
  1333. TELOPT_DEF_S_ME_MODE(TELOPT_BINARY) = x;
  1334. TELOPT_DEF_S_U_MODE(TELOPT_BINARY) = x;
  1335. TELOPT_DEF_C_ME_MODE(TELOPT_BINARY) = x;
  1336. TELOPT_DEF_C_U_MODE(TELOPT_BINARY) = x;
  1337. return(success = 1);
  1338. #ifdef IKS_OPTION
  1339.       case CK_TN_IKS: /* KERMIT */
  1340. if ((x = cmkey(tnnegtab,ntnnegtab,"DO","accept",xxstring)) < 0)
  1341.   return(x);
  1342.         if ((y = cmkey(tnnegtab,ntnnegtab,"WILL","accept",xxstring)) < 0)
  1343.             return(y);
  1344.         if ((z = cmcfm()) < 0)
  1345.           return(z);
  1346. TELOPT_DEF_S_ME_MODE(TELOPT_KERMIT) = y;
  1347. TELOPT_DEF_S_U_MODE(TELOPT_KERMIT) = x;
  1348. TELOPT_DEF_C_ME_MODE(TELOPT_KERMIT) = y;
  1349. TELOPT_DEF_C_U_MODE(TELOPT_KERMIT) = x;
  1350. return(success = 1);
  1351. #endif /* IKS_OPTION */
  1352. #ifdef CK_SSL
  1353.       case CK_TN_TLS: /* START_TLS */
  1354. if ((x = cmkey(tnnegtab,ntnnegtab,"me","accept",xxstring)) < 0)
  1355.   return(x);
  1356. if ((y = cmkey(tnnegtab,ntnnegtab,"u","accept",xxstring)) < 0)
  1357.   return(y);
  1358. if ((z = cmcfm()) < 0)
  1359.   return(z);
  1360. TELOPT_DEF_S_ME_MODE(TELOPT_START_TLS) = x;
  1361. TELOPT_DEF_S_U_MODE(TELOPT_START_TLS) = y;
  1362. TELOPT_DEF_C_ME_MODE(TELOPT_START_TLS) = x;
  1363. TELOPT_DEF_C_U_MODE(TELOPT_START_TLS) = y;
  1364. return(success = 1);
  1365. #endif /* CK_SSL */
  1366. #ifdef CK_NAWS
  1367.       case CK_TN_NAWS: /* NAWS */
  1368. if ((x = cmkey(tnnegtab,ntnnegtab,"me","accept",xxstring)) < 0)
  1369.   return(x);
  1370. if ((y = cmkey(tnnegtab,ntnnegtab,"u","accept",xxstring)) < 0)
  1371.   return(y);
  1372. if ((z = cmcfm()) < 0)
  1373.   return(z);
  1374. TELOPT_DEF_S_ME_MODE(TELOPT_NAWS) = x;
  1375. TELOPT_DEF_S_U_MODE(TELOPT_NAWS) = y;
  1376. TELOPT_DEF_C_ME_MODE(TELOPT_NAWS) = x;
  1377. TELOPT_DEF_C_U_MODE(TELOPT_NAWS) = y;
  1378. return(success = 1);
  1379. #endif /* CK_NAWS */
  1380. #ifdef CK_AUTHENTICATION
  1381.       case CK_TN_AU: /* AUTHENTICATION */
  1382. if ((x = cmkey(tnauthtab,ntnauth,"","accept",xxstring)) < 0)
  1383.   return(x);
  1384. if (x == TN_AU_FWD) {
  1385.     extern int forward_flag;
  1386.     return(success = seton(&forward_flag));
  1387. } else if (x == TN_AU_TYP) {
  1388.     extern int auth_type_user[];
  1389.             extern int sl_auth_type_user[];
  1390.             extern int sl_auth_saved;
  1391.             int i, j, atypes[AUTHTYPLSTSZ];
  1392.             for (i = 0; i < AUTHTYPLSTSZ; i++) {
  1393.                 if ((y = cmkey(autyptab,nautyp,"",
  1394.        i == 0 ? "automatic" : "" ,
  1395.        xxstring)) < 0) {
  1396.                     if (y == -3)
  1397.       break;
  1398.                     return(y);
  1399.                 }
  1400.                 if (i > 0 && (y == AUTHTYPE_AUTO || y == AUTHTYPE_NULL)) {
  1401.     printf(
  1402.        "rn?Choice may only be used in first position.rn");
  1403.     return(-9);
  1404.                 }
  1405.                 for (j=0 ; j< i; j++) {
  1406.                     if (atypes[j] == y) {
  1407.                         printf("rn?Choice has already been used.rn");
  1408.                         return(-9);
  1409.                     }
  1410.                 }
  1411.                 atypes[i] = y;
  1412.                 if (y == AUTHTYPE_NULL || y == AUTHTYPE_AUTO) {
  1413.                     i++;
  1414.                     break;
  1415.                 }
  1416.             }
  1417.             if (i < AUTHTYPLSTSZ)
  1418.       atypes[i] = AUTHTYPE_NULL;
  1419.     if ((z = cmcfm()) < 0)
  1420.       return(z);
  1421.             sl_auth_saved = 0;
  1422.             for (i = 0; i < AUTHTYPLSTSZ; i++) {
  1423.                 auth_type_user[i] = atypes[i];
  1424.                 sl_auth_type_user[i] = 0;
  1425.             }
  1426. } else if (x == TN_AU_HOW) {
  1427.     if ((y = cmkey(auhowtab,nauhow,"","any",xxstring)) < 0)
  1428.       return(y);
  1429.     if ((z = cmcfm()) < 0)
  1430.       return(z);
  1431.     tn_auth_how = y;
  1432. } else if (x == TN_AU_ENC) {
  1433.     if ((y = cmkey(auenctab,nauenc,"","encrypt",xxstring)) < 0)
  1434.       return(y);
  1435.     if ((z = cmcfm()) < 0)
  1436.       return(z);
  1437.     tn_auth_enc = y;
  1438. } else {
  1439.     if ((y = cmcfm()) < 0)
  1440.       return(y);
  1441.     TELOPT_DEF_C_ME_MODE(TELOPT_AUTHENTICATION) = x;
  1442.     TELOPT_DEF_S_U_MODE(TELOPT_AUTHENTICATION) = x;
  1443. }
  1444. return(success = 1);
  1445. #endif /* CK_AUTHENTICATION */
  1446. #ifdef CK_ENCRYPTION
  1447.       case CK_TN_ENC: { /* ENCRYPTION */
  1448.   int c, tmp = -1;
  1449.   int getval = 0;
  1450.   static struct keytab * tnetbl = NULL;
  1451.   static int ntnetbl = 0;
  1452.           if ((y = cmkey(tnenctab,ntnenc,"","accept",xxstring)) < 0)
  1453.     return(y);
  1454.           switch (y) {
  1455.     case TN_EN_TYP:
  1456.               x = ck_get_crypt_table(&tnetbl,&ntnetbl);
  1457.               debug(F101,"ck_get_crypt_table x","",x);
  1458.               debug(F101,"ck_get_crypt_table n","",ntnetbl);
  1459.               if (x < 1 || !tnetbl || ntnetbl < 1) /* Didn't get it */
  1460. x = 0;
  1461.               if (!x) {
  1462.                   printf("?Oops, types not loadedn");
  1463.                   return(-9);
  1464.               }
  1465.               if ((x = cmkey(tnetbl,ntnetbl,"type of encryption",
  1466.      "automatic",xxstring)) < 0)
  1467. return(x);
  1468.               if ((z = cmcfm()) < 0)
  1469. return(z);
  1470.               cx_type = x;
  1471.               sl_cx_type = 0;
  1472.               break;
  1473.     case TN_EN_START:
  1474.               if ((z = cmcfm()) < 0)
  1475. return(z);
  1476. #ifdef CK_APC
  1477.       /* Don't let this be set remotely */
  1478.       if (apcactive == APC_LOCAL ||
  1479.           apcactive == APC_REMOTE && apcstatus != APC_UNCH)
  1480.         return(success = 0);
  1481. #endif /* CK_APC */
  1482.               ck_tn_enc_start();
  1483.               break;
  1484.     case TN_EN_STOP:
  1485.               if ((z = cmcfm()) < 0)
  1486. return(z);
  1487. #ifdef CK_APC
  1488.       /* Don't let this be set remotely */
  1489.       if (apcactive == APC_LOCAL ||
  1490.           apcactive == APC_REMOTE && apcstatus != APC_UNCH)
  1491.         return(success = 0);
  1492. #endif /* CK_APC */
  1493.               ck_tn_enc_stop();
  1494.               break;
  1495.     default:
  1496.               if ((z = cmcfm()) < 0)
  1497. return(z);
  1498.       TELOPT_DEF_C_ME_MODE(TELOPT_ENCRYPTION) = y;
  1499.       TELOPT_DEF_C_U_MODE(TELOPT_ENCRYPTION) = y;
  1500.       TELOPT_DEF_S_ME_MODE(TELOPT_ENCRYPTION) = y;
  1501.       TELOPT_DEF_S_U_MODE(TELOPT_ENCRYPTION) = y;
  1502.           }
  1503.           return(success = 1);
  1504.       }
  1505. #endif /* CK_ENCRYPTION */
  1506.       case CK_TN_BUG: /* BUG */
  1507. if ((x = cmkey(tnbugtab,4,"","binary-me-means-u-too",xxstring)) < 0)
  1508.   return(x);
  1509. if ((z = cmkey(onoff,2,"","off",xxstring)) < 0) return(z);
  1510. if ((y = cmcfm()) < 0) return(y);
  1511. switch (x) {
  1512.   case 0:
  1513.     tn_b_meu = z;
  1514.     break;
  1515.   case 1:
  1516.     tn_b_ume = z;
  1517.     break;
  1518.           case 2:
  1519.     tn_infinite = z;
  1520.             break;
  1521.           case 3:
  1522.             tn_sb_bug = z;
  1523.             break;
  1524. }
  1525. return(success = 1);
  1526. #ifdef CK_ENVIRONMENT
  1527.       case CK_TN_XD: /* XDISPLOC */
  1528. if ((x = cmkey(tnnegtab,ntnnegtab,"me","accept",xxstring)) < 0)
  1529.   return(x);
  1530. if ((y = cmkey(tnnegtab,ntnnegtab,"u","accept",xxstring)) < 0)
  1531.   return(y);
  1532. if ((z = cmcfm()) < 0)
  1533.   return(z);
  1534. TELOPT_DEF_S_ME_MODE(TELOPT_XDISPLOC) = x;
  1535. TELOPT_DEF_S_U_MODE(TELOPT_XDISPLOC) = y;
  1536. TELOPT_DEF_C_ME_MODE(TELOPT_XDISPLOC) = x;
  1537. TELOPT_DEF_C_U_MODE(TELOPT_XDISPLOC) = y;
  1538. return(success = 1);
  1539.       case CK_TN_ENV: {
  1540.   char * msg = "value of telnet environment variable";
  1541.   extern int tn_env_flg;
  1542.   extern char tn_env_acct[], tn_env_disp[], tn_env_job[],
  1543.   tn_env_prnt[], tn_env_sys[];
  1544.   if ((x = cmkey(tnenvtab,ntnenv,"","",xxstring)) < 0)
  1545.     return(x);
  1546. #ifdef COMMENT
  1547.           /* If we ever support USERVAR variables */
  1548.   if (x == TN_ENV_UVAR) {
  1549.       /* Get the user variable name */
  1550.   }
  1551. #endif /* COMMENT */
  1552.   if (x == TN_ENV_OFF || x == TN_ENV_ON) {
  1553.       if ((y = cmcfm()) < 0) return(y);
  1554. #ifdef IKSD
  1555.               if (inserver) {
  1556.                   printf("?Sorry, command disabled.rn");
  1557.                   return(success = 0);
  1558.               }
  1559. #endif /* IKSD */
  1560.       tn_env_flg = x == TN_ENV_OFF ? 0 : 1;
  1561.       return(success = 1);
  1562.   }
  1563.   /* Not ON/OFF - Get the value */
  1564.   z = cmdgquo();
  1565.   cmdsquo(0);
  1566.   if ((y = cmtxt(msg,
  1567.  "", &s, xxstring)) < 0) {
  1568.       cmdsquo(z);
  1569.       return(y);
  1570.   }
  1571.   cmdsquo(z);
  1572. #ifdef IKSD
  1573.           if (inserver)
  1574.     return(success = 0);
  1575. #endif /* IKSD */
  1576.   if ((int)strlen(s) > 63) {
  1577.       printf("Sorry, too longn");
  1578.       return(-9);
  1579.   }
  1580.   switch (x) {
  1581.     case TN_ENV_USR:
  1582.       ckstrncpy(uidbuf,s,UIDBUFLEN);
  1583.               sl_uid_saved = 0;
  1584.       break;
  1585.     case TN_ENV_ACCT:
  1586.       ckstrncpy(tn_env_acct,s,64);
  1587.       break;
  1588.     case TN_ENV_DISP:
  1589.       ckstrncpy(tn_env_disp,s,64);
  1590.       break;
  1591.     case TN_ENV_JOB:
  1592.       ckstrncpy(tn_env_job,s,64);
  1593.       break;
  1594.     case TN_ENV_PRNT:
  1595.       ckstrncpy(tn_env_prnt,s,64);
  1596.       break;
  1597.     case TN_ENV_SYS:
  1598.       ckstrncpy(tn_env_sys,s,64);
  1599.       break;
  1600.     case TN_ENV_UVAR:
  1601.       printf("n?Not yet implementedn");
  1602.       break;
  1603.   }
  1604.   return(success = 1);
  1605.       }
  1606. #endif /* CK_ENVIRONMENT */
  1607. #ifdef CK_SNDLOC
  1608.       case CK_TN_LOC: { /* LOCATION */
  1609.   extern char * tn_loc;
  1610.   if ((y = cmtxt("Location string","",&s,xxstring)) < 0)
  1611.     return(y);
  1612.   if (!*s) s = NULL;
  1613.   makestr(&tn_loc,s);
  1614.   return(success = 1);
  1615.       }
  1616. #endif /* CK_SNDLOC */
  1617.       case CK_TN_WAIT: /* WAIT-FOR-NEGOTIATIONS */
  1618. if ((z = cmkey(onoff,2,"","on",xxstring)) < 0) return(z);
  1619. if ((y = cmcfm()) < 0) return(y);
  1620. #ifdef IKSD
  1621. if (inserver &&
  1622. #ifdef IKSDCONF
  1623.     iksdcf
  1624. #else
  1625.     1
  1626. #endif /* IKSDCONF */
  1627.     ) {
  1628.     printf("?Sorry, command disabled.rn");
  1629.     return(success = 0);
  1630. }
  1631. #endif /* IKSD */
  1632. tn_wait_flg = z;
  1633.         sl_tn_saved = 0;
  1634. return(success = 1);
  1635.       case CK_TN_PUID: {                /* PROMPT-FOR-USERID */
  1636. int i,len;
  1637. if ((y = cmtxt("Prompt string","",&s,xxstring)) < 0)
  1638.   return(y);
  1639. if (s == "") s = NULL;
  1640. if (s) {
  1641.     s = brstrip(s);
  1642.     if (s == "") s = NULL;
  1643. }
  1644.         /* we must check to make sure there are no % fields */
  1645.         len = strlen(s);
  1646.         for (i = 0; i < len; i++) {
  1647.             if (s[i] == '%') {
  1648.                 if (s[i+1] != '%') {
  1649.                     printf("%% fields are not used in this command.n");
  1650.                     return(-9);
  1651.                 }
  1652.                 i++;
  1653.             }
  1654.         }
  1655. makestr(&tn_pr_uid,s);
  1656.         return(success = 1);
  1657.       }
  1658.       default:
  1659. return(-2);
  1660.     }
  1661. }
  1662. #endif /* TNCODE */
  1663. switch (xx) {
  1664. #ifndef NOSPL
  1665. case XYCOUN: /* SET COUNT */
  1666.     x = cmnum("Positive number","0",10,&z,xxstring);
  1667.     if (x < 0) return(x);
  1668.     if ((x = cmcfm()) < 0) return(x);
  1669.     if (z < 0) {
  1670. printf("?A positive number, pleasen");
  1671. return(0);
  1672.     }
  1673.     debug(F101,"XYCOUN: z","",z);
  1674.     return(success = setnum(&count[cmdlvl],z,0,10000));
  1675. #endif /* NOSPL */
  1676. #ifndef NOSPL
  1677. case XYCASE:
  1678.     return(success = seton(&inpcas[cmdlvl]));
  1679. #endif /* NOSPL */
  1680. case XYCMD: /* COMMAND ... */
  1681.     if ((y = cmkey(scmdtab,nbytt,"","",xxstring)) < 0) return(y);
  1682.     switch(y) {
  1683.       case 876:
  1684. if ((y = cmcfm()) < 0) return(y);
  1685. concb((char)escape);
  1686. return(success = 1);
  1687.       case SCMD_BSZ:
  1688. if ((y = cmnum("bytesize for command characters, 7 or 8","7",10,&x,
  1689.        xxstring)) < 0)
  1690.   return(y);
  1691. if (x != 7 && x != 8) {
  1692.     printf("n?The choices are 7 and 8n");
  1693.     return(success = 0);
  1694. }
  1695. if ((y = cmcfm()) < 0) return(y);
  1696. if (x == 7) cmdmsk = 0177;
  1697. else if (x == 8) cmdmsk = 0377;
  1698. return(success = 1);
  1699. #ifdef CK_RECALL
  1700.       case SCMD_RCL:
  1701. if ((y = cmnum("maximum number of commands in recall buffer","10",
  1702.        10,&x,xxstring)) < 0)
  1703.   return(y);
  1704. if ((y = cmcfm()) < 0) return(y);
  1705. return(success = cmrini(x));
  1706. #endif /* CK_RECALL */
  1707. #ifdef CK_RECALL
  1708.       case SCMD_RTR:
  1709. return(success = seton(&cm_retry));
  1710. #endif /* CK_RECALL */
  1711.       case SCMD_MOR: /* More-prompting */
  1712. return(success = seton(&xaskmore));
  1713.       case SCMD_QUO:
  1714. if ((x = seton(&y)) < 0) return(x);
  1715. cmdsquo(y); /* Do it the right way */
  1716. cmd_quoting = y; /* Also keep a global copy */
  1717. /* Set string-processing function */
  1718. #ifdef datageneral
  1719. xxstring = y ? zzstring : (xx_strp) NULL;
  1720. #else
  1721. #ifdef CK_ANSIC
  1722. xxstring = y ? zzstring : (xx_strp) NULL;
  1723. #else
  1724. xxstring = y ? zzstring : (xx_strp) NULL;
  1725. #endif /* CK_ANSIC */
  1726. #endif /* datageneral */
  1727. return(success = 1);
  1728. #ifdef OS2
  1729.       case SCMD_COL: { /* Command-screen colors */
  1730.          int fg, bg;
  1731.          fg = cmkey(ttyclrtab, nclrs,
  1732.                      "foreground color and then background color",
  1733.                      "white",
  1734.                      xxstring);
  1735.          if (fg < 0)
  1736.             return(fg);
  1737.          if ((bg = cmkey(ttyclrtab,nclrs,
  1738.                           "background color","black",xxstring)) < 0)
  1739.             return(bg);
  1740.          if ((y = cmcfm()) < 0)
  1741.             return(y);
  1742.          colorcmd = fg | bg << 4;
  1743.          return(success = 1);
  1744.       }
  1745.     case SCMD_SCR:       /* Command Scrollback size */
  1746.           if ((y = cmnum("COMMAND scrollback buffer size, lines","512",10,&x,
  1747.                           xxstring)) < 0)
  1748.             return(y);
  1749. /* The max number of lines is the RAM  */
  1750. /* we can actually dedicate to a       */
  1751. /* scrollback buffer given the maximum */
  1752. /* process memory space of 512MB       */
  1753. if (x < 256 || x > 2000000L) {
  1754.     printf("n?The size must be between 256 and 2,000,000.n");
  1755.     return(success = 0);
  1756.   }
  1757. if ((y = cmcfm()) < 0) return(y);
  1758.           tt_scrsize[VCMD] = x;
  1759.           VscrnInit( VCMD ) ;
  1760. return(success = 1);
  1761.           break;
  1762.       case SCMD_WID: {
  1763.   if ((y = cmnum("number of columns in display window during CONNECT",
  1764.  "80",10,&x,xxstring)) < 0)
  1765.     return(y);
  1766.   if ((y = cmcfm()) < 0) return(y);
  1767.   if (IsOS2FullScreen()) {
  1768.       if (x != 40 && x != 80 && x != 132) {
  1769.   printf("n?The width must be 40, 80,");
  1770. #ifdef NT
  1771.   printf(" or 132 under Windows 95.n.");
  1772. #else /* NT */
  1773.   printf(" or 132 in a Full Screen session.n.");
  1774. #endif /* NT */
  1775.   return(success = 0);
  1776.       }
  1777.   } else {
  1778.       if (!IsWARPed() && x != 80) {
  1779.   printf("n?OS/2 version is pre-WARP: the width must equal ");
  1780.   printf("80 in a Windowed Sessionn.");
  1781.   return(success = 0);
  1782.       }
  1783.       if (x < 20 || x > MAXTERMCOL) {
  1784.   printf(
  1785.       "n?The width must be between 20 and %dn.",MAXTERMCOL);
  1786.   return(success = 0);
  1787.       }
  1788.   }
  1789.   if (x > 8192/(tt_rows[VCMD]+1)) {
  1790.       printf(
  1791. "n?The max screen area is 8192 cells: %d(rows) x %d(cols) = %d cells.n",
  1792.      tt_rows[VCMD]+1,x,x*(tt_rows[VCMD]+1));
  1793.       return(success = 0);
  1794.   }
  1795.   tt_cols[VCMD] = x;
  1796.   VscrnSetWidth(VCMD, x);
  1797.   cmd_cols = x;
  1798.   SetCols(VCMD);
  1799.   return(success = 1);
  1800.       }
  1801.       case SCMD_HIG:
  1802.     if ((y = cmnum(
  1803. "number of rows in display window during CONNECT",
  1804.        "25",10,&x,xxstring)) < 0)
  1805.   return(y);
  1806. if ((y = cmcfm()) < 0) return(y);
  1807. if (tt_modechg == TVC_DIS) {
  1808.     printf("n?SET TERMINAL VIDEO-CHANGE DISABLEDn");
  1809.     return(success = 0);
  1810. }
  1811. if (IsOS2FullScreen()) {
  1812.     if (x != 25 && x != 43 && x != 50 && x != 60) {
  1813. printf("n?The height must be 25, 43, 50");
  1814. #ifdef NT
  1815. printf(" or 60 under Windows 95.n.");
  1816. #else /* NT */
  1817. printf(" or 60 in a Full Screen session.n.");
  1818. #endif /* NT */
  1819. return(success = 0);
  1820.     }
  1821. } else if (tt_modechg == TVC_W95) {
  1822.     if (x != 25 && x != 43 && x != 50) {
  1823. printf("n?The height must be 25, 43, 50");
  1824. #ifdef NT
  1825. printf(" under Windows 95.n.");
  1826. #else /* NT */
  1827. printf(" in a Full Screen session.n.");
  1828. #endif /* NT */
  1829. return(success = 0);
  1830.     }
  1831. } else {
  1832.             if (x < 8 || x > MAXTERMROW ) {
  1833.                 printf("n?The height must be between 8 and %dn.",MAXTERMROW);
  1834.                 return(success = 0);
  1835.     }
  1836. }
  1837.         if (x > 8192/tt_cols[VCMD]) {
  1838.             printf(
  1839. "n?The max screen area is 8192 cells: %d(rows) x %d(cols) = %d cells.n",
  1840.    x,tt_cols[VCMD],x*tt_cols[VCMD]);
  1841.             return(success = 0);
  1842. }
  1843.         tt_szchng[VCMD] = 1;
  1844.         tt_rows[VCMD] = cmd_rows = x;
  1845.         VscrnInit(VCMD);
  1846. SetCols(VCMD);
  1847.         return(success = 1);
  1848.     case SCMD_CUR: {
  1849.         int row, col;
  1850.         position * ppos;
  1851.         ppos = VscrnGetCurPos(VCMD);
  1852. #ifdef NT
  1853. #define itoa _itoa
  1854. #endif
  1855.         itoa(ppos->y+1, tmpbuf, 10);
  1856.         if ((y = cmnum("row (1-based)",tmpbuf,10,&row,xxstring)) < 0)
  1857.   return(y);
  1858.         itoa(ppos->x+1, tmpbuf, 10);
  1859.         if ((y = cmnum("col (1-based)",tmpbuf,10,&col,xxstring)) < 0)
  1860.   return(y);
  1861.         if ((x = cmcfm()) < 0) return(x);
  1862.         VscrnSetCurPos( VCMD, (short) (col-1), (short) (row-1) ) ;
  1863.         VscrnIsDirty( VCMD );
  1864.         return(success=1);
  1865.     }
  1866. #else
  1867.       case SCMD_WID:
  1868. y = cmnum("Command screen width, characters","80",10,&x,xxstring);
  1869. return(setnum(&cmd_cols,x,y,1024));
  1870.       case SCMD_HIG:
  1871. y = cmnum("Command screen height, rows","24",10,&x,xxstring);
  1872. return(setnum(&cmd_rows,x,y,1024));
  1873. #endif /* OS2 */
  1874.       case SCMD_INT:
  1875. return(seton(&cmdint));
  1876. #ifdef CK_AUTODL
  1877.       case SCMD_ADL:
  1878. return(seton(&cmdadl));
  1879. #endif /* CK_AUTODL */
  1880.       default:
  1881. return(-2);
  1882.     }
  1883. }
  1884. switch (xx) {
  1885. case XYDFLT: /* SET DEFAULT = CD */
  1886.     return(success = docd(XXCWD));
  1887. case XYDEBU: /* SET DEBUG { on, off, session } */
  1888.     if ((y = cmkey(dbgtab,ndbg,"","",xxstring)) < 0) {
  1889. return(y);
  1890.     } else if (y == 3) { /* 3 = timestamp */
  1891. debug(F101,"set debug y","",y);
  1892. x = seton(&debtim);
  1893. debug(F101,"set debug x","",x);
  1894. if (x < 0)
  1895.   return(x);
  1896. else
  1897.   return(success = 1);
  1898.     } else if ((x = cmcfm()) < 0)
  1899.       return(x);
  1900. #ifdef IKSD
  1901.     if (inserver && isguest) {
  1902.         printf("?Sorry, command disabled.rn");
  1903.         return(success = 0);
  1904.     }
  1905. #endif /* IKSD */
  1906.     debug(F101,"set debug y","",y);
  1907.     switch (y) {
  1908.       case 0: /* 0 = all debugging off. */
  1909. debses = 0;
  1910. #ifdef DEBUG
  1911. if (deblog) doclslog(LOGD);
  1912. #endif /* DEBUG */
  1913.         return(success = 1);
  1914.       case 1: /* 1 = log debugging to debug.log */
  1915. #ifdef DEBUG
  1916. deblog = debopn("debug.log", 0);
  1917. return(success = deblog ? 1 : 0);
  1918. #else
  1919. printf("?Sorry, debug log feature not enabledn");
  1920. return(success = 0);
  1921. #endif /* DEBUG */
  1922.       case 2: /* 2 = session */
  1923. return(success = debses = 1);
  1924.       default:
  1925.         return(-2);
  1926.     }
  1927.     break;
  1928. #ifndef NOXFER
  1929. case XYDELA: /* SET DELAY */
  1930.     y = cmnum("Number of seconds before starting to send","5",10,&x,xxstring);
  1931.     if (x < 0) x = 0;
  1932.     return(success = setnum(&ckdelay,x,y,999));
  1933. #endif /* NOXFER */
  1934. default:
  1935.     break;
  1936. }
  1937. switch (xx) {
  1938. #ifndef NODIAL
  1939. #ifdef CK_TAPI
  1940. case XYTAPI:
  1941.     return(settapi());
  1942. #endif /* CK_TAPI */
  1943. case XYDIAL: /* SET MODEM or SET DIAL */
  1944.     return(setdial(-1));
  1945. case XYMODM:
  1946.     return(setmodem());
  1947. #endif /* NODIAL */
  1948. #ifndef NOLOCAL
  1949. case XYDUPL: /* SET DUPLEX */
  1950.     if ((y = cmkey(dpxtab,2,"","full",xxstring)) < 0) return(y);
  1951.     if ((x = cmcfm()) < 0) return(x);
  1952.     duplex = y;
  1953.     return(success = 1);
  1954. case XYLCLE: /* LOCAL-ECHO (= DUPLEX) */
  1955.     return(success = seton(&duplex));
  1956. case XYESC: /* SET ESCAPE */
  1957.     return(success = setcc(ckitoa(DFESC),&escape));
  1958. #endif /* NOLOCAL */
  1959. case XYEXIT: /* SET EXIT */
  1960.     if ((z = cmkey(xittab,nexit,"","",xxstring)) < 0)
  1961.       return(z);
  1962.     switch (z) {
  1963.       case 0: /* STATUS */
  1964. y = cmnum("EXIT status code","",10,&x,xxstring);
  1965. return(success = setnum(&xitsta,x,y,-1));
  1966.       case 1: /* WARNING */
  1967. if ((z = cmkey(xitwtab,nexitw,"","",xxstring)) < 0) return(z);
  1968. if ((y = cmcfm()) < 0) return(y);
  1969. xitwarn = z;
  1970. return(success = 1);
  1971.       case 2:
  1972. success = seton(&exitonclose);
  1973. #ifdef TCPSOCKET
  1974. if (success) tn_exit = exitonclose;
  1975. #endif /* TCPSOCKET */
  1976. return(success);
  1977.       default:
  1978. return(-2);
  1979.     } /* End of SET EXIT switch() */
  1980. default:
  1981.     break;
  1982. }
  1983. switch (xx) {
  1984.   extern int cxflow[];
  1985.   case XYFILE: /* SET FILE */
  1986.     return(setfil(rmsflg));
  1987.   case XYFLOW: { /* FLOW-CONTROL */
  1988.     struct FDB k1, k2;
  1989.     cmfdbi(&k1,_CMKEY,
  1990. /* This is because chained FDB's don't give chained help yet */
  1991. #ifdef Plan9
  1992. #ifdef CK_RTSCTS
  1993.    "Flow control type, one of the following:n
  1994.    keep   none    rts/ctsn
  1995.  or connection type",
  1996. #else
  1997.    "Flow control type, one of the following:n
  1998.    keep   nonen
  1999.  or connection type",
  2000. #endif /* CK_RTSCTS */
  2001. #else
  2002. #ifdef CK_RTSCTS
  2003. #ifdef CK_DTRCD
  2004.    "Flow control type, one of the following:n
  2005.    dtr/cd    ctr/cts   keep    none    rts/cts   xon/xoffn
  2006.  or connection type",
  2007. #else
  2008.    "Flow control type, one of the following:n
  2009.    keep   none    rts/cts   xon/xoffn
  2010.  or connection type",
  2011. #endif /* CK_DTRCD */
  2012. #else
  2013.    "Flow control type, one of the following:n
  2014.    keep   none    xon/xoffn
  2015.  or connection type",
  2016. #endif /* CK_RTSCTS */
  2017. #endif /* Plan9 */
  2018.    "","",ncxtypesw, 4, xxstring, cxtypesw, &k2);
  2019.     cmfdbi(&k2,_CMKEY,"","","", nflo, 0, xxstring, flotab, NULL);
  2020.     x = cmfdb(&k1);
  2021.     if (x < 0) { /* Error */
  2022. if (x == -2 || x == -9)
  2023.   printf("?No keywords or switches match: "%s"n",atmbuf);
  2024. return(x);
  2025.     }
  2026.     z = cmresult.nresult; /* Keyword value */
  2027.     if (cmresult.fdbaddr == &k2) { /* Flow-control type keyword table */
  2028. if ((x = cmcfm()) < 0) /* Set it immediately */
  2029.   return(x);
  2030. flow = z;
  2031. debug(F101,"set flow","",flow);
  2032. #ifdef CK_SPEED
  2033. if (flow == FLO_XONX) /* Xon/Xoff forces prefixing */
  2034.   ctlp[XON] = ctlp[XOFF] = ctlp[XON+128] = ctlp[XOFF+128] = 1;
  2035. #endif /* CK_SPEED */
  2036. autoflow = (flow == FLO_AUTO);
  2037. return(success = 1); /* Done */
  2038.     }
  2039.     debug(F101,"set flow /blah 1","",z); /* SET FLOW /for-what */
  2040.     if ((y = cmkey(flotab,nflo,"Flow control type","none",xxstring)) < 0)
  2041.       return(y);
  2042.     if ((x = cmcfm()) < 0) return(x);
  2043.     debug(F101,"set flow /blah 2","",y);
  2044.     if (z != FLO_AUTO && z >= 0 && z <= CXT_MAX)
  2045.       cxflow[z] = y;
  2046.     debug(F101,"set flow","",flow);
  2047.     debug(F101,"set flow autoflow","",autoflow);
  2048.     return(success = 1);
  2049.   }
  2050. case XYHAND: /* HANDSHAKE */
  2051.     if ((y = cmkey(hshtab,nhsh,"","none",xxstring)) < 0) return(y);
  2052.     if (y == 998) {
  2053. if ((x = cmnum("ASCII value","",10,&y,xxstring)) < 0)
  2054.   return(x);
  2055. if ((y < 1) || ((y > 31) && (y != 127))) {
  2056.     printf("?Character must be in ASCII control rangen");
  2057.     return(-9);
  2058. }
  2059.     }
  2060.     if ((x = cmcfm()) < 0) return(x);
  2061.     turn = (y > 0127) ? 0 : 1 ;
  2062.     turnch = y;
  2063.     return(success = 1);
  2064. #ifndef NOSPL
  2065. case XYMACR: /* SET MACRO */
  2066.     if ((y = cmkey(smactab,2,"","",xxstring)) < 0) return(y);
  2067.     switch (y) {
  2068.       case 0: return(success = seton(&mecho));
  2069.       case 1: return(success = seton(&merror[cmdlvl]));
  2070.       default: return(-2);
  2071.     }
  2072. #endif /* NOSPL */
  2073.   case XYMSGS:
  2074. #ifdef VMS
  2075.     if ((z = cmkey(onoff,2,"","",xxstring)) < 0) return(z);
  2076.     if ((y = cmcfm()) < 0) return(y);
  2077.     vms_msgs = z;
  2078.     printf("Sorry, SET MESSAGES not implemented yetn");
  2079.     return(success = 0);
  2080. #endif /* VMS */
  2081. default:
  2082.     break;
  2083. }
  2084. switch (xx) {
  2085. case XYPARI: /* PARITY */
  2086.     if ((y = cmkey(partbl,npar,"","none",xxstring)) < 0)
  2087.       return(y);
  2088. /* If parity not none, then we also want 8th-bit prefixing */
  2089. #ifdef HWPARITY
  2090.     if (y == 'H') { /* Hardware */
  2091. if ((x = cmkey(hwpartbl,nhwpar,"","even",xxstring)) < 0)
  2092.   return(x);
  2093.     }
  2094. #endif /* HWPARITY */
  2095.     if ((z = cmcfm()) < 0)
  2096.       return(z);
  2097. #ifdef HWPARITY
  2098.     if (y == 'H') { /* 8 data bits plus hardware parity */
  2099. parity = 0;
  2100. #ifndef NOXFER
  2101. ebqflg = 0;
  2102. #endif /* NOXFER */
  2103. hwparity = x;
  2104.     } else { /* 7 data bits + software parity */
  2105. hwparity = 0;
  2106. #endif /* HWPARITY */
  2107. parity = y;
  2108. #ifndef NOXFER
  2109. ebqflg = (parity) ? 1 : 0;
  2110. #endif /* NOXFER */
  2111. #ifdef HWPARITY
  2112.     }
  2113. #endif /* HWPARITY */
  2114.     return(success = 1);
  2115. #ifndef NOFRILLS
  2116. case XYPROM: /* SET PROMPT */
  2117. /*
  2118.   Note: xxstring not invoked here.  Instead, it is invoked every time the
  2119.   prompt is issued.  This allows the prompt string to contain variables
  2120.   that can change, like v(dir), v(time), etc.
  2121. */
  2122.     sprintf(line,
  2123.     "{%s}",                /* Default might have a trailing space */
  2124.     inserver ? ikprompt : ckprompt
  2125.     );
  2126.     if ((x = cmtxt("Program's command prompt",line,&s,NULL)) < 0)
  2127.       return(x);
  2128.     s = brstrip(s); /* Remove enclosing braces, if any */
  2129. #ifdef COMMENT
  2130. /*
  2131.   Let's not do this any more -- we don't do it anywhere else.
  2132. */
  2133.     else if (*s == '"') { /* For compatibility with pre-5A */
  2134. x = (int)strlen(s);
  2135. if (s[x-1] == '"') {
  2136.     s[x-1] = NUL;
  2137.     s++;
  2138. }
  2139.     }
  2140. #endif /* COMMENT */
  2141.     cmsetp(s); /* Set the prompt */
  2142.     return(success = 1);
  2143. #endif /* NOFRILLS */
  2144. #ifndef NOXFER
  2145. case XYRETR: /* RETRY: per-packet retry limit */
  2146.     y = cmnum("Maximum retries per packet","10",10,&x,xxstring);
  2147.     if (x < 0) x = 0;
  2148.     if ((x = setnum(&maxtry,x,y,999)) < 0) return(x);
  2149. #ifdef COMMENT
  2150.     if (maxtry <= wslotr) {
  2151. printf("?Retry limit must be greater than window sizen");
  2152. return(success = 0);
  2153.     }
  2154. #endif /* COMMENT */
  2155.     if (rmsflg) {
  2156. sstate = setgen('S', "403", ckitoa(maxtry), "");
  2157. return((int) sstate);
  2158.     } else return(success = x);
  2159. #endif /* NOXFER */
  2160. #ifndef NOSERVER
  2161. case XYSERV: /* SET SERVER items */
  2162.     if ((y = cmkey(srvtab,nsrvt,"","",xxstring)) < 0) return(y);
  2163.     switch (y) {
  2164.       case XYSERI:
  2165. if ((y = cmnum("Number of seconds, or 0 for no idle timeout",
  2166.                        "0",10,&x,xxstring)) < 0)
  2167.   return(y);
  2168. if (x < 0)
  2169.   x = 0;
  2170. if ((y = cmcfm()) < 0)
  2171.   return(y);
  2172. #ifndef OS2
  2173. srvtim = 0;
  2174. #endif /* OS2 */
  2175. srvidl = x;
  2176. return(success = 1);
  2177.       case XYSERT:
  2178. if ((y = cmnum("Interval for server NAKs, 0 = none",ckitoa(DSRVTIM),
  2179.        10,&x, xxstring)) < 0)
  2180.   return(y);
  2181. if (x < 0) {
  2182.     printf("n?Specify a positive number, or 0 for no server NAKsn");
  2183.     return(0);
  2184. }
  2185. if ((y = cmcfm()) < 0) return(y);
  2186. if (rmsflg) {
  2187.     sstate = setgen('S', "404", ckitoa(x), "");
  2188.     return((int) sstate);
  2189. } else {
  2190. #ifndef OS2
  2191.     srvidl = 0;
  2192. #endif /* OS2 */
  2193.     srvtim = x; /* Set the server timeout variable */
  2194.     return(success = 1);
  2195. }
  2196.       case XYSERD: /* SERVER DISPLAY */
  2197. return(success = seton(&srvdis)); /* ON or OFF... */
  2198. #ifndef NOSPL
  2199.       case XYSERP: /* SERVER GET-PATH */
  2200. return(parsdir(2));
  2201. #endif /* NOSPL */
  2202.       case XYSERL: /* SERVER LOGIN */
  2203. return(cklogin());
  2204.       case XYSERC: /* SERVER CD-MESSAGE */
  2205. x = rmsflg ?
  2206.   cmkey(onoff,2,"","",xxstring) :
  2207.   cmkey(cdmsg,3,"","",xxstring);
  2208. if (x < 0)
  2209.   return(x);
  2210. if (x == 2) { /* CD-MESSAGE FILE */
  2211.     if ((x = cmtxt("Name of file","",&s,NULL)) < 0)
  2212.       return(x);
  2213.     if (!*s) {
  2214. s = NULL;
  2215. srvcdmsg = 0;
  2216.     }
  2217.     makestr(&cdmsgstr,s);
  2218.     makelist(cdmsgstr,cdmsgfile,8);
  2219.     return(success = 1);
  2220. }
  2221. if ((y = cmcfm()) < 0) /* CD-MESSAGE ON/OFF */
  2222.   return(y);
  2223. if (rmsflg) {
  2224.     sstate = setgen('S', "420", x ? "1" : "0", "");
  2225.     return((int) sstate);
  2226. } else {
  2227.     if (x > 0)
  2228.       srvcdmsg |= 1;
  2229.     else
  2230.       srvcdmsg &= 2;
  2231.     return(success = 1);
  2232. }
  2233.       case XYSERK: /* SERVER KEEPALIVE */
  2234. return(success = seton(&srvping)); /* ON or OFF... */
  2235.       default:
  2236. return(-2);
  2237.     }
  2238. #endif /* NOSERVER */
  2239. }
  2240. switch (xx) {
  2241. #ifdef UNIX
  2242. #ifndef NOJC
  2243. case XYSUSP: /* SET SUSPEND */
  2244.     seton(&suspend); /* on or off... */
  2245.     return(success = 1);
  2246. #endif /* NOJC */
  2247. #endif /* UNIX */
  2248. case XYTAKE: /* SET TAKE */
  2249.     if ((y = cmkey(taktab,4,"","",xxstring)) < 0) return(y);
  2250.     switch (y) {
  2251.       case 0: return(success = seton(&techo));
  2252. #ifndef NOSPL
  2253.       case 1: return(success = seton(&takerr[cmdlvl]));
  2254. #else
  2255.       case 1: return(success = seton(&takerr[tlevel]));
  2256. #endif /* NOSPL */
  2257.       case 2: techo = 0; return(success = 1); /* For compatibility with */
  2258.       case 3: techo = 1; return(success = 1); /* MS-DOS Kermit */
  2259.       default: return(-2);
  2260.     }
  2261. #ifndef NOSCRIPT
  2262. case XYSCRI: /* SET SCRIPT */
  2263.     if ((y = cmkey(scrtab,1,"","echo",xxstring)) < 0) return(y);
  2264.     switch (y) {
  2265.       case 0: return(success = seton(&secho));
  2266.       default: return(-2);
  2267.     }
  2268. #endif /* NOSCRIPT */
  2269. default:
  2270.     break;
  2271. }
  2272. #ifndef NOLOCAL
  2273. switch (xx) {
  2274. case XYTERM: /* SET TERMINAL */
  2275.     x = settrm();
  2276.     success = (x > 0) ? 1 : 0;
  2277.     return(x);
  2278. #ifdef NT
  2279. case XYWIN95: /* SET WIN95 workarounds */
  2280.     x = setwin95();
  2281.     success = (x > 0 ? 1 : 0);
  2282.     return(x);
  2283. #endif /* NT */
  2284. #ifdef OS2
  2285. case XYDLR: /* SET DIALER workarounds */
  2286.     x = setdialer();
  2287.     success = (x > 0 ? 1 : 0);
  2288.     return(x);
  2289. case XYTITLE: /* SET TITLE of window */
  2290.     x = settitle();
  2291.     success = (x > 0 ? 1 : 0);
  2292.     return(x);
  2293. #endif /* OS2 */
  2294. #ifdef OS2MOUSE
  2295. case XYMOUSE: /* SET MOUSE */
  2296.     return(success = setmou());
  2297. #endif /* OS2MOUSE */
  2298. case XYBELL: /* SET BELL */
  2299.     return( success = setbell() );
  2300. #ifdef OS2
  2301. case XYPRTY:
  2302.     return( success = setprty() );
  2303. #endif /* OS2 */
  2304. default:
  2305.     break;
  2306. }
  2307. #endif /* NOLOCAL */
  2308. switch (xx) {
  2309. /* SET SEND/RECEIVE protocol parameters. */
  2310. #ifndef NOXFER
  2311. case XYRECV:
  2312. case XYSEND:
  2313.     return(setsr(xx,rmsflg));
  2314. #endif /* NOXFER */
  2315. #ifndef NOLOCAL /* Session log text/binary selection */
  2316. #ifdef OS2ORUNIX /* UNIX needs it */
  2317. #define _XYSESS
  2318. #endif /* OS2ORUNIX */
  2319. #ifdef OSK /* OS-9 too */
  2320. #define _XYSESS
  2321. #endif /* OSK */
  2322. #ifdef _XYSESS
  2323. case XYSESS: /* SESSION-LOG */
  2324.     if ((x = cmkey(sfttab,nsfttab,"type of file",
  2325. #ifdef OS2
  2326.    "binary",
  2327. #else /* OS2 */
  2328.    "text",
  2329. #endif /* OS2 */
  2330.    xxstring
  2331.    )
  2332.  ) < 0)
  2333.       return(x);
  2334.     if ((y = cmcfm()) < 0) return(y);
  2335.     sessft = x;
  2336.     return(success = 1);
  2337. #undef _XYSESS
  2338. #endif /* _XYSESS */
  2339. case XYSPEE: /* SET SPEED */
  2340.     lp = line;
  2341.     sprintf(lp,"Transmission rate for %s in bits per second",ttname);
  2342.     zz = -1L;
  2343.     if ((x = cmkey(spdtab,nspd,line,"",xxstring)) < 0) {
  2344. if (x == -3) printf("?value requiredn");
  2345. #ifdef USETCSETSPEED
  2346. /* In this case, any number can be tried */
  2347. /* There's a parse error message but the request still goes thru */
  2348. if (rdigits(atmbuf))
  2349.   zz = atol(atmbuf);
  2350. else
  2351. #endif /* USETCSETSPEED */
  2352. return(x);
  2353.     }
  2354.     if ((y = cmcfm()) < 0) return(y);
  2355. #ifdef IKSD
  2356.     if (inserver) {
  2357.         printf("?Sorry, command disabled.rn");
  2358.         return(success = 0);
  2359.     }
  2360. #endif /* IKSD */
  2361.     if (!local) {
  2362. printf("?Sorry, you must SET LINE firstn");
  2363. return(success = 0);
  2364.     } else if (network) {
  2365. printf("n?Speed cannot be set for network connectionsn");
  2366. return(success = 0);
  2367.     }
  2368. /*
  2369.   Note: This way of handling speeds is not 16-bit safe for speeds greater
  2370.   than 230400.  The argument to ttsspd() should have been a long.
  2371. */
  2372. #ifdef USETCSETSPEED
  2373.     if (zz > -1L)
  2374.       x = zz / 10L;
  2375. #endif /* USETCSETSPEED */
  2376.       zz = (long) x * 10L;
  2377.     if (zz == 130L) zz = 134L;
  2378.     if (zz == 70L) zz = 75L; /* (see spdtab[] definition) */
  2379.     if (ttsspd(x) < 0)  { /* Call ttsspd with cps, not bps! */
  2380. printf("?Unsupported line speed - %ldn",zz);
  2381. return(success = 0);
  2382.     } else {
  2383. #ifdef CK_TAPI
  2384. if (!tttapi || tapipass)
  2385.   speed = ttgspd(); /* Read it back */
  2386. else
  2387.   speed = zz;
  2388. #else /* CK_TAPI */
  2389. speed = ttgspd(); /* Read it back */
  2390. #endif /* CK_TAPI */
  2391. if (speed != zz)  { /* Call ttsspd with cps, not bps! */
  2392.     printf("?SET SPEED fails, speed is %ldn",speed);
  2393.     return(success = 0);
  2394. }
  2395. if (pflag && !cmdsrc()) {
  2396.     if (speed == 8880)
  2397.       printf("%s, 75/1200 bpsn",ttname);
  2398.     else if (speed == 134)
  2399.       printf("%s, 134.5 bpsn",ttname);
  2400.     else
  2401.       printf("%s, %ld bpsn",ttname,speed);
  2402. }
  2403. return(success = 1);
  2404.     }
  2405. #endif /* NOLOCAL */
  2406. #ifndef NOXFER
  2407.   case XYXFER: /* SET TRANSFER */
  2408.     if ((y = cmkey(rmsflg ? rtstab : tstab, /* (or REMOTE SET TRANSFER) */
  2409.    rmsflg ? nrts : nts,
  2410.    "","character-set",xxstring)) < 0) return(y);
  2411.     switch (y) {
  2412. #ifdef XFRCAN
  2413.       case XYX_CAN: /* CANCELLATION */
  2414. if ((z = cmkey(onoff,2,"","",xxstring)) < 0) return(z);
  2415. if (z == 0) { /* OFF */
  2416.     if ((y = cmcfm()) < 0) return(y);
  2417.     xfrcan = 0;
  2418. } else {
  2419.     if ((y = cmnum("ASCII code for cancellation character","3",10,&x,
  2420.    xxstring)) < 0)
  2421.       return(y);
  2422.     if (x > 31 && x != 127) {
  2423. printf("Cancel character must be in ASCII control rangen");
  2424. return(-9);
  2425.     }
  2426.     if ((y = cmnum("How many required to cause cancellation",
  2427.    "2",10,&z, xxstring)) < 0)
  2428.       return(y);
  2429.     if (z < 2) {
  2430. printf("Number must be 2 or greatern");
  2431. return(-9);
  2432.     }
  2433.     if ((y = cmcfm()) < 0) return(y);
  2434.     xfrcan = 1; /* CANCELLATION ON */
  2435.     xfrchr = x; /* Using this character */
  2436.     xfrnum = z; /* Needing this many of them */
  2437. }
  2438. return(success = 1);
  2439. #endif /* XFRCAN */
  2440. #ifndef NOCSETS
  2441.       case XYX_CSE: /* CHARACTER-SET */
  2442. if ((y = cmkey(tcstab,ntcs,"","transparent",xxstring)) < 0) return(y);
  2443. if ((x = cmcfm()) < 0) return(x);
  2444. if (rmsflg) {
  2445.     sstate = setgen('S', "405", tcsinfo[y].designator, "");
  2446.     return((int) sstate);
  2447. } else {
  2448.     extern int s_cset, fcharset, axcset[];
  2449.     tslevel = (y == TC_TRANSP) ? 0 : 1; /* transfer syntax level */
  2450.     tcharset = y; /* transfer character set */
  2451.     if (s_cset == XMODE_A) /* If SEND CHARACTER-SET is AUTO */
  2452.       if (y > -1 && y <= MAXTCSETS)
  2453. if (axcset[y] > -1 && axcset[y] > MAXFCSETS)
  2454.   fcharset = axcset[y]; /* Auto-pick file charset */
  2455.     setxlatype(tcharset,fcharset); /* Translation type */
  2456.     return(success = 1);
  2457. }
  2458. #endif /* NOCSETS */
  2459.       case XYX_LSH: /* LOCKING-SHIFT */
  2460.   if ((y = cmkey(lstab,nls,"","on",xxstring)) < 0)
  2461.     return(y);
  2462.   if ((x = cmcfm()) < 0) return(x);
  2463.   lscapr = (y == 1) ? 1 : 0; /* ON: requested = 1 */
  2464.   lscapu = (y == 2) ? 2 : 0; /* FORCED:  used = 1 */
  2465.   return(success = 1);
  2466. #ifdef CK_XYZ
  2467.       case XYX_PRO: /* Protocol */
  2468. #ifndef OS2
  2469. if (inserver) {
  2470.     printf("?Sorry, only Kermit protocol is availablen");
  2471.     return(-9);
  2472. }
  2473. #endif /* OS2 */
  2474. return(setproto());
  2475. #endif /* CK_XYZ */
  2476.       case XYX_MOD: /* Mode */
  2477. if ((y = cmkey(xfrmtab,2,"","automatic",xxstring)) < 0)
  2478.   return(y);
  2479. if ((x = cmcfm()) < 0) return(x);
  2480. if (rmsflg) {
  2481.     sstate = setgen('S', "410", y == XMODE_A ? "0" : "1", "");
  2482.     return((int)sstate);
  2483. }
  2484. g_xfermode = y;
  2485. xfermode = y;
  2486. return(success = 1);
  2487. #ifndef NOLOCAL
  2488.       case XYX_DIS: /* Display */
  2489. return(doxdis());
  2490. #endif /* NOLOCAL */
  2491.       case XYX_SLO: /* Slow-start */
  2492.         return(seton(&slostart));
  2493. #ifndef NOSPL
  2494.       case XYX_CRC: /* CRC */
  2495.         return(seton(&docrc));
  2496. #endif /* NOSPL */
  2497.       case XYX_BEL: /* Bell */
  2498.         return(seton(&xfrbel));
  2499. #ifdef PIPESEND
  2500.       case XYX_PIP: /* Pipes */
  2501. #ifndef NOPUSH
  2502. if (nopush) {
  2503. #endif /* NOPUSH */
  2504.     printf("Sorry, access to pipes is disabledn");
  2505.     return(-9);
  2506. #ifndef NOPUSH
  2507. } else
  2508. #endif /* NOPUSH */
  2509.   return(seton(&usepipes));
  2510. #endif /* PIPESEND */
  2511.       case XYX_INT: /* Interruption */
  2512.         return(seton(&xfrint));
  2513.       default:
  2514. return(-2);
  2515.     }
  2516. #endif /* NOXFER */
  2517. }
  2518. switch (xx) {
  2519. #ifndef NOXMIT
  2520.   case XYXMIT: /* SET TRANSMIT */
  2521.     return(setxmit());
  2522. #endif /* NOXMIT */
  2523. #ifndef NOXFER
  2524. #ifndef NOCSETS
  2525.   case XYUNCS: /* UNKNOWN-CHARACTER-SET */
  2526.     if ((y = cmkey(ifdtab,2,"","discard",xxstring)) < 0) return(y);
  2527.     if ((x = cmcfm()) < 0) return(x);
  2528.     unkcs = y;
  2529.     return(success = 1);
  2530. #endif /* NOCSETS */
  2531. #endif /* NOXFER */
  2532. #ifndef NOPUSH
  2533. #ifdef UNIX
  2534. case XYWILD: /* WILDCARD-EXPANSION */
  2535.     if ((y = cmkey(wildtab,2,"who expands wildcards","kermit",xxstring)) < 0)
  2536.       return(y);
  2537.     if ((z = cmkey(wdottab,
  2538.    2,
  2539.    "whether to match filenames that start with "."",
  2540.    "/no-match-dot-files",
  2541.    xxstring)
  2542.  ) < 0)
  2543.       return(z);
  2544.     if ((x = cmcfm()) < 0) return(x);
  2545.     if (nopush) {
  2546. if (y > 0) {
  2547.     printf("Shell expansion is disabledn");
  2548.     return(success = 0);
  2549. }
  2550.     }
  2551.     wildxpand = y;
  2552.     matchdot = z;
  2553.     return(success = 1);
  2554. #endif /* UNIX */
  2555. #endif /* NOPUSH */
  2556. #ifndef NOXFER
  2557.   case XYWIND: /* WINDOW-SLOTS */
  2558.     if (protocol == PROTO_K) {
  2559. y = cmnum("Window size for Kermit protocol, 1 to 32",
  2560.   "1", 10, &x, xxstring);
  2561. y = setnum(&z,x,y,MAXWS); /* == 32 */
  2562.     }
  2563. #ifdef CK_XYZ
  2564.     else if (protocol == PROTO_Z) {
  2565. y = cmnum("Window size for ZMODEM protocol, 0 to 65535",
  2566.   "0", 10, &x, xxstring);
  2567. y = setnum(&z,x,y,65535);
  2568.     }
  2569. #endif /* CK_XYZ */
  2570.     else {
  2571. y = cmnum("Window size for current protocol",
  2572.   "", 10, &x, xxstring);
  2573. y = setnum(&z,x,y,65472); /* Doesn't matter - we won't use it */
  2574.     }
  2575.     if (y < 0) return(y);
  2576.     if (protocol == PROTO_K) {
  2577. if (z < 1)
  2578.   z = 1;
  2579.     }
  2580. #ifdef CK_XYZ
  2581.     else if (protocol == PROTO_Z) {
  2582.         /* Zmodem windowing is closer to Kermit packet length */
  2583.         /* than Kermit window size.  If Window size is zero   */
  2584.         /* an end of frame and CRC is sent only at the end of */
  2585.         /* the file (default).  Otherwise, an End of Frame    */
  2586.         /* and CRC are sent after Window Size number of bytes */
  2587.         if (z < 0) /* Disable windowing  */
  2588.             z = 0;
  2589.     } else {
  2590. printf("?SET WINDOW does not apply to %s protocoln",
  2591.        ptab[protocol].p_name
  2592.        );
  2593.     }
  2594. #endif /* CK_XYZ */
  2595. #ifdef COMMENT
  2596.     /* This is taken care of automatically now in protocol negotiation */
  2597.     if (maxtry < z) {
  2598. printf("?Window slots must be less than retry limitn");
  2599. return(success = 0);
  2600.     }
  2601. #endif /* COMMENT */
  2602.     if (protocol == PROTO_K && rmsflg) { /* Set remote window size */
  2603. wslotr = z; /* Set local window size too */
  2604. ptab[protocol].winsize = wslotr;
  2605. sstate = setgen('S', "406", ckitoa(z), "");
  2606. return((int) sstate);
  2607.     }
  2608.     wslotr = z; /* Set requested window size here */
  2609.     ptab[protocol].winsize = wslotr; /* and in protocol-specific table */
  2610.     if (protocol == PROTO_K) { /* And for Kermit only... */
  2611. swcapr = (wslotr > 1) ? 1 : 0; /* set window bit in capas word */
  2612. if (wslotr > 1) { /* Window size > 1? */
  2613.     y = adjpkl(urpsiz,wslotr,bigrbsiz); /* Maybe adjust packet size */
  2614.     if (y != urpsiz) { /* Did it change? */
  2615. urpsiz = y;
  2616. if (msgflg)
  2617.   printf(
  2618. " Adjusting receive packet-length to %d for %d window slotsn",
  2619.  urpsiz,
  2620.  wslotr
  2621.  );
  2622.     }
  2623. }
  2624.     }
  2625.     return(success = 1);
  2626. #endif /* NOXFER */
  2627. }
  2628. switch (xx) {
  2629. #ifndef NOSPL
  2630.   case XYOUTP: /* OUTPUT command parameters */
  2631.     if ((y = cmkey(outptab,noutptab,"OUTPUT command parameter","pacing",
  2632.    xxstring)) < 0)
  2633.       return(y);
  2634.     switch(y) { /* Which parameter */
  2635.       case OUT_PAC: /* PACING */
  2636. y = cmnum("Milliseconds to pause between each OUTPUT character","100",
  2637.   10,&x,xxstring);
  2638. y = setnum(&z,x,y,16383); /* Verify and get confirmation */
  2639. if (y < 0) return(y);
  2640. if (z < 0) z = 0; /* (save some space) */
  2641. pacing = z;
  2642. return(success = 1);
  2643.       case OUT_ESC: /* Special-escapes */
  2644. return(seton(&outesc));
  2645.       default: /* (shouldn't happen) */
  2646. return(-2);
  2647.     }
  2648. #endif /* NOSPL */
  2649. #ifdef CK_SPEED
  2650.   case XYQCTL: {
  2651.     short *p;
  2652.     int zz;
  2653.     if ((z = cmkey(ctltab,2, "control-character prefixing option",""
  2654.    ,xxstring)) < 0)
  2655.       return(z);
  2656.     /* Make space for a temporary copy of the prefixing table */
  2657.     p = (short *)malloc(256 * sizeof(short));
  2658.     if (!p) {
  2659. printf("?Internal error - malloc failuren");
  2660. return(-9);
  2661.     }
  2662.     for (i = 0; i < 256; i++) p[i] = ctlp[i]; /* Copy current table */
  2663.     switch (z) {
  2664.       case 0: /* UNPREFIXED control character */
  2665.       case 1: /* PREFIXED control character */
  2666. while (1) { /* Collect a list of numbers */
  2667. #ifndef NOSPL
  2668.     x_ifnum = 1; /* Turn off complaints from eval() */
  2669. #endif /* NOSPL */
  2670.     if ((x = cmnum((z == 0) ?
  2671. "n Numeric ASCII value of control character that needs NO prefix,n
  2672.  or the word "all", or carriage return to complete the list" :
  2673. "n Numeric ASCII value of control character that MUST BE prefixed,n
  2674.  or the word "all", or carriage return to complete the list",
  2675.    "",10,&y,xxstring
  2676.    )) < 0) {
  2677. #ifndef NOSPL
  2678. x_ifnum = 0;
  2679. #endif /* NOSPL */
  2680. if (x == -3) {
  2681.     if ((x = cmcfm()) < 0) return(x);
  2682.     break;
  2683. }
  2684. if (x == -2) {
  2685.     if (p) { free(p); p = NULL; }
  2686.     debug(F110,"SET CONTROL atmbuf",atmbuf,0);
  2687.     if (!ckstrcmp(atmbuf,"all",3,0) ||
  2688. !ckstrcmp(atmbuf,"al",2,0) ||
  2689. !ckstrcmp(atmbuf,"a",1,0)) {
  2690. if ((x = cmcfm()) < 0) /* Get confirmation */
  2691.   return(x);
  2692. if (z)
  2693.   prefixing = PX_ALL;
  2694. #ifndef UNPREFIXZERO
  2695. /* Set all values, but don't touch 0 */
  2696. for (y = 1; y < 32; y++) ctlp[y] = (short) z;
  2697. #else
  2698. /* Zero too */
  2699. for (y = 0; y < 32; y++) ctlp[y] = (short) z;
  2700. #endif /* UNPREFIXZERO */
  2701. for (y = 127; y < 160; y++) ctlp[y] = (short) z;
  2702. ctlp[255] = (short) z;
  2703. /* Watch out for XON and XOFF */
  2704. if (flow == FLO_XONX && z == 0) {
  2705.     if (msgflg) {
  2706. printf(
  2707. " XON/XOFF characters 17, 19, 145, 147 not affected.n");
  2708. printf(
  2709. #ifdef CK_RTSCTS
  2710. " SET FLOW NONE or RTS/CTS to transmit these characters unprefixed.n"
  2711. #else
  2712. " SET FLOW NONE to transmit these characters unprefixed.n"
  2713. #endif /* CK_RTSCTS */
  2714.        );
  2715.     }
  2716.     ctlp[XON] =
  2717.       ctlp[XOFF] =
  2718. ctlp[XON+128] =
  2719.   ctlp[XOFF+128] = 1;
  2720. }
  2721. #ifdef TNCODE
  2722. /* Watch out for TELNET IAC */
  2723. if (network && (ttnproto == NP_TELNET) && z == 0) {
  2724.     ctlp[255] = 1;
  2725.     if (parity == 'e' || parity == 'm') ctlp[127] = 1;
  2726.     ctlp[13] = 1;
  2727.     if (msgflg)
  2728.       printf(
  2729.        " TELNET IAC = 255, CR = 13, not affected.n");
  2730. }
  2731. #endif /* TNCODE */
  2732. #ifndef UNPREFIXZERO
  2733. #ifdef OS2
  2734. if (z == 0 && protocol != PROTO_K)
  2735.   ctlp[0] = 0;
  2736. #endif /* OS2 */
  2737. #endif /* UNPREFIXZERO */
  2738. return(success = 1);
  2739.     } else {
  2740. printf("?Please specify a number or the word ALLn");
  2741. return(-9);
  2742.     }
  2743. } else {
  2744.     if (p) free(p);
  2745.     return(x);
  2746. }
  2747.     }
  2748. #ifndef NOSPL
  2749.     x_ifnum = 0;
  2750. #endif /* NOSPL */
  2751. #ifdef UNPREFIXZERO
  2752.     zz = 0;
  2753. #else
  2754. #ifndef OS2
  2755.     zz = 1 - z;
  2756. #else
  2757.     zz = 0; /* Allow 0 (but only for Zmodem) */
  2758. #endif /* OS2 */
  2759. #endif /* UNPREFIXZERO */
  2760.     /* printf("x = %d, y = %d, z = %d, zz = %dn", x,y,z,zz); */
  2761.     if ((y >  31 && y < 127) || /* A specific numeric value */
  2762. (y > 159 && y < 255) || /* Check that it is a valid */
  2763. (y < zz) || /* control code. */
  2764. (y > 255)) {
  2765. printf("?Values allowed are: %d-31, 127-159, 255n",zz);
  2766. if (p) free(p);
  2767. return(-9);
  2768.     }
  2769.     x = y & 127; /* Get 7-bit value */
  2770.     if (z == 0) { /* If they are saying it is safe... */
  2771. if (((flow == FLO_XONX) && /* If flow control is Xon/Xoff */
  2772.   (x == XON || x == XOFF)) /* XON & XOFF chars not safe. */
  2773.  ) {
  2774.     if (msgflg)
  2775.       printf("Sorry, not while Xon/Xoff is in effect.n");
  2776.     if (p) free(p);
  2777.     return(-9);
  2778. }
  2779. #ifdef TNCODE
  2780. else if (network && (ttnproto == NP_TELNET)
  2781.  && (y == CR || (unsigned) y == (unsigned) 255)) {
  2782.     if (msgflg)
  2783.       printf("Sorry, not on a TELNET connection.n");
  2784.     if (p) free(p);
  2785.     return(-9);
  2786. }
  2787. #endif /* TNCODE */
  2788.     }
  2789.     p[y] = (char) z; /* All OK, set flag */
  2790. } /* End of while loop */
  2791. /*
  2792.   Get here only if they have made no mistakes.  Copy temporary table back to
  2793.   permanent one, then free temporary table and return successfully.
  2794. */
  2795. for (i = 0; i < 256; i++) ctlp[i] = p[i];
  2796. if (p) free(p);
  2797. return(success = 1);
  2798.       default:
  2799. return(-2);
  2800.     }
  2801.   }
  2802. #endif /* CK_SPEED */
  2803. }
  2804. switch (xx) {
  2805. #ifndef NOXFER
  2806.   case XYREPT:
  2807.     if ((y = cmkey(rpttab,2,"repeat-count compression parameter","",xxstring))
  2808. < 0)
  2809.       return(y);
  2810.     switch(y) {
  2811.       case 0:
  2812. return(success = seton(&rptena)); /* REPEAT COUNTS = ON, OFF */
  2813.       case 1: /* REPEAT MININUM number */
  2814. printf("(not implemented yet, nothing happens)n");
  2815. return(-9);
  2816.       case 2: /* REPEAT PREFIX char */
  2817. if ((x = cmnum("ASCII value","",10,&z,xxstring)) < 0)
  2818.   return(x);
  2819. if ((x = cmcfm()) < 0) return(x);
  2820. if ((z > 32 && z < 63) || (z > 95 && z < 127)) {
  2821.     if (y == 1) rptmin = (CHAR) z; else myrptq = (CHAR) z;
  2822.     return(success = 1);
  2823. } else {
  2824.     printf("?Illegal value for prefix charactern");
  2825.     return(-9);
  2826. }
  2827.     }
  2828. #endif /* NOXFER */
  2829. #ifndef NOSPL
  2830.   case XYALRM: {
  2831. #ifndef COMMENT
  2832.       int yy;
  2833.       long zz;
  2834.       zz = -1L;
  2835.       yy = x_ifnum;
  2836.       x_ifnum = 1; /* Turn off internal complaints */
  2837.       y = cmnum("Seconds from now, or time of day as hh:mm:ss",
  2838. "0" ,10, &x, xxstring);
  2839.       x_ifnum = yy;
  2840.       if (y < 0) {
  2841.   if (y == -2) { /* Invalid number or expression */
  2842.       zz = tod2sec(atmbuf); /* Convert to secs since midnight */
  2843.       if (zz < 0L) {
  2844.   printf("?Number, expression, or time of day requiredn");
  2845.   return(-9);
  2846.       } else {
  2847.   char now[32]; /* Current time */
  2848.   char *p;
  2849.   long tnow;
  2850.   p = now;
  2851.   ztime(&p);
  2852.   tnow = atol(p+11) * 3600L + atol(p+14) * 60L + atol(p+17);
  2853.   if (zz < tnow) /* User's time before now */
  2854.     zz += 86400L; /* So make it tomorrow */
  2855.   zz -= tnow; /* Seconds from now. */
  2856.       }
  2857.   } else
  2858.     return(y);
  2859.       }
  2860.       if (x < 0) {
  2861.   printf("?Alarm time is in the past.n");
  2862.   return(-9);
  2863.       }
  2864.       if ((y = cmcfm()) < 0) return(y);
  2865.       if (zz > -1L) { /* Time of day given? */
  2866.   x = zz;
  2867.   if (zz != (long) x) {
  2868.       printf(
  2869. "Sorry, arithmetic overflow - hh:mm:ss not usable on this platform.n"
  2870.      );
  2871.       return(-9);
  2872.   }
  2873.       }
  2874.       return(setalarm((long)x));
  2875.   }
  2876. #else
  2877. /*
  2878.   This is to allow long values where int and long are not the same, e.g.
  2879.   on 16-bit systems.  But something is wrong with it.
  2880. */
  2881.     if ((y = cmtxt("seconds from now", "0", &s, xxstring)) < 0)
  2882.       return(y);
  2883.     if (rdigits(s)) {
  2884. return(setalarm(atol(s)));
  2885.     } else {
  2886. printf("%s - not a numbern",s);
  2887. return(-9);
  2888.     }
  2889. #endif /* COMMENT */
  2890. #endif /* NOSPL */
  2891. #ifndef NOXFER
  2892. case XYPROTO:
  2893.     return(setproto());
  2894. #endif /* NOXFER */
  2895. #ifdef CK_SPEED
  2896. case XYPREFIX: {
  2897. #ifdef COMMENT
  2898.     extern int clearrq;
  2899. #endif /* COMMENT */
  2900.     if ((z = cmkey(pfxtab, 4, "control-character prefixing option",
  2901.    "", xxstring)) < 0)
  2902.       return(z);
  2903.     if ((x = cmcfm()) < 0) return(x);
  2904.     setprefix(z);
  2905. #ifdef COMMENT
  2906.     if (hints && (z == PX_ALL || z == PX_CAU) && clearrq) {
  2907. printf("Hint: use SET CLEAR-CHANNEL OFF to disable negotiation ofn");
  2908. printf("      SET PREFIXING NONE during file transfers on reliablen");
  2909. printf("      connections.n");
  2910.     }
  2911. #endif /* COMMENT */
  2912.     return(success = 1);
  2913.   }
  2914. #endif /* CK_SPEED */
  2915. #ifndef NOSPL
  2916. case XYLOGIN:
  2917.    if ((z = cmkey(logintab, 3, "value for login script","userid",
  2918.   xxstring)) < 0)
  2919.       return(z);
  2920.     x = cmdgquo();
  2921.     if (z == LOGI_PSW)
  2922.       cmdsquo(0);
  2923.     if ((y = cmtxt("text","", &s, NULL)) < 0) {
  2924. cmdsquo(x);
  2925. return(y);
  2926.     }
  2927.     cmdsquo(x);
  2928. #ifdef IKSD
  2929.     if (inserver)
  2930.         return(success = 0);
  2931. #endif /* IKSD */
  2932.     if ((int)strlen(s) > 63) {
  2933. printf("Sorry, too longn");
  2934. return(-9);
  2935.     }
  2936.     s = brstrip(s);
  2937.     switch(z) {
  2938.       case LOGI_UID:
  2939. ckstrncpy(uidbuf,s,UIDBUFLEN);
  2940.         sl_uid_saved = 0;
  2941. break;
  2942.       case LOGI_PSW:
  2943. ckstrncpy(pwbuf,s,PWBUFL);
  2944.         pwflg = 1;
  2945. #ifdef OS2
  2946.         pwcrypt = 1;
  2947. #else /* OS2 */
  2948.         pwcrypt = 0;
  2949. #endif /* OS2 */
  2950. break;
  2951.       case LOGI_PRM:
  2952. ckstrncpy(prmbuf,s,PWBUFL);
  2953.     }
  2954.     return(success = 1);
  2955. #endif /* NOSPL */
  2956. }
  2957. switch (xx) {
  2958.   case XYSTARTUP:
  2959.     if ((y = cmkey(ifdtab,2,"","discard",xxstring)) < 0) return(y);
  2960.     if ((x = cmcfm()) < 0) return(x);
  2961.     DeleteStartupFile = (y != 0) ? 0 : 1;
  2962.     return(success = 1);
  2963. case XYTMPDIR:
  2964.     x = cmdir("Name of temporary directory","",&s,xxstring);
  2965.     if (x == -3)
  2966.       s = "";
  2967.     else if (x < 0)
  2968.       return(x);
  2969.     if ((x = cmcfm()) < 0) return(x);
  2970.     makestr(&tempdir,s);
  2971.     return(tempdir ? 1 : 0);
  2972. #ifndef NOXFER
  2973. case XYDEST: /* DESTINATION */
  2974.     return(setdest());
  2975. #endif /* NOXFER */
  2976. #ifndef NOPUSH
  2977. #ifndef NOFRILLS
  2978. /* Editor, Browser, and FTP Client */
  2979. case XYEDIT: /* EDITOR */
  2980. #ifdef IKSD
  2981.     if (inserver) {
  2982.         printf("?Sorry, command disabled.rn");
  2983.         return(success = 0);
  2984.     }
  2985. #endif /* IKSD */
  2986. #ifdef CK_APC
  2987.     /* Don't let this be set remotely */
  2988.     if (apcactive == APC_LOCAL ||
  2989.         apcactive == APC_REMOTE && apcstatus != APC_UNCH)
  2990.       return(success = 0);
  2991. #endif /* CK_APC */
  2992. #ifdef OS2ORUNIX
  2993.     {
  2994. char *p = getenv("PATH");
  2995. char *e;
  2996. e = editor[0] ? (char *) editor : getenv("EDITOR");
  2997. if (!e) e = "";
  2998. if (p)
  2999.   x = cmifip("Name of preferred editor",e,&s,&y,0,p,xxstring);
  3000. else
  3001.   x = cmifi("Full path of preferred editor",e,&s,&y,xxstring);
  3002. if (x < 0 && x != -3)
  3003.   return(x);
  3004.     }
  3005. #else
  3006. #ifdef VMS
  3007.     if ((y = cmtxt("DCL command for editing", "edit", &s, NULL)) < 0) {
  3008. if (x != -3)
  3009.   return(x);
  3010.     }
  3011. #else
  3012.     if ((x = cmifi("Full path of preferred editor","",&s,&y,xxstring)) < 0) {
  3013. if (x != -3)
  3014.   return(x);
  3015.     }
  3016. #endif /* VMS */
  3017. #endif /* OS2ORUNIX */
  3018. #ifdef VMS
  3019.     ckstrncpy(editor,s,CKMAXPATH);
  3020.     editopts[0] = NUL;
  3021. #else
  3022.     if (y != 0) {
  3023. printf("?A single file pleasen");
  3024. return(-2);
  3025.     }
  3026.     strcpy(line,s);
  3027.     if ((x = cmtxt("editor command-line options","",&s,NULL)) < 0)
  3028.       return(x);
  3029.     ckstrncpy(tmpbuf,s,TMPBUFSIZ);
  3030.     if ((z = cmcfm()) < 0) return(z);
  3031.     if (line[0]) {
  3032. zfnqfp(line,CKMAXPATH,editor);
  3033. ckstrncpy(editopts,tmpbuf,128);
  3034.     } else {
  3035.         editor[0] = NUL;
  3036.         editopts[0] = NUL;
  3037.     }
  3038. #endif /* VMS */
  3039.     return(success = 1);
  3040. #ifdef BROWSER
  3041. case XYFTP: /* SET FTP-CLIENT */
  3042. case XYBROWSE: /* SET BROWSER */
  3043.     {
  3044. char *p = getenv("PATH");
  3045. char *app = (char *) browser, *opts = (char *) browsopts;
  3046. extern char ftpapp[], ftpopts[];
  3047. if (xx == XYFTP) {
  3048.     app = (char *)ftpapp;
  3049.     opts = (char *)ftpopts;
  3050. }
  3051. #ifdef IKSD
  3052.         if (inserver) {
  3053.             printf("?Sorry, command disabled.rn");
  3054.             return(success = 0);
  3055.         }
  3056. #endif /* IKSD */
  3057. #ifdef CK_APC
  3058. /* Don't let this be set remotely */
  3059. if (apcactive == APC_LOCAL ||
  3060.     apcactive == APC_REMOTE && apcstatus != APC_UNCH)
  3061.   return(success = 0);
  3062. #endif /* CK_APC */
  3063. #ifdef OS2ORUNIX
  3064. if (p)
  3065.   x = cmifip(xx == XYBROWSE ?
  3066.      "Name of preferred browser" :
  3067.      "Name of preferred ftp client",
  3068. #ifdef OS2
  3069.      xx == XYFTP ? "ftp.exe" : ""
  3070. #else
  3071.      xx == XYFTP ? "ftp" : ""
  3072. #endif /* OS2 */
  3073.      ,&s,&y,0,p,xxstring
  3074.      );
  3075. else
  3076.   x = cmifi(xx == XYBROWSE ?
  3077.     "Full path of preferred browser" :
  3078.     "Full path of preferred ftp client",
  3079.     "",&s,&y,xxstring
  3080.     );
  3081. if (x < 0 && x != -3)
  3082.   return(x);
  3083. #else
  3084. #ifdef VMS
  3085. if ((x = cmtxt("DCL command to start your preferred Web browser",
  3086.        "", &s, NULL)) < 0) {
  3087.     if (x != -3)
  3088.       return(x);
  3089. }
  3090. #else
  3091. if ((x = cmifi("Full path of preferred browser","",&s,&y,xxstring)
  3092.      ) < 0) {
  3093.     if (x != -3)
  3094.       return(x);
  3095. }
  3096. #endif /* VMS */
  3097. #endif /* OS2ORUNIX */
  3098. #ifdef VMS
  3099. ckstrncpy(app,s,CKMAXPATH);
  3100. *opts = NUL;
  3101. #else
  3102. if (y != 0) {
  3103.     printf("?A single file pleasen");
  3104.     return(-2);
  3105. }
  3106. strcpy(line,s);
  3107. if ((x = cmtxt(xx == XYBROWSE ?
  3108.        "browser command-line options" :
  3109.        "ftp client command-line options",
  3110.        "",&s,NULL)
  3111.      ) < 0)
  3112.   return(x);
  3113. ckstrncpy(tmpbuf,s,TMPBUFSIZ);
  3114. if ((z = cmcfm()) < 0) return(z);
  3115. if (line[0]) {
  3116.     zfnqfp(line,CKMAXPATH,app);
  3117.     ckstrncpy(opts, tmpbuf, 128);
  3118. } else {
  3119.     *app = NUL;
  3120.     *opts = NUL;
  3121. }
  3122. #endif /* VMS */
  3123. return(success = 1);
  3124.     }
  3125. #endif /* BROWSER */
  3126. #endif /* NOFRILLS */
  3127. #endif /* NOPUSH */
  3128. #ifdef CK_CTRLZ
  3129.   case XYEOF: { /* SET EOF */
  3130.       extern int eofmethod; extern struct keytab eoftab[];
  3131.       if ((x = cmkey(eoftab,3,"end-of-file detection method","",
  3132.      xxstring)) < 0)
  3133. return(x);
  3134.       if ((y = cmcfm()) < 0)
  3135. return(y);
  3136.       eofmethod = x;
  3137.       return(success = 1);
  3138.   }
  3139. #endif /* CK_CTRLZ */
  3140. #ifdef SESLIMIT
  3141.   case XYLIMIT: {            /* Session-Limit (length of session in seconds) */
  3142.       extern int seslimit;
  3143.       y = cmnum("Maximum length of session, seconds","0",10,&x,xxstring);
  3144. #ifdef IKSD
  3145.       if (inserver &&
  3146. #ifdef IKSDCONF
  3147.   iksdcf
  3148. #else
  3149.   1
  3150. #endif /* IKSDCONF */
  3151.   ) {
  3152.           if ((z = cmcfm()) < 0)
  3153.     return(z);
  3154.           printf("?Sorry, command disabled.rn");
  3155.           return(success = 0);
  3156.       }
  3157. #endif /* IKSD */
  3158.       return(setnum(&seslimit,x,y,86400));
  3159.   }
  3160. #endif /* SESLIMIT */
  3161.   case XYRELY: { /* SET RELIABLE */
  3162.       extern int reliable, setreliable;
  3163.       if ((x = cmkey(ooatab,3,"","automatic",xxstring)) < 0)
  3164. return(x);
  3165.       if ((y = cmcfm()) < 0) return(y);
  3166.       reliable = x;
  3167.       setreliable = (x != SET_AUTO);
  3168.       debug(F101,"set reliable","",reliable);
  3169.       return(success = 1);
  3170.   }
  3171. #ifdef STREAMING
  3172.   case XYSTREAM: { /* SET STREAMING */
  3173.       extern int streamrq;
  3174.       if ((x = cmkey(ooatab,3,"","automatic",xxstring)) < 0)
  3175. return(x);
  3176.       if ((y = cmcfm()) < 0) return(y);
  3177.       streamrq = x;
  3178.       return(success = 1);
  3179.   }
  3180. #endif /* STREAMING */
  3181. #ifdef CKSYSLOG
  3182.  case XYSYSL: {
  3183.      if ((x = cmkey(syslogtab,nsyslog,"","",xxstring)) < 0)
  3184.        return(x);
  3185.      if ((y = cmcfm()) < 0) return(y);
  3186. #ifdef IKSD
  3187.      if (inserver &&
  3188. #ifdef IKSDCONF
  3189.  iksdcf
  3190. #else
  3191.  1
  3192. #endif /* IKSDCONF */
  3193.           ) {
  3194.  printf("?Sorry, command disabled.n");
  3195.  return(success = 0);
  3196.      }
  3197. #endif /* IKSD */
  3198. #ifdef CK_APC
  3199.      /* Don't let this be set remotely */
  3200.      if (apcactive == APC_LOCAL ||
  3201.          apcactive == APC_REMOTE && apcstatus != APC_UNCH)
  3202.        return(success = 0);
  3203. #endif /* CK_APC */
  3204.      ckxsyslog = x;
  3205.      return(success = 1);
  3206. }
  3207. #endif /* CKSYSLOG */
  3208. #ifdef TLOG
  3209.   case XYTLOG: { /* SET TRANSACTION-LOG */
  3210.       extern int tlogsep;
  3211.       if ((x = cmkey(vbtab,nvb,"","verbose",xxstring)) < 0)
  3212. return(x);
  3213.       if (x == 0) {
  3214.   if ((y = cmtxt("field separator",",",&s,NULL)) < 0) return(y);
  3215.   s = brstrip(s);
  3216.   if (*s) {
  3217.       if (s[1]) {
  3218.   printf("?A single character, please.n");
  3219.   return(-9);
  3220.       } else if ((*s >= '0' && *s <= '9') ||
  3221.   (*s >= 'A' && *s <= 'Z') ||
  3222.   (*s >= 'a' && *s <= 'z')) {
  3223.   printf("?A non-alphanumeric character, please.n");
  3224.   return(-9);
  3225.       } else
  3226. tlogsep = *s;
  3227.   }
  3228.       } else {
  3229.   if ((y = cmcfm()) < 0) return(y);
  3230.       }
  3231. #ifdef IKSD
  3232.      if (inserver && isguest) {
  3233.  printf("?Sorry, command disabled.n");
  3234.  return(success = 0);
  3235.      }
  3236. #endif /* IKSD */
  3237. #ifdef CK_APC
  3238.      /* Don't let this be set remotely */
  3239.      if (apcactive == APC_LOCAL ||
  3240.          apcactive == APC_REMOTE && apcstatus != APC_UNCH)
  3241.        return(success = 0);
  3242. #endif /* CK_APC */
  3243.       tlogfmt = x;
  3244.       return(success = 1);
  3245.   }
  3246. #endif /* TLOG */
  3247.   case XYCLEAR: { /* SET CLEARCHANNEL */
  3248.       extern int clearrq;
  3249.       if ((x = cmkey(ooatab,3,"","automatic",xxstring)) < 0)
  3250. return(x);
  3251.       if ((y = cmcfm()) < 0) return(y);
  3252.       clearrq = x;
  3253.       return(success = 1);
  3254.   }
  3255. #ifdef CK_AUTHENTICATION
  3256.   case XYAUTH: { /* SET AUTHENTICATION */
  3257. #ifdef CK_KERBEROS
  3258.       int kv = 0;
  3259.       extern struct krb_op_data krb_op;
  3260. #endif /* CK_KERBEROS */
  3261.       char * p = NULL;
  3262.       if ((x = cmkey(setauth,nsetauth,"authentication type","",xxstring)) < 0)
  3263. return(x);
  3264.       switch (x) {
  3265. #ifdef CK_KERBEROS
  3266. case AUTH_KRB4: kv = 4; break; /* Don't assume values are the same */
  3267. case AUTH_KRB5: kv = 5; break;
  3268. #endif /* CK_KERBEROS */
  3269. #ifdef CK_SRP
  3270.       case AUTH_SRP: break;
  3271. #endif /* CK_SRP */
  3272. #ifdef CK_SSL
  3273. case AUTH_SSL:
  3274. case AUTH_TLS:
  3275.   break;
  3276. #endif /* CK_SSL */
  3277. default:
  3278.   printf("?Authorization type not supported yet - "%s"n",atmbuf);
  3279.   return(-9);
  3280.       }
  3281. #ifdef IKSD
  3282.       if (inserver &&
  3283. #ifdef IKSDCONF
  3284.   iksdcf
  3285. #else
  3286.   1
  3287. #endif /* IKSDCONF */
  3288.           ) {
  3289.   if ((y = cmcfm()) < 0) return(y);
  3290.   printf("?Sorry, command disabled.n");
  3291.   return(success = 0);
  3292.       }
  3293. #endif /* IKSD */
  3294. #ifdef CK_APC
  3295.       /* Don't let this be set remotely */
  3296.       if (apcactive == APC_LOCAL ||
  3297.           apcactive == APC_REMOTE && apcstatus != APC_UNCH) {
  3298.   if ((y = cmcfm()) < 0) return(y);
  3299.   return(success = 0);
  3300.       }
  3301. #endif /* CK_APC */
  3302.       switch(x) {
  3303. #ifdef CK_KERBEROS
  3304. case AUTH_KRB4:
  3305. case AUTH_KRB5: {
  3306.     if ((x = cmkey(kv == 4 ? k4tab : k5tab,
  3307.    kv == 4 ? nk4tab : nk5tab,
  3308.    "Kerberos parameter","",xxstring)) < 0) {
  3309. return(x);
  3310.     }
  3311.     s = "";
  3312.     switch (x) {
  3313. #ifdef KRB4
  3314.       case XYKRBDBG:
  3315. if (kv == 4) {
  3316.     if ((y = seton(&k4debug)) < 0)
  3317.       return(y);
  3318. #ifdef NT
  3319.     ck_krb4_debug(k4debug);
  3320. #endif /* NT */
  3321. } else {
  3322.     return(-9);
  3323. }
  3324. break;
  3325. #endif /* KRB4 */
  3326.       case XYKRBLIF:
  3327. if ((y = cmnum("TGT lifetime","600",10,&z,xxstring)) < 0)
  3328.   return(y);
  3329. break;
  3330.       case XYKRBPRE:
  3331. if (kv == 4) {
  3332.     if ((y = seton(&krb4_d_preauth)) < 0)
  3333.       return(y);
  3334. } else {
  3335.     return(-9);
  3336. }
  3337. break;
  3338.       case XYKRBINS:
  3339. if ((y = cmtxt("Instance name","",&s,xxstring)) < 0)
  3340.   return(y);
  3341. break;
  3342.       case XYKRBFWD:
  3343. if (kv == 5) {
  3344.     if ((y = seton(&krb5_d_forwardable)) < 0)
  3345.       return(y);
  3346. } else {
  3347.     return(-9);
  3348. }
  3349. break;
  3350.       case XYKRBPRX:
  3351. if (kv == 5) {
  3352.     if ((y = seton(&krb5_d_proxiable)) < 0)
  3353.       return(y);
  3354. } else {
  3355.     return(-9);
  3356. }
  3357. break;
  3358.       case XYKRBRNW:
  3359. if ((y = cmnum("TGT renewable lifetime",
  3360.        "0",10,&z,xxstring)) < 0)
  3361.   return(y);
  3362. break;
  3363.       case XYKRBADR:
  3364. if (kv == 5) {
  3365.     if ((y = seton(&krb5_checkaddrs)) < 0)
  3366.       return(y);
  3367. } else {
  3368.     if ((y = seton(&krb4_checkaddrs)) < 0)
  3369.       return(y);
  3370. }
  3371. break;
  3372.       case XYKRBGET:
  3373. if (kv == 5) {
  3374.     if ((y = seton(&krb5_autoget)) < 0)
  3375.       return(y);
  3376. } else {
  3377.     if ((y = seton(&krb4_autoget)) < 0)
  3378.       return(y);
  3379. }
  3380. break;
  3381.       case XYKRBDEL:
  3382. if ((z = cmkey(kdestab,nkdestab,
  3383.        "Auto Destroy Tickets","never",xxstring)) < 0)
  3384.                   return(z);
  3385. break;
  3386.       case XYKRBPR:
  3387. if ((y = cmtxt("User ID",uidbuf,&s,xxstring)) < 0)
  3388.   return(y);
  3389. break;
  3390.       case XYKRBRL:
  3391. if ((y = cmtxt("Name of realm","",&s,xxstring)) < 0)
  3392.   return(y);
  3393. break;
  3394.       case XYKRBCC:
  3395. if ((y = cmofi("Filename","",&s,xxstring)) < 0)
  3396.   return(y);
  3397. break;
  3398.       case XYKRBSRV:
  3399. if ((y = cmtxt("Name of service to use in ticket",
  3400.        (kv == 4 ? "rcmd" : "host"),
  3401.        &s,
  3402.        xxstring
  3403.        )) < 0)
  3404.   return(y);
  3405. break;
  3406.       case XYKRBK5K4:
  3407. if (kv == 5) {
  3408.     if ((y = seton(&krb5_d_getk4)) < 0)
  3409.       return(y);
  3410. } else {
  3411.     return(-9);
  3412. }
  3413. break;
  3414.       case XYKRBPRM: /* Prompt */
  3415. if ((z = cmkey(krbprmtab,2,"","",xxstring)) < 0)
  3416.   return(z);
  3417. if ((y = cmtxt((z == KRB_PW_PRM) ?
  3418.   "Text of prompt;nmay contain "%s" to be replaced by principal name" :
  3419.   "Text of prompt",
  3420.        "",
  3421.        &s,
  3422.        xxstring
  3423.        )
  3424.      ) < 0)
  3425.   return(y);
  3426. break;
  3427.     }
  3428.     strcpy(line,s);
  3429.     s = line;
  3430.     if ((y = cmcfm()) < 0)
  3431.       return(y);
  3432. #ifdef IKSD
  3433.             if (inserver &&
  3434. #ifdef IKSDCONF
  3435. iksdcf
  3436. #else /* IKSDCONF */
  3437. 1
  3438. #endif /* IKSDCONF */
  3439. )
  3440.       return(success = 0);
  3441. #endif /* IKSD */
  3442.     switch (x) { /* Copy value to right place */
  3443.       case XYKRBLIF: /* Lifetime */
  3444. if (kv == 4)
  3445.   krb4_d_lifetime = z;
  3446. else
  3447.   krb5_d_lifetime = z;
  3448. break;
  3449.       case XYKRBRNW:
  3450. if (kv == 5)
  3451.   krb5_d_renewable = z;
  3452. break;
  3453.       case XYKRBPR: /* Principal */
  3454. s = brstrip(s);         /* Strip braces around. */
  3455. if (kv == 4)
  3456.   makestr(&krb4_d_principal,s);
  3457. else
  3458.   makestr(&krb5_d_principal,s);
  3459. break;
  3460.       case XYKRBINS: /* Instance */
  3461. if (kv == 4)
  3462.   makestr(&krb4_d_instance,s);
  3463.                 else
  3464.                   makestr(&krb5_d_instance,s);
  3465. break;
  3466.       case XYKRBRL: /* Realm */
  3467. if (kv == 4)
  3468.   makestr(&krb4_d_realm,s);
  3469. else
  3470.   makestr(&krb5_d_realm,s);
  3471. break;
  3472.       case XYKRBCC: /* Credentials cache */
  3473. makestr(&krb5_d_cc,s);
  3474. break;
  3475.       case XYKRBSRV: /* Service Name */
  3476. if (kv == 4)
  3477.   makestr(&krb4_d_srv,s);
  3478. else
  3479.   makestr(&krb5_d_srv,s);
  3480. break;
  3481.       case XYKRBDEL:
  3482. if (kv == 5)
  3483.   krb5_autodel = z;
  3484. else
  3485.   krb4_autodel = z;
  3486. break;
  3487.       case XYKRBPRM: /* Prompt */
  3488. if (s == "") s = NULL;
  3489. if (s) {
  3490.     s = brstrip(s);
  3491.     if (s == "") s = NULL;
  3492. }
  3493. switch (z) {
  3494.   case KRB_PW_PRM: { /* Password */
  3495.       /* Check that there are no more than */
  3496.       /* two % fields and % must followed by 's'. */
  3497.       int i,n,len;
  3498.       len = strlen(s);
  3499.       for (i = 0, n = 0; i < len; i++) {
  3500.   if (s[i] == '%') {
  3501.       if (s[i+1] != '%') {
  3502.   if (s[i+1] != 's') {
  3503.       printf(
  3504.        "Only %%s fields are permitted.n");
  3505.       return(-9);
  3506.   }
  3507.   if (++n > 2) {
  3508.       printf(
  3509.        "Only two %%s fields are permitted.n");
  3510.       return(-9);
  3511.   }
  3512.       }
  3513.       i++;
  3514.   }
  3515.       }
  3516.       if (kv == 5)
  3517. makestr(&k5pwprompt,s);
  3518.       else
  3519. makestr(&k4pwprompt,s);
  3520.       break;
  3521.   }
  3522.   case KRB_PR_PRM: { /* Principal */
  3523.       /* Check to make sure there are no % fields */
  3524.       int i,len;
  3525.       len = strlen(s);
  3526.       for (i = 0; i < len; i++) {
  3527.   if (s[i] == '%') {
  3528.       if (s[i+1] != '%') {
  3529.   printf(
  3530.   "%% fields are not used in this command.n");
  3531.   return(-9);
  3532.       }
  3533.       i++;
  3534.   }
  3535.       }
  3536.       if (kv == 5)
  3537. makestr(&k5prprompt,s);
  3538.       else
  3539. makestr(&k4prprompt,s);
  3540.       break;
  3541.   }
  3542. }
  3543.     }
  3544.     break;
  3545. }
  3546. #endif /* CK_KERBEROS */
  3547. #ifdef CK_SRP
  3548. case AUTH_SRP: {
  3549.     if ((x = cmkey(srptab, nsrptab,
  3550.    "SRP parameter","",xxstring)) < 0) {
  3551. return(x);
  3552.     }
  3553.     s = "";
  3554.     switch (x) {
  3555.       case XYSRPPRM: /* Prompt */
  3556. if ((z = cmkey(srpprmtab,1,"","",xxstring)) < 0)
  3557.   return(z);
  3558. if ((y = cmtxt(
  3559.   "Text of prompt;nmay contain one "%s" to be replaced by the username",
  3560.        "",
  3561.        &s,
  3562.        xxstring
  3563.        )
  3564.      ) < 0)
  3565.   return(y);
  3566. break;
  3567.     }
  3568.     strcpy(line,s);
  3569.     s = line;
  3570.     if ((y = cmcfm()) < 0)
  3571.       return(y);
  3572.     switch (x) { /* Copy value to right place */
  3573.       case XYSRPPRM: /* Prompt */
  3574. if (s == "") s = NULL;
  3575. if (s) {
  3576.     s = brstrip(s);
  3577.     if (s == "") s = NULL;
  3578. }
  3579. switch (z) {
  3580.   case SRP_PW_PRM: { /* Password */
  3581.       /* Check %s fields */
  3582.       int i,n,len;
  3583.       len = strlen(s);
  3584.       for (i = 0, n = 0; i < len; i++) {
  3585.   if (s[i] == '%') {
  3586.       if (s[i+1] != '%') {
  3587.   if (s[i+1] != 's') {
  3588.       printf(
  3589.        "Only %%s fields are permitted.n");
  3590.       return(-9);
  3591.   }
  3592.   if (++n > 1) {
  3593.       printf(
  3594.        "Only one %%s field is permitted.n");
  3595.       return(-9);
  3596.   }
  3597.       }
  3598.       i++;
  3599.   }
  3600.       }
  3601.       makestr(&srppwprompt,s);
  3602.       break;
  3603.   }
  3604. }
  3605.     }
  3606.     break;
  3607. }
  3608. #endif /* CK_SRP */
  3609. #ifdef CK_SSL
  3610. case AUTH_SSL:
  3611. case AUTH_TLS: {
  3612.     if ((z = cmkey(ssltab, nssltab,
  3613.    (x == AUTH_SSL ? "SSL parameter" : "TLS parameter"),
  3614.    "",xxstring)) < 0)
  3615.       return(z);
  3616.     s = "";
  3617.     switch (z) {
  3618.       case XYSSLRCFL: /* SSL/TLS RSA Certs file */
  3619.       case XYSSLRKFL: /* SSL/TLS RSA Key File */
  3620.       case XYSSLDCFL: /* SSL/TLS DSA Certs file */
  3621.               case XYSSLDKFL: /* SSL/TLS DH Key File */
  3622.               case XYSSLDPFL:           /* SSL/TLS DH Param File */
  3623.               case XYSSLCRL:            /* SSL/TLS CRL File */
  3624.               case XYSSLVRFF:           /* SSL/TLS Verify File */
  3625. if ((y = cmifi("Filename","",&s,&x,xxstring)) < 0)
  3626.   return(y);
  3627. if (x) {
  3628.     printf("?Wildcards not allowedn");
  3629.     return(-9);
  3630. }
  3631. strcpy(line,s);
  3632. s = line;
  3633. if ((y = cmcfm()) < 0)
  3634.   return(y);
  3635. switch (z) {
  3636.   case XYSSLRCFL: /* SSL/TLS RSA Certs file */
  3637.     if (!s[0] && ssl_rsa_cert_file) {
  3638. free(ssl_rsa_cert_file);
  3639. ssl_rsa_cert_file = NULL;
  3640.     } else {
  3641. makestr(&ssl_rsa_cert_file,s);
  3642. if (!ssl_rsa_key_file)
  3643.   makestr(&ssl_rsa_key_file,s);
  3644.     }
  3645.     break;
  3646.   case XYSSLRKFL: /* SSL/TLS RSA Key File */
  3647.     if (!s[0] && ssl_rsa_key_file) {
  3648. free(ssl_rsa_key_file);
  3649. ssl_rsa_key_file = NULL;
  3650.     } else {
  3651. makestr(&ssl_rsa_key_file,s);
  3652.     }
  3653.     break;
  3654.   case XYSSLDCFL: /* SSL/TLS DSA Certs file */
  3655.                     if (!s[0] && ssl_dsa_cert_file) {
  3656.                         free(ssl_dsa_cert_file);
  3657.                         ssl_dsa_cert_file = NULL;
  3658.                     } else {
  3659.                         makestr(&ssl_dsa_cert_file,s);
  3660.                         if (!ssl_dh_key_file)
  3661.   makestr(&ssl_dh_key_file,s);
  3662.                     }
  3663.                     break;
  3664.   case XYSSLDKFL: /* SSL/TLS DH Key File */
  3665.                     if (!s[0] && ssl_dh_key_file) {
  3666.                         free(ssl_dh_key_file);
  3667.                         ssl_dh_key_file = NULL;
  3668.                     } else {
  3669.                         makestr(&ssl_dh_key_file,s);
  3670.                     }
  3671.                     break;
  3672.                   case XYSSLDPFL: /* SSL/TLS DH Param File */
  3673.     if (!s[0] && ssl_dh_param_file) {
  3674.       free(ssl_dh_param_file);
  3675.       ssl_dh_param_file = NULL;
  3676.     } else {
  3677.       makestr(&ssl_dh_param_file,s);
  3678.     }
  3679.     break;
  3680.                   case XYSSLCRL: /* SSL/TLS CRL File */
  3681.                       if (!s[0] && ssl_crl_file) {
  3682.                           free(ssl_crl_file);
  3683.                           ssl_crl_file = NULL;
  3684.                       } else {
  3685.                           makestr(&ssl_crl_file,s);
  3686.                       }
  3687.                       break;
  3688.                   case XYSSLVRFF: /* SSL/TLS Verify File */
  3689.                       if (!s[0] && ssl_crl_file) {
  3690.                           free(ssl_verify_file);
  3691.                           ssl_verify_file = NULL;
  3692.                       } else {
  3693.                           makestr(&ssl_verify_file,s);
  3694.                       }
  3695.                       break;
  3696. }
  3697. break;
  3698.               case XYSSLCRLD:
  3699.               case XYSSLVRFD:
  3700. if ((y = cmdir("Directory","",&s,xxstring)) < 0)
  3701.   return(y);
  3702. strcpy(line,s);
  3703. s = line;
  3704. if ((y = cmcfm()) < 0)
  3705.   return(y);
  3706.                 switch(z) {
  3707.   case XYSSLCRLD:
  3708.     if (!s[0] && ssl_crl_dir) {
  3709. free(ssl_crl_dir);
  3710. ssl_crl_dir = NULL;
  3711.     } else {
  3712. makestr(&ssl_crl_dir,s);
  3713.     }
  3714.     break;
  3715.   case XYSSLVRFD:
  3716.     if (!s[0] && ssl_verify_dir) {
  3717. free(ssl_verify_dir);
  3718. ssl_verify_dir = NULL;
  3719.     } else {
  3720. makestr(&ssl_verify_dir,s);
  3721.     }
  3722.     break;
  3723.                 }
  3724. break;
  3725.       case XYSSLCOK: /* SSL/TLS Certs-Ok flag */
  3726. if ((y = seton(&ssl_certsok_flag)) < 0)
  3727.   return(y);
  3728. break;
  3729.       case XYSSLDBG: /* SSL/TLS Debug flag */
  3730. if ((y = seton(&ssl_debug_flag)) < 0)
  3731.   return(y);
  3732. break;
  3733.       case XYSSLON: /* SSL/TLS Only flag */
  3734. switch (x) {
  3735.   case AUTH_SSL:
  3736.     if ((y = seton(&ssl_only_flag)) < 0)
  3737.       return(y);
  3738.     break;
  3739.   case AUTH_TLS:
  3740.     if ((y = seton(&tls_only_flag)) < 0)
  3741.       return(y);
  3742.     break;
  3743. }
  3744. break;
  3745.       case XYSSLVRB: /* SSL/TLS Verbose flag */
  3746. if ((y = seton(&ssl_verbose_flag)) < 0)
  3747.   return(y);
  3748. break;
  3749.       case XYSSLVRF: /* SSL/TLS Verify flag */
  3750. if ((x = cmkey(sslvertab, nsslvertab,
  3751.        "SSL/TLS verify mode",
  3752.        "peer-cert",xxstring)) < 0)
  3753.   return(x);
  3754. if ((y = cmcfm()) < 0)
  3755.   return(y);
  3756. ssl_verify_flag = x;
  3757. break;
  3758.       case XYSSLDUM:
  3759. if ((y = seton(&ssl_dummy_flag)) < 0)
  3760.   return(y);
  3761. break;
  3762.       case XYSSLCL: { /* SSL/TLS Cipher List */
  3763. #ifdef COMMENT
  3764.   /* This code is used to generate a colon delimited */
  3765.   /* list of the ciphers currently in use to be used */
  3766.   /* as the default for cmtxt().  However, a better  */
  3767.   /* default is simply the magic keyword "ALL".      */
  3768.   CHAR def[1024] = "";
  3769.   if (ssl_con != NULL) {
  3770.       CHAR * p = NULL, *q = def;
  3771.       int i, len;
  3772.       for (i = 0; ; i++) {
  3773.   p = (CHAR *) SSL_get_cipher_list(ssl_con,i);
  3774.   if (p == NULL)
  3775.     break;
  3776.   len = strlen(p);
  3777.   if (q+len+1 >= def+1024)
  3778.     break;
  3779.   if (i != 0)
  3780.     *q++ = ':';
  3781.   strcpy(q,p);
  3782.   q += len;
  3783.       }
  3784.   }
  3785. #endif /* COMMENT */
  3786.                   char * p = getenv("SSL_CIPHER");
  3787.                   if (!p)
  3788.     p = "ALL";
  3789.   if ((y = cmtxt(
  3790.                     "Colon-delimited list of ciphers or ALL (case sensitive)",
  3791.  p,
  3792.  &s,
  3793.  xxstring
  3794.  )
  3795.        ) < 0)
  3796.     return(y);
  3797.   makestr(&ssl_cipher_list,s);
  3798.   if (ssl_con == NULL) {
  3799.       SSL_library_init();
  3800.       ssl_ctx = (SSL_CTX *)
  3801. SSL_CTX_new((SSL_METHOD *)TLSv1_method());
  3802.       if (ssl_ctx != NULL)
  3803. ssl_con= (SSL *) SSL_new(ssl_ctx);
  3804.   }
  3805.   if (ssl_con) {
  3806.       SSL_set_cipher_list(ssl_con,ssl_cipher_list);
  3807.   }
  3808.   break;
  3809.       }
  3810.     }
  3811.     break;
  3812. }
  3813. #endif /* CK_SSL */
  3814. default:
  3815.           break;
  3816.       }
  3817.       return(success = 1);
  3818.   }
  3819. #endif /* CK_AUTHENTICATION */
  3820. #ifndef NOSPL
  3821. case XYFUNC:
  3822.      if ((x = cmkey(functab,nfunctab,"","diagnostics",xxstring)) < 0)
  3823.        return(x);
  3824.      switch (x) {
  3825.        case FUNC_DI: return(seton(&fndiags));
  3826.        case FUNC_ER: return(seton(&fnerror));
  3827.        default:      return(-2);
  3828.      }
  3829. #endif /* NOSPL */
  3830. case XYSLEEP: /* SET SLEEP / PAUSE */
  3831.     if ((x = cmkey(sleeptab,1,"","cancellation",xxstring)) < 0)
  3832.       return(x);
  3833.     return(seton(&sleepcan));
  3834. case XYCD: /* SET CD */
  3835.     if ((x = cmkey(cdtab,ncdtab,"","",xxstring)) < 0)
  3836.       return(x);
  3837.     switch (x) {
  3838.       case XYCD_M: /* SET CD MESSAGE */
  3839. if ((x = cmkey(cdmsg,ncdmsg,"","",xxstring)) < 0)
  3840.   return(x);
  3841. if (x == 2) { /* CD MESSAGE FILE */
  3842.     if ((x = cmtxt("Name of file","",&s,NULL)) < 0)
  3843.       return(x);
  3844.     if (!*s) {
  3845. s = NULL;
  3846. #ifndef NOXFER
  3847. srvcdmsg = 0;
  3848. #endif /* NOXFER */
  3849.     }
  3850.     makestr(&cdmsgstr,s);
  3851.     makelist(cdmsgstr,cdmsgfile,8);
  3852.     return(success = 1);
  3853. }
  3854. if ((y = cmcfm()) < 0) return(y); /* CD-MESSAGE ON/OFF */
  3855. #ifndef NOXFER
  3856. if (x > 0)
  3857.   srvcdmsg |= 2;
  3858. else
  3859.   srvcdmsg &= 1;
  3860. #endif /* NOXFER */
  3861. return(success = 1);
  3862.       case XYCD_P: { /* SET CD PATH */
  3863.   extern char * ckcdpath;
  3864.   if ((x = cmtxt("CD PATH string","",&s,xxstring)) < 0)
  3865.     return(x);
  3866.   makestr(&ckcdpath,s);
  3867.   return(success = 1);
  3868.       }
  3869.     }
  3870. #ifndef NOLOCAL
  3871. #ifdef HWPARITY
  3872.     case XYSTOP: /* STOP-BITS */
  3873.         if ((x = cmkey(stoptbl,2,"Stop bits for serial device","",
  3874.        xxstring)) < 0)
  3875.   return(x);
  3876. if ((y = cmcfm()) < 0)
  3877.   return(y);
  3878. if (x > 0 && x < 3) {
  3879.     stopbits = x;
  3880.     return(success = 1);
  3881. } else
  3882.   return(-2);
  3883. #endif /* HWPARITY */
  3884.       case XYDISC: {
  3885.   extern int clsondisc;
  3886.   return(seton(&clsondisc));
  3887.       }
  3888.       case XYSERIAL: {
  3889.   /* char c; */
  3890.   extern int cmask;
  3891.   if ((x = cmkey(sertbl,nsertbl,
  3892.  "Serial device character size, parity, and stop bits",
  3893.  "8N1", xxstring)) < 0)
  3894.     return(x);
  3895.   strcpy(line,atmbuf); /* Copy associated keyword string */
  3896.   s = line;
  3897.   if ((y = cmcfm()) < 0)
  3898.     return(y);
  3899.   strcpy(line,sernam[x]);
  3900.   s = line;
  3901.   if (s[0] != '8' && s[0] != '7') /* Char size */
  3902.     return(-2);
  3903.   else
  3904.     z = s[0] - '0';
  3905.   if (isupper(s[1])) /* Parity */
  3906.     s[1] = tolower(s[1]);
  3907.   if (s[2] != '1' && s[2] != '2') /* Stop bits */
  3908.     return(-2);
  3909.   else
  3910.     stopbits = s[2] - '0';
  3911.   if (z == 8) { /* 8 bits + parity (or not) */
  3912.       parity = 0; /* Set parity */
  3913.       hwparity = (s[1] == 'n') ? 0 : s[1];
  3914.       cmask = 0xff; /* Also set TERM BYTESIZE to 8 */
  3915.   } else { /* 7 bits plus parity */
  3916.       parity = (s[1] == 'n') ? 0 : s[1];
  3917.       hwparity = 0;
  3918.       cmask = 0x7f; /* Also set TERM BYTESIZE to 7 */
  3919.   }
  3920.   return(success = 1);
  3921.       }
  3922.       case XYOPTS: { /* SET OPTIONS */
  3923.   extern int setdiropts();
  3924.   extern int settypopts();
  3925. #ifdef CKPURGE
  3926.   extern int setpurgopts();
  3927. #endif /* CKPURGE */
  3928.   if ((x = cmkey(optstab,noptstab,"for command","", xxstring)) < 0)
  3929.     return(x);
  3930.   switch (x) {
  3931. #ifndef NOFRILLS
  3932.     case XXDEL:
  3933.       return(setdelopts());
  3934. #endif /* NOFRILLS */
  3935.     case XXDIR:
  3936.       return(setdiropts());
  3937.     case XXTYP:
  3938.       return(settypopts());
  3939. #ifdef CKPURGE
  3940.     case XXPURGE:
  3941.       return(setpurgopts());
  3942. #endif /* CKPURGE */
  3943.     default:
  3944.       return(-2);
  3945.   }
  3946.       }
  3947. #endif /* NOLOCAL */
  3948. #ifndef NOXFER
  3949.       case XYQ8FLG: {
  3950.   extern int q8flag;
  3951.   return(seton(&q8flag));
  3952.       }
  3953.       case XYTIMER: {
  3954.   extern int asktimer;
  3955.   y = cmnum("Time limit for ASK command, seconds","0",10,&x,xxstring);
  3956. #ifdef QNX16
  3957.   return(setnum(&asktimer,x,y,32767));
  3958. #else
  3959.   return(setnum(&asktimer,x,y,86400));
  3960. #endif /* QNX16 */
  3961.       }
  3962.       case XYFACKB: {
  3963.   extern int fackbug;
  3964.   return(seton(&fackbug));
  3965.       }
  3966. #endif /* NOXFER */
  3967.       case XYHINTS:
  3968.         return(seton(&hints));
  3969. #ifndef NOSPL
  3970.       case XYEVAL: {
  3971.   extern int oldeval;
  3972.   if ((x = cmkey(oldnew,2,"","", xxstring)) < 0)
  3973.     return(x);
  3974.   if ((y = cmcfm()) < 0)
  3975.     return(y);
  3976.   oldeval = x;
  3977.   return(success = 1);
  3978.       }
  3979. #endif /* NOSPL */
  3980. #ifndef NOXFER
  3981.       case XYFACKP: {
  3982.   extern int fackpath;
  3983.   return(seton(&fackpath));
  3984.       }
  3985. #endif /* NOXFER */
  3986.       case XYQNXPL: {
  3987.   extern int qnxportlock;
  3988.   return(seton(&qnxportlock));
  3989.       }
  3990.       default:
  3991.  if ((x = cmcfm()) < 0) return(x);
  3992.  printf("Not implemented - %sn",cmdbuf);
  3993.  return(success = 0);
  3994.     }
  3995. }
  3996. /*
  3997.   H U P O K  --  Is Hangup OK?
  3998.   Issues a warning and gets OK from user depending on whether a connection
  3999.   seems to be open and what the SET EXIT WARNING setting is.  Returns:
  4000.     0 if not OK to hang up or exit (i.e. user said No);
  4001.     nonzero if OK.
  4002.   Argument x is used to differentiate the EXIT command from SET LINE / HOST.
  4003. */
  4004. int
  4005. hupok(x) int x; { /* Returns 1 if OK, 0 if not OK */
  4006.     int y, z = 1;
  4007. #ifdef VMS
  4008.     extern int batch;
  4009.     if (batch) /* No warnings in batch */
  4010.       return(1);
  4011. #else
  4012. #ifdef UNIX
  4013.     if (backgrd) /* No warnings in background */
  4014.       return(1);
  4015. #endif /* UNIX */
  4016. #endif /* VMS */
  4017.     debug(F101,"hupok local","",local);
  4018.     if (!local) /* No warnings in remote mode */
  4019.       return(1);
  4020.     debug(F101,"hupok x","",x);
  4021.     debug(F101,"hupok xitwarn","",xitwarn);
  4022.     debug(F101,"hupok network","",network);
  4023.     debug(F101,"hupok haveline","",haveline);
  4024.     if ((local && xitwarn) || /* Is a connection open? */
  4025.         (!x && xitwarn == 2)) { /* Or Always give warning on EXIT */
  4026. int needwarn = 0;
  4027. if (network) {
  4028.     if (ttchk() >= 0)
  4029.       needwarn = 1;
  4030.     /* A connection seems to be open but it can't possibly be */
  4031.     if (!haveline)
  4032.       needwarn = 0;
  4033.     if (needwarn) {
  4034. if (strcmp(ttname,"*"))
  4035.   printf(
  4036. " A network connection to %s might still be active.n",
  4037.  ttname
  4038.  );
  4039. else
  4040.   printf(
  4041.    " An incoming network connection might still be active.n"
  4042.  );
  4043.     }
  4044. } else { /* Serial connection */
  4045.     if (carrier == CAR_OFF) /* SET CARRIER OFF */
  4046.       needwarn = 0; /* so we don't care about carrier. */
  4047.     else if ((y = ttgmdm()) >= 0) /* else, get modem signals */
  4048.       needwarn = (y & BM_DCD); /* Check for carrier */
  4049.     else /* If we can't get modem signals... */
  4050.       needwarn = (ttchk() >= 0);
  4051.     /* A connection seems to be open but it can't possibly be */
  4052.     if (!haveline)
  4053.       needwarn = 0;
  4054.     if (needwarn)
  4055.       printf(
  4056.      " A serial connection might still be active on %s.n",
  4057.      ttname
  4058.      );
  4059. }
  4060. /* If a warning was issued, get user's permission to EXIT. */
  4061. if (needwarn || !x && xitwarn == 2 && local) {
  4062.     z = getyesno(x ? "OK to close? " : "OK to exit? ",0);
  4063.     debug(F101,"hupok getyesno","",z);
  4064.     if (z < -3) z = 0;
  4065. }
  4066.     }
  4067.     return(z);
  4068. }
  4069. #ifndef NOSHOW
  4070. VOID
  4071. shoctl() { /* SHOW CONTROL-PREFIXING */
  4072. #ifdef CK_SPEED
  4073.     int i;
  4074. #ifdef OS2
  4075.     int zero;
  4076. #endif /* OS2 */
  4077.     printf(
  4078. "ncontrol quote = %d, applied to (0 = unprefixed, 1 = prefixed):nn",
  4079.    myctlq);
  4080. #ifdef OS2
  4081. #ifndef UNPREFIXZERO
  4082.     zero = ctlp[0];
  4083.     if (protocol == PROTO_K) /* Zero can't be unprefixed */
  4084.       ctlp[0] = 1; /* for Kermit */
  4085. #endif /* UNPREFIXZERO */
  4086. #endif /* OS2 */
  4087.     for (i = 0; i < 16; i++) {
  4088. printf("  %3d: %d   %3d: %d ",i,ctlp[i], i+16, ctlp[i+16]);
  4089. if (i == 15)
  4090.   printf("  127: %d",ctlp[127]);
  4091. else
  4092.   printf("        ");
  4093. printf("  %3d: %d   %3d: %d ",i+128,ctlp[i+128], i+144, ctlp[i+144]);
  4094. if (i == 15)  printf("  255: %d",ctlp[255]);
  4095. printf("n");
  4096.     }
  4097.     printf("n");
  4098. #ifndef UNPREFIXZERO
  4099. #ifdef OS2
  4100.     ctlp[0] = zero;
  4101. #endif /* OS2 */
  4102. #endif /* UNPREFIXZERO */
  4103. #endif /* CK_SPEED */
  4104. }
  4105. #ifndef NOXFER
  4106. VOID
  4107. shodbl() { /* SHOW DOUBLE/IGNORE */
  4108. #ifdef CKXXCHAR
  4109.     int i, n = 0;
  4110.     printf("nSET SEND DOUBLE characters:n");
  4111.     for (i = 0; i < 255; i++) {
  4112. if (dblt[i] & 2) {
  4113.     n++;
  4114.     printf(" %d", i);
  4115. }
  4116.     }
  4117.     if (n == 0)
  4118.       printf(" (none)");
  4119.     n = 0;
  4120.     printf("nSET RECEIVE IGNORE characters:n");
  4121.     for (i = 0; i < 255; i++) {
  4122. if (dblt[i] & 1) {
  4123.     n++;
  4124.     printf(" %d", i);
  4125. }
  4126.     }
  4127.     if (n == 0)
  4128.       printf(" (none)");
  4129.     printf("nn");
  4130. #endif /* CKXXCHAR */
  4131. }
  4132. #endif /* NOXFER */
  4133. #endif /* NOSHOW */
  4134. #ifndef NOPUSH
  4135. #ifdef CK_REXX
  4136. /*
  4137.   Rexx command.  Note, this is not OS/2-specific, because Rexx also runs
  4138.   on other systems where C-Kermit also runs, like the Amiga.
  4139. */
  4140. #define REXBUFL 100 /* Change this if neccessary */
  4141. char rexxbuf[REXBUFL] = { '' }; /* Rexx's return value (string) */
  4142. int
  4143. dorexx() {
  4144.     int x, y;
  4145.     char *rexxcmd;
  4146. if ((x = cmtxt("Rexx command","",&rexxcmd,xxstring)) < 0)
  4147.   return(x);
  4148. #ifdef IKSD
  4149.     if (inserver) {
  4150.         printf("?Sorry, command disabled.rn");
  4151.         return(success = 0);
  4152.     }
  4153. #endif /* IKSD */
  4154. #ifdef CK_APC
  4155.     /* Don't let this be set remotely */
  4156.     if (apcactive == APC_LOCAL ||
  4157.         apcactive == APC_REMOTE && apcstatus != APC_UNCH)
  4158.       return(success = 0);
  4159. #endif /* CK_APC */
  4160. strcpy(line,rexxcmd);
  4161. rexxcmd = line;
  4162. #ifdef OS2
  4163. return(os2rexx(rexxcmd,rexxbuf,REXBUFL));
  4164. #else /* !OS2 */
  4165. printf("Sorry, nothing happens.n");
  4166. return(success = 0);
  4167. #endif /* OS2 */
  4168. }
  4169. #endif /* CK_REXX */
  4170. #endif /* NOPUSH */
  4171. #endif /* NOICP */