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

通讯/手机编程

开发平台:

Windows_Unix

  1. #include "ckcsym.h" /* Symbol definitions */
  2. #ifndef NOICP
  3. /*  C K U U S 3 --  "User Interface" for C-Kermit, part 3  */
  4. /*
  5.   Author: Frank da Cruz <fdc@columbia.edu>,
  6.   Columbia University Academic Information Systems, New York City.
  7.   Copyright (C) 1985, 2000,
  8.     Trustees of Columbia University in the City of New York.
  9.     All rights reserved.  See the C-Kermit COPYING.TXT file or the
  10.     copyright text in the ckcmai.c module for disclaimer and permissions.
  11. */
  12. /*  SET command (but much material has been split off into ckuus7.c). */
  13. /*
  14.   Kermit-specific includes.
  15.   Definitions here supersede those from system include files.
  16. */
  17. #include "ckcdeb.h" /* Debugging & compiler things */
  18. #include "ckcasc.h" /* ASCII character symbols */
  19. #include "ckcker.h" /* Kermit application definitions */
  20. #include "ckcxla.h" /* Character set translation */
  21. #include "ckcnet.h" /* Network symbols */
  22. #ifdef CK_AUTHENTICATION
  23. #include "ckuath.h"
  24. #endif /* CK_AUTHENTICATION */
  25. #ifdef CK_SSL
  26. #include "ck_ssl.h"
  27. #endif /* CK_SSL */
  28. #include "ckuusr.h" /* User interface symbols */
  29. #ifdef OS2
  30. #ifdef CK_NETBIOS
  31. #include <os2.h>
  32. #ifdef COMMENT /* Would you believe */
  33. #undef COMMENT /* <os2.h> defines this ? */
  34. #endif /* COMMENT */
  35. #include "ckonbi.h"
  36. extern UCHAR NetBiosAdapter;
  37. #endif /* CK_NETBIOS */
  38. #include "ckocon.h"
  39. #include "ckokey.h"
  40. extern unsigned char colorcmd; /* Command-screen colors */
  41. extern struct keytab ttyclrtab[];
  42. extern int nclrs;
  43. extern int tt_cols[], tt_rows[], tt_szchng[];
  44. _PROTOTYP(int setprty, (void));
  45. extern char startupdir[], exedir[];
  46. extern int tt_modechg;
  47. #ifdef NT
  48. #include <windows.h>
  49. #include <tapi.h>
  50. #include "ckntap.h" /* Microsoft TAPI */
  51. #endif /* NT */
  52. #endif /* OS2 */
  53. #ifdef CK_RECALL
  54. extern int cm_retry;
  55. #endif /* CK_RECALL */
  56. extern int cmdint;
  57. extern int srvidl;
  58. #ifndef NOPUSH
  59. #ifndef NOFRILLS
  60. #ifdef VMS
  61. char editor[CKMAXPATH + 1] = "edit";
  62. #else
  63. char editor[CKMAXPATH + 1] = { NUL, NUL };
  64. #endif /* VMS */
  65. char editopts[128] = { NUL, NUL };
  66. char editfile[CKMAXPATH + 1] = { NUL, NUL };
  67. #ifdef BROWSER
  68. char browser[CKMAXPATH + 1] = { NUL, NUL };
  69. char browsopts[128] = { NUL, NUL };
  70. char browsurl[4096] = { NUL, NUL };
  71. #endif /* BROWSER */
  72. #endif /*  NOFRILLS */
  73. #endif /* NOPUSH */
  74. /* Variables */
  75. int cmd_quoting = 1;
  76. extern int hints;
  77. #ifdef CK_KERBEROS
  78. char * k4pwprompt = NULL; /* Kerberos 4 password prompt */
  79. char * k4prprompt = NULL; /* Kerberos 4 principal prompt */
  80. char * k5pwprompt = NULL; /* Kerberos 5 password prompt */
  81. char * k5prprompt = NULL; /* Kerberos 5 principal prompt */
  82. #endif /* CK_KERBEROS */
  83. #ifdef CK_SRP
  84. char * srppwprompt = NULL;
  85. #endif /* CK_SRP */
  86. extern char * ckprompt, * ikprompt; /* Default prompt */
  87. extern xx_strp xxstring;
  88. extern char * cdmsgfile[], * cdmsgstr;
  89. extern int
  90.   local, server, success, dest, sleepcan, inserver, flow, autoflow, binary,
  91.   parity, escape, what, turn, duplex, backgrd, hwparity, stopbits, turnch,
  92.   mdmtyp, network, quiet, nettype, carrier, debses, debtim, cdtimo, nlangs,
  93.   bgset, pflag, msgflg, cmdmsk, suspend, techo, pacing, xitwarn, xitsta,
  94.   outesc, cmd_cols, cmd_rows, ckxech, xaskmore, haveline, didsetlin, isguest;
  95. #ifndef NOSERVER
  96.   extern int en_pri;
  97. #endif /* NOSERVER */
  98. #ifdef IKSDCONF
  99. extern int iksdcf;
  100. #endif /* IKSDCONF */
  101. #ifdef TCPSOCKET
  102.   extern int tn_exit;
  103. #endif /* TCPSOCKET */
  104. #ifdef TNCODE
  105.   char * tn_pr_uid = NULL;
  106. #endif /* TNCODE */
  107.   extern int exitonclose;
  108. #ifndef NOKVERBS
  109. extern int nkverbs;
  110. extern struct keytab kverbs[];
  111. #endif /* NOKVERBS */
  112. extern int ttnproto; /* Network protocol */
  113. extern char *ccntab[]; /* Names of control chars */
  114. #ifdef CK_APC
  115. extern int apcactive, apcstatus;
  116. #endif /* CK_APC */
  117. #ifndef NOSCRIPT
  118. extern int secho; /* Whether SCRIPT cmd should echo */
  119. #endif /* NOSCRIPT */
  120. #ifdef DCMDBUF
  121. extern char *atmbuf, *atxbuf;
  122. #else
  123. extern char atmbuf[], atxbuf[];
  124. #endif /* DCMDBUF */
  125. extern int cmflgs;
  126. extern char psave[];
  127. extern char uidbuf[];
  128. extern int  sl_uid_saved;
  129. int DeleteStartupFile = 0;
  130. extern int cmdlvl; /* Overall command level */
  131. #ifndef NOSPL
  132. _PROTOTYP( static int parsdir, (int) );
  133. char pwbuf[PWBUFL+1]  = { NUL, NUL };
  134. int pwflg = 0;
  135. int pwcrypt = 0;
  136. char prmbuf[PWBUFL+1] = { NUL, NUL };
  137. int fndiags = 1; /* Function diagnostics on/off */
  138. int fnerror = 1; /* Function error treatment */
  139. #ifdef DCMDBUF
  140. extern int *count, *takerr, *merror, *inpcas;
  141. #else
  142. extern int count[], takerr[], merror[], inpcas[];
  143. #endif /* DCMDBUF */
  144. extern int mecho; /* Macro echo */
  145. extern long ck_alarm;
  146. extern char alrm_date[], alrm_time[];
  147. #else
  148. extern int takerr[];
  149. #endif /* NOSPL */
  150. extern int x_ifnum;
  151. extern int bigsbsiz, bigrbsiz; /* Packet buffers */
  152. extern long speed; /* Terminal speed */
  153. extern char ttname[]; /* Communication device name */
  154. extern char myhost[] ;
  155. extern char inidir[]; /* Ini File directory */
  156. #ifndef NOSETKEY
  157. extern KEY *keymap; /* Character map for SET KEY (1:1)  */
  158. extern MACRO *macrotab; /* Macro map for SET KEY (1:string) */
  159. #ifdef OS2
  160. int wideresult; /* For SET KEY, wide OS/2 scan codes */
  161. extern int tt_scrsize[]; /* Scrollback buffer Sizes */
  162. #endif /* OS2 */
  163. #endif /* NOSETKEY */
  164. /* Printer settings */
  165. extern char * printername; /* NULL if printer not redirected */
  166. extern int printpipe;
  167. extern int noprinter;
  168. #ifdef PRINTSWI
  169. int printtimo = 0;
  170. char * printterm = NULL;
  171. char * printsep = NULL;
  172. int printertype = 0;
  173. #ifdef BPRINT
  174. int printbidi = 0; /* SET BPRINTER (bidirectional) */
  175. long pportspeed = 0L; /* Bidirection printer port speed, */
  176. int pportparity = 0; /*  parity, */
  177. int pportflow = FLO_KEEP; /*  and flow control */
  178. #endif /* BPRINT */
  179. #ifdef OS2
  180. extern int txt2ps;                      /* Text2PS conversion? */
  181. extern int ps_width, ps_length;         /* Text2PS dimensions */
  182. #endif /* OS2 */
  183. #endif /* PRINTSWI */
  184. #ifdef OS2
  185. extern int tcp_avail; /* Nonzero if TCP/IP is available */
  186. #ifdef DECNET
  187. extern int dnet_avail; /* Ditto for DECnet */
  188. #endif /* DECNET */
  189. #ifdef SUPERLAT
  190. extern int slat_avail;
  191. #endif /* SUPERLAT */
  192. #endif /* OS2 */
  193. static struct keytab logintab[] = {
  194.     "password", LOGI_PSW, CM_INV,
  195.     "prompt",   LOGI_PRM, CM_INV,
  196.     "userid",   LOGI_UID, 0
  197. };
  198. #ifndef NOCSETS
  199. /* system-independent character sets, defined in ckcxla.[ch] */
  200. extern struct csinfo tcsinfo[];
  201. extern struct langinfo langs[];
  202. /* Other character-set related variables */
  203. extern int tcharset, tslevel, language;
  204. #endif /* NOCSETS */
  205. /* File-transfer variable declarations */
  206. #ifndef NOXFER
  207. #ifdef CK_AUTODL
  208. extern int cmdadl;
  209. #endif /* CK_AUTODL */
  210. #ifndef NOSERVER
  211. extern int ngetpath;
  212. extern char * getpath[];
  213. #endif /* NOSERVER */
  214. #ifdef PATTERNS
  215. extern int patterns;
  216. #endif /* PATTERNS */
  217. extern struct ck_p ptab[];
  218. extern CHAR sstate; /* Protocol start state */
  219. extern CHAR myctlq; /* Control-character prefix */
  220. extern CHAR myrptq; /* Repeat-count prefix */
  221. extern int protocol, size, spsiz, spmax, urpsiz, srvtim, srvcdmsg, slostart,
  222.   srvdis, xfermode, ckdelay, keep, maxtry, unkcs, bctr, ebqflg, swcapr,
  223.   wslotr, lscapr, lscapu, spsizr, rptena, rptmin, docrc, xfrcan, xfrchr,
  224.   xfrnum, xfrbel, xfrint, srvping, g_xfermode;
  225. #ifdef PIPESEND
  226. extern int usepipes;
  227. #endif /* PIPESEND */
  228. #ifdef CKXXCHAR /* DOUBLE / IGNORE char table */
  229. extern int dblflag, ignflag, dblchar;
  230. extern short dblt[];
  231. #endif /* CKXXCHAR */
  232. #ifdef CK_SPEED
  233. extern short ctlp[]; /* Control-prefix table */
  234. extern int prefixing;
  235. static struct keytab pfxtab[] = {
  236.     "all",         PX_ALL, 0,
  237.     "cautious",    PX_CAU, 0,
  238.     "minimal",     PX_WIL, 0,
  239.     "none",        PX_NON, CM_INV
  240. };
  241. #endif /* CK_SPEED */
  242. #endif /* NOXFER */
  243. /* Declarations from cmd package */
  244. #ifdef DCMDBUF
  245. extern char *cmdbuf; /* Command buffer */
  246. extern char *line;
  247. extern char *tmpbuf;
  248. #else
  249. extern char cmdbuf[]; /* Command buffer */
  250. extern char line[]; /* Character buffer for anything */
  251. extern char tmpbuf[];
  252. #endif /* DCMDBUF */
  253. /* From main ckuser module... */
  254. extern char *tp, *lp; /* Temporary buffer */
  255. extern int tlevel; /* Take Command file level */
  256. #ifndef NOLOCAL
  257. #ifdef OS2ORUNIX
  258. extern int sessft; /* Session-log file type */
  259. #else
  260. #ifdef OSK
  261. extern int sessft;
  262. #endif /* OSK */
  263. #endif /* UNIX */
  264. #endif /* NOLOCAL */
  265. char * tempdir = NULL;
  266. #ifdef VMS
  267. int vms_msgs = 1; /* SET MESSAGES */
  268. extern int batch;
  269. #endif /* VMS */
  270. /* Keyword tables for SET commands */
  271. #ifdef CK_SPEED
  272. struct keytab ctltab[] = {
  273.     "prefixed",   1, 0, /* Note, the values are important. */
  274.     "unprefixed", 0, 0
  275. };
  276. #endif /* CK_SPEED */
  277. static struct keytab oldnew[] = {
  278.     "new", 0, 0,
  279.     "old", 1, 0
  280. };
  281. #ifndef NOSPL
  282. static struct keytab functab[] = {
  283.     "diagnostics", FUNC_DI, 0,
  284.     "error",       FUNC_ER, 0
  285. };
  286. static int nfunctab = (sizeof(functab) / sizeof(struct keytab));
  287. struct keytab outptab[] = { /* SET OUTPUT parameters */
  288.     "pacing", 0, 0, /* only one so far... */
  289.     "special-escapes", 1, 0
  290. };
  291. int noutptab = (sizeof(outptab) / sizeof(struct keytab)); /* How many */
  292. #endif /* NOSPL */
  293. struct keytab chktab[] = { /* Block check types */
  294.     "1", 1, 0, /* 1 =  6-bit checksum */
  295.     "2", 2, 0, /* 2 = 12-bit checksum */
  296.     "3", 3, 0, /* 3 = 16-bit CRC */
  297.     "4", 4, CM_INV, /* Same as B */
  298.     "blank-free-2", 4, 0 /* B = 12-bit checksum, no blanks */
  299. };
  300. struct keytab rpttab[] = { /* SET REPEAT */
  301.     "counts",    0, 0, /* On or Off */
  302. #ifdef COMMENT
  303.     "minimum",   1, 0, /* Threshhold */
  304. #endif /* COMMENT */
  305.     "prefix",    2, 0 /* Repeat-prefix character value */
  306. };
  307. #ifndef NOLOCAL
  308. /* For SET [ MODEM ] CARRIER, and also for SET DIAL CONNECT */
  309. struct keytab crrtab[] = {
  310.     "automatic", CAR_AUT, 0, /* 2 */
  311.     "off",       CAR_OFF, 0, /* 0 */
  312.     "on",        CAR_ON,  0 /* 1 */
  313. };
  314. int ncrr = 3;
  315. #endif /* NOLOCAL */
  316. struct keytab ooatab[] = { /* On/Off/Auto table */
  317.     "automatic", SET_AUTO, 0, /* 2 */
  318.     "off",       SET_OFF,  0, /* 0 */
  319.     "on",        SET_ON,   0 /* 1 */
  320. };
  321. struct keytab qvtab[] = { /* Quiet/Verbose table */
  322.     "quiet", 1, 0,
  323.     "verbose", 0, 0
  324. };
  325. int nqvt = 2;
  326. /* For SET DEBUG */
  327. struct keytab dbgtab[] = {
  328.     "off",        0,  0,
  329.     "on",         1,  0,
  330.     "session",    2,  0,
  331.     "timestamps", 3,  0
  332. };
  333. int ndbg = 4;
  334. #ifndef NOLOCAL
  335. /* Transmission speeds */
  336. #ifdef TTSPDLIST /* Speed table constructed at runtime . . . */
  337. struct keytab * spdtab = NULL;
  338. int nspd = 0;
  339. #else
  340. /*
  341.   Note, the values are encoded in cps rather than bps because 19200 and higher
  342.   are too big for some ints.  All but 75bps are multiples of ten.  Result of
  343.   lookup in this table must be multiplied by 10 to get actual speed in bps.
  344.   If this number is 70, it must be changed to 75.  If it is 888, this means
  345.   75/1200 split speed.
  346.   The values are generic, rather than specific to UNIX.  We can't use B75,
  347.   B1200, B9600, etc, because non-UNIX versions of C-Kermit will not
  348.   necessarily have these symbols defined.  The BPS_xxx symbols are
  349.   Kermit-specific, and are defined in ckcdeb.h or on the CC command line.
  350.   Like all other keytabs, this one must be in "alphabetical" order,
  351.   rather than numeric order.
  352. */
  353. struct keytab spdtab[] = {
  354.     "0",      0,  CM_INV,
  355.     "110",   11,  0,
  356. #ifdef BPS_115K
  357.  "115200",11520,  0,
  358. #endif /* BPS_115K */
  359.   "1200",   120,  0,
  360. #ifdef BPS_134
  361.   "134.5",  134,  0,
  362. #endif /* BPS_134 */
  363. #ifdef BPS_14K
  364.   "14400", 1440,  0,
  365. #endif /* BPS_14K */
  366. #ifdef BPS_150
  367.   "150",     15,  0,
  368. #endif /* BPS_150 */
  369. #ifdef BPS_1800
  370.   "1800",     180,  0,
  371. #endif /* BPS_150 */
  372. #ifdef BPS_19K
  373.   "19200", 1920,  0,
  374. #endif /* BPS_19K */
  375. #ifdef BPS_200
  376.   "200",     20,  0,
  377. #endif /* BPS_200 */
  378. #ifdef BPS_230K
  379.   "230400", 23040, 0,
  380. #endif /* BPS_230K */
  381.   "2400",   240,  0,
  382. #ifdef BPS_28K
  383.   "28800", 2880,  0,
  384. #endif /* BPS_28K */
  385.   "300",     30,  0,
  386. #ifdef BPS_3600
  387.   "3600",   360,  0,
  388. #endif /* BPS_3600 */
  389. #ifdef BPS_38K
  390.   "38400", 3840,  0,
  391. #endif /* BPS_38K */
  392. #ifdef BPS_460K
  393.   "460800", 46080,  0, /* Need 32 bits for this... */
  394. #endif /* BPS_460K */
  395.   "4800",   480,  0,
  396. #ifdef BPS_50
  397.   "50",       5,  0,
  398. #endif /* BPS_50 */
  399. #ifdef BPS_57K
  400.   "57600", 5760,  0,
  401. #endif /* BPS_57K */
  402.   "600",     60,  0,
  403. #ifdef BPS_7200
  404.   "7200",   720,  0,
  405. #endif /* BPS_7200 */
  406. #ifdef BPS_75
  407.   "75",       7,  0,
  408. #endif /* BPS_75 */
  409. #ifdef BPS_7512
  410.   "75/1200",888,  0, /* Code "888" for split speed */
  411. #endif /* BPS_7512 */
  412. #ifdef BPS_76K
  413.   "76800", 7680,  0,
  414. #endif /* BPS_76K */
  415. #ifdef BPS_921K
  416.   "921600", 92160,0, /* Need 32 bits for this... */
  417. #endif /* BPS_921K */
  418.   "9600",   960,  0
  419. };
  420. int nspd = (sizeof(spdtab) / sizeof(struct keytab)); /* How many speeds */
  421. #endif /* TTSPDLIST */
  422. #endif /* NOLOCAL */
  423. #ifndef NOCSETS
  424. extern struct keytab lngtab[]; /* Languages for SET LANGUAGE */
  425. extern int nlng;
  426. #endif /* NOCSETS */
  427. #ifndef NOLOCAL
  428. /* Duplex keyword table */
  429. struct keytab dpxtab[] = {
  430.     "full",   0, 0,
  431.     "half",      1, 0
  432. };
  433. #endif /* NOLOCAL */
  434. /* Flow Control */
  435. struct keytab cxtypesw[] = {
  436. #ifdef DECNET
  437.     "/decnet",         CXT_DECNET,  0,
  438. #endif /* DECNET */
  439.     "/direct-serial",  CXT_DIRECT,  0,
  440. #ifdef DECNET
  441.     "/lat",            CXT_LAT,     0,
  442. #else
  443. #ifdef SUPERLAT
  444.     "/lat",            CXT_LAT,     0,
  445. #endif /* SUPERLAT */
  446. #endif /* DECNET */
  447.     "/modem",          CXT_MODEM,   0,
  448. #ifdef NPIPE
  449.     "/named-pipe",     CXT_NPIPE,   0,
  450. #endif /* NPIPE */
  451. #ifdef NETBIOS
  452.     "/netbios",        CXT_NETBIOS, 0,
  453. #endif /* NETBIOS */
  454.     "/remote",         CXT_REMOTE,  0,
  455. #ifdef SSH
  456.     "/ssh",            CXT_SSH,     0,
  457. #endif /* SSH */
  458. #ifdef TCPSOCKET
  459.     "/tcpip",          CXT_TCPIP,   0,
  460. #endif /* TCPSOCKET */
  461. #ifdef ANYX25
  462.     "/x.25",           CXT_X25,     0,
  463. #endif /* ANYX25 */
  464.     "", 0, 0
  465. };
  466. int ncxtypesw = (sizeof(cxtypesw) / sizeof(struct keytab));
  467. struct keytab flotab[] = { /* SET FLOW-CONTROL keyword table */
  468.     "automatic", FLO_AUTO, CM_INV, /* Not needed any more */
  469. #ifdef CK_DTRCD
  470.     "dtr/cd",    FLO_DTRC, 0,
  471. #endif /* CK_DTRCD */
  472. #ifdef CK_DTRCTS
  473.     "dtr/cts",   FLO_DTRT, 0,
  474. #endif /* CK_DTRCTS */
  475.     "keep",      FLO_KEEP, 0,
  476.     "none",      FLO_NONE, 0,
  477. #ifdef CK_RTSCTS
  478.     "rts/cts",   FLO_RTSC, 0,
  479. #endif /* CK_RTSCTS */
  480. #ifndef Plan9
  481.     "xon/xoff",  FLO_XONX, 0,
  482. #endif /* Plan9 */
  483.     "", 0, 0
  484. };
  485. int nflo = (sizeof(flotab) / sizeof(struct keytab)) - 1;
  486. /*  Handshake characters  */
  487. struct keytab hshtab[] = {
  488.     "bell", 007, 0,
  489.     "code", 998, 0,
  490.     "cr",   015, 0,
  491.     "esc",  033, 0,
  492.     "lf",   012, 0,
  493.     "none", 999, 0, /* (can't use negative numbers) */
  494.     "xoff", 023, 0,
  495.     "xon",  021, 0
  496. };
  497. int nhsh = (sizeof(hshtab) / sizeof(struct keytab));
  498. #ifndef NOLOCAL
  499. static struct keytab sfttab[] = { /* File types for SET SESSION-LOG */
  500.     "ascii",     XYFT_B, CM_INV,
  501.     "binary",    XYFT_B, 0,
  502.     "debug",     XYFT_D, 0,
  503.     "text",      XYFT_T, 0
  504. };
  505. static int nsfttab = (sizeof(sfttab) / sizeof(struct keytab));
  506. #endif /* NOLOCAL */
  507. #ifndef NODIAL
  508. #ifdef NETCONN /* Networks directory depends */
  509. int nnetdir = 0; /* on DIAL code -- fix later... */
  510. char *netdir[MAXDDIR+2];
  511. #endif /* NETCONN */
  512. _PROTOTYP( static int setdial, (int) );
  513. _PROTOTYP( static int setdcd, (void) );
  514. _PROTOTYP( static int cklogin, (void) );
  515. #ifndef MINIDIAL
  516. #ifdef OLDTBCODE
  517. extern int tbmodel; /* Telebit model ID */
  518. #endif /* OLDTBCODE */
  519. #endif /* MINIDIAL */
  520. extern MDMINF *modemp[]; /* Pointers to modem info structs */
  521. extern struct keytab mdmtab[]; /* Modem types (in module ckudia.c) */
  522. extern int nmdm; /* Number of them */
  523. _PROTOTYP(static int dialstr,(char **, char *));
  524. extern int dialhng, dialtmo, dialksp, dialdpy, dialmhu, dialec, dialdc;
  525. extern int dialrtr, dialint, dialudt, dialsrt, dialrstr, mdmwaitd;
  526. extern int mdmspd, dialfc, dialmth, dialesc, dialfld, dialidt, dialpace;
  527. extern int mdmspk, mdmvol, dialtest;
  528. int dialcvt = 2; /* DIAL CONVERT-DIRECTORY */
  529. int dialcnf = 0; /* DIAL CONFIRMATION */
  530. int dialcon = 2; /* DIAL CONNECT */
  531. int dialcq  = 0; /* DIAL CONNECT AUTO quiet/verbose */
  532. extern long dialmax, dialcapas;
  533. int usermdm = 0;
  534. extern int ndialdir;
  535. extern char *dialini,   *dialmstr, *dialmprmt, *dialdir[], *dialcmd,  *dialnpr,
  536.  *dialdcon, *dialdcoff, *dialecon, *dialecoff, *dialhcmd,  *dialx3,
  537.  *dialhwfc, *dialswfc,  *dialnofc, *dialtone,  *dialpulse, *dialname, *diallac;
  538. extern char *diallcc,   *dialixp,  *dialixs,   *dialldp,   *diallds,  *dialtfp,
  539.  *dialpxi,  *dialpxo,   *dialsfx,  *dialaaon,  *dialaaoff;
  540. extern char *diallcp,   *diallcs,  *dialini2,  *dialmac;
  541. extern char *dialspoff, *dialspon, *dialvol1,  *dialvol2,  *dialvol3;
  542. char *dialtocc[MAXTPCC] = { NULL, NULL };
  543. int ndialtocc = 0;
  544. char *dialpucc[MAXTPCC] = { NULL, NULL };
  545. int ndialpucc = 0;
  546. char *dialtfc[MAXTOLLFREE] = {
  547.     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
  548. };
  549. int ntollfree = 0;
  550. char *dialpxx[MAXPBXEXCH] = {
  551.     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
  552. };
  553. int ndialpxx = 0;
  554. char *diallcac[MAXLOCALAC] = {
  555.     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  556.     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  557.     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  558.     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
  559. };
  560. int nlocalac = 0;
  561. static struct keytab drstrtab[] = {
  562.     "international", 5, 0,
  563.     "local",         2, 0,
  564.     "long-distance", 4, 0,
  565.     "none",          6, 0
  566. };
  567. static struct keytab dcnvtab[] = {
  568.     "ask",  2, 0,
  569.     "off",  0, 0,
  570.     "on",   1, 0
  571. };
  572. struct keytab setmdm[] = {
  573.     "capabilities", XYDCAP,  0,
  574.     "carrier-watch", XYDMCD,  0,
  575.     "command", XYDSTR,  0,
  576.     "compression", XYDDC,   CM_INV,
  577.     "data-compression", XYDDC,   0,
  578.     "dial-command",     XYDDIA,  0,
  579.     "error-correction", XYDEC,   0,
  580.     "escape-character", XYDESC,  0,
  581.     "flow-control", XYDFC,   0,
  582.     "hangup-method", XYDMHU,  0,
  583. #ifndef NOXFER
  584.     "kermit-spoof", XYDKSP,  0,
  585. #endif /* NOXFER */
  586.     "maximum-speed", XYDMAX,  0,
  587.     "name", XYDNAM,  0,
  588.     "speaker",          XYDSPK,  0,
  589.     "speed-matching", XYDSPD,  0,
  590.     "type", XYDTYP,  0,
  591.     "volume",           XYDVOL,  0
  592. };
  593. int nsetmdm = (sizeof(setmdm) / sizeof(struct keytab));
  594. struct keytab voltab[] = {
  595.     "high",   3,  0,
  596.     "low",    1,  0,
  597.     "medium", 2,  0
  598. };
  599. struct keytab mdmcap[] = {
  600.     "at-commands", CKD_AT,  0,
  601.     "compression",      CKD_DC,  0,
  602.     "dc",               CKD_DC,  CM_INV,
  603.     "ec",               CKD_EC,  CM_INV,
  604.     "error-correction", CKD_EC,  0,
  605.     "hardware-flow",    CKD_HW,  0,
  606.     "hwfc",             CKD_HW,  CM_INV,
  607.     "itu",              CKD_V25, CM_INV,
  608.     "kermit-spoof", CKD_KS,  0,
  609.     "ks",               CKD_KS,  CM_INV,
  610.     "sb",               CKD_SB,  CM_INV,
  611.     "software-flow",    CKD_SW,  0,
  612.     "speed-buffering",  CKD_SB,  0,
  613.     "swfc",             CKD_SW,  CM_INV,
  614.     "tb",               CKD_TB,  CM_INV,
  615.     "telebit",          CKD_TB,  0,
  616.     "v25bis-commands", CKD_V25, 0
  617. };
  618. int nmdmcap = (sizeof(mdmcap) / sizeof(struct keytab));
  619. struct keytab dialtab[] = { /* SET DIAL table */
  620.     "area-code",        XYDLAC, 0, /* Also still includes items     */
  621.     "compression", XYDDC,  CM_INV, /* that were moved to SET MODEM, */
  622.     "confirmation", XYDCNF, 0, /* but they are CM_INVisible...  */
  623.     "connect",          XYDCON, 0,
  624.     "convert-directory",XYDCVT, 0,
  625.     "country-code",     XYDLCC, 0,
  626.     "dial-command", XYDDIA, CM_INV,
  627.     "directory", XYDDIR, 0,
  628.     "display", XYDDPY, 0,
  629.     "escape-character", XYDESC, CM_INV,
  630.     "error-correction", XYDEC,  CM_INV,
  631.     "flow-control", XYDFC,  CM_INV,
  632.     "force-long-distance", XYDFLD, 0,
  633.     "hangup", XYDHUP, 0,
  634.     "ignore-dialtone",  XYDIDT, 0,
  635.     "interval", XYDINT, 0,
  636.     "in", XYDINI, CM_INV|CM_ABR,
  637.     "init-string", XYDINI, CM_INV,
  638.     "intl-prefix", XYDIXP, 0,
  639.     "intl-suffix", XYDIXS, 0,
  640. #ifndef NOXFER
  641.     "kermit-spoof", XYDKSP, CM_INV,
  642. #endif /* NOXFER */
  643.     "lc-area-codes",    XYDLLAC, 0,
  644.     "lc-prefix",        XYDLCP, 0,
  645.     "lc-suffix",        XYDLCS, 0,
  646.     "ld-prefix", XYDLDP, 0,
  647.     "ld-suffix", XYDLDS, 0,
  648.     "local-area-code",  XYDLAC, CM_INV,
  649.     "local-prefix",     XYDLCP, CM_INV,
  650.     "local-suffix",     XYDLCS, CM_INV,
  651.     "m",                XYDMTH, CM_INV|CM_ABR,
  652. #ifndef NOSPL
  653.     "macro",            XYDMAC, 0, /* 195 */
  654. #endif /* NOSPL */
  655. #ifdef MDMHUP
  656.     "me",               XYDMTH, CM_INV|CM_ABR,
  657. #endif /* MDMHUP */
  658.     "method", XYDMTH, 0,
  659.     "mnp-enable", XYDMNP, CM_INV, /* obsolete but still accepted */
  660. #ifdef MDMHUP
  661.     "modem-hangup", XYDMHU, CM_INV,
  662. #endif /* MDMHUP */
  663.     "pacing",           XYDPAC,  0,
  664.     "pbx-exchange",     XYDPXX,  0,
  665.     "pbx-inside-prefix",XYDPXI,  0,
  666.     "pbx-outside-prefix",XYDPXO, 0,
  667.     "prefix", XYDNPR,  0,
  668.     "pulse-countries",  XYDPUCC, 0,
  669.     "restrict",         XYDRSTR, 0,
  670.     "retries", XYDRTM,  0,
  671.     "sort",             XYDSRT,  0,
  672.     "speed-matching", XYDSPD,  CM_INV,
  673.     "string", XYDSTR,  CM_INV,
  674.     "suffix", XYDSFX,  0,
  675.     "test",             XYDTEST, 0,
  676.     "timeout", XYDTMO,  0,
  677.     "tf-area-code",     XYDTFC,  CM_INV,
  678.     "tf-prefix",        XYDTFP,  CM_INV,
  679.     "toll-free-area-code",XYDTFC,0,
  680.     "toll-free-prefix", XYDTFP,  0,
  681.     "tone-countries",   XYDTOCC, 0
  682. };
  683. int ndial = (sizeof(dialtab) / sizeof(struct keytab));
  684. #ifdef MDMHUP
  685. struct keytab mdmhang[] = {
  686.     "modem-command", 1, 0,
  687.     "rs232-signal",  0, 0,
  688.     "v24-signal",    0, CM_INV
  689. };
  690. #endif /* MDMHUP */
  691. static struct keytab mdmcmd[] = {
  692.     "autoanswer",       XYDS_AN, 0, /* autoanswer */
  693.     "compression", XYDS_DC, 0, /* data compression */
  694.     "dial-mode-prompt", XYDS_MP, 0, /* dial mode prompt */
  695.     "dial-mode-string", XYDS_MS, 0, /* dial mode string */
  696.     "error-correction", XYDS_EC, 0, /* error correction */
  697.     "hangup-command", XYDS_HU, 0, /* hangup command */
  698.     "hardware-flow", XYDS_HW, 0, /* hwfc */
  699.     "ignore-dialtone", XYDS_ID, 0, /* ignore dialtone */
  700.     "init-string", XYDS_IN, 0, /* init string */
  701.     "no-flow-control", XYDS_NF, 0, /* no flow control */
  702.     "predial-init",     XYDS_I2, 0,     /* last-minute setup commands */
  703.     "pulse",            XYDS_DP, 0, /* pulse */
  704.     "software-flow", XYDS_SW, 0, /* swfc */
  705.     "speaker",          XYDS_SP, 0,     /* Speaker */
  706.     "tone",             XYDS_DT, 0, /* tone */
  707.     "volume",           XYDS_VO, 0      /* Volume */
  708. };
  709. static int nmdmcmd = (sizeof(mdmcmd) / sizeof(struct keytab));
  710. struct keytab dial_fc[] = {
  711.     "auto",     FLO_AUTO, 0,
  712.     "none",     FLO_NONE, 0,
  713.     "rts/cts",  FLO_RTSC, 0,
  714.     "xon/xoff", FLO_XONX, 0
  715. };
  716. struct keytab dial_m[] = { /* DIAL METHOD */
  717.     "auto",    XYDM_A, 0,
  718.     "default", XYDM_D, 0,
  719.     "pulse",   XYDM_P, 0,
  720.     "tone",    XYDM_T, 0
  721. };
  722. int ndial_m = (sizeof(dial_m)/sizeof(struct keytab));
  723. #ifdef CK_TAPI
  724. struct keytab tapitab[] = { /* Top-Level Microsoft TAPI */
  725.     "configure-line",     XYTAPI_CFG,  0,
  726.     "dialing-properties", XYTAPI_DIAL, 0
  727. };
  728. int ntapitab = (sizeof(tapitab)/sizeof(struct keytab));
  729. struct keytab settapitab[] = { /* SET Microsoft TAPI */
  730.     "inactivity-timeout", XYTAPI_INA,  0,
  731.     "line",               XYTAPI_LIN,  0,
  732.     "location",           XYTAPI_LOC,  0,
  733.     "manual-dialing",     XYTAPI_MAN,  0,
  734.     "modem-dialing",   XYTAPI_PASS, 0,
  735.     "modem-lights",       XYTAPI_LGHT, 0,
  736.     "phone-number-conversions",   XYTAPI_CON,  0,
  737.     "port",               XYTAPI_LIN,  CM_INV,
  738.     "post-dial-terminal", XYTAPI_PST,  0,
  739.     "pre-dial-terminal",  XYTAPI_PRE,  0,
  740.     "use-windows-configuration", XYTAPI_USE, 0,
  741.     "wait-for-credit-card-tone", XYTAPI_BNG, 0
  742. };
  743. int nsettapitab = (sizeof(settapitab)/sizeof(struct keytab));
  744. struct keytab * tapiloctab = NULL; /* Microsoft TAPI Locations */
  745. int ntapiloc = 0;
  746. extern struct keytab * tapilinetab; /* Microsoft TAPI Line Devices */
  747. extern int ntapiline;
  748. extern int tttapi; /* TAPI in use */
  749. extern int tapipass; /* TAPI Passthrough mode */
  750. extern int tapiconv; /* TAPI Conversion mode */
  751. extern int tapilights;
  752. extern int tapipreterm;
  753. extern int tapipostterm;
  754. extern int tapimanual;
  755. extern int tapiinactivity;
  756. extern int tapibong;
  757. extern int tapiusecfg;
  758. #endif /* CK_TAPI */
  759. #endif /* NODIAL */
  760. #ifndef NOPUSH
  761. extern int nopush;
  762. #ifdef UNIX
  763. struct keytab wildtab[] = { /* SET WILDCARD-EXPANSION */
  764.     "kermit",  0, 0,
  765.     "shell",   1, 0
  766. };
  767. struct keytab wdottab[] = { /* cont'd */
  768.     "/match-dot-files",    1, 0,
  769.     "/no-match-dot-files", 0, 0
  770. };
  771. extern int wildxpand;
  772. #endif /* UNIX */
  773. #endif /* NOPUSH */
  774. #ifdef NETCONN
  775. extern struct keytab netcmd[], netkey[];
  776. extern int nnets, nnetkey;
  777. #ifdef TCPSOCKET
  778. extern struct keytab tcpopt[];
  779. extern int ntcpopt;
  780. #ifndef NOTCPOPTS
  781. #ifdef SO_LINGER
  782. _PROTOTYP( int linger, (int,int) );
  783. #endif /* SO_LINGER */
  784. #ifdef TCP_NODELAY
  785. _PROTOTYP( int no_delay, (int) );
  786. #endif /* TCP_NODELAY */
  787. #endif /* NOTCPOPTS */
  788. #endif /* TCPSOCKET */
  789. #ifdef NPIPE
  790. char pipename[PIPENAML+1] = { NUL, NUL };
  791. #endif /* NPIPE */
  792. #ifdef CK_NETBIOS
  793. extern unsigned char NetBiosName[];
  794. #endif /* CK_NETBIOS */
  795. #endif /* NETCONN */
  796. #ifdef ANYX25
  797. struct keytab x25tab[] = {
  798.     "call-user-data",    XYUDAT, 0,
  799.     "closed-user-group", XYCLOS, 0,
  800.     "reverse-charge",    XYREVC, 0
  801. };
  802. int nx25 = (sizeof(x25tab) / sizeof(struct keytab));
  803. #ifndef IBMX25
  804. struct keytab padx3tab[] = {
  805.     "break-action",         PAD_BREAK_ACTION,           0,
  806.     "break-character",      PAD_BREAK_CHARACTER,        0,
  807.     "character-delete",     PAD_CHAR_DELETE_CHAR,       0,
  808.     "cr-padding",           PAD_PADDING_AFTER_CR,       0,
  809.     "discard-output",       PAD_SUPPRESSION_OF_DATA,    0,
  810.     "echo",                 PAD_ECHO,                   0,
  811.     "editing",              PAD_EDITING,                0,
  812.     "escape",               PAD_ESCAPE,                 0,
  813.     "forward",              PAD_DATA_FORWARD_CHAR,      0,
  814.     "lf-padding",           PAD_PADDING_AFTER_LF,       0,
  815.     "lf-insert",            PAD_LF_AFTER_CR,            0,
  816.     "line-delete",          PAD_BUFFER_DELETE_CHAR,     0,
  817.     "line-display",         PAD_BUFFER_DISPLAY_CHAR,    0,
  818.     "line-fold",            PAD_LINE_FOLDING,           0,
  819.     "pad-flow-control",     PAD_FLOW_CONTROL_BY_PAD,    0,
  820.     "service-signals",      PAD_SUPPRESSION_OF_SIGNALS, 0,
  821.     "timeout",              PAD_DATA_FORWARD_TIMEOUT,   0,
  822. /* Speed is read-only */
  823.     "transmission-rate",    PAD_LINE_SPEED,             0,
  824.     "user-flow-control",    PAD_FLOW_CONTROL_BY_USER,   0
  825. };
  826. int npadx3 = (sizeof(padx3tab) / sizeof(struct keytab));
  827. #endif /* IBMX25 */
  828. #endif /* ANYX25 */
  829. #ifdef TLOG
  830. static struct keytab vbtab[] = {
  831.     "brief",   0, 0,
  832. #ifdef OS2ORUNIX
  833.     "ftp",     2, 0,
  834. #endif /* OS2ORUNIX */
  835.     "verbose", 1, 0
  836. };
  837. int nvb = (sizeof(vbtab) / sizeof(struct keytab));
  838. #endif /* TLOG */
  839. #ifdef CKSYSLOG
  840. static struct keytab syslogtab[] = {
  841.     "all",         SYSLG_CX, 0,
  842.     "commands",    SYSLG_CM, 0,
  843.     "connection",  SYSLG_AC, 0,
  844.     "debug",       SYSLG_DB, 0,
  845.     "dial",        SYSLG_DI, 0,
  846.     "file-access", SYSLG_FA, 0,
  847.     "file-create", SYSLG_FC, 0,
  848.     "login",       SYSLG_LI, 0,
  849.     "none",        SYSLG_NO, 0,
  850.     "protocol",    SYSLG_PR, 0
  851. };
  852. int nsyslog = (sizeof(syslogtab) / sizeof(struct keytab));
  853. #endif /* CKSYSLOG */
  854. /* Parity keyword table */
  855. struct keytab partbl[] = {
  856.     "even",    'e', 0,
  857. #ifdef HWPARITY
  858.     "hardware",'H', 0,
  859. #endif /* HWPARITY */
  860.     "mark",    'm', 0,
  861.     "none",     0 , 0,
  862.     "odd",     'o', 0,
  863.     "space",   's', 0
  864. };
  865. int npar = (sizeof(partbl) / sizeof(struct keytab));
  866. #ifdef HWPARITY
  867. struct keytab hwpartbl[] = {
  868. /* Add mark and space if needed and possible */
  869.     "even",    'e', 0,
  870. #ifdef OS2
  871.     "mark",    'm', 0,
  872. #endif /* OS2 */
  873.     "odd",     'o', 0,
  874. #ifdef OS2
  875.     "space",   's', 0,
  876. #endif /* OS2 */
  877.     "", 0, 0
  878. };
  879. int nhwpar = (sizeof(hwpartbl) / sizeof(struct keytab)) - 1;
  880. #endif /* HWPARITY */
  881. /* On/Off table */
  882. struct keytab onoff[] = {
  883.     "off",       0, 0,
  884.     "on",        1, 0
  885. };
  886. struct keytab cdtab[] = {
  887.     "message",   XYCD_M, 0,
  888.     "path",      XYCD_P, 0
  889. };
  890. int ncdtab = (sizeof(cdtab) / sizeof(struct keytab));
  891. struct keytab cdmsg[] = {
  892.     "file",      2, 0,
  893.     "off",       0, 0,
  894.     "on",        1, 0
  895. };
  896. int ncdmsg = (sizeof(cdmsg) / sizeof(struct keytab));
  897. static
  898. struct keytab xittab[] = { /* SET EXIT */
  899.     "on-disconnect", 2, 0, /* ...ON-DISCONNECT */
  900.     "status",        0, 0, /* ...STATUS */
  901.     "warning",       1, 0 /* ...WARNING */
  902. };
  903. int nexit = (sizeof(xittab) / sizeof(struct keytab));
  904. struct keytab xitwtab[] = { /* SET EXIT WARNING */
  905.     "always", 2, 0,                     /* even when not connected */
  906.     "off",    0, 0, /* no warning     */
  907.     "on",     1, 0 /* when connected */
  908. };
  909. int nexitw = (sizeof(xitwtab) / sizeof(struct keytab));
  910. struct keytab rltab[] = {
  911.     "local",     1, 0, /* ECHO values */
  912.     "off",       0, CM_INV,
  913.     "on",        1, CM_INV,
  914.     "remote",    0, 0
  915. };
  916. int nrlt = (sizeof(rltab) / sizeof(struct keytab));
  917. /* Incomplete File Disposition table */
  918. struct keytab ifdtab[] = {
  919.     "discard", SET_OFF, 0,
  920.     "keep",    SET_ON,  0
  921. };
  922. struct keytab ifdatab[] = {
  923.     "auto",    SET_AUTO, 0,
  924.     "discard", SET_OFF,  0,
  925.     "keep",    SET_ON,   0
  926. };
  927. char * ifdnam[] = { "discard", "keep", "auto" };
  928. /* SET TAKE parameters table */
  929. static
  930. struct keytab taktab[] = {
  931.     "echo",  0, 0,
  932.     "error", 1, 0,
  933.     "off",   2, CM_INV, /* For compatibility */
  934.     "on",    3, CM_INV /* with MS-DOS Kermit... */
  935. };
  936. #ifndef NOSPL
  937. #ifdef COMMENT
  938. /* not used */
  939. static
  940. struct keytab suftab[] = { /* (what to do with) STARTUP-FILE */
  941.     "delete", 1, 0,
  942.     "keep",   0, 0
  943. };
  944. #endif /* COMMENT */
  945. /* SET MACRO parameters table */
  946. static
  947. struct keytab smactab[] = {
  948.     "echo",  0, 0,
  949.     "error", 1, 0
  950. };
  951. #endif /* NOSPL */
  952. #ifndef NOSCRIPT
  953. static
  954. struct keytab scrtab[] = {
  955.     "echo",  0, 0
  956. };
  957. #endif /* NOSCRIPT */
  958. /* SET COMMAND table */
  959. static struct keytab scmdtab[] = {
  960. #ifdef CK_AUTODL
  961.     "autodownload", SCMD_ADL, 0,
  962. #endif /* CK_AUTODL */
  963.     "bytesize",  SCMD_BSZ, 0,
  964.     "cbreak",    876, CM_INV,
  965. #ifdef OS2
  966.     "color",     SCMD_COL, 0,
  967.     "cursor-position", SCMD_CUR, 0,
  968. #endif /* OS2 */
  969.     "height",    SCMD_HIG, 0,
  970.     "interruption", SCMD_INT, 0,
  971.     "more-prompting",  SCMD_MOR, 0,
  972.     "quoting",   SCMD_QUO, 0
  973. #ifdef CK_RECALL
  974. ,   "recall-buffer-size", SCMD_RCL, 0
  975. #endif /* CK_RECALL */
  976. #ifdef CK_RECALL
  977. ,   "retry", SCMD_RTR, 0
  978. #endif /* CK_RECALL */
  979. #ifdef OS2
  980. #ifdef ONETERMUPD
  981. ,  "scrollback",  SCMD_SCR, 0
  982. #endif /* ONETERMUPD */
  983. #endif /* OS2 */
  984. ,   "width",     SCMD_WID, 0
  985. };
  986. static int nbytt = (sizeof(scmdtab) / sizeof(struct keytab));
  987. #ifndef NOSERVER
  988. /* Server parameters table */
  989. static struct keytab srvtab[] = {
  990.     "cd-message",   XYSERC, 0,
  991.     "display",      XYSERD, 0,
  992.     "get-path",     XYSERP, 0,
  993.     "idle-timeout", XYSERI, 0,
  994.     "keepalive",    XYSERK, 0,
  995.     "login",        XYSERL, 0,
  996.     "timeout",      XYSERT, 0
  997. };
  998. static int nsrvt = (sizeof(srvtab) / sizeof(struct keytab));
  999. #endif /* NOSERVER */
  1000. static struct keytab sleeptab[] = { /* SET SLEEP table */
  1001.     "cancellation",  0,   0
  1002. };
  1003. static struct keytab tstab[] = { /* SET TRANSFER/XFER table */
  1004.     "bell",            XYX_BEL, 0,
  1005. #ifdef XFRCAN
  1006.     "cancellation",    XYX_CAN, 0,
  1007. #endif /* XFRCAN */
  1008. #ifndef NOCSETS
  1009.     "character-set",   XYX_CSE, 0,
  1010. #endif /* NOCSETS */
  1011. #ifndef NOSPL
  1012.     "crc-calculation", XYX_CRC, 0,
  1013. #endif /* NOSPL */
  1014.     "display",         XYX_DIS, 0,
  1015.     "interruption",    XYX_INT, 0,
  1016.     "locking-shift",   XYX_LSH, 0,
  1017.     "mode",            XYX_MOD, 0,
  1018. #ifdef PIPESEND
  1019.     "pipes",           XYX_PIP, 0,
  1020. #endif /* PIPESEND */
  1021. #ifdef CK_XYZ
  1022.     "protocol",        XYX_PRO, 0,
  1023. #endif /* CK_XYZ */
  1024.     "slow-start",      XYX_SLO, 0,
  1025.     "", 0, 0
  1026. };
  1027. static int nts = (sizeof(tstab) / sizeof(struct keytab)) - 1;
  1028. static struct keytab rtstab[] = { /* REMOTE SET TRANSFER/XFER table */
  1029. #ifndef NOCSETS
  1030.     "character-set",   XYX_CSE, 0,
  1031. #endif /* NOCSETS */
  1032.     "mode",            XYX_MOD, 0
  1033. };
  1034. static int nrts = (sizeof(rtstab) / sizeof(struct keytab));
  1035. struct keytab xfrmtab[] = { /* TRANSFER MODE table */
  1036.     "automatic", XMODE_A, 0,
  1037.     "manual",    XMODE_M, 0
  1038. };
  1039. #ifndef NOCSETS
  1040. /* SET TRANSFER CHARACTER-SET table */
  1041. extern struct keytab tcstab[];
  1042. extern int ntcs;
  1043. #endif /* NOCSETS */
  1044. /* SET TRANSFER LOCKING-SHIFT table */
  1045. struct keytab lstab[] = {
  1046.     "forced", 2,   0,
  1047.     "off",    0,   0,
  1048.     "on",     1,   0
  1049. };
  1050. int nls = (sizeof(lstab) / sizeof(struct keytab));
  1051. /* SET TELNET tables */
  1052. #ifdef TNCODE
  1053. extern int tn_nlm, tn_b_nlm, tn_b_meu, tn_b_ume, tn_b_xfer, tn_sb_bug;
  1054. extern int tn_no_encrypt_xfer;
  1055. extern int tn_wait_flg, tn_duplex;
  1056. extern int sl_tn_saved;
  1057. extern int tn_infinite;
  1058. extern int tn_rem_echo;
  1059. extern int tn_deb;
  1060. extern int tn_auth_how;
  1061. extern int tn_auth_enc;
  1062. #ifdef CK_AUTHENTICATION
  1063. static struct keytab setauth[] = {
  1064. #ifdef CK_KERBEROS
  1065.     "k4",        AUTH_KRB4, CM_INV,
  1066.     "k5",        AUTH_KRB5, CM_INV,
  1067.     "kerberos4", AUTH_KRB4, 0,
  1068.     "kerberos5", AUTH_KRB5, 0,
  1069.     "kerberos_iv",AUTH_KRB4, CM_INV,
  1070.     "kerberos_v", AUTH_KRB5, CM_INV,
  1071.     "krb4",      AUTH_KRB4, CM_INV,
  1072.     "krb5",      AUTH_KRB5, CM_INV,
  1073. #endif /* CK_KERBEROS */
  1074. #ifdef CK_SRP
  1075.     "srp",       AUTH_SRP,  0,
  1076. #endif /* CK_SRP */
  1077. #ifdef CK_SSL
  1078.     "ssl",      AUTH_SSL,   0,
  1079.     "tls",      AUTH_TLS,   0,
  1080. #endif /* CK_SSL */
  1081.     "",         0,      0
  1082. };
  1083. static int nsetauth = sizeof(setauth)/sizeof(struct keytab) - 1;
  1084. #ifdef CK_KERBEROS
  1085. extern char * krb5_d_principal; /* Default principal */
  1086. extern char * krb5_d_instance;
  1087. extern char * krb5_d_realm; /* Default realm */
  1088. extern char * krb5_d_cc; /* Default credentials cache */
  1089. extern char * krb5_d_srv;               /* Default service name */
  1090. extern int    krb5_d_lifetime;          /* Default lifetime */
  1091. extern int    krb5_d_forwardable;
  1092. extern int    krb5_d_proxiable;
  1093. extern int    krb5_d_renewable;
  1094. extern int    krb5_autoget;
  1095. extern int    krb5_autodel;
  1096. extern int    krb5_d_getk4;
  1097. extern int    krb5_checkaddrs; /* Check TGT Addrs */
  1098. extern struct krb4_init_data krb4_init;
  1099. extern char * krb4_d_principal; /* Default principal */
  1100. extern char * krb4_d_realm; /* Default realm */
  1101. extern char * krb4_d_srv;               /* Default service name */
  1102. extern int    krb4_d_lifetime;          /* Default lifetime */
  1103. extern int    krb4_d_preauth;
  1104. extern char * krb4_d_instance;
  1105. extern int    krb4_autoget;
  1106. extern int    krb4_autodel;
  1107. extern int    krb4_checkaddrs; /* Check TGT Addrs */
  1108. #ifdef KRB4
  1109. extern int    k4debug;
  1110. #endif /* KRB4 */
  1111. static struct keytab krbver[] = {
  1112.     "4",                 4, 0,
  1113.     "5",                 5, 0,
  1114.     "iv",                4, CM_INV,
  1115.     "v",                 5, CM_INV
  1116. };
  1117. static int nkrbver = sizeof(krbver)/sizeof(struct keytab);
  1118. static struct keytab kdestab[] = {
  1119.     "never",            KRB_DEL_NO, 0,
  1120.     "no",               KRB_DEL_NO, CM_INV,
  1121.     "on-close",         KRB_DEL_CL, 0,
  1122.     "on-exit",          KRB_DEL_EX, 0
  1123. };
  1124. static int nkdestab = sizeof(kdestab)/sizeof(struct keytab);
  1125. static struct keytab k4tab[] = {
  1126.     "autodel",           XYKRBDEL, CM_INV,
  1127.     "autodestroy",       XYKRBDEL, 0,
  1128.     "autoget",           XYKRBGET, 0,
  1129.     "check-address",     XYKRBADR, 0,
  1130.     "debug",             XYKRBDBG, CM_INV,
  1131.     "instance",          XYKRBINS, 0,
  1132.     "lifetime",          XYKRBLIF, 0,
  1133.     "preauth",           XYKRBPRE, 0,
  1134.     "principal",         XYKRBPR,  0,
  1135.     "prompt",            XYKRBPRM, 0,
  1136.     "realm",             XYKRBRL,  0,
  1137.     "service-name",      XYKRBSRV, 0
  1138. };
  1139. static int nk4tab = sizeof(k4tab)/sizeof(struct keytab);
  1140. static struct keytab k5tab[] = {
  1141.     "autodel",           XYKRBDEL, CM_INV,
  1142.     "autodestroy",       XYKRBDEL, 0,
  1143.     "autoget",           XYKRBGET, 0,
  1144.     "cc",                XYKRBCC,  CM_INV,
  1145.     "check-address",     XYKRBADR, 0,
  1146.     "credentials-cache", XYKRBCC,  0,
  1147.     "forwardable",       XYKRBFWD, 0,
  1148.     "get-k4-tgt",        XYKRBK5K4,0,
  1149.     "instance",          XYKRBINS, 0,
  1150.     "lifetime",          XYKRBLIF, 0,
  1151.     "principal",         XYKRBPR,  0,
  1152.     "prompt",            XYKRBPRM, 0,
  1153.     "proxiable",         XYKRBPRX, 0,
  1154.     "realm",             XYKRBRL,  0,
  1155.     "renewable",         XYKRBRNW, 0,
  1156.     "service-name",      XYKRBSRV, 0
  1157. };
  1158. static int nk5tab = sizeof(k5tab)/sizeof(struct keytab);
  1159. #define KRB_PW_PRM 1
  1160. #define KRB_PR_PRM 2
  1161. static struct keytab krbprmtab[] = {
  1162.     "password",  KRB_PW_PRM, 0,
  1163.     "principal", KRB_PR_PRM, 0
  1164. };
  1165. #endif /* CK_KERBEROS */
  1166. #ifdef CK_SRP
  1167. static struct keytab srptab[] = {
  1168.     "prompt",            XYSRPPRM, 0
  1169. };
  1170. static int nsrptab = sizeof(srptab)/sizeof(struct keytab);
  1171. #define SRP_PW_PRM 1
  1172. static struct keytab srpprmtab[] = {
  1173.     "password",  SRP_PW_PRM, 0
  1174. };
  1175. #endif /* CK_SRP */
  1176. #ifdef CK_SSL
  1177. static struct keytab ssltab[] = {
  1178.     "certs-ok",          XYSSLCOK,  CM_INV,
  1179.     "cipher-list",       XYSSLCL,   0,
  1180.     "crl-dir",           XYSSLCRLD, 0,
  1181.     "crl-file",          XYSSLCRL,  0,
  1182.     "debug",             XYSSLDBG,  0,
  1183.     "dh-key-file",       XYSSLDKFL, CM_INV,
  1184.     "dh-param-file",     XYSSLDPFL, 0,
  1185.     "dsa-cert-file",     XYSSLDCFL, 0,
  1186.     "dsa-key-file",      XYSSLDKFL, 0,
  1187.     "dummy",             XYSSLDUM,  CM_INV,
  1188.     "only",              XYSSLON,   CM_INV,
  1189.     "rsa-cert-file",     XYSSLRCFL, 0,
  1190.     "rsa-key-file",      XYSSLRKFL, 0,
  1191.     "verbose",           XYSSLVRB,  0,
  1192.     "verify",            XYSSLVRF,  0,
  1193.     "verify-dir",        XYSSLVRFD, 0,
  1194.     "verify-file",       XYSSLVRFF, 0
  1195. };
  1196. static int nssltab = sizeof(ssltab)/sizeof(struct keytab);
  1197. static struct keytab sslvertab[] = {
  1198.     "fail-if-no-peer-cert", SSL_VERIFY_PEER |
  1199.                             SSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0,
  1200.     "no",               SSL_VERIFY_NONE, 0,
  1201.     "none",             SSL_VERIFY_NONE, CM_INV,
  1202.     "off",              SSL_VERIFY_NONE, CM_INV,
  1203.     "on",               SSL_VERIFY_PEER, CM_INV,
  1204.     "peer-cert",        SSL_VERIFY_PEER, 0
  1205. };
  1206. static int nsslvertab = sizeof(sslvertab)/sizeof(struct keytab);
  1207. #endif /* CK_SSL */
  1208. #endif /* CK_AUTHENTICATION */
  1209. #ifdef CK_ENCRYPTION
  1210. int cx_type = CX_AUTO;
  1211. extern int sl_cx_type;
  1212. #endif /* CK_ENCRYPTION */
  1213. extern char *tcp_address;
  1214. static struct keytab tnnegtab[] = { /* TELNET NEGOTIATION table */
  1215.     "accepted",  TN_NG_AC, 0,
  1216.     "refused",   TN_NG_RF, 0,
  1217.     "req",       TN_NG_RQ, CM_INV|CM_ABR,
  1218.     "requ",      TN_NG_RQ, CM_INV|CM_ABR,
  1219.     "reque",     TN_NG_RQ, CM_INV|CM_ABR,
  1220.     "reques",    TN_NG_RQ, CM_INV|CM_ABR,
  1221.     "request",   TN_NG_RQ, CM_INV|CM_ABR,
  1222.     "requeste",  TN_NG_RQ, CM_INV|CM_ABR,
  1223.     "requested", TN_NG_RQ, 0,
  1224.     "required",  TN_NG_MU, 0
  1225. };
  1226. static int ntnnegtab = sizeof(tnnegtab)/sizeof(struct keytab);
  1227. #ifdef CK_ENCRYPTION
  1228. static struct keytab typkwd[] = {
  1229.     "/type", 0, CM_ARG
  1230. };
  1231. static struct keytab tnenctab[] = { /* TELNET ENCRYPTION table */
  1232.     "accepted",   TN_NG_AC,    CM_INV,
  1233.     "refused",    TN_NG_RF,    CM_INV,
  1234.     "req",        TN_NG_RQ,    CM_INV|CM_ABR,
  1235.     "requ",       TN_NG_RQ,    CM_INV|CM_ABR,
  1236.     "reque",      TN_NG_RQ,    CM_INV|CM_ABR,
  1237.     "reques",     TN_NG_RQ,    CM_INV|CM_ABR,
  1238.     "request",    TN_NG_RQ,    CM_INV|CM_ABR,
  1239.     "requeste",   TN_NG_RQ,    CM_INV|CM_ABR,
  1240.     "requested",  TN_NG_RQ,    CM_INV,
  1241.     "required",   TN_NG_MU,    CM_INV,
  1242.     "start",      TN_EN_START, CM_INV,
  1243.     "stop",       TN_EN_STOP,  CM_INV,
  1244.     "type",       TN_EN_TYP,   0
  1245. };
  1246. static int ntnenc = sizeof(tnenctab)/sizeof(struct keytab) ;
  1247. #endif /* CK_ENCRYPTION */
  1248. static struct keytab tnbugtab[] = { /* TELNET BUG table */
  1249.     "binary-me-means-u-too", 0, 0,
  1250.     "binary-u-means-me-too", 1, 0,
  1251.     "infinite-loop-check",   2, 0,
  1252.     "sb-implies-will-do",    3, 0
  1253. };
  1254. #ifdef CK_ENVIRONMENT
  1255. static struct keytab tnenvtab[] = { /* TELNET ENVIRONMENT table */
  1256.     "acct", TN_ENV_ACCT, 0,
  1257.     "display", TN_ENV_DISP, 0,
  1258.     "job", TN_ENV_JOB, 0,
  1259.     "off",      TN_ENV_OFF,     CM_INV,
  1260.     "on",       TN_ENV_ON,      CM_INV,
  1261.     "printer", TN_ENV_PRNT, 0,
  1262.     "systemtype",TN_ENV_SYS, 0,
  1263.     "user",  TN_ENV_USR,  0,
  1264. #ifdef COMMENT
  1265.     "uservar", TN_ENV_UVAR, CM_INV
  1266. #endif /* COMMENT */
  1267.     "", 0, 0
  1268. };
  1269. static int ntnenv = sizeof(tnenvtab)/sizeof(struct keytab) - 1;
  1270. #endif /* CK_ENVIRONMENT */
  1271. #ifdef CK_AUTHENTICATION
  1272. static struct keytab tnauthtab[] = { /* TELNET AUTHENTICATION table */
  1273.     "accepted",   TN_NG_AC,  CM_INV,
  1274.     "encrypt-flag", TN_AU_ENC, 0,
  1275.     "forwarding", TN_AU_FWD,   0,
  1276.     "how-flag",   TN_AU_HOW,   0,
  1277.     "refused",    TN_NG_RF,  CM_INV,
  1278.     "req",        TN_NG_RQ,  CM_INV|CM_ABR,
  1279.     "requ",       TN_NG_RQ,  CM_INV|CM_ABR,
  1280.     "reque",      TN_NG_RQ,  CM_INV|CM_ABR,
  1281.     "reques",     TN_NG_RQ,  CM_INV|CM_ABR,
  1282.     "request",    TN_NG_RQ,  CM_INV|CM_ABR,
  1283.     "requeste",   TN_NG_RQ,  CM_INV|CM_ABR,
  1284.     "requested",  TN_NG_RQ,  CM_INV,
  1285.     "required",   TN_NG_MU,  CM_INV,
  1286.     "type",       TN_AU_TYP, 0
  1287. };
  1288. static int ntnauth = sizeof(tnauthtab)/sizeof(struct keytab) ;
  1289. struct keytab autyptab[] = { /* TELNET AUTHENTICATION TYPE table */
  1290.     "automatic",  AUTH_AUTO, 0,
  1291. #ifdef CK_KERBEROS
  1292.     "k4",         AUTH_KRB4, CM_INV,
  1293.     "k5",         AUTH_KRB5, CM_INV,
  1294.     "kerberos4",  AUTH_KRB4, 0,
  1295.     "kerberos5",  AUTH_KRB5, 0,
  1296.     "kerberos_iv",AUTH_KRB4, CM_INV,
  1297.     "kerberos_v", AUTH_KRB5, CM_INV,
  1298.     "krb4",       AUTH_KRB4, CM_INV,
  1299.     "krb5",       AUTH_KRB5, CM_INV,
  1300. #endif /* CK_KERBEROS */
  1301.     "none",       AUTH_NONE, 0,
  1302. #ifdef NT
  1303.     "ntlm",       AUTH_NTLM, 0,
  1304. #endif /* NT */
  1305. #ifdef CK_SRP
  1306.     "srp",        AUTH_SRP,  0,
  1307. #endif /* CK_SRP */
  1308. #ifdef CK_SSL
  1309.     "ssl",        AUTH_SSL,  0,
  1310. #endif /* CK_SSL */
  1311.     "", 0, 0
  1312. };
  1313. int nautyp = sizeof(autyptab)/sizeof(struct keytab) - 1;
  1314. struct keytab auhowtab[] = { /* TELNET AUTHENTICATION HOW table */
  1315.     "any",     TN_AUTH_HOW_ANY,     0,
  1316.     "mutual",  TN_AUTH_HOW_MUTUAL,  0,
  1317.     "one-way", TN_AUTH_HOW_ONE_WAY, 0,
  1318.     "", 0, 0
  1319. };
  1320. int nauhow = sizeof(auhowtab)/sizeof(struct keytab) - 1;
  1321. struct keytab auenctab[] = { /* TELNET AUTHENTICATION ENCRYPT table */
  1322.     "any",     TN_AUTH_ENC_ANY,     0,
  1323.     "none",    TN_AUTH_ENC_NONE,    0,
  1324.     "telopt",  TN_AUTH_ENC_TELOPT,  0,
  1325.     "", 0, 0
  1326. };
  1327. int nauenc = sizeof(auenctab)/sizeof(struct keytab) - 1;
  1328. #endif /* CK_AUTHENTICATION */
  1329. #define TN_NL_BIN 3
  1330. #define TN_NL_NVT 4
  1331. static struct keytab tn_nlmtab[] = { /* TELNET NEWLINE-MODE table */
  1332.     "binary-mode", TN_NL_BIN, 0, /* Binary mode */
  1333.     "nvt",    TN_NL_NVT, 0, /* NVT mode */
  1334.     "off",    TNL_CRNUL, CM_INV, /* CR-NUL (TELNET spec) */
  1335.     "on",     TNL_CRLF,  CM_INV, /* CR-LF (TELNET spec) */
  1336.     "raw",    TNL_CR,    CM_INV /* CR only (out of spec) */
  1337. };
  1338. static int ntn_nlm = (sizeof(tn_nlmtab) / sizeof(struct keytab));
  1339. static struct keytab tnlmtab[] = { /* TELNET NEWLINE-MODE table */
  1340.     "cr",     TNL_CR,    CM_INV, /* CR only (out of spec) */
  1341.     "cr-lf",  TNL_CRLF,  CM_INV, /* CR-LF (TELNET spec) */
  1342.     "cr-nul", TNL_CRNUL, CM_INV, /* CR-NUL (TELNET spec) */
  1343.     "lf",     TNL_LF,    CM_INV, /* LF instead of CR-LF */
  1344.     "off",    TNL_CRNUL, 0, /* CR-NUL (TELNET spec) */
  1345.     "on",     TNL_CRLF,  0, /* CR-LF (TELNET spec) */
  1346.     "raw",    TNL_CR,    0 /* CR only (out of spec) */
  1347. };
  1348. static int ntnlm = (sizeof(tnlmtab) / sizeof(struct keytab));
  1349. struct keytab tntab[] = {
  1350. #ifdef CK_AUTHENTICATION
  1351.     "authentication",       CK_TN_AU,  0,
  1352. #endif /* CK_AUTHENTICATION */
  1353.     "b",                    CK_TN_BM,  CM_INV|CM_ABR,
  1354.     "bi",                   CK_TN_BM,  CM_INV|CM_ABR,
  1355.     "bin",                  CK_TN_BM,  CM_INV|CM_ABR,
  1356.     "bina",                 CK_TN_BM,  CM_INV|CM_ABR,
  1357.     "binar",                CK_TN_BM,  CM_INV|CM_ABR,
  1358.     "binary",               CK_TN_BM,  CM_INV|CM_ABR,
  1359.     "binary-",              CK_TN_BM,  CM_INV|CM_ABR,
  1360.     "binary-mode",          CK_TN_BM,  CM_INV,
  1361.     "binary-transfer-mode", CK_TN_XF,  0,
  1362.     "binary-xfer-mode",     CK_TN_XF,  CM_INV,
  1363.     "bug",                  CK_TN_BUG, 0,
  1364.     "debug",                CK_TN_DB,  0,
  1365.     "echo",                 CK_TN_EC,  0,
  1366. #ifdef CK_ENCRYPTION
  1367.     "encryption",      CK_TN_ENC,  0,
  1368. #endif /* CK_ENCRYPTION */
  1369. #ifdef CK_ENVIRONMENT
  1370.     "environment",     CK_TN_ENV,  0,
  1371. #endif /* CK_ENVIRONMENT */
  1372. #ifdef IKS_OPTION
  1373.     "kermit",          CK_TN_IKS,  CM_INV,
  1374. #endif /* IKS_OPTION */
  1375. #ifdef CK_SNDLOC
  1376.     "location",        CK_TN_LOC,  0,
  1377. #endif /* CK_SNDLOC */
  1378. #ifdef CK_NAWS
  1379.     "naws",            CK_TN_NAWS, CM_INV,
  1380. #endif /* CK_NAWS */
  1381.     "newline-mode",    CK_TN_NL,   0,
  1382.     "no-encrypt-during-xfer", CK_TN_NE, CM_INV,
  1383.     "prompt-for-userid",CK_TN_PUID,0,
  1384.     "remote-echo",     CK_TN_RE,   0,
  1385. #ifdef CK_SSL
  1386.     "start-tls",       CK_TN_TLS,  CM_INV,
  1387. #endif /* CK_SSL */
  1388.     "terminal-type",   CK_TN_TT,   0,
  1389.     "wait-for-negotiations", CK_TN_WAIT, 0,
  1390. #ifdef CK_ENVIRONMENT
  1391.     "xdisplay-location",CK_TN_XD, CM_INV,
  1392. #endif /* CK_ENVIRONMENT */
  1393.     "", 0, 0
  1394. };
  1395. int ntn = (sizeof(tntab) / sizeof(struct keytab)) - 1;
  1396. struct keytab tnopttab[] = {
  1397. #ifdef CK_AUTHENTICATION
  1398.     "authentication",  CK_TN_AU,   0,
  1399. #else
  1400.     "authentication",  CK_TN_AU,   CM_INV,
  1401. #endif /* CK_AUTHENTICATION */
  1402.     "binary-mode",     CK_TN_BM,   0,
  1403.     "com-port-control",CK_TN_CPC,  CM_INV,
  1404.     "echo",            CK_TN_EC,   0,
  1405. #ifdef CK_ENCRYPTION
  1406.     "encryption",      CK_TN_ENC,  0,
  1407. #else
  1408.     "encryption",      CK_TN_ENC,  CM_INV,
  1409. #endif /* CK_ENCRYPTION */
  1410. #ifdef CK_FORWARD_X
  1411.     "forward_x",       CK_TN_FX,   0,
  1412. #else /* CK_FORWARD_X */
  1413.     "forward_x",       CK_TN_FX,   CM_INV,
  1414. #endif /* CK_FORWARD_X */
  1415.     "ibm-sak",         CK_TN_SAK,  CM_INV,
  1416. #ifdef IKS_OPTION
  1417.     "kermit",          CK_TN_IKS,  0,
  1418. #else
  1419.     "kermit",          CK_TN_IKS,  CM_INV,
  1420. #endif /* IKS_OPTION */
  1421.     "lflow",           CK_TN_FLW,  CM_INV,
  1422. #ifdef CK_NAWS
  1423.     "naws",            CK_TN_NAWS, 0,
  1424. #else
  1425.     "naws",            CK_TN_NAWS, CM_INV,
  1426. #endif /* CK_NAWS */
  1427. #ifdef CK_ENVIRONMENT
  1428.     "new-environment", CK_TN_ENV,  0,
  1429. #else
  1430.     "new-environment", CK_TN_ENV,  CM_INV,
  1431. #endif /* CK_ENVIRONMENT */
  1432.     "pragma-heartbeat",CK_TN_PHR,  CM_INV,
  1433.     "pragma-logon",    CK_TN_PLG,  CM_INV,
  1434.     "pragma-sspi",     CK_TN_PSP,  CM_INV,
  1435.     "sak",             CK_TN_SAK,  CM_INV,
  1436. #ifdef CK_SNDLOC
  1437.     "send-location",   CK_TN_LOC,  0,
  1438. #else
  1439.     "send-location",   CK_TN_LOC,  CM_INV,
  1440. #endif /* CK_SNDLOC */
  1441.     "sga",             CK_TN_SGA, CM_INV|CM_ABR,
  1442. #ifdef CK_SSL
  1443.     "start-tls",       CK_TN_TLS,  0,
  1444. #else
  1445.     "start-tls",       CK_TN_TLS,  CM_INV,
  1446. #endif /* CK_SSL */
  1447.     "suppress-go-aheads", CK_TN_SGA, 0,
  1448.     "terminal-type",   CK_TN_TT,   0,
  1449.     "ttype",           CK_TN_TT,   CM_INV|CM_ABR,
  1450. #ifdef CK_ENVIRONMENT
  1451.     "xdisplay-location", CK_TN_XD, 0,
  1452. #else
  1453.     "xdisplay-location", CK_TN_XD, CM_INV,
  1454. #endif /* CK_ENVIRONMENT */
  1455.     "", 0, 0
  1456. };
  1457. int ntnopt = (sizeof(tnopttab) / sizeof(struct keytab)) - 1;
  1458. struct keytab tnoptsw[] = {
  1459.     "/client",  CK_TN_CLIENT,   0,
  1460.     "/server",  CK_TN_SERVER,   0
  1461. };
  1462. int ntnoptsw = (sizeof(tnoptsw) / sizeof(struct keytab));
  1463. #endif /* TNCODE */
  1464. struct keytab ftrtab[] = { /* Feature table */
  1465. #ifndef NOCSETS /* 0 = we have it, 1 = we don't */
  1466. "character-sets", 0, 0,
  1467. #else
  1468. "character-sets", 1, 0,
  1469. #endif /* NOCSETS */
  1470. #ifndef NOCYRIL
  1471. "cyrillic", 0, 0,
  1472. #else
  1473. "cyrillic", 1, 0,
  1474. #endif /* NOCYRIL */
  1475. #ifndef NOLOGDIAL
  1476. "cx-log",               0, 0,
  1477. #else
  1478. "cx-log",               1, 0,
  1479. #endif /* NOLOGDIAL */
  1480. #ifndef NODEBUG
  1481. "debug", 0, 0,
  1482. #else
  1483. "debug", 1, 0,
  1484. #endif /* NODEBUG */
  1485. #ifndef NODIAL
  1486. "dial", 0, 0,
  1487. #else
  1488. "dial", 1, 0,
  1489. #endif /* NODIAL */
  1490. #ifdef DYNAMIC
  1491. "dynamic-memory",       0, 0,
  1492. #else
  1493. "dynamic-memory",       1, 0,
  1494. #endif /* DYNAMIC */
  1495. #ifndef NOXFER
  1496. "file-transfer",        0, 0,
  1497. #else
  1498. "file-transfer",        1, 0,
  1499. #endif /* NOXFER */
  1500. #ifdef XXFWD
  1501. "forward",              0, 0,
  1502. #else
  1503. "forward",              1, 0,
  1504. #endif /* XXFWD */
  1505. #ifdef CK_CURSES
  1506. "fullscreen-display", 0, 0,
  1507. #else
  1508. "fullscreen-display", 1, 0,
  1509. #endif /* CK_CURSES */
  1510. #ifdef GREEK
  1511. "greek",                0, 0,
  1512. #else
  1513. "greek",                1, 0,
  1514. #endif /* GREEK */
  1515. #ifdef HEBREW
  1516. "hebrew",               0, 0,
  1517. #else
  1518. "hebrew",               1, 0,
  1519. #endif /* HEBREW */
  1520. #ifndef NOHELP
  1521. "help", 0, 0,
  1522. #else
  1523. "help", 1, 0,
  1524. #endif /* NOHELP */
  1525. #ifndef NOIKSD
  1526. "iksd",                 0, 0,
  1527. #else
  1528. "iksd",                 1, 0,
  1529. #endif /* NOIKSD */
  1530. #ifndef NOSPL
  1531. "if-command", 0, 0,
  1532. #else
  1533. "if-command", 1, 0,
  1534. #endif /* NOSPL */
  1535. #ifndef NOJC
  1536. #ifdef UNIX
  1537. "job-control", 0, 0,
  1538. #else
  1539. "job-control", 1, 0,
  1540. #endif /* UNIX */
  1541. #else
  1542. "job-control", 1, 0,
  1543. #endif /* NOJC */
  1544. #ifdef KANJI
  1545. "kanji", 0, 0,
  1546. #else
  1547. "kanji", 1, 0,
  1548. #endif /* KANJI */
  1549. #ifndef NOXFER
  1550. "kermit",               0, 0,
  1551. #else
  1552. "kermit",               1, 0,
  1553. #endif /* NOXFER */
  1554. #ifdef CK_KERBEROS
  1555. "kerberos", 0, 0,
  1556. #else
  1557. "kerberos", 1, 0,
  1558. #endif /* CK_KERBEROS */
  1559. #ifndef NOCSETS
  1560. "latin1", 0, 0,
  1561. #else
  1562. "latin1", 1, 0,
  1563. #endif /* NOCSETS */
  1564. #ifdef LATIN2
  1565. "latin2", 0, 0,
  1566. #else
  1567. "latin2", 1, 0,
  1568. #endif /* LATIN2 */
  1569. #ifndef NOLOCAL
  1570. "making-connections",   0, 0,
  1571. #else
  1572. "making-connections",   1, 0,
  1573. #endif /* NOLOCAL */
  1574. #ifdef NETCONN
  1575. "network", 0, 0,
  1576. #else
  1577. "network", 1, 0,
  1578. #endif /* NETCONN */
  1579. #ifdef NT
  1580. #ifdef CK_AUTHENTICATION
  1581. "ntlm",                 1, 0,
  1582. #else /* CK_AUTHENTICATION */
  1583. "ntlm",                 0, 0,
  1584. #endif /* CK_AUTHENTICATION */
  1585. #else /* NT */
  1586. "ntlm",                 0, 0,
  1587. #endif /* NT */
  1588. #ifdef PIPESEND
  1589. "pipes",                0, 0,
  1590. #else
  1591. #ifdef NETCMD
  1592. "pipes",                0, 0,
  1593. #endif /* NETCMD */
  1594. #endif /* PIPESEND */
  1595. #ifndef PIPESEND
  1596. #ifndef NETCMD
  1597. "pipes",                1, 0,
  1598. #endif /* PIPESEND */
  1599. #endif /* NETCMD */
  1600. #ifdef NETPTY
  1601. "pty",                  0, 0,
  1602. #else
  1603. "pty",                  1, 0,
  1604. #endif /* NETPTY */
  1605. #ifndef NOPUSH
  1606. "push", 0, 0,
  1607. #else
  1608. "push", 1, 0,
  1609. #endif /* PUSH */
  1610. #ifdef CK_REDIR
  1611. "redirect",             0, 0,
  1612. #else
  1613. "redirect",             1, 0,
  1614. #endif /* CK_REDIR */
  1615. #ifdef CK_RTSCTS
  1616. "rts/cts", 0, 0,
  1617. #else
  1618. "rts/cts", 1, 0,
  1619. #endif /* RTS/CTS */
  1620. #ifndef NOSCRIPT
  1621. "script-command", 0, 0,
  1622. #else
  1623. "script-command", 1, 0,
  1624. #endif /* NOSCRIPT */
  1625. #ifndef NOSERVER
  1626. "server-mode", 0, 0,
  1627. #else
  1628. "server-mode", 1, 0,
  1629. #endif /* NOSERVER */
  1630. #ifndef NOSHOW
  1631. "show-command", 0, 0,
  1632. #else
  1633. "show-command", 1, 0,
  1634. #endif /* NOSHOW */
  1635. #ifdef CK_SRP
  1636. "srp",         0, 0,
  1637. #else
  1638. "srp",         1, 0,
  1639. #endif /* CK_SRP */
  1640. #ifdef CK_SSL
  1641. "ssl/tls", 0, 0,
  1642. #else
  1643. "ssl/tls", 1, 0,
  1644. #endif /* CK_SSL */
  1645. #ifndef NOXMIT
  1646. "transmit", 0, 0,
  1647. #else
  1648. "transmit", 1, 0,
  1649. #endif /* NOXMIT */
  1650. #ifdef UNICODE
  1651. "unicode",              0, 0,
  1652. #else
  1653. "unicode",              1, 0,
  1654. #endif /* UNICODE */
  1655. #ifdef CK_XYZ
  1656. "xyzmodem", 0, 0,
  1657. #else
  1658. "xyzmodem", 1, 0,
  1659. #endif /* NOXMIT */
  1660. "", 0, 0
  1661. };
  1662. int nftr = (sizeof(ftrtab) / sizeof(struct keytab)) - 1;
  1663. struct keytab desttab[] = { /* SET DESTINATION */
  1664. #ifdef CALIBRATE
  1665.     "calibrate", DEST_N, CM_INV,
  1666. #endif /* CALIBRATE */
  1667.     "disk",    DEST_D, 0,
  1668. #ifdef CALIBRATE
  1669.     "nowhere", DEST_N, 0,
  1670. #endif /* CALIBRATE */
  1671.     "printer", DEST_P, 0,
  1672.     "screen",  DEST_S, 0
  1673. };
  1674. int ndests =  (sizeof(desttab) / sizeof(struct keytab));
  1675. #ifndef NOSPL /* Used only with script programming items... */
  1676. #ifndef NOSERVER /* This is just to avoid some */
  1677. #define CK_PARSDIR /* "statement not reached" */
  1678. #else /* complaints... */
  1679. #ifndef NODIAL
  1680. #define CK_PARSDIR
  1681. #endif /* NODIAL */
  1682. #endif /* NOSERVER */
  1683. /*
  1684.   cx == 0 means dial directory
  1685.   cx == 1 means network directory
  1686.   cx == 2 means a directory path list
  1687. */
  1688. static int
  1689. parsdir(cx) int cx; {
  1690.     int i, x, y, dd; /* Workers */
  1691.     int nxdir;
  1692.     char *s;
  1693.     char ** xdir;
  1694.     char *pp[MAXGETPATH]; /* Temporary name pointers */
  1695. #ifdef ZFNQFP
  1696.     struct zfnfp * fnp;
  1697. #ifdef OS2
  1698.     char * env;
  1699.     char dirpath[4096];
  1700. #else /* OS2 */
  1701.     char dirpath[1024]; /* For fully qualified filenames */
  1702. #endif /* OS2 */
  1703. #endif /* ZFNQFP */
  1704.     int max = 0; /* Maximum number of things to parse */
  1705.     char c;
  1706. #ifndef NODIAL
  1707.     if (cx == 0) { /* Dialing */
  1708. nxdir = ndialdir;
  1709. xdir = dialdir;
  1710. max = MAXDDIR;
  1711.     } else
  1712. #ifdef NETCONN
  1713.     if (cx == 1) { /* Network */
  1714. nxdir = nnetdir;
  1715. xdir = netdir;
  1716. max = MAXDDIR;
  1717.     } else
  1718. #endif /* NETCONN */
  1719. #endif /* NODIAL */
  1720. #ifndef NOSERVER
  1721.     if (cx == 2) { /* GET path */
  1722. nxdir = ngetpath;
  1723. xdir = getpath;
  1724. max = MAXGETPATH;
  1725.     } else /* Called with invalid function code */
  1726. #endif /* NOSERVER */
  1727.       return(-2);
  1728. #ifdef CK_PARSDIR
  1729.     dd = 0; /* Temporary name counter */
  1730.     while (1) {
  1731. if (cx != 2) { /* Dialing or Network Directory */
  1732. #ifdef OS2
  1733.     int len;
  1734. #ifdef NT
  1735.     env = getenv("K95PHONES");
  1736. #else /* NT */
  1737.     env = getenv("K2PHONES");
  1738. #endif /* NT */
  1739.     if (!env)
  1740.       env = getenv("K95PHONES");
  1741.             if (!env)
  1742.       env = "";
  1743.             dirpath[0] = '';
  1744.             len = strlen(env) + 2*strlen(startupdir) + 2*strlen(inidir)
  1745.                 + 2*strlen(zhome()) + 2*strlen(exedir) + 4*strlen("PHONES/")
  1746.                 + 12;
  1747.             if (len < 4096)
  1748.       sprintf(dirpath,"%s%s%s;%s%s;%s;%s%s;%s;%s%s",
  1749.     /* Semicolon-separated path list */
  1750.     env,
  1751.     (env[0] && env[strlen(env)-1] == ';') ? "" : ";",
  1752.     startupdir,
  1753.     startupdir, "PHONES/",
  1754.     inidir,
  1755.     inidir, "PHONES/",
  1756.                     zhome(),
  1757.                     zhome(), "PHONES/",
  1758.     exedir,
  1759.     exedir, "PHONES/"
  1760.     );
  1761. #else
  1762. #ifdef UNIX
  1763.     y = 1024;
  1764.     s = dirpath;
  1765.     zzstring("\v(home)",&s,&y);
  1766. #endif /* UNIX */
  1767. #endif /* OS2 */
  1768.     y = cmifip(
  1769.   "Names of one or more directory files, separated by spaces",
  1770.        "",&s,&x,0,
  1771. #ifdef OS2ORUNIX
  1772.        dirpath,
  1773. #else
  1774.        NULL,
  1775. #endif /* OS2ORUNIX */
  1776.        xxstring
  1777.        );
  1778. } else { /* List of directory names */
  1779.     x = 0;
  1780.     y = cmdir("Directory name","",&s,xxstring);
  1781. }
  1782. if (y < 0) {
  1783.     if (y == -3) { /* EOL or user typed <CR> */
  1784. if ((y = cmcfm()) < 0) return(y);
  1785. for (i = 0; i < max; i++) { /* Clear these */
  1786.     if (i < nxdir && xdir[i]) {
  1787. free(xdir[i]);
  1788.     }
  1789.     xdir[i] = (i < dd) ? pp[i] : NULL;
  1790. }
  1791. #ifndef NODIAL
  1792. if (cx == 0)
  1793.   ndialdir = dd;
  1794. #ifdef NETCONN
  1795. if (cx == 1)
  1796.   nnetdir = dd;
  1797. #endif /* NETCONN */
  1798. #endif /* NODIAL */
  1799. #ifndef NOSERVER
  1800. if (cx == 2)
  1801.   ngetpath = dd;
  1802. #endif /* NOSERVER */
  1803. return(success = 1);
  1804.     } else { /* Parse error */
  1805. for (i = 0; i < dd; i++) {  /* Free temp storage */
  1806.     if (pp[i]) free(pp[i]); /* but don't change */
  1807.     pp[i] = NULL;           /* anything else */
  1808. }
  1809. return(y);
  1810.     }
  1811. }
  1812. if (x) {
  1813.     printf("?Wildcards not allowedn");
  1814.     return(-9);
  1815. }
  1816. #ifdef CK_TMPDIR
  1817. if (cx == 2 && !isdir(s)) {
  1818.     printf("?Not a directory - %sn", s);
  1819.     return(-9);
  1820. }
  1821. #endif /* CK_TMPDIR */
  1822. #ifdef ZFNQFP
  1823. /* Get fully qualified pathname */
  1824. if (fnp = zfnqfp(s,TMPBUFSIZ - 1,tmpbuf)) {
  1825.     if (fnp->fpath)
  1826.       if ((int) strlen(fnp->fpath) > 0)
  1827. s = fnp->fpath;
  1828. }
  1829. #endif /* ZFNQFP */
  1830. c = NUL;
  1831. x = strlen(s);
  1832. if (x > 0) /* Get last char */
  1833.   c = s[x-1];
  1834. debug(F000,"parsdir s",s,c);
  1835. if ((pp[dd] = malloc(strlen(s)+2)) == NULL) {
  1836.     printf("?Internal error - mallocn");
  1837.     for (i = 0; i < dd; i++) {  /* Free temp storage */
  1838. if (pp[i]) free(pp[i]);
  1839. pp[i] = NULL;
  1840.     }
  1841.     return(-9);
  1842. } else { /* Have storage for name */
  1843.     strcpy(pp[dd],s); /* Copy string into new storage */
  1844.     debug(F111,"parsdir pp[dd] 1",pp[dd],dd);
  1845. #ifndef NOXFER
  1846.     if (cx == 2) { /* If we are parsing directories */
  1847. char dirsep[2];
  1848. extern int myindex; /* Append directory separator if */
  1849. extern struct sysdata sysidlist[]; /* it is missing...   */
  1850. debug(F101,"parsdir myindex","",myindex);
  1851. if (myindex > -1)
  1852.   if (sysidlist[myindex].sid_unixlike)
  1853.     if (c != sysidlist[myindex].sid_dirsep) {
  1854. dirsep[0] = sysidlist[myindex].sid_dirsep;
  1855. dirsep[1] = NUL;
  1856. strcat(pp[dd], (char *) dirsep);
  1857.     }
  1858.     }
  1859. #endif /* NOXFER */
  1860.     debug(F111,"parsdir pp[dd] 2",pp[dd],dd);
  1861.     if (++dd > max) {
  1862. printf("?Too many directories - %d maxn", max);
  1863. for (i = 0; i < dd; i++) {  /* Free temp storage */
  1864.     if (pp[i]) free(pp[i]);
  1865.     pp[i] = NULL;
  1866. }
  1867.     }
  1868. }
  1869.     }
  1870. #endif /* CK_PARSDIR */
  1871. }
  1872. #endif /* NOSPL */
  1873. #ifndef NOSERVER
  1874. static int
  1875. cklogin() {
  1876.     int x;
  1877.     char * s;
  1878.     char username[LOGINLEN+1];
  1879.     char password[LOGINLEN+1];
  1880.     char account[LOGINLEN+1];
  1881.     extern char * x_user, * x_passwd, * x_acct;
  1882.     extern int x_login, x_logged;
  1883.     username[0] = NUL;
  1884.     password[0] = NUL;
  1885.     account[0]  = NUL;
  1886.     x = cmfld("username", "", &s, xxstring);
  1887.     if (x != -3) {
  1888. if (x < 0)
  1889.   return(x);
  1890. if ((int)strlen(s) > LOGINLEN) {
  1891.     printf(""%s" - too long, %d maxn", s, LOGINLEN);
  1892.     return(-9);
  1893. }
  1894. strcpy(username,s);
  1895. x = cmfld("password", "", &s, xxstring);
  1896. if (x != -3) {
  1897.     if (x < 0)
  1898.       return(x);
  1899.     if ((int)strlen(s) > LOGINLEN) {
  1900. printf(""%s" - too long, %d maxn", s, LOGINLEN);
  1901. return(-9);
  1902.     }
  1903.     strcpy(password,s);
  1904.     x = cmfld("account", "", &s, xxstring);
  1905.     if (x != -3) {
  1906. if (x < 0)
  1907.   return(x);
  1908. if ((int)strlen(s) > LOGINLEN) {
  1909.     printf(""%s" - too long, %d maxn", s, LOGINLEN);
  1910.     return(-9);
  1911. }
  1912. strcpy(account,s);
  1913. if ((x = cmcfm()) < 0)
  1914.   return(x);
  1915.     }
  1916. }
  1917.     }
  1918.     makestr(&x_user,username);
  1919.     makestr(&x_passwd,password);
  1920.     makestr(&x_acct,account);
  1921.     x_login = (x_user) ? 1 : 0;
  1922.     x_logged = 0;
  1923.     return(1);
  1924. }
  1925. #endif /* NOSERVER */
  1926. #ifndef NOLOCAL
  1927. static int
  1928. setdcd() {
  1929.     int x, y, z = 0;
  1930.     if ((y = cmkey(crrtab,ncrr,"","auto",xxstring)) < 0) return(y);
  1931.     if (y == CAR_ON) {
  1932. x = cmnum("Carrier wait timeout, seconds","0",10,&z,xxstring);
  1933. if (x < 0) return(x);
  1934.     }
  1935.     if ((x = cmcfm()) < 0) return(x);
  1936.     carrier = ttscarr(y);
  1937.     cdtimo = z;
  1938.     return(1);
  1939. }
  1940. #endif /* NOLOCAL */
  1941. extern struct keytab yesno[];
  1942. extern int nyesno;
  1943. static struct keytab qyesno[] = { /* Yes/No/Quit keyword table */
  1944.     "no",    0, 0,
  1945.     "ok",    1, 0,
  1946.     "quit",  2, 0,
  1947.     "yes",   1, 0
  1948. };
  1949. static int nqyesno = (sizeof(qyesno) / sizeof(struct keytab));
  1950. /* Ask question, get yes/no answer */
  1951. int
  1952. getyesno(msg, quit) char * msg; int quit; {
  1953. #ifdef CK_RECALL
  1954.     int sv_recall; /* For turning off command recall */
  1955.     extern int on_recall; /* around Password prompting */
  1956. #endif /* CK_RECALL */
  1957.     int y, z;
  1958. #ifdef OS2
  1959.     extern int vmode;
  1960.     int vmode_sav = vmode;
  1961. #ifdef COMMENT
  1962.     if (win95_popup
  1963. #ifdef IKSD
  1964. && !inserver
  1965. #endif /* IKSD */
  1966. )
  1967.       return(popup_readyesno(vmode,prmpt,quit));
  1968. #endif /* COMMENT */
  1969.     if (vmode == VTERM) {
  1970.         vmode = VCMD;
  1971.         VscrnIsDirty(VTERM);
  1972.         VscrnIsDirty(VCMD);
  1973.     }
  1974. #endif /* OS2 */
  1975. #ifdef VMS
  1976. /*
  1977.   In VMS, whenever a TAKE file or macro is active, we restore the
  1978.   original console modes so Ctrl-C/Ctrl-Y can work.  But here we
  1979.   go interactive again, so we have to temporarily put them back.
  1980. */
  1981.     if (!cmdsrc())
  1982.       concb((char)escape);
  1983. #endif /* VMS */
  1984. #ifdef CK_RECALL
  1985.     sv_recall = on_recall; /* Save and turn off command recall */
  1986.     on_recall = 0;
  1987. #endif /* CK_RECALL */
  1988.     cmsavp(psave,PROMPTL); /* Save old prompt */
  1989.     cmsetp(msg); /* Make new prompt */
  1990.     z = 0; /* Initialize answer to No. */
  1991.     cmini(ckxech); /* Initialize parser. */
  1992.     do {
  1993. prompt(NULL); /* Issue prompt. */
  1994. if (quit)
  1995.   y = cmkey(qyesno,nqyesno,"","",NULL); /* Get Yes or No */
  1996. else
  1997.   y = cmkey(yesno,nyesno,"","",NULL); /* Get Yes or No */
  1998. if (y < 0) {
  1999.     if (y == -4) { /* EOF */
  2000. z = y;
  2001. break;
  2002.     } else if (y == -3) /* No answer? */
  2003.       printf(" Please respond Yes or No%sn", quit ? " or Quit" : "");
  2004.     cmini(ckxech);
  2005. } else {
  2006.     z = y; /* Save answer */
  2007.     y = cmcfm(); /* Get confirmation */
  2008. }
  2009.     } while (y < 0); /* Continue till done */
  2010.     cmsetp(psave); /* Restore real prompt */
  2011. #ifdef CK_RECALL
  2012.     on_recall = sv_recall; /* Restore command recall */
  2013. #endif /* CK_RECALL */
  2014. #ifdef VMS
  2015.     if (cmdlvl > 0) /* In VMS and not at top level, */
  2016.       conres(); /*  restore console again. */
  2017. #endif /* VMS */
  2018. #ifdef OS2
  2019.     if (vmode != vmode_sav) {
  2020.         vmode = VTERM;
  2021.         VscrnIsDirty(VCMD);
  2022.         VscrnIsDirty(VTERM);
  2023.     }
  2024. #endif /* OS2 */
  2025.     return(z);
  2026. }
  2027. int /* CHECK command */
  2028. dochk() {
  2029.     int x, y;
  2030.     if ((y = cmkey(ftrtab,nftr,"","",xxstring)) < 0)
  2031.       return(y);
  2032.     strcpy(line,atmbuf);
  2033.     if ((y = cmcfm()) < 0)
  2034.       return(y);
  2035. #ifndef NOPUSH
  2036.     if (!ckstrcmp(line,"push",(int)strlen(line),0)) {
  2037. if (msgflg) /* If at top level... */
  2038.   printf(" push%s availablen", nopush ? " not" : "");
  2039. else if (nopush && !backgrd)
  2040.   printf(" CHECK: push not availablen");
  2041. return(success = 1 - nopush);
  2042.     }
  2043. #endif /* NOPUSH */
  2044. #ifdef PIPESEND
  2045.     if (!ckstrcmp(line,"pipes",(int)strlen(line),0)) {
  2046. if (msgflg) /* If at top level... */
  2047.   printf(" pipes%s availablen",
  2048.  (nopush || protocol != PROTO_K) ? " not" : "");
  2049. else if ((nopush || protocol != PROTO_K) && !backgrd)
  2050.   printf(" CHECK: pipes not availablen");
  2051. return(success = 1 - nopush);
  2052.     }
  2053. #endif /* PIPESEND */
  2054.     y = lookup(ftrtab,line,nftr,&x); /* Look it up */
  2055.     debug(F111,"dochk",ftrtab[x].kwd,y);
  2056.     if (msgflg) /* If at top level... */
  2057.       printf(" %s%s availablen", ftrtab[x].kwd, y ? " not" : "");
  2058.     else if (y && !backgrd)
  2059.       printf(" CHECK: %s not availablen", ftrtab[x].kwd);
  2060.     return(success = 1 - y);
  2061. }
  2062. #ifndef NOLOCAL
  2063. #ifdef CKLOGDIAL
  2064. /* Connection log and elapsed-time reporting */
  2065. extern char cxlogbuf[]; /* Log record buffer */
  2066. extern char diafil[]; /* Log file name */
  2067. extern int dialog, cx_active; /* Flags */
  2068. static int cx_prev = 0L; /* Elapsed time of previous session */
  2069. VOID
  2070. dologend() { /* Write record to connection log */
  2071.     long d1, d2, t1, t2;
  2072.     char buf[32], * p;
  2073.     debug(F101,"dologend dialog","",dialog);
  2074.     debug(F101,"dologend cxlogbuf[0]","",cxlogbuf[0]);
  2075. #ifdef CKSYSLOG
  2076.     debug(F101,"dologend ckxlogging","",ckxlogging);
  2077. #endif /* CKSYSLOG */
  2078.     if (!cx_active || !cxlogbuf[0]) /* No active record */
  2079.       return;
  2080.     cx_active = 0; /* Record is not active */
  2081.     debug(F110,"dologend cxlogbuf 1",cxlogbuf,0);
  2082.     d1 = mjd((char *)cxlogbuf); /* Get start date of this session */
  2083.     ckstrncpy(buf,ckdate(),31); /* Get current date */
  2084.     d2 = mjd(buf); /* Convert them to mjds */
  2085.     p = cxlogbuf; /* Get start time */
  2086.     p[11] = NUL;
  2087.     p[14] = NUL; /* Convert to seconds */
  2088.     t1 = atol(p+9) * 3600L + atol(p+12) * 60L + atol(p+15);
  2089.     p[11] = ':';
  2090.     p[14] = ':';
  2091.     p = buf; /* Get end time */
  2092.     p[11] = NUL;
  2093.     p[14] = NUL;
  2094.     t2 = atol(p+9) * 3600L + atol(p+12) * 60L + atol(p+15);
  2095.     t2 = ((d2 - d1) * 86400L) + (t2 - t1); /* Compute elapsed time */
  2096.     debug(F101,"dologend t2","",t2);
  2097.     if (t2 > -1L) {
  2098. cx_prev = t2;
  2099. p = hhmmss(t2);
  2100. debug(F110,"dologend hhmmss",p,0);
  2101. strncat(cxlogbuf,"E=",CXLOGBUFL); /* Append to log record */
  2102. strncat(cxlogbuf,p,CXLOGBUFL);
  2103. debug(F110,"dologend cxlogbuf 2",cxlogbuf,0);
  2104.     } else
  2105.       cx_prev = 0L;
  2106.     debug(F101,"dologend cx_prev","",cx_prev);
  2107.     if (dialog) { /* If logging */
  2108. int x;
  2109. x = diaopn(diafil,1,1); /* Open log in append mode */
  2110. debug(F101,"dologend diaopn","",x);
  2111. x = zsoutl(ZDIFIL,cxlogbuf); /* Write the record */
  2112. debug(F101,"dologend zsoutl","",x);
  2113. x = zclose(ZDIFIL); /* Close the log */
  2114. debug(F101,"dologend zclose","",x);
  2115.     }
  2116. #ifdef CKSYSLOG
  2117.     debug(F101,"dologend ckxlogging","",ckxlogging);
  2118.     if (ckxlogging) {
  2119. int x;
  2120. x = ckindex("T=DIAL",cxlogbuf,0,0,1);
  2121. debug(F111,"dologend ckxsyslog",cxlogbuf,ckxsyslog);
  2122. debug(F111,"dologend ckindex","T=DIAL",x);
  2123.         if (x > 0) {
  2124.     if (ckxsyslog >= SYSLG_DI) {
  2125. debug(F110,"dologend syslog",cxlogbuf+18,0);
  2126. cksyslog(SYSLG_DI,1,"CONNECTION",(char *)(cxlogbuf+18),"");
  2127.     } else if (ckxsyslog >= SYSLG_AC) {
  2128. debug(F110,"dologend syslog",cxlogbuf+18,0);
  2129. cksyslog(SYSLG_AC,1,"CONNECTION",(char *)(cxlogbuf+18),"");
  2130.     }
  2131.         }
  2132.     }
  2133. #endif /* CKSYSLOG */
  2134. }
  2135. /*  D O L O G S H O W  --  Show session/connection info  */
  2136. /* Call with fc == 1 to show, fc == 0 to only calculate. */
  2137. /* Returns session elapsed time in seconds. */
  2138. /* If no session active, returns elapsed time of previous session, if any, */
  2139. /* otherwise 0 */
  2140. long
  2141. dologshow(fc) int fc; { /* SHOW (current) CONNECTION */
  2142.     long d1, d2, t1, t2 = 0;
  2143.     char c, buf1[32], buf2[32], * info[32], * p, * s;
  2144.     char xbuf[CXLOGBUFL+1];
  2145.     int i, x = 0, z;
  2146.     if (!cxlogbuf[0]) {
  2147. if (fc) {
  2148.     if (didsetlin)
  2149.       printf(" No record.n");
  2150.     else
  2151.       printf(" No connection.n");
  2152. }
  2153. return(cx_prev);
  2154.     }
  2155.     debug(F101,"dologshow local","",local);
  2156.     debug(F101,"dologshow cx_active","",cx_active);
  2157.     if (local)
  2158.       z = ttchk(); /* See if we have an open connection */
  2159.     else
  2160.       z = cx_active ? 1 : -2;
  2161.     if (z < 0L) {
  2162. if (!fc)
  2163.   return(cx_prev);
  2164. else
  2165.   t2 = cx_prev;
  2166.     }
  2167.     debug(F101,"dologshow ttchk","",z);
  2168.     debug(F101,"dologshow cx_prev","",cx_prev);
  2169.     ckstrncpy(buf1,cxlogbuf,17); /* Copy of just the timestamp */
  2170.     buf1[17] = NUL; /* Terminate it */
  2171.     ckstrncpy(xbuf,cxlogbuf+18,CXLOGBUFL); /* Copy that can be poked */
  2172.     xwords(xbuf,31,info,1); /* Break up into fields */
  2173.     d1 = mjd(buf1); /* Convert start time to MJD */
  2174.     ckstrncpy(buf2,ckdate(),31); /* Current date */
  2175.     d2 = mjd(buf2); /* Convert to MJD */
  2176.     p = buf1; /* Point to start time */
  2177.     p[11] = NUL;
  2178.     p[14] = NUL; /* Convert to seconds */
  2179.     t1 = atol(p+9) * 3600L + atol(p+12) * 60L + atol(p+15);
  2180.     p[11] = ':';
  2181.     p[14] = ':';
  2182.     p = buf2; /* Ditto for current time */
  2183.     p[11] = NUL;
  2184.     p[14] = NUL;
  2185.     if (z > -1L) {
  2186. t2 = atol(p+9) * 3600L + atol(p+12) * 60L + atol(p+15);
  2187. t2 = ((d2 - d1) * 86400L) + (t2 - t1); /* Elapsed time so far */
  2188.     }
  2189.     if (fc) {
  2190. p = NULL;
  2191. if (t2 > -1L) /* Convert seconds to hh:mm:ss */
  2192.   p = hhmmss(t2);
  2193. if (z > -1)
  2194.   s = "Active";
  2195. else if (z == -2)
  2196.   s = "Closed";
  2197. else
  2198.   s = "Unknown";
  2199. printf("n"); /* Show results */
  2200. printf(" Status:       %sn",s);
  2201. printf(" Opened:       %sn",buf1);
  2202. printf(" User:         %sn",info[1] ? info[1] : "");
  2203. printf(" PID:          %sn",info[2] ? info[2] : "");
  2204. for (i = 3; info[i]; i++) {
  2205.     c = info[i][0];
  2206.     s = (info[i]) ? info[i]+2 : "";
  2207.     switch (c) {
  2208.       case 'T': printf(" Type:         %sn", s); break;
  2209.       case 'N': printf(" To:           %sn", s); break;
  2210.       case 'H': printf(" From:         %sn", s); break;
  2211.       case 'D': printf(" Device:       %sn", s); break;
  2212.       case 'O': printf(" Origin:       %sn", s); break;
  2213.       case 'E': break;
  2214.       default:  printf(" %sn",info[i] ? info[i] : "");
  2215.     }
  2216. }
  2217. if (z < 0L)
  2218.   printf(" Elapsed time: %sn", hhmmss(t2));
  2219. else
  2220.   printf(" Elapsed time: %sn", p ? p : "(unknown)");
  2221. x = 0;
  2222. #ifdef NETCONN
  2223. #ifdef CK_ENCRYPTION
  2224. if (ck_tn_encrypting() && ck_tn_decrypting()) x++;
  2225. #endif /* CK_ENCRYPTION */
  2226. #ifdef CK_SSL
  2227. if (tls_active_flag || ssl_active_flag) x++;
  2228. #endif /* CK_SSL */
  2229. #ifdef RLOGCODE
  2230. #ifdef CK_KERBEROS
  2231. #ifdef CK_ENCRYPTION
  2232. if (ttnproto == NP_EK4LOGIN || ttnproto == NP_EK5LOGIN) x++;
  2233. #endif /* CK_ENCRYPTION */
  2234. #endif /* CK_KERBEROS */
  2235. #endif /* RLOGCODE */
  2236. #endif /* NETCONN */
  2237. printf(" Encrypted:    %sn", x ? "Yes" : "No");
  2238. printf(" Log:          %sn", dialog ? diafil : "(none)");
  2239. printf("n");
  2240.     }
  2241.     return(t2 > -1L ? t2 : 0L);
  2242. }
  2243. VOID
  2244. dologline() {
  2245.     char * p;
  2246.     int n, m = 0;
  2247.     dologend(); /* Previous session not closed out? */
  2248.     cx_active = 1; /* Record is active */
  2249.     cx_prev = 0L;
  2250.     p = ckdate(); /* Get timestamp */
  2251.     n = ckstrncpy(cxlogbuf,p,CXLOGBUFL-1); /* Start record off with it */
  2252.     m = strlen(uidbuf) + strlen(myhost) + strlen(ttname) + 32;
  2253.     if (n+m < CXLOGBUFL-1) { /* Add serial device info */
  2254. p = cxlogbuf+n;
  2255. sprintf(p," %s %s T=SERIAL H=%s D=%s ",
  2256. uidbuf,
  2257. ckgetpid(),
  2258. myhost,
  2259. ttname
  2260. );
  2261.     } else
  2262.       strcpy(cxlogbuf,"LOGLINE BUFFER OVERFLOW");
  2263.     debug(F110,"dologline",cxlogbuf,0);
  2264. }
  2265. #ifdef NETCONN
  2266. VOID
  2267. dolognet() {
  2268.     char * p, * s = "NET";
  2269.     int n, m;
  2270.     dologend(); /* Previous session not closed out? */
  2271.     cx_prev = 0L;
  2272.     cx_active = 1; /* Record is active */
  2273.     p = ckdate();
  2274.     n = ckstrncpy(cxlogbuf,p,CXLOGBUFL);
  2275. #ifdef TCPSOCKET
  2276.     if (nettype == NET_TCPB || nettype == NET_TCPA)
  2277.       s = "TCP";
  2278. #endif /* TCPSOCKET */
  2279. #ifdef ANYX25
  2280.     if (nettype == NET_SX25 || nettype == NET_VX25 || nettype == NET_IX25)
  2281.       s = "X25";
  2282. #endif /* ANYX25 */
  2283. #ifdef DECNET
  2284.     if (nettype == NET_DEC)
  2285.       s = "DECNET";
  2286. #endif /* DECNET */
  2287. #ifdef SUPERLAT
  2288.     if (nettype == NET_SLAT)
  2289.       s = "SUPERLAT";
  2290. #endif /* SUPERLAT */
  2291. #ifdef CK_NETBIOS
  2292.     if (nettype == NET_BIOS)
  2293.       s = "NETBIOS";
  2294. #endif /* CK_NETBIOS */
  2295.     m = strlen(uidbuf) + strlen(myhost) + strlen(ttname) + strlen(s) + 32;
  2296.     if (n+m < CXLOGBUFL-1) {
  2297. p = cxlogbuf+n;
  2298. sprintf(p," %s %s T=%s N=%s H=%s ",
  2299. uidbuf,
  2300. ckgetpid(),
  2301. s,
  2302. ttname,
  2303. myhost
  2304. );
  2305.     } else
  2306.       strcpy(cxlogbuf,"LOGNET BUFFER OVERFLOW");
  2307.     debug(F110,"dolognet cxlogbuf",cxlogbuf,0);
  2308. }
  2309. #endif /* NETCONN */
  2310. #endif /* CKLOGDIAL */
  2311. #ifndef NODIAL
  2312. /*
  2313.   Parse a DIAL-related string, stripping enclosing braces, if any.
  2314. */
  2315. static int
  2316. dialstr(p,msg) char **p; char *msg; {
  2317.     int x;
  2318.     char *s;
  2319.     if ((x = cmtxt(msg, "", &s, xxstring)) < 0)
  2320.       return(x);
  2321.     s = brstrip(s); /* Strip braces around. */
  2322.     makestr(p,s);
  2323.     debug(F110,"dialstr",s,0);
  2324.     return(success = 1);
  2325. }
  2326. VOID
  2327. initmdm(x) int x; {
  2328.     MDMINF * p;
  2329.     int m;
  2330.     mdmtyp = x; /* Set global modem type */
  2331.     debug(F101,"initmdm mdmtyp","",mdmtyp);
  2332.     debug(F101,"initmdm usermdm","",usermdm);
  2333.     if (x < 1) return;
  2334.     m = usermdm ? usermdm : mdmtyp;
  2335.     p = modemp[m]; /* Point to modem info struct, and */
  2336.     debug(F101,"initmdm p","",p);
  2337.     if (p) {
  2338. dialec = p->capas & CKD_EC; /* set DIAL ERROR-CORRECTION, */
  2339. dialdc = p->capas & CKD_DC; /* DIAL DATA-COMPRESSION, and */
  2340. mdmspd = p->capas & CKD_SB ? 0 : 1; /* DIAL SPEED-MATCHING from it. */
  2341. dialfc = FLO_AUTO;     /* Modem's local flow control.. */
  2342. dialmax   = p->max_speed;
  2343. dialcapas = p->capas;
  2344. dialesc   = p->esc_char;
  2345.     } else if (mdmtyp > 0) {
  2346. printf("WARNING: modem info for "%s" not filled in yetn",
  2347.        gmdmtyp()
  2348.        );
  2349.     }
  2350. /* Reset or set the SET DIAL STRING items ... */
  2351.     if (usermdm && p) { /* USER-DEFINED: copy info from specified template */
  2352. makestr(&dialini,p->wake_str);
  2353. makestr(&dialmstr,p->dmode_str);
  2354. makestr(&dialmprmt,p->dmode_prompt);
  2355. makestr(&dialcmd,p->dial_str);
  2356. makestr(&dialdcon,p->dc_on_str);
  2357. makestr(&dialdcoff,p->dc_off_str);
  2358. makestr(&dialecon,p->ec_on_str);
  2359. makestr(&dialecoff,p->ec_off_str);
  2360. makestr(&dialhcmd,p->hup_str);
  2361. makestr(&dialhwfc,p->hwfc_str);
  2362. makestr(&dialswfc,p->swfc_str);
  2363. makestr(&dialnofc,p->nofc_str);
  2364. makestr(&dialtone,p->tone);
  2365. makestr(&dialpulse,p->pulse);
  2366. makestr(&dialname,"This space available (use SET MODEM NAME)");
  2367.     } else { /* Not user-defined, so wipe out overrides */
  2368. if (dialini)   free(dialini);   dialini =   NULL; /* Init-string */
  2369. if (dialmstr)  free(dialmstr);  dialmstr =  NULL; /* Dial-mode-str */
  2370. if (dialmprmt) free(dialmprmt); dialmprmt = NULL; /* Dial-mode-pro */
  2371. if (dialcmd)   free(dialcmd);   dialcmd =   NULL; /* Dial-command  */
  2372. if (dialdcon)  free(dialdcon);  dialdcon =  NULL; /* DC ON command */
  2373. if (dialdcoff) free(dialdcoff); dialdcoff = NULL; /* DC OFF command */
  2374. if (dialecon)  free(dialecon);  dialecon =  NULL; /* EC ON command */
  2375. if (dialecoff) free(dialecoff); dialecoff = NULL; /* EC OFF command */
  2376. if (dialhcmd)  free(dialhcmd);  dialhcmd =  NULL; /* Hangup command */
  2377. if (dialhwfc)  free(dialhwfc);  dialhwfc =  NULL; /* Flow control... */
  2378. if (dialswfc)  free(dialswfc);  dialswfc =  NULL;
  2379. if (dialnofc)  free(dialnofc);  dialnofc =  NULL;
  2380. if (dialtone)  free(dialtone);  dialtone =  NULL; /* Dialing method */
  2381. if (dialpulse) free(dialpulse); dialpulse = NULL;
  2382. if (dialname)  free(dialname);  dialname =  NULL; /* Modem name */
  2383.     }
  2384.     if (autoflow) /* Maybe change flow control */
  2385.       setflow();
  2386. #ifndef MINIDIAL
  2387. #ifdef OLDTBCODE
  2388.     tbmodel = 0;           /* If it's a Telebit, we don't know the model yet */
  2389. #endif /* OLDTBCODE */
  2390. #endif /* MINIDIAL */
  2391. }
  2392. int
  2393. setmodem() { /* SET MODEM */
  2394.     int x, y, z;
  2395.     long zz;
  2396.     struct FDB k1, k2;
  2397.     cmfdbi(&k1,_CMKEY,
  2398.    "Modem parameter","","",nsetmdm, 0, xxstring, setmdm, &k2);
  2399.     cmfdbi(&k2,_CMKEY,"","","",nmdm,0,xxstring,mdmtab,NULL);
  2400.     x = cmfdb(&k1);
  2401.     if (x < 0) { /* Error */
  2402. if (x == -2 || x == -9)
  2403.   printf("?No keywords match: "%s"n",atmbuf);
  2404. return(x);
  2405.     }
  2406.     y = cmresult.nresult; /* Keyword value */
  2407.     if (cmresult.fdbaddr == &k2) { /* Modem-type keyword table */
  2408. if ((x = cmcfm()) < 0)
  2409.   return(x);
  2410. usermdm = 0;
  2411. initmdm(cmresult.nresult); /* Set the modem type. */
  2412. return(success = 1); /* Done */
  2413.     }
  2414.     switch (cmresult.nresult) { /* SET MODEM keyword table. */
  2415. #ifdef MDMHUP
  2416.       case XYDMHU: /* DIAL MODEM-HANGUP */
  2417. if ((y = cmkey(mdmhang,3,"how to hang up modem",
  2418.        "modem-command", xxstring)) < 0)
  2419.   return(y);
  2420. if ((x = cmcfm()) < 0)
  2421.   return(x);
  2422. dialmhu = y;
  2423. return(success = 1);
  2424. #endif /* MDMHUP */
  2425.       case XYDCAP:
  2426. zz = 0L;
  2427. y = 0;
  2428. while (y != -3) {
  2429.     if ((y = cmkey(mdmcap,nmdmcap,
  2430.    "capability of modem", "", xxstring)) < 0) {
  2431. if (y == -3)
  2432.   break;
  2433. else
  2434.   return(y);
  2435.     }
  2436.     zz |= y;
  2437. }
  2438. if ((x = cmcfm()) < 0)
  2439.   return(x);
  2440. dialcapas = zz;
  2441. debug(F101,"setmodem autoflow","",autoflow);
  2442. debug(F101,"setmodem flow 1","",flow);
  2443. if (autoflow) /* Maybe change flow control */
  2444.   setflow();
  2445. debug(F101,"setmodem flow 2","",flow);
  2446. mdmspd = zz & CKD_SB ? 0 : 1; /* Set MODEM SPEED-MATCHING from it. */
  2447. return(success = 1);
  2448.       case XYDMAX:
  2449. if ((x = cmkey(spdtab,nspd,line,"",xxstring)) < 0) {
  2450.     if (x == -3) printf("?value requiredn");
  2451.     return(x);
  2452. }
  2453. if ((y = cmcfm()) < 0) return(y);
  2454. dialmax = (long) x * 10L;
  2455. if (dialmax == 70) dialmax = 75;
  2456. return(success = 1);
  2457.       case XYDSTR: /* These moved from SET DIAL */
  2458.       case XYDDC:
  2459.       case XYDEC:
  2460.       case XYDESC:
  2461.       case XYDFC:
  2462.       case XYDKSP:
  2463.       case XYDSPD:
  2464.       case XYDDIA:
  2465. return(setdial(x));
  2466.       case XYDTYP:
  2467. if ((y = cmkey(mdmtab,nmdm,"modem type","none", xxstring)) < 0)
  2468.   return(y);
  2469. if (y == dialudt) { /* User-defined modem type */
  2470.     if ((x = cmkey(mdmtab,nmdm,"based on existing modem type",
  2471.    "unknown", xxstring)) < 0)
  2472.       return(x);
  2473. }
  2474. if ((z = cmcfm()) < 0)
  2475.   return(z);
  2476. usermdm = 0;
  2477. usermdm = (y == dialudt) ? x : 0;
  2478. initmdm(y);
  2479. return(success = 1);
  2480.       case XYDNAM:
  2481. return(dialstr(&dialname,"Descriptive name for modem"));
  2482.       case XYDMCD: /* SET MODEM CARRIER-WATCH */
  2483. return(setdcd());
  2484.       case XYDSPK: /* SET MODEM SPEAKER */
  2485. return(seton(&mdmspk));
  2486.       case XYDVOL: /* SET MODEM VOLUME */
  2487. if ((x = cmkey(voltab,3,"","medium",xxstring)) < 0)
  2488.   return(x);
  2489. if ((y = cmcfm()) < 0)
  2490.   return(y);
  2491. mdmvol = x;
  2492. return(success = 1);
  2493.       default:
  2494. printf("Unexpected SET MODEM parametern");
  2495. return(-9);
  2496.     }
  2497. }
  2498. static int /* Set DIAL command options */
  2499. setdial(y) int y; {
  2500.     int x = 0, z = 0;
  2501.     char *s = NULL;
  2502.     if (y < 0)
  2503.       if ((y = cmkey(dialtab,ndial,"","",xxstring)) < 0)
  2504. return(y);
  2505.     switch (y) {
  2506.       case XYDHUP: /* DIAL HANGUP */
  2507. return(seton(&dialhng));
  2508.       case XYDINI: /* DIAL INIT-STRING */
  2509. return(dialstr(&dialini,"Modem initialization string"));
  2510.       case XYDNPR: /* DIAL PREFIX */
  2511. return(dialstr(&dialnpr,"Telephone number prefix"));
  2512.       case XYDDIA: /* DIAL DIAL-COMMAND */
  2513. x = cmtxt("Dialing command for modem,n
  2514.  include "%s" to stand for phone number,n
  2515.  for example, "set dial dial-command ATDT%s\13"",
  2516.   "",
  2517.   &s,
  2518.   xxstring);
  2519. if (x < 0 && x != -3) /* Handle parse errors */
  2520.   return(x);
  2521. y = x = strlen(s); /* Get length of text */
  2522. if (x > 0 && *s == '{') { /* Strip enclosing braces, */
  2523.     if (s[x-1] == '}') { /* if any. */
  2524. s[x-1] = NUL;
  2525. s++;
  2526. y -= 2;
  2527.     }
  2528. }
  2529. if (y > 0) { /* If there is any text (left), */
  2530.     for (x = 0; x < y; x++) { /* make sure they included "%s" */
  2531. if (s[x] != '%') continue;
  2532. if (s[x+1] == 's') break;
  2533.     }
  2534.     if (x == y) {
  2535. printf(
  2536. "?Dial-command must contain "%cs" for phone number.n",'%');
  2537. return(-9);
  2538.     }
  2539. }
  2540. if (dialcmd) { /* Free any previous string. */
  2541.     free(dialcmd);
  2542.     dialcmd = (char *) 0;
  2543. }
  2544. if (y > 0) {
  2545.     dialcmd = malloc(y + 1); /* Allocate space for it */
  2546.     strcpy(dialcmd,s); /* and make a safe copy. */
  2547. }
  2548. return(success = 1);
  2549. #ifndef NOXFER
  2550.       case XYDKSP: /* DIAL KERMIT-SPOOF */
  2551. return(seton(&dialksp));
  2552. #endif /* NOXFER */
  2553.       case XYDTMO: /* DIAL TIMEOUT */
  2554. y = cmnum("Seconds to wait for call completion","0",10,&x,xxstring);
  2555. if (y < 0) return(y);
  2556. y = cmnum("Kermit/modem timeout differential","10",10,&z,xxstring);
  2557. if (y < 0) return(y);
  2558. if ((y = cmcfm()) < 0)
  2559.   return(y);
  2560. dialtmo = x;
  2561. mdmwaitd = z;
  2562.       case XYDESC: /* DIAL ESCAPE-CHARACTER */
  2563. y = cmnum("ASCII value of character to escape back to modem",
  2564.   "43",10,&x,xxstring);
  2565. y = setnum(&dialesc,x,y,128);
  2566. if (y > -1 && dialesc < 0) /* No escape character */
  2567.   dialmhu = 0; /* So no hangup by modem command */
  2568. return(y);
  2569.       case XYDDPY: /* DIAL DISPLAY */
  2570. return(seton(&dialdpy));
  2571.       case XYDSPD: /* DIAL SPEED-MATCHING */
  2572. /* used to be speed-changing */
  2573. if ((y = seton(&mdmspd)) < 0) return(y);
  2574. #ifdef COMMENT
  2575. mdmspd = 1 - mdmspd; /* so here we reverse the meaning */
  2576. #endif /* COMMENT */
  2577. return(success = 1);
  2578.       case XYDMNP: /* DIAL MNP-ENABLE */
  2579.       case XYDEC: /* DIAL ERROR-CORRECTION */
  2580. x = seton(&dialec);
  2581. if (x > 0)
  2582.   if (!dialec) dialdc = 0; /* OFF also turns off compression */
  2583. return(x);
  2584.       case XYDDC: /* DIAL COMPRESSION */
  2585. x = seton(&dialdc);
  2586. if (x > 0)
  2587.   if (dialdc) dialec = 1; /* ON also turns on error correction */
  2588. return(x);
  2589. #ifdef MDMHUP
  2590.       case XYDMHU: /* DIAL MODEM-HANGUP */
  2591. return(seton(&dialmhu));
  2592. #endif /* MDMHUP */
  2593. #ifndef NOSPL
  2594.       case XYDDIR: /* DIAL DIRECTORY (zero or more) */
  2595. return(parsdir(0)); /* 0 means DIAL */
  2596. #endif /* NOSPL */
  2597.       case XYDSTR: /* DIAL STRING */
  2598. if ((y = cmkey(mdmcmd,nmdmcmd,"","",xxstring)) < 0) return(y);
  2599. switch (y) {
  2600.   case XYDS_AN: /* Autoanswer ON/OFF */
  2601.   case XYDS_DC: /* Data compression ON/OFF */
  2602.   case XYDS_EC: /* Error correction ON/OFF */
  2603.     if ((x = cmkey(onoff,2,"","on",xxstring)) < 0) return(x);
  2604.     sprintf(tmpbuf,"Modem's command to %sable %s",
  2605.     x ? "en" : "dis",
  2606.     (y == XYDS_DC) ? "compression" :
  2607.     ((y == XYDS_EC) ? "error-correction" :
  2608.     "autoanswer")
  2609.     );
  2610.     if (x) {
  2611. if (y == XYDS_DC)
  2612.   return(dialstr(&dialdcon,tmpbuf));
  2613. else if (y == XYDS_EC)
  2614.   return(dialstr(&dialecon,tmpbuf));
  2615. else
  2616.   return(dialstr(&dialaaon,tmpbuf));
  2617.     } else {
  2618. if (y == XYDS_DC)
  2619.   return(dialstr(&dialdcoff,tmpbuf));
  2620. else if (y == XYDS_EC)
  2621.   return(dialstr(&dialecoff,tmpbuf));
  2622. else
  2623.   return(dialstr(&dialaaoff,tmpbuf));
  2624.     }
  2625.   case XYDS_HU: /*    hangup command */
  2626.     return(dialstr(&dialhcmd,"Modem's hangup command"));
  2627.   case XYDS_HW: /*    hwfc */
  2628.     return(dialstr(&dialhwfc,
  2629.    "Modem's command to enable hardware flow control"));
  2630.   case XYDS_IN: /*    init */
  2631.     return(dialstr(&dialini,"Modem's initialization string"));
  2632.   case XYDS_NF: /*    no flow control */
  2633.     return(dialstr(&dialnofc,
  2634.    "Modem's command to disable local flow control"));
  2635.   case XYDS_PX: /*    prefix */
  2636.     return(dialstr(&dialnpr,"Telephone number prefix for dialing"));
  2637.   case XYDS_SW: /*    swfc */
  2638.     return(dialstr(&dialswfc,
  2639.    "Modem's command to enable local software flow control"));
  2640.   case XYDS_DT: /*    tone dialing */
  2641.     return(dialstr(&dialtone,
  2642.    "Command to configure modem for tone dialing"));
  2643.   case XYDS_DP: /*    pulse dialing */
  2644.     return(dialstr(&dialpulse,
  2645.    "Command to configure modem for pulse dialing"));
  2646.   case XYDS_MS: /*    dial mode string */
  2647.     return(dialstr(&dialmstr,
  2648.                          "Command to enter dial mode"));
  2649.   case XYDS_MP: /*    dial mode prompt */
  2650.     return(dialstr(&dialmprmt,
  2651.    "Modem response upon entering dial mode"));
  2652.   case XYDS_SP: /* SPEAKER OFF */
  2653.     if ((x = cmkey(onoff,2,"","on",xxstring)) < 0) return(x);
  2654.     if (x)
  2655.       return(dialstr(&dialspon,"Command to turn modem speaker on"));
  2656.     else
  2657.       return(dialstr(&dialspoff,"Command to turn modem speaker off"));
  2658.   case XYDS_VO: /* VOLUME LOW */
  2659.     if ((x = cmkey(voltab,3,"","medium",xxstring)) < 0) return(x);
  2660.     switch (x) {
  2661.       case 0:
  2662.       case 1:
  2663. return(dialstr(&dialvol1,
  2664.        "Command for low modem speaker volume"));
  2665.       case 2:
  2666. return(dialstr(&dialvol2,
  2667.    "Command for medium modem speaker volume"));
  2668.       case 3:
  2669. return(dialstr(&dialvol3,
  2670.        "Command for high modem speaker volume"));
  2671.       default:
  2672. return(-2);
  2673.     }
  2674.   case XYDS_ID: /* IGNORE-DIALTONE */
  2675.     return(dialstr(&dialx3,
  2676.    "Command to tell modem to ignore dialtone"));
  2677.   case XYDS_I2: /* PREDIAL-INIT */
  2678.     return(dialstr(&dialini2,
  2679.    "Command to send to modem just prior to dialing"));
  2680.   default:
  2681.     printf("?Unexpected SET DIAL STRING parametern");
  2682. }
  2683.       case XYDFC: /* DIAL FLOW-CONTROL */
  2684. if ((y = cmkey(dial_fc,4,"","auto",xxstring)) < 0) return(y);
  2685. if ((x = cmcfm()) < 0) return(x);
  2686. dialfc = y;
  2687. return(success = 1);
  2688.       case XYDMTH: /* DIAL METHOD */
  2689. if ((y = cmkey(dial_m,ndial_m,"","default",xxstring)) < 0)
  2690.   return(y);
  2691. if ((x = cmcfm()) < 0)
  2692.   return(x);
  2693. if (y == XYDM_A) { /* AUTO */
  2694.     extern int dialmauto; /* Means choose based on */
  2695.     dialmauto = 1; /* local country code, if known. */
  2696.     dialmth = XYDM_D;
  2697. } else
  2698.   dialmth = y;
  2699. return(success = 1);
  2700.       case XYDRTM:
  2701. y = cmnum("Number of times to try dialing a number",
  2702.   "1",10,&x,xxstring);
  2703. return(setnum(&dialrtr,x,y,16383));
  2704.       case XYDINT:
  2705. y = cmnum("Seconds to wait between redial attempts",
  2706.   "30",10,&x,xxstring);
  2707. return(setnum(&dialint,x,y,128));
  2708.       case XYDLAC: /* DIAL AREA-CODE */
  2709. if ((x = dialstr(&diallac,"Area code you are calling from")) < 0)
  2710.   return(x);
  2711. if (diallac) {
  2712.     if (!rdigits(diallac)) {
  2713. printf("?Sorry, area code must be numericn");
  2714. if (*diallac == '(')
  2715.   printf("(please omit the parentheses)n");
  2716. if (*diallac == '/')
  2717.   printf("(no slashes, please)n");
  2718. if (diallac) free(diallac);
  2719. diallac = NULL;
  2720. return(-9);
  2721.     }
  2722. }
  2723. return(x);
  2724.       case XYDCNF: /* CONFIRMATION */
  2725. return(success = seton(&dialcnf));
  2726.       case XYDCVT: /* CONVERT-DIRECTORY */
  2727. if ((y = cmkey(dcnvtab,3,"","ask",xxstring)) < 0)
  2728.   return(y);
  2729. if ((x = cmcfm()) < 0)
  2730.   return(x);
  2731. dialcvt = y;
  2732. return(success = 1);
  2733.       case XYDLCC: /* DIAL COUNTRY-CODE */
  2734. x = dialstr(&diallcc,"Country code you are calling from");
  2735. if (x < 1) return(x);
  2736. if (diallcc) {
  2737.     if (!rdigits(diallcc)) {
  2738. printf("?Sorry, country code must be numericn");
  2739. if (*diallcc == '+')
  2740.   printf("(please omit the plus sign)n");
  2741. if (diallcc) free(diallcc);
  2742. diallcc = NULL;
  2743. return(-9);
  2744.     }
  2745.     if (!strcmp(diallcc,"1")) { /* Set defaults for USA and Canada */
  2746. if (!dialldp) /* Long-distance prefix */
  2747.   makestr(&dialldp,"1");
  2748. if (!dialixp)  /* International dialing prefix */
  2749.   makestr(&dialixp,"011");
  2750. if (ntollfree == 0) { /* Toll-free area codes */
  2751.     if (dialtfc[0] = malloc(4)) {
  2752. strcpy(dialtfc[0],"800"); /* 1970-something */
  2753. ntollfree++;
  2754. if (dialtfc[1] = malloc(4)) {
  2755.     strcpy(dialtfc[1],"888"); /* 1996 */
  2756.     ntollfree++;
  2757.     if (dialtfc[2] = malloc(4)) {
  2758. strcpy(dialtfc[2],"877"); /* 5 April 1998 */
  2759. ntollfree++;
  2760. if (dialtfc[3] = malloc(4)) {
  2761.     strcpy(dialtfc[3],"866"); /* Soon */
  2762.     ntollfree++;
  2763. }
  2764.     }
  2765. }
  2766.     }
  2767. }
  2768. if (!dialtfp)  /* Toll-free dialing prefix */
  2769.   makestr(&dialtfp,"1");
  2770. #ifdef COMMENT
  2771. /* The time for this is past */
  2772.     } else if (!strcmp(diallcc,"358") &&
  2773.        ((int) strcmp(zzndate(),"19961011") > 0)
  2774.        ) { /* Finland */
  2775. if (!dialldp) /* Long-distance prefix */
  2776.   makestr(&dialldp,"9");
  2777. if (!dialixp)  /* International dialing prefix */
  2778.   makestr(&dialixp,"990");
  2779. #endif /* COMMENT */
  2780.     } else { /* Everywhere else ... */
  2781. if (!dialldp) {
  2782.     if (dialldp = malloc(4))
  2783.       strcpy(dialldp,"0");
  2784. }
  2785. if (!dialixp) {
  2786.     if (dialixp = malloc(4))
  2787.       strcpy(dialixp,"00");
  2788. }
  2789.     }
  2790.     if (!strcmp(diallcc,"33")) /* France */
  2791.       dialfld = 1; /* Long-distance dialing is forced */
  2792. }
  2793. return(success = 1);
  2794.       case XYDIXP: /* DIAL INTL-PREFIX */
  2795. return(dialstr(&dialixp,"International dialing prefix"));
  2796.       case XYDIXS: /* DIAL INTL-SUFFIX */
  2797. return(dialstr(&dialixs,"International dialing suffix"));
  2798.       case XYDLDP: /* DIAL LD-PREFIX */
  2799. return(dialstr(&dialldp,"Long-distance dialing prefix"));
  2800.       case XYDLDS: /* DIAL LD-SUFFIX */
  2801. return(dialstr(&diallds,"Long-distance dialing suffix"));
  2802.       case XYDLCP: /* DIAL LC-PREFIX */
  2803. return(dialstr(&diallcp,"Local dialing prefix"));
  2804.       case XYDLCS: /* DIAL LC-SUFFIX */
  2805. return(dialstr(&diallcs,"Local dialing suffix"));
  2806. #ifdef COMMENT
  2807.       case XYDPXX: /* DIAL PBX-EXCHANGE */
  2808. return(dialstr(&dialpxx,"Exchange of PBX you are calling from"));
  2809. #endif /* COMMENT */
  2810.       case XYDPXI: { /* DIAL PBX-INTERNAL-PREFIX */
  2811. #ifdef COMMENT
  2812.   return(dialstr(&dialpxi,
  2813.        "Internal-call prefix of PBX you are calling from"));
  2814. #else
  2815.   int x;
  2816.   if ((x = cmtxt("Internal-call prefix of PBX you are calling from",
  2817.  "",&s,NULL)) < 0) /* Don't evaluate */
  2818.     return(x);
  2819. #ifndef NOSPL
  2820.   if (*s) {
  2821.       char c, * p = tmpbuf;
  2822.       if (*s == '\') {
  2823.   c = *(s+1);
  2824.   if (isupper(c)) c = tolower(c);
  2825.   if (c != 'f' &&
  2826.       ckstrcmp(s,"\v(d$px)",8,0) &&
  2827.       ckstrcmp(s,"\v(d$pxx)",9,0) &&
  2828.       ckstrcmp(s,"\v(d$p)",7,0)) {
  2829.       x = TMPBUFSIZ;
  2830.       zzstring(s,&p,&x);
  2831.       s = tmpbuf;
  2832.   }
  2833.       }
  2834.   }
  2835. #endif /* NOSPL */
  2836.   makestr(&dialpxi,s);
  2837.   return(1);
  2838.       }
  2839. #endif /* COMMENT */
  2840.       case XYDPXO: /* DIAL PBX-OUTSIDE-PREFIX */
  2841. return(dialstr(&dialpxo,
  2842.        "Outside-line prefix of PBX you are calling from"));
  2843.       case XYDSFX: /* DIAL INTL-SUFFIX */
  2844. return(dialstr(&dialsfx," Telephone number suffix for dialing"));
  2845.       case XYDSRT: /* DIAL SORT */
  2846. return(success = seton(&dialsrt));
  2847.       case XYDPXX: /* DIAL PBX-EXCHANGE */
  2848.       case XYDTFC: { /* DIAL TOLL-FREE-AREA-CODE  */
  2849.   int n, i; /* (zero or more of them...) */
  2850.   char * p[MAXTOLLFREE]; /* Temporary pointers */
  2851.   char * m;
  2852.   for (n = 0; n < MAXTOLLFREE; n++) {
  2853.       if (n == 0) {
  2854.   m = (y == XYDTFC) ?
  2855.   "Toll-free area code(s) in the country you are calling from"
  2856.     : "Exchange(s) of PBX you are calling from";
  2857.       } else {
  2858.   m = (y == XYDTFC) ?
  2859.     "Another toll-free area code"
  2860.       : "Another PBX exchange";
  2861.       }
  2862.       if ((x = cmfld(m,"",&s,xxstring)) < 0)
  2863. break;
  2864.       if (s) {
  2865.   int k;
  2866.   k = (int) strlen(s);
  2867.   if (k > 0) {
  2868.       if (p[n] = malloc(k + 1))
  2869. strcpy(p[n], s);
  2870.   } else break;
  2871.       } else break;
  2872.   }
  2873.   if (x == -3) { /* Command was successful */
  2874.       int m;
  2875.       m = (y == XYDTFC) ? ntollfree : ndialpxx;
  2876.       if ((x = cmcfm()) < 0)
  2877. return(x);
  2878.       x = 1;
  2879.       for (i = 0; i < m; i++) { /* Remove old list, if any */
  2880.   if  (y == XYDTFC)
  2881.     makestr(&(dialtfc[i]),NULL);
  2882.   else
  2883.     makestr(&(dialpxx[i]),NULL);
  2884.       }
  2885.       if  (y == XYDTFC)
  2886. ntollfree = n; /* New count */
  2887.       else
  2888. ndialpxx = n;
  2889.       for (i = 0; i < n; i++) { /* New list */
  2890.   if  (y == XYDTFC)
  2891.     makestr(&(dialtfc[i]),p[i]);
  2892.   else
  2893.     makestr(&(dialpxx[i]),p[i]);
  2894.       }
  2895.       x = 1;
  2896.   }
  2897.   for (i = 0; i < n; i++)
  2898.     if (p[i]) free(p[i]);
  2899.   return(x);
  2900.       }
  2901.       case XYDTFP: /* TOLL-FREE-PREFIX */
  2902. return(dialstr(&dialtfp,
  2903.        " Long-distance prefix for toll-free dialing"));
  2904.       case XYDCON: /* CONNECT */
  2905. z = -1;
  2906. if ((y = cmkey(crrtab,ncrr,"","auto",xxstring)) < 0) return(y);
  2907. if (y != CAR_OFF) /* AUTO or ON? */
  2908.   if ((z = cmkey(qvtab,nqvt,"","verbose",xxstring)) < 0) return(z);
  2909. if ((x = cmcfm()) < 0) return(x);
  2910. if (z > -1)
  2911.   dialcq = z;
  2912. dialcon = y;
  2913. return(success = 1);
  2914.       case XYDRSTR: /* RESTRICT */
  2915. if ((y = cmkey(drstrtab,4,"","none",xxstring)) < 0) return(y);
  2916. if ((x = cmcfm()) < 0) return(x);
  2917. dialrstr = y;
  2918. return(success = 1);
  2919.       case XYDLLAC: { /* Local area-code list  */
  2920.   int n, i; /* (zero or more of them...) */
  2921.   char * p[MAXLOCALAC]; /* Temporary pointers */
  2922.   for (n = 0; n < MAXLOCALAC; n++) {
  2923.       if ((x = cmfld(
  2924.     "Area code to which calls from your area are local",
  2925.        "",&s,xxstring)) < 0)
  2926. break;
  2927.       if (s) {
  2928.   int k;
  2929.   k = (int) strlen(s);
  2930.   if (k > 0) {
  2931.       if (p[n] = malloc(k + 1))
  2932. strcpy(p[n], s);
  2933.   } else break;
  2934.       } else break;
  2935.   }
  2936.   if (x == -3) { /* Command was successful */
  2937.       if ((x = cmcfm()) < 0)
  2938. return(x);
  2939.       for (i = 0; i < nlocalac; i++) /* Remove old list, if any */
  2940. if (diallcac[i]) {
  2941.     free(diallcac[i]);
  2942.     diallcac[i] = NULL;
  2943. }
  2944.       nlocalac = n; /* New count */
  2945.       for (i = 0; i < nlocalac; i++) /* New list */
  2946. diallcac[i] = p[i];
  2947.       return(success = 1);
  2948.   } else { /* Parse error, undo everything */
  2949.       for (i = 0; i < n; i++)
  2950. if (p[i]) free(p[i]);
  2951.       return(x);
  2952.   }
  2953.       }
  2954.       case XYDFLD:
  2955. return(success = seton(&dialfld));
  2956.       case XYDIDT: /* DIAL IGNORE-DIALTONE */
  2957. return(seton(&dialidt));
  2958.       case XYDPAC:
  2959. y = cmnum(
  2960.       "Milliseconds to pause between each character sent to dialer",
  2961.   "",10,&x,xxstring);
  2962. return(setnum(&dialpace,x,y,9999));
  2963. #ifndef NOSPL
  2964.       case XYDMAC:
  2965. if ((x = cmfld("Name of macro to execute just prior to dialing",
  2966.        "",&s,xxstring)) < 0) {
  2967.     if (x == -3)
  2968.       s = NULL;
  2969.     else
  2970.       return(x);
  2971. }
  2972. if (s) {
  2973.     if (!*s) {
  2974. s = NULL;
  2975.     } else {
  2976. strcpy(line,s);
  2977. s = line;
  2978.     }
  2979. }
  2980. if ((x = cmcfm()) < 0)
  2981.   return(x);
  2982. makestr(&dialmac,s);
  2983. return(success = 1);
  2984. #endif /* NOSPL */
  2985.       case XYDPUCC: /* Pulse country codes */
  2986.       case XYDTOCC: { /* Tone country codes */
  2987.   int n, i;
  2988.   char * p[MAXTPCC];
  2989.   char * m;
  2990.   for (n = 0; n < MAXTPCC; n++) {
  2991.       if (n == 0) {
  2992.   m = (y == XYDPUCC) ?
  2993.   "Country code where Pulse dialing is required"
  2994.     : "Country code where Tone dialing is available";
  2995.       } else
  2996. m = "Another country code";
  2997.       if ((x = cmfld(m,"",&s,xxstring)) < 0)
  2998. break;
  2999.       if (s) {
  3000.   int k;
  3001.   k = (int) strlen(s);
  3002.   if (k > 0) {
  3003.       if (p[n] = malloc(k + 1))
  3004. strcpy(p[n], s);
  3005.   } else break;
  3006.       } else break;
  3007.   }
  3008.   if (x == -3) { /* Command was successful */
  3009.       int m;
  3010.       m = (y == XYDPUCC) ? ndialpucc : ndialtocc;
  3011.       if ((x = cmcfm()) < 0)
  3012. return(x);
  3013.       x = 1;
  3014.       for (i = 0; i < m; i++) { /* Remove old list, if any */
  3015.   if (y == XYDPUCC)
  3016.     makestr(&(dialpucc[i]),NULL);
  3017.   else
  3018.     makestr(&(dialtocc[i]),NULL);
  3019.       }
  3020.       if (y == XYDPUCC) {
  3021.   ndialpucc = n; /* New count */
  3022.       } else {
  3023.   ndialtocc = n;
  3024.       }
  3025.       for (i = 0; i < n; i++) { /* New list */
  3026.   if (y == XYDPUCC) {
  3027.       makestr(&(dialpucc[i]),p[i]);
  3028.   } else {
  3029.       makestr(&(dialtocc[i]),p[i]);
  3030.   }
  3031.       }
  3032.       x = 1;
  3033.   }
  3034.   for (i = 0; i < n; i++)
  3035.     if (p[i]) free(p[i]);
  3036.   return(x);
  3037.       }
  3038.       case XYDTEST:
  3039. return(seton(&dialtest));
  3040.       default:
  3041. printf("?Unexpected SET DIAL parametern");
  3042. return(-9);
  3043.     }
  3044. }
  3045. #ifdef CK_TAPI
  3046. int /* TAPI action commands */
  3047. dotapi() {
  3048.     int x,y;
  3049.     char *s;
  3050.     if (!TAPIAvail) {
  3051. printf("nTAPI is unavailable on this system.n");
  3052. return(-9);
  3053.     }
  3054.     if ((y = cmkey(tapitab,ntapitab,"MS TAPI command","",xxstring)) < 0)
  3055.       return(y);
  3056.     switch (y) {
  3057.       case XYTAPI_CFG: { /* TAPI CONFIGURE-LINE */
  3058.   extern struct keytab * tapilinetab;
  3059.   extern struct keytab * _tapilinetab;
  3060.   extern int ntapiline;
  3061.   extern int LineDeviceId;
  3062.   int lineID=LineDeviceId;
  3063.   if (TAPIAvail)
  3064.     cktapiBuildLineTable(&tapilinetab, &_tapilinetab, &ntapiline);
  3065.   if (tapilinetab && _tapilinetab && ntapiline > 0) {
  3066.       int i=0, j = 9999, k = -1;
  3067.       if ( LineDeviceId == -1 ) {
  3068.   /* Find out what the lowest numbered TAPI device is */
  3069.   /* and use it as the default.                       */
  3070.   for (i = 0; i < ntapiline; i++ ) {
  3071.       if (tapilinetab[i].kwval < j) {
  3072.   k = i;
  3073.       }
  3074.   }
  3075.       } else {
  3076.   /* Find the LineDeviceId in the table and use that entry */
  3077.   for (i = 0; i < ntapiline; i++ ) {
  3078.       if (tapilinetab[i].kwval == LineDeviceId) {
  3079.   k = i;
  3080.   break;
  3081.       }
  3082.   }
  3083.       }
  3084.       if (k >= 0)
  3085. s = _tapilinetab[k].kwd;
  3086.       else
  3087. s = "";
  3088.       if ((y = cmkey(_tapilinetab,ntapiline,
  3089.       "TAPI device name",s,xxstring)) < 0)
  3090. return(y);
  3091.       lineID = y;
  3092.   }
  3093.   if ((x = cmcfm()) < 0) return(x);
  3094. #ifdef IKSD
  3095.           if (inserver) {
  3096.               printf("Sorry, command disabledrn");
  3097.               return(success = 0);
  3098.           }
  3099. #endif /* ISKD */
  3100.   cktapiConfigureLine(lineID);
  3101.   break;
  3102.       }
  3103.       case XYTAPI_DIAL: /* TAPI DIALING-PROPERTIES */
  3104. if ((x = cmcfm()) < 0)
  3105.   return(x);
  3106. #ifdef IKSD
  3107. if (inserver) {
  3108.     printf("Sorry, command disabledrn");
  3109.     return(success = 0);
  3110. }
  3111. #endif /* ISKD */
  3112. cktapiDialingProp();
  3113. break;
  3114.     }
  3115.     return(success = 1);
  3116. }
  3117. static int /* SET TAPI command options */
  3118. settapi() {
  3119.     int x, y;
  3120.     char *s;
  3121.     if (!TAPIAvail) {
  3122. printf("nTAPI is unavailable on this system.n");
  3123. return(-9);
  3124.     }
  3125.     if ((y = cmkey(settapitab,nsettapitab,"MS TAPI option","",xxstring)) < 0)
  3126.       return(y);
  3127.     switch (y) {
  3128.       case XYTAPI_USE:
  3129. return (success = seton(&tapiusecfg));
  3130.       case XYTAPI_LGHT:
  3131. return (success = seton(&tapilights));
  3132.       case XYTAPI_PRE:
  3133. return (success = seton(&tapipreterm));
  3134.       case XYTAPI_PST:
  3135. return (success = seton(&tapipostterm));
  3136.       case XYTAPI_INA:
  3137. y = cmnum("seconds of inactivity before auto-disconnect",
  3138.   "0",10,&x,xxstring);
  3139. return(setnum(&tapiinactivity,x,y,65535));
  3140.       case XYTAPI_BNG:
  3141. y = cmnum("seconds to wait for credit card tone",
  3142.   "8",10,&x,xxstring);
  3143. return(setnum(&tapibong,x,y,90));
  3144.       case XYTAPI_MAN:
  3145. return (success = seton(&tapimanual));
  3146.       case XYTAPI_CON: /* TAPI CONVERSIONS */
  3147. return (success = setonaut(&tapiconv));
  3148.       case XYTAPI_LIN: /* TAPI LINE */
  3149. x = setlin(XYTAPI_LIN,1,0);
  3150. if (x > -1) didsetlin++;
  3151. return(x);
  3152.       case XYTAPI_PASS: { /* TAPI PASSTHROUGH */
  3153.         /* Passthrough became Modem-dialing which is an antonym */
  3154.         success = seton(&tapipass);
  3155.         tapipass = !tapipass;
  3156. return (success);
  3157.       }
  3158.       case XYTAPI_LOC: { /* TAPI LOCATION */
  3159.   extern char tapiloc[];
  3160.   extern int tapilocid;
  3161.   int i = 0, j = 9999, k = -1;
  3162.   cktapiBuildLocationTable(&tapiloctab, &ntapiloc);
  3163.   if (!tapiloctab || !ntapiloc) {
  3164.       printf("nNo TAPI Locations are configured for this systemn");
  3165.       return(-9);
  3166.   }
  3167.   if (tapilocid == -1)
  3168.     tapilocid = cktapiGetCurrentLocationID();
  3169.   /* Find the current tapiloc entry */
  3170.   /* and use it as the default. */
  3171.   for (k = 0; k < ntapiloc; k++) {
  3172.       if (tapiloctab[k].kwval == tapilocid)
  3173. break;
  3174.   }
  3175.           if (k >= 0 && k < ntapiloc)
  3176.     s = tapiloctab[k].kwd;
  3177.   else
  3178.     s = "";
  3179.   if ((y = cmkey(tapiloctab,ntapiloc, "TAPI location",s,xxstring)) < 0)
  3180.     return(y);
  3181.   if ((x = cmcfm()) < 0)
  3182.     return(x);
  3183. #ifdef IKSD
  3184.           if (inserver) {
  3185.               printf("Sorry, command disabledrn");
  3186.               return(success = 0);
  3187.           }
  3188. #endif /* ISKD */
  3189.   cktapiFetchLocationInfoByID( y );
  3190.   CopyTapiLocationInfoToKermitDialCmd();
  3191.         }
  3192. break;
  3193.     }
  3194.     return(success=1);
  3195. }
  3196. #endif /* CK_TAPI */
  3197. #ifndef NOSHOW
  3198. int /* SHOW MODEM */
  3199. shomodem() {
  3200.     MDMINF * p;
  3201.     int x, n;
  3202.     char c;
  3203.     long zz;
  3204. #ifdef IKSD
  3205.     if (inserver) {
  3206.         printf("Sorry, command disabledrn");
  3207.         return(success = 0);
  3208.     }
  3209. #endif /* ISKD */
  3210.     shmdmlin();
  3211.     printf("n");
  3212.     p = (mdmtyp > 0) ? modemp[mdmtyp] : NULL;
  3213.     if (p) {
  3214. printf(" %snn", dialname ? dialname : p->name);
  3215. printf(" Modem carrier-watch:    ");
  3216. if (carrier == CAR_OFF) printf("offn");
  3217. else if (carrier == CAR_ON) printf("onn");
  3218. else if (carrier == CAR_AUT) printf("auton");
  3219. else printf("unknownn");
  3220. printf(" Modem capabilities:    ");
  3221. zz = dialcapas ? dialcapas : p->capas;
  3222. if (!zz) {
  3223.     printf(" (none)");
  3224. } else {
  3225.     if (zz & CKD_AT) printf(" AT");
  3226.     if (zz & CKD_V25) printf(" ITU");
  3227.     if (zz & CKD_SB) printf(" SB");
  3228.     if (zz & CKD_EC) printf(" EC");
  3229.     if (zz & CKD_DC) printf(" DC");
  3230.     if (zz & CKD_HW) printf(" HWFC");
  3231.     if (zz & CKD_SW) printf(" SWFC");
  3232.     if (zz & CKD_KS) printf(" KS");
  3233.     if (zz & CKD_TB) printf(" TB");
  3234. }
  3235. printf("n Modem maximum-speed:    ");
  3236. zz = (dialmax > 0L) ? dialmax : p->max_speed;
  3237. if (zz > 0)
  3238.   printf("%ld bpsn", zz);
  3239. else
  3240.   printf("(unknown)n");
  3241. printf(" Modem error-correction: %sn", dialec ? "on" : "off");
  3242. printf(" Modem compression:      %sn", dialdc ? "on" : "off");
  3243. printf(" Modem speed-matching:   %s",   mdmspd ? "on" : "off");
  3244. printf(" (interface speed %s)n", mdmspd ? "changes" : "is locked");
  3245. printf(" Modem flow-control:     ");
  3246. if (dialfc == FLO_NONE) printf("nonen");
  3247.         else if (dialfc == FLO_XONX) printf("xon/xoffn");
  3248. else if (dialfc == FLO_RTSC) printf("rts/ctsn");
  3249. else if (dialfc == FLO_AUTO) printf("auton");
  3250. printf(" Modem hangup-method:    %sn",
  3251.        dialmhu ?
  3252.        "modem-command" :
  3253.        "rs232-signal"
  3254.        );
  3255. printf(" Modem speaker:          %sn", showoff(mdmspk));
  3256. printf(" Modem volume:           %sn",
  3257.        (mdmvol == 2) ? "medium" : ((mdmvol <= 1) ? "low" : "high"));
  3258. printf(" Modem kermit-spoof:     %sn", dialksp ? "on" : "off");
  3259. c = (char) (x = (dialesc ? dialesc : p->esc_char));
  3260. printf(" Modem escape-character: %d", x);
  3261. if (isprint(c))
  3262.   printf(" (= "%c")",c);
  3263. printf(
  3264. "nnMODEM COMMANDs (* = set automatically by SET MODEM TYPE):nn");
  3265. debug(F110,"show dialini",dialini,0);
  3266. printf(" %c Init-string:          ", dialini ? ' ' : '*' );
  3267. shods(dialini ? dialini : p->wake_str);
  3268. printf(" %c Dial-mode-string:     ", dialmstr ? ' ' : '*' );
  3269. shods(dialmstr ? dialmstr : p->dmode_str);
  3270. n = local ? 19 : 20;
  3271. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3272. printf(" %c Dial-mode-prompt:     ", dialmprmt ? ' ' : '*' );
  3273. shods(dialmprmt ? dialmprmt : p->dmode_prompt);
  3274. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3275. printf(" %c Dial-command:         ", dialcmd ? ' ' : '*' );
  3276. shods(dialcmd ? dialcmd : p->dial_str);
  3277. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3278. printf(" %c Compression on:       ", dialdcon ? ' ' : '*' );
  3279. if (!dialdcon)
  3280.   debug(F110,"dialdcon","(null)",0);
  3281. else
  3282.   debug(F110,"dialdcon",dialdcon,0);
  3283. shods(dialdcon ? dialdcon : p->dc_on_str);
  3284. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3285. printf(" %c Compression off:      ", dialdcoff ? ' ' : '*' );
  3286. shods(dialdcoff ? dialdcoff : p->dc_off_str);
  3287. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3288. printf(" %c Error-correction on:  ", dialecon ? ' ' : '*' );
  3289. shods(dialecon ? dialecon : p->ec_on_str);
  3290. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3291. printf(" %c Error-correction off: ", dialecoff ? ' ' : '*' );
  3292. shods(dialecoff ? dialecoff : p->ec_off_str);
  3293. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3294. printf(" %c Autoanswer on:        ", dialaaoff ? ' ' : '*' );
  3295. shods(dialaaon ? dialaaon : p->aa_on_str);
  3296. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3297. printf(" %c Autoanswer off:       ", dialaaoff ? ' ' : '*' );
  3298. shods(dialaaoff ? dialaaoff : p->aa_off_str);
  3299. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3300. printf(" %c Speaker on:           ", dialspon ? ' ' : '*' );
  3301. shods(dialspon ? dialspon : p->sp_on_str);
  3302. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3303. printf(" %c Speaker off:          ", dialspoff ? ' ' : '*' );
  3304. shods(dialspoff ? dialspoff : p->sp_off_str);
  3305. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3306. printf(" %c Volume low:           ", dialvol1 ? ' ' : '*' );
  3307. shods(dialvol1 ? dialvol1 : p->vol1_str);
  3308. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3309. printf(" %c Volume medium:        ", dialvol2 ? ' ' : '*' );
  3310. shods(dialvol2 ? dialvol2 : p->vol2_str);
  3311. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3312. printf(" %c Volume high:          ", dialvol3 ? ' ' : '*' );
  3313. shods(dialvol3 ? dialvol3 : p->vol3_str);
  3314. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3315. printf(" %c Hangup-command:       ", dialhcmd ? ' ' : '*' );
  3316. shods(dialhcmd ? dialhcmd : p->hup_str);
  3317. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3318. printf(" %c Hardware-flow:        ", dialhwfc ? ' ' : '*' );
  3319. shods(dialhwfc ? dialhwfc : p->hwfc_str);
  3320. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3321. printf(" %c Software-flow:        ", dialswfc ? ' ' : '*' );
  3322. shods(dialswfc ? dialswfc : p->swfc_str);
  3323. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3324. printf(" %c No-flow-control:      ", dialnofc ? ' ' : '*' );
  3325. shods(dialnofc ? dialnofc : p->nofc_str);
  3326. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3327. printf(" %c Pulse:                ", dialpulse ? ' ' : '*');
  3328. shods(dialpulse ? dialpulse : p->pulse);
  3329. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3330. printf(" %c Tone:                 ", dialtone ? ' ' : '*');
  3331. shods(dialtone ? dialtone : p->tone);
  3332. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3333. printf(" %c Ignore-dialtone:      ", dialx3 ? ' ' : '*');
  3334. shods(dialx3 ? dialx3 : p->ignoredt);
  3335. if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
  3336. printf(" %c Predial-init:         ", dialini2 ? ' ' : '*');
  3337. shods(dialini2 ? dialini2 : p->ini2);
  3338. if (++n > cmd_rows - 4) if (!askmore()) return(0); else n = 0;
  3339. printf("n For more info: SHOW DIAL and SHOW COMMUNICATIONSn");
  3340.     } else if (mdmtyp > 0) {
  3341. printf("Modem info for "%s" not filled in yetn", gmdmtyp());
  3342.     } else printf(
  3343. " No modem selected, so DIAL and most SET MODEM commands have no effect.n
  3344.  Use SET MODEM TYPE to select a modem.n");
  3345.     return(1);
  3346. }
  3347. #endif /* NOSHOW */
  3348. #endif /* NODIAL */
  3349. #endif /* NOLOCAL */
  3350. #ifndef NOSPL
  3351. #ifdef CK_ANSIC /* SET ALARM */
  3352. int
  3353. setalarm(long xx)
  3354. #else
  3355. int
  3356. setalarm(xx) long xx;
  3357. #endif /* CK_ANSIC */
  3358. /* setalarm */ {
  3359. #ifdef COMMENT
  3360.     int yyyy, mm, dd, x;
  3361.     char *s;
  3362.     long zz;
  3363.     char buf[6];
  3364. #endif /* COMMENT */
  3365.     long sec, jd;
  3366.     char xbuf[20], * p;
  3367.     debug(F101,"setalarm xx","",xx);
  3368.     ck_alarm = 0L; /* 0 = no alarm (in case of error) */
  3369.     if (xx < 0L) {
  3370. printf("%ld - illegal value, must be 0 or positiven", xx);
  3371. return(-9);
  3372.     }
  3373.     if (xx == 0L) { /* CLEAR ALARM */
  3374. alrm_date[0] = NUL;
  3375. alrm_time[0] = NUL;
  3376. return(1);
  3377.     }
  3378. #ifdef COMMENT
  3379.     x = 8; /* Get current date */
  3380.     s = alrm_date;
  3381.     if (zzstring("\v(ndate)",&s,&x) < 0) {
  3382. printf("Internal date error, sorry.n");
  3383. alrm_date[0] = SP;
  3384. return(-9);
  3385.     }
  3386.     x = 5; /* Get current time */
  3387.     s = alrm_time;
  3388.     if (zzstring("\v(ntime)",&s,&x) < 0) {
  3389. printf("Internal time error, sorry.n");
  3390. alrm_time[0] = SP;
  3391. return(-9);
  3392.     }
  3393.     sprintf(buf,"%05ld",atol(alrm_time));
  3394.     strcpy(alrm_time,buf);
  3395.     debug(F110,"SET ALARM date (1)",alrm_date,0);
  3396.     debug(F110,"SET ALARM time (1)",alrm_time,0);
  3397.     if ((zz = atol(alrm_time) + xx) < 0L) {
  3398. printf("Internal time conversion error, sorry.n");
  3399. return(-9);
  3400.     }
  3401.     if (zz >= 86400L) { /* Alarm crosses midnight */
  3402. char d[10]; /* Local date buffer */
  3403. int lastday; /* Last day of this month */
  3404. ckstrncpy(d,alrm_date,8); /* We'll have to change the date */
  3405. x = (zz / 86400L); /* How many days after today */
  3406. dd = atoi((char *)(d+6)); /* Parse yyyymmdd */
  3407. d[6] = NUL; /* into yyyy, mm, dd ... */
  3408. mm = atoi((char *)(d+4));
  3409. d[4] = NUL;
  3410. yyyy = atoi((char *)d);
  3411. /* How many days in this month */
  3412. lastday = mdays[mm];
  3413. if (mm == 2 && yyyy % 4 == 0) /* Works thru 2099 AD... */
  3414.   lastday++;
  3415. if (dd + x > lastday) { /* Dumb loop */
  3416.     int y;
  3417.     x -= (mdays[mm] - dd); /* Deduct rest of this month's days */
  3418.     /* There's a more elegant way to do this... */
  3419.     while (1) {
  3420. mm++; /* Next month */
  3421. if (mm > 12) { /* Wrap around */
  3422.     mm = 1; /* Jan, next year */
  3423.     yyyy++;
  3424. }
  3425. y = mdays[mm]; /* Days in new month */
  3426. if (mm == 2 && yyyy % 4 == 0) /* Feb in leap year */
  3427.   y++; /* Works until 2100 AD */
  3428. if (x - y < 1)
  3429.   break;
  3430. x -= y;
  3431.     }
  3432.     dd = x; /* Day of alarm month */
  3433. } else dd += x;
  3434. sprintf(alrm_date,"%04d%02d%02d",yyyy,mm,dd);
  3435. zz = zz % 86400L;
  3436.     }
  3437.     sprintf(alrm_time,"%ld",zz);
  3438.     debug(F110,"SET ALARM date (2)",alrm_date,0);
  3439.     debug(F110,"SET ALARM time (2)",alrm_time,0);
  3440.     ck_alarm = xx;
  3441. #else
  3442.     /* Jul 1998 */
  3443.     ckstrncpy(xbuf,ckcvtdate("",1),20); /* Get current date and time */
  3444.     p = xbuf;
  3445.     ckstrncpy(alrm_date,xbuf,10);
  3446.     alrm_date[8] = NUL;
  3447.     sec = atol(p+9) * 3600L + atol(p+12) * 60L + atol(p+15);
  3448.     debug(F110,"SET ALARM date (1)",alrm_date,0);
  3449.     debug(F101,"SET ALARM time (1)","",sec);
  3450.     if ((sec += xx) < 0L) {
  3451. printf("Internal time conversion error, sorry.n");
  3452. return(-9);
  3453.     }
  3454.     if (sec >= 86400L) { /* Alarm crosses midnight */
  3455. long days;
  3456. days = sec / 86400L;
  3457. jd = mjd(p) + days; /* Get modified Julian date */
  3458. ckstrncpy(alrm_date,mjd2date(jd),10);
  3459. sec %= 86400L;
  3460.     }
  3461.     sprintf(alrm_time,"%05ld",sec);
  3462.     debug(F110,"SET ALARM date (2)",alrm_date,0);
  3463.     debug(F110,"SET ALARM time (2)",alrm_time,0);
  3464.     ck_alarm = 1; /* Alarm is set */
  3465. #endif /* COMMENT */
  3466.     return(1);
  3467. }
  3468. #endif /* NOSPL */
  3469. #ifndef NOSETKEY
  3470. int
  3471. dosetkey() { /* SET KEY */
  3472.     int x, y;
  3473.     int flag = 0;
  3474.     int kc; /* Key code */
  3475.     char *s; /* Key binding */
  3476. #ifndef NOKVERBS
  3477.     char *p; /* Worker */
  3478. #endif /* NOKVERBS */
  3479. #ifdef OS2
  3480.     extern int os2gks;
  3481.     extern int mskkeys;
  3482.     extern int initvik;
  3483. #endif /* OS2 */
  3484.     x_ifnum = 1;
  3485.     y = cmnum("numeric key code, or the word CLEAR,","",10,&kc,xxstring);
  3486.     x_ifnum = 0;
  3487.     if (y < 0) {
  3488. debug(F111,"SET KEY",atmbuf,y);
  3489. if (y == -2) { /* Not a valid number */
  3490.     if ((y = strlen(atmbuf)) < 0) /* Check for SET KEY CLEAR */
  3491.       return(-2);
  3492.     if (ckstrcmp(atmbuf,"clear",y,0))
  3493.       return(-2);
  3494.     if ((x = cmcfm()) < 0)
  3495.       return(x);
  3496.     for (y = 0; y < KMSIZE; y++) {
  3497. keymap[y] = (KEY) y;
  3498. macrotab[y] = NULL;
  3499.     }
  3500. #ifdef OS2
  3501.     keymapinit(); /* Special OS/2 initializations */
  3502.     initvik = 1; /* Update the VIK table */
  3503. #endif /* OS2 */
  3504.     return(1);
  3505. } else if (y == -3) { /* SET KEY <Return> */
  3506.     printf(" Press key to be defined: "); /* Prompt for a keystroke */
  3507. #ifdef UNIX
  3508. #ifdef NOSETBUF
  3509.     fflush(stdout);
  3510. #endif /* NOSETBUF */
  3511. #endif /* UNIX */
  3512.     conbin((char)escape); /* Put terminal in binary mode */
  3513. #ifdef OS2
  3514.     os2gks = 0; /* Turn off Kverb preprocessing */
  3515. #endif /* OS2 */
  3516.     kc = congks(0); /* Get character or scan code */
  3517. #ifdef OS2
  3518.     os2gks = 1; /* Turn on Kverb preprocessing */
  3519. #endif /* OS2 */
  3520.     concb((char)escape); /* Restore terminal to cbreak mode */
  3521.     if (kc < 0) { /* Check for error */
  3522. printf("?Error reading keyn");
  3523. return(0);
  3524.     }
  3525. #ifdef OS2
  3526.     shokeycode(kc,-1); /* Show current definition */
  3527. #else
  3528.     shokeycode(kc); /* Show current definition */
  3529. #endif /* OS2 */
  3530.     flag = 1; /* Remember it's a multiline command */
  3531. } else /* Error */
  3532.   return(y);
  3533.     }
  3534.     /* Normal SET KEY <scancode> <value> command... */
  3535. #ifdef OS2
  3536.     if (mskkeys)
  3537.       kc = msktock(kc);
  3538. #endif /* OS2 */
  3539.     if (kc < 0 || kc >= KMSIZE) {
  3540. printf("?key code must be between 0 and %dn", KMSIZE - 1);
  3541. return(-9);
  3542.     }
  3543.     if (kc == escape) {
  3544. printf("Sorry, %d is the CONNECT-mode escape charactern",kc);
  3545. return(-9);
  3546.     }
  3547. #ifdef OS2
  3548.     wideresult = -1;
  3549. #endif /* OS2 */
  3550.     if (flag) {
  3551. cmsavp(psave,PROMPTL);
  3552. cmsetp(" Enter new definition: ");
  3553. cmini(ckxech);
  3554. cmflgs = 0;
  3555. prompt(NULL);
  3556.     }
  3557.   def_again:
  3558.     if (flag)
  3559.       cmres();
  3560.     if ((y = cmtxt("key definition,n
  3561. or Ctrl-C to cancel this command,n
  3562. or Enter to restore default definition",
  3563.    "",&s,NULL)) < 0) {
  3564. if (flag) /* Handle parse errors */
  3565.   goto def_again;
  3566. else
  3567.   return(y);
  3568.     }
  3569.     s = brstrip(s);
  3570. #ifndef NOKVERBS
  3571.     p = s; /* Save this place */
  3572. #endif /* NOKVERBS */
  3573. /*
  3574.   If the definition included any Kverbs, quote the backslash so the Kverb
  3575.   will still be in the definition when the key is pressed.  We don't do this
  3576.   in zzstring(), because Kverbs are valid only in this context and nowhere
  3577.   else.
  3578.   We use this code active for all versions that support SET KEY, even if they
  3579.   don't support Kverbs, because otherwise K would behave differently for
  3580.   different versions.
  3581. */
  3582.     for (x = 0, y = 0; s[x]; x++, y++) { /* Convert K to \K */
  3583. if ((x > 0) &&
  3584.     (s[x] == 'K' || s[x] == 'k')
  3585.     ) { /* Have K */
  3586.     if ((x == 1 && s[x-1] == CMDQ) ||
  3587. (x > 1 && s[x-1] == CMDQ && s[x-2] != CMDQ)) {
  3588. line[y++] = CMDQ; /* Make it \K */
  3589.     }
  3590.     if (x > 1 && s[x-1] == '{' && s[x-2] == CMDQ) {
  3591.    line[y-1] = CMDQ; /* Have {K */
  3592.    line[y++] = '{'; /* Make it \{K */
  3593.     }
  3594. }
  3595. line[y] = s[x];
  3596.     }
  3597.     line[y++] = NUL; /* Terminate */
  3598.     s = line + y + 1; /* Point to after it */
  3599.     x = LINBUFSIZ - (int) strlen(line) - 1; /* Calculate remaining space */
  3600.     if ((x < (LINBUFSIZ / 2)) ||
  3601. (zzstring(line, &s, &x) < 0)) { /* Expand variables, etc. */
  3602. printf("?Key definition too longn");
  3603. if (flag) cmsetp(psave);
  3604. return(-9);
  3605.     }
  3606.     s = line + y + 1; /* Point to result. */
  3607. #ifndef NOKVERBS
  3608. /*
  3609.   Special case: see if the definition starts with a Kverb.
  3610.   If it does, point to it with p, otherwise set p to NULL.
  3611. */
  3612.     p = s;
  3613.     if (*p++ == CMDQ) {
  3614. if (*p == '{') p++;
  3615. p = (*p == 'k' || *p == 'K') ? p + 1 : NULL;
  3616.     }
  3617. #endif /* NOKVERBS */
  3618.     if (macrotab[kc]) { /* Possibly free old macro from key. */
  3619. free(macrotab[kc]);
  3620. macrotab[kc] = NULL;
  3621.     }
  3622.     switch (strlen(s)) { /* Action depends on length */
  3623.       case 0: /* Reset to default binding */
  3624. keymap[kc] = (KEY) kc;
  3625. break;
  3626.       case 1: /* Single character */
  3627.    keymap[kc] = (CHAR) *s;
  3628.    break;
  3629.       default: /* Character string */
  3630. #ifndef NOKVERBS
  3631. if (p) {
  3632.     y = xlookup(kverbs,p,nkverbs,&x); /* Look it up */
  3633.     debug(F101,"set key kverb lookup",0,y); /* exact match required */
  3634.     if (y > -1) {
  3635. keymap[kc] = F_KVERB | y;
  3636. break;
  3637.     }
  3638. }
  3639. #endif /* NOKVERBS */
  3640. keymap[kc] = (KEY) kc;
  3641. macrotab[kc] = (MACRO) malloc(strlen(s)+1);
  3642. if (macrotab[kc])
  3643.   strcpy((char *) macrotab[kc], s);
  3644. break;
  3645.     }
  3646.     if (flag) cmsetp(psave);
  3647. #ifdef OS2
  3648.     initvik = 1; /* Update VIK table */
  3649. #endif /* OS2 */
  3650.     return(1);
  3651. }
  3652. #endif /* NOSETKEY */
  3653. #ifdef HWPARITY
  3654. struct keytab stoptbl[] = {
  3655.     "1", 1, 0,
  3656.     "2", 2, 0
  3657. };
  3658. #endif /* HWPARITY */
  3659. static struct keytab sertbl[] = {
  3660.     "7E1", 0, 0,
  3661. #ifdef HWPARITY
  3662.     "7E2", 1, 0,
  3663. #endif /* HWPARITY */
  3664.     "7M1", 2, 0,
  3665. #ifdef HWPARITY
  3666.     "7M2", 3, 0,
  3667. #endif /* HWPARITY */
  3668.     "7O1", 4, 0,
  3669. #ifdef HWPARITY
  3670.     "7O2", 5, 0,
  3671. #endif /* HWPARITY */
  3672.     "7S1", 6, 0,
  3673. #ifdef HWPARITY
  3674.     "7S2", 7, 0,
  3675.     "8E1", 9, 0,
  3676.     "8E2", 10, 0,
  3677. #endif /* HWPARITY */
  3678. #ifdef HWPARITY
  3679.     "8N1", 8, 0,
  3680. #endif /* HWPARITY */
  3681. #ifdef HWPARITY
  3682.     "8N2", 11, 0,
  3683.     "8O1", 12, 0,
  3684.     "8O2", 13, 0,
  3685. #endif /* HWPARITY */
  3686.     "", 0, 0
  3687. };
  3688. static int nsertbl = (sizeof(sertbl) / sizeof(struct keytab)) - 1;
  3689. static char * sernam[] = { /* Keep this in sync with sertbl[] */
  3690.   "7E1", "7E2", "7M1", "7M2", "7O1", "7O2", "7S1", "7S2",
  3691.   "8N1", "8E1", "8E2", "8N2", "8O1", "8O2"
  3692. };
  3693. static struct keytab optstab[] = { /* SET OPTIONS table */
  3694. #ifndef NOFRILLS
  3695.     "delete",    XXDEL,   0,            /* DELETE */
  3696. #endif /* NOFRILLS */
  3697.     "directory", XXDIR,   0, /* DIRECTORY */
  3698. #ifdef CKPURGE
  3699.     "purge",     XXPURGE, 0, /* PURGE */
  3700. #endif /* CKPURGE */
  3701.     "type",      XXTYP,   0, /* TYPE */
  3702.     "", 0, 0
  3703. };
  3704. static int noptstab =  (sizeof(optstab) / sizeof(struct keytab)) - 1;
  3705. #ifndef NOXFER
  3706. /*
  3707.   PROTOCOL SELECTION.  Kermit is always available.  If CK_XYZ is defined at
  3708.   compile time, then the others become selections also.  In OS/2 and
  3709.   Windows, they are integrated and the various SET commands (e.g. "set file
  3710.   type") affect them as they would Kermit.  In other OS's (UNIX, VMS, etc),
  3711.   they are external protocols which are run via Kermit's REDIRECT mechanism.
  3712.   All we do is collect and verify the filenames and pass them along to the
  3713.   external protocol.
  3714. */
  3715. struct keytab protos[] = {
  3716. #ifdef CK_XYZ
  3717.     "g",          PROTO_G,  CM_INV,
  3718. #endif /* CK_XYZ */
  3719.     "kermit",     PROTO_K,  0,
  3720. #ifdef CK_XYZ
  3721.     "other",      PROTO_O,  0,
  3722.     "x",          PROTO_X,  CM_INV|CM_ABR,
  3723.     "xmodem",     PROTO_X,  0,
  3724.     "xmodem-crc", PROTO_XC, 0,
  3725.     "y",          PROTO_Y,  CM_INV|CM_ABR,
  3726.     "ymodem",     PROTO_Y,  0,
  3727.     "ymodem-g",   PROTO_G,  0,
  3728.     "zmodem",     PROTO_Z,  0
  3729. #endif /* CK_XYZ */
  3730. };
  3731. int nprotos =  (sizeof(protos) / sizeof(struct keytab));
  3732. #define XPCMDLEN 71
  3733. _PROTOTYP(static int protofield, (char *, char *, char *));
  3734. _PROTOTYP(static int setproto, (void));
  3735. static int
  3736. protofield(current, help, px) char * current, * help, * px; {
  3737.     char *s, tmpbuf[XPCMDLEN+1];
  3738.     int x;
  3739.     if (current) /* Put braces around default */
  3740.       sprintf(tmpbuf,"{%s}",current);
  3741.     else
  3742.       tmpbuf[0] = NUL;
  3743.     if ((x = cmfld(help, (char *)tmpbuf, &s, xxstring)) < 0)
  3744.       return(x);
  3745.     if ((int)strlen(s) > XPCMDLEN) {
  3746. printf("?Sorry - maximum length is %dn", XPCMDLEN);
  3747. return(-9);
  3748.     } else if (*s) {
  3749. strcpy(px,s);
  3750.     } else {
  3751. px = NULL;
  3752.     }
  3753.     return(x);
  3754. }
  3755. static int
  3756. setproto() { /* Select a file transfer protocol */
  3757.     /* char * s = NULL; */
  3758.     int x = 0, y;
  3759.     char s1[XPCMDLEN+1], s2[XPCMDLEN+1], s3[XPCMDLEN+1];
  3760.     char s4[XPCMDLEN+1], s5[XPCMDLEN+1], s6[XPCMDLEN+1], s7[XPCMDLEN+1];
  3761.     char * p1 = s1, * p2 = s2, *p3 = s3;
  3762.     char * p4 = s4, * p5 = s5, *p6 = s6, *p7 = s7;
  3763. #ifdef XYZ_INTERNAL
  3764.     extern int p_avail;
  3765. #else
  3766. #ifndef CK_REDIR
  3767.     x = 1;
  3768. #endif /* CK_REDIR */
  3769. #endif /* XYZ_INTERNAL */
  3770.     s1[0] = NUL;
  3771.     s2[0] = NUL;
  3772.     s3[0] = NUL;
  3773.     s4[0] = NUL;
  3774.     s5[0] = NUL;
  3775.     s6[0] = NUL;
  3776.     if ((y = cmkey(protos,nprotos,"","kermit",xxstring)) < 0)
  3777.       return(y);
  3778.     if (x && y != PROTO_K) {
  3779. printf(
  3780.    "?Sorry, REDIRECT capability required for external protocols.n");
  3781. return(-9);
  3782.     }
  3783.     if ((x = protofield(ptab[y].h_b_init,
  3784.      "Optional command to send to host prior to uploading in binary mode",
  3785.        p1)) < 0) {
  3786. if (x == -3) {
  3787.     protocol = y; /* Set protocol but don't change */
  3788.     return(1); /* anything else */
  3789. } else
  3790.   return(x);
  3791.     }
  3792.     if ((x = protofield(ptab[y].h_t_init,
  3793.      "Optional command to send to host prior to uploading in text mode",
  3794.        p2)) < 0) {
  3795. if (x == -3)
  3796.   goto protoexit;
  3797. else
  3798.   return(x);
  3799.     }
  3800.     if (y == PROTO_K) {
  3801. if ((x = protofield(ptab[y].h_x_init,
  3802.     "Optional command to send to host to start Kermit server",
  3803.     p3)) < 0) {
  3804.     if (x == -3)
  3805.       goto protoexit;
  3806.     else
  3807.       return(x);
  3808. }
  3809.     }
  3810. #ifndef XYZ_INTERNAL /* If XYZMODEM are external... */
  3811.     if (y != PROTO_K) {
  3812. if ((x = protofield(ptab[y].p_b_scmd,
  3813.             "External command to SEND in BINARY mode with this protocol",
  3814.     p4)) < 0) {
  3815.     if (x == -3)
  3816.       goto protoexit;
  3817.     else
  3818.       return(x);
  3819. }
  3820. if ((x = protofield(ptab[y].p_t_scmd,
  3821.  "External command to SEND in TEXT mode with this protocol",
  3822.     p5)) < 0) {
  3823.     if (x == -3)
  3824.       goto protoexit;
  3825.     else
  3826.       return(x);
  3827. }
  3828. if ((x = protofield(ptab[y].p_b_rcmd,
  3829.        "External command to RECEIVE in BINARY mode with this protocol",
  3830.     p6)) < 0) {
  3831.     if (x == -3)
  3832.       goto protoexit;
  3833.     else
  3834.       return(x);
  3835. }
  3836. if ((x = protofield(ptab[y].p_t_rcmd,
  3837.  "External command to RECEIVE in TEXT mode with this protocol",
  3838.     p7)) < 0) {
  3839.     if (x == -3)
  3840.       goto protoexit;
  3841.     else
  3842.       return(x);
  3843. }
  3844.     }
  3845. #endif /* XYZ_INTERNAL */
  3846.     if ((x = cmcfm()) < 0) /* Confirm the command */
  3847.       return(x);
  3848. protoexit: /* Common exit from this routine */
  3849. #ifdef XYZ_INTERNAL
  3850.     if (!p_avail) {
  3851. bleep(BP_WARN);
  3852. printf("n?X,Y, and Zmodem are unavailablen");
  3853. return(success = 0);
  3854.     }
  3855. #endif /* XYZ_INTERNAL */
  3856.     p1 = brstrip(p1);
  3857.     p2 = brstrip(p2);
  3858.     p3 = brstrip(p3);
  3859.     p4 = brstrip(p4);
  3860.     p5 = brstrip(p5);
  3861.     p6 = brstrip(p6);
  3862.     p7 = brstrip(p7);
  3863.     initproto(y,p1,p2,p3,p4,p5,p6,p7);
  3864.     return(success = 1);
  3865. }
  3866. int
  3867. setdest() {
  3868.     int x, y;
  3869.     if ((y = cmkey(desttab,ndests,"","disk",xxstring)) < 0) return(y);
  3870.     if ((x = cmcfm()) < 0) return(x);
  3871.     dest = y;
  3872.     return(1);
  3873. }
  3874. #endif /* NOXFER */
  3875. #ifdef DECNET
  3876. struct keytab dnettab[] = {
  3877. #ifndef OS2ONLY
  3878.     "cterm", NP_CTERM, 0,
  3879. #endif /* OS2ONLY */
  3880.     "lat",   NP_LAT,   0
  3881. };
  3882. int ndnet =  (sizeof(dnettab) / sizeof(struct keytab));
  3883. #endif /* DECNET */
  3884. /*  S E T P R I N T E R  --  SET PRINTER command  */
  3885. #ifdef PRINTSWI
  3886. static struct keytab prntab[] = { /* SET PRINTER switches */
  3887.     "/bidirectional",    PRN_BID, 0,
  3888.     "/command",          PRN_PIP, CM_ARG,
  3889.     "/dos-device",       PRN_DOS, CM_ARG,
  3890.     "/end-of-job-string",PRN_TRM, CM_ARG,
  3891.     "/file",             PRN_FIL, CM_ARG,
  3892. #ifdef BPRINT
  3893.     "/flow-control",     PRN_FLO, CM_ARG,
  3894. #endif /* BPRINT */
  3895.     "/job-header-file",  PRN_SEP, CM_ARG,
  3896. #ifdef OS2
  3897.     "/length",           PRN_LEN, CM_ARG,
  3898. #endif /* OS2 */
  3899.     "/none",             PRN_NON, 0,
  3900. #ifdef OS2
  3901.     "/nopostscript",     PRN_RAW, 0,
  3902.     "/nops",             PRN_RAW, CM_INV,
  3903. #endif /* OS2 */
  3904.     "/output-only",      PRN_OUT, 0,
  3905. #ifdef BPRINT
  3906.     "/parity",           PRN_PAR, CM_ARG,
  3907. #endif /* BPRINT */
  3908.     "/pipe",             PRN_PIP, CM_ARG|CM_INV,
  3909. #ifdef OS2
  3910.     "/postscript",       PRN_PS,  0,
  3911.     "/ps",               PRN_PS,  CM_INV,
  3912. #endif /* OS2 */
  3913.     "/separator",        PRN_SEP, CM_ARG|CM_INV,
  3914. #ifdef BPRINT
  3915.     "/speed",            PRN_SPD, CM_ARG,
  3916. #endif /* BPRINT */
  3917.     "/timeout",          PRN_TMO, CM_ARG,
  3918.     "/terminator",       PRN_TRM, CM_ARG|CM_INV,
  3919. #ifdef OS2
  3920. #ifdef NT
  3921.     "/w",                PRN_WIN, CM_ARG|CM_ABR|CM_INV,
  3922.     "/wi",               PRN_WIN, CM_ARG|CM_ABR|CM_INV,
  3923. #endif /* NT */
  3924.     "/width",            PRN_WID, CM_ARG,
  3925. #endif /* OS2 */
  3926. #ifdef NT
  3927.     "/windows-queue",    PRN_WIN, CM_ARG,
  3928. #endif /* NT */
  3929.     "",                 0,      0
  3930. };
  3931. int nprnswi =  (sizeof(prntab) / sizeof(struct keytab)) - 1;
  3932. #endif /* PRINTSWI */
  3933. static int
  3934. setprinter(xx) int xx; {
  3935.     int x, y;
  3936.     char * s;
  3937.     char * defname = NULL;
  3938. #ifdef BPRINT
  3939.     char portbuf[64];
  3940.     long portspeed = 0L;
  3941.     int portparity = 0;
  3942.     int portflow = 0;
  3943. #endif /* BPRINT */
  3944. #ifdef PRINTSWI
  3945.     int c, i, n, wild, confirmed = 0; /* Workers */
  3946.     int getval = 0; /* Whether to get switch value */
  3947.     struct stringint { /* Temporary array for switch values */
  3948. char * sval;
  3949. int ival;
  3950.     } pv[PRN_MAX+1];
  3951.     struct FDB sw, of, cm; /* FDBs for each parse function */
  3952.     int haveque = 0;
  3953. #endif /* PRINTSWI */
  3954. #ifdef NT
  3955.     struct keytab * printtab = NULL, * _printtab = NULL;
  3956.     int nprint = 0, printdef=0;
  3957. #endif /* NT */
  3958. #ifdef OS2
  3959.     defname = "PRN"; /* default */
  3960. #else
  3961. #ifdef VMS
  3962.     defname = "LPT:";
  3963. #else
  3964. #ifdef UNIX
  3965.     defname = "|lpr";
  3966. #endif /* UNIX */
  3967. #endif /* VMS */
  3968. #endif /* OS2 */
  3969. #ifdef PRINTSWI
  3970. #ifdef NT
  3971.     haveque = Win32EnumPrt(&printtab,&_printtab,&nprint,&printdef);
  3972.     haveque = haveque && nprint;
  3973. #endif /* NT */
  3974.     for (i = 0; i <= PRN_MAX; i++) { /* Initialize switch values */
  3975. pv[i].sval = NULL; /* to null pointers */
  3976. pv[i].ival = -1; /* and -1 int values */
  3977.     }
  3978.     if (xx == XYBDCP) { /* SET BPRINTER == /BIDIRECTIONAL */
  3979. pv[PRN_BID].ival = 1;
  3980. pv[PRN_OUT].ival = 0;
  3981.     }
  3982.     /* Initialize defaults based upon current printer settings */
  3983.     if (printername) {
  3984.         defname = printername;
  3985.         switch (printertype) {
  3986.   case PRT_WIN: pv[PRN_WIN].ival = 1; break;
  3987.   case PRT_DOS: pv[PRN_DOS].ival = 1; break;
  3988.   case PRT_PIP: pv[PRN_PIP].ival = 1; break;
  3989.   case PRT_FIL: pv[PRN_FIL].ival = 1; break;
  3990.   case PRT_NON: pv[PRN_NON].ival = 1; break;
  3991.         }
  3992.     }
  3993. #ifdef BPRINT
  3994.     /* only set the BIDI flag if we are bidi */
  3995.     if (printbidi)
  3996.         pv[PRN_BID].ival = 1;
  3997.     /* serial port parameters may be set for non-bidi devices */
  3998.     pv[PRN_SPD].ival = pportspeed / 10L;
  3999.     pv[PRN_PAR].ival = pportparity;
  4000.     pv[PRN_FLO].ival = pportflow;
  4001. #endif /* BPRINT */
  4002.     if (printtimo)
  4003.         pv[PRN_TMO].ival = printtimo;
  4004.     if (printterm) {
  4005.         pv[PRN_TRM].ival = 1;
  4006.         makestr(&pv[PRN_TRM].sval,printterm);
  4007.     }
  4008.     if (printsep) {
  4009.         pv[PRN_SEP].ival = 1;
  4010.         makestr(&pv[PRN_SEP].sval,printsep);
  4011.     }
  4012.     if (txt2ps) {
  4013.         pv[PRN_PS].ival = 1;
  4014.         pv[PRN_WID].ival = ps_width;
  4015.         pv[PRN_LEN].ival = ps_length;
  4016.     } else {
  4017.         pv[PRN_RAW].ival = 1;
  4018.     }
  4019.     /* Set up chained parse functions... */
  4020.     cmfdbi(&sw, /* First FDB - command switches */
  4021.    _CMKEY, /* fcode */
  4022.    "Switch", /* hlpmsg */
  4023.    "", /* default */
  4024.    "", /* addtl string data */
  4025.    nprnswi, /* addtl numeric data 1: tbl size */
  4026.    4, /* addtl numeric data 2: 4 = cmswi */
  4027.    xxstring, /* Processing function */
  4028.    prntab, /* Keyword table */
  4029.    &cm /* Pointer to next FDB */
  4030.    );
  4031.     cmfdbi(&cm, /* Second fdb for confirmation */
  4032.    _CMCFM, /* fcode */
  4033.    "", /* hlpmsg */
  4034.    "", /* default */
  4035.    "", /* addtl string data */
  4036.    0, /* addtl numeric data 1 */
  4037.    0, /* addtl numeric data 2 */
  4038.    NULL,
  4039.    NULL,
  4040.    &of
  4041.    );
  4042.     cmfdbi(&of, /* Third FDB for printer name */
  4043.    _CMOFI, /* fcode */
  4044.    "Printer or file name", /* hlpmsg */
  4045.    defname, /* default */
  4046.    "", /* addtl string data */
  4047.    0, /* addtl numeric data 1: tbl size */
  4048.    0, /* addtl numeric data 2: 4 = cmswi */
  4049.    xxstring, /* Processing function */
  4050.    NULL, /* Nothing */
  4051.    NULL
  4052.    );
  4053.     while (1) { /* Parse 0 or more switches */