home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / old / ckermit5a188 / ckuus3.c < prev    next >
C/C++ Source or Header  |  2020-01-01  |  32KB  |  1,287 lines

  1. #ifndef NOICP
  2.  
  3. /*  C K U U S 3 --  "User Interface" for Unix Kermit, part 3  */
  4.  
  5. /*
  6.   Author: Frank da Cruz (fdc@columbia.edu, FDCCU@CUVMA.BITNET),
  7.   Columbia University Center for Computing Activities.
  8.   First released January 1985.
  9.   Copyright (C) 1985, 1992, Trustees of Columbia University in the City of New
  10.   York.  Permission is granted to any individual or institution to use this
  11.   software as long as it is not sold for profit.  This copyright notice must be
  12.   retained.  This software may not be included in commercial products without
  13.   written permission of Columbia University.
  14. */
  15.  
  16. /*  SET command (but much material has been split off into ckuus7.c). */
  17.  
  18. /*
  19.   Kermit-specific includes.
  20.   Definitions here supersede those from system include files.
  21. */
  22. #include "ckcdeb.h"            /* Debugging & compiler things */
  23. #include "ckcasc.h"            /* ASCII character symbols */
  24. #include "ckcker.h"            /* Kermit application definitions */
  25. #include "ckcxla.h"            /* Character set translation */
  26. #include "ckcnet.h"            /* Network symbols */
  27. #include "ckuusr.h"            /* User interface symbols */
  28.  
  29. /* Variables */
  30.  
  31. extern int size, spsiz, spmax, urpsiz, srvtim, 
  32.   local, server, success,
  33.   flow, binary, delay, parity, escape, what, srvdis,
  34.   turn, duplex, backgrd,
  35.   turnch, bctr, mdmtyp, keep, maxtry, unkcs, network,
  36.   ebqflg, quiet, swcapr, nettype,
  37.   wslotr, lscapr, lscapu,
  38.   carrier, debses,
  39.   cdtimo, nlangs, bgset, pflag, msgflg, dblchar,
  40.   cmdmsk, spsizr, wildxpand, suspend,
  41.   techo;
  42.  
  43. extern char *ccntab[];
  44.  
  45. #ifndef NOSCRIPT
  46. extern int secho;            /* Whether SCRIPT cmd should echo */
  47. #endif /* NOSCRIPT */
  48.  
  49. #ifndef NOSPL
  50. #ifdef DCMDBUF
  51. extern int *count, *terror, *merror, *incase;
  52. #else
  53. extern int count[], terror[], merror[], incase[];
  54. #endif /* DCMDBUF */
  55. extern int mecho;            /* Macro echo */
  56. #else
  57. extern int terror[];
  58. #endif /* NOSPL */
  59.  
  60. extern int bigsbsiz, bigrbsiz;        /* Packet buffers */
  61.  
  62. extern long speed;            /* Terminal speed */
  63.  
  64. extern CHAR sstate;            /* Protocol start state */
  65. extern char ttname[];            /* Communication device name */
  66. #ifndef MAC
  67. #ifndef NOSETKEY
  68. extern KEY *keymap;            /* Character map for SET KEY (1:1)  */
  69. extern MACRO *macrotab;            /* Macro map for SET KEY (1:string) */
  70. #ifdef OS2
  71. int wideresult;                         /* for SET KEY, wide OS/2 scan codes */
  72. #endif /* OS2 */
  73. #endif /* NOSETKEY */
  74. #endif /* MAC */
  75.  
  76. #ifndef NOCSETS
  77. /* system-independent character sets, defined in ckcxla.[ch] */
  78. extern struct csinfo tcsinfo[];
  79. extern struct langinfo langs[];
  80.  
  81. /* Other character-set related variables */
  82. extern int tcharset, tslevel, language;
  83. #endif /* NOCSETS */ 
  84.  
  85. /* Declarations from cmd package */
  86.  
  87. #ifdef DCMDBUF
  88. extern char *cmdbuf;            /* Command buffer */
  89. extern char *line;
  90. #else
  91. extern char cmdbuf[];            /* Command buffer */
  92. extern char line[];            /* Character buffer for anything */
  93. #endif /* DCMDBUF */
  94.  
  95. /* From main ckuser module... */
  96.  
  97. extern char tmpbuf[], *tp, *lp;        /* Temporary buffer */
  98.  
  99. extern int tlevel;            /* Take Command file level */
  100.  
  101. #ifndef NOSPL
  102. extern int cmdlvl;            /* Overall command level */
  103. #endif /* NOSPL */
  104.  
  105. #ifdef UNIX
  106. extern int sessft;            /* Session-log file type */
  107. #endif /* UNIX */
  108.  
  109.  
  110. #ifdef VMS
  111. int vms_msgs = 1;            /* SET MESSAGES */
  112. #endif /* VMS */
  113.  
  114. /* Keyword tables for SET commands */
  115.  
  116. struct keytab chktab[] = {
  117.     "1", 1, 0,
  118.     "2", 2, 0,
  119.     "3", 3, 0,
  120.     "blank-free-2", 4, 0
  121. };
  122.  
  123. /* For SET MODEM */
  124.  
  125. struct keytab autotab[] = {
  126.     "changes-speed", 1, 0,
  127.     "matches-speed", 0, 0
  128. };
  129.  
  130. /* For SET CARRIER */
  131.  
  132. struct keytab crrtab[] = {
  133.     "auto", CAR_AUT, 0,
  134.     "off",  CAR_OFF, 0,
  135.     "on",   CAR_ON, 0
  136. };
  137. int ncrr = 3;
  138.  
  139. /* For SET DEBUG */
  140.  
  141. struct keytab dbgtab[] = {
  142.     "off",     0,  0,
  143.     "on",      1,  0,
  144.     "session", 2,  0
  145. };
  146. int ndbg = 3;
  147.  
  148. /* Transmission speeds */
  149.  
  150. /* Note, the values are encoded in cps rather than bps because 19200 and */
  151. /* 38400 are too big for some ints.  All but 75bps are multiples of ten. */
  152. /* Result of lookup in this table must be multiplied by 10 to get actual */
  153. /* speed in bps.  If this number is 70, it must be changed to 75. */
  154. /* If it is 888, this means 75/1200 split speed.  134.5 (IBM 2741) is not */
  155. /* supported, and split speed is not possible in AT&T UNIX. */ 
  156.  
  157. /* The values are generic, rather than specific to UNIX.  We can't use */
  158. /* B75, B1200, B9600, etc, because non-UNIX versions of C-Kermit will not */
  159. /* necessarily have these symbols defined. */
  160.  
  161. /* Like all other keytabs, this one must be in "alphabetical" order, */
  162. /* rather than numeric order. */ 
  163.  
  164. struct keytab spdtab[] = {
  165.     "0",      0,  CM_INV,
  166.     "110",   11,  0,
  167. #ifdef OS2
  168. #ifdef __32BIT__
  169.  "115200",11520,  0,
  170. #endif /* __32BIT__ */
  171. #endif /* OS2 */
  172.   "1200",   120,  0,
  173. #ifdef OS2
  174.   "14400", 1440,  0,
  175. #endif /* OS2 */
  176.   "150",     15,  0,
  177.   "19200", 1920,  0,
  178.   "200",     20,  0,
  179.   "2400",   240,  0,
  180.   "300",     30,  0,
  181.   "3600",   360,  0,
  182.   "38400", 3840,  0,
  183.   "4800",   480,  0,
  184.   "50",       5,  0,
  185. #ifdef OS2
  186.   "57600", 5760,  0,  
  187. #endif /* OS2 */
  188.   "600",     60,  0,
  189. #ifdef OS2
  190.   "7200",   720,  0,
  191. #endif /* OS2 */
  192.   "75",       7,  0,
  193. #ifdef ANYBSD
  194.   "75/1200",888,  0,        /* Special code "888" for split speed */
  195. #endif /* ANYBSD */
  196. #ifdef OS2
  197. #ifdef __32BIT__
  198.   "76800", 7680,  0,
  199. #endif /* __32BIT__ */
  200. #endif /* OS2 */
  201.   "9600",   960,  0
  202. };
  203. int nspd = (sizeof(spdtab) / sizeof(struct keytab)); /* how many speeds */
  204.  
  205. #ifndef NOCSETS
  206. extern struct keytab lngtab[];        /* Languages for SET LANGUAGE */
  207. extern int nlng;
  208. #endif /* NOCSETS */
  209.  
  210. /* Duplex keyword table */
  211.  
  212. struct keytab dpxtab[] = {
  213.     "full",      0, 0,
  214.     "half",      1, 0
  215. };
  216.  
  217. /* SET FILE parameters */
  218.  
  219. struct keytab filtab[] = {
  220.     "bytesize",         XYFILS, 0,
  221. #ifndef NOCSETS
  222.     "character-set",    XYFILC, 0,
  223. #endif /* NOCSETS */
  224.     "collision",        XYFILX, 0,
  225.     "display",          XYFILD, 0,
  226.     "incomplete",       XYFILI, 0,
  227. #ifdef VMS
  228.     "label",            XYFILL, 0,
  229. #endif /* VMS */
  230.     "names",            XYFILN, 0,
  231. #ifdef VMS
  232.     "record-length",    XYFILR, 0,
  233. #endif /* VMS */
  234.     "type",             XYFILT, 0,
  235.     "warning",          XYFILW, CM_INV
  236. };
  237. int nfilp = (sizeof(filtab) / sizeof(struct keytab));
  238.  
  239. /* Flow Control */
  240.  
  241. struct keytab flotab[] = {        /* SET FLOW-CONTROL keyword table */
  242. #ifdef CK_DTRCD
  243.     "dtr/cd",   FLO_DTRC, 0,
  244. #endif /* CK_DTRCD */
  245. #ifdef CK_DTRCTS
  246.     "dtr/cts",FLO_DTRT, 0,
  247. #endif /* CK_DTRCTS */
  248.     "keep",     FLO_KEEP, 0,
  249.     "none",     FLO_NONE, 0,
  250. #ifdef CK_RTSCTS
  251.     "rts/cts",  FLO_RTSC, 0,
  252. #endif /* CK_RTSCTS */
  253.     "xon/xoff", FLO_XONX, 0
  254. };
  255. int nflo = (sizeof(flotab) / sizeof(struct keytab));
  256.  
  257. /*  Handshake characters  */
  258.  
  259. struct keytab hshtab[] = {
  260.     "bell", 007, 0,
  261.     "code", 998, 0,
  262.     "cr",   015, 0,
  263.     "esc",  033, 0,
  264.     "lf",   012, 0,
  265.     "none", 999, 0,            /* (can't use negative numbers) */
  266.     "xoff", 023, 0,
  267.     "xon",  021, 0
  268. };
  269. int nhsh = (sizeof(hshtab) / sizeof(struct keytab));
  270.  
  271. struct keytab fttab[] = {        /* File types */
  272. #ifdef VMS
  273.     "b",         XYFT_B, CM_INV|CM_ABR,
  274. #endif /* VMS */
  275.     "binary",    XYFT_B, 0,
  276. #ifdef VMS
  277.     "block",     XYFT_I, CM_INV,
  278.     "image",     XYFT_I, 0,
  279.     "labeled",   XYFT_L, 0,
  280. #endif /* VMS */
  281.     "text",      XYFT_T, 0
  282. };
  283. int nfttyp = (sizeof(fttab) / sizeof(struct keytab));
  284.  
  285. #ifndef NODIAL
  286. extern struct keytab mdmtab[] ;        /* Modem types (in module ckudia.c) */
  287. extern int nmdm;            /* Number of them */
  288. #ifndef MINIDIAL
  289. extern int tbmodel;            /* Telebit model ID */
  290. #endif /* MINIDIAL */
  291. #endif /* NODIAL */
  292.  
  293. #ifdef UNIX
  294. struct keytab wildtab[] = {        /* SET WILDCARD-EXPANSION */
  295.     "kermit",  0, 0,
  296.     "shell",   1, 0
  297. };
  298. #endif /* UNIX */
  299.  
  300. #ifdef NETCONN
  301. extern struct keytab netcmd[];
  302. extern int nnets;
  303. #endif /* NETCONN */
  304.  
  305. #ifdef SUNX25
  306. struct keytab x25tab[] = {
  307.     "call-user-data",    XYUDAT, 0,
  308.     "closed-user-group", XYCLOS, 0,
  309.     "reverse-charge",    XYREVC, 0  
  310. };
  311. int nx25 = (sizeof(x25tab) / sizeof(struct keytab));
  312.  
  313. struct keytab padx3tab[] = {
  314.     "break-action",         PAD_BREAK_ACTION,           0,
  315.     "break-character",      PAD_BREAK_CHARACTER,        0,
  316.     "character-delete",     PAD_CHAR_DELETE_CHAR,       0,
  317.     "cr-padding",           PAD_PADDING_AFTER_CR,       0,
  318.     "discard-output",       PAD_SUPPRESSION_OF_DATA,    0,
  319.     "echo",                 PAD_ECHO,                   0,
  320.     "editing",              PAD_EDITING,                0,
  321.     "escape",               PAD_ESCAPE,                 0,
  322.     "forward",              PAD_DATA_FORWARD_CHAR,      0,
  323.     "lf-padding",           PAD_PADDING_AFTER_LF,       0,
  324.     "lf-insert",            PAD_LF_AFTER_CR,            0,
  325.     "line-delete",          PAD_BUFFER_DELETE_CHAR,     0,
  326.     "line-display",         PAD_BUFFER_DISPLAY_CHAR,    0,
  327.     "line-fold",            PAD_LINE_FOLDING,           0,
  328.     "pad-flow-control",     PAD_FLOW_CONTROL_BY_PAD,    0,
  329.     "service-signals",      PAD_SUPPRESSION_OF_SIGNALS, 0,
  330.     "timeout",              PAD_DATA_FORWARD_TIMEOUT,   0,
  331. /* Speed is read-only */
  332.     "transmission-rate",    PAD_LINE_SPEED,             0,
  333.     "user-flow-control",    PAD_FLOW_CONTROL_BY_USER,   0
  334. };
  335. int npadx3 = (sizeof(padx3tab) / sizeof(struct keytab));
  336. #endif /* SUNX25 */
  337.  
  338. /* Parity keyword table */
  339.  
  340. struct keytab partab[] = {
  341.     "even",    'e', 0,
  342.     "mark",    'm', 0,
  343.     "none",     0 , 0,
  344.     "odd",     'o', 0,
  345.     "space",   's', 0
  346. };
  347. int npar = (sizeof(partab) / sizeof(struct keytab));
  348.  
  349. /* On/Off table */
  350.  
  351. struct keytab onoff[] = {
  352.     "off",       0, 0,
  353.     "on",        1, 0
  354. };
  355.  
  356. struct keytab rltab[] = {
  357.     "local",     1, 0,
  358.     "off",       0, CM_INV,
  359.     "on",        1, CM_INV,
  360.     "remote",    0, 0
  361. };
  362. int nrlt = (sizeof(rltab) / sizeof(struct keytab));
  363.  
  364. /* Incomplete File Disposition table */
  365. static
  366. struct keytab ifdtab[] = {
  367.     "discard",   0, 0,
  368.     "keep",      1, 0
  369. };
  370.  
  371. /* SET TAKE parameters table */
  372. static
  373. struct keytab taktab[] = {
  374.     "echo",  0, 0,
  375.     "error", 1, 0,
  376.     "off",   2, CM_INV,            /* For compatibility */
  377.     "on",    3, CM_INV            /* with MS-DOS Kermit... */
  378. };
  379.  
  380. /* SET MACRO parameters table */
  381. static
  382. struct keytab smactab[] = {
  383.     "echo",  0, 0,
  384.     "error", 1, 0
  385. };
  386.  
  387. #ifndef NOSCRIPT
  388. static
  389. struct keytab scrtab[] = {
  390.     "echo",  0, 0
  391. };
  392. #endif /* NOSCRIPT */
  393.  
  394. /* Bytesize table */
  395. struct keytab byttab[] = {
  396.     "bytesize",  0, 0
  397. };
  398. int nbytt = 1;
  399.  
  400. #ifndef NOSERVER
  401. /* Server parameters table */
  402. struct keytab srvtab[] = {
  403.     "display", XYSERD, 0,
  404.     "timeout", XYSERT, 0
  405. };
  406. #endif /* NOSERVER */
  407.  
  408. /* SET TRANSFER/XFER table */
  409.  
  410. struct keytab tstab[] = {
  411. #ifndef NOCSETS
  412.     "character-set", 1,   0,
  413. #endif /* NOCSETS */
  414.     "locking-shift", 2,   0
  415. };
  416. int nts = (sizeof(tstab) / sizeof(struct keytab));
  417.  
  418. #ifndef NOCSETS
  419. /* SET TRANSFER CHARACTER-SET table */
  420.  
  421. extern struct keytab tcstab[];
  422. extern int ntcs;
  423. #endif /* NOCSETS */
  424.  
  425. /* SET TRANSFER LOCKING-SHIFT table */
  426. struct keytab lstab[] = {
  427.     "forced", 2,   0,
  428.     "off",    0,   0,
  429.     "on",     1,   0
  430. };
  431. int nls = (sizeof(lstab) / sizeof(struct keytab));
  432.  
  433. /* SET TELNET table */
  434. #ifdef TNCODE
  435. extern int tn_duplex, tn_nlm;
  436. extern char *tn_term;
  437. struct keytab tntab[] = {
  438.     "echo",          CK_TN_EC,   0,
  439.     "newline-mode",  CK_TN_NL,   0,
  440.     "terminal-type", CK_TN_TT,   0
  441. };
  442. int ntn = (sizeof(tntab) / sizeof(struct keytab));
  443. #endif /* TNCODE */
  444.  
  445. struct keytab ftrtab[] = {        /* Feature table */
  446. #ifndef NOCSETS                /* 0 = we have it, 1 = we don't */
  447. "character-sets",    0, 0,
  448. #else
  449. "character-sets",    1, 0,
  450. #endif /* NOCSETS */
  451. #ifndef NOCYRIL
  452. "cyrillic",        0, 0,
  453. #else
  454. "cyrillic",        1, 0,
  455. #endif /* NOCYRIL */
  456.  
  457. #ifndef NODEBUG
  458. "debug",        0, 0,
  459. #else
  460. "debug",        1, 0,
  461. #endif /* NODEBUG */
  462.  
  463. #ifndef NODIAL
  464. "dial",            0, 0,
  465. #else
  466. "dial",            1, 0,
  467. #endif /* NODIAL */
  468.  
  469. #ifdef DYNAMIC
  470. "dynamic-memory",       0, 0,
  471. #else
  472. "dynamic-memory",       1, 0,
  473. #endif /* DYNAMIC */
  474.  
  475. #ifdef CK_CURSES
  476. "fullscreen-display",    0, 0,
  477. #else
  478. "fullscreen-display",    1, 0,
  479. #endif /* CK_CURSES */
  480. #ifndef NOHELP
  481. "help",            0, 0,
  482. #else
  483. "help",            1, 0,
  484. #endif /* NOHELP */
  485. #ifndef NOSPL
  486. "if-command",        0, 0,
  487. #else
  488. "if-command",        1, 0,
  489. #endif /* NOSPL */
  490. #ifndef NOJC
  491. #ifdef UNIX
  492. "job-control",        0, 0,
  493. #else
  494. "job-control",        1, 0,
  495. #endif /* UNIX */
  496. #else
  497. "job-control",        1, 0,
  498. #endif /* NOJC */
  499. #ifdef KANJI
  500. "kanji",        0, 0,
  501. #else
  502. "kanji",        1, 0,
  503. #endif /* KANJI */
  504. #ifndef NOCSETS
  505. "latin1",        0, 0,
  506. #else
  507. "latin1",        1, 0,
  508. #endif /* NOCSETS */
  509. #ifdef LATIN2
  510. "latin2",        0, 0,
  511. #else
  512. "latin2",        1, 0,
  513. #endif /* LATIN2 */
  514. #ifdef NETCONN
  515. "network",        0, 0,
  516. #else
  517. "network",        1, 0,
  518. #endif /* NETCONN */
  519. #ifndef NOPUSH
  520. "push",            0, 0,
  521. #else
  522. "push",            1, 0,
  523. #endif /* PUSH */
  524. #ifndef NOSCRIPT
  525. "script-command",    0, 0,
  526. #else
  527. "script-command",    1, 0,
  528. #endif /* NOSCRIPT */
  529. #ifndef NOSERVER
  530. "server-mode",        0, 0,
  531. #else
  532. "server-mode",        1, 0,
  533. #endif /* NOSERVER */
  534. #ifndef NOSHOW
  535. "show-command",        0, 0,
  536. #else
  537. "show-command",        1, 0,
  538. #endif /* NOSHOW */
  539. #ifndef NOXMIT
  540. "transmit",        0, 0,
  541. #else
  542. "transmit",        1, 0
  543. #endif /* NOXMIT */
  544. };
  545. int nftr = (sizeof(ftrtab) / sizeof(struct keytab));
  546.  
  547. int                    /* CHECK command */
  548. dochk() {
  549.     int x, y;
  550.     if ((y = cmkey(ftrtab,nftr,"","",xxstring)) < 0) return(y);
  551.     if ((x = cmcfm()) < 0) return(x);
  552.     if (msgflg)                /* If at top level... */
  553.       printf(" %svailable\n", y ? "Not a" : "A"); /* Print a message */
  554.     else if (y && !backgrd)        /* Or if not available and in */
  555.       printf(" CHECK: feature not available\n"); /* command file or macro */
  556.     return(success = 1 - y);
  557. }
  558.  
  559. #ifndef MAC
  560. #ifndef NOSETKEY
  561. int
  562. set_key() {                /* SET KEY */
  563.     int y;
  564.     int kc;                /* Key code */
  565.     char *bind;                /* Key binding */
  566.  
  567.     if ((y = cmnum("numeric key code","",10,&kc,xxstring)) < 0)
  568.       return(y);
  569.     if (kc < 0 || kc >= KMSIZE) {
  570.     printf("?key code must be between 0 and %d\n", KMSIZE - 1);
  571.     return(-9);
  572.     }
  573. #ifdef OS2
  574.     wideresult = -1;
  575. #endif /* OS2 */
  576.     if ((y = cmtxt("key definition","",&bind,xxstring)) < 0)
  577.       return(y);
  578.     if (macrotab[kc]) {            /* Possibly free old macro from key */
  579.     free(macrotab[kc]);
  580.     macrotab[kc] = NULL;
  581.     }
  582.     switch (strlen(bind)) {        /* Action depends on length */
  583. #ifdef OS2
  584.       case 0:                /* Reset to default binding */
  585.         keymap[kc] = wideresult == -1 ? kc : 0;   /* or bind to NUL */
  586.     break;
  587.       case 1:                /* Single character */
  588.     keymap[kc] = wideresult == -1 ? (CHAR) *bind : wideresult;
  589.     break;
  590. #else /* Not OS/2 */
  591.       case 0:                /* Reset to default binding */
  592.     keymap[kc] = kc;
  593.     break;
  594.       case 1:                /* Single character */
  595.       keymap[kc] = (CHAR) *bind;
  596.       break;
  597. #endif /* OS2 */
  598.  
  599.       default:                /* Character string */
  600.     keymap[kc] = kc;
  601.     macrotab[kc] = (MACRO) malloc(strlen(bind)+1);
  602.     if (macrotab[kc])
  603.       strcpy((char *) macrotab[kc], bind);
  604.     break;
  605.     }
  606.     return(1);
  607. }
  608. #endif /* NOSETKEY */
  609. #endif /* MAC */
  610.  
  611. /*  D O P R M  --  Set a parameter.  */
  612. /*
  613.  Returns:
  614.   -2: illegal input
  615.   -1: reparse needed
  616.    0: success
  617. */
  618. int
  619. doprm(xx,rmsflg) int xx, rmsflg; {
  620.     int i, x, y = 0, z;
  621.     long zz;
  622.     char *s;
  623.  
  624. switch (xx) {
  625.  
  626. #ifdef SUNX25                /* SET X25 ... */
  627. case XYX25:
  628.     return(setx25());
  629.  
  630. case XYPAD:                /* SET PAD ... */
  631.     return(setpadp());
  632. #endif /* SUNX25 */
  633.  
  634. case XYEOL:    /* These have all been moved to set send/receive... */
  635. case XYLEN:     /* Let the user know what to do. */
  636. case XYMARK:
  637. case XYNPAD:
  638. case XYPADC:
  639. case XYTIMO:
  640.     printf("...Use SET SEND or SET RECEIVE instead.\n");
  641.     printf("Type HELP SET SEND or HELP SET RECEIVE for more info.\n");
  642.     return(success = 0);
  643.  
  644. case XYATTR:                /* File Attribute packets */
  645.     return(setat(rmsflg));
  646.  
  647. case XYIFD:                /* Incomplete file disposition */
  648.     if ((y = cmkey(ifdtab,2,"","discard",xxstring)) < 0) return(y);
  649.     if ((x = cmcfm()) < 0) return(x);
  650.     if (rmsflg) {
  651.     sstate = setgen('S', "310", y ? "1" : "0", "");
  652.     return((int) sstate);
  653.     } else {
  654.     keep = y;
  655.     return(success = 1);
  656.     }
  657.  
  658. #ifndef NOSPL
  659. case XYINPU:                /* SET INPUT */
  660.     return(setinp());
  661. #endif /* NOSPL */
  662.  
  663. #ifdef NETCONN
  664. case XYNET:                /* SET NETWORK */
  665.     if ((z = cmkey(netcmd,nnets,"","tcp/ip",xxstring)) < 0)
  666.       return(z);
  667.     if ((x = cmcfm()) < 0) return(x);
  668.     nettype = z;
  669.     if (
  670.     (nettype != NET_DEC) &&
  671.     (nettype != NET_SX25) &&
  672.         (nettype != NET_TCPB)) {
  673.     printf("?Network type not supported\n");
  674.     return(success = 0);
  675.     } else {
  676.     return(success = 1);
  677.     }
  678. #endif /* NETCONN */
  679.  
  680. case XYHOST:                /* SET HOST or SET LINE */
  681. case XYLINE:
  682.     return(setlin(xx,1));
  683.  
  684. #ifndef MAC
  685. #ifndef NOSETKEY
  686. case XYKEY:                /* SET KEY */
  687.     return(set_key());
  688. #endif /* NOSETKEY */
  689. #endif /* MAC */
  690.  
  691. #ifndef NOCSETS
  692. case XYLANG:                 /* Language */
  693.     if ((y = cmkey(lngtab,nlng,"","none",xxstring)) < 0) /* language code */
  694.       return(y);
  695.     if ((x = cmcfm()) < 0) return(x);    /* And confirmation of command */
  696.  
  697.     /* Look up language and get associated character sets */
  698.     for (i = 0; (i < nlangs) && (langs[i].id != y); i++) ;
  699.     if (i >= nlangs) {
  700.     printf("?internal error, sorry\n");
  701.     return(success = 0);
  702.     }
  703.     language = i;            /* All good, set the language, */
  704.     return(success = 1);
  705. #endif /* NOCSETS */
  706.  
  707. #ifndef MAC
  708. case XYBACK:                /* BACKGROUND */
  709.     if ((z = cmkey(onoff,2,"","",xxstring)) < 0) return(z);
  710.     if ((y = cmcfm()) < 0) return(y);
  711.     bgset = z;
  712.     success = 1;
  713.     bgchk();
  714.     return(success);
  715. #endif /* MAC */
  716.  
  717. case XYQUIE:                /* QUIET */
  718.     return(success = seton(&quiet));
  719.  
  720. case XYBUF: {                /* BUFFERS */
  721. #ifdef DYNAMIC
  722.     int sb, rb;
  723.     if ((y = cmnum("send buffer size","",10,&sb,xxstring)) < 0) {
  724.     if (y == -3) printf("?two numbers required\n");
  725.     return(y);
  726.     }
  727.     if (sb < 80) {
  728.     printf("?too small");
  729.     return(-2);
  730.     }
  731.     if ((y = cmnum("receive buffer size","",10,&rb,xxstring)) < 0)  {
  732.     if (y == -3) printf("?receive buffer size required\n");
  733.     return(y);
  734.     }
  735.     if (rb < 80) {
  736.     printf("?too small");
  737.     return(-2);
  738.     }
  739.     if ((y = cmcfm()) < 0) return(y);
  740.     if ((y = inibufs(sb,rb)) < 0) return(y);
  741.     y = adjpkl(urpsiz,wslotr,bigrbsiz); /* Maybe adjust packet sizes */
  742.     if (y != urpsiz) urpsiz = y;
  743.     y = adjpkl(spsiz,wslotr,bigsbsiz);
  744.     if (y != spsiz) spsiz = spmax = spsizr = y;
  745.     return(success = 1);
  746. #else
  747.     printf("?Sorry, not available\n");
  748.     return(success = 0);
  749. #endif /* DYNAMIC */
  750. }
  751.  
  752. case XYCHKT:                /* BLOCK-CHECK */
  753.     if ((x = cmkey(chktab,4,"","1",xxstring)) < 0) return(x);
  754.     if ((y = cmcfm()) < 0) return(y);
  755.     bctr = x;                 /* Set locally too, even if REMOTE SET */
  756.     if (rmsflg) {
  757.     if (x == 4) {
  758.         tmpbuf[0] = 'B';
  759.         tmpbuf[1] = '\0';
  760.     } else sprintf(tmpbuf,"%d",x);
  761.     sstate = setgen('S', "400", tmpbuf, "");
  762.     return((int) sstate);
  763.     } else {
  764.     return(success = 1);
  765.     }
  766.  
  767. #ifndef MAC
  768. /*
  769.   The Mac has no carrier...
  770. */
  771. case XYCARR:                /* CARRIER */
  772.     if ((y = cmkey(crrtab,ncrr,"","auto",xxstring)) < 0) return(y);
  773.     if (y == CAR_ON) {
  774.     x = cmnum("Carrier wait timeout, seconds","0",10,&z,xxstring);
  775.     if (x < 0) return(z);
  776.     }
  777.     if ((x = cmcfm()) < 0) return(x);
  778.     carrier = ttscarr(y);
  779.     cdtimo = z;
  780.     return(success = 1);
  781. #endif /* MAC */
  782.  
  783. #ifdef TNCODE
  784. case XYTEL:                /* TELNET */
  785.     if ((z = cmkey(tntab,ntn,"parameter for TELNET negotiations", "",
  786.            xxstring)) < 0) return(z);
  787.     switch (z) {
  788.       case CK_TN_EC:            /* ECHO */
  789.     if ((x = cmkey(rltab,nrlt,
  790.                "initial TELNET echoing state","local",xxstring)) < 0)
  791.       return(x);
  792.     if ((y = cmcfm()) < 0) return(y);
  793.     tn_duplex = x;
  794.     return(success = 1);
  795.  
  796.       case CK_TN_TT:            /* TERMINAL TYPE */
  797.     if ((y = cmtxt("terminal type for TELNET connections","",
  798.                &s,xxstring)) < 0)
  799.       return(y);
  800.     if (tn_term) free(tn_term);    /* Free any previous storage */
  801.     if (s == NULL || *s == NUL) {    /* If none given */
  802.         tn_term = NULL;        /* remove the override string */
  803.         return(success = 1);
  804.     } else if (tn_term = malloc(strlen(s)+1)) { /* Make storage for new */
  805.         strcpy(tn_term,s);        /* Copy string into new storage */
  806.         return(success = 1);
  807.     } else return(success = 0);
  808.  
  809.       case CK_TN_NL:            /* NEWLINE-MODE */
  810.     return(success = seton(&tn_nlm));
  811.  
  812.       default:
  813.     return(-2);
  814.     }
  815. #endif /* TNCODE */
  816.  
  817. default:
  818.     break;
  819. }
  820.  
  821. switch (xx) {
  822. #ifndef NOSPL
  823. case XYCOUN:                /* SET COUNT */
  824.     x = cmnum("Positive number","0",10,&z,xxstring);
  825.     if (x < 0) return(x);
  826.     if ((x = cmcfm()) < 0) return(x);
  827.     if (z < 0) {
  828.     printf("?A positive number, please\n");
  829.     return(0);
  830.     }
  831.     debug(F101,"XYCOUN: z","",z);
  832.     return(success = setnum(&count[cmdlvl],z,0,10000));
  833. #endif /* NOSPL */
  834.  
  835. #ifndef NOSPL
  836. case XYCASE:
  837.     return(success = seton(&incase[cmdlvl]));
  838. #endif /* NOSPL */
  839.  
  840. case XYCMD:                /* COMMAND ... */
  841.     if ((y = cmkey(byttab,nbytt,"","bytesize",xxstring)) < 0) return(y);
  842.     if ((y = cmnum("bytesize for command characters, 7 or 8","7",10,&x,
  843.            xxstring)) < 0)
  844.       return(y);
  845.     if (x != 7 && x != 8) {
  846.     printf("\n?The choices are 7 and 8\n");
  847.     return(success = 0);
  848.     }
  849.     if ((y = cmcfm()) < 0) return(y);
  850.     if (x == 7) cmdmsk = 0177;
  851.     else if (x == 8) cmdmsk = 0377;
  852.     return(success = 1);
  853.     
  854. case XYDFLT:                /* SET DEFAULT = CD */
  855.     return(success = docd());
  856.  
  857. case XYDEBU:                /* SET DEBUG { on, off, session } */
  858.     if ((y = cmkey(dbgtab,ndbg,"","",xxstring)) < 0) return(y);
  859.     if ((x = cmcfm()) < 0) return(x);
  860.     switch (y) {
  861.       case 0:                /* 0 = all debugging off. */
  862.     debses = 0;
  863. #ifdef DEBUG
  864.     if (deblog) doclslog(LOGD);
  865. #endif /* DEBUG */
  866.         return(success = 1);
  867.  
  868.       case 1:                /* 1 = log debugging to debug.log */
  869. #ifdef DEBUG
  870.     deblog = debopn("debug.log", 0);
  871.     return(success = deblog ? 1 : 0);
  872. #else
  873.     printf("?Sorry, debug log feature not enabled\n");
  874.     return(success = 0);
  875. #endif /* DEBUG */
  876.  
  877.       case 2:                /* 2 = session. */
  878.     return(success = debses = 1);
  879.     }
  880.  
  881. case XYDELA:                /* SET DELAY */
  882.     y = cmnum("Number of seconds before starting to send","5",10,&x,xxstring);
  883.     if (x < 0) x = 0;
  884.     return(success = setnum(&delay,x,y,999));
  885.  
  886. default:
  887.     break;
  888. }
  889.  
  890. switch (xx) {
  891.  
  892. #ifndef NODIAL
  893. case XYDIAL:                /* SET DIAL */
  894.     return(setdial());
  895. #endif /* NODIAL */
  896.  
  897. #ifdef COMMENT                /* Unused at present */
  898. case XYDOUB:
  899.     if ((x = cmfld("Character to double","none",&s,xxstring)) < 0) {
  900.     if (x == -3) {
  901.         dblchar = -1;
  902.         if (msgflg) printf("Doubling Off\n");
  903.         return(success = 1);
  904.     } else return(x);
  905.     }
  906.     strcpy(line,s);
  907.     lp = line;
  908.     if ((x = cmcfm()) < 0) return(x);
  909.     if (!xxstrcmp(lp,"none",4)) {
  910.     dblchar = -1;
  911.     if (msgflg) printf("Doubling Off\n");
  912.     return(success = 1);
  913.     }
  914.     if ((int)strlen(lp) != 1) return(-2);
  915.     dblchar = *lp & 0xFF;
  916.     if (msgflg) printf("Doubled: %d\n",dblchar);
  917.     return(success = 1);
  918. #endif /* COMMENT */
  919.  
  920. case XYDUPL:                /* SET DUPLEX */
  921.     if ((y = cmkey(dpxtab,2,"","full",xxstring)) < 0) return(y);
  922.     if ((x = cmcfm()) < 0) return(x);
  923.     duplex = y;
  924.     return(success = 1);
  925.  
  926. case XYLCLE:                /* LOCAL-ECHO (= DUPLEX) */
  927.     return(success = seton(&duplex));
  928.  
  929. case XYESC:                /* SET ESCAPE */
  930.     sprintf(tmpbuf,"%d",DFESC);
  931.     y = cmnum("Decimal ASCII code for CONNECT-mode escape character",
  932.           tmpbuf, 10,&x,xxstring);
  933.     success = setcc(&escape,x,y);
  934. #ifdef COMMENT
  935. /* This is what SHOW ESCAPE is for. */
  936.     if (success && msgflg)
  937.       printf(" CONNECT-mode escape character: %d (Ctrl-%c, %s)\n",
  938.          escape,ctl(escape),(escape == 127 ? "DEL" : ccntab[escape]));
  939. #endif /* COMMENT */
  940.     return(success);
  941.  
  942. default:
  943.     break;
  944. }
  945.  
  946. switch (xx) {
  947. case XYFILE:                /* SET FILE */
  948.     return(setfil(rmsflg));
  949.  
  950. case XYFLOW:                /* FLOW-CONTROL */
  951. /*
  952.   Note: flotab[] keyword table (defined above) only includes the legal 
  953.   flow-control options for each implementation, controlled by symbols
  954.   defined in ckcdeb.h.
  955. */
  956.     if ((y = cmkey(flotab,nflo,"","xon/xoff",xxstring)) < 0) return(y);
  957.     if ((x = cmcfm()) < 0) return(x);
  958.     flow = y;
  959.     debug(F101,"set flow","",flow);
  960.     return(success = 1);
  961.  
  962. case XYHAND:                /* HANDSHAKE */
  963.     if ((y = cmkey(hshtab,nhsh,"","none",xxstring)) < 0) return(y);
  964.     if (y == 998) {
  965.     if ((x = cmnum("ASCII value","",10,&y,xxstring)) < 0)
  966.       return(x);
  967.     if ((y < 1) || ((y > 31) && (y != 127))) {
  968.         printf("?Character must be in ASCII control range\n");
  969.         return(-9);
  970.     }
  971.     }
  972.     if ((x = cmcfm()) < 0) return(x);
  973.     turn = (y > 0127) ? 0 : 1 ;
  974.     turnch = y;
  975.     return(success = 1);
  976.  
  977. #ifndef NOSPL
  978. case XYMACR:                /* SET MACRO */
  979.     if ((y = cmkey(smactab,2,"","",xxstring)) < 0) return(y);
  980.     switch (y) {
  981.       case 0: return(success = seton(&mecho));
  982.       case 1: return(success = seton(&merror[cmdlvl]));
  983.       default: return(-2);
  984.     }
  985. #endif /* NOSPL */
  986.  
  987. #ifndef NODIAL
  988. case XYMODM:                /* SET MODEM */
  989.     if ((x = cmkey(mdmtab,nmdm,"type of modem","none", xxstring)) < 0)
  990.     return(x);
  991.     if ((z = cmcfm()) < 0) return(z);
  992.     mdmtyp = x;
  993. #ifndef MINIDIAL
  994.     tbmodel = 0;          /* If it's a Telebit, we don't know the model yet */
  995. #endif /* MINIDIAL */
  996.     return(success = 1);
  997. #endif /* NODIAL */
  998.  
  999.   case XYMSGS:
  1000. #ifdef VMS
  1001.     if ((z = cmkey(onoff,2,"","",xxstring)) < 0) return(z);
  1002.     if ((y = cmcfm()) < 0) return(y);
  1003.     vms_msgs = z;
  1004.     printf("Sorry, SET MESSAGES not implemented yet\n");
  1005.     return(success = 0);
  1006. #endif /* VMS */
  1007. default:
  1008.     break;
  1009. }
  1010.  
  1011. switch (xx) {
  1012.     
  1013. case XYPARI:                /* PARITY */
  1014.     if ((y = cmkey(partab,npar,"","none",xxstring)) < 0) return(y);
  1015.     if ((x = cmcfm()) < 0) return(x);
  1016.  
  1017. /* If parity not none, then we also want 8th-bit prefixing */
  1018.  
  1019.     if (parity = y) ebqflg = 1; else ebqflg = 0;
  1020.     return(success = 1);
  1021.  
  1022. #ifndef NOFRILLS
  1023. case XYPROM:                /* SET PROMPT */
  1024. /*
  1025.   Note: xxstring not invoked here.  Instead, it is invoked every time the
  1026.   prompt is issued.  This allows the prompt string to contain variables
  1027.   that can change, like \v(dir), \v(time), etc.
  1028. */
  1029. #ifdef MAC
  1030.     if ((x = cmtxt("Program's command prompt","Mac-Kermit>",&s,NULL)) < 0)
  1031. #else
  1032.     if ((x = cmtxt("Program's command prompt","C-Kermit>",&s,NULL)) < 0)
  1033. #endif /* MAC */
  1034.       return(x);
  1035.     if (*s == '{') {            /* Remove enclosing braces, if any */
  1036.     x = (int)strlen(s);
  1037.     if (s[x-1] == '}') {
  1038.         s[x-1] = NUL;
  1039.         s++;
  1040.     }
  1041.     }
  1042. #ifdef COMMENT
  1043. /*
  1044.   Let's not do this any more -- we don't do it anywhere else.
  1045. */
  1046.     else if (*s == '"') {        /* For compatibility with pre-5A */
  1047.     x = (int)strlen(s);
  1048.     if (s[x-1] == '"') {
  1049.         s[x-1] = NUL;
  1050.         s++;
  1051.     }
  1052.     }
  1053. #endif /* COMMENT */
  1054.     cmsetp(s);                /* Set the prompt */
  1055.     return(success = 1);
  1056. #endif /* NOFRILLS */
  1057.  
  1058. case XYRETR:                /* RETRY: per-packet retry limit */
  1059.     y = cmnum("Maximum retries per packet","10",10,&x,xxstring);
  1060.     if (x < 0) x = 0;
  1061.     if ((x = setnum(&maxtry,x,y,999)) < 0) return(x);
  1062.     if (maxtry <= wslotr) {
  1063.     printf("?Retry limit must be greater than window size\n");
  1064.     return(success = 0);
  1065.     }
  1066.     sprintf(tmpbuf,"%d",maxtry);
  1067.     if (rmsflg) {
  1068.     sstate = setgen('S', "403", tmpbuf, "");
  1069.     return((int) sstate);
  1070.     } else return(success = x);
  1071.  
  1072. #ifndef NOSERVER
  1073. case XYSERV:                /* SET SERVER items */
  1074.     if ((y = cmkey(srvtab,2,"","",xxstring)) < 0) return(y);
  1075.     switch (y) {
  1076.       case XYSERT:
  1077.     tp = tmpbuf;
  1078.         sprintf(tp,"%d",DSRVTIM);
  1079.     if ((y = cmnum("interval for server NAKs, 0 = none",tp,10,&x,
  1080.                xxstring)) < 0)
  1081.       return(y);
  1082.     if (x < 0) {
  1083.         printf("\n?Specify a positive number, or 0 for no server NAKs\n");
  1084.         return(0);
  1085.     }
  1086.     if ((y = cmcfm()) < 0) return(y);
  1087.     sprintf(tp,"%d",x);
  1088.     if (rmsflg) {
  1089.         sstate = setgen('S', "404", tp, "");
  1090.         return((int) sstate);
  1091.     } else {
  1092.         srvtim = x;            /* Set the server timeout variable */
  1093.         return(success = 1);
  1094.     }
  1095.       case XYSERD:            /* SERVER DISPLAY */
  1096.     return(success = seton(&srvdis)); /* ON or OFF... */
  1097.       default:
  1098.     return(-2);
  1099.     }
  1100. #endif /* NOSERVER */
  1101.  
  1102. #ifdef UNIX
  1103. #ifndef NOJC
  1104. case XYSUSP:                /* SET SUSPEND */
  1105.     seton(&suspend);            /* on or off... */
  1106.     return(success = 1);
  1107. #endif /* NOJC */
  1108. #endif /* UNIX */
  1109.  
  1110. case XYTAKE:                /* SET TAKE */
  1111.     if ((y = cmkey(taktab,4,"","",xxstring)) < 0) return(y);
  1112.     switch (y) {
  1113.       case 0: return(success = seton(&techo));
  1114. #ifndef NOSPL
  1115.       case 1: return(success = seton(&terror[cmdlvl]));
  1116. #else
  1117.       case 1: return(success = seton(&terror[tlevel]));
  1118. #endif /* NOSPL */
  1119.       case 2: techo = 0; return(success = 1); /* For compatibility with */
  1120.       case 3: techo = 1; return(success = 1); /* MS-DOS Kermit */
  1121.       default: return(-2);
  1122.     }
  1123.  
  1124. #ifndef NOSCRIPT
  1125. case XYSCRI:                /* SET SCRIPT */
  1126.     if ((y = cmkey(scrtab,1,"","echo",xxstring)) < 0) return(y);
  1127.     switch (y) {
  1128.       case 0: return(success = seton(&secho));
  1129.       default: return(-2);
  1130.     }
  1131. #endif /* NOSCRIPT */
  1132.  
  1133. default:
  1134.     break;
  1135. }
  1136.  
  1137. switch (xx) {
  1138. case XYTERM:                /* SET TERMINAL */
  1139.     return(settrm());
  1140.  
  1141. default:
  1142.     break;
  1143. }
  1144.  
  1145. switch (xx) {
  1146.  
  1147. /* SET SEND/RECEIVE protocol parameters. */
  1148.  
  1149. case XYRECV:
  1150. case XYSEND:
  1151.     return(setsr(xx,rmsflg));
  1152.  
  1153. #ifdef UNIX
  1154. case XYSESS:                /* SESSION-LOG */
  1155.     if ((x = cmkey(fttab,2,"type of file","text",xxstring)) < 0)
  1156.       return(x);
  1157.     if ((y = cmcfm()) < 0) return(y);
  1158.     sessft = x;
  1159.     return(success = 1);
  1160. #endif /* UNIX */
  1161.  
  1162. case XYSPEE:                /* SET SPEED */
  1163.     if (network) {
  1164.     printf("\n?Speed cannot be set for network connections\n");
  1165.     return(success = 0);
  1166.     }
  1167.     lp = line;
  1168.     sprintf(lp,"Transmission rate for %s in bits per second",ttname);
  1169.  
  1170.     if ((x = cmkey(spdtab,nspd,line,"",xxstring)) < 0) {
  1171.     if (x == -3) printf("?value required\n");
  1172.     return(x);
  1173.     }
  1174.     if ((y = cmcfm()) < 0) return(y);
  1175.     if (!local) {
  1176.     printf("?Sorry, you must SET LINE first\n");
  1177.     return(success = 0);
  1178.     }
  1179.     zz = (long) x * 10L;
  1180.     if (zz == 70) zz = 75;        /* (see spdtab[] def) */
  1181.     if (ttsspd(x) < 0)  {        /* Call ttsspd with cps, not bps! */
  1182.     printf("?Unsupported line speed - %ld\n",zz);
  1183.     return(success = 0);
  1184.     } else {
  1185.     speed = zz;
  1186.     if (pflag &&
  1187. #ifndef NOSPL
  1188.         cmdlvl == 0
  1189. #else
  1190.         tlevel < 0
  1191. #endif /* NOSPL */
  1192.         ) {
  1193.         if (speed == 8880)
  1194.           printf("%s, 75/1200 bps\n",ttname);
  1195.         else
  1196.           printf("%s, %ld bps\n",ttname,speed);
  1197.     }
  1198.     return(success = 1);
  1199.     }
  1200.  
  1201.   case XYXFER:                /* SET TRANSFER */
  1202.     if ((y = cmkey(tstab,nts,"","character-set",xxstring)) < 0) return(y);
  1203. #ifndef NOCSETS
  1204.     if (y == 1) {            /* character-set */
  1205.     if ((y = cmkey(tcstab,ntcs,"","transparent",xxstring)) < 0) return(y);
  1206.     if ((x = cmcfm()) < 0) return(x);
  1207.     if (rmsflg) {
  1208.         sstate = setgen('S', "405", tcsinfo[y].designator, "");
  1209.         return((int) sstate);
  1210.     } else {
  1211.         tslevel = (y == TC_TRANSP) ? 0 : 1; /* transfer syntax level */
  1212.         tcharset = y;        /* transfer character set */
  1213.         return(success = 1);
  1214.     }
  1215.     } else
  1216. #endif /* NOCSETS */
  1217.       if (y == 2) {            /* LOCKING-SHIFT options */
  1218.       if ((y = cmkey(lstab,nls,"","on",xxstring)) < 0)
  1219.         return(y);
  1220.       if ((x = cmcfm()) < 0) return(x);
  1221.       lscapr = (y == 1) ? 1 : 0;    /* ON: requested = 1 */
  1222.       lscapu = (y == 2) ? 2 : 0;    /* FORCED:  used = 1 */
  1223.       return(success = 1);
  1224.       } else return(-2);
  1225.  
  1226. #ifndef NOXMIT
  1227.   case XYXMIT:                /* SET TRANSMIT */
  1228.     return(setxmit());
  1229. #endif /* NOXMIT */
  1230.  
  1231. #ifndef NOCSETS
  1232.   case XYUNCS:                /* UNKNOWN-CHARACTER-SET */
  1233.     if ((y = cmkey(ifdtab,2,"","discard",xxstring)) < 0) return(y);
  1234.     if ((x = cmcfm()) < 0) return(x);
  1235.     unkcs = y;
  1236.     return(success = 1);
  1237. #endif /* NOCSETS */
  1238.  
  1239. #ifdef UNIX
  1240.   case XYWILD:                /* WILDCARD-EXPANSION */
  1241.     if ((y = cmkey(wildtab,2,"who expands wildcards","kermit",xxstring)) < 0)
  1242.       return(y);
  1243.     if ((x = cmcfm()) < 0) return(x);
  1244.     wildxpand = y;
  1245.     return(success = 1);
  1246. #endif /* UNIX */
  1247.  
  1248.   case XYWIND:                /* WINDOW-SLOTS */
  1249.     y = cmnum("Number of sliding-window slots, 1 to 31","1",10,&x,xxstring);
  1250.     y = setnum(&z,x,y,31);
  1251.     if (y < 0) return(y);
  1252.     if (z < 1) z = 1;
  1253. #ifdef COMMENT
  1254.     /* This is unreasonable */
  1255.     if (maxtry < z) {
  1256.     printf("?Window slots must be less than retry limit\n");
  1257.     return(success = 0);
  1258.     }
  1259. #endif /* COMMENT */
  1260.     if (rmsflg) {            /* Set remote window size */
  1261.     tp = tmpbuf;
  1262.     sprintf(tp,"%d",z);
  1263.     sstate = setgen('S', "406", tp, "");
  1264.     return((int) sstate);
  1265.     }
  1266.     wslotr = z;                /* Set local window size */
  1267.     swcapr = (wslotr > 1) ? 1 : 0;    /* Set window bit in capas word? */
  1268.     if (wslotr > 1) {            /* Window size > 1? */
  1269.     y = adjpkl(urpsiz,wslotr,bigrbsiz); /* Maybe adjust packet size */
  1270.     if (y != urpsiz) {        /* Did it change? */
  1271.         urpsiz = y;
  1272.         if (msgflg)
  1273.         printf(
  1274. " Adjusting receive packet-length to %d for %d window slots\n",
  1275.            urpsiz, wslotr);
  1276.     }
  1277.     }
  1278.     return(success = 1);
  1279.  
  1280. default:
  1281.     if ((x = cmcfm()) < 0) return(x);
  1282.     printf("Not working yet - %s\n",cmdbuf);
  1283.     return(success = 0);
  1284.     }
  1285. }
  1286. #endif /* NOICP */
  1287.