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

通讯/手机编程

开发平台:

Windows_Unix

  1.       }
  2.   }
  3.   if (x > 8192/(tt_rows[VTERM]+1)) {
  4.       printf(
  5. "n?The max screen area is 8192 cells: %d(rows) x %d(cols) = %d cells.n",
  6.      tt_rows[VTERM]+1,x,x*(tt_rows[VTERM]+1));
  7.       return(success = 0);
  8.   }
  9.   tt_cols[VTERM] = x;
  10.   tt_cols_usr = x;
  11.   VscrnSetWidth( VTERM, x);
  12. #ifdef TNCODE
  13.   if (TELOPT_ME(TELOPT_NAWS))
  14.     tn_snaws();
  15. #endif /* TNCODE */
  16. #ifdef RLOGCODE
  17.   if (TELOPT_ME(TELOPT_NAWS))
  18.     rlog_naws();
  19. #endif /* RLOGCODE */
  20. /*
  21.    We do not set tt_szchng here because that would result in the screen buffer
  22.    being reallocated and the screen cleared.  But that is not necessary when
  23.    only the screen width is being changed since the buffer allocates the full
  24.    width
  25. */
  26. #else  /* Not OS/2 */
  27.   tt_cols = x;
  28. #endif /* OS2 */
  29.   return(success = 1);
  30.       }
  31.       case XYTHIG:
  32.     if ((y = cmnum(
  33. #ifdef OS2
  34.  "number of rows in display window during CONNECT, not including status line",
  35.  tt_status?"24":"25",
  36. #else
  37.  "24","number of rows on your screen",
  38. #endif /* OS2 */
  39.        10,&x,xxstring)) < 0)
  40.   return(y);
  41. if ((y = cmcfm()) < 0) return(y);
  42. #ifdef OS2
  43. if (tt_modechg == TVC_DIS) {
  44.     printf("n?SET TERMINAL VIDEO-CHANGE DISABLEDn");
  45.     return(success = 0);
  46. }
  47. if (IsOS2FullScreen()) {
  48.             if (tt_status && x != 24 && x != 42 && x != 49 && x != 59) {
  49.                 printf("n?The height must be 24, 42, 49");
  50. #ifdef NT
  51.                 printf(" or 59 under Windows 95.n.");
  52. #else /* NT */
  53.                 printf(" or 59 in a Full Screen session.n.");
  54. #endif /* NT */
  55.                 return(success = 0);
  56.     } else if (!tt_status &&
  57.        x != 25 &&
  58.        x != 43 &&
  59.        x != 50) {
  60.                 printf("n?The height must be 25, 43, 50");
  61. #ifdef NT
  62.                 printf(" or 60 under Windows 95.n.");
  63. #else /* NT */
  64.                 printf(" or 60 in a Full Screen session.n.");
  65. #endif /* NT */
  66.                 return(success = 0);
  67.     }
  68. } else if (tt_modechg == TVC_W95) {
  69.             if (tt_status && x != 24 && x != 42 && x != 49) {
  70.                 printf("n?The height must be 24, 42, 49");
  71. #ifdef NT
  72.                 printf(" under Windows 95.n.");
  73. #else /* NT */
  74.                 printf(" in a Full Screen session.n.");
  75. #endif /* NT */
  76.                 return(success = 0);
  77.     } else if (!tt_status &&
  78.        x != 25 &&
  79.        x != 43 &&
  80.        x != 50) {
  81.                 printf("n?The height must be 25, 43, 50");
  82. #ifdef NT
  83.                 printf(" under Windows 95.n.");
  84. #else /* NT */
  85.                 printf(" in a Full Screen session.n.");
  86. #endif /* NT */
  87.                 return(success = 0);
  88.     }
  89. } else {
  90.             if (x < 8 || x > MAXTERMROW ) {
  91.                 printf("n?The height must be between 8 and %dn.",MAXTERMROW);
  92.                 return(success = 0);
  93.     }
  94. }
  95.         if (x > 8192/tt_cols[VTERM]) {
  96.             printf(
  97.  "n?The max screen area is 8192 cells: %d(rows) x %d(cols) = %d cells.n",
  98.    x,tt_cols[VTERM],x*tt_cols[VTERM]);
  99.             return(success = 0);
  100. }
  101.         tt_szchng[VTERM] = 1;
  102.         tt_rows[VTERM] = x;
  103.         VscrnInit( VTERM ); /* Height set here */
  104. #ifdef TNCODE
  105.   if (TELOPT_ME(TELOPT_NAWS))
  106.     tn_snaws();
  107. #endif /* TNCODE */
  108. #ifdef RLOGCODE
  109.   if (TELOPT_ME(TELOPT_NAWS))
  110.     rlog_naws();
  111. #endif /* RLOGCODE */
  112. #else  /* Not OS/2 */
  113. tt_rows = x;
  114. #endif /* OS2 */
  115.         return(success = 1);
  116. #ifdef OS2
  117.       case XYTPRN: { /* Print Mode */
  118.   extern bool xprint, cprint, aprint, uprint;
  119.   if ((y = cmkey(prnmtab,nprnmtab,"","off", xxstring)) < 0) return(y);
  120.   if ((x = cmcfm()) < 0) return(x);
  121.   switch (y) {
  122.     case 0:
  123.       if (cprint || uprint || aprint || xprint)
  124.                 printeroff();
  125.       cprint = xprint = uprint = aprint = 0;
  126.       break;
  127.     case 1:
  128.       if (!(cprint || uprint || aprint || xprint))
  129.                 printeron();
  130.       aprint = 1;
  131.       cprint = xprint = uprint = 0;
  132.       break;
  133.     case 2:
  134.       if (!(cprint || uprint || aprint || xprint))
  135.                 printeron();
  136.       cprint = 1;
  137.       aprint = xprint = uprint = 0;
  138.       break;
  139.     case 3:
  140.       if (!(cprint || uprint || aprint || xprint))
  141.                 printeron();
  142.       uprint = 1;
  143.       aprint = xprint = cprint = 0;
  144.       break;
  145.   }
  146.   return(1);
  147.       }
  148. #else
  149. #ifdef XPRINT
  150.       case XYTPRN: {
  151.   extern int tt_print;
  152.   if ((x = seton(&tt_print)) < 0)
  153.     return(x);
  154.   return(success = 1);
  155.       }
  156. #endif /* XPRINT */
  157. #endif /* OS2 */
  158. #ifdef OS2
  159.       case XYTSCNM: {
  160.   extern int decscnm, decscnm_usr;
  161.   if ((y = cmkey(normrev,4,"",
  162.  decscnm_usr?"reverse":"normal",
  163.  xxstring)
  164.        ) < 0)
  165.     return(y);
  166.   if ((x = cmcfm()) < 0) return(x);
  167.   decscnm_usr = y;
  168.   if (decscnm != decscnm_usr)
  169.             flipscreen(VTERM);
  170.   return(1);
  171.     }
  172.     case XYTOPTI:
  173.         if ((y = cmkey(onoff,2,"",tt_diff_upd?"on":"off",
  174.                         xxstring)) < 0) return(y);
  175.         if ((x = cmcfm()) < 0) return(x);
  176.         tt_diff_upd = y;
  177.         return(1);
  178.     case XYTUPD: {
  179. int mode, delay;
  180. if ((mode = cmkey(scrnupd,nscrnupd,"","fast",xxstring)) < 0) {
  181.     return(mode);
  182.         } else {
  183.     y = cmnum(
  184.     "Pause between FAST screen updates in CONNECT mode, milliseconds",
  185.       "100",10,&x,xxstring
  186.       );
  187.     if (x < 0 || x > 1000 ) {
  188. printf(
  189.     "n?The update rate must be between 0 and 1000 milliseconds.n"
  190.        );
  191. return(success = 0);
  192.             }
  193.             if ((y = cmcfm()) < 0) return(y);
  194.     updmode = tt_updmode = mode;
  195.     return(setnum(&tt_update,x,y,10000));
  196. }
  197.     }
  198.     case XYTCTRL:
  199.   if ((x = cmkey(termctrl,ntermctrl,"","7",xxstring)) < 0) {
  200.       return(x);
  201.   } else {
  202.       if ((y = cmcfm()) < 0)
  203.   return(y);
  204.       switch ( x ) {
  205.       case 8:
  206.   send_c1 = send_c1_usr = TRUE;
  207.   break;
  208.       case 7:
  209.       default:
  210.   send_c1 = send_c1_usr = FALSE;
  211.   break;
  212.       }
  213.   }
  214.   return(success = TRUE);
  215.   break;
  216. #ifdef PCFONTS
  217.       case XYTFON:
  218. if ( !IsOS2FullScreen() ) {
  219.     printf(
  220.         "n?SET TERMINAL FONT is only supported in Full Screen sessions.n");
  221.     return(success = FALSE);
  222.         }
  223. if ((x = cmkey(termfont,ntermfont,"","default",xxstring)) < 0) {
  224.             return(x);
  225.         } else {
  226.     if ((y = cmcfm()) < 0) return(y);
  227.             if ( !os2LoadPCFonts() ) {
  228.                 tt_font = x;
  229. return(success = TRUE);
  230.     } else {
  231. printf(
  232.       "n?PCFONTS.DLL is not available in CKERMIT executable directory.n");
  233.                 return(success = FALSE);
  234.     }
  235. }
  236. break;
  237. #endif /* PCFONTS */
  238.       case XYTVCH: {
  239.   extern int pheight, marginbot, cmd_rows, cmd_cols;
  240.   if ((x = cmkey(tvctab,ntvctab,"",isWin95()?"win95-safe":"enabled",
  241.  xxstring)) < 0)
  242.     return(x);
  243.   if ((y = cmcfm()) < 0) return(y);
  244.   if (x != tt_modechg) {
  245.       switch (x) {
  246. case TVC_DIS:
  247.   /* When disabled the heights of all of the virtual screens */
  248.   /* must be equal to the physical height of the console     */
  249.   /* window and may not be changed.                          */
  250.   /* The width of the window may not be altered.             */
  251.   tt_modechg = TVC_ENA; /* Termporary */
  252.   if (marginbot > pheight-(tt_status?1:0))
  253.     marginbot = pheight-(tt_status?1:0);
  254.   tt_szchng[VCMD] = 1 ;
  255.   tt_rows[VCMD] = pheight;
  256.   VscrnInit(VCMD);
  257.   SetCols(VCMD);
  258.   cmd_rows = y;
  259.   tt_szchng[VTERM] = 2 ;
  260.   tt_rows[VTERM] = pheight - (tt_status?1:0);
  261.   VscrnInit(VTERM);
  262.   break;
  263. case TVC_ENA:
  264.   /* When enabled the physical height of the console windows */
  265.   /* should be adjusted to the height of the virtual screen  */
  266.   /* The width may be set to anything.                       */
  267.   /* nothing to do                                           */
  268.   break;
  269.       case TVC_W95:
  270.   /* Win95-safe mode allows the physical height to change    */
  271.   /* but restricts it to a width of 80 and a height equal to */
  272.   /* 25, 43, or 50.  Must be adjusted now.                   */
  273.   /* The virtual heights must be equal to the above.         */
  274.   if (pheight != 25 && pheight != 43 && pheight != 50) {
  275.       if (pheight < 25)
  276. y = 25;
  277.       else if (pheight < 43)
  278. y = 43;
  279.       else
  280. y = 50;
  281.   } else
  282.     y = pheight;
  283.   tt_modechg = TVC_ENA; /* Temporary */
  284.   tt_szchng[VCMD] = 1;
  285.   tt_rows[VCMD] = y;
  286.   tt_cols[VCMD] = 80;
  287.   VscrnInit(VCMD);
  288.   SetCols(VCMD);
  289.   cmd_rows = y;
  290.   cmd_cols = 80;
  291.   marginbot = y-(tt_status?1:0);
  292.   tt_szchng[VTERM] = 2;
  293.   tt_rows[VTERM] = y - (tt_status?1:0);
  294.   tt_cols[VTERM] = 80;
  295.   VscrnInit(VTERM);
  296.   break;
  297.       }
  298.       tt_modechg = x;
  299.   }
  300.   return(1);
  301.       }
  302.       case XYTSTAT: {
  303.           extern int marginbot;
  304.           if ((y = cmkey(onoff,2,"","on",xxstring)) < 0) return(y);
  305.           if ((x = cmcfm()) < 0) return(x);
  306.           if (y != tt_status || y != tt_status_usr) {
  307.               /* Might need to fixup the margins */
  308.               if ( marginbot == VscrnGetHeight(VTERM)-(tt_status?1:0) )
  309.                 if (y) {
  310.                     marginbot--;
  311.                 } else {
  312.                     marginbot++;
  313.                 }
  314.               tt_status_usr = tt_status = y;
  315.               if (y) {
  316.                     tt_szchng[VTERM] = 2;
  317.                     tt_rows[VTERM]--;
  318.                     VscrnInit(VTERM);  /* Height set here */
  319. #ifdef TNCODE
  320.     if (TELOPT_ME(TELOPT_NAWS))
  321.       tn_snaws();
  322. #endif /* TNCODE */
  323. #ifdef RLOGCODE
  324.     if (TELOPT_ME(TELOPT_NAWS))
  325.       rlog_naws();
  326. #endif /* RLOGCODE */
  327.               } else {
  328.   tt_szchng[VTERM] = 1;
  329.   tt_rows[VTERM]++;
  330.   VscrnInit(VTERM); /* Height set here */
  331. #ifdef TNCODE
  332.   if (TELOPT_ME(TELOPT_NAWS))
  333.     tn_snaws();
  334. #endif /* TNCODE */
  335. #ifdef RLOGCODE
  336.   if (TELOPT_ME(TELOPT_NAWS))
  337.     rlog_naws();
  338. #endif /* RLOGCODE */
  339.               }
  340.           }
  341.           return(1);
  342.       }
  343. #endif /* OS2 */
  344. #ifdef NT
  345.       case XYTATTBUG:
  346. if ((y = cmkey(onoff,2,"","on",xxstring)) < 0) return(y);
  347. if ((x = cmcfm()) < 0) return(x);
  348. tt_attr_bug = y;
  349. return(1);
  350. #endif /* NT */
  351. #ifdef OS2
  352.       case XYTSGRC:
  353. if ((y = cmkey(onoff,2,"","on",xxstring)) < 0) return(y);
  354. if ((x = cmcfm()) < 0) return(x);
  355. sgrcolors = y;
  356. return(1);
  357.       case XYTSEND:
  358.   if ((y = cmkey(onoff,2,"","on",xxstring)) < 0) return(y);
  359.   if ((x = cmcfm()) < 0) return(x);
  360.   tt_senddata = y;
  361.   return(1);
  362.       case XYTSEOB:
  363.   if ((y = cmkey(ttyseobtab,2,"","us_cr",xxstring)) < 0) return(y);
  364.   if ((x = cmcfm()) < 0) return(x);
  365.   wy_blockend = y;
  366.   return(1);
  367.       case XYTATTR:
  368. if ((x = cmkey(ttyattrtab,nattrib,"","underline",xxstring)) < 0)
  369.   return(x);
  370. switch (x) {
  371.   case TTATTBLI:
  372.     if ((y = cmkey(onoff,2,"","on",xxstring)) < 0) return(y);
  373.     if ((x = cmcfm()) < 0) return(x);
  374.     trueblink = y;
  375. #ifndef KUI
  376.     if ( !trueblink && trueunderline ) {
  377. trueunderline = 0;
  378. printf("Warning: Underline being simulated by color.n");
  379.     }
  380. #endif /* KUI */
  381.     break;
  382.   case TTATTREV:
  383.     if ((y = cmkey(onoff,2,"","on",xxstring)) < 0) return(y);
  384.     if ((x = cmcfm()) < 0) return(x);
  385.     truereverse = y;
  386.     break;
  387.   case TTATTUND:
  388.     if ((y = cmkey(onoff,2,"","on",xxstring)) < 0) return(y);
  389.     if ((x = cmcfm()) < 0) return(x);
  390.     trueunderline = y;
  391. #ifndef KUI
  392.     if (!trueblink && trueunderline) {
  393. trueblink = 1;
  394. printf("Warning: True blink mode is active.n");
  395.     }
  396. #endif /* KUI */
  397.     break;
  398.   case TTATTPRO: { /* Set default Protected Character attribute */
  399.       extern vtattrib WPattrib;    /* current WP Mode Attrib */
  400.       extern vtattrib defWPattrib; /* default WP Mode Attrib */
  401.       vtattrib wpa = {0,0,0,0,0,1,0,0,0}; /* Protected */
  402.       int done = 0;
  403.       x = 0;
  404.       while (!done) {
  405.   if ((y = cmkey(ttyprotab,nprotect,"",
  406.  x?"done":"dim",xxstring)) < 0)
  407.     return(y);
  408.   switch (y) {
  409.     case TTATTNOR:
  410.       break;
  411.     case TTATTBLI: /* Blinking doesn't work */
  412.       wpa.blinking = TRUE;
  413.       break;
  414.     case TTATTREV:
  415.       wpa.reversed = TRUE;
  416.       break;
  417.     case TTATTUND:
  418.       wpa.underlined = TRUE;
  419.       break;
  420.     case TTATTBLD:
  421.       wpa.bold = TRUE;
  422.       break;
  423.     case TTATTDIM:
  424.       wpa.dim = TRUE;
  425.       break;
  426.     case TTATTINV:
  427.       wpa.invisible = TRUE ;
  428.       break;
  429.     case TTATTDONE:
  430.       done = TRUE;
  431.       break;
  432.   }
  433.   x = 1; /* One attribute has been chosen */
  434.       }
  435.       if ((x = cmcfm()) < 0) return(x);
  436.       WPattrib = defWPattrib = wpa;
  437.       break;
  438.   }
  439. }
  440. return(1);
  441.       case XYTKEY: { /* SET TERMINAL KEY */
  442.   int t, x, y;
  443.   int clear = 0, deflt = 0;
  444.   int confirmed = 0;
  445.   int flag = 0;
  446.   int kc = -1; /* Key code */
  447.           int litstr = 0;               /* Literal String? */
  448.   char *s = NULL; /* Key binding */
  449. #ifndef NOKVERBS
  450.   char *p = NULL; /* Worker */
  451. #endif /* NOKVERBS */
  452.   con_event defevt;
  453.   extern int os2gks;
  454.   extern int mskkeys;
  455.   extern int initvik;
  456.           struct FDB kw,sw,nu,cm;
  457.           defevt.type = error;
  458.   if ((t = cmkey(ttkeytab,nttkey,"","",xxstring)) < 0)
  459.     return(t);
  460.   cmfdbi(&nu, /* First FDB - command switches */
  461.  _CMNUM, /* fcode */
  462.  "/literal, keycode, or action",
  463.  "", /* default */
  464.  "", /* addtl string data */
  465.  10, /* addtl numeric data 1: radix */
  466.  0, /* addtl numeric data 2: 0 */
  467.  xxstring, /* Processing function */
  468.  NULL, /* Keyword table */
  469.  &sw /* Pointer to next FDB */
  470.  ); /*  */
  471.   cmfdbi(&sw, /* Second FDB - switches */
  472.  _CMKEY, /* fcode */
  473.  "",
  474.  "", /* default */
  475.  "", /* addtl string data */
  476.  nstrmswitab, /* addtl numeric data 1: tbl size */
  477.  4, /* addtl numeric data 2: 4 = cmswi */
  478.  xxstring, /* Processing function */
  479.  strmswitab, /* Keyword table */
  480.  &kw /* Pointer to next FDB */
  481.  );
  482.   cmfdbi(&kw, /* Third FDB - command switches */
  483.  _CMKEY, /* fcode */
  484.  "/literal, keycode, or action",
  485.  "", /* default */
  486.  "", /* addtl string data */
  487.  nstrmkeytab, /* addtl numeric data 1: tbl size */
  488.  0, /* addtl numeric data 2 */
  489.  xxstring, /* Processing function */
  490.  strmkeytab, /* Keyword table */
  491.  &cm /* Pointer to next FDB */
  492.  );
  493.   cmfdbi(&cm, /* Final FDB - Confirmation */
  494.  _CMCFM, /* fcode */
  495.  "",
  496.  "", /* default */
  497.  "", /* addtl string data */
  498.  0,          /* addtl numeric data 1: tbl size */
  499.  0, /* addtl numeric data 2: 4 = cmswi */
  500.  xxstring, /* Processing function */
  501.  NULL, /* Keyword table */
  502.  NULL /* Pointer to next FDB */
  503.  );
  504.   while (kc < 0) {
  505.       x = cmfdb(&nu); /* Parse something */
  506.               if (x < 0)
  507.                 return(x);
  508.       switch (cmresult.fcode) {
  509.                 case _CMCFM:
  510.   printf(" Press key to be defined: ");
  511.   conbin((char)escape); /* Put terminal in binary mode */
  512.   os2gks = 0; /* Turn off Kverb preprocessing */
  513.   kc = congks(0); /* Get character or scan code */
  514.   os2gks = 1; /* Turn on Kverb preprocessing */
  515.   concb((char)escape); /* Restore terminal to cbreak mode */
  516.   if (kc < 0) { /* Check for error */
  517.       printf("?Error reading keyn");
  518.       return(0);
  519.   }
  520.   shokeycode(kc,t); /* Show current definition */
  521.   flag = 1; /* Remember it's a multiline command */
  522.                   break;
  523. case _CMNUM:
  524.   kc = cmresult.nresult;
  525.   break;
  526. case _CMKEY:
  527.   if (cmresult.fdbaddr == &sw) { /* Switch */
  528.       if (cmresult.nresult == 0)
  529. litstr = 1;
  530.   } else if (cmresult.fdbaddr == &kw) { /* Keyword */
  531.       if (cmresult.nresult == 0)
  532. clear = 1;
  533.       else
  534. deflt = 1;
  535.       if ((x = cmcfm()) < 0)
  536. return(x);
  537.       if (clear)
  538. clearkeymap(t);
  539.       else if (deflt)
  540.         defaultkeymap(t);
  541.       initvik = 1;
  542.       return(1);
  543.   }
  544.       }
  545.   }
  546.     /* Normal SET TERMINAL KEY <terminal> <scancode> <value> command... */
  547.   if (mskkeys)
  548.     kc = msktock(kc);
  549.   if (kc < 0 || kc >= KMSIZE) {
  550.       printf("?key code must be between 0 and %dn", KMSIZE - 1);
  551.       return(-9);
  552.   }
  553.   if (kc == escape) {
  554.       printf("Sorry, %d is the CONNECT-mode escape charactern",kc);
  555.       return(-9);
  556.   }
  557.   wideresult = -1;
  558.   if (flag) {
  559.       cmsavp(psave,PROMPTL);
  560.       cmsetp(" Enter new definition: ");
  561.       cmini(ckxech);
  562.   }
  563. def_again:
  564.   if (flag) prompt(NULL);
  565.   if ((y = cmtxt("key definition,n
  566.  or Ctrl-C to cancel this command,n
  567.  or Enter to restore default definition",
  568.  "",&s,NULL)) < 0) {
  569.       if (flag) /* Handle parse errors */
  570. goto def_again;
  571.       else
  572. return(y);
  573.   }
  574.   s = brstrip(s);
  575. #ifndef NOKVERBS
  576.   p = s; /* Save this place */
  577. #endif /* NOKVERBS */
  578. /*
  579.   If the definition included any Kverbs, quote the backslash so the Kverb
  580.   will still be in the definition when the key is pressed.  We don't do this
  581.   in zzstring(), because Kverbs are valid only in this context and nowhere
  582.   else.
  583.   We use this code active for all versions that support SET KEY, even if they
  584.   don't support Kverbs, because otherwise K would behave differently for
  585.   different versions.
  586. */
  587.   for (x = 0, y = 0; s[x]; x++, y++) { /* Convert K to \K */
  588.       if ((x > 0) &&
  589.   (s[x] == 'K' || s[x] == 'k')
  590.   ) { /* Have K */
  591.   if ((x == 1 && s[x-1] == CMDQ) ||
  592.       (x > 1 && s[x-1] == CMDQ && s[x-2] != CMDQ)) {
  593.       line[y++] = CMDQ; /* Make it \K */
  594.   }
  595.   if (x > 1 && s[x-1] == '{' && s[x-2] == CMDQ) {
  596.       line[y-1] = CMDQ; /* Have {K */
  597.       line[y++] = '{'; /* Make it \{K */
  598.   }
  599.       }
  600.       line[y] = s[x];
  601.   }
  602.   line[y++] = NUL; /* Terminate */
  603.   s = line + y + 1; /* Point to after it */
  604.   x = LINBUFSIZ - (int) strlen(line) - 1; /* Get remaining space */
  605.   if ((x < (LINBUFSIZ / 2)) ||
  606.       (zzstring(line, &s, &x) < 0)) { /* Expand variables, etc. */
  607.       printf("?Key definition too longn");
  608.       if (flag) cmsetp(psave);
  609.       return(-9);
  610.   }
  611.   s = line + y + 1; /* Point to result. */
  612. #ifndef NOKVERBS
  613. /*
  614.   Special case: see if the definition starts with a Kverb.
  615.   If it does, point to it with p, otherwise set p to NULL.
  616. */
  617.   p = s;
  618.   if (*p++ == CMDQ) {
  619.       if (*p == '{') p++;
  620.       p = (*p == 'k' || *p == 'K') ? p + 1 : NULL;
  621.   }
  622. #endif /* NOKVERBS */
  623.   switch (strlen(s)) { /* Action depends on length */
  624.     case 0: /* Clear individual key def */
  625.       deletekeymap(t,kc);
  626.       break;
  627.     case 1:
  628.               if (!litstr) {
  629.   defevt.type = key; /* Single character */
  630.   defevt.key.scancode = *s;
  631.   break;
  632.               }
  633.     default: /* Character string */
  634. #ifndef NOKVERBS
  635.       if (p) {
  636.   y = xlookup(kverbs,p,nkverbs,&x); /* Look it up */
  637.   /* Need exact match */
  638.   debug(F101,"set key kverb lookup",0,y);
  639.   if (y > -1) {
  640.       defevt.type = kverb;
  641.       defevt.kverb.id = y;
  642.       break;
  643.   }
  644.       }
  645. #endif /* NOKVERBS */
  646.               if (litstr) {
  647.   defevt.type = literal;
  648.   defevt.literal.string = (char *) malloc(strlen(s)+1);
  649.   if (defevt.literal.string)
  650.     strcpy(defevt.literal.string, s);
  651.               } else {
  652.   defevt.type = macro;
  653.   defevt.macro.string = (char *) malloc(strlen(s)+1);
  654.   if (defevt.macro.string)
  655.     strcpy(defevt.macro.string, s);
  656.               }
  657.       break;
  658.   }
  659.   insertkeymap(t, kc, defevt);
  660.   if (flag)
  661.     cmsetp(psave);
  662.   initvik = 1; /* Update VIK table */
  663.   return(1);
  664.       }
  665. #ifdef PCTERM
  666.       case XYTPCTERM:                   /* PCTERM Keyboard Mode */
  667.         if ((x = seton(&tt_pcterm)) < 0) return(x);
  668.         return(success = 1);
  669. #endif /* PCTERM */
  670. #endif /* OS2 */
  671. #ifdef CK_TRIGGER
  672.       case XYTRIGGER:
  673. if ((y = cmtxt("String to trigger automatic return to command mode",
  674.        "",&s,xxstring)) < 0)
  675.   return(y);
  676. makelist(s,tt_trigger,TRIGGERS);
  677. return(1);
  678. #endif /* CK_TRIGGER */
  679. #ifdef OS2
  680.       case XYTSAC:
  681. if ((y = cmnum("ASCII value to use for spacing attributes",
  682.        "32",10,&x,xxstring)) < 0)
  683.           return(y);
  684. if ((y = cmcfm()) < 0) return(y);
  685. tt_sac = x;
  686. return(success = 1);
  687.       case XYTKBDGL: {      /* SET TERM KBD-FOLLOWS-GL/GR */
  688.           extern int tt_kb_glgr;        /* from ckoco3.c */
  689.           if ((x = seton(&tt_kb_glgr)) < 0)
  690.               return(x);
  691.           return(success = 1);
  692.       }
  693. #ifndef NOCSETS
  694.       case XYTVTLNG:        /* SET TERM DEC-LANGUAGE */
  695. if ((y = cmkey(vtlangtab,nvtlangtab,"VT language",
  696.        "north-american",xxstring)) < 0)
  697.   return(y);
  698. if ((x = cmcfm()) < 0) return(x);
  699. /* A real VT terminal would use the language to set the   */
  700. /* default keyboard language for both 8-bit multinational */
  701. /* and 7-bit national modes.  For 8-bit mode it would     */
  702. /* set the terminal character-set to the ISO set if it    */
  703. /* is not already set.                                    */
  704. /* Latin-1 can be replaced by DEC Multinational           */
  705. switch (y) {
  706.           case VTL_NORTH_AM:  /* North American */
  707.     /* Multinational: Latin-1   */
  708.     /* National:      US_ASCII  */
  709.     dec_lang = y;
  710.     dec_nrc = TX_ASCII;
  711.     dec_kbd = TX_8859_1;
  712.     break;
  713.           case VTL_BRITISH :
  714.     /* Multinational: Latin-1   */
  715.     /* National:      UK_ASCII  */
  716.     dec_lang = y;
  717.     dec_nrc = TX_BRITISH;
  718.     dec_kbd = TX_8859_1;
  719.     break;
  720.           case VTL_FRENCH  :
  721.           case VTL_BELGIAN :
  722.           case VTL_CANADIAN:
  723.     /* Multinational: Latin-1   */
  724.     /* National:      FR_ASCII  */
  725.     dec_lang = y;
  726.     dec_nrc = TX_FRENCH;
  727.     dec_kbd = TX_8859_1;
  728.     break;
  729.           case VTL_FR_CAN  :
  730.     /* Multinational: Latin-1   */
  731.     /* National:      FC_ASCII  */
  732.     dec_lang = y;
  733.     dec_nrc = TX_CN_FRENCH;
  734.     dec_kbd = TX_8859_1;
  735.     break;
  736.           case VTL_DANISH  :
  737.           case VTL_NORWEGIA:
  738.     /* Multinational: Latin-1   */
  739.     /* National:      NO_ASCII  */
  740.     dec_lang = y;
  741.     dec_nrc = TX_NORWEGIAN;
  742.     dec_kbd = TX_8859_1;
  743.     break;
  744.           case VTL_FINNISH :
  745.     /* Multinational: Latin-1   */
  746.     /* National:      FI_ASCII  */
  747.     dec_lang = y;
  748.     dec_nrc = TX_FINNISH;
  749.     dec_kbd = TX_8859_1;
  750.     break;
  751.           case VTL_GERMAN  :
  752.     /* Multinational: Latin-1   */
  753.     /* National:      GR_ASCII  */
  754.     dec_lang = y;
  755.     dec_nrc = TX_GERMAN;
  756.     dec_kbd = TX_8859_1;
  757.     break;
  758.           case VTL_DUTCH   :
  759.     /* Multinational: Latin-1   */
  760.     /* National:      DU_ASCII  */
  761.     dec_lang = y;
  762.     dec_nrc = TX_DUTCH;
  763.     dec_kbd = TX_8859_1;
  764.     break;
  765.           case VTL_ITALIAN :
  766.     /* Multinational: Latin-1   */
  767.     /* National:      IT_ASCII  */
  768.     dec_lang = y;
  769.     dec_nrc = TX_ITALIAN;
  770.     dec_kbd = TX_8859_1;
  771.     break;
  772.           case VTL_SW_FR   :
  773.           case VTL_SW_GR   :
  774.     /* Multinational: Latin-1   */
  775.     /* National:      CH_ASCII  */
  776.     dec_lang = y;
  777.     dec_nrc = TX_SWISS;
  778.     dec_kbd = TX_8859_1;
  779.     break;
  780.           case VTL_SWEDISH :
  781.     /* Multinational: Latin-1   */
  782.     /* National:      SW_ASCII  */
  783.     dec_lang = y;
  784.     dec_nrc = TX_SWEDISH;
  785.     dec_kbd = TX_8859_1;
  786.     break;
  787.           case VTL_SPANISH :
  788.     /* Multinational: Latin-1   */
  789.     /* National:      SP_ASCII  */
  790.     dec_lang = y;
  791.     dec_nrc = TX_SPANISH;
  792.     dec_kbd = TX_8859_1;
  793.     break;
  794.           case VTL_PORTUGES:
  795.     /* Multinational: Latin-1   */
  796.     /* National:      Portugese ASCII  */
  797.     dec_lang = y;
  798.     dec_nrc = TX_PORTUGUESE;
  799.     dec_kbd = TX_8859_1;
  800.     break;
  801.           case VTL_HEBREW  :
  802.     /* Multinational: Latin-Hebrew / DEC-Hebrew  */
  803.     /* National:      DEC 7-bit Hebrew  */
  804.     dec_lang = y;
  805.     dec_nrc = TX_HE7;
  806.     dec_kbd = TX_8859_8;
  807.     break;
  808.           case VTL_GREEK   :
  809.     /* Multinational: Latin-Greek / DEC-Greek   */
  810.     /* National:      DEC Greek NRC             */
  811.     /* is ELOT927 equivalent to DEC Greek????   */
  812.     dec_lang = y;
  813.     dec_nrc = TX_ELOT927;
  814.     dec_kbd = TX_8859_7;
  815.     break;
  816. #ifdef COMMENT
  817.           case VTL_TURK_Q  :
  818.           case VTL_TURK_F  :
  819.     /* Multinational: Latin-Turkish / DEC-Turkish   */
  820.     /* National:      DEC 7-bit Turkish             */
  821.     break;
  822. #endif /* COMMENT */
  823.           case VTL_HUNGARIA:
  824.     /* Multinational: Latin-2   */
  825.     /* National:      no national mode  */
  826.     dec_lang = y;
  827.     dec_nrc = TX_HUNGARIAN;
  828.     dec_kbd = TX_8859_2;
  829.     break;
  830.           case VTL_SLOVAK  :
  831.           case VTL_CZECH   :
  832.           case VTL_POLISH  :
  833.           case VTL_ROMANIAN:
  834.     /* Multinational: Latin-2   */
  835.     /* National:      no national mode  */
  836.     dec_lang = y;
  837.     dec_nrc = TX_ASCII;
  838.     dec_kbd = TX_8859_2;
  839.     break;
  840.           case VTL_RUSSIAN :
  841.     /* Multinational: Latin-Cyrillic / KOI-8   */
  842.     /* National:      DEC Russian NRC  */
  843.     dec_lang = y;
  844.     dec_nrc = TX_KOI7;
  845.     dec_kbd = TX_8859_5;
  846.     break;
  847.           case VTL_LATIN_AM:
  848.     /* Multinational: not listed in table   */
  849.     /* National:      not listed in table  */
  850.     dec_lang = y;
  851.     dec_nrc = TX_ASCII;
  852.     dec_kbd = TX_8859_1;
  853.     break;
  854. #ifdef COMMENT
  855.           case VTL_SCS     :
  856.     /* Multinational: Latin-2   */
  857.     /* National:      SCS NRC   */
  858.     break;
  859. #endif /* COMMENT */
  860.           default:
  861.     return(success = 0);
  862. }
  863. if (IS97801(tt_type_mode)) {
  864.     SNI_bitmode(cmask == 0377 ? 8 : 7);
  865. }
  866. return(success = 1);
  867. #endif /* NOCSETS */
  868.       case XYTVTNRC: { /* SET TERM DEC-NRC-MODE */
  869.   extern int decnrcm_usr, decnrcm;        /* from ckoco3.c */
  870.   if ((x = seton(&decnrcm_usr)) < 0)
  871.             return(x);
  872.   decnrcm = decnrcm_usr;
  873.   return(success = 1);
  874.       }
  875.       case XYTSNIPM: {                  /* SET TERM SNI-PAGEMODE */
  876.           extern int sni_pagemode, sni_pagemode_usr;
  877.           if ((y = cmkey(onoff,2,"","on",xxstring)) < 0) return(y);
  878.           if ((x = cmcfm()) < 0) return(x);
  879.           sni_pagemode_usr = sni_pagemode = y;
  880.           return(success = 1);
  881.       }
  882.       case XYTSNISM: {                  /* SET TERM SNI-SCROLLMODE */
  883.           extern int sni_scroll_mode, sni_scroll_mode_usr;
  884.           if ((y = cmkey(onoff,2,"","on",xxstring)) < 0) return(y);
  885.           if ((x = cmcfm()) < 0) return(x);
  886.           sni_scroll_mode_usr = sni_scroll_mode = y;
  887.           return(success = 1);
  888.       }
  889.       case XYTSNICC: {  /* SET TERM SNI-CH.CODE */
  890.   extern int sni_chcode_usr;
  891.   if ((y = cmkey(onoff,2,"","on",xxstring)) < 0) return(y);
  892.   if ((x = cmcfm()) < 0) return(x);
  893.   sni_chcode_usr = y;
  894.   SNI_chcode(y);
  895.   return(success = 1);
  896.       }
  897.       case XYTSNIFV: {  /* SET TERM SNI-FIRMWARE-VERSIONS */
  898.   extern CHAR sni_kbd_firmware[], sni_term_firmware[];
  899.   CHAR kbd[7],term[7];
  900.   if ((x = cmfld("Keyboard Firmware Version",sni_kbd_firmware,
  901.  &s, xxstring)) < 0)
  902.             return(x);
  903.   if ((int)strlen(s) != 6) {
  904.       printf("?Sorry - the firmware version must be 6 digits longn");
  905.       return(-9);
  906.   }
  907.   for (i = 0; i < 6; i++) {
  908.       if (!isdigit(s[i])) {
  909.    printf("?Sorry - the firmware version can only contain digits [0-9]n");
  910.                   return(-9);
  911.               }
  912.   }
  913.   strcpy(kbd,s);
  914.   if ((x = cmfld("Terminal Firmware Version",sni_term_firmware,
  915.  &s, xxstring)) < 0)
  916.             return(x);
  917.   if ((int)strlen(s) != 6) {
  918.       printf("?Sorry - the firmware version must be 6 digits longn");
  919.       return(-9);
  920.   }
  921.   for (i = 0; i < 6; i++) {
  922.       if (!isdigit(s[i])) {
  923.    printf("?Sorry - the firmware version can only contain digits [0-9]n");
  924.                    return(-9);
  925.               }
  926.   }
  927.   strcpy(term,s);
  928.   if ((x = cmcfm()) < 0) return(x);
  929.   strcpy(sni_kbd_firmware,kbd);
  930.   strcpy(sni_term_firmware,term);
  931.   return(success = 1);
  932.     }
  933. #endif /* OS2 */
  934.       default: /* Shouldn't get here. */
  935. return(-2);
  936.     }
  937. #endif /* MAC */
  938. #ifdef COMMENT
  939.     /*
  940.       This was supposed to shut up picky compilers but instead it makes
  941.       most compilers complain about "statement not reached".
  942.     */
  943.     return(-2);
  944. #endif /* COMMENT */
  945. #ifdef OS2
  946. return(-2);
  947. #endif /* OS2 */
  948. }
  949. #ifdef OS2
  950. int
  951. settitle(void) {
  952.     extern char usertitle[];
  953.     if ((y = cmtxt("title text","",&s,xxstring)) < 0)
  954.       return(y);
  955. #ifdef IKSD
  956.     if (inserver) {
  957.         printf("?Sorry, command disabled.rn");
  958.         return(success = 0);
  959.     }
  960. #endif /* IKSD */
  961.     ckstrncpy(usertitle,s,64);
  962.     os2settitle("",1);
  963.     return(1);
  964. }
  965. static struct keytab dialertab[] = { /* K95 Dialer types */
  966.     "backspace",  0, 0,
  967.     "enter",    1, 0
  968. };
  969. static int ndialer = 2;
  970. int
  971. setdialer(void) {
  972.     int t, x, y;
  973.     int clear = 0, deflt = 0;
  974.     int kc; /* Key code */
  975.     char *s = NULL; /* Key binding */
  976. #ifndef NOKVERBS
  977.     char *p = NULL; /* Worker */
  978. #endif /* NOKVERBS */
  979.     con_event defevt;
  980.     extern int os2gks;
  981.     extern int mskkeys;
  982.     extern int initvik;
  983.     defevt.type = error;
  984.     if (( x = cmkey(dialertab, ndialer,
  985.     "Kermit-95 dialer work-arounds",
  986.     "", xxstring)) < 0 )
  987.       return(x);
  988.     switch (x) {
  989.       case 0: /* Backspace */
  990. kc = 264;
  991. break;
  992.       case 1: /* Enter */
  993. kc = 269;
  994. break;
  995.       default:
  996. printf("Illegal value in setdialer()n");
  997. return(-9);
  998.     }
  999.     if ((y = cmtxt("Key definition","",&s,xxstring)) < 0)
  1000.       return(y);
  1001. #ifdef IKSD
  1002.     if (inserver) {
  1003.         printf("?Sorry, command disabled.rn");
  1004.         return(success = 0);
  1005.     }
  1006. #endif /* IKSD */
  1007.     s = brstrip(s);
  1008. #ifndef NOKVERBS
  1009.     p = s; /* Save this place */
  1010. #endif /* NOKVERBS */
  1011. /*
  1012.   If the definition included any Kverbs, quote the backslash so the Kverb
  1013.   will still be in the definition when the key is pressed.  We don't do this
  1014.   in zzstring(), because Kverbs are valid only in this context and nowhere
  1015.   else.
  1016.   We use this code active for all versions that support SET KEY, even if they
  1017.   don't support Kverbs, because otherwise K would behave differently for
  1018.   different versions.
  1019. */
  1020.     for (x = 0, y = 0; s[x]; x++, y++) { /* Convert K to \K */
  1021. if ((x > 0) &&
  1022.     (s[x] == 'K' || s[x] == 'k')
  1023.     ) { /* Have K */
  1024.     if ((x == 1 && s[x-1] == CMDQ) ||
  1025. (x > 1 && s[x-1] == CMDQ && s[x-2] != CMDQ)) {
  1026. line[y++] = CMDQ; /* Make it \K */
  1027.     }
  1028.     if (x > 1 && s[x-1] == '{' && s[x-2] == CMDQ) {
  1029.    line[y-1] = CMDQ; /* Have {K */
  1030.    line[y++] = '{'; /* Make it \{K */
  1031.     }
  1032. }
  1033. line[y] = s[x];
  1034.     }
  1035.     line[y++] = NUL; /* Terminate */
  1036.     s = line + y + 1; /* Point to after it */
  1037.     x = LINBUFSIZ - (int) strlen(line) - 1; /* Calculate remaining space */
  1038.     if ((x < (LINBUFSIZ / 2)) ||
  1039. (zzstring(line, &s, &x) < 0)) { /* Expand variables, etc. */
  1040. printf("?Key definition too longn");
  1041. return(-9);
  1042.     }
  1043.     s = line + y + 1; /* Point to result. */
  1044. #ifndef NOKVERBS
  1045. /*
  1046.   Special case: see if the definition starts with a Kverb.
  1047.   If it does, point to it with p, otherwise set p to NULL.
  1048. */
  1049.     p = s;
  1050.     if (*p++ == CMDQ) {
  1051. if (*p == '{') p++;
  1052. p = (*p == 'k' || *p == 'K') ? p + 1 : NULL;
  1053.     }
  1054. #endif /* NOKVERBS */
  1055.     /* Now reprogram the default value for all terminal types */
  1056.     /* remember to treat Wyse and Televideo terminals special */
  1057.     /* because of their use of Kverbs for Backspace and Enter */
  1058.     for (t = 0; t <= TT_MAX; t++) {
  1059.         if ( ISDG200(t) && kc == 264) {
  1060.     extern char * udkfkeys[] ;
  1061.     if (kc == 264) { /* Kdgbs */
  1062. if (udkfkeys[83])
  1063.   free(udkfkeys[83]);
  1064. udkfkeys[83] = strdup(s);
  1065.     }
  1066. } else if (ISWYSE(t) || ISTVI(t)) {
  1067.     extern char * udkfkeys[] ;
  1068.     if (kc == 264) { /* Kwybs or Ktvibs */
  1069. if (udkfkeys[32])
  1070.   free(udkfkeys[32]);
  1071. udkfkeys[32] = strdup(s);
  1072.     }
  1073.     if (kc == 269) { /* Kwyenter and Kwyreturn */
  1074. if (udkfkeys[39]) /* Ktvienter and Ktvireturn */
  1075.   free(udkfkeys[39]);
  1076. udkfkeys[39] = strdup(s);
  1077. if (udkfkeys[49])
  1078.   free(udkfkeys[49]);
  1079. udkfkeys[49] = strdup(s);
  1080.     }
  1081. } else {
  1082.     switch (strlen(s)) { /* Action depends on length */
  1083.       case 0: /* Clear individual key def */
  1084. deletekeymap(t,kc);
  1085. break;
  1086.       case 1:
  1087. defevt.type = key; /* Single character */
  1088. defevt.key.scancode = *s;
  1089. break;
  1090.       default: /* Character string */
  1091. #ifndef NOKVERBS
  1092. if (p) {
  1093.     y = xlookup(kverbs,p,nkverbs,&x); /* Look it up */
  1094.     /* Exact match req'd */
  1095.     debug(F101,"set key kverb lookup",0,y);
  1096.     if (y > -1) {
  1097. defevt.type = kverb;
  1098. defevt.kverb.id = y;
  1099. break;
  1100.     }
  1101. }
  1102. #endif /* NOKVERBS */
  1103. defevt.type = macro;
  1104. defevt.macro.string = (char *) malloc(strlen(s)+1);
  1105. if (defevt.macro.string)
  1106.   strcpy(defevt.macro.string, s);
  1107. break;
  1108.     }
  1109.     insertkeymap( t, kc, defevt ) ;
  1110.     initvik = 1; /* Update VIK table */
  1111. }
  1112.     }
  1113.     return(1);
  1114. }
  1115. #endif /* OS2 */
  1116. #ifdef NT
  1117. int
  1118. setwin95( void ) {
  1119.     int x, y, z;
  1120.     if (( y = cmkey(win95tab, nwin95,
  1121.     "Windows 95 specific work-arounds",
  1122.     "keyboard-translation",
  1123.     xxstring)) < 0 )
  1124. return (y);
  1125.     switch (y) {
  1126.       case XYWPOPUP:
  1127. if ((y = cmkey(onoff,2,"popups are used to prompt the user for data",
  1128.        "on",xxstring)) < 0)
  1129.   return(y);
  1130. if ((x = cmcfm()) < 0) return(x);
  1131. win95_popup = y;
  1132. return(1);
  1133.       case XYW8_3:
  1134. if ((y = cmkey(onoff,2,"8.3 FAT file names","off",xxstring)) < 0)
  1135.   return(y);
  1136. if ((x = cmcfm()) < 0) return(x);
  1137. win95_8_3 = y;
  1138. return(1);
  1139.       case XYWSELECT:
  1140. if ((y = cmkey(onoff,2,""select()" fails on write","off",
  1141.              xxstring)) < 0)
  1142.   return(y);
  1143. if ((x = cmcfm()) < 0) return(x);
  1144. win95selectbug = y;
  1145. return(1);
  1146.       case XYWAGR:
  1147. if ((y = cmkey(onoff,2,"Right-Alt is Alt-Gr","off",xxstring)) < 0)
  1148.   return(y);
  1149. if ((x = cmcfm()) < 0) return(x);
  1150. win95altgr = y;
  1151. return(1);
  1152.       case XYWOIO:
  1153. if ((y = cmkey(onoff,2,"Use Overlapped I/O","on",xxstring)) < 0)
  1154.   return(y);
  1155. if (y) {
  1156.     if ((x = cmnum("Maximum number of outstanding I/O requests",
  1157.    "10",10,&z,xxstring)) < 0)
  1158.       return(x);
  1159.     if (z < 1 || z > 30) {
  1160. printf(
  1161. "?Maximum outstanding I/O requests must be between 1 and 30.n");
  1162. return(-9);
  1163.     }
  1164. } else
  1165.   z = 1;
  1166. if ((x = cmcfm()) < 0) return(x);
  1167. owwait = !y;
  1168. maxow = maxow_usr = z;
  1169. return(1);
  1170.       case XYWKEY:
  1171. #ifndef COMMENT
  1172.         printf("n?"Keyboard-Translation" is no longer required.n");
  1173.         return(-9);
  1174. #else /* COMMENT */
  1175. if (( z = cmkey(tcstab, ntcs,
  1176. "Keyboard Character Set",
  1177. "latin1-iso",
  1178. xxstring)) < 0)
  1179.   return (z);
  1180. if ((x = cmcfm()) < 0)
  1181.   return(x);
  1182. win95kcsi = z;
  1183. win95kl2 = (win95kcsi == TC_2LATIN);
  1184. if (win95kcsi == TC_TRANSP) {
  1185.     win95kcs = NULL;
  1186. } else {
  1187. #ifdef UNICODE
  1188.     win95kcs = xlr[win95kcsi][tx2fc(tcsl)];
  1189. #else /* UNICODE */
  1190.     win95kcs = xlr[win95kcsi][tcsl];
  1191. #endif /* UNICODE */
  1192. }
  1193. return(1);
  1194. #endif /* COMMENT */
  1195.       case XYWLUC:
  1196. if ((y = cmkey(onoff,2,"Unicode-to-Lucida-Console substitutions",
  1197.        "on",xxstring)) < 0)
  1198.   return(y);
  1199. if ((x = cmcfm()) < 0) return(x);
  1200. win95lucida = y;
  1201. return(1);
  1202.       default:
  1203. printf("Illegal value in setwin95()n");
  1204. return(-9);
  1205.     }
  1206. }
  1207. #endif /* NT */
  1208. #ifdef OS2
  1209. int
  1210. setprty (
  1211. #ifdef CK_ANSIC
  1212.     void
  1213. #endif /* CK_ANSIC */
  1214. /* setprty */ ) {
  1215.     int x, y, z;
  1216.     if (( y = cmkey(prtytab, nprty,
  1217.     "priority level of terminal and communication threads",
  1218.     "foreground-server",
  1219.     xxstring)) < 0 )
  1220.       return (y);
  1221.     if ((x = cmcfm()) < 0)
  1222.       return (x);
  1223. #ifdef IKSD
  1224.     if (inserver &&
  1225. #ifdef IKSDCONF
  1226.          iksdcf
  1227. #else
  1228.          1
  1229. #endif /* IKSDCONF */
  1230.     ) {
  1231. if ((y = cmcfm()) < 0) return(y);
  1232.         printf("?Sorry, command disabled.rn");
  1233.         return(success = 0);
  1234.     }
  1235. #endif /* IKSD */
  1236.     priority = y;
  1237.     return(TRUE);
  1238. }
  1239. #endif /* OS2 */
  1240. int
  1241. setbell() {
  1242.     int z, y, x;
  1243.     if ((y = cmkey(beltab,nbeltab,
  1244. #ifdef OS2
  1245.         "how console and terminal bells shouldnbe generated", "audible",
  1246. #else
  1247.         "Whether Kermit should ring the terminal bell (beep)", "on",
  1248. #endif /* OS2 */
  1249.    xxstring)) < 0)
  1250.   return(y);
  1251. #ifdef IKSD
  1252.     if (inserver) {
  1253. if ((y = cmcfm()) < 0) return(y);
  1254.         printf("?Sorry, command disabled.rn");
  1255.         return(success = 0);
  1256.     }
  1257. #endif /* IKSD */
  1258.     switch (y) { /* SET BELL */
  1259.       case XYB_NONE:
  1260. #ifdef OS2
  1261.       case XYB_VIS:
  1262. #endif /* OS2 */
  1263. if ((x = cmcfm()) < 0)
  1264.   return(x);
  1265. #ifdef OS2
  1266. tt_bell = y;
  1267. #else
  1268. tt_bell = 0;
  1269. #endif /* OS2 */
  1270. break;
  1271.       case XYB_AUD:
  1272. #ifdef OS2
  1273. if ((x = cmkey(audibletab, naudibletab,
  1274.        "how audible console and terminalnbells should be generated",
  1275.        "beep",xxstring))<0)
  1276.   return(x);
  1277. if ((z = cmcfm()) < 0)
  1278.   return(z);
  1279. tt_bell = y | x;
  1280. #else
  1281. /* This lets C-Kermit accept but ignore trailing K95 keywords */
  1282. if ((x = cmtxt("Confirm with carriage return","",&s,xxstring)) < 0)
  1283.   return(x);
  1284. tt_bell = 1;
  1285. #endif /* OS2 */
  1286. break;
  1287.     }
  1288.     return(1);
  1289. }
  1290. #ifdef OS2MOUSE
  1291. int
  1292. setmou(
  1293. #ifdef CK_ANSIC
  1294.        void
  1295. #endif /* CK_ANSIC */
  1296.  /* setmou */ ) {
  1297.     extern int initvik;
  1298.     int button = 0, event = 0;
  1299.     char * p;
  1300.     if ((y = cmkey(mousetab,nmtab,"","",xxstring)) < 0)
  1301.       return(y);
  1302. #ifdef IKSD
  1303.     if (inserver) {
  1304. if ((y = cmcfm()) < 0) return(y);
  1305.         printf("?Sorry, command disabled.rn");
  1306.         return(success = 0);
  1307.     }
  1308. #endif /* IKSD */
  1309.     if (y == XYM_ON) { /* MOUSE ACTIVATION */
  1310.         int old_mou = tt_mouse;
  1311.         if ((x = seton(&tt_mouse)) < 0)
  1312.             return(x);
  1313.         if (tt_mouse != old_mou)
  1314.           if (tt_mouse)
  1315.             os2_mouseon();
  1316.           else
  1317.             os2_mouseoff();
  1318.         return(1);
  1319.     }
  1320.     if (y == XYM_CLEAR) { /* Reset Mouse Defaults */
  1321. if ((x = cmcfm()) < 0) return(x);
  1322. mousemapinit(-1,-1);
  1323. initvik = 1; /* Update VIK Table */
  1324. return 1;
  1325.     }
  1326.     if (y != XYM_BUTTON) { /* Shouldn't happen. */
  1327. printf("Internal parsing errorn");
  1328. return(-9);
  1329.     }
  1330.     /* MOUSE EVENT ... */
  1331.     if ((button = cmkey(mousebuttontab,nmbtab,
  1332. "Button number, one of the following","1",
  1333. xxstring)) < 0)
  1334.       return(button);
  1335.     if ((y =  cmkey(mousemodtab,nmmtab,
  1336.     "Keyboard modifier, one of the following",
  1337.     "none",xxstring)) < 0)
  1338.       return(y);
  1339.     event |= y; /* OR in the bits */
  1340.     if ((y =  cmkey(mclicktab,nmctab,"","click",xxstring)) < 0)
  1341.       return(y);
  1342.     /* Two bits are assigned, if neither are set then it is button one */
  1343.     event |= y; /* OR in the bit */
  1344.     wideresult = -1;
  1345.     if ((y = cmtxt("definition,n
  1346. or Ctrl-C to cancel this command,n
  1347. or Enter to restore default definition",
  1348.    "",&s,NULL)) < 0) {
  1349. return(y);
  1350.     }
  1351.     s = brstrip(s);
  1352.     p = s; /* Save this place */
  1353. /*
  1354.   If the definition included any Kverbs, quote the backslash so the Kverb
  1355.   will still be in the definition when the key is pressed.  We don't do this
  1356.   in zzstring(), because Kverbs are valid only in this context and nowhere
  1357.   else.  This code copied from SET KEY, q.v. for addt'l commentary.
  1358. */
  1359.     for (x = 0, y = 0; s[x]; x++, y++) { /* Convert K to \K */
  1360. if ((x > 0) &&
  1361.     (s[x] == 'K' || s[x] == 'k')
  1362.     ) { /* Have K */
  1363.     if ((x == 1 && s[x-1] == CMDQ) ||
  1364. (x > 1 && s[x-1] == CMDQ && s[x-2] != CMDQ)) {
  1365. line[y++] = CMDQ; /* Make it \K */
  1366.     }
  1367.     if (x > 1 && s[x-1] == '{' && s[x-2] == CMDQ) {
  1368.    line[y-1] = CMDQ; /* Have {K */
  1369.    line[y++] = '{'; /* Make it \{K */
  1370.     }
  1371. }
  1372. line[y] = s[x];
  1373.     }
  1374.     line[y++] = NUL; /* Terminate */
  1375.     s = line + y + 1; /* Point to after it */
  1376.     x = LINBUFSIZ - (int) strlen(line) - 1; /* Calculate remaining space */
  1377.     if ((x < (LINBUFSIZ / 2)) ||
  1378. (zzstring(line, &s, &x) < 0)) { /* Expand variables, etc. */
  1379. printf("?Key definition too longn");
  1380. return(-9);
  1381.     }
  1382.     s = line + y + 1; /* Point to result. */
  1383. #ifndef NOKVERBS
  1384. /*
  1385.   Special case: see if the definition starts with a Kverb.
  1386.   If it does, point to it with p, otherwise set p to NULL.
  1387. */
  1388.     p = s;
  1389.     if (*p++ == CMDQ) {
  1390. if (*p == '{') p++;
  1391. p = (*p == 'k' || *p == 'K') ? p + 1 : NULL;
  1392.     }
  1393. #else
  1394.     p = NULL;
  1395. #endif /* NOKVERBS */
  1396.     /* free the old definition if necessary */
  1397.     if (mousemap[button][event].type == macro) {
  1398.         free( mousemap[button][event].macro.string);
  1399. mousemap[button][event].macro.string = NULL;
  1400.     }
  1401.     switch (strlen(s)) { /* Action depends on length */
  1402.       case 0: /* Reset to default binding */
  1403.         mousemapinit( button, event );
  1404.      break;
  1405.       case 1: /* Single character */
  1406.        mousemap[button][event].type = key;
  1407.         mousemap[button][event].key.scancode = *s;
  1408.        break;
  1409.       default: /* Character string */
  1410. #ifndef NOKVERBS
  1411. if (p) {
  1412.     y = xlookup(kverbs,p,nkverbs,&x); /* Look it up */
  1413.     debug(F101,"set mouse kverb lookup",0,y); /* need exact match */
  1414.     if (y > -1) {
  1415.             /* Assign the kverb to the event */
  1416.             mousemap[button][event].type = kverb;
  1417.             mousemap[button][event].kverb.id = F_KVERB | y;
  1418.             break;
  1419.     }
  1420. }
  1421. #endif /* NOKVERBS */
  1422.        /* Otherwise, it's a macro, so assign the macro to the event */
  1423.        mousemap[button][event].type = macro;
  1424.        mousemap[button][event].macro.string = (MACRO) malloc(strlen(s)+1);
  1425.        if (mousemap[button][event].macro.string)
  1426.          strcpy((char *) mousemap[button][event].macro.string, s);
  1427.         break;
  1428.     }
  1429.     initvik = 1; /* Update VIK Table */
  1430.     return(1);
  1431. }
  1432. #endif /* OS2MOUSE */
  1433. #endif /* NOLOCAL */
  1434. #ifndef NOXFER
  1435. int /* SET SEND/RECEIVE */
  1436. setsr(xx, rmsflg) int xx; int rmsflg; {
  1437.     if (xx == XYRECV)
  1438.       strcpy(line,"Parameter for inbound packets");
  1439.     else
  1440.       strcpy(line,"Parameter for outbound packets");
  1441.     if (rmsflg) {
  1442. if ((y = cmkey(rsrtab,nrsrtab,line,"",xxstring)) < 0) {
  1443.     if (y == -3) {
  1444. printf("?Remote receive parameter requiredn");
  1445. return(-9);
  1446.     } else return(y);
  1447. }
  1448.     } else {
  1449. if ((y = cmkey(srtab,nsrtab,line,"",xxstring)) < 0) return(y);
  1450.     }
  1451.     switch (y) {
  1452.       case XYQCTL: /* CONTROL-PREFIX */
  1453. if ((x = cmnum("ASCII value of control prefix","",10,&y,xxstring)) < 0)
  1454.   return(x);
  1455. if ((x = cmcfm()) < 0) return(x);
  1456. if ((y > 32 && y < 63) || (y > 95 && y < 127)) {
  1457.     if (xx == XYRECV)
  1458.       ctlq = (CHAR) y; /* RECEIVE prefix, use with caution! */
  1459.     else
  1460.       myctlq = (CHAR) y; /* SEND prefix, OK to change */
  1461.     return(success = 1);
  1462. } else {
  1463.     printf("?Illegal value for prefix charactern");
  1464.     return(-9);
  1465. }
  1466.       case XYEOL:
  1467. if ((y = setcc("13",&z)) < 0)
  1468.     return(y);
  1469. if (z > 31) {
  1470.     printf("Sorry, the legal values are 0-31n");
  1471.     return(-9);
  1472. }
  1473. if (xx == XYRECV)
  1474.   eol = (CHAR) z;
  1475. else
  1476.   seol = (CHAR) z;
  1477. return(success = y);
  1478.       case XYLEN:
  1479. y = cmnum("Maximum number of characters in a packet","90",10,&x,
  1480.   xxstring);
  1481. if (xx == XYRECV) { /* Receive... */
  1482.     if ((y = setnum(&z,x,y,maxrps)) < 0)
  1483.       return(y);
  1484.     if (protocol != PROTO_K) {
  1485. printf("?Sorry, this command does not apply to %s protocol.n",
  1486.        ptab[protocol].p_name
  1487.        );
  1488. printf("Use SET SEND PACKET-LENGTH for XYZMODEMn");
  1489. return(-9);
  1490.     }
  1491.     if (z < 10) {
  1492. printf("Sorry, 10 is the minimumn");
  1493. return(-9);
  1494.     }
  1495.     if (rmsflg) {
  1496. sstate = setgen('S', "401", ckitoa(z), "");
  1497. return((int) sstate);
  1498.     } else {
  1499. if (protocol == PROTO_K) {
  1500.     if (z > MAXRP) z = MAXRP;
  1501.     y = adjpkl(z,wslotr,bigrbsiz);
  1502.     if (y != z) {
  1503. urpsiz = y;
  1504. if (!cmdsrc())
  1505.   if (msgflg) printf(
  1506. " Adjusting receive packet-length to %d for %d window slotsn",
  1507.      y, wslotr);
  1508.     }
  1509.     urpsiz = y;
  1510.     ptab[protocol].rpktlen = urpsiz;
  1511.     rpsiz =  (y > 94) ? 94 : y;
  1512. } else {
  1513. #ifdef CK_XYZ
  1514.     if ((protocol == PROTO_X || protocol == PROTO_XC) &&
  1515.                          z != 128 && z != 1024) {
  1516. printf("Sorry, bad packet length for XMODEM.n");
  1517. printf("Please use 128 or 1024.n");
  1518. return(-9);
  1519.     }
  1520. #endif /* CK_XYZ */
  1521.     urpsiz = rpsiz = z;
  1522. }
  1523.     }
  1524. } else { /* Send... */
  1525.     if ((y = setnum(&z,x,y,maxsps)) < 0)
  1526.       return(y);
  1527.     if (z < 10) {
  1528. printf("Sorry, 10 is the minimumn");
  1529. return(-9);
  1530.     }
  1531.     if (protocol == PROTO_K) {
  1532. if (z > MAXSP) z = MAXSP;
  1533. spsiz = z; /* Set it */
  1534. y = adjpkl(spsiz,wslotr,bigsbsiz);
  1535. if (y != spsiz && !cmdsrc())
  1536.   if (msgflg)
  1537.     printf("Adjusting packet size to %d for %d window slotsn",
  1538.    y,wslotr);
  1539.     } else
  1540.       y = z;
  1541. #ifdef CK_XYZ
  1542.     if ((protocol == PROTO_X || protocol == PROTO_XC) &&
  1543.                  z != 128 && z != 1024) {
  1544. printf("Sorry, bad packet length for XMODEM.n");
  1545. printf("Please use 128 or 1024.n");
  1546. return(-9);
  1547.     }
  1548. #endif /* CK_XYZ */
  1549.     spsiz = spmax = spsizr = y; /* Set it and flag that it was set */
  1550.     spsizf = 1; /* to allow overriding Send-Init. */
  1551.     ptab[protocol].spktflg = spsizf;
  1552.     ptab[protocol].spktlen = spsiz;
  1553. }
  1554. if (pflag && protocol == PROTO_K && !cmdsrc()) {
  1555.     if (z > 94 && !reliable && msgflg) {
  1556. /* printf("Extended-length packets requested.n"); */
  1557. if (bctr < 2 && z > 200) printf("
  1558. Remember to SET BLOCK 2 or 3 for long packets.n");
  1559.     }
  1560.     if (speed <= 0L) speed = ttgspd();
  1561. #ifdef COMMENT
  1562. /*
  1563.   Kermit does this now itself.
  1564. */
  1565.     if (speed <= 0L && z > 200 && msgflg) {
  1566. printf("
  1567. Make sure your timeout interval is long enough for %d-byte packets.n",z);
  1568.     }
  1569. #endif /* COMMENT */
  1570. }
  1571. return(success = y);
  1572.       case XYMARK:
  1573. #ifdef DOOMSDAY
  1574. /*
  1575.   Printable start-of-packet works for UNIX and VMS only!
  1576. */
  1577. x_ifnum = 1;
  1578. y = cmnum("Code for packet-start character","1",10,&x,xxstring);
  1579. x_ifnum = 0;
  1580. if ((y = setnum(&z,x,y,126)) < 0) return(y);
  1581. #else
  1582. if ((y = setcc("1",&z)) < 0)
  1583.     return(y);
  1584. #endif /* DOOMSDAY */
  1585. if (xx == XYRECV)
  1586.   stchr = (CHAR) z;
  1587. else {
  1588.     mystch = (CHAR) z;
  1589. #ifdef IKS_OPTION
  1590.     /* If IKS negotiation in use   */
  1591.     if (TELOPT_U(TELOPT_KERMIT) || TELOPT_ME(TELOPT_KERMIT))
  1592.       tn_siks(KERMIT_SOP); /* Report change to other side */
  1593. #endif /* IKS_OPTION */
  1594.         }
  1595. return(success = y);
  1596.       case XYNPAD: /* PADDING */
  1597. y = cmnum("How many padding characters for inbound packets","0",10,&x,
  1598.   xxstring);
  1599. if ((y = setnum(&z,x,y,94)) < 0) return(y);
  1600. if (xx == XYRECV)
  1601.   mypadn = (CHAR) z;
  1602. else
  1603.   npad = (CHAR) z;
  1604. return(success = y);
  1605.       case XYPADC: /* PAD-CHARACTER */
  1606. if ((y = setcc("0",&z)) < 0) return(y);
  1607. if (xx == XYRECV) mypadc = z; else padch = z;
  1608. return(success = y);
  1609.       case XYTIMO: /* TIMEOUT */
  1610. if (xx == XYRECV) {
  1611.     y = cmnum("Packet timeout interval",ckitoa(URTIME),10,&x,xxstring);
  1612.     if ((y = setnum(&z,x,y,94)) < 0) return(y);
  1613.     if (rmsflg) { /* REMOTE SET RECEIVE TIMEOUT */
  1614. sstate = setgen('S', "402", ckitoa(z), "");
  1615. return((int) sstate);
  1616.     } else { /* SET RECEIVE TIMEOUT */
  1617. pkttim = z; /*   Value to put in my negotiation */
  1618.     } /*   packet for other Kermit to use */
  1619. } else { /* SET SEND TIMEOUT */
  1620. #ifdef CK_TIMERS
  1621.     extern int rttflg, mintime, maxtime;
  1622.     int tmin = 0, tmax = 0;
  1623. #endif /* CK_TIMERS */
  1624.     y = cmnum("Packet timeout interval","",10,&x,xxstring);
  1625.     if (y == -3) { /* They cancelled a previous */
  1626. x = DMYTIM; /* SET SEND command, so restore */
  1627. timef = 0; /* and turn off the override flag */
  1628. y = cmcfm();
  1629.     }
  1630. #ifdef CK_TIMERS
  1631.     if (y < 0) return(y);
  1632.     if (x < 0) {
  1633. printf("?Out of range - %dn",x);
  1634. return(-9);
  1635.     }
  1636.     if ((z = cmkey(timotab,2,"","dynamic",xxstring)) < 0) return(z);
  1637.     if (z) {
  1638. if ((y = cmnum("Minimum timeout to allow",
  1639.        "1",10,&tmin,xxstring)) < 0)
  1640.   return(y);
  1641. if (tmin < 1) {
  1642.     printf("?Out of range - %dn",x);
  1643.     return(-9);
  1644. }
  1645. if ((y = cmnum("Maximum timeout to allow",
  1646.        "0",10,&tmax,xxstring)) < 0)
  1647.   return(y);
  1648. /* 0 means let Kermit choose, < 0 means no maximum */
  1649.     }
  1650.     if ((y = cmcfm()) < 0)
  1651.       return(y);
  1652.     rttflg = z; /* Round-trip timer flag */
  1653.     z = x;
  1654. #else
  1655.     if ((y = setnum(&z,x,y,94)) < 0)
  1656.       return(y);
  1657. #endif /* CK_TIMERS */
  1658.     timef = 1; /* Turn on the override flag */
  1659.     timint = rtimo = z; /* Override value for me to use */
  1660. #ifdef CK_TIMERS
  1661.     if (rttflg) { /* Lower and upper bounds */
  1662. mintime = tmin;
  1663. maxtime = tmax;
  1664.     }
  1665. #endif /* CK_TIMERS */
  1666. }
  1667. return(success = 1);
  1668.       case XYFPATH: /* PATHNAMES */
  1669. if (xx == XYRECV) {
  1670.     y = cmkey(rpathtab,nrpathtab,"","auto",xxstring);
  1671. } else {
  1672.     y = cmkey(pathtab,npathtab,"","off",xxstring);
  1673. }
  1674. if (y < 0) return(y);
  1675. if ((x = cmcfm()) < 0) return(x);
  1676. if (xx == XYRECV) { /* SET RECEIVE PATHNAMES */
  1677.     fnrpath = y;
  1678.     ptab[protocol].fnrp = fnrpath;
  1679. } else { /* SET SEND PATHNAMES */
  1680.     fnspath = y;
  1681.     ptab[protocol].fnsp = fnspath;
  1682. }
  1683. return(success = 1); /* Note: 0 = ON, 1 = OFF */
  1684. /* In other words, ON = leave pathnames ON, OFF = take them off. */
  1685.       case XYPAUS: /* SET SEND/RECEIVE PAUSE */
  1686. y = cmnum("Milliseconds to pause between packets","0",10,&x,xxstring);
  1687. if ((y = setnum(&z,x,y,15000)) < 0)
  1688.   return(y);
  1689. pktpaus = z;
  1690. return(success = 1);
  1691. #ifdef CKXXCHAR /* SET SEND/RECEIVE IGNORE/DOUBLE */
  1692.       case XYIGN:
  1693.       case XYDBL: {
  1694.   int i, zz;
  1695.   short *p;
  1696.   extern short dblt[];
  1697.   extern int dblflag, ignflag;
  1698.   /* Make space for a temporary copy of the ignore/double table */
  1699.   zz = y;
  1700. #ifdef COMMENT
  1701.   if (zz == XYIGN && xx == XYSEND) {
  1702.       blah blah who cares
  1703.   }
  1704.   if (zz == XYDBL && xx == XYRECV) {
  1705.       blah blah
  1706.   }
  1707. #endif /* COMMENT */
  1708.   p = (short *)malloc(256 * sizeof(short));
  1709.   if (!p) {
  1710.       printf("?Internal error - malloc failuren");
  1711.       return(-9);
  1712.   }
  1713.   for (i = 0; i < 256; i++) p[i] = dblt[i]; /* Copy current table */
  1714.   while (1) { /* Collect a list of numbers */
  1715. #ifndef NOSPL
  1716.       x_ifnum = 1; /* Turn off complaints from eval() */
  1717. #endif /* NOSPL */
  1718.       if ((x = cmnum(zz == XYDBL ?
  1719.      "Character to double" :
  1720.      "Character to ignore",
  1721.      "",10,&y,xxstring
  1722.      )) < 0) {
  1723. #ifndef NOSPL
  1724.   x_ifnum = 0;
  1725. #endif /* NOSPL */
  1726.   if (x == -3) /* Done */
  1727.     break;
  1728.   if (x == -2) {
  1729.       if (p) { free(p); p = NULL; }
  1730.       debug(F110,"SET S/R DOUBLE/IGNORE atmbuf",atmbuf,0);
  1731.       if (!ckstrcmp(atmbuf,"none",4,0) ||
  1732.   !ckstrcmp(atmbuf,"non",3,0) ||
  1733.   !ckstrcmp(atmbuf,"no",2,0) ||
  1734.   !ckstrcmp(atmbuf,"n",1,0)) {
  1735.   if ((x = cmcfm()) < 0) /* Get confirmation */
  1736.     return(x);
  1737.   for (y = 0; y < 256; y++)
  1738.     dblt[y] &= (zz == XYDBL) ? 1 : 2;
  1739.   if (zz == XYDBL) dblflag = 0;
  1740.   if (zz == XYIGN) ignflag = 0;
  1741.   return(success = 1);
  1742.       } else {
  1743.   printf(
  1744.     "?Please specify a number or the word NONEn");
  1745.   return(-9);
  1746.       }
  1747.   } else {
  1748.       free(p);
  1749.       p = NULL;
  1750.       return(x);
  1751.   }
  1752.       }
  1753. #ifndef NOSPL
  1754.       x_ifnum = 0;
  1755. #endif /* NOSPL */
  1756.       if (y < 0 || y > 255) {
  1757.   printf("?Please enter a character code in range 0-255n");
  1758.   free(p);
  1759.   p = NULL;
  1760.   return(-9);
  1761.       }
  1762.       p[y] |= (zz == XYDBL) ? 2 : 1;
  1763.       if (zz == XYDBL) dblflag = 1;
  1764.       if (zz == XYIGN) ignflag = 1;
  1765.   } /* End of while loop */
  1766.   if ((x = cmcfm()) < 0) return(x);
  1767. /*
  1768.   Get here only if they have made no mistakes.  Copy temporary table back to
  1769.   permanent one, then free temporary table and return successfully.
  1770. */
  1771.   if (p) {
  1772.       for (i = 0; i < 256; i++) dblt[i] = p[i];
  1773.       free(p);
  1774.       p = NULL;
  1775.   }
  1776.   return(success = 1);
  1777.       }
  1778. #endif /* CKXXCHAR */
  1779. #ifdef PIPESEND
  1780.       case XYFLTR: { /* SET { SEND, RECEIVE } FILTER */
  1781.   if ((y = cmtxt((xx == XYSEND) ?
  1782. "Filter program for sending files -n
  1783.  use \v(filename) to substitute filename" :
  1784. "Filter program for receiving files -n
  1785.  use \v(filename) to substitute filename",
  1786.  "",&s,NULL)) < 0)
  1787.     return(y);
  1788.   if (!*s) { /* Removing a filter... */
  1789.       if (xx == XYSEND && sndfilter) {
  1790.   free(sndfilter);
  1791.   sndfilter = NULL;
  1792.       } else if (rcvfilter) {
  1793.   free(rcvfilter);
  1794.   rcvfilter = NULL;
  1795.       }
  1796.       return(success = 1);
  1797.   } /* Adding a filter... */
  1798.   s = brstrip(s); /* Strip any braces */
  1799.   y = strlen(s);
  1800.   if (xx == XYSEND) { /* For SEND filter... */
  1801.       for (x = 0; x < y; x++) { /* make sure they included "v(...)" */
  1802.   if (s[x] != '\') continue;
  1803.   if (s[x+1] == 'v') break;
  1804.       }
  1805.       if (x == y) {
  1806.   printf(
  1807.       "?Filter must contain a replacement variable for filename.n"
  1808.  );
  1809.   return(-9);
  1810.       }
  1811.   }
  1812.   if (xx == XYSEND) {
  1813.       makestr(&sndfilter,s);
  1814.   } else {
  1815.       makestr(&rcvfilter,s);
  1816.   }
  1817.   return(success = 1);
  1818.       }
  1819. #endif /* PIPESEND */
  1820.       case XYINIL:
  1821. y = cmnum("Max length for protocol init string","-1",10,&x,xxstring);
  1822. if ((y = setnum(&z,x,y,-1)) < 0)
  1823.   return(y);
  1824. if (xx == XYSEND)
  1825.   sprmlen = z;
  1826. else
  1827.   rprmlen = z;
  1828. return(success = 1);
  1829. #ifndef NOCSETS
  1830.       case XYCSET: { /* CHARACTER-SET-SELECTION */
  1831.   extern struct keytab xfrmtab[];
  1832.   extern int r_cset, s_cset;
  1833.   if ((y = cmkey(xfrmtab,2,"","automatic",xxstring)) < 0)
  1834.     return(y);
  1835.   if ((x = cmcfm()) < 0)
  1836.     return(x);
  1837.   if (xx == XYSEND)
  1838.     s_cset = y;
  1839.   else
  1840.     r_cset = y;
  1841.   return(success = 1);
  1842.       }
  1843. #endif /* NOCSETS */
  1844.       case XYBUP:
  1845. if ((y = cmkey(onoff,2,"","on",xxstring)) < 0)
  1846.   return(y);
  1847. if ((x = cmcfm()) < 0) return(x);
  1848. if (xx == XYSEND) {
  1849.     extern int skipbup;
  1850.     skipbup = (y == 0) ? 1 : 0;
  1851.     return(success = 1);
  1852. } else {
  1853.     printf(
  1854. "?Please use SET FILE COLLISION to choose the desired actionn");
  1855.     return(-9);
  1856. }
  1857.       case XYMOVE:
  1858. y = cmdir("Directory to move file(s) to after successful transfer",
  1859.   "",&s,xxstring);
  1860. if (y < 0 && y != -3)
  1861.   return(y);
  1862. strcpy(line,s);
  1863. s = brstrip(line);
  1864. if ((x = cmcfm()) < 0)
  1865.   return(x);
  1866. if (xx == XYSEND) {
  1867.     if (*s) {
  1868. makestr(&snd_move,s);
  1869. makestr(&g_snd_move,s);
  1870.     } else {
  1871. makestr(&snd_move,NULL);
  1872. makestr(&g_snd_move,NULL);
  1873.     }
  1874. } else {
  1875.     if (*s) {
  1876. makestr(&rcv_move,s);
  1877. makestr(&g_rcv_move,s);
  1878.     } else {
  1879. makestr(&rcv_move,NULL);
  1880. makestr(&g_rcv_move,NULL);
  1881.     }
  1882. }
  1883. return(success = 1);
  1884.       case XYRENAME:
  1885. y = cmdir("Template to rename file(s) to after successful transfer",
  1886.   "",&s,NULL);
  1887. if (y < 0 && y != -3)
  1888.   return(y);
  1889. strcpy(line,s);
  1890. s = brstrip(line);
  1891. if ((x = cmcfm()) < 0)
  1892.   return(x);
  1893. if (xx == XYSEND) {
  1894.     if (*s) {
  1895. makestr(&snd_rename,s);
  1896. makestr(&g_snd_rename,s);
  1897.     } else {
  1898. makestr(&snd_rename,NULL);
  1899. makestr(&g_snd_rename,NULL);
  1900.     }
  1901. } else {
  1902.     if (*s) {
  1903. makestr(&rcv_rename,s);
  1904. makestr(&g_rcv_rename,s);
  1905.     } else {
  1906. makestr(&rcv_rename,NULL);
  1907. makestr(&g_rcv_rename,NULL);
  1908.     }
  1909. }
  1910. return(success = 1);
  1911. #ifdef VMS
  1912.       case 887: /* VERSION-NUMBERS */
  1913. if (xx == XYSEND) {
  1914.     extern int vmssversions;
  1915.     return(seton(&vmssversions));
  1916. } else {
  1917.     extern int vmsrversions;
  1918.     return(seton(&vmsrversions));
  1919. }
  1920. #endif /* VMS */
  1921.       default:
  1922. return(-2);
  1923.     } /* End of SET SEND/RECEIVE... */
  1924. }
  1925. #endif /* NOXFER */
  1926. #ifndef NOXMIT
  1927. int
  1928. setxmit() {
  1929.     if ((y = cmkey(xmitab,nxmit,"","",xxstring)) < 0) return(y);
  1930.     switch (y) {
  1931.       case XMITE: /* EOF */
  1932. y = cmtxt("Characters to send at end of file,n
  1933.  Use backslash codes for control characters","",&s,xxstring);
  1934. if (y < 0) return(y);
  1935. if ((int)strlen(s) > XMBUFL) {
  1936.     printf("?Too many characters, %d maximumn",XMBUFL);
  1937.     return(-2);
  1938. }
  1939. strcpy(xmitbuf,s);
  1940. return(success = 1);
  1941.       case XMITF: /* Fill */
  1942. y = cmnum("Numeric code for blank-line fill character","0",10,&x,
  1943.   xxstring);
  1944. if ((y = setnum(&z,x,y,127)) < 0) return(y);
  1945. xmitf = z;
  1946. return(success = 1);
  1947.       case XMITL: /* Linefeed */
  1948.         return(seton(&xmitl));
  1949.       case XMITS: /* Locking-Shift */
  1950.         return(seton(&xmits));
  1951.       case XMITP: /* Prompt */
  1952. y = cmnum("Numeric code for host's prompt character, 0 for none",
  1953.   "10",10,&x,xxstring);
  1954. if ((y = setnum(&z,x,y,127)) < 0) return(y);
  1955. xmitp = z;
  1956. return(success = 1);
  1957.       case XMITX: /* Echo */
  1958.         return(seton(&xmitx));
  1959.       case XMITW: /* Pause */
  1960. y = cmnum("Number of milliseconds to pause between binary charactersn
  1961. or text lines during transmission","0",10,&x,xxstring);
  1962. if ((y = setnum(&z,x,y,1000)) < 0) return(y);
  1963. xmitw = z;
  1964. return(success = 1);
  1965.       case XMITT: /* Timeout */
  1966. y = cmnum("Seconds to wait for each character to echo",
  1967.   "1",10,&x,xxstring);
  1968. if ((y = setnum(&z,x,y,1000)) < 0) return(y);
  1969. xmitt = z;
  1970. return(success = 1);
  1971.       default:
  1972. return(-2);
  1973.     }
  1974. }
  1975. #endif /* NOXMIT */
  1976. /*  D O R M T  --  Do a remote command  */
  1977. VOID
  1978. rmsg() {
  1979.     if (pflag)
  1980.       printf(
  1981. #ifdef CK_NEED_SIG
  1982.        " Type your escape character, %s, followed by X or E to cancel.n",
  1983.        dbchr(escape)
  1984. #else
  1985.        " Press the X or E key to cancel.n"
  1986. #endif /* CK_NEED_SIG */
  1987.       );
  1988. }
  1989. #ifndef NOXFER
  1990. static int xzcmd = 0; /* Global copy of REMOTE cmd index */
  1991. /*  R E M C F M  --  Confirm a REMOTE command  */
  1992. /*
  1993.   Like cmcfm(), but allows for a redirection indicator on the end,
  1994.   like "> filename" or "| command".  Returns what cmcfm() would have
  1995.   returned: -1 if reparse needed, etc etc blah blah.  On success,
  1996.   returns 1 with:
  1997.     char * remdest containing the name of the file or command.
  1998.     int remfile set to 1 if there is to be any redirection.
  1999.     int rempipe set to 1 if remdest is a command, 0 if it is a file.
  2000. */
  2001. static int
  2002. remcfm() {
  2003.     int x;
  2004.     char *s;
  2005.     char c;
  2006.     remfile = 0;
  2007.     rempipe = 0;
  2008.     if ((x = cmtxt(
  2009.      "> filename, | command,n
  2010. or type carriage return to confirm the command",
  2011.    "",&s,xxstring)) < 0)
  2012.       return(x);
  2013.     if (remdest) {
  2014. free(remdest);
  2015. remdest = NULL;
  2016.     }
  2017.     debug(F101,"remcfm local","",local);
  2018.     debug(F110,"remcfm s",s,0);
  2019.     debug(F101,"remcfm cmd","",xzcmd);
  2020.     if (!*s) { /* No redirection indicator */
  2021. if (!local &&
  2022.     (xzcmd == XZDIR || xzcmd == XZTYP ||
  2023.      xzcmd == XZXIT || xzcmd == XZSPA ||
  2024.      xzcmd == XZHLP || xzcmd == XZPWD ||
  2025.      xzcmd == XZLGI || xzcmd == XZLGO ||
  2026.      xzcmd == XZWHO || xzcmd == XZHOS)) {
  2027.     printf("?"%s" has no effect in remote moden",cmdbuf);
  2028.     return(-9);
  2029. } else
  2030.   return(1);
  2031.     }
  2032.     c = *s; /* We have something */
  2033.     if (c != '>' && c != '|') { /* Is it > or | ? */
  2034. printf("?Not confirmedn"); /* No */
  2035. return(-9);
  2036.     }
  2037.     s++; /* See what follows */
  2038.     if (c == '>' && *s == '>') { /* Allow for ">>" too */
  2039. s++;
  2040. remappd = 1; /* Append to output file */
  2041.     }
  2042.     while (*s == SP || *s == HT) s++; /* Strip intervening whitespace */
  2043.     if (!*s) {
  2044. printf("?%s missingn", c == '>' ? "Filename" : "Command");
  2045. return(-9);
  2046.     }
  2047.     if (c == '>' && zchko(s) < 0) { /* Check accessibility */
  2048. printf("?Access denied - %sn", s);
  2049. return(-9);
  2050.     }
  2051.     remfile = 1; /* Set global results */
  2052.     rempipe = (c == '|');
  2053.     if (rempipe
  2054. #ifndef NOPUSH
  2055. && nopush
  2056. #endif /* NOPUSH */
  2057. ) {
  2058. printf("?Sorry, access to external commands is disabled.n");
  2059. return(-9);
  2060.     }
  2061.     makestr(&remdest,s);
  2062. #ifndef NODEBUG
  2063.     if (deblog) {
  2064. debug(F101,"remcfm remfile","",remfile);
  2065. debug(F101,"remcfm remappd","",remappd);
  2066. debug(F101,"remcfm rempipe","",rempipe);
  2067. debug(F110,"remcfm remdest",remdest, 0);
  2068.     }
  2069. #endif /* NODEBUG */
  2070.     return(1);
  2071. }
  2072. /*  R E M T X T  --  Like remcfm()...  */
  2073. /*
  2074.    ... but for REMOTE commands that end with cmtxt().
  2075.    Here we must decipher braces to discover whether the trailing
  2076.    redirection indicator is intended for local use, or to be sent out
  2077.    to the server, as in:
  2078.      remote host blah blah > file                 This end
  2079.      remote host { blah blah } > file             This end
  2080.      remote host { blah blah > file }             That end
  2081.      remote host { blah blah > file } > file      Both ends
  2082.    Pipes too:
  2083.      remote host blah blah | cmd                  This end
  2084.      remote host { blah blah } | cmd              This end
  2085.      remote host { blah blah | cmd }              That end
  2086.      remote host { blah blah | cmd } | cmd        Both ends
  2087.    Or both:
  2088.      remote host blah blah | cmd > file           This end, etc etc...
  2089.    Note: this really only makes sense for REMOTE HOST, but why be picky?
  2090.    Call after calling cmtxt(), with pointer to string that cmtxt() parsed,
  2091.    as in "remtxt(&s);".
  2092.    Returns:
  2093.     1 on success with braces & redirection things removed & pointer updated,
  2094.    -9 on failure (bad indirection), after printing error message.
  2095. */
  2096. static int
  2097. remtxt(p) char ** p; {
  2098.     int i, x, bpos, ppos;
  2099.     char c, *s, *q;
  2100.     remfile = 0; /* Initialize global results */
  2101.     rempipe = 0;
  2102.     remappd = 0;
  2103.     if (remdest) {
  2104. free(remdest);
  2105. remdest = NULL;
  2106.     }
  2107.     s = *p;
  2108.     if (!s) /* No redirection indicator */
  2109.       s = "";
  2110.     if (!*s) { /* Ditto */
  2111. if (!local &&
  2112.     (xzcmd == XZDIR || xzcmd == XZTYP ||
  2113.      xzcmd == XZXIT || xzcmd == XZSPA ||
  2114.      xzcmd == XZHLP || xzcmd == XZPWD ||
  2115.      xzcmd == XZLGI || xzcmd == XZLGO ||
  2116.      xzcmd == XZWHO || xzcmd == XZHOS)) {
  2117.     printf("?"%s" has no effect in remote moden",cmdbuf);
  2118.     if (hints) {
  2119. printf("Hint: try again with an output redirector.n");
  2120.     }
  2121.     return(-9);
  2122. } else
  2123.   return(1);
  2124.     }
  2125.     bpos = -1; /* Position of > (bracket) */
  2126.     ppos = -1; /* Position of | (pipe) */
  2127.     x = strlen(s); /* Length of cmtxt() string */
  2128.     for (i = x-1; i >= 0; i--) { /* Search right to left. */
  2129. c = s[i];
  2130. if (c == '}') /* Break on first right brace */
  2131.   break; /* Don't look at contents of braces */
  2132. else if (c == '>') /* Record position of > */
  2133.   bpos = i;
  2134. else if (c == '|') /* and of | */
  2135.   ppos = i;
  2136.     }
  2137.     if (bpos < 0 && ppos < 0) { /* No redirectors. */
  2138. if (!local &&
  2139.     (xzcmd == XZDIR || xzcmd == XZTYP ||
  2140.      xzcmd == XZXIT || xzcmd == XZSPA ||
  2141.      xzcmd == XZHLP || xzcmd == XZPWD ||
  2142.      xzcmd == XZLGI || xzcmd == XZLGO ||
  2143.      xzcmd == XZWHO || xzcmd == XZHOS)) {
  2144.     printf("?"%s" has no effect in remote moden",cmdbuf);
  2145.     if (hints) {
  2146. printf("Hint: try again with an output redirector.n");
  2147.     }
  2148.     return(-9);
  2149. }
  2150. s = brstrip(s); /* Remove outer braces if any. */
  2151. *p = s; /* Point to result */
  2152. return(1); /* and return. */
  2153.     }
  2154.     remfile = 1; /* It's | or > */
  2155.     i = -1; /* Get leftmost symbol */
  2156.     if (bpos > -1) /* Bracket */
  2157.       i = bpos;
  2158.     if (ppos > -1 && (ppos < bpos || bpos < 0)) { /* or pipe */
  2159. i = ppos;
  2160. rempipe = 1;
  2161.     }
  2162.     c = s[i]; /* Copy of symbol */
  2163.     if (c == '>' && s[i+1] == '>') /* ">>" for append? */
  2164.       remappd = 1;        /* It's not just a flag it's a number */
  2165.     q = s + i + 1 + remappd; /* Point past symbol in string */
  2166.     while (*q == SP || *q == HT) q++; /* and any intervening whitespace */
  2167.     if (!*q) {
  2168. printf("?%s missingn", c == '>' ? "Filename" : "Command");
  2169. return(-9);
  2170.     }
  2171.     if (c == '>' && zchko(q) < 0) { /* (Doesn't work for | cmd > file) */
  2172. printf("?Access denied - %sn", q);
  2173. return(-9);
  2174.     }
  2175.     makestr(&remdest,q); /* Create the destination string */
  2176.     q = s + i - 1; /* Point before symbol */
  2177.     while (q > s && (*q == SP || *q == HT)) /* Strip trailing whitespace */
  2178.       q--;
  2179.     *(q+1) = NUL; /* Terminate the string. */
  2180.     s = brstrip(s); /* Remove any braces */
  2181.     *p = s; /* Set return value */
  2182. #ifndef NODEBUG
  2183.     if (deblog) {
  2184. debug(F101,"remtxt remfile","",remfile);
  2185. debug(F101,"remtxt remappd","",remappd);
  2186. debug(F101,"remtxt rempipe","",rempipe);
  2187. debug(F110,"remtxt remdest",remdest, 0);
  2188. debug(F110,"remtxt command",s,0);
  2189.     }
  2190. #endif /* NODEBUG */
  2191.     return(1);
  2192. }
  2193. int
  2194. plogin(xx) int xx; {
  2195.     char *p1 = NULL, *p2 = NULL, *p3 = NULL;
  2196.     int psaved = 0, rc = 0;
  2197. #ifdef CK_RECALL
  2198.     int sv_recall = -1; /* For turning off command recall */
  2199.     extern int on_recall; /* around Password prompting */
  2200. #endif /* CK_RECALL */
  2201.     debug(F101,"plogin local","",local);
  2202.     if (!local || (network && ttchk() < 0)) {
  2203. printf("?No connectionn");
  2204. return(-9);
  2205.     }
  2206.     if ((x = cmfld("User ID","",&s,xxstring)) < 0) { /* Get User ID */
  2207. if (x != -3) return(x);
  2208.     }
  2209.     y = strlen(s);
  2210.     if (y > 0) {
  2211. if ((p1 = malloc(y + 1)) == NULL) {
  2212.     printf("?Internal error: mallocn");
  2213.     rc = -9;
  2214.     goto XZXLGI;
  2215. } else
  2216.   strcpy(p1,s);
  2217. if ((rc = cmfld("Password","",&s,xxstring)) < 0)
  2218.   if (rc != -3) goto XZXLGI;
  2219. y = strlen(s);
  2220. if (y > 0) {
  2221.     if ((p2 = malloc(y + 1)) == NULL) {
  2222. printf("?Internal error: mallocn");
  2223. rc = -9;
  2224. goto XZXLGI;
  2225.     } else
  2226.       strcpy(p2,s);
  2227.     if ((rc = cmfld("Account","",&s,xxstring)) < 0)
  2228.       if (rc != -3) goto XZXLGI;
  2229.     y = strlen(s);
  2230.     if (y > 0) {
  2231. if ((p3 = malloc(y + 1)) == NULL) {
  2232.     printf("?Internal error: mallocn");
  2233.     rc = -9;
  2234.     goto XZXLGI;
  2235. } else
  2236.   strcpy(p3,s);
  2237.     }
  2238. }
  2239.     }
  2240.     if ((rc = remtxt(&s)) < 0) /* Confirm & handle redirectors */
  2241.       goto XZXLGI;
  2242.     if (!p1) { /* No Userid specified... */
  2243. /* Prompt for username, password, and account */
  2244. #ifdef CK_RECALL
  2245. sv_recall = on_recall;
  2246. on_recall = 0;
  2247. #endif /* CK_RECALL */
  2248. cmsavp(psave,PROMPTL); /* Save old prompt */
  2249. psaved = 1;
  2250. debug(F110,"REMOTE LOGIN saved",psave,0);
  2251. cmsetp("Username: "); /* Make new prompt */
  2252. concb((char)escape); /* Put console in cbreak mode */
  2253. cmini(1);
  2254. prompt(xxstring);
  2255. rc = -9;
  2256. for (x = -1; x < 0; ) { /* Prompt till they answer */
  2257.     cmres(); /* Reset the parser */
  2258.     x = cmtxt("","",&s,NULL); /* Get a literal line of text */
  2259. }
  2260. y = strlen(s);
  2261. if (y < 1) {
  2262.     printf("?Canceledn");
  2263.     goto XZXLGI;
  2264. }
  2265. if ((p1 = malloc(y + 1)) == NULL) {
  2266.     printf("?Internal error: mallocn");
  2267.     goto XZXLGI;
  2268. } else
  2269.   strcpy(p1,s);
  2270. cmsetp("Password: "); /* Make new prompt */
  2271. concb((char)escape); /* Put console in cbreak mode */
  2272. cmini(0); /* No echo */
  2273. prompt(xxstring);
  2274. for (x = -1; x < 0 && x != -3; ) { /* Get answer */
  2275.     cmres(); /* Reset the parser */
  2276.     x = cmtxt("","",&s,NULL); /* Get literal line of text */
  2277. }
  2278. if ((p2 = malloc((int)strlen(s) + 1)) == NULL) {
  2279.     printf("?Internal error: mallocn");
  2280.     goto XZXLGI;
  2281. } else
  2282.   strcpy(p2,s);
  2283. printf("rn");
  2284. if ((rc = cmcfm()) < 0)
  2285.   goto XZXLGI;
  2286.     }
  2287.     sstate = setgen('I',p1,p2,p3); /* Get here with at least user ID */
  2288.     rc = 0;
  2289.   XZXLGI: /* Common exit point */
  2290.     if (psaved)
  2291.       cmsetp(psave); /* Restore original prompt */
  2292. #ifdef CK_RECALL
  2293.     if (sv_recall > -1) /* Put back command recall */
  2294.       on_recall = sv_recall;
  2295. #endif /* CK_RECALL */
  2296.     if (p3) { free(p3); p3 = NULL; } /* Free malloc'd storage */
  2297.     if (p2) { free(p2); p2 = NULL; }
  2298.     if (p1) { free(p1); p1 = NULL; }
  2299.     if (rc > -1) {
  2300. if (local && rc > -1) /* If local, flush tty input buffer */
  2301.   ttflui();
  2302.     }
  2303.     return(rc);
  2304. }
  2305. #ifdef OS2
  2306. int
  2307. dormt(xx) int xx; {
  2308.     int rc = 0;
  2309.     extern int term_io;
  2310.     int term_io_sav = term_io;
  2311.     term_io = 0;
  2312.     rc = xxdormt(xx);
  2313.     term_io = term_io_sav;
  2314.     return rc;
  2315. }
  2316. int
  2317. xxdormt(xx) int xx;
  2318. #else /* OS2 */
  2319. int
  2320. dormt(xx) int xx;
  2321. #endif /* OS2 */
  2322. { /* REMOTE commands */
  2323.     int x, y, retcode;
  2324.     char *s, sbuf[50], *s2;
  2325.     remfile = 0; /* Clear these */
  2326.     rempipe = 0;
  2327.     remappd = 0;
  2328.     if (xx < 0) return(xx); /* REMOTE what? */
  2329.     xzcmd = xx; /* Make global copy of arg */
  2330.     if (xx == XZSET) { /* REMOTE SET */
  2331. if ((y = cmkey(rmstab,nrms,"","",xxstring)) < 0) {
  2332.     if (y == -3) {
  2333. printf("?Parameter name requiredn");
  2334. return(-9);
  2335.     } else return(y);
  2336. }
  2337. return(doprm(y,1));
  2338.     }
  2339.     switch (xx) { /* Others... */
  2340.       case XZCWD: /* CWD (CD) */
  2341. if ((x = cmtxt("Remote directory name","",&s,xxstring)) < 0)
  2342.   return(x);
  2343. if ((x = remtxt(&s)) < 0)
  2344.   return(x);
  2345. debug(F111,"XZCWD: ",s,x);
  2346. *sbuf = NUL;
  2347. s2 = sbuf;
  2348. /*
  2349.   The following is commented out because since the disappearance of the
  2350.   DECSYSTEM-20 from the planet, no known computer requires a password for
  2351.   changing directory.
  2352. */
  2353. #ifdef DIRPWDPR
  2354. if (*s != NUL) { /* If directory name given, */
  2355. /* get password on separate line. */
  2356.     if (tlevel > -1) { /* From take file... */
  2357. if (fgets(sbuf,50,tfile[tlevel]) == NULL)
  2358.   fatal("take file ends prematurely in 'remote cwd'");
  2359. debug(F110," pswd from take file",s2,0);
  2360. for (x = (int)strlen(sbuf);
  2361.      x > 0 && (sbuf[x-1] == NL || sbuf[x-1] == CR);
  2362.      x--)
  2363.   sbuf[x-1] = '';
  2364.     } else { /* From terminal... */
  2365. printf(" Password: "); /* get a password */
  2366. #ifdef IKSD
  2367.                 if (!local && inserver) {
  2368.                     x = coninc(0);
  2369.                 } else
  2370. #endif /* IKSD */
  2371. #ifdef OS2
  2372.   x = is_a_tty(0) ? coninc(0) : /* with no echo ... */
  2373.                     getchar();
  2374. #else /* OS2 */
  2375.                 x = getchar();
  2376. #endif /* OS2 */
  2377. while ((x != NL) && (x != CR)) {
  2378.     if ((x &= 0177) == '?') {
  2379. printf("? Password of remote directoryn Password: ");
  2380. s2 = sbuf;
  2381. *sbuf = NUL;
  2382.     } else if (x == ESC) /* Mini command line editor... */
  2383.       bleep(BP_WARN);
  2384.     else if (x == BS || x == 0177)
  2385.       s2--;
  2386.     else if (x == 025) { /* Ctrl-U */
  2387. s2 = sbuf;
  2388. *sbuf = NUL;
  2389.     } else
  2390.       *s2++ = x;
  2391.                     /* Get the next character */
  2392. #ifdef IKSD
  2393.                     if (!local && inserver) {
  2394.                         x = coninc(0);
  2395.                     } else
  2396. #endif /* IKSD */
  2397. #ifdef OS2
  2398.                     x = is_a_tty(0) ? coninc(0) : /* with no echo ... */
  2399.       getchar();
  2400. #else /* OS2 */
  2401.                     x = getchar();
  2402. #endif /* OS2 */
  2403. }
  2404. *s2 = NUL;
  2405. putchar('n');
  2406.     }
  2407.     s2 = sbuf;
  2408. } else s2 = "";
  2409. #endif /* DIRPWDPR */
  2410. debug(F110," password",s2,0);
  2411. sstate = setgen('C',s,s2,"");
  2412. retcode = 0;
  2413. break;
  2414.       case XZDEL: /* Delete */
  2415. if ((x = cmtxt("Name of remote file(s) to delete",
  2416.        "",&s,xxstring)) < 0) {
  2417.     if (x == -3) {
  2418. printf("?Name of remote file(s) requiredn");
  2419. return(-9);
  2420.     } else return(x);
  2421. }
  2422. if ((x = remtxt(&s)) < 0)
  2423.   return(x);
  2424. if (local) ttflui(); /* If local, flush tty input buffer */
  2425. retcode = sstate = rfilop(s,'E');
  2426. break;
  2427.       case XZDIR: /* Directory */
  2428. if ((x = cmtxt("Remote directory or file specification","",&s,
  2429.        xxstring)) < 0)
  2430.   return(x);
  2431. if ((x = remtxt(&s)) < 0)
  2432.   return(x);
  2433. if (local) ttflui(); /* If local, flush tty input buffer */
  2434. rmsg();
  2435. retcode = sstate = setgen('D',s,"","");
  2436. break;
  2437.       case XZHLP: /* Help */
  2438. if ((x = remcfm()) < 0) return(x);
  2439. sstate = setgen('H',"","","");
  2440. retcode = 0;
  2441. break;
  2442.       case XZHOS: /* Host */
  2443. if ((x = cmtxt("Command for remote system","",&s,xxstring)) < 0)
  2444.   return(x);
  2445. if ((x = remtxt(&s)) < 0)
  2446.   return(x);
  2447. if ((y = (int)strlen(s)) < 1)
  2448.   return(x);
  2449. strcpy(line,s);
  2450. cmarg = line;
  2451. rmsg();
  2452. retcode = sstate = 'c';
  2453. break;
  2454. #ifndef NOFRILLS
  2455.       case XZKER:
  2456. if ((x = cmtxt("Command for remote Kermit","",&s,xxstring)) < 0)
  2457.   return(x);
  2458. if ((x = remtxt(&s)) < 0)
  2459.   return(x);
  2460. if ((int)strlen(s) < 1)  {
  2461.     if (x == -3) {
  2462. printf("?Remote Kermit command requiredn");
  2463. return(-9);
  2464.     } else return(x);
  2465. }
  2466. strcpy(line,s);
  2467. cmarg = line;
  2468. retcode = sstate = 'k';
  2469. rmsg();
  2470. break;
  2471.       case XZLGI: /* Login */
  2472. return(plogin(XXREM));
  2473.       case XZLGO: { /* Logout */
  2474.   extern int bye_active;
  2475.   if ((x = remcfm()) < 0) return(x);
  2476.   sstate = setgen('I',"","","");
  2477.   retcode = 0;
  2478.   bye_active = 1; /* Close connection when done */
  2479.   break;
  2480.       }
  2481.       case XZPRI: /* Print */
  2482. if (!atdiso || !atcapr) { /* Disposition attribute off? */
  2483.     printf("?Disposition Attribute is Offn");
  2484.     return(-2);
  2485. }
  2486. cmarg = "";
  2487. cmarg2 = "";
  2488. if ((x = cmifi("Local file(s) to print on remote printer","",&s,&y,
  2489.        xxstring)) < 0) {
  2490.     if (x == -3) {
  2491. printf("?Name of local file(s) requiredn");
  2492. return(-9);
  2493.     }
  2494.     return(x);
  2495. }
  2496. strcpy(line,s); /* Make a safe copy of filename */
  2497. *optbuf = NUL; /* Wipe out any old options */
  2498. if ((x = cmtxt("Options for remote print command","",&s,xxstring)) < 0)
  2499.   return(x);
  2500. if ((x = remtxt(&s)) < 0)
  2501.   return(x);
  2502. strcpy(optbuf,s); /* Make a safe copy of options */
  2503. if ((int)strlen(optbuf) > 94) { /* Make sure this is legal */
  2504.     printf("?Option string too longn");
  2505.     return(-9);
  2506. }
  2507. nfils = -1; /* Expand file list internally */
  2508. cmarg = line; /* Point to file list. */
  2509. rprintf = 1; /* REMOTE PRINT modifier for SEND */
  2510. sstate = 's'; /* Set start state to SEND */
  2511. if (local) displa = 1;
  2512. retcode = 0;
  2513. break;
  2514. #endif /* NOFRILLS */
  2515.       case XZSPA: /* Space */
  2516. if ((x = cmtxt("Confirm, or remote directory name",
  2517.        "",&s,xxstring)) < 0)
  2518.   return(x);
  2519. if ((x = remtxt(&s)) < 0)
  2520.   return(x);
  2521. retcode = sstate = setgen('U',s,"","");
  2522. break;
  2523. #ifndef NOFRILLS
  2524.       case XZTYP: /* Type */
  2525. if ((x = cmtxt("Remote file specification","",&s,xxstring)) < 0)
  2526.   return(x);
  2527. if ((int)strlen(s) < 1) {
  2528.     printf("?Remote filename requiredn");
  2529.     return(-9);
  2530. }
  2531. if ((x = remtxt(&s)) < 0)
  2532.   return(x);
  2533. rmsg();
  2534. retcode = sstate = rfilop(s,'T');
  2535. break;
  2536. #endif /* NOFRILLS */
  2537. #ifndef NOFRILLS
  2538.       case XZWHO:
  2539. if ((x = cmtxt("Remote user name, or carriage return",
  2540.        "",&s,xxstring)) < 0)
  2541.   return(x);
  2542. if ((x = remtxt(&s)) < 0)
  2543.   return(x);
  2544. retcode = sstate = setgen('W',s,"","");
  2545. break;
  2546. #endif /* NOFRILLS */
  2547.       case XZPWD: /* PWD */
  2548. if ((x = remcfm()) < 0) return(x);
  2549. sstate = setgen('A',"","","");
  2550. retcode = 0;
  2551. break;
  2552. #ifndef NOSPL
  2553.       case XZQUE: { /* Query */
  2554.   char buf[2];
  2555.   extern char querybuf[], * qbufp;
  2556.   extern int qbufn;
  2557.   if ((y = cmkey(vartyp,nvartyp,"","",xxstring)) < 0)
  2558.     return(y);
  2559.   if ((x = cmtxt(y == 'F' ? "Remote function invocation" :
  2560.  ('K' ? "Remote variable name or function":
  2561.  "Remote variable name"),
  2562.  "",
  2563.  &s,
  2564.  (y == 'K') ? xxstring : NULL
  2565.  )) < 0) /* Don't evaluate */
  2566.     return(x);
  2567.   if ((x = remtxt(&s)) < 0)
  2568.     return(x);
  2569.   query = 1; /* QUERY is active */
  2570.   qbufp = querybuf; /* Initialize query response buffer */
  2571.   qbufn = 0;
  2572.   querybuf[0] = NUL;
  2573.   buf[0] = (char) (y & 127);
  2574.   buf[1] = NUL;
  2575.   retcode = sstate = setgen('V',"Q",(char *)buf,s);
  2576.   break;
  2577.       }
  2578.       case XZASG: { /* Assign */
  2579.   char buf[VNAML];
  2580.   if ((y = cmfld("Remote variable name","",&s,NULL)) < 0) /* No eval */
  2581.     return(y);
  2582.   strcpy(buf,s);
  2583.   if ((x = cmtxt("Assignment for remote variable",
  2584.    "",&s,xxstring)) < 0) /* Evaluate this one */
  2585.     return(x);
  2586.   if ((x = remtxt(&s)) < 0)
  2587.     return(x);
  2588. #ifdef COMMENT
  2589. /*
  2590.   Server commands can't be long packets.  In principle there's no reason
  2591.   why they shouldn't be, except that we don't know at this point if the
  2592.   server is capable of accepting long packets because we haven't started
  2593.   the protocol yet.  In practice, allowing a long packet here breaks a lot
  2594.   of assumptions, causes buffer overruns and crashes, etc.  To be fixed
  2595.   later.  (But since this is commented out, evidently I fixed it later...)
  2596. */
  2597.   if ((int)strlen(s) > 85) { /* Allow for encoding expansion */
  2598.       printf("?Sorry, value is too long - 85 characters maxn");
  2599.       return(-9);
  2600.   }
  2601. #endif /* COMMENT */
  2602.   retcode = sstate = setgen('V',"S",(char *)buf,s);
  2603.   break;
  2604.       }
  2605. #endif /* NOSPL */
  2606. #ifndef MAXPATHLEN
  2607. #define MAXPATHLEN 256
  2608. #endif /* MAXPATHLEN */
  2609.       case XZCPY: { /* Copy */
  2610.   char buf[MAXPATHLEN+1];
  2611.   buf[MAXPATHLEN] = '';
  2612.   if ((x = cmfld("Name of remote file to copy","",&s,xxstring)) < 0) {
  2613.       if (x == -3) {
  2614.   printf("?Name of remote file requiredn");
  2615.   return(-9);
  2616.       }
  2617.       else
  2618. return(x);
  2619.   }
  2620.   ckstrncpy(buf,s,MAXPATHLEN);
  2621.   if ((x = cmfld("Name of remote destination file or directory",
  2622.  "",&s, xxstring)) < 0) {
  2623.       if (x == -3) {
  2624.   printf("?Name of remote file or directory requiredn");
  2625.   return(-9);
  2626.       } else return(x);
  2627.   }
  2628.   strcpy(tmpbuf,s);
  2629.   if ((x = remcfm()) < 0)
  2630.     return(x);
  2631.   if (local) ttflui(); /* If local, flush tty input buffer */
  2632.   retcode = sstate = setgen('K',buf,tmpbuf,"");
  2633.   break;
  2634.       }
  2635.       case XZREN: { /* Rename */
  2636.   char buf[MAXPATHLEN+1];
  2637.   buf[MAXPATHLEN] = '';
  2638.   if ((x = cmfld("Name of remote file to rename",
  2639.  "",&s,xxstring)) < 0) {
  2640.       if (x == -3) {
  2641.   printf("?Name of remote file requiredn");
  2642.   return(-9);
  2643.       } else return(x);
  2644.   }
  2645.   ckstrncpy(buf,s,MAXPATHLEN);
  2646.   if ((x = cmfld("New name of remote file","",&s, xxstring)) < 0) {
  2647.       if (x == -3) {
  2648.   printf("?Name of remote file requiredn");
  2649.   return(-9);
  2650.       } else return(x);
  2651.   }
  2652.   strcpy(tmpbuf,s);
  2653.   if ((x = remcfm()) < 0)
  2654.     return(x);
  2655.   if (local) ttflui(); /* If local, flush device buffer */
  2656.   retcode = sstate = setgen('R',buf,tmpbuf,"");
  2657.   break;
  2658.       }
  2659.       case XZMKD: /* mkdir */
  2660.       case XZRMD: /* rmdir */
  2661. if ((x = cmtxt((xx == XZMKD) ?
  2662.        "Name of remote directory to create" :
  2663.        "Name of remote directory to delete",
  2664.        "",
  2665.        &s,
  2666.        xxstring
  2667.        )) < 0) {
  2668.     if (x == -3) {
  2669. printf("?Name requiredn");
  2670. return(-9);
  2671.     } else return(x);
  2672. }
  2673. if ((x = remtxt(&s)) < 0)
  2674.   return(x);
  2675. if (local) ttflui(); /* If local, flush tty input buffer */
  2676. retcode = sstate = rfilop(s, (char)(xx == XZMKD ? 'm' : 'd'));
  2677. break;
  2678.       case XZXIT: /* Exit */
  2679. if ((x = remcfm()) < 0) return(x);
  2680. sstate = setgen('X',"","","");
  2681. retcode = 0;
  2682. break;
  2683.       default:
  2684.         if ((x = remcfm()) < 0) return(x);
  2685.         printf("?Not implemented - %sn",cmdbuf);
  2686.         return(-2);
  2687.     }
  2688.     if (local && retcode > -1) /* If local, flush tty input buffer */
  2689.       ttflui();
  2690.     return(retcode);
  2691. }
  2692. /*  R F I L O P  --  Remote File Operation  */
  2693. CHAR
  2694. #ifdef CK_ANSIC
  2695. rfilop(char * s, char t)
  2696. #else
  2697. rfilop(s,t) char *s, t;
  2698. #endif /* CK_ANSIC */
  2699. /* rfilop */ {
  2700.     if (*s == NUL) {
  2701. printf("?File specification requiredn");
  2702. return((CHAR) 0);
  2703.     }
  2704.     debug(F111,"rfilop",s,t);
  2705.     return(setgen(t,s,"",""));
  2706. }
  2707. #endif /* NOXFER */
  2708. #ifdef ANYX25
  2709. int
  2710. setx25() {
  2711.     if ((y = cmkey(x25tab,nx25,"X.25 call options","",xxstring)) < 0)
  2712.       return(y);
  2713.     switch (y) {
  2714.       case XYUDAT:
  2715. if ((z = cmkey(onoff,2,"X.25 call user data","",xxstring))
  2716.     < 0) return(z);
  2717. if (z == 0) {
  2718.     if ((z = cmcfm()) < 0) return(z);
  2719.     cudata = 0;             /* disable call user data */
  2720.     return (success = 1);
  2721. }
  2722. if ((x = cmtxt("X.25 call user data string","",&s,xxstring)) < 0)
  2723.   return(x);
  2724. if ((int)strlen(s) == 0) {
  2725.     return (-3);
  2726. } else if ((int)strlen(s) > MAXCUDATA) {
  2727.     printf("?The length must be > 0 and <= %dn",MAXCUDATA);
  2728.     return(-2);
  2729. }
  2730. if ((y = cmcfm()) < 0) return(y);
  2731. strcpy(udata,s);
  2732. cudata = 1; /* X.25 call user data specified */
  2733. return (success = 1);
  2734.       case XYCLOS:
  2735. if ((z = cmkey(onoff,2,"X.25 closed user group call","",xxstring))
  2736.     < 0) return(z);
  2737. if (z == 0) {
  2738.     if ((z = cmcfm()) < 0) return(z);
  2739.     closgr = -1; /* disable closed user group */
  2740.     return (success = 1);
  2741. }
  2742. if ((y = cmnum("0 <= cug index >= 99","",10,&x,xxstring)) < 0)
  2743.   return(y);
  2744. if (x < 0 || x > 99) {
  2745.     printf("?The choices are 0 <= cug index >= 99n");
  2746.     return(-2);
  2747. }
  2748. if ((y = cmcfm()) < 0) return(y);
  2749. closgr = x; /* closed user group selected */
  2750. return (success = 1);
  2751.       case XYREVC:
  2752. if((z = cmkey(onoff,2,"X.25 reverse charge call","",xxstring)) < 0)
  2753.   return(z);
  2754. if ((x = cmcfm()) < 0) return(x);
  2755. revcall = z;
  2756. return (success = 1);
  2757.     }
  2758. }
  2759. #ifndef IBMX25
  2760. int
  2761. setpadp() {
  2762.     if ((y = cmkey(padx3tab,npadx3,"PAD X.3 parameter name","",xxstring)) < 0)
  2763.       return(y);
  2764.     x = y;
  2765.     switch (x) {
  2766.       case PAD_BREAK_CHARACTER:
  2767. if ((y = cmnum("PAD break character value","",10,&z,xxstring)) < 0)
  2768.   return(y);
  2769. if ((y = cmcfm()) < 0) return(y);
  2770. break;
  2771.       case PAD_ESCAPE:
  2772. if ((y = cmnum("PAD escape","",10,&z,xxstring)) < 0) return(y);
  2773. if (z != 0 && z != 1) {
  2774.     printf("?The choices are 0 or 1n");
  2775.     return(-2);
  2776. }
  2777. if ((y = cmcfm()) < 0) return(y);
  2778. break;
  2779.       case PAD_ECHO:
  2780.   if ((y = cmnum("PAD echo","",10,&z,xxstring)) < 0) return(y);
  2781. if (z != 0 && z != 1) {
  2782.     printf("?The choices are 0 or 1n");
  2783.     return(-2);
  2784. }
  2785. if ((y = cmcfm()) < 0) return(y);
  2786. break;
  2787.       case PAD_DATA_FORWARD_CHAR:
  2788.   if ((y = cmnum("PAD data forward char","",10,&z,xxstring)) < 0)
  2789.   return(y);
  2790. if (z != 0 && z != 2) {
  2791.     printf("?The choices are 0 or 2n");
  2792.     return(-2);
  2793. }
  2794. if ((y = cmcfm()) < 0) return(y);
  2795. break;
  2796.       case PAD_DATA_FORWARD_TIMEOUT:
  2797.   if ((y = cmnum("PAD data forward timeout","",10,&z,xxstring)) < 0)
  2798.     return(y);
  2799. if (z < 0 || z > 255) {
  2800.     printf("?The choices are 0 or 1 <= timeout <= 255n");
  2801.     return(-2);
  2802. }
  2803. if ((y = cmcfm()) < 0) return(y);
  2804. break;
  2805.       case PAD_FLOW_CONTROL_BY_PAD:
  2806.   if ((y = cmnum("PAD pad flow control","",10,&z,xxstring)) < 0)
  2807.   return(y);
  2808. if (z != 0 && z != 1) {
  2809.     printf("?The choices are 0 or 1n");
  2810.     return(-2);
  2811. }
  2812. if ((y = cmcfm()) < 0) return(y);
  2813. break;
  2814.       case PAD_SUPPRESSION_OF_SIGNALS:
  2815.   if ((y = cmnum("PAD service","",10,&z,xxstring)) < 0) return(y);
  2816. if (z != 0 && z != 1) {
  2817.     printf("?The choices are 0 or 1n");
  2818.     return(-2);
  2819. }
  2820. if ((y = cmcfm()) < 0) return(y);
  2821. break;
  2822.       case PAD_BREAK_ACTION:
  2823.   if ((y = cmnum("PAD break action","",10,&z,xxstring)) < 0) return(y);
  2824. if (z != 0 && z != 1 && z != 2 && z != 5 && z != 8 && z != 21) {
  2825.     printf("?The choices are 0, 1, 2, 5, 8 or 21n");
  2826.     return(-2);
  2827. }
  2828. if ((y = cmcfm()) < 0) return(y);
  2829. break;
  2830.       case PAD_SUPPRESSION_OF_DATA:
  2831.   if ((y = cmnum("PAD data delivery","",10,&z,xxstring)) < 0) return(y);
  2832. if (z != 0 && z != 1) {
  2833.     printf("?The choices are 0 or 1n");
  2834.     return(-2);
  2835. }
  2836. if ((y = cmcfm()) < 0) return(y);
  2837. break;
  2838.       case PAD_PADDING_AFTER_CR:
  2839.   if ((y = cmnum("PAD crpad","",10,&z,xxstring)) < 0) return(y);
  2840. if (z < 0 || z > 7) {
  2841.     printf("?The choices are 0 or 1 <= crpad <= 7n");
  2842.     return(-2);
  2843. }
  2844. if ((y = cmcfm()) < 0) return(y);
  2845. break;
  2846.       case PAD_LINE_FOLDING:
  2847.   if ((y = cmnum("PAD linefold","",10,&z,xxstring)) < 0) return(y);
  2848. if (z < 0 || z > 255) {
  2849.     printf("?The choices are 0 or 1 <= linefold <= 255n");
  2850.     return(-2);
  2851. }
  2852. if ((y = cmcfm()) < 0) return(y);
  2853. break;
  2854.       case PAD_LINE_SPEED:
  2855.   if ((y = cmnum("PAD baudrate","",10,&z,xxstring)) < 0) return(y);
  2856. if (z < 0 || z > 18) {
  2857.     printf("?The choices are 0 <= baudrate <= 18n");
  2858.     return(-2);
  2859. }
  2860. if ((y = cmcfm()) < 0) return(y);
  2861. break;
  2862.       case PAD_FLOW_CONTROL_BY_USER:
  2863.   if ((y = cmnum("PAD terminal flow control","",10,&z,xxstring)) < 0)
  2864.     return(y);
  2865. if (z != 0 && z != 1) {
  2866.     printf("?The choices are 0 or 1n");
  2867.     return(-2);
  2868. }
  2869. if ((y = cmcfm()) < 0) return(y);
  2870. break;
  2871.       case PAD_LF_AFTER_CR:
  2872.   if ((y = cmnum("PAD crpad","",10,&z,xxstring)) < 0) return(y);
  2873. if (z < 0 || z == 3 || z > 7) {
  2874.     printf("?The choices are 0, 1, 2, 4, 5, 6 or 7n");
  2875.     return(-2);
  2876. }
  2877. if ((y = cmcfm()) < 0) return(y);
  2878. break;
  2879.       case PAD_PADDING_AFTER_LF:
  2880.   if ((y = cmnum("PAD lfpad","",10,&z,xxstring)) < 0) return(y);
  2881. if (z < 0 || z > 7) {
  2882.     printf("?The choices are 0 or 1 <= lfpad <= 7n");
  2883.     return(-2);
  2884. }
  2885. if ((y = cmcfm()) < 0) return(y);
  2886. break;
  2887.       case PAD_EDITING:
  2888.   if ((y = cmnum("PAD edit control","",10,&z,xxstring)) < 0) return(y);
  2889. if (z != 0 && z != 1) {
  2890.     printf("?The choices are 0 or 1n");
  2891.     return(-2);
  2892. }
  2893. if ((y = cmcfm()) < 0) return(y);
  2894. break;
  2895.       case PAD_CHAR_DELETE_CHAR:
  2896.   if ((y = cmnum("PAD char delete char","",10,&z,xxstring)) < 0)
  2897.     return(y);
  2898. if (z < 0 || z > 127) {
  2899.     printf("?The choices are 0 or 1 <= chardelete <= 127n");
  2900.     return(-2);
  2901. }
  2902. if ((y = cmcfm()) < 0) return(y);
  2903. break;
  2904.       case PAD_BUFFER_DELETE_CHAR:
  2905.   if ((y = cmnum("PAD buffer delete char","",10,&z,xxstring)) < 0)
  2906.     return(y);
  2907. if (z < 0 || z > 127) {
  2908.     printf("?The choices are 0 or 1 <= bufferdelte <= 127n");
  2909.     return(-2);
  2910. }
  2911. if ((y = cmcfm()) < 0) return(y);
  2912. break;
  2913.       case PAD_BUFFER_DISPLAY_CHAR:
  2914.   if ((y = cmnum("PAD display line char","",10,&z,xxstring)) < 0)
  2915.     return(y);
  2916. if (z < 0 || z > 127) {
  2917.     printf("?The choices are 0 or 1 <= displayline <= 127n");
  2918.     return(-2);
  2919. }
  2920. if ((y = cmcfm()) < 0) return(y);
  2921. break;
  2922.     }
  2923.     padparms[x] = z;
  2924.     return(success = 1);
  2925. }
  2926. #endif /* IBMX25 */
  2927. #endif /* ANYX25 */
  2928. #ifndef NOXFER
  2929. int
  2930. setat(rmsflg) int rmsflg; {
  2931.     int xx;
  2932.     if ((y = cmkey(attrtab,natr,"File Attribute packets","",xxstring)) < 0)
  2933.       return(y);
  2934.     if (y == AT_XALL) { /* ATTRIBUTES ALL ON or ALL OFF */
  2935. if ((z = seton(&xx)) < 0) return(z);
  2936. if (rmsflg) {
  2937.     printf("Sorry, command not availablen");
  2938.     return(-9);
  2939. } else {
  2940.     atenci = xx; /* Encoding in */
  2941.     atenco = xx; /* Encoding out */
  2942.     atdati = xx; /* Date in */
  2943.     atdato = xx; /* Date out */
  2944.     atdisi = xx; /* Disposition in/out */
  2945.     atdiso = xx;
  2946.     atleni = xx; /* Length in/out (both kinds) */
  2947.     atleno = xx;
  2948.     atblki = xx; /* Blocksize in/out */
  2949.     atblko = xx;
  2950.     attypi = xx; /* File type in/out */
  2951.     attypo = xx;
  2952.     atsidi = xx; /* System ID in/out */
  2953.     atsido = xx;
  2954.     atsysi = xx; /* System-dependent params in/out */
  2955.     atsyso = xx;
  2956. #ifdef CK_PERMS /* Protection */
  2957.     atlpri = xx; /* Local in */
  2958.     atlpro = xx; /* Local out */
  2959.     atgpri = xx; /* Generic in */
  2960.     atgpro = xx; /* Generic out */
  2961. #endif /* CK_PERMS */
  2962. #ifdef STRATUS
  2963.     atfrmi = xx; /* Format in/out */
  2964.     atfrmo = xx;
  2965.     atcrei = xx; /* Creator id in/out */
  2966.     atcreo = xx;
  2967.     atacti = xx; /* Account in/out */
  2968.     atacto = xx;
  2969. #endif /* STRATUS */
  2970. }
  2971. return(z);
  2972.     } else if (y == AT_ALLY || y == AT_ALLN) { /* ATTRIBUTES ON or OFF */
  2973. if ((x = cmcfm()) < 0) return(x);
  2974. atcapr = (y == AT_ALLY) ? 1 : 0;
  2975. if (rmsflg) {
  2976.     sstate = setgen('S', "132", atcapr ? "1" : "0", "");
  2977.     return((int) sstate);
  2978. } else return(success = 1);
  2979.     }
  2980.     /* Otherwise, it's an individual attribute that wants turning off/on */
  2981.     if ((z = cmkey(onoff,2,"","",xxstring)) < 0) return(z);
  2982.     if ((x = cmcfm()) < 0) return(x);
  2983. /* There are better ways to do this... */
  2984. /* The real problem is that we're not separating the in and out cases */
  2985. /* and so we have to arbitrarily pick the "in" case, i.e tell the remote */
  2986. /* server to ignore incoming attributes of the specified type, rather */
  2987. /* than telling it not to send them.  The protocol does not (yet) define */
  2988. /* codes for "in-and-out-at-the-same-time". */
  2989.     switch (y) {
  2990. #ifdef CK_PERMS
  2991. /* We're lumping local and generic protection together for now... */
  2992.       case AT_LPRO:
  2993.       case AT_GPRO:
  2994. if (rmsflg) {
  2995.     sstate = setgen('S', "143", z ? "1" : "0", "");
  2996.     return((int) sstate);
  2997. }
  2998. atlpri = atlpro = atgpri = atgpro = z; break;
  2999. #endif /* CK_PERMS */
  3000.       case AT_DISP:
  3001. if (rmsflg) {
  3002.     sstate = setgen('S', "142", z ? "1" : "0", "");
  3003.     return((int) sstate);
  3004. }
  3005. atdisi = atdiso = z; break;
  3006.       case AT_ENCO:
  3007. if (rmsflg) {
  3008.     sstate = setgen('S', "141", z ? "1" : "0", "");
  3009.     return((int) sstate);
  3010. }
  3011. atenci = atenco = z; break;
  3012.       case AT_DATE:
  3013. if (rmsflg) {
  3014.     sstate = setgen('S', "135", z ? "1" : "0", "");
  3015.     return((int) sstate);
  3016. }
  3017. atdati = atdato = z; break;
  3018.       case AT_LENB:
  3019.       case AT_LENK:
  3020. if (rmsflg) {
  3021.     sstate = setgen('S', "133", z ? "1" : "0", "");
  3022.     return((int) sstate);
  3023. }
  3024. atleni = atleno = z; break;
  3025.       case AT_BLKS:
  3026. if (rmsflg) {
  3027.     sstate = setgen('S', "139", z ? "1" : "0", "");
  3028.     return((int) sstate);
  3029. }
  3030. atblki = atblko = z; break;
  3031.       case AT_FTYP:
  3032. if (rmsflg) {
  3033.     sstate = setgen('S', "134", z ? "1" : "0", "");
  3034.     return((int) sstate);
  3035. }
  3036. attypi = attypo = z; break;
  3037. #ifdef STRATUS
  3038.       case AT_CREA:
  3039. if (rmsflg) {
  3040.     sstate = setgen('S', "136", z ? "1" : "0", "");
  3041.     return((int) sstate);
  3042. }
  3043. atcrei = atcreo = z; break;
  3044.       case AT_ACCT:
  3045. if (rmsflg) {
  3046.     sstate = setgen('S', "137", z ? "1" : "0", "");
  3047.     return((int) sstate);
  3048. }
  3049. atacti = atacto = z; break;
  3050. #endif /* STRATUS */
  3051.       case AT_SYSI:
  3052. if (rmsflg) {
  3053.     sstate = setgen('S', "145", z ? "1" : "0", "");
  3054.     return((int) sstate);
  3055. }
  3056. atsidi = atsido = z; break;
  3057. #ifdef STRATUS
  3058.       case AT_RECF:
  3059. if (rmsflg) {
  3060.     sstate = setgen('S', "146", z ? "1" : "0", "");
  3061.     return((int) sstate);
  3062. }
  3063.         atfrmi = atfrmo = z; break;
  3064. #endif /* STRATUS */
  3065.       case AT_SYSP:
  3066. if (rmsflg) {
  3067.     sstate = setgen('S', "147", z ? "1" : "0", "");
  3068.     return((int) sstate);
  3069. }
  3070. atsysi = atsyso = z; break;
  3071.       default:
  3072. printf("?Not availablen");
  3073. return(-2);
  3074.     }
  3075.     return(1);
  3076. }
  3077. #endif /* NOXFER */
  3078. #ifndef NOSPL
  3079. int
  3080. setinp() {
  3081.     if ((y = cmkey(inptab,ninp,"","",xxstring)) < 0) return(y);
  3082.     switch (y) {
  3083. #ifdef OS2
  3084.       case IN_PAC: /* SET INPUT PACING */
  3085. z = cmnum("milliseconds","0",10,&x,xxstring);
  3086. return(setnum(&tt_inpacing,x,z,1000));
  3087.       case IN_TRM: /* SET INPUT TERMINAL */
  3088. return(seton(&interm));
  3089. #endif /* OS2 */
  3090.       case IN_DEF: /* SET INPUT DEFAULT-TIMEOUT */
  3091. z = cmnum("Positive number","",10,&x,xxstring);
  3092. return(setnum(&indef,x,z,94));
  3093.       case IN_TIM: /* SET INPUT TIMEOUT-ACTION */
  3094. if ((z = cmkey(intimt,2,"","",xxstring)) < 0) return(z);
  3095. if ((x = cmcfm()) < 0) return(x);
  3096. intime[cmdlvl] = z;
  3097. return(success = 1);
  3098.       case IN_CAS: /* SET INPUT CASE */
  3099. if ((z = cmkey(incast,2,"","",xxstring)) < 0) return(z);
  3100. if ((x = cmcfm()) < 0) return(x);
  3101. inpcas[cmdlvl] = z;
  3102. return(success = 1);
  3103.       case IN_ECH: /* SET INPUT ECHO */
  3104. return(seton(&inecho));
  3105.       case IN_SIL: /* SET INPUT SILENCE */
  3106. z = cmnum("Seconds of inactivity before INPUT fails","",10,&x,
  3107.   xxstring);
  3108. return(setnum(&insilence,x,z,-1));
  3109.       case IN_BUF: /* SET INPUT BUFFER-SIZE */
  3110. if ((z = cmnum("Number of bytes in INPUT buffer",
  3111.        ckitoa(INPBUFSIZ),10,&x, xxstring)) < 0)
  3112.   return(z);
  3113. if ((y = cmcfm()) < 0) return(y);
  3114. inbufsize = 0;
  3115. if (inpbuf) {
  3116.     free(inpbuf);
  3117.     inpbuf = NULL;
  3118.     inpbp = NULL;
  3119. }
  3120. if (!(s = (char *)malloc(x + 1)))
  3121.   return(0);
  3122. inpbuf = s;
  3123. inpbp = s;
  3124. inbufsize = x;
  3125. for (x = 0; x <= inbufsize; x++)
  3126.   inpbuf[x] = NUL;
  3127. return(success = 1);
  3128. #ifdef CK_AUTODL
  3129.       case IN_ADL: /* AUTODOWNLOAD */
  3130. return(seton(&inautodl));
  3131. #endif /* CK_AUTODL */
  3132.       case IN_CAN: /* SET INPUT INTERRUPTS */
  3133. return(seton(&inintr));
  3134.     }
  3135.     return(0);
  3136. }
  3137. #endif /* NOSPL */
  3138. #ifdef NETCONN
  3139. VOID
  3140. ndreset() {
  3141. #ifndef NODIAL /* This depends on DIAL... */
  3142.     int i=0, j=0;
  3143.     if (!ndinited) /* Don't free garbage... */
  3144.       return;
  3145.     for (i = 0; i < nhcount; i++) { /* Clean out previous list */
  3146. if (nh_p[i])
  3147.   free(nh_p[i]);
  3148. nh_p[i] = NULL;
  3149. if (nh_p2[i])
  3150.   free(nh_p2[i]);
  3151. nh_p2[i] = NULL;
  3152. for (j = 0; j < 4; j++) {
  3153.     if (nh_px[j][i])
  3154.       free(nh_px[j][i]);
  3155.     nh_px[j][i] = NULL;
  3156. }
  3157.     }
  3158. #endif /* NODIAL */
  3159. }
  3160. VOID
  3161. ndinit() { /* Net directory pointers */
  3162. #ifndef NODIAL /* This depends on DIAL... */
  3163.     int i, j;
  3164.     if (ndinited++) /* Don't do this more than once. */
  3165.       return;
  3166.     for (i = 0; i < MAXDDIR; i++) { /* Init all pointers to NULL */
  3167. netdir[i] = NULL;
  3168.     }
  3169.     for (i = 0; i < MAXDNUMS; i++) {
  3170. nh_p[i] = NULL;
  3171. nh_p2[i] = NULL;
  3172. for (j = 0; j < 4; j++)
  3173.   nh_px[j][i] = NULL;
  3174.     }
  3175. #endif /* NODIAL */
  3176. }
  3177. #ifndef NODIAL
  3178. #ifdef NETCONN
  3179. VOID /* Get net defaults from environment */
  3180. getnetenv() {
  3181.     char *p = NULL;
  3182.     makestr(&p,getenv("K_NET_DIRECTORY")); /* Dialing directories */
  3183.     if (p) {
  3184. int i;
  3185. xwords(p,MAXDDIR,netdir,0);
  3186. for (i = 0; i < MAXDDIR; i++) { /* Fill in any gaps... */
  3187.     if (!netdir[i+1])
  3188.       break;
  3189.     else
  3190.       netdir[i] = netdir[i+1];
  3191.             debug(F111,"netdir[i]",netdir[i],i);
  3192. }
  3193. nnetdir = i;
  3194.     }
  3195. }
  3196. #endif /* NETCONN */
  3197. #endif /* NODIAL */
  3198. int
  3199. #ifdef CK_ANSIC
  3200. lunet(char *s) /* s = name to look up   */
  3201. #else
  3202. lunet(s) char *s;
  3203. #endif /* CK_ANSIC */
  3204. /* lunet */ {
  3205. #ifndef NODIAL /* This depends on DIAL... */
  3206.     int n, n1, t, dd = 0;
  3207.     int ambiguous = 0;
  3208.     FILE * f;
  3209.     char *line = NULL;
  3210.     extern int dialdpy;
  3211.     int netdpy = dialdpy;
  3212.     char *info[8];
  3213.     nhcount = 0; /* Set this before returning */
  3214.     if (!s || nnetdir < 1) /* Validate arguments */
  3215.       return(-1);
  3216.     if (isdigit(*s) || *s == '*' || *s == '.')
  3217.       return(0);
  3218.     if ((n1 = (int) strlen(s)) < 1) /* Length of string to look up */
  3219.       return(-1);
  3220.     if (!(line = malloc(1024))) /* Allocate input buffer */
  3221.       return(-1);
  3222.   lu_again:
  3223.     f = NULL; /* Network directory file descriptor */
  3224.     t = nhcount = 0; /* Match count */
  3225.     dd = 0; /* Directory counter */
  3226.     dirline = 0;
  3227.     while (1) { /* We make one pass */
  3228. if (!f) { /* Directory not open */
  3229.             if (dd >= nnetdir) /* No directories left? */
  3230.       break; /* Done. */
  3231.     if ((f = fopen(netdir[dd],"r")) == NULL) { /* Open it */
  3232. perror(netdir[dd]); /* Can't, print message saying why */
  3233. dd++;
  3234. continue; /* But go on to next one. */
  3235.     }
  3236.     if (netdpy)
  3237.       printf("Opening %s...n",netdir[dd]);
  3238.             dd++;
  3239. }
  3240. line[0] = NUL;
  3241. if (getnct(line,1023,f,1) < 0) { /* Read a line */
  3242.     if (f) { /* f can be clobbered! */
  3243. fclose(f); /* Close the file */
  3244. f = NULL; /* Indicate next one needs opening */
  3245.     }
  3246.     continue;
  3247. }
  3248. if (!line[0]) /* Empty line */
  3249.   continue;
  3250. xwords(line,7,info,0); /* Parse it */
  3251. if (!info[1] || !info[2] || !info[3]) /* Required fields */
  3252.   continue;
  3253. if (*info[1] == ';') /* Full-line comment */
  3254.   continue;
  3255. if ((n = (int) strlen(info[1])) < 1) /* Length of name-tag */
  3256.   continue;
  3257. if (n < n1) /* Search name is longer */
  3258.   continue; /* Can't possibly match */
  3259. if (ambiguous && n != n1)
  3260.   continue;
  3261. if (ckstrcmp(s,info[1],n1,0)) /* Compare using length of */
  3262.   continue; /* search string s. */
  3263. /* Have a match */
  3264. makestr(&(nh_p[nhcount]), info[3]);    /* address */
  3265. makestr(&(nh_p2[nhcount]),info[2]);    /* net type */
  3266. makestr(&(nh_px[0][nhcount]),info[4]); /* net-specific stuff... */
  3267. makestr(&(nh_px[1][nhcount]),info[5]);
  3268. makestr(&(nh_px[2][nhcount]),info[6]);
  3269. makestr(&(nh_px[3][nhcount]),info[7]);
  3270. nhcount++; /* Count this match */
  3271. if (nhcount > MAXDNUMS) { /* Watch out for too many */
  3272.     printf("Warning: %d matches found, %d maxn",
  3273.    nhcount,
  3274.    MAXDNUMS
  3275.    );
  3276.     nhcount = MAXDNUMS;
  3277.     break;
  3278. }
  3279. if (nhcount == 1) { /* First one - save entry name */
  3280.     if (n_name) { /* Free the one from before if any */
  3281. free(n_name);
  3282. n_name = NULL;
  3283.     }
  3284.     if (!(n_name = (char *)malloc(n + 1))) { /* Allocate new storage */
  3285. printf("?memory allocation error - lunet:3n");
  3286. if (line) {
  3287.     free(line);
  3288.     line = NULL;
  3289. }
  3290. nhcount = 0;
  3291. return(-1);
  3292.     }
  3293.     t = n; /* Remember its length */
  3294.     strcpy(n_name,info[1]);
  3295. } else { /* Second or subsequent one */
  3296.     if ((int) strlen(info[1]) == t) /* Lengths compare */
  3297.       if (!ckstrcmp(n_name,info[1],t,0)) /* Caseless compare OK */
  3298. continue;
  3299.     /* Name given by user matches entries with different names */
  3300.     if (ambiguous) /* Been here before */
  3301.       break;
  3302.     ambiguous = 1; /* Now an exact match is required */
  3303.     ndreset(); /* Clear out previous list */
  3304.     goto lu_again; /* Do it all over again. */
  3305. }
  3306.     }
  3307.     if (line) {
  3308. free(line);
  3309. line = NULL;
  3310.     }
  3311.     if (nhcount == 0 && ambiguous)
  3312.       printf("Ambiguous - "%s" different names in network directoryn",s);
  3313. #else
  3314.     nhcount = 0;
  3315. #endif /* NODIAL */
  3316.     return(nhcount);
  3317. }
  3318. #endif /* NETCONN */
  3319. #ifndef NOLOCAL
  3320. /*  C L S C O N N X  --  Close connection  */
  3321. int
  3322. clsconnx(ask) int ask; {
  3323.     int x, rc = 0;
  3324.     debug(F101,"clsconnx local","",local);
  3325.     if (local) {
  3326. x = ask ? hupok(1) : 1; /* Make sure it's OK to close */
  3327. if (!x) {
  3328.     rc = -1;
  3329.     debug(F101,"clsconnx hupok says no","",rc);
  3330.     return(rc);
  3331. }
  3332. ttflui(); /* Clear away buffered up junk */
  3333. #ifndef NODIAL
  3334. #ifdef OS2ONLY
  3335. /* Don't hangup a line that is shared with the SLIP or PPP driver */
  3336. if (!ttslip && !ttppp)
  3337. #endif /* OS2ONLY */
  3338.   mdmhup();
  3339. #endif /* NODIAL */
  3340. if (network && msgflg)
  3341.   printf(" Closing connectionn");
  3342. ttclos(0); /* Close old connection, if any */
  3343. rc = 1;
  3344. {
  3345.     extern int wasclosed, whyclosed;
  3346.     if (wasclosed) {
  3347. whyclosed = WC_CLOS;
  3348. #ifndef NOSPL
  3349.                 if (nmac) { /* Any macros defined? */
  3350.     int k; /* Yes */
  3351.     /* printf("ON_CLOSE CLSCONNXn"); */
  3352.     wasclosed = 0;
  3353.     k = mlook(mactab,"on_close",nmac); /* Look this up */
  3354.     if (k >= 0) { /* If found, */
  3355. if (dodo(k,ckitoa(whyclosed),0) > -1) /* set it up, */
  3356.   parser(1); /* and execute it */
  3357.     }
  3358. }
  3359. #endif /* NOSPL */
  3360. whyclosed = WC_REMO;
  3361. wasclosed = 0;
  3362.     }
  3363. }
  3364.     }
  3365. #ifdef VMS /* Or maybe #ifndef UNIX? */
  3366.     else { /* Need to do this in VMS to */
  3367. ttclos(0); /* free the tty channel number */
  3368. rc = 1; /* obtained in ttopen() or else */
  3369.     } /* subsequent ttopen's won't work */
  3370. #endif /* VMS */
  3371. #ifdef CKLOGDIAL
  3372.     dologend();
  3373. #endif /* CKLOGDIAL */
  3374.     haveline = 0;
  3375.     if (mdmtyp < 0) { /* Switching from net to async? */
  3376. if (mdmsav > -1) /* Restore modem type from last */
  3377.   mdmtyp = mdmsav; /* SET MODEM command, if any. */
  3378. else
  3379.   mdmtyp = 0;
  3380. mdmsav = -1;
  3381.     }
  3382.     if (network)
  3383.       network = 0;
  3384. #ifdef NETCONN
  3385.     if (oldplex > -1) { /* Restore previous duplex setting. */
  3386. duplex = oldplex;
  3387. oldplex = -1;
  3388.     }
  3389. #endif /* NETCONN */
  3390. #ifndef MAC
  3391.     strcpy(ttname,dftty); /* Restore default communication */
  3392. #endif /* MAC */
  3393.     local = dfloc; /* device and local/remote status */
  3394.     if (local) {
  3395. cxtype = CXT_DIRECT; /* Something reasonable */
  3396. speed = ttgspd(); /* Get the current speed */
  3397.     } else {
  3398. cxtype = CXT_REMOTE;
  3399. speed = -1L;
  3400.     }
  3401. #ifndef NOXFER
  3402.     if (xreliable > -1 && !setreliable) {
  3403. reliable = xreliable;
  3404. debug(F101,"clsconnx reliable A","",reliable);
  3405.     } else if (!setreliable) {
  3406. reliable = SET_AUTO;
  3407. debug(F101,"clsconnx reliable B","",reliable);
  3408.     }
  3409. #endif /* NOXFER */
  3410.     setflow(); /* Revert flow control */
  3411.     return(rc);
  3412. }
  3413. VOID
  3414. slrestor() {
  3415.     int x;
  3416. #ifdef CK_AUTHENTICATION
  3417.     if (sl_auth_saved) {
  3418.         for (x = 0; x < AUTHTYPLSTSZ; x++)
  3419.   auth_type_user[x] = sl_auth_type_user[x];
  3420.         sl_auth_saved = 0;
  3421.     }
  3422.     if (sl_topt_a_s_saved) {
  3423.         TELOPT_DEF_S_U_MODE(TELOPT_AUTHENTICATION) = sl_topt_a_su;
  3424.         sl_topt_a_s_saved = 0;
  3425.     }
  3426.     if (sl_topt_a_c_saved) {
  3427.         TELOPT_DEF_C_ME_MODE(TELOPT_AUTHENTICATION) = sl_topt_a_cm;
  3428.         sl_topt_a_c_saved = 0;
  3429.     }
  3430. #endif /* CK_AUTHENTICATION */
  3431. #ifdef CK_ENCRYPTION
  3432.     if (sl_cx_saved) {
  3433.         cx_type = sl_cx_type;
  3434.         sl_cx_saved = 0;
  3435.     }
  3436.     if (sl_topt_e_s_saved) {
  3437.         TELOPT_DEF_S_U_MODE(TELOPT_ENCRYPTION)  = sl_topt_e_su;
  3438.         TELOPT_DEF_S_ME_MODE(TELOPT_ENCRYPTION) = sl_topt_e_sm;
  3439.         sl_topt_e_s_saved = 0;
  3440.     }
  3441.     if (sl_topt_e_c_saved) {
  3442.         TELOPT_DEF_C_U_MODE(TELOPT_ENCRYPTION)  = sl_topt_e_cu;
  3443.         TELOPT_DEF_C_ME_MODE(TELOPT_ENCRYPTION) = sl_topt_e_cm;
  3444.         sl_topt_e_c_saved = 0;
  3445.     }
  3446. #endif /* CK_ENCRYPTION */
  3447.     if (sl_uid_saved) {
  3448.         ckstrncpy(uidbuf,sl_uidbuf,UIDBUFLEN);
  3449.         sl_uid_saved = 0;
  3450.     }
  3451. #ifdef TNCODE
  3452.     if (sl_tn_saved) {
  3453.         tn_wait_flg = sl_tn_wait;
  3454.         sl_tn_saved = 0;
  3455.     }
  3456. #endif /* TNCODE */
  3457. }
  3458. /* S E T L I N -- parse name of and then open communication device. */
  3459. /*
  3460.   Call with:
  3461.     xx == XYLINE for a serial (tty) line, XYHOST for a network host,
  3462.     zz == 0 means if user doesn't give a device name, continue current
  3463.             active connection (if any);
  3464.     zz != 0 means if user doesn't give a device name, then close the
  3465.             current connection and restore the default communication device.
  3466.     fc == 0 to just make the connection, 1 to also CONNECT (e.g. "telnet").
  3467. */
  3468. int netsave = -1;
  3469. static char * tmpstring = NULL;
  3470. static char * tmpusrid = NULL;
  3471. int
  3472. setlin(xx, zz, fc) int xx, zz, fc; {
  3473.     extern char pwbuf[], * g_pswd;
  3474.     extern int pwflg, pwcrypt, g_pflg, g_pcpt, nolocal;
  3475.     int wait;
  3476.     int tn_wait_sv;
  3477.     int mynet;
  3478.     int _local = -1;
  3479.     int c, i, haveswitch = 0;
  3480.     int getval = 0;
  3481.     int wild = 0; /* Filespec has wildcards */
  3482.     int cx = 0; /* Connect after */
  3483.     int sx = 0; /* Become server after */
  3484. #ifdef CK_ENCRYPTION
  3485.     int encrypt = 0;                    /* Encrypted? */
  3486.     int e_type = -1;                    /* Telnet /ENCRYPT type */
  3487. #endif /* CK_ENCRYPTION */
  3488. #ifdef CK_AUTHENTICATION
  3489.     int a_type = -1; /* Authentication type */
  3490. #endif /* CK_AUTHENTICATION */
  3491. #ifdef VMS
  3492.     int shr = 0; /* Share serial device */
  3493. #endif /* VMS */
  3494.     int confirmed = 0; /* Command has been entered */
  3495.     struct FDB sw, tx, nx;
  3496. #ifdef OS2
  3497.     struct FDB fl;
  3498. #endif /* OS2 */
  3499.     char * ss;
  3500. #ifdef TCPSOCKET
  3501.     int rawflg = 0;
  3502. #endif /* TCPSOCKET */
  3503. #ifdef OS2
  3504. #define SRVBUFSIZ PIPENAML
  3505. #else /* OS2 */
  3506. #define SRVBUFSIZ 63
  3507. #endif /* OS2 */
  3508.     char srvbuf[SRVBUFSIZ+1];
  3509.     char hostname[15*65];
  3510. #ifdef OS2
  3511. #ifdef NT
  3512.     int xxtapi = 0;
  3513. #else
  3514.     int xxslip = 0, xxppp = 0;
  3515. #endif /* NT */
  3516. #endif /* OS2 */
  3517.     debug(F101,"setline fc","",fc);
  3518.     debug(F101,"setline zz","",zz);
  3519. #ifdef TNCODE
  3520.     tn_wait_sv = tn_wait_flg;
  3521.     wait = tn_wait_flg;
  3522. #else
  3523.     tn_wait_sv = 0;
  3524.     wait = 0;
  3525. #endif /* TNCODE */
  3526.     mynet = nettype;
  3527.     if (nolocal) {
  3528. slmsg = "Making connections is disabled";
  3529. printf("?Sorry, making connections is disabledn");
  3530. return(-9);
  3531.     }
  3532.     if (netsave > -1)
  3533.       nettype = netsave;
  3534.     if (fc != 0 || zz == 0) /* Preset /CONNECT switch */
  3535.       cx = 1;
  3536.     debug(F101,"setline cx","",cx);
  3537.     *srvbuf = NUL;
  3538.     line[0] = NUL;
  3539.     s = line;
  3540. #ifdef NETCONN
  3541. #ifndef NOSPL
  3542. #ifdef CK_SRP
  3543.     if (tmpstring)
  3544.         makestr(&tmpstring,NULL);
  3545. #endif /* CK_SRP */
  3546. #ifdef RLOGCODE
  3547.     if (tmpusrid)
  3548.         makestr(&tmpusrid,NULL);
  3549. #endif /* RLOGCODE */
  3550. #endif /* NOSPL */
  3551. #endif /* NETCONN */
  3552.     autoflow = 1; /* Enable automatic flow setting */
  3553.     if (xx == XYHOST) { /* SET HOST <hostname> */
  3554. #ifndef NETCONN
  3555. slmsg = "Network connections not supported";
  3556.         printf("?%sn",slmsg);
  3557. return(-9);
  3558. #else /* NETCONN */
  3559. #ifndef NOPUSH
  3560. if ((mynet == NET_CMD || mynet == NET_PTY) && nopush) {
  3561.     slmsg = "Access to external commands is disabled";
  3562.     printf("?Sorry, access to external commands is disabledn");
  3563.     return(-9);
  3564. }
  3565. #endif /* NOPUSH */
  3566. /*
  3567.   Here we parse optional switches and then the hostname or whatever,
  3568.   which depends on the network type.  The tricky part is, the network type
  3569.   can be set by a switch.
  3570. */
  3571. #ifndef NOSPL
  3572. makestr(&g_pswd,pwbuf); /* Save global pwbuf */
  3573. g_pflg = pwflg; /* and flag */
  3574. g_pcpt = pwcrypt;
  3575. #endif /* NOSPL */
  3576. confirmed = 0;
  3577. haveswitch = 0;
  3578. #ifdef NETFILE
  3579. if (mynet != NET_FILE) {
  3580. #endif /* NETFILE */
  3581.     ss = (mynet == NET_CMD || mynet == NET_PTY) ?
  3582.       "Command, or switch" :
  3583. (mynet == NET_TCPA || mynet == NET_TCPB) ?
  3584.   "Hostname, ip-address, or switch" :
  3585.     "Host or switch";
  3586.     if (fc) {
  3587.                 if (ttnproto == NP_TELNET || ttnproto == NP_KERMIT) {
  3588.                     if (nshteltab) {
  3589. haveswitch++;
  3590. cmfdbi(&sw,_CMKEY,ss,"","",nshteltab,4,xxstring,
  3591.      shteltab,&nx);
  3592.     }
  3593.                 }
  3594. #ifdef RLOGCODE
  3595.                 else if (ttnproto == NP_RLOGIN) {
  3596.                     if (nshrlgtab) {
  3597. haveswitch++;
  3598. cmfdbi(&sw,_CMKEY,ss,"","",nshrlgtab,4,xxstring,
  3599.        shrlgtab,&nx);
  3600.     }
  3601.                 }
  3602. #endif /* RLOGCODE */
  3603.     } else {
  3604. haveswitch++;
  3605. cmfdbi(&sw,_CMKEY,ss,"","",nshtab,4,xxstring,shtab,&nx);
  3606.     }
  3607. #ifdef NETFILE
  3608. }
  3609. #endif /* NETFILE */
  3610. if (mynet == NET_TCPB || mynet == NET_SLAT) {
  3611.     cmfdbi(&nx,_CMFLD,"Host","","",0,0,xxstring,NULL,NULL);
  3612. #ifdef NETFILE
  3613. } else if (mynet == NET_FILE) {
  3614.     cmfdbi(&nx,_CMIFI,"Filename","","",0,0,xxstring,NULL,NULL);
  3615. #endif /* NETFILE */
  3616. #ifdef PTYORPIPE
  3617. } else if (mynet == NET_CMD || mynet == NET_PTY) {
  3618.     cmfdbi(&nx,_CMTXT,"Command","","",0,0,xxstring,NULL,NULL);
  3619. #endif /* PTYORPIPE */
  3620. } else {
  3621.     cmfdbi(&nx,_CMTXT,"Host","","",0,0,xxstring,NULL,NULL);
  3622. }
  3623. while (1) {
  3624.     x = cmfdb(haveswitch ? &sw : &nx);
  3625.     debug(F101,"setlin cmfdb","",x);
  3626.     if (x < 0)
  3627.       if (x != -3)
  3628. return(x);
  3629.     if (x == -3) {
  3630. if ((x = cmcfm()) < 0) {
  3631.     return(x);
  3632. } else {
  3633.     confirmed = 1;
  3634.     break;
  3635. }
  3636.     }
  3637.     if (cmresult.fcode != _CMKEY) {    /* Not a switch */
  3638. strcpy(line,cmresult.sresult); /* Save the data that */
  3639. s = line;        /* was parsed... */
  3640. if (cmresult.fcode == _CMIFI) {
  3641.     wild = cmresult.nresult;
  3642. } else if (cmresult.fcode == _CMTXT) {
  3643.     confirmed = 1;
  3644. }
  3645. break; /* and break out of this loop */
  3646.     }
  3647.     c = cmgbrk(); /* Have switch - get break character */
  3648.     getval = (c == ':' || c == '='); /* Must parse an agument? */
  3649.     if (getval && !(cmresult.kflags & CM_ARG)) {
  3650. printf("?This switch does not take argumentsn");
  3651. return(-9);
  3652.     }
  3653.     if (!getval && (cmgkwflgs() & CM_ARG)) {
  3654. printf("?This switch requires an argumentn");
  3655. return(-9);
  3656.     }
  3657.     switch (cmresult.nresult) { /* It's a switch.. */
  3658.       case SL_CNX: /* /CONNECT */
  3659. cx = 1;
  3660. sx = 0;
  3661. break;
  3662.       case SL_SRV: /* /SERVER */
  3663. cx = 0;
  3664. sx = 1;
  3665. break;
  3666. #ifdef NETCMD
  3667.       case SL_CMD: /* /COMMAND */
  3668. netsave = mynet;
  3669. mynet = NET_CMD;
  3670. break;
  3671. #endif /* NETCMD */
  3672. #ifdef NETPTY
  3673.       case SL_PTY: /* /PTY */
  3674. netsave = mynet;
  3675. mynet = NET_PTY;
  3676. break;
  3677. #endif /* NETPTY */
  3678.       case SL_NET: /* /NETWORK-TYPE */
  3679. if ((x = cmkey(netcmd,nnets,"","",xxstring)) < 0)
  3680.   return(x);
  3681. mynet = x;
  3682. break;
  3683. #ifndef NOSPL
  3684.       case SL_PSW: /* /PASSWORD: */
  3685. if (!getval)
  3686.   break;
  3687.                 if ((x = cmfld("Password","",&s,xxstring)) < 0) {
  3688.                     if (x == -3) {
  3689.                         makestr(&tmpstring,"");
  3690.                     } else {
  3691.                         return(x);
  3692.                     }
  3693.                 } else {
  3694.                     s = brstrip(s);
  3695.                     if ((x = (int)strlen(s)) > PWBUFL) {
  3696. slmsg = "Internal error";
  3697.                         printf("?Sorry, too long - max = %dn",PWBUFL);
  3698.                         return(-9);
  3699.                     }
  3700.                     makestr(&tmpstring,s);
  3701.                 }
  3702. break;
  3703. #endif /* NOSPL */
  3704.       case SL_UID: /* /USERID: */
  3705. if (!getval)
  3706.   break;
  3707.                 if ((x = cmfld("Userid","",&s,xxstring)) < 0) {
  3708.                     if (x == -3) {
  3709.                         makestr(&tmpusrid,"");
  3710.                     } else {
  3711.                         return(x);
  3712.                     }
  3713.                 } else {
  3714.                     s = brstrip(s);
  3715.                     if ((x = (int)strlen(s)) > 63) {
  3716. slmsg = "Internal error";
  3717.                         printf("?Sorry, too long - max = %dn",63);
  3718.                         return(-9);
  3719.                     }
  3720.                     makestr(&tmpusrid,s);
  3721.                 }
  3722. break;
  3723. #ifdef CK_AUTHENTICATION
  3724. #ifdef CK_SRP
  3725.               case SL_SRP:
  3726.                 a_type = AUTHTYPE_SRP;
  3727.                 break;
  3728. #endif /* CK_SRP */
  3729. #ifdef CK_SSL
  3730.               case SL_SSL:
  3731.                 a_type = AUTHTYPE_SSL;
  3732.                 break;
  3733. #endif /* CK_SSL */
  3734. #ifdef NT
  3735.               case SL_NTLM:
  3736.                 a_type = AUTHTYPE_NTLM;
  3737.                 break;
  3738. #endif /* NT */
  3739. #ifdef CK_KERBEROS
  3740.               case SL_KRB4:
  3741.                 a_type = AUTHTYPE_KERBEROS_V4;
  3742.                 if (ttnproto == NP_RLOGIN)
  3743.   ttnproto =
  3744. #ifdef CK_ENCRYPTION
  3745.     encrypt ? NP_EK4LOGIN :
  3746. #endif /* CK_ENCRYPTION */
  3747.       NP_K4LOGIN;
  3748.                 else if (ttnproto == NP_K5LOGIN)
  3749.   ttnproto = NP_K4LOGIN;
  3750. #ifdef CK_ENCRYPTION
  3751.                 else if (ttnproto == NP_EK5LOGIN)
  3752.   ttnproto = NP_EK4LOGIN;
  3753. #endif /* CK_ENCRYPTION */
  3754.                 break;
  3755.       case SL_KRB5:
  3756.                 a_type = AUTHTYPE_KERBEROS_V5;
  3757.                 if (ttnproto == NP_RLOGIN)
  3758.   ttnproto =
  3759. #ifdef CK_ENCRYPTION
  3760.     encrypt ? NP_EK5LOGIN :
  3761. #endif /* CK_ENCRYPTION */
  3762.       NP_K5LOGIN;
  3763. else if (ttnproto == NP_K4LOGIN)
  3764.   ttnproto = NP_K5LOGIN;
  3765. #ifdef CK_ENCRYPTION
  3766. else if (ttnproto == NP_EK4LOGIN)
  3767.   ttnproto = NP_EK5LOGIN;
  3768. #endif /* CK_ENCRYPTION */
  3769. break;
  3770. #endif /* CK_KERBEROS */
  3771.       case SL_AUTH: {
  3772.   extern struct keytab autyptab[];
  3773.   extern int nautyp;
  3774.   if ((x = cmkey(autyptab,nautyp,"type of authentication",
  3775.  "automatic",xxstring)) < 0)
  3776.                     return(x);
  3777.   a_type = x;
  3778.   break;
  3779.       }
  3780. #endif /* CK_AUTHENTICATION */
  3781. #ifdef CK_ENCRYPTION
  3782.               case SL_ENC:
  3783. switch (ttnproto) {
  3784.   case NP_K4LOGIN:
  3785.                     ttnproto = NP_EK4LOGIN;
  3786.                     encrypt = 1;
  3787.                     break;
  3788.   case NP_K5LOGIN:
  3789.                     ttnproto = NP_EK5LOGIN;
  3790.                     encrypt = 1;
  3791.                     break;
  3792.                   case NP_KERMIT:
  3793.   case NP_TELNET: {
  3794.       static struct keytab * tnetbl = NULL;
  3795.       static int ntnetbl = 0;
  3796.       x = ck_get_crypt_table(&tnetbl,&ntnetbl);
  3797.       debug(F101,"ck_get_crypt_table x","",x);
  3798.       debug(F101,"ck_get_crypt_table n","",ntnetbl);
  3799.       if (x < 1 || !tnetbl || ntnetbl < 1) /* Didn't get it */
  3800.                         x = 0;
  3801.       if (!x) {
  3802.   slmsg = "Internal error";
  3803.   printf("?Oops, types not loadedn");
  3804.   return(-9);
  3805.       }
  3806.       if ((x = cmkey(tnetbl,ntnetbl,"type of encryption",
  3807.      "automatic",xxstring)) < 0)
  3808.                         return(x);
  3809.       e_type = x;
  3810.       break;
  3811.   }
  3812. }
  3813.                 break;
  3814. #endif /* CK_ENCRYPTION */
  3815.       case SL_WAIT:
  3816. wait = 1;
  3817. break;
  3818.       case SL_NOWAIT:
  3819. wait = 0;
  3820. break;
  3821.     }
  3822. }
  3823. #ifdef NETFILE
  3824. if (mynet == NET_FILE) /* Parsed by cmifi() */
  3825.   if ((x = cmcfm()) < 0) /* Needs confirmation */
  3826.     return(x);
  3827. #endif /* NETFILE */
  3828. #ifdef NETCMD
  3829. if (mynet == NET_CMD || mynet == NET_PTY) {
  3830.     char *p = NULL;
  3831.     if (!confirmed) {
  3832. if ((x = cmtxt("Rest of command","",&s,xxstring)) < 0)
  3833.   return(x);
  3834. if (*s) {
  3835.     strncat(line," ",LINBUFSIZ);
  3836.     strncat(line,s,LINBUFSIZ);
  3837. }
  3838. s = line;
  3839.     }
  3840.     s = brstrip(s);
  3841.     makestr(&p,s);
  3842.     strcpy(line,p);
  3843.     makestr(&p,NULL);
  3844.     s = line;
  3845. }
  3846. debug(F110,"SUNDAY 2",line,0);
  3847. #endif /* NETCMD */
  3848. #ifdef NPIPE /* Named pipe */
  3849. if (mynet == NET_PIPE) { /* Needs backslash twiddling */
  3850.     if (*s) {
  3851. if (strcmp(s,"*")) { /* If remote, */
  3852.     strcpy(line,"\\"); /* begin with server name */
  3853.     strncat(line,s,LINBUFSIZ);
  3854. } else {
  3855.     line[0]='';
  3856. }
  3857. strncat(line,"\pipe\", LINBUFSIZ); /* Make it a pipe name */
  3858. strncat(line,pipename, LINBUFSIZ); /* Add name of pipe */
  3859. s = line;
  3860.     }
  3861. }
  3862. #endif /* NPIPE */
  3863. #ifdef SUPERLAT
  3864. if (mynet == NET_SLAT) { /* Needs password, etc. */
  3865.     slat_pwd[0] = NUL; /* Erase any previous password */
  3866.     if (*s) { /* If they gave a host name... */
  3867. if ((x = cmfld(
  3868.      "password,n or carriage return if no password required",
  3869.        "",
  3870.        &s,
  3871.        xxstring
  3872.        )) < 0 && x != -3)
  3873.   return(x);
  3874. ckstrncpy(slat_pwd,s,18); /* Set the password, if any */
  3875.     }
  3876.     if ((x = cmcfm()) < 0) return(x); /* Confirm the command */
  3877.     s = line;
  3878. }
  3879. #endif /* SUPERLAT */
  3880. #ifdef TCPSOCKET
  3881. if (mynet == NET_TCPB) { /* TCP/IP connection */
  3882.     debug(F110,"setlin service 0",srvbuf,0);
  3883.     debug(F110,"setlin host s 2",s,0);
  3884.     if (*s) { /* If they gave a host name... */
  3885. debug(F110,"setlin host s 1",s,0);
  3886. #ifdef NOLISTEN
  3887. if (mynet == NET_TCPB && *s == '*') {
  3888.     slmsg = "Incoming connections not supported";
  3889.     printf(
  3890.      "?Sorry, incoming connections not supported in this version of Kermit.n"
  3891.    );
  3892.     return(-9);
  3893. }
  3894. #endif /* NOLISTEN */
  3895. #ifdef RLOGCODE
  3896. /* Allow a username if rlogin is requested */
  3897. if (ttnproto == NP_RLOGIN
  3898. #ifdef CK_AUTHENTICATION
  3899. #ifdef CK_KERBEROS
  3900.     || ttnproto == NP_K4LOGIN || ttnproto == NP_EK4LOGIN
  3901.     || ttnproto == NP_K4LOGIN || ttnproto == NP_EK4LOGIN
  3902. #endif /* CK_KERBEROS */
  3903. #endif /* CK_AUTHENTICATION */
  3904.      ) {
  3905.     int y;
  3906.     uidflag = 0;
  3907.     /* Check for "host:service" */
  3908.     for ( ; (*s != '') && (*s != ':'); s++) ;
  3909.     if (*s) { /* Service, save it */
  3910. *s = NUL;
  3911. ckstrncpy(srvbuf,++s,SRVBUFSIZ);
  3912.     } else { /* No :service, then use default. */
  3913. #ifdef VMS
  3914. switch (ttnproto) {
  3915.   case NP_RLOGIN:
  3916.     strcpy(srvbuf,"513"); /* Use "login" */
  3917.     break;
  3918.                           case NP_K4LOGIN:
  3919.   case NP_K5LOGIN:
  3920.     strcpy(srvbuf,"543"); /* Use "klogin" */
  3921.     break;
  3922.                           case NP_EK4LOGIN:
  3923.   case NP_EK5LOGIN:
  3924.     strcpy(srvbuf,"2105"); /* Use "eklogin" */
  3925.     break;
  3926. }
  3927. #else /* VMS */
  3928. switch (ttnproto) {
  3929.   case NP_RLOGIN:
  3930.     strcpy(srvbuf,"login");
  3931.     break;
  3932.                           case NP_K4LOGIN:
  3933.                           case NP_K5LOGIN:
  3934.     strcpy(srvbuf,"klogin");
  3935.     break;
  3936.                           case NP_EK4LOGIN:
  3937.                           case NP_EK5LOGIN:
  3938.     strcpy(srvbuf,"eklogin");
  3939.     break;
  3940. }
  3941. #endif /* VMS */
  3942.     }
  3943.     if (!confirmed) {
  3944. y = cmfld("Userid on remote system",
  3945.   uidbuf,&s,xxstring);
  3946. if (y < 0 && y != -3)
  3947.   return(y);
  3948. if ((int)strlen(s) > 63) {
  3949.     slmsg = "Internal error";
  3950.     printf("Sorry, too longn");
  3951.     return(-9);
  3952. }
  3953.                         makestr(&tmpusrid,s);
  3954.     }
  3955. } else { /* TELNET or SET HOST */
  3956. #endif /* RLOGCODE */
  3957.     /* s = line; */
  3958.     /* Check for "host:service" */
  3959.     for ( ; (*s != '') && (*s != ':'); s++) ;
  3960.     if (*s) { /* Service, save it */
  3961. *s = NUL;
  3962. ckstrncpy(srvbuf,++s,SRVBUFSIZ);
  3963.     } else if (!confirmed) {
  3964. /* No :service, let them type one. */
  3965. if (*line != '*') { /* Not incoming */
  3966.     if (ttnproto == NP_KERMIT) {
  3967. if ((x = cmfld(
  3968.        "TCP service name or number",
  3969.        "kermit",&s,xxstring)
  3970.      ) < 0 && x != -3)
  3971.   return(x);
  3972. #ifdef RLOGCODE
  3973.     } else if (ttnproto == NP_RLOGIN) {
  3974. if ((x = cmfld(
  3975.   "TCP service name or number,n or carriage return for rlogin (513)",
  3976.        "login",&s,xxstring)
  3977.      ) < 0 && x != -3)
  3978.   return(x);
  3979. #ifdef CK_AUTHENTICATION
  3980. #ifdef CK_KERBEROS
  3981.     } else if (ttnproto == NP_K4LOGIN ||
  3982.        ttnproto == NP_K5LOGIN) {
  3983. if ((x = cmfld(
  3984.   "TCP service name or number,n or carriage return for klogin (543)",
  3985.        "klogin",&s,xxstring)
  3986.      ) < 0 && x != -3)
  3987.   return(x);
  3988.     } else if (ttnproto == NP_EK4LOGIN ||
  3989.        ttnproto == NP_EK5LOGIN) {
  3990. if ((x = cmfld(
  3991.   "TCP service name or number,n or carriage return for eklogin (2105)",
  3992.        "eklogin",&s,xxstring)
  3993.      ) < 0 && x != -3)
  3994.   return(x);
  3995. #endif /* CK_KERBEROS */
  3996. #endif /* CK_AUTHENTICATION */
  3997. #endif /* RLOGCODE */
  3998.     } else {
  3999. if ((x = cmfld(
  4000.        "TCP service name or number",
  4001.        "telnet",&s,xxstring)
  4002.      ) < 0 && x != -3)
  4003.   return(x);
  4004.     }
  4005. } else { /* Incoming connection */
  4006.     if ((x = cmfld("TCP service name or number",
  4007.    "",&s,xxstring)
  4008.  ) < 0 && x != -3)
  4009.       return(x);
  4010. }
  4011. if (*s) /* If they gave a service, */
  4012.   ckstrncpy(srvbuf,s,SRVBUFSIZ); /* copy it */
  4013.     }
  4014. #ifdef RLOGCODE
  4015. }
  4016. #endif /* RLOGCODE */
  4017. if (!confirmed) {
  4018.                     char * defproto;
  4019.                     switch (ttnproto) {
  4020.       case NP_RLOGIN:
  4021.                         defproto = "/rlogin";
  4022.                         break;
  4023.          case NP_K4LOGIN:
  4024.         defproto = "/k4login";
  4025.      break;
  4026.                       case NP_K5LOGIN:
  4027.                         defproto = "/k5login";
  4028.                         break;
  4029.                       case NP_EK4LOGIN:
  4030.                         defproto = "/ek4login";
  4031.                         break;
  4032.                       case NP_EK5LOGIN:
  4033.         defproto = "/ek5login";
  4034.      break;
  4035.       case NP_KERMIT:
  4036.       case NP_TELNET:
  4037.                         defproto = "/telnet";
  4038.                         break;
  4039.       default:
  4040.                         defproto = "/default";
  4041.                     }
  4042.     if ((x = cmkey(tcprawtab,ntcpraw,"Switch",defproto,
  4043.    xxstring)) < 0) {
  4044. if (x != -3)
  4045.   return(x);
  4046. else if ((x = cmcfm()) < 0)
  4047.   return(x);
  4048.     } else {
  4049. rawflg = x;
  4050. if ((x = cmcfm()) < 0)
  4051.   return(x);
  4052. switch (rawflg) {
  4053. #ifdef CK_SSL
  4054.                           case NP_SSL:
  4055.     ttnproto = rawflg;
  4056.     ssl_only_flag = 1;
  4057.     tls_only_flag = 0;
  4058.     break;
  4059.                           case NP_TLS:
  4060.     ttnproto = rawflg;
  4061.     ssl_only_flag = 0;
  4062.     tls_only_flag = 1;
  4063.     break;
  4064.                           case NP_SSL_TELNET:
  4065.                             ttnproto = NP_TELNET;
  4066.                             ssl_only_flag = 1;
  4067.                             tls_only_flag = 0;
  4068.                             break;
  4069.                           case NP_TLS_TELNET:
  4070.                             ttnproto = NP_TELNET;
  4071.                             ssl_only_flag = 0;
  4072.                             tls_only_flag = 1;
  4073.                             break;
  4074. #endif /* CK_SSL */
  4075.                           case NP_NONE:
  4076.   case NP_TCPRAW:
  4077.                           case NP_RLOGIN:
  4078.                           case NP_K4LOGIN:
  4079.                           case NP_K5LOGIN:
  4080.                           case NP_EK4LOGIN:
  4081.                           case NP_EK5LOGIN:
  4082.   case NP_TELNET:
  4083.   case NP_KERMIT:
  4084.   default:
  4085.     ttnproto = rawflg;
  4086. #ifdef CK_SSL
  4087.     ssl_only_flag = 0;
  4088.     tls_only_flag = 0;
  4089. #endif /* CK_SSL */
  4090.     break;
  4091. }
  4092.     }
  4093. }
  4094.     }
  4095.     s = line;
  4096. }
  4097. #endif /* TCPSOCKET */
  4098. if (!*s) {
  4099.     if (!network) {
  4100. slmsg = "Hostname or address required";
  4101. printf("?%sn",slmsg);
  4102. return(-9);
  4103.     } else if (!zz) { /* No hostname given */
  4104. #ifdef CKLOGDIAL
  4105. #ifdef NETCONN
  4106. dolognet();
  4107. #endif /* NETCONN */
  4108. #endif /* CKLOGDIAL */
  4109. if (cx) {
  4110.     success = doconect(0);
  4111. #ifdef CKLOGDIAL
  4112.     if (ttchk() < 0)
  4113.       dologend();
  4114. #endif /* CKLOGDIAL */
  4115.     return(success);
  4116. } else
  4117.   return(1);
  4118.     }
  4119. }
  4120. #ifndef NODIAL
  4121. /* Look up in network directory */
  4122. x = 0;
  4123. debug(F101,"setlin mynet 1","",mynet);
  4124. debug(F111,"setlin nnetdir",s,nnetdir);
  4125. if (*s == '=') { /* If number starts with = sign */
  4126.     s++; /* strip it */
  4127.     while (*s == SP) s++; /* and any leading spaces */
  4128.     strcpy(line,s); /* Do this again. */
  4129.     s = line;
  4130.     debug(F110,"setlin host s 3",s,0);
  4131.     nhcount = 0;
  4132. } else if (*s) { /* We want to look it up. */
  4133.     if (nnetdir > 0) /* If there is a directory... */
  4134.       x = lunet(line); /* (sets nhcount) */
  4135.     else /* otherwise */
  4136.       nhcount = 0; /* we didn't find any there */
  4137.     if (x < 0) { /* Internal error? */
  4138. slmsg = "Network directory lookup error";
  4139. printf("?Fatal network directory lookup error - %sn",line);
  4140. return(-9);
  4141.     }
  4142.     debug(F111,"setlin lunet nhcount",line,nhcount);
  4143. }
  4144. #endif /* NODIAL */
  4145. /* New connection wanted.  Make a copy of the host name/address... */
  4146. ckstrncpy(tmpbuf,s,TMPBUFSIZ); /* Because we are reusing line[] */
  4147. s = tmpbuf; /* for net directory entries...  */
  4148. debug(F111,"setlin host s 5",s,mdmtyp);
  4149. if (clsconnx(1) < 0) /* Close current connection */
  4150.   return(success = 0);
  4151. if (*s) { /* They gave a hostname */
  4152.     _local = 1; /* Network connection always local */
  4153.     if (mdmsav < 0)
  4154.       mdmsav = mdmtyp; /* Remember old modem type */
  4155.     mdmtyp = -mynet; /* Special code for network */
  4156.     if (mynet == NET_TCPB) { /* For TCP/IP telnet connections */
  4157. oldplex = duplex; /* Remember previous duplex */
  4158. duplex = 0; /* Set full duplex and let */