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

通讯/手机编程

开发平台:

Windows_Unix

  1. #include "ckcsym.h"
  2. /*  C K U U S 4 --  "User Interface" for C-Kermit, part 4  */
  3. /*
  4.   Author: Frank da Cruz <fdc@columbia.edu>,
  5.   Columbia University Academic Information Systems, New York City.
  6.   Copyright (C) 1985, 2000,
  7.     Trustees of Columbia University in the City of New York.
  8.     All rights reserved.  See the C-Kermit COPYING.TXT file or the
  9.     copyright text in the ckcmai.c module for disclaimer and permissions.
  10. */
  11. /*
  12.   File ckuus4.c -- Functions moved from other ckuus*.c modules to even
  13.   out their sizes.
  14. */
  15. #include "ckcdeb.h"
  16. #include "ckcasc.h"
  17. #include "ckcker.h"
  18. #include "ckuusr.h"
  19. #include "ckuver.h"
  20. #include "ckcnet.h"                     /* Network symbols */
  21. #include "ckcxla.h"                     /* Character sets */
  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. #ifdef VMS
  29. #include <errno.h>                      /* For v(errno) */
  30. extern char * ckvmserrstr(unsigned long);
  31. #ifndef OLD_VMS
  32. #include <lib$routines.h>               /* Not for VAX C 2.4 */
  33. #else
  34. #include <libdef.h>
  35. #endif /* OLD_VMS */
  36. _PROTOTYP(int vmsttyfd, (void) );
  37. #endif /* VMS */
  38. #ifdef OS2
  39. #ifndef NT
  40. #define INCL_NOPM
  41. #define INCL_VIO                        /* Needed for ckocon.h */
  42. #include <os2.h>
  43. #undef COMMENT
  44. #else
  45. #include <windows.h>
  46. #include <tapi.h>
  47. #include "ckntap.h"
  48. #define APIRET ULONG
  49. #endif /* NT */
  50. #include "ckocon.h"
  51. #include "ckoetc.h"
  52. int StartedFromDialer = 0;
  53. HWND hwndDialer = 0;
  54. LONG KermitDialerID = 0;
  55. #ifdef putchar
  56. #undef putchar
  57. #endif /* putchar */
  58. #define putchar(x) conoc(x)
  59. #ifdef CK_PID
  60. #include <process.h>
  61. #endif /* CK_PID */
  62. #endif /* OS2 */
  63. extern xx_strp xxstring;
  64. #ifdef DEC_TCPIP
  65. #include <descrip>
  66. #include <dvidef>
  67. #include <dcdef>
  68. #endif /* DEC_TCPIP */
  69. #ifdef FNFLOAT
  70. #include <math.h>                       /* Floating-point functions */
  71. #endif /* FNFLOAT */
  72. extern int quiet, network, xitsta, escape, nopush, xferstat,
  73.   exitonclose, tn_exit, ttnproto, autodl, flow, byteorder;
  74. extern char * k_info_dir;
  75. #ifndef MAC
  76. #ifndef AMIGA
  77. extern int ttyfd;
  78. #endif /* MAC */
  79. #endif /* AMIGA */
  80. #ifdef TNCODE
  81. extern int tn_nlm, tn_b_nlm, tn_b_xfer, tn_sb_bug;
  82. extern int tn_rem_echo;
  83. extern int tn_b_meu, tn_b_ume;
  84. #endif /* TNCODE */
  85. char * xferfile = NULL;
  86. int xferlog = 0;
  87. extern int local, xargc, stayflg, rcflag, bgset, cfilef,
  88.   inserver, srvcdmsg, success;
  89. extern char cmdfil[], *versio, *ckxsys, **xargv;
  90. #ifdef DEBUG
  91. extern char debfil[];                   /* Debug log file name */
  92. #endif /* DEBUG */
  93. extern int noinit;
  94. #ifndef NOICP                           /* Most of this file... */
  95. #ifndef AMIGA
  96. #ifndef MAC
  97. #include <signal.h>
  98. #endif /* MAC */
  99. #endif /* AMIGA */
  100. #ifdef STRATUS                          /* Stratus Computer, Inc.  VOS */
  101. #ifdef putchar
  102. #undef putchar
  103. #endif /* putchar */
  104. #define putchar(x) conoc(x)
  105. #ifdef getchar
  106. #undef getchar
  107. #endif /* getchar */
  108. #define getchar(x) coninc(0)
  109. #endif /* STRATUS */
  110. #ifdef ANYX25
  111. extern int revcall, closgr, cudata;
  112. int x25ver;
  113. extern char udata[];
  114. #ifndef IBMX25
  115. extern int npadx3;
  116. extern CHAR padparms[];
  117. extern struct keytab padx3tab[];
  118. #endif /* !IBMX25 */
  119. #ifdef IBMX25
  120. /* global variables only available for IBM X.25 - possibly interesting for
  121.  * other implementations
  122.  */
  123. extern x25addr_t local_nua;
  124. extern x25addr_t remote_nua;
  125. #endif /* IBMX25 */
  126. #endif /* ANYX25 */
  127. #ifdef NETCONN
  128. #ifndef NODIAL
  129. extern int nnetdir;
  130. extern char *netdir[];
  131. #endif /* NODIAL */
  132. extern char ipaddr[];
  133. #ifdef CK_NETBIOS
  134. extern unsigned short netbiosAvail;
  135. extern unsigned long NetbeuiAPI;
  136. extern unsigned char NetBiosName[];
  137. extern unsigned char NetBiosAdapter;
  138. extern unsigned char NetBiosLSN;
  139. #endif /* CK_NETBIOS */
  140. #ifdef TCPSOCKET
  141. extern char myipaddr[];
  142. extern int tcp_rdns;
  143. #ifdef CK_DNS_SRV
  144. extern int tcp_dns_srv;
  145. #endif /* CK_DNS_SRV */
  146. #ifndef NOTCPOPTS
  147. #ifdef SOL_SOCKET
  148. #ifdef SO_LINGER
  149. extern int tcp_linger;
  150. extern int tcp_linger_tmo;
  151. #endif /* SO_LINGER */
  152. #ifdef SO_DONTROUTE
  153. extern int tcp_dontroute;
  154. #endif /* SO_DONTROUTE */
  155. #ifdef TCP_NODELAY
  156. extern int tcp_nodelay;
  157. #endif /* TCP_NODELAY */
  158. #ifdef SO_SNDBUF
  159. extern int tcp_sendbuf;
  160. #endif /* SO_SNDBUF */
  161. #ifdef SO_RCVBUF
  162. extern int tcp_recvbuf;
  163. #endif /* SO_RCVBUF */
  164. #ifdef SO_KEEPALIVE
  165. extern int tcp_keepalive;
  166. #endif /* SO_KEEPALIVE */
  167. #endif /* SOL_SOCKET */
  168. #endif /* NOTCPOPTS */
  169. #endif /* TCPSOCKET */
  170. #endif /* NETCONN */
  171. extern char * floname[];
  172. #ifndef NOSPL
  173. extern int fndiags;                     /* Function diagnostics on/off */
  174. int ispattern = 0;
  175. #ifdef CK_APC
  176. extern int apcactive;                   /* Nonzero = APC command was rec'd */
  177. extern int apcstatus;                   /* Are APC commands being processed? */
  178. #ifdef DCMDBUF
  179. extern char *apcbuf;                    /* APC command buffer */
  180. #else
  181. extern char apcbuf[];
  182. #endif /* DCMDBUF */
  183. #endif /* CK_APC */
  184. extern char evalbuf[];                  /* EVALUATE result */
  185. extern char uidbuf[], pwbuf[], prmbuf[];
  186. _PROTOTYP( static char * fneval, (char *, char * [], int, char * ) );
  187. _PROTOTYP( static VOID myflsh, (void) );
  188. _PROTOTYP( static char * getip, (char *) );
  189. static char hexdigits[16] = {
  190.     '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
  191. };
  192. extern char * tempdir;
  193. #ifdef CK_REXX
  194. extern char rexxbuf[];
  195. #endif /* CK_REXX */
  196. extern int tfline[];
  197. /* These need to be internationalized... */
  198. static
  199. char *wkdays[] = {
  200.     "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
  201. };
  202. #endif /* NOSPL */
  203. char *months[] = {
  204.     "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  205.     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
  206. };
  207. #ifdef OS2
  208. _PROTOTYP (int os2getcp, (void) );
  209. #ifdef TCPSOCKET
  210. extern char tcpname[];
  211. #endif /* TCPSOCKET */
  212. extern char startupdir[],exedir[];
  213. extern int tcp_avail;
  214. #ifdef DECNET
  215. extern int dnet_avail;
  216. #endif /* DECNET */
  217. #ifdef SUPERLAT
  218. extern int slat_avail;
  219. #endif /* SUPERLAT */
  220. extern int tt_type, max_tt;
  221. extern struct tt_info_rec tt_info[];
  222. extern int tt_rows[], tt_cols[];
  223. #else /* OS2 */
  224. extern int tt_rows, tt_cols;
  225. #endif /* OS2 */
  226. #ifdef CK_TAPI
  227. extern int tttapi;
  228. extern int tapipass;
  229. extern struct keytab * tapilinetab;
  230. extern struct keytab * _tapilinetab;
  231. extern int ntapiline;
  232. #endif /* CK_TAPI */
  233. #ifdef VMS
  234. extern char startupdir[];
  235. #endif /* VMS */
  236. #ifdef UNIX
  237. extern char startupdir[];
  238. #endif /* UNIX */
  239. extern struct keytab colxtab[];
  240. extern int ncolx;
  241. extern char ttname[], *zinptr, *kermrc;
  242. extern char inidir[];
  243. extern int activecmd, remonly, cmd_rows, cmd_cols, parity, seslog,
  244.   sessft, sosi, hwparity, tsecs, xargs, zincnt, tlevel, insilence, cmdmsk,
  245.   timint, timef, inbufsize, dialog, binary, carrier, cdtimo, cmask, duplex,
  246.   fmask, inecho, nettype, nmac, turnch, turn, kbchar;
  247. #ifndef NOXFER
  248. extern CHAR eol,  mypadc, mystch, padch, seol, stchr, * epktmsg, feol;
  249. extern char *cksysid;
  250. extern struct ck_p ptab[];
  251. extern int
  252.   protocol, prefixing, xfrbel, xfrcan, xfrint, xfrchr, xfrnum, pktpaus,
  253.   lscapr, lscapu, xfermode, dest, slostart, maxrps, maxsps, maxtry, mypadn,
  254.   npad, pkttim, bigrbsiz, bigsbsiz, keep, atcapr, autopar, bctr, bctu,
  255.   crunched, ckdelay, ebq, ebqflg, pktlog, retrans, rpackets, rptflg, rptq,
  256.   rtimo, spackets, spsiz, spsizf, spsizr, timeouts, fncact, fncnv, urpsiz,
  257.   wmax, wslotn, wslotr, fdispla, spmax, fnrpath, fnspath, crc16;
  258. #endif /* NOXFER */
  259. #ifdef OS2
  260. extern int zxpn;
  261. extern int viewonly;
  262. #endif /* OS2 */
  263. #ifndef NOXFER
  264. #ifdef GFTIMER
  265. extern CKFLOAT fptsecs, fpxfsecs;
  266. #endif /* GFTIMER */
  267. extern long xfsecs, tfcps;
  268. #ifdef CK_TMPDIR
  269. extern char *dldir;
  270. #endif /* CK_TMPDIR */
  271. #endif /* NOXFER */
  272. #ifdef RECURSIVE
  273. extern int recursive;
  274. #endif /* RECURSIVE */
  275. #ifdef VMS
  276.   extern int frecl;
  277. #endif /* VMS */
  278. extern long
  279.   ffc, filcnt, rptn, speed, tfc, tlci, tlco, ccu, ccp, vernum, xvernum;
  280. #ifndef NOSPL
  281. extern char fspec[], myhost[];
  282. #endif /* NOSPL */
  283. extern char *tfnam[];                   /* Command file names */
  284. #ifdef DCMDBUF
  285. extern struct cmdptr *cmdstk;
  286. extern char *line, *tmpbuf;
  287. #else
  288. extern struct cmdptr cmdstk[];
  289. extern char line[], tmpbuf[], kermrcb[];
  290. #endif /* DCMDBUF */
  291. extern char pktfil[],                   /* Packet log file name */
  292. #ifdef TLOG
  293.   trafil[],                             /* Transaction log file name */
  294. #endif /* TLOG */
  295.   sesfil[];                             /* Session log file name */
  296. #ifndef NOXMIT                          /* TRANSMIT command variables */
  297. extern char xmitbuf[];
  298. extern int xmitf, xmitl, xmitx, xmits, xmitw, xmitt;
  299. #endif /* NOXMIT */
  300. extern int cmdlvl;
  301. #ifndef NOSPL
  302. /* Script programming language items */
  303. extern char **a_ptr[];                  /* Arrays */
  304. extern int a_dim[];
  305. static char * inpmatch = NULL;
  306. extern char * inpbuf, inchar[];         /* Buffers for INPUT and REINPUT */
  307. extern char *inpbp;                     /* And pointer to same */
  308. static char *r3 = (char *)0;
  309. extern int incount;                     /* INPUT character count */
  310. extern int m_found;                     /* MINPUT result */
  311. extern int maclvl;                      /* Macro invocation level */
  312. extern struct mtab *mactab;             /* Macro table */
  313. extern char *mrval[];
  314. extern int macargc[], topargc;
  315. extern char *m_line[];
  316. extern char *m_arg[MACLEVEL][10]; /* You have to put in the dimensions */
  317. extern char *g_var[GVARS];        /* for external 2-dimensional arrays. */
  318. #ifdef DCMDBUF
  319. extern int *count, *inpcas;
  320. #else
  321. extern int count[], inpcas[];
  322. #endif /* DCMDBUF */
  323. #endif /* NOSPL */
  324. #ifdef UNIX
  325. extern int haslock;                     /* For UUCP locks */
  326. extern char flfnam[];
  327. #ifndef USETTYLOCK
  328. extern char lock2[];
  329. #endif /* USETTYLOCK */
  330. #endif /* UNIX */
  331. #ifdef OS2ORUNIX
  332. extern int maxnam, maxpath;             /* Longest name, path length */
  333. #endif /* OS2ORUNIX */
  334. extern int mdmtyp, mdmsav;
  335. #ifndef NODIAL
  336. /* DIAL-related variables */
  337. extern char modemmsg[];
  338. extern MDMINF *modemp[];                /* Pointers to modem info structs */
  339. extern int nmdm, dialhng, dialtmo, dialksp, dialdpy, dialsrt, dialmhu, dialsta;
  340. extern int dialrtr, dialint, dialrstr, dialcon, dialcq, dialfld;
  341. extern int mdmspd, dialec, dialdc, dialmth, dialmauto, dialesc;
  342. extern char *dialnum,   *dialini,  *dialdir[], *dialcmd,  *dialnpr,
  343.  *dialdcon, *dialdcoff, *dialecon, *dialecoff, *dialhcmd, *diallac,
  344.  *dialhwfc, *dialswfc,  *dialnofc, *dialpulse, *dialtone, *dialname,
  345.  *dialaaon, *dialaaoff, *dialmac;
  346. extern char *diallcc,   *dialixp,  *dialixs,   *dialldp,  *diallds,
  347.  *dialpxi,  *dialpxo,   *dialsfx,  *dialtfp;
  348. extern char *diallcp,   *diallcs;
  349. extern int ntollfree, ndialpxx, nlocalac;
  350. extern char *dialtfc[], *diallcac[], *dialpxx[], *matchpxx;
  351. extern int ndialpucc, ndialtocc;
  352. extern char *dialtocc[], *dialpucc[];
  353. extern int ndialdir, dialcnf, dialcvt, dialidt, dialpace;
  354. extern long dialmax, dialcapas;
  355. extern struct keytab mdmtab[];
  356. #ifdef BIGBUFOK
  357. #define ARGBUFSIZ 8191
  358. #else
  359. #define ARGBUFSIZ 1023
  360. #endif /* BIGBUFOK */
  361. #ifdef BIGBUFOK
  362. extern char * dialmsg[];
  363. #endif /* BIGBUFOK */
  364. #endif /* NODIAL */
  365. #ifndef NOCSETS
  366. /* Translation stuff */
  367. extern int fcharset, tcharset, tslevel, language, nlng, tcsr, tcsl;
  368. extern struct keytab lngtab[];
  369. extern struct csinfo fcsinfo[], tcsinfo[];
  370. extern struct langinfo langs[];
  371. #ifdef CK_ANSIC
  372. extern CHAR (*xls[MAXTCSETS+1][MAXFCSETS+1])(CHAR); /* Character set */
  373. extern CHAR (*xlr[MAXTCSETS+1][MAXFCSETS+1])(CHAR); /* translation functions */
  374. #else
  375. extern CHAR (*xls[MAXTCSETS+1][MAXFCSETS+1])(); /* Character set */
  376. extern CHAR (*xlr[MAXTCSETS+1][MAXFCSETS+1])(); /* translation functions. */
  377. #endif /* CK_ANSIC */
  378. #ifdef UNICODE
  379.     extern int ucsbom, ucsorder;
  380. #endif /* UNICODE */
  381. #endif /* NOCSETS */
  382. #ifndef NOSPL
  383. /* Built-in variable names, maximum length VNAML (20 characters) */
  384. struct keytab vartab[] = {
  385.     "_line",     VN_TFLN,  CM_INV,      /* 192 */
  386. #ifdef OS2
  387.     "_regname",  VN_REGN,  CM_INV,      /* 1.1.12 */
  388.     "_regorg",   VN_REGO,  CM_INV,      /* 1.1.12 */
  389.     "_regnum",   VN_REGS,  CM_INV,      /* 1.1.12 */
  390. #endif /* OS2 */
  391.     "apcactive", VN_APC,   CM_INV,      /* 192 */
  392.     "argc",      VN_ARGC,  0,
  393.     "args",      VN_ARGS,  0,
  394.     "authname",  VN_AUTHN, 0,           /* 196 */
  395.     "authstate", VN_AUTHS, 0,           /* 195 */
  396.     "authtype",  VN_AUTHT, 0,           /* 195 */
  397.     "blockcheck",VN_BLK,   0,           /* 195 */
  398. #ifdef BROWSER
  399.     "browser",   VN_BROWSR,0,           /* 193 */
  400.     "browsopts", VN_BROPT, 0,           /* 193 */
  401.     "browsurl",  VN_URL,   0,           /* 193 */
  402. #endif /* BROWSER */
  403.     "byteorder", VN_BYTE,  0,           /* 195 */
  404. #ifndef NOCSETS
  405.     "charset",   VN_CSET,  0,           /* 192 */
  406. #endif /* NOCSETS */
  407.     "cmdbufsize",VN_CMDBL, 0,           /* 195 */
  408.     "cmdfile",   VN_CMDF,  0,
  409.     "cmdlevel",  VN_CMDL,  0,
  410.     "cmdsource", VN_CMDS,  0,
  411.     "cols",      VN_COLS,  0,           /* 190 */
  412.     "connection",VN_CONN,  0,           /* 190 */
  413.     "count",     VN_COUN,  0,
  414. #ifndef NOXFER
  415.     "cps",       VN_CPS,   0,           /* 190 */
  416. #endif /* NOXFER */
  417.     "cpu",       VN_CPU,   0,
  418. #ifndef NOXFER
  419.     "crc16",     VN_CRC16, 0,           /* 192 */
  420.     "ctty",      VN_TTYNAM,0,           /* 196 */
  421. #endif /* NOXFER */
  422.     "cx_time",   VN_CXTIME,0,           /* 195 */
  423. #ifndef NODIAL
  424.     "d$ac",      VN_D_AC,  0,           /* 192 */
  425.     "d$cc",      VN_D_CC,  0,           /* 192 */
  426.     "d$ip",      VN_D_IP,  0,           /* 192 */
  427.     "d$lc",      VN_D_LCP, 0,           /* 193 */
  428.     "d$lcp",     VN_D_LCP, CM_INV,      /* 193 */
  429.     "d$lp",      VN_D_LP,  0,           /* 192 */
  430.     "d$px",      VN_D_PXX, 0,           /* 195 */
  431.     "d$pxx",     VN_D_PXX, CM_INV,      /* 195 */
  432. #endif /* NODIAL */
  433.     "date",      VN_DATE,  0,
  434.     "day",       VN_DAY,   0,
  435. #ifndef NODIAL
  436.     "dialcount", VN_DRTR,  0,           /* 195 */
  437.     "dialnumber",VN_DNUM,  0,           /* 192 */
  438.     "dialresult",VN_MDMSG, 0,           /* 192 */
  439.     "dialstatus",VN_DIAL,  0,           /* 190 */
  440.     "dialsuffix",VN_PDSFX, 0,           /* 193 */
  441.     "dialtype",  VN_DTYPE, 0,           /* 193 */
  442. #endif /* NODIAL */
  443.     "directory", VN_DIRE,  0,
  444. #ifndef NODIAL
  445.     "dm_lp",     VN_DM_LP, 0,           /* 195 */
  446.     "dm_sp",     VN_DM_SP, 0,           /* 195 */
  447.     "dm_pd",     VN_DM_PD, 0,           /* 195 */
  448.     "dm_td",     VN_DM_TD, 0,           /* 195 */
  449.     "dm_wa",     VN_DM_WA, 0,           /* 195 */
  450.     "dm_wd",     VN_DM_WD, 0,           /* 195 */
  451.     "dm_rc",     VN_DM_RC, 0,           /* 195 */
  452. #endif /* NODIAL */
  453. #ifndef NOXFER
  454.     "download",  VN_DLDIR, 0,           /* 192 */
  455. #endif /* NOXFER */
  456.     "editor",    VN_EDITOR,0,
  457.     "editfile",  VN_EDFILE,0,
  458.     "editopts",  VN_EDOPT, 0,
  459.     "errno",     VN_ERRNO, 0,           /* 192 */
  460.     "errstring", VN_ERSTR, 0,           /* 192 */
  461.     "escape",    VN_ESC,   0,           /* 193 */
  462.     "evaluate",  VN_EVAL,  0,           /* 190 */
  463. #ifdef OS2
  464.     "exedir",    VN_EXEDIR,0,           /* 192 */
  465. #endif /* OS2 */
  466.     "exitstatus",VN_EXIT,  0,
  467. #ifdef CKCHANNELIO
  468.     "f_count",   VN_FCOU,  0,           /* 195 */
  469.     "f_error",   VN_FERR,  0,           /* 195 */
  470.     "f_max",     VN_FMAX,  0,           /* 195 */
  471.     "fileerror", VN_FERR,  CM_INV,      /* 195 */
  472.     "filemax",   VN_FERR,  CM_INV,      /* 195 */
  473. #endif /* CKCHANNELIO */
  474.     "filename",  VN_FNAM,  0,           /* 193 */
  475.     "filenumber",VN_FNUM,  0,           /* 193 */
  476.     "filespec",  VN_FILE,  0,
  477.     "fsize",     VN_FFC,   0,           /* 190 */
  478.     "ftype",     VN_MODE,  0,           /* 190 */
  479.     "herald",    VN_HERALD,0,
  480.     "home",      VN_HOME,  0,
  481.     "host",      VN_HOST,  0,
  482.     "hwparity",  VN_HWPAR, 0,           /* 195 */
  483.     "input",     VN_IBUF,  0,
  484.     "inchar",    VN_ICHR,  0,
  485.     "incount",   VN_ICNT,  0,
  486.     "inidir",    VN_INI,   0,           /* 192 */
  487.     "inmatch",   VN_MATCH, 0,           /* 196 */
  488.     "instatus",  VN_ISTAT, 0,           /* 192 */
  489.     "intime",    VN_INTIME,0,           /* 193 */
  490.     "inwait",    VN_INTMO, 0,           /* 195 */
  491.     "ipaddress", VN_IPADDR,0,           /* 192 */
  492.     "kbchar",    VN_KBCHAR,0,           /* 196 */
  493. #ifdef OS2
  494.     "keyboard",  VN_KEYB,  0,
  495. #endif /* OS2 */
  496. #ifdef CK_KERBEROS
  497.     "krb4errmsg",    VN_K4EMSG,0,
  498.     "krb4errno",     VN_K4ENO, 0,
  499.     "krb4principal", VN_K4PRN, 0,
  500.     "krb4realm",     VN_K4RLM, 0,
  501.     "krb4service",   VN_K4SRV, 0,
  502.     "krb5cc",        VN_K5CC,  0,
  503.     "krb5errmsg",    VN_K5EMSG,0,
  504.     "krb5errno",     VN_K5ENO, 0,
  505.     "krb5principal", VN_K5PRN, 0,
  506.     "krb5realm",     VN_K5RLM, 0,
  507.     "krb5service",   VN_K5SRV, 0,
  508. #endif /* CK_KERBEROS */
  509.     "line",      VN_LINE,  0,
  510.     "local",     VN_LCL,   0,
  511. #ifdef UNIX
  512.     "lockdir",   VN_LCKDIR,0,           /* 195 */
  513.     "lockpid",   VN_LCKPID,0,           /* 195 */
  514. #endif /* UNIX */
  515.     "maclevel",  VN_MACLVL,0,           /* 195 */
  516.     "macro",     VN_MAC,   0,
  517. #ifdef FNFLOAT
  518.     "math_e",    VN_MA_E,  0,           /* 195 */
  519.     "math_pi",   VN_MA_PI, 0,           /* 195 */
  520.     "math_precision", VN_MA_PR, 0,      /* 195 */
  521. #endif /* FNFLOAT */
  522.     "minput",    VN_MINP,  0,           /* 192 */
  523.     "model",     VN_MODL,  0,           /* 193 */
  524.     "modem",     VN_MDM,   0,
  525. #ifdef OS2
  526.     "mousecurx", VN_MOU_X, 0,           /* K95 1.1.14 */
  527.     "mousecury", VN_MOU_Y, 0,           /* K95 1.1.14 */
  528. #endif /* OS2 */
  529. #ifndef NODIAL
  530.     "m_aa_off",  VN_M_ECX, 0,           /* all 192... */
  531.     "m_aa_on",   VN_M_AAO, 0,
  532.     "m_dc_off",  VN_M_DCX, 0,
  533.     "m_dc_on",   VN_M_DCO, 0,
  534.     "m_dial",    VN_M_DCM, 0,
  535.     "m_ec_off",  VN_M_ECX, 0,
  536.     "m_ec_on",   VN_M_ECO, 0,
  537.     "m_fc_hw",   VN_M_HWF, 0,
  538.     "m_fc_no",   VN_M_NFC, 0,
  539.     "m_fc_sw",   VN_M_SWF, 0,
  540.     "m_hup",     VN_M_HUP, 0,
  541.     "m_init",    VN_M_INI, 0,
  542.     "m_name",    VN_M_NAM, 0,           /* 195 */
  543.     "m_pulse",   VN_M_PDM, 0,
  544.     "m_sig_cd",  VN_MS_CD, 0,           /* 195 */
  545.     "m_sig_cts", VN_MS_CTS,0,           /* 195 */
  546.     "m_sig_dsr", VN_MS_DSR,0,           /* 195 */
  547.     "m_sig_dtr", VN_MS_DTR,0,           /* 195 */
  548.     "m_sig_ri",  VN_MS_RI, 0,           /* 195 */
  549.     "m_sig_rts", VN_MS_RTS,0,           /* 195 */
  550.     "m_tone",    VN_M_TDM, 0,
  551. #endif /* NODIAL */
  552.     "name",      VN_NAME,  0,
  553.     "ndate",     VN_NDAT,  0,
  554.     "nday",      VN_NDAY,  0,
  555.     "newline",   VN_NEWL,  0,
  556.     "ntime",     VN_NTIM,  0,
  557.     "osname",    VN_OSNAM, 0,           /* 193 */
  558.     "osrelease", VN_OSREL, 0,           /* 193 */
  559.     "osversion", VN_OSVER, 0,           /* 193 */
  560. #ifndef NOXFER
  561.     "packetlen", VN_RPSIZ, 0,           /* 192 */
  562. #endif /* NOXFER */
  563.     "parity",    VN_PRTY,  0,           /* 190 */
  564.     "password",  VN_PWD,   CM_INV,      /* 192 */
  565. #ifdef PEXITSTAT
  566.     "pexitstat", VN_PEXIT, 0,           /* 193 */
  567. #endif /* PEXITSTAT */
  568. #ifdef CK_PID
  569.     "pid",       VN_PID,   0,           /* 193 */
  570. #endif /* CK_PID */
  571.     "platform",  VN_SYSV,  0,
  572.     "printer",   VN_PRINT, 0,           /* 193 */
  573.     "program",   VN_PROG,  0,
  574.     "prompt",    VN_PRM,   CM_INV,      /* 192 */
  575. #ifndef NOXFER
  576.     "protocol",  VN_PROTO, 0,           /* 192 */
  577.     "p_8bit",    VN_P_8BIT,0,           /* 193 */
  578.     "p_ctl",     VN_P_CTL, 0,           /* 193 */
  579.     "p_rpt",     VN_P_RPT, 0,           /* 193 */
  580.     "query",     VN_QUE,   0,           /* 190 */
  581. #endif /* NOXFER */
  582.     "return",    VN_RET,   0,
  583. #ifdef CK_REXX
  584.     "rexx",      VN_REXX,  0,           /* 190 */
  585. #endif /* CK_REXX */
  586.     "rows",      VN_ROWS,  0,           /* 190 */
  587. #ifdef OS2
  588.     "select",    VN_SELCT, 0,           /* 192 */
  589. #endif /* OS2 */
  590.     "sendlist",  VN_SNDL,  0,
  591.     "serial",    VN_SERIAL,0,           /* 195 */
  592.     "setlinemsg",VN_SLMSG, 0,           /* 195 */
  593.     "speed",     VN_SPEE,  0,
  594. #ifdef OS2
  595.     "space",     VN_SPA,   0,
  596.     "startup",   VN_STAR,  0,           /* 190 */
  597. #else
  598. #ifdef UNIX
  599.     "startup",   VN_STAR,  0,           /* 193 */
  600. #else
  601. #ifdef VMS
  602.     "startup",   VN_STAR,  0,           /* 193 */
  603. #endif /* VMS */
  604. #endif /* UNIX */
  605. #endif /* OS2 */
  606.     "status",    VN_SUCC,  0,
  607. #ifndef NOXFER
  608.     "sysid",     VN_SYSI,  0,
  609. #endif /* NOXFER */
  610.     "system",    VN_SYST,  0,
  611.     "terminal",  VN_TTYP,  0,
  612. #ifdef OS2
  613.     "termkey",   VN_TRMK,  CM_INV,      /* 192 */
  614. #endif /* OS2 */
  615.     "test",      VN_TEST,  0,           /* 193 */
  616.     "textdir",   VN_TXTDIR,0,           /* 195 */
  617. #ifndef NOXFER
  618.     "tfsize",    VN_TFC,   0,
  619.     "tftime",    VN_TFTIM, 0,           /* 195 */
  620. #endif /* NOXFER */
  621.     "time",      VN_TIME,  0,
  622.     "tmpdir",    VN_TEMP,  0,           /* 192 */
  623. #ifdef CK_TRIGGER
  624.     "trigger",   VN_TRIG,  0,           /* 193 */
  625. #endif /* CK_TRIGGER */
  626. #ifdef CK_TTYFD
  627.     "ttyfd",     VN_TTYF,  0,
  628. #endif /* CK_TTYFD */
  629.     "ty_ln",     VN_TY_LN, 0,           /* 195 */
  630.     "ty_lc",     VN_TY_LC, 0,           /* 195 */
  631.     "ty_lm",     VN_TY_LM, 0,           /* 195 */
  632. #ifdef BROWSER
  633.     "url",       VN_URL,   CM_INV,      /* 193 */
  634. #endif /* BROWSER */
  635.     "userid",    VN_UID,   0,           /* 192 */
  636.     "version",   VN_VERS,  0,
  637. #ifndef NOXFER
  638.     "window",    VN_WINDO, 0,           /* 192 */
  639. #endif /* NOXFER */
  640. #ifdef IBMX25
  641.     "x25local_nua", VN_X25LA, 0,        /* 193 */
  642.     "x25remote_nua", VN_X25RA, 0,       /* 193 */
  643. #endif /* IBMX25 */
  644. #ifdef CK_SSL
  645.     "x509_issuer",  VN_X509_I, 0,
  646.     "x509_subject", VN_X509_S, 0,
  647. #endif /* CK_SSL */
  648. #ifndef NOXFER
  649.     "xferstatus",VN_XFSTAT,0,           /* 193 */
  650.     "xfermsg",   VN_XFMSG, 0,           /* 193 */
  651.     "xfer_badpacket", VN_XF_BC, 0,      /* 195 */
  652.     "xfer_timeout",   VN_XF_TM, 0,      /* 195 */
  653.     "xfer_retransmit",VN_XF_RX, 0,      /* 195 */
  654. #endif /* NOXFER */
  655.     "xprogram",  VN_XPROG, 0,           /* 193 */
  656.     "xversion",  VN_XVNUM, 0            /* 192 */
  657. };
  658. int nvars = (sizeof(vartab) / sizeof(struct keytab));
  659. #endif /* NOSPL */
  660. #ifndef NOSPL
  661. struct keytab fnctab[] = {              /* Function names */
  662. #ifdef OS2
  663.     ".oox",       FN_OOX, CM_INV,       /* ... */
  664. #endif /* OS2 */
  665. #ifdef CKCHANNELIO
  666.     "_eof",       FN_FEOF,   0,
  667.     "_errmsg",    FN_FERMSG, 0,
  668.     "_getblock",  FN_FGBLK,  0,
  669.     "_getchar",   FN_FGCHAR, 0,
  670.     "_getline",   FN_FGLINE, 0,
  671.     "_handle",    FN_FILNO,  0,
  672.     "_line",      FN_NLINE,  0,
  673.     "_pos",       FN_FPOS,   0,
  674.     "_putblock",  FN_FPBLK,  0,
  675.     "_putchar",   FN_FPCHAR, 0,
  676.     "_putline",   FN_FPLINE, 0,
  677.     "_status",    FN_FSTAT,  0,
  678. #endif /* CKCHANNELIO */
  679.     "aaconvert",  FN_AADUMP, 0,         /* Associative Array conversion */
  680.     "absolute",   FN_ABS,  0,           /* Absolute value */
  681.     "arraylook",  FN_ALOOK,0,           /* Array lookup */
  682.     "b64decode",  FN_FMB64,0,           /* Base-64 conversion */
  683.     "b64encode",  FN_TOB64,0,           /* ... */
  684.     "basename",   FN_BSN,  0,           /* Basename */
  685.     "break",      FN_BRK,  0,           /* Break (as in Snobol) */
  686.     "ca",         FN_CAP,  CM_INV|CM_ABR, /* Abbreviation for capitablize */
  687.     "cap",        FN_CAP,  CM_INV|CM_ABR, /* Abbreviation for capitablize */
  688.     "capitalize", FN_CAP,  0,           /* First Letter -> uppercase */
  689.     "caps",       FN_CAP,  CM_INV,      /* ditto */
  690.     "character",  FN_CHR,  0,           /* Character from code */
  691.     "checksum",   FN_CHK,  0,           /* Checksum */
  692.     "code",       FN_COD,  0,           /* Code from character */
  693. #ifndef NOPUSH
  694.     "command",    FN_CMD,  0,           /* Output from a command */
  695. #endif /* NOPUSH */
  696.     "contents",   FN_CON,  0,           /* Definition (contents) of variable */
  697.     "crc16",      FN_CRC,  0,           /* CRC-16 */
  698. #ifdef OS2
  699.     "crypt",      FN_CRY, CM_INV,
  700. #endif /* OS2 */
  701.     "cvtdate",    FN_DTIM, 0,           /* Convert free date/time to std */
  702. #ifdef ZFCDAT
  703.     "date",       FN_FD,   0,           /* File modification/creation date */
  704. #endif /* ZFCDAT */
  705.     "day",        FN_DAY,  0,           /* Day of week */
  706.     "dayofyear",  FN_JDATE,0,           /* Date to Day of Year */
  707.     "definition", FN_DEF,  0,           /* Return definition of given macro */
  708. #ifndef NODIAL
  709.     "dialconvert",FN_PNCVT,0,           /* Convert portable phone number */
  710. #endif /* NODIAL */
  711.     "dimension",  FN_DIM,  0,           /* Dimension of array */
  712.     "directories",FN_DIR,  0,           /* List of directories */
  713.     "dirname",    FN_DNAM, 0,           /* Directory part of filename */
  714.     "doy",        FN_JDATE,CM_INV,      /* Date to Day of Year */
  715.     "doy2date",   FN_DATEJ,0,           /* Day of Year to date */
  716. #ifdef FN_ERRMSG
  717.     "errstring",  FN_ERRMSG,0,          /* Error code to message */
  718. #endif /* FN_ERRMSG */
  719.     "evaluate",   FN_EVA,  0,           /* Evaluate given arith expression */
  720.     "execute",    FN_EXE,  0,           /* Execute given macro */
  721.     "files",      FN_FC,   0,           /* File count */
  722. #ifdef FNFLOAT
  723.     "fpabsolute", FN_FPABS, 0,          /* Floating-point absolute value */
  724.     "fpadd",      FN_FPADD, 0,          /* FP add */
  725.     "fpcosine",   FN_FPCOS, 0,          /* FP cosine */
  726.     "fpdivide",   FN_FPDIV, 0,          /* FP divide */
  727.     "fpexp",      FN_FPEXP, 0,          /* FP e to the x */
  728.     "fpint",      FN_FPINT, 0,          /* FP to integer */
  729.     "fplog10",    FN_FPLOG, 0,          /* FP base-10 logarithm */
  730.     "fplogn",     FN_FPLN,  0,          /* FP natural logarithm */
  731.     "fpmaximum",  FN_FPMAX, 0,          /* FP maxinum */
  732.     "fpminimum",  FN_FPMIN, 0,          /* FP mininum */
  733.     "fpmodulus",  FN_FPMOD, 0,          /* FP modulus */
  734.     "fpmultiply", FN_FPMUL, 0,          /* FP multiply */
  735.     "fpraise",    FN_FPPOW, 0,          /* FP raise to a power */
  736.     "fpround",    FN_FPROU, 0,          /* FP round */
  737.     "fpsine",     FN_FPSIN, 0,          /* FP sine */
  738.     "fpsqrt",     FN_FPSQR, 0,          /* FP square root */
  739.     "fpsubtract", FN_FPSUB, 0,          /* FP subtract */
  740.     "fptangent",  FN_FPTAN, 0,          /* FP tangent */
  741. #endif /* FNFLOAT */
  742.     "hex2ip",     FN_HEX2IP,0,          /* Hex to IP address */
  743.     "hex2n",      FN_HEX2N, CM_INV,     /* Hex to decimal number */
  744.     "hexify",     FN_HEX,   0,          /* Hexify (string) */
  745.     "index",      FN_IND,   0,          /* Index (string search) */
  746.     "ip2hex",     FN_IP2HEX,0,          /* IP address to hex */
  747.     "ipaddress",  FN_IPA,   0,          /* Find and return IP address */
  748.     "jdate",      FN_JDATE, CM_INV,     /* Date to Day of Year */
  749. #ifdef CK_KERBEROS
  750.     "krbflags",      FN_KRB_FG, 0,      /* Kerberos functions */
  751.     "krbisvalid",    FN_KRB_IV, 0,
  752.     "krbnextticket", FN_KRB_NX, 0,
  753.     "krbtickets",    FN_KRB_TK, 0,
  754.     "krbtimeleft",   FN_KRB_TT, 0,
  755. #endif /* CK_KERBEROS */
  756.     "left",       FN_LEF,  0,           /* Leftmost n characters of string */
  757.     "length",     FN_LEN,  0,           /* Return length of argument */
  758.     "literal",    FN_LIT,  0,           /* Return argument literally */
  759.     "lop",        FN_STL,  0,           /* Lop */
  760.     "lower",      FN_LOW,  0,           /* Return lowercased argument */
  761.     "lpad",       FN_LPA,  0,           /* Return left-padded argument */
  762.     "ltrim",      FN_LTR,  0,           /* Left-Trim */
  763.     "maximum",    FN_MAX,  0,           /* Return maximum of two arguments */
  764.     "minimim",    FN_MIN,  0,           /* Return minimum of two arguments */
  765.     "mjd",        FN_MJD,  0,           /* Date to Modified Julian Date */
  766.     "mjd2date",   FN_MJD2, 0,           /* MJD to Date */
  767.     "modulus",    FN_MOD,  CM_INV,      /* Return modulus of two arguments */
  768.     "n2hex",      FN_2HEX, CM_INV,      /* Number to hex */
  769.     "n2octal",    FN_2OCT, CM_INV,      /* Number to octal */
  770.     "n2time",     FN_N2TIM,0,           /* Number to hh:mm:ss */
  771.     "nday",       FN_NDAY, 0,           /* Numeric day of week */
  772.     "nextfile",   FN_FIL,  0,           /* Next file in list */
  773.     "ntime",      FN_NTIM, 0,           /* Time to seconds since midnight */
  774.     "oct2n",      FN_OCT2N,CM_INV,      /* Octal to decimal number */
  775.     "pathname",   FN_FFN,  0,           /* Full file name */
  776.     "pattern",    FN_PATTERN, 0,        /* Pattern (for INPUT) */
  777. #ifdef CK_PERMS
  778.     "permissions",FN_PERM, 0,           /* Permissions of file */
  779. #else
  780.     "permissions",FN_PERM, CM_INV,      /* Permissions of file */
  781. #endif /* CK_PERMS */
  782.     "radix",      FN_RADIX,0,           /* Radix conversion */
  783. #ifndef NORANDOM
  784.     "random",     FN_RAND, 0,           /* Random number */
  785. #endif /* NORANDOM */
  786. #ifndef NOPUSH
  787.     "rawcommand", FN_RAW,  0,           /* Output from a command (raw) */
  788. #endif /* NOPUSH */
  789. #ifdef RECURSIVE
  790.     "rdirectories", FN_RDIR, 0,         /* Recursive directory list */
  791.     "rfiles",       FN_RFIL, 0,         /* Recursive file list */
  792. #endif /* RECURSIVE */
  793.     "rep",        FN_REP, CM_INV|CM_ABR,
  794.     "repeat",     FN_REP,  0,           /* Repeat argument given # of times */
  795.     "replace",    FN_RPL,  0,           /* Replace characters in string */
  796.     "reverse",    FN_REV,  0,           /* Reverse the argument string */
  797.     "right",      FN_RIG,  0,           /* Rightmost n characters of string */
  798.     "rindex",     FN_RIX,  0,           /* Right index */
  799.     "rpad",       FN_RPA,  0,           /* Right-pad the argument */
  800.     "rsearch",    FN_RSEARCH, 0,        /* R-L Search for pattern in string */
  801. #ifdef OS2
  802.     "scrncurx",   FN_SCRN_CX,  0,       /* Screen Cursor X Pos */
  803.     "scrncury",   FN_SCRN_CY,  0,       /* Screen Cursor Y Pos */
  804.     "scrnstr",    FN_SCRN_STR, 0,       /* Screen String */
  805. #endif /* OS2 */
  806.     "search",     FN_SEARCH, 0,         /* L-R Search for pattern in string */
  807.     "size",       FN_FS,   0,           /* File size */
  808.     "span",       FN_SPN,  0,           /* Span - like Snobol */
  809.     "split",      FN_SPLIT,0,           /* Split string into words */
  810.     "stripb",     FN_STB,  0,           /* Strip enclosing braces/brackets */
  811.     "stripn",     FN_STN,  0,           /* Strip n chars */
  812.     "stripx",     FN_STX,  0,           /* Strip "extension" */
  813.     "substring",  FN_SUB,  0,           /* Extract substring from argument */
  814.     "tablelook",  FN_TLOOK,0,           /* Table lookup */
  815.     "time",       FN_TIME, 0,           /* Free-format time to hh:mm:ss */
  816.     "tod2secs",   FN_NTIM, CM_INV,      /* Time-of-day-to-secs-since-midnite */
  817.     "trim",       FN_TRM,  0,           /* Trim */
  818.     "unhexify",   FN_UNH,  0,           /* Unhexify */
  819.     "upper",      FN_UPP,  0,           /* Return uppercased argument */
  820.     "verify",     FN_VER,  0,           /* Verify */
  821.     "word",       FN_WORD, 0,           /* Extract a word */
  822.     "", 0, 0
  823. };
  824. int nfuncs = (sizeof(fnctab) / sizeof(struct keytab)) - 1;
  825. #endif /* NOSPL */
  826. #ifndef NOSPL                           /* Buffer for expansion of */
  827. #ifdef BIGBUFOK                         /* built-in variables. */
  828. #define VVBUFL 1024
  829. #else
  830. #define VVBUFL 256
  831. #endif /* BIGBUFOK */
  832. char vvbuf[VVBUFL+1];
  833. #endif /* NOSPL */
  834. struct keytab disptb[] = {              /* Log file disposition */
  835.     "append",    1,  0,
  836.     "new",       0,  0
  837. };
  838. #ifdef FNFLOAT
  839. /* I N I T F L O A T  --  Deduce floating-point precision by inspection */
  840. int fp_rounding = 0;                /* Nonzero if printf("%f") rounds */
  841. int fp_digits = 0;                  /* Digits of floating point precision */
  842. #ifdef COMMENT
  843. /* For looking at internal floating-point representations */
  844. static char fp_xbuf[128];
  845. static char *
  846. tohex(s, n) CHAR * s; int n; {
  847.     int x;
  848.     char * p = fp_xbuf;
  849.     while (n-- > 0) {
  850.         x = (*s >> 4) & 0x0f;
  851.         *p++ = hexdigits[x];
  852.         x = *s++ & 0x0f;
  853.         *p++ = hexdigits[x];
  854.     }
  855.     *p = NUL;
  856.     return((char *)fp_xbuf);
  857. }
  858. #endif /* COMMENT */
  859. VOID
  860. initfloat() {
  861.     char buf[256];
  862.     int i, x, y;
  863. #ifdef COMMENT
  864.     /* For looking at internal floating-point representations */
  865.     double a[] = { 0.0, 0.5, 0.05, 0.005, 0.0005, 0.00005, 0.5e-20,
  866.                      1.0, -1.0, 2.0, -2.0, 3.0, -3.0, 4.0, -4.0 };
  867.     int n = sizeof(a) / sizeof(double);
  868.     union blah {
  869.         CHAR xbuf[32];
  870.         double f;
  871.     } u;
  872. #endif /* COMMENT */
  873.     sprintf(buf,"%0.250f",(10.0 / 3.0));
  874.     for (i = 2; i < 250 && buf[i] == '3'; i++) ;
  875.     x = i - 1;
  876.     debug(F111,"initfloat 10.0/3.0",buf,x);
  877.     sprintf(buf,"%0.250f",(4.0 / 9.0));
  878.     for (i = 2; i < 250 && buf[i] == '4'; i++) ;
  879.     y = i - 1;
  880.     debug(F111,"initfloat 4.0/9.0",buf,y);
  881.     fp_digits = (x < y) ? x : y;
  882.     sprintf(buf,"%0.6f",(7.0 / 9.0));
  883.     if (buf[7] == '8') fp_rounding = 1;
  884.     debug(F111,"initfloat 7.0/9.0",buf,fp_rounding);
  885.     debug(F101,"initfloat precision","",fp_digits);
  886. #ifdef COMMENT
  887.     for (i = 0; i < n; i++) {
  888.         memset(u.xbuf,0,32);
  889.         u.f = a[i];
  890.         sprintf(buf,"initfloat %f", u.f);
  891.         debug(F110,buf,tohex(u.xbuf,8),0);
  892.     }
  893. #endif /* COMMENT */
  894. }
  895. #endif /* FNFLOAT */
  896. /*
  897.   P R E S C A N -- A quick look through the command-line options for
  898.   items that must be handled before the initialization file is executed.
  899. */
  900. #ifdef NT
  901. extern int StartedFromDialer;
  902. #endif /* NT */
  903. #ifdef OS2
  904. extern int k95stdio;
  905. unsigned long startflags = 0L;
  906. #endif /* OS2 */
  907. static char *
  908. findinpath(arg) char * arg; {
  909. #ifdef OS2
  910.     extern char startupdir[], exedir[], inidir[];
  911.     char * scriptenv, * keymapenv;
  912.     int len;
  913. #endif /* OS2 */
  914. #ifdef DCMDBUF
  915.     extern char * cmdbuf;
  916. #else
  917.     extern char cmdbuf[];
  918. #endif /* DCMDBUF */
  919.     char takepath[4096];
  920.     char * s;
  921.     int x, z;
  922.     /* Set up search path... */
  923. #ifdef OS2
  924. #ifdef NT
  925.     scriptenv = getenv("K95SCRIPTS");
  926.     keymapenv = getenv("K95KEYMAPS");
  927. #else /* NT */
  928.     scriptenv = getenv("K2SCRIPTS");
  929.     keymapenv = getenv("K2KEYMAPS");
  930. #endif /* NT */
  931.     if (!scriptenv)
  932.       scriptenv = getenv("CK_SCRIPTS");
  933.     if (!scriptenv)
  934.       scriptenv = "";
  935.     if (!keymapenv)
  936.       keymapenv = getenv("CK_KEYMAPS");
  937.     if (!keymapenv)
  938.       keymapenv = "";
  939.     debug(F110,"startupdir",startupdir,0);
  940.     debug(F110,"inidir",inidir,0);
  941.     debug(F110,"exedir",exedir,0);
  942.     len = strlen(scriptenv) + strlen(keymapenv) + 3*strlen(startupdir)
  943.         + 3*strlen(inidir) + 3*strlen(zhome()) + 3*strlen(exedir)
  944.         + 4*strlen("SCRIPTS/") + 4*strlen("KEYMAPS/") + 16;
  945.     if (len >= 4096) {
  946.         takepath[0] = '';
  947.         debug(F111,"findinpath error - path length too long","len",len);
  948.     } else
  949.       sprintf(takepath,
  950.       /* semicolon-separated path list */
  951.       "%s%s%s%s%s;%s%s;%s%s;%s;%s%s;%s%s;%s;%s%s;%s%s",
  952.       scriptenv,
  953.       (scriptenv[0] && scriptenv[strlen(scriptenv)-1]==';')?"":";",
  954.       keymapenv,
  955.       (keymapenv[0] && keymapenv[strlen(keymapenv)-1]==';')?"":";",
  956.       startupdir,
  957.       startupdir, "SCRIPTS/",
  958.       startupdir, "KEYMAPS/",
  959.       inidir,
  960.       inidir, "SCRIPTS/",
  961.       inidir, "KEYMAPS/",
  962.       zhome(),
  963.       zhome(), "SCRIPTS/",
  964.       zhome(), "KEYMAPS/",
  965.       exedir,
  966.       exedir, "SCRIPTS/",
  967.       exedir, "KEYMAPS/"
  968.       );
  969. #else /* not OS2 */
  970. #ifndef NOSPL
  971.     z = 1024;                           /* Look in home directory */
  972.     s = takepath;
  973.     zzstring("\v(home)",&s,&z);
  974. #else
  975.     takepath[0] = '';
  976. #endif /* NOSPL */
  977. #endif /* OS2 */
  978. /*
  979.   All the logic for searching the take path is in the command parser.
  980.   So even though we aren't parsing commands, we initialize and call the
  981.   parser from here, with the purported filename stuffed into the command
  982.   buffer, followed by some carriage returns to make the parser return.
  983.   If the file is not found, or otherwise not accessible, the parser prints
  984.   an appropriate message, and then we just exit.
  985. */
  986.     cmdini();                           /* Allocate command buffers etc */
  987.     cmini(0);                           /* Initialize them */
  988.     /* Stuff filename into command buf with braces in case of spaces */
  989.     sprintf(cmdbuf,"{%s}",arg);
  990.     debug(F110,"prescan cmdbuf",cmdbuf,0);
  991.     strcat(cmdbuf,"rr");              /* And some carriage returns */
  992.     if (cmifip("","",&s,&x,0,takepath,xxstring) < 0)
  993.       return(NULL);
  994.     cmres();
  995.     return(s);
  996. }
  997. static int tr_int;                      /* Flag if TRANSMIT interrupted */
  998. #ifndef MAC
  999. SIGTYP
  1000. #ifdef CK_ANSIC
  1001. trtrap(int foo)                         /* TRANSMIT interrupt trap */
  1002. #else
  1003. trtrap(foo) int foo;                    /* TRANSMIT interrupt trap */
  1004. #endif /* CK_ANSIC */
  1005. /* trtrap */ {
  1006. #ifdef __EMX__
  1007.     signal(SIGINT, SIG_ACK);
  1008. #endif
  1009.     tr_int = 1;                         /* (Need arg for ANSI C) */
  1010.     SIGRETURN;
  1011. }
  1012. #endif /* MAC */
  1013. #endif /* NOICP */
  1014. int arg_x = 0;
  1015. static int x_prescan = 0;
  1016. /*
  1017.   The argument y once meant something but I can't imagine what so now
  1018.   it's ignored.  (Prior to 22 Aug 98, prescan() was called twice by main(),
  1019.   and the arg differentiated the two calls.  But this caused all sorts of
  1020.   problems & confusion, so I commented out the second call.  This issue might
  1021.   need to be revisited.)
  1022. */
  1023. VOID
  1024. prescan(dummy) int dummy; {             /* Arg is ignored. */
  1025.     extern int howcalled;
  1026.     int yargc; char **yargv;
  1027.     char x;
  1028.     char *yp;
  1029.     int z;
  1030.     if (x_prescan)                      /* Only run once */
  1031.       return;
  1032.     x_prescan = 1;
  1033.     yargc = xargc;                      /* Make copy of arg vector */
  1034.     yargv = xargv;
  1035. #ifndef NOICP
  1036. #ifdef DCMDBUF
  1037.     if (!kermrc)
  1038.       if (!(kermrc = (char *) malloc(KERMRCL+1)))
  1039.         fatal("prescan: no memory for kermrc");
  1040. #endif /* DCMDBUF */
  1041.     ckstrncpy(kermrc,KERMRC,KERMRCL);   /* Default init file name */
  1042. #endif /* NOICP */
  1043. #ifdef IKSD
  1044.     if (howcalled == I_AM_IKSD)         /* Internet Kermit Service daemon */
  1045.       inserver = 1;                     /* (See inserver section of ckcmai) */
  1046.     else
  1047. #endif /* IKSD */
  1048.       if (howcalled != I_AM_KERMIT)     /* I'm called "telnet" or... */
  1049.         return;
  1050. /* Command line options for Kermit */
  1051. #ifndef NOCMDL
  1052. #ifndef NOICP
  1053.     if (yargc > 1
  1054.         && *yargv[1] != '-'
  1055.         && strcmp(yargv[1],"=")
  1056. #ifdef KERBANG
  1057.         && strcmp(yargv[1],"+")
  1058. #endif /* KERBANG */
  1059.         ) { /* Filename as 1st argument */
  1060.         char *s;
  1061.         int x, y;
  1062.         x = isabsolute(yargv[1]);
  1063.         if (!x)                         /* If not absolute */
  1064.           s = findinpath(yargv[1]);
  1065.         else
  1066.           s = yargv[1];
  1067.         if (!s)
  1068.           doexit(BAD_EXIT,xitsta);
  1069.         zfnqfp(s,CKMAXPATH,cmdfil);     /* In case of CD in file */
  1070.         yargc -= 1;                     /* Skip past the filename */
  1071.         yargv += 1;                     /* Otherwise we'll get an error */
  1072.     }
  1073. #endif /* NOICP */
  1074.     while (--yargc > 0) {               /* Go through command-line args */
  1075.         yargv++;
  1076.         yp = *yargv+1;                  /* Pointer for bundled args */
  1077.         if (**yargv == '=')             /* Same rules as cmdlin()... */
  1078.           return;
  1079.         debug(F110,"prescan *yargv",*yargv,0);
  1080. #ifndef NOICP
  1081. #ifdef KERBANG
  1082.         if (!strcmp(*yargv,"+")) {
  1083.             char * s;
  1084.             yargv++;
  1085.             noinit = 1;
  1086.             if (!*yargv)
  1087.               return;
  1088.             cfilef = 1;
  1089.             s = findinpath(*yargv);
  1090.             if (s) {
  1091.                 zfnqfp(s,CKMAXPATH,cmdfil);
  1092.                 return;
  1093.             } else
  1094.               doexit(BAD_EXIT,xitsta);
  1095.         }
  1096. #endif /* KERBANG */
  1097. #endif /* NOICP */
  1098.         if (!strcmp(*yargv,"--"))       /* getopt() conformance */
  1099.           return;
  1100. #ifdef VMS
  1101.         else if (**yargv == '/')
  1102.           continue;
  1103. #endif /* VMS */
  1104.         else if (**yargv == '-') {      /* Got an option (begins with dash) */
  1105.             x = *(*yargv+1);            /* Get option letter */
  1106.             while (x) {                 /* Allow for bundled options */
  1107.                 debug(F000,"prescan arg","",x);
  1108.                 switch (x) {
  1109. #ifndef NOICP
  1110.                   case '+':
  1111.                   case '-':
  1112.                     if (doxarg(yargv,1) < 0) {
  1113.                         fatal("Extended argument error");
  1114.                     }
  1115.                     yargv++, yargc--;
  1116.                     yp = *yargv;
  1117.                     break;
  1118. #endif /* NOICP */
  1119.                   case '7':             /* Undocumented... */
  1120.                     sstelnet = 1;       /* (because it doesn't work) */
  1121.                     break;
  1122. #ifdef IKSD
  1123.                   case 'A': {
  1124.                       char * p;
  1125.                       inserver = 1;     /* Flag that we are doing this */
  1126.                       srvcdmsg = 2;     /* Preset this */
  1127.                       /* See inserver section of ckcmai.c for more settings */
  1128. #ifdef NT
  1129.                       if (*(yp+1)) {
  1130.                           fatal("invalid argument bundling after -A");
  1131.                       }
  1132.                       /* Support for Pragma Systems Telnet/Terminal Servers */
  1133.                       p = getenv("PRAGMASYS_INETD_SOCK");
  1134.                       if (p && atoi(p) != 0) {
  1135.                           ttname[0] = '$';
  1136.                           ckstrncpy(&ttname[1],p,TTNAMLEN-1);
  1137.                           break;
  1138.                       }
  1139.                       yargv++, yargc--;
  1140.                       if (yargc < 1 || **yargv == '-') {
  1141.                           fatal("-A argument missing");
  1142.                       } else {
  1143.                           ttname[0] = '$';
  1144.                           ckstrncpy(&ttname[1],*yargv,TTNAMLEN-1);
  1145.                       }
  1146. #endif /* NT */
  1147.                       break;
  1148.                   }
  1149. #endif /* IKSD */
  1150. #ifdef OS2
  1151.                   case 'W':
  1152.                     if (*(yp+1))
  1153.                       fatal("invalid argument bundling after -W");
  1154.                     yargv++, yargc--;
  1155.                     if (yargc < 1)
  1156.                       fatal("Window handle missing");
  1157. #ifdef COMMENT
  1158.                     if (dummy) {
  1159.                         yargv++, yargc--;
  1160.                         break;
  1161.                     } else {
  1162. #endif /* COMMENT */
  1163.                         hwndDialer = (HWND) atol(*yargv);
  1164.                         StartedFromDialer = 1;
  1165.                         yargv++, yargc--;
  1166.                         KermitDialerID = atol(*yargv) ;
  1167. #ifdef COMMENT
  1168.                     }
  1169. #endif /* COMMENT */
  1170.                     break;
  1171.                   case '#':             /* K95 initialization options */
  1172.                     if (*(yp+1)) {
  1173.                         fatal("invalid argument bundling");
  1174.                     }
  1175.                     yargv++, yargc--;
  1176.                     if (yargc < 1)
  1177.                       fatal("-# argument missing");
  1178.                     startflags |= atol(*yargv);
  1179.                     break;
  1180. #endif /* OS2 */
  1181. #ifndef NOSPL
  1182.                   case 'M':                             /* My User Name */
  1183.                     if (*(yp+1)) {
  1184.                         fatal("invalid argument bundling");
  1185.                     }
  1186.                     yargv++, yargc--;
  1187.                     if ((yargc < 1) || (**yargv == '-')) {
  1188.                         fatal("missing username");
  1189.                     }
  1190.                     if ((int)strlen(*yargv) > UIDBUFLEN) {
  1191.                         fatal("username too long");
  1192.                     }
  1193. #ifdef IKSD
  1194.                     if (!inserver)
  1195. #endif /* IKSD */
  1196.                       ckstrncpy(uidbuf,*yargv,UIDBUFLEN);
  1197.                     break;
  1198. #endif /* NOSPL */
  1199.                   case 'R':             /* Remote-only advisory */
  1200. #ifdef CK_IFRO
  1201.                     remonly = 1;
  1202. #endif /* CK_IFRO */
  1203.                     break;
  1204.                   case 'S':             /* STAY */
  1205.                     stayflg = 1;
  1206.                     break;
  1207.                   case 'h':
  1208.                     noinit = 1;
  1209. #ifdef OS2
  1210.                     startflags |= 2;    /* No network DLLs */
  1211.                     startflags |= 4;    /* No TAPI DLLs */
  1212.                     startflags |= 8;    /* No Security DLLs */
  1213.                     startflags |= 16;   /* No Zmodem DLLs */
  1214. #endif /* OS2 */
  1215.                     break;
  1216. #ifndef NOICP
  1217.                   case 'Y':             /* No init file */
  1218.                     noinit = 1;
  1219.                     break;
  1220. #endif /* NOICP */
  1221.                   case 'd':             /* = SET DEBUG ON */
  1222. #ifdef DEBUG
  1223.                     if (!deblog) {
  1224.                         extern int debtim;
  1225.                         deblog = debopn("debug.log",0);
  1226.                         /* debtim = 1; */
  1227.                     }
  1228. #endif /* DEBUG */
  1229.                     break;
  1230.                   case 'x':             /* Server */
  1231.                     arg_x = 1;          /* Note in advance */
  1232.                     break;
  1233. #ifndef NOICP
  1234.                   case 'y':             /* Alternative init file */
  1235.                     yargv++, yargc--;
  1236.                     if (yargc < 1) fatal("missing name in -y");
  1237.     /* Replace init file name */
  1238.                     ckstrncpy(kermrc,*yargv,KERMRCL);
  1239.                     rcflag = 1;         /* Flag that this has been done */
  1240.                     debug(F111,"prescan kermrc",kermrc,rcflag);
  1241.                     break;
  1242. #endif /* NOICP */
  1243.                   case 'z':             /* = SET BACKGROUND OFF */
  1244.                     bgset = 0;
  1245.                     break;
  1246. #ifdef CK_NETBIOS
  1247.                   case 'N':
  1248.                     {
  1249.                         int n ;
  1250.                         yargv++, yargc--;
  1251. #ifdef COMMENT
  1252.                         if (y)
  1253.                           break;
  1254. #endif /* COMMENT */
  1255.                         if (strlen(*yargv) != 1 || (*yargv)[0] == 'X') {
  1256.                             NetBiosAdapter = -1;
  1257.                         } else {
  1258.                             n = atoi(*yargv);
  1259.                             if (n >= 0 && n <= 9)
  1260.                               NetBiosAdapter = n;
  1261.                             else
  1262.                               NetBiosAdapter = -1;
  1263.                         }
  1264.                     }
  1265.                     break;
  1266. #endif /* CK_NETBIOS */
  1267.                   default:
  1268.                     break;
  1269.                 }
  1270.                 if (!yp)
  1271.                   break;
  1272.                 x = *++yp;              /* See if options are bundled */
  1273.             }
  1274.         }
  1275.     }
  1276. #endif /* NOCMDL */
  1277. }
  1278. /*  G E T T C S  --  Get Transfer (Intermediate) Character Set  */
  1279. /*
  1280.   Given two file character sets, this routine picks out the appropriate
  1281.   "transfer" character set to use for translating between them.
  1282.   The transfer character set number is returned.
  1283.   Translation between two file character sets is done, for example,
  1284.   by the CONNECT, TRANSMIT, and TRANSLATE commands.
  1285.   Translation between Kanji character sets is not yet supported.
  1286. */
  1287. int
  1288. gettcs(cs1,cs2) int cs1, cs2; {
  1289. #ifdef NOCSETS                          /* No character-set support */
  1290.     return(0);                          /* so no translation */
  1291. #else
  1292.     int tcs = TC_TRANSP;
  1293. #ifdef KANJI
  1294. /* Kanji not supported yet */
  1295.     if (fcsinfo[cs1].alphabet == AL_JAPAN ||
  1296.         fcsinfo[cs2].alphabet == AL_JAPAN )
  1297.       tcs = TC_TRANSP;
  1298.     else
  1299. #endif /* KANJI */
  1300. #ifdef CYRILLIC
  1301. /*
  1302.   I can't remember why we don't test both sets here, but I think there
  1303.   must have been a reason...
  1304. */
  1305.       if (fcsinfo[cs2].alphabet == AL_CYRIL)
  1306.         tcs = TC_CYRILL;
  1307.       else
  1308. #endif /* CYRILLIC */
  1309. #ifdef HEBREW
  1310.           if (fcsinfo[cs1].alphabet == AL_HEBREW ||
  1311.               fcsinfo[cs2].alphabet == AL_HEBREW )
  1312.             tcs = TC_HEBREW;
  1313.           else
  1314. #endif /* HEBREW */
  1315. #ifdef GREEK
  1316.           if (fcsinfo[cs1].alphabet == AL_GREEK ||
  1317.               fcsinfo[cs2].alphabet == AL_GREEK )
  1318.             tcs = TC_GREEK;
  1319.           else
  1320. #endif /* GREEK */
  1321.             /* Roman sets ... */
  1322. #ifdef LATIN2                           /* East European */
  1323.         if (cs1 == FC_2LATIN  || cs2 == FC_2LATIN || /* Latin-2 */
  1324.             cs1 == FC_CP852   || cs2 == FC_CP852  || /* CP852 */
  1325.             cs1 == FC_CP1250  || cs2 == FC_CP1250 || /* Windows Latin-2 */
  1326.             cs1 == FC_MAZOVIA || cs2 == FC_MAZOVIA)  /* Polish Mazovia */
  1327.           tcs = TC_2LATIN;
  1328.         else
  1329. #endif /* LATIN2 */
  1330.                                         /* West European Euro-aware */
  1331.           if (cs1 == FC_CP858 || cs1 == FC_9LATIN ||
  1332.               cs2 == FC_CP858 || cs2 == FC_9LATIN)
  1333.             tcs = TC_9LATIN;
  1334.           else                          /* Traditional West European */
  1335.             tcs = TC_1LATIN;
  1336.     return(tcs);
  1337. #endif /* NOCSETS */
  1338. }
  1339. #ifndef NOLOCAL
  1340. /*  D O C O N E C T  --  Do the connect command  */
  1341. /*
  1342.   q = 0 means issue normal informational message about how to get back, etc.
  1343.   q != 0 means to skip the message.
  1344. */
  1345. int
  1346. doconect(q) int q; {
  1347.     int x, z;                           /* Return code */
  1348.     extern int what;
  1349. #ifdef CK_AUTODL
  1350.     extern CHAR ksbuf[];
  1351. #endif /* CK_AUTODL */
  1352. #ifndef NOKVERBS                        /* Keyboard macro material */
  1353.     extern int keymac, keymacx;
  1354. #endif /* NOKVERBS */
  1355.     extern int justone;
  1356.     int qsave;                          /* For remembering "quiet" value */
  1357. #ifdef OS2
  1358.     extern int term_io;
  1359.     extern int display_demo;
  1360.     int term_io_save;
  1361. #endif /* OS2 */
  1362.     int is_tn = 0;
  1363. #ifdef IKSD
  1364.     if (inserver) {
  1365.         if (!quiet)
  1366.           printf("?Sorry, IKSD cannot CONNECT.rn");
  1367.         return(success = 0);
  1368.     }
  1369. #endif /* IKSD */
  1370.     is_tn =
  1371. #ifdef TNCODE
  1372.       (local && network && ttnproto == NP_TELNET) || (!local && sstelnet)
  1373. #else
  1374.         0
  1375. #endif /* TNCODE */
  1376.           ;
  1377. /*
  1378.   Saving, changing, and restoring the global "quiet" variable around calls
  1379.   to conect() to control whether the verbose CONNECT message is printed is
  1380.   obviously less elegant than passing a parameter to conect(), but we do it
  1381.   this way to avoid the need to change all of the ck?con.c modules.  NOTE:
  1382.   it is important to restore the value immediately upon return in case there
  1383.   is an autodownload or APC.
  1384. */
  1385.     qsave = quiet;                      /* Save it */
  1386.     if (!quiet && q > -1)
  1387.       quiet = q;                        /* Use argument temporarily */
  1388.     conres();                           /* Put console back to normal */
  1389.     debug(F101,"doconect justone 1","",justone);
  1390. #ifdef CK_AUTODL
  1391.     ksbuf[0] = NUL;                     /* Autodownload packet buffer */
  1392. #endif /* CK_AUTODL */
  1393. #ifdef OS2
  1394.     display_demo = 1;                   /* Remember to display demo */
  1395. #endif /* OS2 */
  1396. #ifdef IKS_OPTION
  1397.     if (is_tn && TELOPT_U(TELOPT_KERMIT) && ttchk() >= 0
  1398. #ifdef OS2
  1399.        && !viewonly
  1400. #endif /* OS2 */
  1401.         ) {
  1402.         /* If the remote side is in a state of IKS START-SERVER    */
  1403.         /* we request that the state be changed.  We will detect   */
  1404.         /* a failure to adhere to the request when we call ttinc() */
  1405.         if (!iks_wait(KERMIT_REQ_STOP,0) && !tcp_incoming) {
  1406.             if (!quiet) {
  1407.                 printf("rnEnter Client/Server Mode...  Use:rnrn");
  1408.                 printf(
  1409. " REMOTE LOGIN <user> <password> to log in to the server if necessary.rn");
  1410.                 printf(" SEND and GET for file transfer.rn");
  1411.                 printf(" REMOTE commands for file management.rn");
  1412.                 printf(" FINISH to terminate Client/Server mode.rn");
  1413.                 printf(" BYE to terminate and close connection.rn");
  1414.                 printf(" REMOTE HELP for additional information.rnrn");
  1415.             }
  1416.             quiet = qsave;
  1417.             return(0);      /* Failure */
  1418.         }
  1419.     }
  1420.     /* Let our peer know our state. */
  1421. #ifdef CK_AUTODL
  1422.     if (is_tn && TELOPT_ME(TELOPT_KERMIT)
  1423. #ifdef OS2
  1424.         && !viewonly
  1425. #endif /* OS2 */
  1426.          ) {
  1427.         if (autodl && !TELOPT_SB(TELOPT_KERMIT).kermit.me_start) {
  1428.             tn_siks(KERMIT_START);      /* Send Kermit-Server Start */
  1429.         } else if (!autodl && TELOPT_SB(TELOPT_KERMIT).kermit.me_start) {
  1430.             tn_siks(KERMIT_STOP);
  1431.         }
  1432.     }
  1433. #else /* CK_AUTODL */
  1434.     if (TELOPT_SB(TELOPT_KERMIT).kermit.me_start) {
  1435.         tn_siks(KERMIT_STOP);
  1436.     }
  1437. #endif /* CK_AUTODL */
  1438. #endif /* IKS_OPTION */
  1439.     debug(F101,"doconect flow","",flow);
  1440.     x = conect();                       /* Connect the first time */
  1441. #ifdef IKS_OPTION
  1442.     if (TELOPT_U(TELOPT_KERMIT) &&
  1443.         TELOPT_SB(TELOPT_KERMIT).kermit.u_start &&
  1444.         !tcp_incoming && !quiet && ttchk() >= 0
  1445.         ) {
  1446.         printf("rnEnter Client/Server Mode...  Use:rnrn");
  1447.         printf(
  1448. " REMOTE LOGIN <user> <password> to log in to the server if necessary.rn");
  1449.         printf(" SEND and GET for file transfer.rn");
  1450.         printf(" REMOTE commands for file management.rn");
  1451.         printf(" FINISH to terminate Client/Server mode.rn");
  1452.         printf(" BYE to terminate and close connection.rn");
  1453.         printf(" REMOTE HELP for additional information.rnrn");
  1454.     }
  1455. #endif /* IKS_OPTION */
  1456.     quiet = qsave;                      /* Restore "quiet" value */
  1457.     debug(F101,"doconect justone 2","",justone);
  1458. #ifdef NETCONN
  1459.     if (network && tn_exit && ttchk() < 0)
  1460.       doexit(GOOD_EXIT,xitsta);         /* Exit with good status */
  1461. #endif /* NETCONN */
  1462. #ifdef OS2ORUNIX
  1463.     /* Exit on disconnect if the port is not open or carrier detect */
  1464.     if (exitonclose && (ttchk() < 0))
  1465.       doexit(GOOD_EXIT,xitsta);
  1466. #endif /* OS2ORUNIX */
  1467. #ifdef CKCONINTB4CB
  1468.     /* The order makes a difference in HP-UX 8.00. */
  1469.     /* The other order makes it think it's in the background when it */
  1470.     /* returns from CONNECT (Apr 1999). */
  1471.     setint();
  1472.     concb((char)escape);                /* Restore console for commands */
  1473. #else
  1474.     /* This is how it has always been so better leave it */
  1475.     /* this way for all non-HP-UX-8.00 builds. */
  1476.     concb((char)escape);                /* Restore console for commands */
  1477.     setint();
  1478. #endif /* CKCONINTB4CB */
  1479. #ifdef OS2
  1480.     term_io_save = term_io;             /* Disable I/O by emulator */
  1481.     term_io = 0;
  1482. #endif /* OS2 */
  1483. #ifdef CK_APC
  1484. /*
  1485.   If an APC command was received during CONNECT mode, we define it now
  1486.   as a macro, execute the macro, and then return to CONNECT mode.
  1487.   We do this in a WHILE loop in case additional APCs come during subsequent
  1488.   CONNECT sessions.
  1489. */
  1490.     debug(F101,"doconect apcactive","",apcactive);
  1491.     debug(F101,"doconect success","",success);
  1492.     while (x > 0 && (apcactive == APC_LOCAL ||
  1493.            (apcactive == APC_REMOTE && apcstatus != APC_OFF))) {
  1494.         debug(F101,"doconect justone 3","",justone);
  1495.         if (mlook(mactab,"_apc_commands",nmac) == -1) {
  1496.             debug(F110,"doconect about to execute APC",apcbuf,0);
  1497.             domac("_apc_commands",apcbuf,cmdstk[cmdlvl].ccflgs|CF_APC);
  1498.             delmac("_apc_commands");
  1499. #ifdef DEBUG
  1500.         } else {
  1501.             debug(F100,"doconect APC in progress","",0);
  1502. #endif /* DEBUG */
  1503.         }
  1504.         debug(F101,"doconect apcactive after domac","",apcactive);
  1505.         if (!apcactive) {               /* In case CLEAR APC was in APC */
  1506.             debug(F101,"doconect quit APC loop: apcactive","",apcactive);
  1507.             break;
  1508.         }
  1509.         /* Also don't reconnect if autodownload failed - very confusing! */
  1510.         /* Let them view the local screen to see what happened. */
  1511. #ifndef NOXFER
  1512.         debug(F101,"doconect xferstat","",xferstat);
  1513.         if (apcactive == APC_LOCAL & !xferstat) {
  1514.             debug(F101,"doconect quit APC loop: xferstat","",xferstat);
  1515.             apcactive = APC_INACTIVE;
  1516.             break;
  1517.         }
  1518. #endif /* NOXFER */
  1519. #ifdef OS2
  1520.         msleep(250);
  1521. #endif /* OS2 */
  1522.         debug(F101,"doconect justone 4","",justone);
  1523.         qsave = quiet;                  /* Do this again... */
  1524.         if (!quiet && q > -1)
  1525.           quiet = q;
  1526. #ifdef CK_AUTODL
  1527.         ksbuf[0] = NUL;
  1528. #endif /* CK_AUTODL */
  1529. #ifdef IKS_OPTION
  1530. #ifdef CK_AUTODL
  1531.         if (is_tn &&
  1532.             TELOPT_ME(TELOPT_KERMIT) &&
  1533.             !TELOPT_SB(TELOPT_KERMIT).kermit.me_start &&
  1534.             autodl
  1535. #ifdef CK_APC
  1536.             && !apcactive
  1537. #endif /* CK_APC */
  1538. #ifdef OS2
  1539.             && !viewonly
  1540. #endif /* OS2 */
  1541.             ) {
  1542.             tn_siks(KERMIT_START);      /* Send Kermit-Server Start */
  1543.         }
  1544. #endif /* CK_AUTODL */
  1545. #endif /* IKS_OPTION */
  1546.         x = conect();                   /* Re-CONNECT. */
  1547. #ifdef COMMENT
  1548. #ifdef IKS_OPTION
  1549. #ifdef CK_AUTODL
  1550.         if (is_tn && TELOPT_ME(TELOPT_KERMIT) && autodl
  1551. #ifdef CK_APC
  1552.             && !apcactive
  1553. #endif /* CK_APC */
  1554. #ifdef OS2
  1555.             && !viewonly
  1556. #endif /* OS2 */
  1557.             ) {
  1558.             tn_siks(KERMIT_STOP);       /* Send Kermit-Server Stop */
  1559.         }
  1560. #endif /* CK_AUTODL */
  1561. #endif /* IKS_OPTION */
  1562. #endif /* COMMENT */
  1563. #ifdef OS2
  1564.         term_io = term_io_save;
  1565. #endif /* OS2 */
  1566.         quiet = qsave;
  1567.         debug(F101,"doconect justone 5","",justone);
  1568. #ifdef NETCONN
  1569.         if (network && ttchk() < 0) {
  1570.             if (tn_exit || exitonclose)
  1571.               doexit(GOOD_EXIT,xitsta);
  1572.             else
  1573.               break;
  1574.         }
  1575. #endif /* NETCONN */
  1576. #ifdef OS2ORUNIX
  1577.         /* If connection dropped */
  1578.         if (ttchk() < 0) {
  1579.             concb((char)escape);        /* Restore console. */
  1580.             if (exitonclose)
  1581.               doexit(GOOD_EXIT,xitsta);
  1582.             else
  1583.               break;
  1584.         }
  1585. #endif /* OS2ORUNIX */
  1586.     }                                   /* Loop back for more. */
  1587. #endif /* CK_APC */
  1588. #ifndef NOKVERBS
  1589.     if ((keymac > 0) && (keymacx > -1)) { /* Executing a keyboard macro? */
  1590.         /* Set up the macro and return */
  1591.         /* Do not clear the keymac flag */
  1592.         return(dodo(keymacx,NULL,CF_KMAC|cmdstk[cmdlvl].ccflgs));
  1593.     }
  1594. #endif /* NOKVERBS */
  1595. #ifdef OS2
  1596.     term_io = term_io_save;
  1597. #endif /* OS2 */
  1598. #ifdef CKCONINTB4CB
  1599.     /* The order makes a difference in HP-UX 8.00. */
  1600.     /* The other order makes it think it's in the background when it */
  1601.     /* returns from CONNECT (Apr 1999). */
  1602.     setint();
  1603.     concb((char)escape);                /* Restore console for commands */
  1604. #else
  1605.     /* This is how it has always been so better leave it */
  1606.     /* this way for all non-HP-UX-8.00 builds. */
  1607.     concb((char)escape);                /* Restore console for commands */
  1608.     setint();
  1609. #endif /* CKCONINTB4CB */
  1610.     what = W_COMMAND;                   /* Back in command mode. */
  1611.     return(x);                          /* Done. */
  1612. }
  1613. #endif /* NOLOCAL */
  1614. #ifndef NOICP
  1615. #ifdef COMMENT
  1616. /*
  1617.   It seemed that this was needed for OS/2, in which v(cmdfile) and other
  1618.   file-oriented variables or functions can return filenames containing
  1619.   backslashes, which are subsequently interpreted as quotes rather than
  1620.   directory separators (e.g. see commented section for VN_CMDF below).
  1621.   But the problem can't be cured at this level.  Example:
  1622.     type v(cmdfile)
  1623.   Without doubling, the filename is parsed correctly, but then when passed
  1624.   to UNIX 'cat' through the shell, the backslash is removed, and then cat
  1625.   can't open the file.  With doubling, the filename is not parsed correctly
  1626.   and the TYPE command fails immediately with a "file not found" error.
  1627. */
  1628. /*
  1629.   Utility routine to double all backslashes in a string.
  1630.   s1 is pointer to source string, s2 is pointer to destination string,
  1631.   n is length of destination string, both NUL-terminated.
  1632.   Returns 0 if OK, -1 if not OK (destination string too short).
  1633. */
  1634. int
  1635. dblbs(s1,s2,n) char *s1, *s2; int n; {
  1636.     int i = 0;
  1637.     while (*s1) {
  1638.         if (*s1 == '\') {
  1639.             if (++i > n) return(-1);
  1640.             *s2++ = '\';
  1641.         }
  1642.         if (++i > n) return(-1);
  1643.         *s2++ = *s1++;
  1644.     }
  1645.     *s2 = NUL;
  1646.     return(0);
  1647. }
  1648. #endif /* COMMENT */
  1649. char *
  1650. gmdmtyp() {                             /* Get modem type */
  1651. #ifndef NODIAL
  1652.     int i, x;
  1653.     x = mdmtyp;
  1654.     if (x < 0)                          /* In case of network dialing */
  1655.       x = mdmsav;
  1656.     if (x < 1)
  1657.       return("none");
  1658.     else
  1659.       for (i = 0; i < nmdm; i++)
  1660.         if ((mdmtab[i].kwval == x) && (mdmtab[i].flgs == 0))
  1661.           return(mdmtab[i].kwd);
  1662. #endif /* NODIAL */
  1663.     return("none");
  1664. }
  1665. #ifndef NOXMIT
  1666. #ifndef NOLOCAL
  1667. /*  T R A N S M I T  --  Raw upload  */
  1668. /*  Obey current line, duplex, parity, flow, text/binary settings. */
  1669. /*  Returns 0 upon apparent success, 1 on obvious failure.  */
  1670. /***
  1671.  Things to add:
  1672.  . Make both text and binary mode obey set file bytesize.
  1673.  . Maybe allow user to specify terminators other than CR?
  1674.  . Maybe allow user to specify prompts other than single characters?
  1675.  . Make STATISTICS also work for TRANSMIT.
  1676.  . If TRANSMIT is done without echo, make some kind of (optional) display.
  1677.  . Make the same optimization for binary-mode transmit that was done for
  1678.    text-mode (in the no-echo / no-prompt / no-pause case).
  1679. ***/
  1680. /*  T R A N S M I T  --  Raw upload  */
  1681. /*  s is the filename, t is the turnaround (prompt) character  */
  1682. /*
  1683.   Maximum number of characters to buffer.
  1684.   Must be less than LINBUFSIZ
  1685. */
  1686. #ifdef OS2
  1687. #define XMBUFS 4096                     /* For compatibility with XYZmodem */
  1688. #else /* OS2 */
  1689. #define XMBUFS 1024
  1690. #endif /* OS2 */
  1691. #ifdef TNCODE
  1692. #ifndef IAC
  1693. #define IAC 255
  1694. #endif /* IAC */
  1695. #endif /* TNCODE */
  1696. #define OUTXBUFSIZ 15
  1697. static CHAR inxbuf[OUTXBUFSIZ+1];       /* Host-to-screen expansion buffer */
  1698. static int inxcount = 0;                /* and count */
  1699. static CHAR outxbuf[OUTXBUFSIZ+1];      /* Keyboard-to-host expansion buf */
  1700. static int outxcount = 0;               /* and count */
  1701. /*  T R A N S M I T  --  Unguarded non-protocol file transmission  */
  1702. /*
  1703.   Call with:
  1704.     char * s:   Name of file to transmit.
  1705.     char t:     Turnaround char for text-mode transmission (normally LF).
  1706.     int xlate:  nonzero = charset translation for text-mode xfer, 0 = skip.
  1707.     int binary: nonzero = transmit in binary mode, 0 = in text mode.
  1708. */
  1709. int
  1710. #ifdef CK_ANSIC
  1711. transmit(char * s, char t, int xlate, int binary)
  1712. #else
  1713. transmit(s,t,xlate,binary) char *s; char t; int xlate, binary;
  1714. #endif /* CK_ANSIC */
  1715. /* transmit */ {
  1716. #ifdef MAC
  1717.     extern char sstate;
  1718.     int count = 100;
  1719. #else
  1720. #ifdef OS2
  1721. #ifdef NT
  1722.     SIGTYP (* oldsig)(int);             /* For saving old interrupt trap. */
  1723. #else /* NT */
  1724.     SIGTYP (* volatile oldsig)(int);
  1725. #endif /* NT */
  1726. #else /* OS2 */
  1727.     SIGTYP (* oldsig)();
  1728. #endif /* OS2 */
  1729. #endif /* MAC */
  1730.     int eof = 0;                        /* End of File flag */
  1731.     int eol = 0;                        /* End of Line flag */
  1732.     int rc = 1;                         /* Return code. 0=fail, 1=succeed. */
  1733.     int myflow;                         /* Local copy of global flow... */
  1734.     int is_tn = 0;                      /* Do Telnet negotiations */
  1735.     int xbufsiz = XMBUFS;               /* Size of TRANSMIT buffer */
  1736.     int k, x, c, i;                     /* Int workers... */
  1737.     int control = 0;                    /* Echo loop control */
  1738.     long nbytes = 0;                    /* File byte count */
  1739.     long zz;                            /* Long worker */
  1740.     char *p;                            /* Char * worker */
  1741. #ifdef PIPESEND
  1742.     extern int pipesend;
  1743. #endif /* PIPESEND */
  1744. #ifndef NOCSETS
  1745.     int tcs = TC_TRANSP;                /* Intermediate (xfer) char set */
  1746.     int langsv = L_USASCII;             /* Save current language */
  1747.     int unicode = 0;
  1748.     int tcssize = 0;
  1749. #ifdef CK_ANSIC /* ANSI C prototypes... */
  1750.     CHAR (*sxo)(CHAR);
  1751.     CHAR (*rxo)(CHAR);
  1752.     CHAR (*sxi)(CHAR);
  1753.     CHAR (*rxi)(CHAR);
  1754. #else /* Not ANSI C... */
  1755.     CHAR (*sxo)();
  1756.     CHAR (*rxo)();
  1757.     CHAR (*sxi)();
  1758.     CHAR (*rxi)();
  1759. #endif /* CK_ANSIC */
  1760. #ifdef UNICODE
  1761.     union ck_short uc;
  1762.     int bomorder = 0;
  1763. #ifdef CK_ANSIC
  1764.     extern int (*xl_ufc[MAXFCSETS+1])(USHORT);  /* Unicode to FCS */
  1765.     extern USHORT (*xl_fcu[MAXFCSETS+1])(CHAR); /* FCS to Unicode */
  1766.     extern int (*xuf)(USHORT);
  1767.     extern USHORT (*xfu)(CHAR);
  1768. #else
  1769.     extern int (*xl_ufc[MAXFCSETS+1])();
  1770.     extern USHORT (*xl_fcu[MAXFCSETS+1])();
  1771.     extern int (*xuf)();
  1772.     extern USHORT (*xfu)();
  1773. #endif /* CK_ANSIC */
  1774. #endif /* UNICODE */
  1775. #endif /* NOCSETS */
  1776.     debug(F101,"xmit t","",t);
  1777.     debug(F101,"xmit xlate","",xlate);
  1778.     debug(F101,"xmit binary","",binary);
  1779. #ifdef PIPESEND
  1780.     if (pipesend) {
  1781.         if (nopush) return(-2);
  1782.         if (zxcmd(ZIFILE,s) < 1) {
  1783.             printf("?Can't start command: %sn",s);
  1784.             return(0);
  1785.         }
  1786.     } else
  1787. #endif /* PIPESEND */
  1788.     if (zopeni(ZIFILE,s) == 0) {        /* Open the file to be transmitted */
  1789.         printf("?Can't open file %sn",s);
  1790.         return(0);
  1791.     }
  1792.     x = -1;                             /* Open the communication channel */
  1793.     if (ttopen(ttname,&x,mdmtyp,cdtimo) < 0) {  /* (no harm if already open) */
  1794.         printf("Can't open device %sn",ttname);
  1795.         return(0);
  1796.     }
  1797.     zz = x ? speed : -1L;
  1798.     if (binary) {                       /* Binary file transmission */
  1799.         myflow = (flow == FLO_XONX) ? FLO_NONE : flow;
  1800.         if (ttvt(zz,myflow) < 0) {      /* So no Xon/Xoff! */
  1801.             printf("Can't condition linen");
  1802.             return(0);
  1803.         }
  1804.     } else {
  1805.         if (ttpkt(zz,flow,parity) < 0) { /* Put the line in "packet mode" */
  1806.             printf("Can't condition linen"); /* so Xon/Xoff will work, etc. */
  1807.             return(0);
  1808.         }
  1809.     }
  1810.     is_tn =
  1811. #ifdef TNCODE
  1812.       (local && network && (ttnproto == NP_TELNET)) || (!local && sstelnet)
  1813. #else
  1814.         0
  1815. #endif /* TNCODE */
  1816.           ;
  1817. #ifndef NOCSETS
  1818. /* Set up character set translations */
  1819.     tcs = 0;                            /* "Transfer" or "Other" charset */
  1820.     sxo = rxo = NULL;                   /* Initialize byte-to-byte functions */
  1821.     sxi = rxi = NULL;
  1822.     unicode = 0;                        /* Assume Unicode won't be involved */
  1823.     if (!binary && xlate) {             /* Set up charset translations */
  1824. /*
  1825.   In the SENDING direction, we are converting from the local file's
  1826.   character-set (fcharset) to the remote terminal charset (tcsr).  In the
  1827.   RECEIVING direction (echoing) we are converting from the remote end of the
  1828.   terminal charset (tcsr) to its local end (tcsl), which is not necessarily
  1829.   the same as the file character-set.  Especially when the file character
  1830.   set is UCS-2, which is not a valid terminal character set.  The various
  1831.   combinations are represented in this table:
  1832.   FCS = File Character Set
  1833.   RCS = Remote Terminal Character Set
  1834.   CCS = Console (Local Terminal) Character Set
  1835.    8   4   2   1
  1836.   FCS FCS RCS CCS
  1837.   UCS UTF UTF UTF
  1838.    0   0   0   0   =   0   =   No translation
  1839.    0   0   0   1   =   1   =   FCS -> RCS, Echo RCS -> UTF
  1840.    0   0   1   0   =   2   =   FCS -> UTF, Echo UTF -> CCS
  1841.    0   0   1   1   =   3   =   FCS -> UTF, Echo no translation
  1842.    0   1   0   0   =   4   =   UTF -> RCS, Echo RCS -> CCS
  1843.    0   1   0   1   =   5   =   UTF -> RCS, Echo RCS -> UTF
  1844.    0   1   1   0   =   6   =   UTF -> UTF, Echo UTF -> CCS
  1845.    0   1   1   1   =   7   =   No translation
  1846.    1   0   0   0   =   8   =   UCS -> RCS, Echo RCS -> CCS
  1847.    1   0   0   1   =   9   =   UCS -> RCS, Echo RCS -> UTF
  1848.    1   0   1   0   =  10   =   UCS -> UTF, Echo UTF -> CCS
  1849.    1   0   1   1   =  11   =   UCS -> UTF, Echo no translation
  1850. */
  1851. #ifdef UNICODE
  1852.         xfu = NULL;                     /* Unicode translation functions */
  1853.         xuf = NULL;
  1854.         bomorder = ucsorder;            /* UCS-2 byte order */
  1855.         if (fcharset == FC_UCS2)        /* File charset is UCS-2 */
  1856.           unicode |= 8;
  1857.         else if (fcharset == FC_UTF8)   /* File charset is UTF-8 */
  1858.           unicode |= 4;
  1859.         if (tcsr == FC_UTF8)            /* Remote term charset is UTF-8 */
  1860.           unicode |= 2;
  1861.         if (tcsl == FC_UTF8)            /* Local term charset is UTF-8 */
  1862.           unicode |= 1;
  1863. #endif /* UNICODE */
  1864. /*
  1865.   When Unicode not involved -- TCS is the intermediate (xfer) set, and:
  1866.   sxo = File-to-Intermediate charset function
  1867.   rxo = Intermediate-to-Remote-Terminal charset function
  1868.   sxi = Remote-Terminal-to-Intermediate
  1869.   rxi = Intermediate-to-Local-Terminal
  1870. */
  1871.         tcs = gettcs(tcsr,fcharset);    /* Get intermediate set. */
  1872.         sxo = xls[tcs][fcharset];       /* translation function */
  1873.         rxo = xlr[tcs][tcsr];           /* pointers for output functions */
  1874.         sxi = xls[tcs][tcsr];           /* and for input functions. */
  1875.         rxi = xlr[tcs][tcsl];
  1876. /*
  1877.   At this point we have unicode nonzero if Unicode is involved in the
  1878.   conversion, and to 0 if it is.
  1879.   The following is to prevent use of zmstuff() and zdstuff() by translation
  1880.   functions (stuffing works with file i/o, not with communication i/o).
  1881. */
  1882.         langsv = language;              /* Save current SET LANGUAGE */
  1883.         language = L_USASCII;           /* No language-specific translations */
  1884.     }
  1885. #endif /* NOCSETS */
  1886.     i = 0;                              /* Beginning of buffer. */
  1887. #ifndef MAC
  1888. #ifndef AMIGA
  1889.     oldsig = signal(SIGINT, trtrap);    /* Save current interrupt trap. */
  1890. #endif /* AMIGA */
  1891. #endif /* MAC */
  1892.     tr_int = 0;                         /* Have not been interrupted (yet). */
  1893.     rc = 1;                             /* Return code presumed good. */
  1894. #ifdef VMS
  1895.     conres();
  1896. #endif /* VMS */
  1897. #ifndef NOCSETS
  1898.     debug(F101,"XMIT unicode","",unicode);
  1899. #ifdef UNICODE
  1900.     debug(F101,"XMIT bomorder","",bomorder);
  1901. #endif /* UNICODE */
  1902. #endif /* NOCSETS */
  1903.     c = 0;                              /* Initial condition */
  1904.     while (c > -1 && !eof) {            /* Loop for all characters in file */
  1905.         eol = 0;
  1906. #ifdef MAC
  1907.         /*
  1908.          * It is expensive to run the miniparser so don't do it for
  1909.          * every character.
  1910.          */
  1911.         if (--count < 0) {
  1912.             count = 100;
  1913.             miniparser(1);
  1914.             if (sstate == 'a') {
  1915.                 sstate = '';
  1916.                 goto xmitfail;
  1917.             }
  1918.         }
  1919. #else /* Not MAC */
  1920.         if (tr_int) {                   /* Interrupted? */
  1921.             printf("^C...n");          /* Print message */
  1922.             goto xmitfail;
  1923.         }
  1924. #endif /* MAC */
  1925.         c = zminchar();                 /* Get a file character */
  1926.         debug(F000,"XMIT zminchar","",c);
  1927.         if (c < -1) {                   /* Other error */
  1928.             printf("?Input errorn");
  1929.             goto xmitfail;
  1930.         } else if (c > -1) {
  1931.             nbytes++;
  1932.             c &= fmask;                 /* Apply SET FILE BYTESIZE mask */
  1933.         } else if (c == -1) {
  1934.             eof = 1;
  1935.             debug(F101,"XMIT eof","",eof);
  1936.         }
  1937.         if (binary) {                   /* If binary file, */
  1938.             if (c == -1)                /* break if error, */
  1939.               goto xmitexit;
  1940.             if (ttoc(dopar((char) c)) < 0) { /* else just send the char */
  1941.                 printf("?Can't transmit charactern");
  1942.                 goto xmitfail;
  1943.             }
  1944. #ifdef TNCODE
  1945.             if (c == IAC && is_tn)      /* Quote Telnet IAC */
  1946.               ttoc((char)IAC);
  1947. #endif /* TNCODE */
  1948.             if (xmitw)                  /* Pause if requested */
  1949.               msleep(xmitw);
  1950.             if (xmitx) {                /* SET TRANSMIT ECHO ON? */
  1951.                 if (duplex) {           /* Yes, for half duplex */
  1952. #ifdef OS2
  1953.                     /* Echo to emulator */
  1954.                     scriptwrtbuf((USHORT)(c & cmdmsk));
  1955. #endif /* OS2 */
  1956.                     if (conoc((char)(c & cmdmsk)) < 0) /* echo locally. */
  1957.                       goto xmitfail;
  1958.                 } else {                /* For full duplex, */
  1959.                     int i, n;           /* display whatever is there. */
  1960.                     n = ttchk();        /* See how many chars are waiting */
  1961.                     if (n < 0) {        /* Connection dropped? */
  1962.                         printf("?Connection lostn");
  1963.                         goto xmitfail;
  1964.                     }
  1965.                     for (i = 0; i < n; i++) { /* Read and echo that many. */
  1966.                         x = ttinc(xmitt); /* Timed read just in case. */
  1967.                         if (x > -1) {   /* If no timeout */
  1968.                             if (parity) x &= 0x7f; /* display the char, */
  1969. #ifdef OS2
  1970.                             /* Echo to emulator */
  1971.                             scriptwrtbuf((USHORT)x);
  1972. #endif /* OS2 */
  1973.                             if (conoc((char)(x & cmdmsk)) < 0) {
  1974.                                 printf("?Output errorn");
  1975.                                 goto xmitfail;
  1976.                             }
  1977.                         } else if (x == -2) {
  1978.                             printf("Connection closed.n");
  1979.                             ttclos(1);
  1980.                             goto xmitfail;
  1981.                         } else if (x == -3) {
  1982.                             printf(
  1983.                             "Session Limit exceeded - closing connection.n"
  1984.                                    );
  1985.                             ttclos(1);
  1986.                             goto xmitfail;
  1987.                         } else {
  1988.                             printf("?Communications errorn");
  1989.                             goto xmitfail;
  1990.                         }
  1991.                     }
  1992.                 }
  1993.             } else ttflui();            /* Not echoing, just flush input. */
  1994.         } else {                        /* Text mode, line at a time. */
  1995. #ifdef UNICODE
  1996.             if (fcharset == FC_UCS2 && xlate) { /* Special for UCS-2 */
  1997.                 char xbuf[8];
  1998.                 x = 1 - (nbytes & 1);   /* Odd or even byte */
  1999.                 if (x == 0)             /* Note: 1 = the 1st, 0 = 2nd, etc */
  2000.                   uc.x_short = 0;
  2001.                 if (bomorder)           /* Little Endian */
  2002.                   x = 1 - x;            /* Save byte in appropriate half */
  2003.                 debug(F101,"XMIT UCS2 x","",x);
  2004.                 uc.x_char[x] = (CHAR) (c & 0xff);
  2005.                 if (nbytes & 1)         /* First byte, go back for next */
  2006.                   continue;
  2007.                 if (nbytes == 2) {      /* UCS-2 Byte Order Mark */
  2008.                     if (uc.x_short == (USHORT) 0xfeff) {
  2009.                         debug(F100,"XMIT UCS2 BOM FEFF","",bomorder);
  2010.                         continue;
  2011.                     } else if (uc.x_short == (USHORT) 0xfffe) {
  2012.                         bomorder = 1 - bomorder;
  2013.                         debug(F100,"XMIT UCS2 BOM FFFE (swap)","",bomorder);
  2014.                         continue;
  2015.                     }
  2016.                 }
  2017.                 sprintf(xbuf,"%04X",uc.x_short);
  2018.                 debug(F111,"XMIT UCS2",xbuf,uc.x_short);
  2019.                 if (nbytes & 1)         /* Special eol test for UCS-2 */
  2020.                   if (uc.x_short == 'n')
  2021.                     eol = 1;
  2022. #ifdef COMMENT
  2023.                 if (uc.x_short == 0x2028 || uc.x_short == 0x2029)
  2024.                     eol = 1;
  2025. #endif /* COMMENT */
  2026.             } else
  2027. #endif /* UNICODE */
  2028.               if (c == 'n') {          /* Normal eol test otherwise */
  2029.                   eol = 1;
  2030.             }
  2031.             if (eol) {                  /* End of line? */
  2032.                 int stuff = -1;
  2033.                 debug(F101,"XMIT eol length","",i);
  2034.                 if (i == 0) {           /* Blank line? */
  2035.                     if (xmitf)          /* Yes, insert fill if asked. */
  2036.                       line[i++] = dopar((char) xmitf);
  2037.                 }
  2038.                 if (i == 0 || ((char) line[i-1]) != ((char) dopar(CR)))
  2039.                   line[i++] = dopar(CR); /* Terminate it with CR */
  2040.                 if (xmitl) {
  2041.                     stuff = LF;
  2042. #ifdef TNCODE
  2043.                 } else if (is_tn && (tn_nlm != TNL_CR)) {
  2044.                     /* TELNET NEWLINE ON/OFF/RAW */
  2045.                     stuff = (tn_nlm == TNL_CRLF) ? LF : NUL;
  2046. #endif /* TNCODE */
  2047.                 }
  2048.                 if (stuff > -1)
  2049.                   line[i++] = dopar((char)stuff);
  2050.                 line[i] = NUL;
  2051.                 debug(F111,"XMIT eol line",line,i);
  2052.             } else if (c != -1) {       /* Not a newline, regular character */
  2053.                 int k, x;
  2054.                 outxbuf[0] = c;         /* In case of no translation */
  2055.                 outxcount = 1;          /* Assume result is one byte */
  2056. #ifndef NOCSETS
  2057.                 switch (unicode) {
  2058.                   case 0:               /* No Unicode involved */
  2059.                   case 1:
  2060.                     if (xlate) {        /* If not /TRANSPARENT */
  2061.                         /* Local-to-intermediate */
  2062.                         if (sxo) c = (*sxo)((char)c);
  2063.                         /* Intermediate-to-remote */
  2064.                         if (rxo) c = (*rxo)((char)c);
  2065.                         outxbuf[0] = c;
  2066.                     }
  2067.                     break;
  2068. #ifdef UNICODE
  2069.                   case 2:               /* Local byte to UTF-8 */
  2070.                   case 3:
  2071.                     xfu = xl_fcu[fcharset];
  2072.                     tcssize = fcsinfo[fcharset].size;
  2073.                     outxcount =
  2074.                       b_to_u((CHAR)c,outxbuf,OUTXBUFSIZ,tcssize);
  2075.                     break;
  2076.                   case 4:               /* Local UTF-8 to remote byte */
  2077.                   case 5:
  2078.                     xuf = xl_ufc[tcsr];
  2079.                     x = u_to_b((CHAR)c); /* Convert to byte */
  2080.                     if (x == -1) {      /* If more input bytes needed */
  2081.                         continue;       /* go back and get them */
  2082.                     } else if (x == -2) { /* LS or PS (shouldn't happen) */
  2083.                         outxbuf[0] = CR;
  2084.                     } else if (x == -9) { /* UTF-8 error */
  2085.                         outxbuf[0] = '?'; /* Insert error char */
  2086.                         outxbuf[1] = u_to_b2(); /* Insert next char */
  2087.                         outxcount = 2;
  2088.                     } else {
  2089.                         outxbuf[0] =    /* Otherwise store result */
  2090.                           (unsigned)(x & 0xff);
  2091.                     }
  2092.                     break;
  2093.                   case 6:               /* UTF-8 to UTF-8 */
  2094.                   case 7:
  2095.                     break;
  2096.                   case 8:               /* UCS-2 to byte */
  2097.                   case 9:
  2098.                     xuf = xl_ufc[tcsr];
  2099.                     outxbuf[0] = (*xuf)(uc.x_short);
  2100.                     break;
  2101.                   case 10:
  2102.                   case 11: {            /* UCS-2 to UTF-8 */
  2103.                       int j;
  2104.                       CHAR * buf = NULL;
  2105.                       x = ucs2_to_utf8(uc.x_short,&buf);
  2106.                       if (x < 0) {
  2107.                           outxbuf[0] = 0xff; /* (= U+FFFD) */
  2108.                           outxbuf[1] = 0xbd;
  2109.                           x = 2;
  2110.                       }
  2111.                       for (j = 0; j < x; j++)
  2112.                         outxbuf[j] = buf[j];
  2113.                       outxcount = x;
  2114.                       break;
  2115.                   }
  2116. #endif /* UNICODE */
  2117.                 }
  2118. #endif /* NOCSETS */
  2119.                 outxbuf[outxcount] = NUL;
  2120.                 debug(F111,"XMIT outxbuf",outxbuf,outxcount);
  2121. /*
  2122.   Now the input character (1 or more bytes) is translated into the output
  2123.   expansion buffer (1 or more bytes); outxcount = number of bytes to add to
  2124.   the TRANSMIT line buffer, which we do here, taking care of parity, SI/SO
  2125.   processing, and quoting Telnet IACs.
  2126. */
  2127.                 for (k = 0; k < outxcount; k++) {
  2128.                     c = outxbuf[k];
  2129.                     if (xmits && parity && (c & 0200)) { /* If shifting */
  2130.                         line[i++] = dopar(SO); /* needs to be done, */
  2131.                         line[i++] = dopar((char)c); /* do it here, */
  2132.                         line[i++] = dopar(SI); /* crudely. */
  2133.                     } else {
  2134.                         line[i++] = dopar((char)c);
  2135. #ifdef TNCODE
  2136.                         if (c == IAC && is_tn)
  2137.                           line[i++] = IAC;
  2138. #endif /* TNCODE */
  2139.                     }
  2140.                 }
  2141.             }
  2142. /*
  2143.   Send characters if buffer full, or at end of line, or at end of file.
  2144.   (End of line only if echoing, waiting for a prompt, or pausing.)
  2145. */
  2146.             debug(F000,"XMIT c",ckitoa(i),c);
  2147.             if (i >= xbufsiz || eof || (eol && (xmitx || xmitw || t))) {
  2148.                 p = line;
  2149.                 line[i] = '';
  2150.                 debug(F111,"transmit buf",p,i);
  2151.                 if (ttol((CHAR *)p,i) < 0) { /* try to send it. */
  2152.                     printf("Can't TRANSMIT buffern");
  2153.                     rc = 0;
  2154.                     break;
  2155.                 }
  2156.                 i = 0;                  /* Reset buffer pointer. */
  2157. /*
  2158.   Now we handle the echo.  If the user wants to see it, or if we have to
  2159.   wait for the turnaround character, t.  If the echo is being displayed,
  2160.   and terminal character-set translation is required, we do it here.
  2161. */
  2162.                 if (duplex && xmitx) {  /* If local echo, echo it */
  2163.                     if (parity || cmdmsk == 0x7f) { /* Strip hi bits */
  2164.                         char *ss = line;             /* if necessary */
  2165.                         while (*ss) {
  2166.                             *ss &= 0x7f;
  2167.                             ss++;
  2168.                         }
  2169.                     }
  2170. #ifdef OS2
  2171.                     {                   /* Echo to emulator */
  2172.                         char *ss = p;
  2173.                         while (*ss) {
  2174.                             scriptwrtbuf((USHORT)*ss);
  2175.                             ss++;
  2176.                         }
  2177.                     }
  2178. #endif /* OS2 */
  2179.                     if (conoll(p) < 0)
  2180.                       goto xmitfail;
  2181.                 }
  2182.                 if (xmitw)              /* Sleep TRANSMIT PAUSE interval */
  2183.                   msleep(xmitw);
  2184.                 control = 0;            /* Readback loop control */
  2185.                 if (t != 0 && eol)      /* TRANSMIT PROMPT given and at EOL */
  2186.                   control |= 1;
  2187.                 if (xmitx && !duplex)   /* Echo desired and is remote */
  2188.                   control |= 2;
  2189.                 if (control) {          /* Do this if reading back the echo */
  2190.                     int n;
  2191.                     x = 0;
  2192.                     while (1) {
  2193.                         if (control & 1) { /* Termination criterion */
  2194.                             if (x == t)    /* for turnaround */
  2195.                               break;
  2196.                         } else if (control & 2) { /* And for echoing */
  2197.                             if ((n = ttchk()) < 1)
  2198.                               break;
  2199.                         }
  2200.                         if ((x = ttinc(xmitt)) < 0) { /* Read with timeout */
  2201.                             switch (x) {
  2202.                               case -2:
  2203.                                 printf("Connection closed.n");
  2204.                                 ttclos(1);
  2205.                                 goto xmitfail;
  2206.                               case -3:
  2207.                                 printf(
  2208.                               "Session Limit exceeded - closing connection.n"
  2209.                                        );
  2210.                                 ttclos(1); /* full thru... */
  2211.                                 goto xmitfail;
  2212.                               default:
  2213.                                 printf("?Timeoutn");
  2214.                                 goto xmitfail;
  2215.                             }
  2216.                         }
  2217.                         if (x > -1 && (control & 2)) { /* Echo any echoes */
  2218.                             if (parity)
  2219.                               x &= 0x7f;
  2220.                             c = x;
  2221. #ifdef OS2
  2222.                             scriptwrtbuf((USHORT)x);
  2223. #endif /* OS2 */
  2224.                             inxbuf[0] = c;
  2225.                             inxcount = 1;
  2226. #ifndef NOCSETS
  2227.                             switch (unicode & 3) { /* Remote bits */
  2228.                               case 0:
  2229.                                 if (xlate) {
  2230.                                     if (sxi) c = (*sxi)((CHAR)c);
  2231.                                     if (rxi) c = (*rxi)((CHAR)c);
  2232.                                     inxbuf[0] = c;
  2233.                                 }
  2234.                                 break;
  2235. #ifdef UNICODE
  2236.                               case 1:   /* Remote Byte to local UTF-8 */
  2237.                                 xfu = xl_fcu[tcsr];
  2238.                                 tcssize = fcsinfo[tcsr].size;
  2239.                                 inxcount =
  2240.                                   b_to_u((CHAR)c,
  2241.                                          inxbuf,
  2242.                                          OUTXBUFSIZ,
  2243.                                          tcssize
  2244.                                          );
  2245.                                 break;
  2246.                               case 2:   /* Remote UTF-8 to local Byte */
  2247.                                 xuf = xl_ufc[tcsl];
  2248.                                 x = u_to_b((CHAR)c);
  2249.                                 if (x < 0)
  2250.                                   continue;
  2251.                                 inxbuf[0] = (unsigned)(x & 0xff);
  2252.                                 break;
  2253.                               case 3:   /* UTF-8 to UTF-8 */
  2254.                                 break;
  2255. #endif /* UNICODE */
  2256.                             }
  2257. #endif /* NOCSETS */
  2258.                             inxbuf[inxcount] = NUL;
  2259.                             if (conxo(inxcount,(char *)inxbuf) < 0)
  2260.                               goto xmitfail;
  2261.                         }
  2262.                     }
  2263.                 } else                  /* Not echoing */
  2264.                   ttflui();             /* Just flush input buffer */
  2265.             } /* End of buffer-dumping block */
  2266.         } /* End of text mode */
  2267.         if (eof) {
  2268.             rc = 1;
  2269.             goto xmitexit;
  2270.         }
  2271.     } /* End of character-reading loop */
  2272.   xmitfail:                             /* Failure exit point */
  2273.     rc = 0;
  2274.   xmitexit:                             /* General exit point */
  2275.     if (rc > 0) {
  2276.         if (*xmitbuf) {                 /* Anything to send at EOF? */
  2277.             p = xmitbuf;                /* Yes, point to string. */
  2278.             while (*p)                  /* Send it. */
  2279.               ttoc(dopar(*p++));        /* Don't worry about echo here. */
  2280.         }
  2281.     }
  2282. #ifndef AMIGA
  2283. #ifndef MAC
  2284.     signal(SIGINT,oldsig);              /* Put old signal action back. */
  2285. #endif /* MAC */
  2286. #endif /* AMIGA */
  2287. #ifdef VMS
  2288.     concb(escape);                      /* Put terminal back, */
  2289. #endif /* VMS */
  2290.     zclose(ZIFILE);                     /* Close file, */
  2291. #ifndef NOCSETS
  2292.     language = langsv;                  /* restore language, */
  2293. #endif /* NOCSETS */
  2294.     ttres();                            /* and terminal modes, */
  2295.     return(rc);                         /* and return successfully. */
  2296. }
  2297. #endif /* NOLOCAL */
  2298. #endif /* NOXMIT */
  2299. #ifndef NOCSETS
  2300. _PROTOTYP( CHAR (*sxx), (CHAR) );       /* Local translation function */
  2301. _PROTOTYP( CHAR (*rxx), (CHAR) );       /* Local translation function */
  2302. _PROTOTYP( CHAR zl1as, (CHAR) );        /* Latin-1 to ascii */
  2303. _PROTOTYP( CHAR xl1as, (CHAR) );        /* ditto */
  2304. /*  X L A T E  --  Translate a local file from one character set to another */
  2305. /*
  2306.   Translates input file (fin) from character set csin to character set csout
  2307.   and puts the result in the output file (fout).  The two character sets are
  2308.   file character sets from fcstab.
  2309. */
  2310. int
  2311. xlate(fin, fout, csin, csout) char *fin, *fout; int csin, csout; {
  2312. #ifndef MAC
  2313. #ifdef OS2
  2314. #ifdef NT
  2315.     SIGTYP (* oldsig)(int);             /* For saving old interrupt trap. */
  2316.     extern int wherex[], wherey[];
  2317.     extern int k95stdout;
  2318.     extern unsigned char colorcmd;
  2319. #else /* NT */
  2320.     SIGTYP (* volatile oldsig)(int);    /* For saving old interrupt trap. */
  2321. #endif /* NT */
  2322. #else /* OS2 */
  2323.     SIGTYP (* oldsig)();
  2324. #endif /* OS2 */
  2325. #endif /* MAC */
  2326. #ifdef CK_ANSIC
  2327.     int (*fn)(char);                    /* Output function pointer */
  2328. #else
  2329.     int (*fn)();
  2330. #endif /* CK_ANSIC */
  2331.     extern int xlatype;
  2332.     int filecode;                       /* Code for output file */
  2333.     int scrnflg = 0;
  2334.     int z = 1;                          /* Return code. */
  2335.     int x, c, tcs;                      /* Workers */
  2336.     int bytewise = 0;
  2337.     ffc = 0L;
  2338.     if (zopeni(ZIFILE,fin) == 0) {      /* Open the file to be translated */
  2339.         printf("?Can't open input file %sn",fin);
  2340.         return(0);
  2341.     }
  2342. #ifdef MAC
  2343. /*
  2344.   If user specified no output file, it goes to the screen.  For the Mac,
  2345.   this must be done a special way (result goes to a new window); the Mac
  2346.   doesn't have a "controlling terminal" device name.
  2347. */
  2348.     filecode = !strcmp(fout,CTTNAM) ? ZCTERM : ZOFILE;
  2349. #else
  2350. #ifdef VMS
  2351.     filecode = !strcmp(fout,CTTNAM) ? ZCTERM : ZMFILE;
  2352. #else
  2353. #ifdef OS2
  2354.     filecode = (!stricmp(fout,"con") || !stricmp(fout,"con:")) ?
  2355.         ZCTERM : ZMFILE;
  2356. #else /* OS2 */
  2357.     filecode = ZOFILE;
  2358. #endif /* OS2 */
  2359. #endif /* VMS */
  2360. #endif /* MAC */
  2361.     if (zopeno(filecode,fout,NULL,NULL) == 0) { /* And the output file */
  2362.         printf("?Can't open output file %sn",fout);
  2363.         return(0);
  2364.     }
  2365. #ifndef AMIGA
  2366. #ifndef MAC
  2367.     oldsig = signal(SIGINT, trtrap);    /* Save current interrupt trap. */
  2368. #endif /* MAC */
  2369. #endif /* AMIGA */
  2370.     scrnflg = (filecode == ZCTERM);     /* Set output function */
  2371.     if (scrnflg)
  2372.       fn = NULL;
  2373.     else if (filecode == ZMFILE)
  2374.       fn = putmfil;
  2375.     else
  2376.       fn = putfil;
  2377.     tr_int = 0;                         /* Have not been interrupted (yet). */
  2378.     z = 1;                              /* Return code presumed good. */
  2379.     if (!scrnflg && !quiet)
  2380.       printf("%s (%s) => %s (%s)nn", /* Say what we're doing. */
  2381.              fin, fcsinfo[csin].keyword,
  2382.              fout,fcsinfo[csout].keyword
  2383.              );
  2384. #ifndef UNICODE
  2385. /*
  2386.   Non-Unicode picks the "most appropriate" transfer character set as the
  2387.   intermediate set, which results in loss of any characters that the source
  2388.   and target sets have in common, but are lacking from the intermediate set.
  2389. */
  2390. #ifdef KANJI
  2391.     /* Special handling for Japanese... */
  2392.     if (fcsinfo[csin].alphabet == AL_JAPAN ||
  2393.          fcsinfo[csout].alphabet == AL_JAPAN) {
  2394.         USHORT eu;
  2395.         int c, x, y;
  2396.         xpnbyte(-1,0,0,NULL);           /* Reset output machine */
  2397.         xlatype = XLA_JAPAN;
  2398.         while ((c = xgnbyte(FC_JEUC,csin)) > -1) { /* Get an EUC byte */
  2399.             if (tr_int) {               /* Interrupted? */
  2400.                 printf("^C...n");      /* Print message */
  2401.                 z = 0;
  2402.                 break;
  2403.             }
  2404.             /* Send EUC byte to output machine */
  2405.             if ((x = xpnbyte(c,TC_JEUC,csout,fn)) < 0) {
  2406.                 z = -1;
  2407.                 break;
  2408.             }
  2409.         }
  2410.         goto xxlate;
  2411.     }
  2412. #endif /* KANJI */
  2413.     /* Regular bytewise conversion... */
  2414.     tcs = gettcs(csin,csout);           /* Get intermediate set. */
  2415.     if (csin == csout) {                /* Input and output sets the same? */
  2416.         sxx = rxx = NULL;               /* If so, no translation. */
  2417.     } else {                            /* Otherwise, set up */
  2418.         if (tcs < 0 || tcs > MAXTCSETS ||
  2419.             csin < 0 || csin > MAXFCSETS ||
  2420.             csout < 0 || csout > MAXFCSETS) {
  2421.             debug(F100,"XLATE csets out of range","",0);
  2422.             sxx = rxx = NULL;
  2423.         } else {
  2424.             sxx = xls[tcs][csin];       /* translation function */
  2425.             rxx = xlr[tcs][csout];      /* pointers. */
  2426.             if (rxx == zl1as) rxx = xl1as;
  2427.         }
  2428.     }
  2429.     while ((c = zminchar()) != -1) { /* Loop for all characters in file */
  2430.         if (tr_int) {                   /* Interrupted? */
  2431.             printf("^C...n");          /* Print message */
  2432.             z = 0;
  2433.             break;
  2434.         }
  2435.         if (sxx) c = (*sxx)((CHAR)c);   /* From fcs1 to tcs */
  2436.         if (rxx) c = (*rxx)((CHAR)c);   /* from tcs to fcs2 */
  2437.         if (zchout(filecode,(char)c) < 0) { /* Output xlated character */
  2438.             z = -1;
  2439.             break;
  2440.         }
  2441.     }
  2442.     goto xxlate;                        /* Done. */
  2443. #else  /* UNICODE */
  2444. /*
  2445.    Use Unicode as the intermediate character set.  It's simple and gives
  2446.    little or no loss, but the overhead is a bit higher.
  2447. */
  2448.     initxlate(csin,csout);              /* Set up translation functions */
  2449. #ifdef NT
  2450.     if (isunicode() &&                  /* NT console is Unicode based */
  2451.         csout == FC_UCS2 &&             /* And we're translating to UCS-2 */
  2452.         filecode == ZCTERM &&           /* for the real screen... */
  2453.         !k95stdout
  2454.         ) {
  2455.         union {
  2456.             USHORT ucs2;
  2457.             UCHAR  bytes[2];
  2458.         } output;
  2459.         while (1) {                     /* In this case we go two-by-two. */
  2460.             if ((c = xgnbyte(FC_UCS2,csin)) < 0)
  2461.               break;
  2462.             output.bytes[0] = c;
  2463.             if ((c = xgnbyte(FC_UCS2,csin)) < 0)
  2464.               break;
  2465.             output.bytes[1] = c;
  2466.             if (tr_int) {               /* Interrupted? */
  2467.                 printf("^C...n");      /* Print message */
  2468.                 z = 0;
  2469.                 break;
  2470.             }
  2471.             VscrnWrtUCS2StrAtt(VCMD,
  2472.                                &output.ucs2,
  2473.                                1,
  2474.                                wherey[VCMD],
  2475.                                wherex[VCMD],
  2476.                                &colorcmd
  2477.                                );
  2478.         }
  2479.     } else
  2480. #endif /* NT */
  2481.       /* General case: Get next byte translated from fcs to UCS-2 */
  2482.       while ((c = xgnbyte(FC_UCS2,csin)) > -1) {
  2483.           if (tr_int) {                 /* Interrupted? */
  2484.               printf("^C...n");        /* Print message */
  2485.               z = 0;
  2486.               break;
  2487.           }
  2488.           debug(F001,"XLATE c","",c);
  2489.           /* And then send UCS-2 byte to translate-and-output machine */
  2490.           if ((x = xpnbyte(c,TC_UCS2,csout,fn)) < 0) {
  2491.               z = -1;
  2492.               break;
  2493.           }
  2494.       }
  2495. #endif /* UNICODE */
  2496. #ifndef UNICODE
  2497.   xxlate:                               /* Common exit point */
  2498. #endif /* UNICODE */
  2499. #ifndef AMIGA
  2500. #ifndef MAC
  2501.     signal(SIGINT,oldsig);              /* Put old signal action back. */
  2502. #endif /* MAC */
  2503. #endif /* AMIGA */
  2504.     tr_int = 0;
  2505.     if (z < 0) {
  2506.         if (z == -1)
  2507.           printf("?File output error: %sn",ck_errstr());
  2508.         z = 0;
  2509.     }
  2510.     zclose(ZIFILE);                     /* Close files */
  2511.     zclose(filecode);                   /* ... */
  2512.     return(success = z);                /* and return status. */
  2513. }
  2514. #endif /* NOCSETS */
  2515. static char hompthbuf[CKMAXPATH+1];
  2516. char *
  2517. homepath() {
  2518.     int x;
  2519.     hompthbuf[0] = NUL;
  2520. #ifdef UNIXOROSK
  2521.     x = ckstrncpy(hompthbuf,zhome(),CKMAXPATH+1);
  2522.     if (x <= 0) {
  2523.         hompthbuf[0] = '/';
  2524.         hompthbuf[1] = NUL;
  2525.     } else if (x < CKMAXPATH - 2 && hompthbuf[x-1] != '/') {
  2526.         hompthbuf[x] = '/';
  2527.         hompthbuf[x+1] = NUL;
  2528.     }
  2529.     return(hompthbuf);
  2530. #else
  2531. #ifdef STRATUS
  2532.     if (strlen(zhome()) < CKMAXPATH)
  2533.       sprintf(hompthbuf,"%s>",zhome());
  2534.     return(hompthbuf);
  2535. #else
  2536.     return(zhome());
  2537. #endif /* STRATUS */
  2538. #endif /* UNIXOROSK */
  2539. }
  2540. /*  D O L O G  --  Do the log command  */
  2541. int
  2542. dolog(x) int x; {
  2543.     int y, disp; char *s = NULL, * p = NULL;
  2544.     extern int isguest;
  2545. #ifdef ZFNQFP
  2546.     struct zfnfp * fnp;
  2547. #endif /* ZFNQFP */
  2548.     if (isguest) {
  2549.         printf("?Anonymous log creation not allowedn");
  2550.         return(-9);
  2551.     }
  2552.     switch (x) {                        /* Which log... */
  2553. #ifdef DEBUG
  2554.       case LOGD:
  2555.         y = cmofi("Name of debugging log file","debug.log",&s,xxstring);
  2556.         break;
  2557. #endif /* DEBUG */
  2558.       case LOGP:
  2559.         y = cmofi("Name of packet log file","packet.log",&s,xxstring);
  2560.         break;
  2561. #ifndef NOLOCAL
  2562.       case LOGS:
  2563.         y = cmofi("Name of session log file","session.log",&s,xxstring);
  2564.         break;
  2565. #endif /* NOLOCAL */
  2566. #ifdef TLOG
  2567.       case LOGT:
  2568.         y = cmofi("Name of transaction log file","transact.log",&s,
  2569.                   xxstring);
  2570.         break;
  2571. #endif /* TLOG */
  2572. #ifdef CKLOGDIAL
  2573.       case LOGM: {
  2574.           int m, n;
  2575.           char mypath[CKMAXPATH+1];
  2576.           m = ckstrncpy(mypath,homepath(),CKMAXPATH);
  2577.           n = strlen(CXLOGFILE);
  2578.           if (m + n < CKMAXPATH)
  2579.             strcat(mypath,CXLOGFILE);
  2580.           else
  2581.             ckstrncpy(mypath,CXLOGFILE,CKMAXPATH);
  2582.           y = cmofi("Name of connection log file",mypath,&s,xxstring);
  2583.           break;
  2584.       }
  2585. #endif /* CKLOGDIAL */
  2586.       default:
  2587.         printf("n?Unknown log designator - %dn",x);
  2588.         return(-2);
  2589.     }
  2590.     if (y < 0) return(y);
  2591.     if (y == 2) {
  2592.         printf("?Sorry, %s is a directory namen",s);
  2593.         return(-9);
  2594.     }
  2595. #ifdef ZFNQFP
  2596. #ifdef OS2ORUNIX
  2597.     if (*s != '|')                      /* Allow for pipes */
  2598. #else
  2599. #ifdef OSK
  2600.     if (*s != '|')
  2601. #endif /* OSK */
  2602. #endif /* OS2ORUNIX */
  2603.       if (fnp = zfnqfp(s,TMPBUFSIZ - 1,tmpbuf)) {
  2604.           if (fnp->fpath)
  2605.             if ((int) strlen(fnp->fpath) > 0)
  2606.               s = fnp->fpath;
  2607.       } /* else if error keep original string */
  2608. #endif /* ZFNQFP */
  2609.     ckstrncpy(line,s,LINBUFSIZ);
  2610.     s = line;
  2611. #ifdef MAC
  2612.     y = 0;
  2613. #else
  2614.     p = "new";
  2615. #ifdef TLOG
  2616.     if ((x == LOGT && tlogfmt == 2) || x == LOGM)
  2617.       p = "append";
  2618. #endif /* TLOG */
  2619.     if ((y = cmkey(disptb,2,"Disposition",p,xxstring)) < 0)
  2620.       return(y);
  2621. #endif /* MAC */
  2622.     disp = y;
  2623.     if ((y = cmcfm()) < 0) return(y);
  2624.     switch (x) {
  2625. #ifdef DEBUG
  2626.       case LOGD:
  2627.         return(deblog = debopn(s,disp));
  2628. #endif /* DEBUG */
  2629. #ifndef NOXFER
  2630.       case LOGP:
  2631.         return(pktlog = pktopn(s,disp));
  2632. #endif /* NOXFER */
  2633. #ifndef NOLOCAL
  2634.       case LOGS:
  2635.         return(seslog = sesopn(s,disp));
  2636. #endif /* NOLOCAL */
  2637. #ifdef TLOG
  2638.       case LOGT:
  2639.         return(tralog = traopn(s,disp));
  2640. #endif /* TLOG */
  2641. #ifdef CKLOGDIAL
  2642.       case LOGM:
  2643.         return(dialog = diaopn(s,disp,0));
  2644. #endif /* CKLOGDIAL */
  2645.       default:
  2646.         return(-2);
  2647.     }
  2648. }
  2649. #ifndef NOXFER
  2650. int
  2651. pktopn(s,disp) char *s; int disp; {
  2652.     static struct filinfo xx;
  2653.     int y;
  2654.     if (!s)
  2655.       s = "";
  2656.     if (!*s)
  2657.       return(0);
  2658.     debug(F111,"pktopn",s,disp);
  2659.     zclose(ZPFILE);
  2660. #ifdef OS2ORUNIX
  2661.     if (s[0] == '|') {                  /* Pipe */
  2662.         char * p = s + 1;
  2663.         debug(F110,"pktopn p",p,0);
  2664.         while (*p) {
  2665.             if (*p != ' ')
  2666.               break;
  2667.             else
  2668.               p++;
  2669.         }
  2670.         debug(F110,"pktopn pipe",p,0);
  2671.         pktlog = zxcmd(ZPFILE,p);
  2672.         debug(F101,"pktopn seslog","",seslog);
  2673.     } else {                            /* File */
  2674. #endif /* OS2ORUNIX */
  2675.         if (disp) {
  2676.             xx.bs = 0; xx.cs = 0; xx.rl = 0; xx.org = 0; xx.cc = 0;
  2677.             xx.typ = 0; xx.dsp = XYFZ_A; xx.os_specific = '';
  2678.             xx.lblopts = 0;
  2679.             pktlog = zopeno(ZPFILE,s,NULL,&xx);
  2680.         } else pktlog = zopeno(ZPFILE,s,NULL,NULL);
  2681.         if (!pktlog)
  2682.           printf("?%s - %sn",s,ck_errstr());
  2683. #ifdef OS2ORUNIX
  2684.     }
  2685. #endif /* OS2ORUNIX */
  2686.     if (pktlog > 0)
  2687.       ckstrncpy(pktfil,s,CKMAXPATH+1);
  2688.     else
  2689.       *pktfil = '';
  2690.     return(pktlog);
  2691. }
  2692. #endif /* NOXFER */
  2693. int
  2694. traopn(s,disp) char *s; int disp; {
  2695. #ifdef TLOG
  2696.     static struct filinfo xx;
  2697.     int y;
  2698.     if (!s)
  2699.       s = "";
  2700.     if (!*s)
  2701.       return(0);
  2702.     debug(F111,"traopn",s,disp);
  2703.     debug(F101,"traopn tlogfmt","",tlogfmt);
  2704.     zclose(ZTFILE);
  2705. #ifdef OS2ORUNIX
  2706.     if (tlogfmt == 2) {                 /* FTP format is special... */
  2707.         if (!disp)                      /* Append? */
  2708.           if (zchki(s) > -1)            /* No - does file exist? */
  2709.             (VOID) zdelet(s);           /* Yes - delete it. */
  2710.         xferlog = 1;
  2711.         ckstrncpy(trafil,s,CKMAXPATH);
  2712.         xferfile = s;
  2713.         return(1);
  2714.     }
  2715.     if (s[0] == '|') {                  /* Pipe */
  2716.         char * p = s + 1;
  2717.         debug(F110,"traopn p",p,0);
  2718.         while (*p) {
  2719.             if (*p != ' ')
  2720.               break;
  2721.             else
  2722.               p++;
  2723.         }
  2724.         debug(F110,"traopn pipe",p,0);
  2725.         tralog = zxcmd(ZTFILE,p);
  2726.         debug(F101,"traopn tralog","",tralog);
  2727.     }
  2728. #endif /* OS2ORUNIX */
  2729.     if (s[0] != '|') {                  /* File */
  2730.         if (disp) {
  2731.             xx.bs = 0; xx.cs = 0; xx.rl = 0; xx.org = 0; xx.cc = 0;
  2732.             xx.typ = 0; xx.dsp = XYFZ_A; xx.os_specific = '';
  2733.             xx.lblopts = 0;
  2734.             tralog = zopeno(ZTFILE,s,NULL,&xx);
  2735.         } else tralog = zopeno(ZTFILE,s,NULL,NULL);
  2736.     }
  2737.     if (!tralog)
  2738.       printf("?%s - %sn",s,ck_errstr());
  2739.     if (tralog > 0 && tlogfmt > 0) {
  2740.         ckstrncpy(trafil,s,CKMAXPATH);
  2741.         tlog(F110,"Transaction Log:",versio,0L);
  2742. #ifndef MAC
  2743.         tlog(F100,ckxsys,"",0L);
  2744. #endif /* MAC */
  2745.         ztime(&s);
  2746.         tlog(F100,s,"",0L);
  2747.     } else
  2748.       *trafil = '';
  2749.     return(tralog);
  2750. #else
  2751.     return(0);
  2752. #endif /* TLOG */
  2753. }
  2754. #ifndef NOLOCAL
  2755. int
  2756. sesopn(s,disp) char * s; int disp; {
  2757.     static struct filinfo xx;
  2758.     int y;
  2759.     if (!s)
  2760.       s = "";
  2761.     if (!*s)
  2762.       return(0);
  2763.     debug(F111,"sesopn",s,disp);
  2764.     zclose(ZSFILE);
  2765. #ifdef OS2ORUNIX
  2766.     if (s[0] == '|') {                  /* Pipe */
  2767.         char * p = s + 1;
  2768.         debug(F110,"sesopn p",p,0);
  2769.         while (*p) {
  2770.             if (*p != ' ')
  2771.               break;
  2772.             else
  2773.               p++;
  2774.         }
  2775.         debug(F110,"sesopn pipe",p,0);
  2776.         seslog = zxcmd(ZSFILE,p);
  2777.         debug(F101,"sesopn seslog","",seslog);
  2778.     } else {                            /* File */
  2779. #endif /* OS2ORUNIX */
  2780.         if (disp) {
  2781.             xx.bs = 0; xx.cs = 0; xx.rl = 0; xx.org = 0; xx.cc = 0;
  2782.             xx.typ = 0; xx.dsp = XYFZ_A; xx.os_specific = '';
  2783.             xx.lblopts = 0;
  2784.             seslog = zopeno(ZSFILE,s,NULL,&xx);
  2785.         } else
  2786.           seslog = zopeno(ZSFILE,s,NULL,NULL);
  2787.         if (!seslog)
  2788.           printf("?%s - %sn",s,ck_errstr());
  2789. #ifdef OS2ORUNIX
  2790.     }
  2791. #endif /* OS2ORUNIX */
  2792.     if (seslog > 0)
  2793.       ckstrncpy(sesfil,s,CKMAXPATH+1);
  2794.     else
  2795.       *sesfil = '';
  2796.     return(seslog);
  2797. }
  2798. #endif /* NOLOCAL */
  2799. #endif /* NOICP */
  2800. int
  2801. debopn(s,disp) char *s; int disp; {
  2802. #ifdef DEBUG
  2803. #ifdef CK_UTSNAME
  2804.     extern char unm_mch[], unm_nam[], unm_rel[], unm_ver[], unm_mod[];
  2805. #endif /* CK_UTSNAME */
  2806. #ifdef OS2
  2807.     extern char ckxsystem[];
  2808. #endif /* OS2 */
  2809.     char *tp;
  2810.     static struct filinfo xx;
  2811.     if (!s)
  2812.       s = "";
  2813.     if (!*s)
  2814.       return(0);
  2815.     zclose(ZDFILE);
  2816. #ifdef OS2ORUNIX
  2817.     if (s[0] == '|') {                  /* Pipe */
  2818.         char * p = s + 1;
  2819.         debug(F110,"debopn p",p,0);
  2820.         while (*p) {
  2821.             if (*p != ' ')
  2822.               break;
  2823.             else
  2824.               p++;
  2825.         }
  2826.         debug(F110,"debopn pipe",p,0);
  2827.         deblog = zxcmd(ZDFILE,p);
  2828.         debug(F101,"debopn deblog","",deblog);
  2829.     } else {                            /* File */
  2830. #endif /* OS2ORUNIX */
  2831.         if (disp) {
  2832.             xx.bs = 0; xx.cs = 0; xx.rl = 0; xx.org = 0; xx.cc = 0;
  2833.             xx.typ = 0; xx.dsp = XYFZ_A; xx.os_specific = '';
  2834.             xx.lblopts = 0;
  2835.             deblog = zopeno(ZDFILE,s,NULL,&xx);
  2836.         } else
  2837.           deblog = zopeno(ZDFILE,s,NULL,NULL);
  2838.         if (!deblog)
  2839.           printf("?%s - %sn",s,ck_errstr());
  2840. #ifdef OS2ORUNIX
  2841.     }
  2842. #endif /* OS2ORUNIX */
  2843.     if (deblog > 0) {
  2844.         ckstrncpy(debfil,s,CKMAXPATH+1);
  2845.         debug(F110,"Debug Log ",versio,0);
  2846. #ifndef MAC
  2847. #ifdef OS2
  2848.         debug(F110,ckxsys,ckxsystem,0);
  2849. #else /* OS2 */
  2850.         debug(F100,ckxsys,"",0);
  2851. #endif /* OS2 */
  2852. #endif /* MAC */
  2853. #ifdef CK_UTSNAME
  2854.         if (unm_mch[0]) {
  2855.             debug(F110,"uname machine",unm_mch,0);
  2856.             if (unm_mod[0])
  2857.               debug(F110,"uname model  ",unm_mod,0);
  2858.             debug(F110,"uname sysname",unm_nam,0);
  2859.             debug(F110,"uname release",unm_rel,0);
  2860.             debug(F110,"uname version",unm_ver,0);
  2861.         }
  2862. #ifdef KTARGET
  2863. {
  2864.     char * s; /* Makefile target */
  2865.     s = KTARGET;
  2866.     if (!s) s = "";
  2867.     if (!*s) s = "(unknown)";
  2868.     debug(F110,"build target",s,0);
  2869. }
  2870. #endif /* KTARGET */
  2871.         deblog = 0;
  2872.         ztime(&tp);
  2873.         deblog = 1;
  2874.         debug(F100,tp,"",0);
  2875. #endif /* UTSNAME */
  2876.         debug(F101,"byteorder","",byteorder);
  2877.     } else *debfil = '';
  2878.     return(deblog);
  2879. #else
  2880.     return(0);
  2881. #endif /* MAC */
  2882. }
  2883. static char ndatbuf[10];
  2884. /*  C K D A T E  --  Returns current date/time in standard format  */
  2885. static char nowbuf[18];
  2886. char *
  2887. ckdate() {
  2888.     extern struct keytab cmonths[];
  2889.     int x;
  2890.     char * t;                   /* Substitute today's date */
  2891.     char dbuf[32];
  2892.     ztime(&t);
  2893. /*  012345678901234567890123 */
  2894. /*  Sat Jul  4 12:16:43 1998 */
  2895.     ckstrncpy(dbuf,t,32);
  2896.     t = dbuf;
  2897.     debug(F110,"ckdate dbuf",dbuf,0);
  2898.     nowbuf[0] = t[20];
  2899.     nowbuf[1] = t[21];
  2900.     nowbuf[2] = t[22];
  2901.     nowbuf[3] = t[23];
  2902.     nowbuf[4] = NUL;
  2903.     debug(F110,"ckdate nowbuf",nowbuf,0);
  2904.     t[7] = NUL;
  2905.     if ((x = lookup(cmonths,t+4,12,NULL)) < 0) {
  2906.         debug(F110,"ckdate bad month",t,0);
  2907.         return("<BAD_MONTH>");
  2908.     }
  2909.     sprintf(nowbuf+4,"%02d",x);
  2910.     nowbuf[6] = (t[8] == SP) ? '0' : t[8];
  2911.     nowbuf[7] = t[9];
  2912.     nowbuf[8] = ' ';
  2913.     nowbuf[9] = NUL;
  2914.     debug(F110,"ckdate nowbuf",nowbuf,0);
  2915.     for (x = 11; x < 19; x++) nowbuf[x-2] = t[x];
  2916.     nowbuf[17] = NUL;
  2917.     debug(F110,"ckdate nowbuf",nowbuf,0);
  2918.     return((char *)nowbuf);
  2919. }
  2920. #ifndef NOICP
  2921. #ifdef CKLOGDIAL
  2922. /*
  2923.   fc = 0 for initial open, meaning open, then close immediately.
  2924.   fc > 0 for subsequent opens, meaning open for use, leave open.
  2925. */
  2926. int
  2927. diaopn(s,disp,fc) char *s; int disp, fc; {
  2928.     extern char diafil[];
  2929.     static struct filinfo xx;
  2930.     int y;
  2931.     if (!s)
  2932.       s = "";
  2933.     if (!*s)
  2934.       return(0);
  2935.     debug(F110,"diaopn log",s,0);
  2936.     debug(F101,"diaopn fc",s,fc);
  2937.     debug(F101,"diaopn disp 1",s,disp);
  2938.     if (fc) disp = 1;                   /* Force append if open for use */
  2939.     debug(F101,"diaopn disp 2",s,disp);
  2940.     zclose(ZDIFIL);                     /* In case a log was already open */
  2941. #ifdef OS2ORUNIX
  2942.     if (s[0] == '|') {                  /* Pipe */
  2943.         char * p = s + 1;
  2944.         debug(F110,"diaopn p",p,0);
  2945.         while (*p) {
  2946.             if (*p != ' ')
  2947.               break;
  2948.             else
  2949.               p++;
  2950.         }
  2951.         debug(F110,"diaopn pipe",p,0);
  2952.         dialog = zxcmd(ZDIFIL,p);
  2953.         debug(F101,"diaopn dialog","",dialog);
  2954.     } else {                            /* File */
  2955. #endif /* OS2ORUNIX */
  2956.         if (disp) {
  2957.             xx.bs = 0; xx.cs = 0; xx.rl = 0; xx.org = 0; xx.cc = 0;
  2958.             xx.typ = 0; xx.dsp = XYFZ_A; xx.os_specific = '';
  2959.             xx.lblopts = 0;
  2960.             dialog = zopeno(ZDIFIL,s,NULL,&xx);
  2961.         } else dialog = zopeno(ZDIFIL,s,NULL,NULL);
  2962.         if (!dialog)
  2963.           printf("?%s - %sn",s,ck_errstr());
  2964. #ifdef OS2ORUNIX
  2965.     }
  2966. #endif /* OS2ORUNIX */
  2967.     if (dialog > 0)
  2968.       ckstrncpy(diafil,s,CKMAXPATH+1);
  2969.     else
  2970.       *diafil = '';
  2971.     if (fc == 0)                        /* Initial open */
  2972.       zclose(ZDIFIL);                   /* close it */
  2973.     return(dialog);
  2974. }
  2975. #endif /* CKLOGDIAL */
  2976. #ifndef NOSHOW
  2977. /*  SHOW command routines */
  2978. char *
  2979. shoxm() {
  2980.     char * s;
  2981.     switch (binary) {
  2982.       case XYFT_T: s = "text";         break;
  2983. #ifdef VMS
  2984.       case XYFT_B: s = "binary fixed"; break;
  2985.       case XYFT_I: s = "image";        break;
  2986.       case XYFT_L: s = "labeled";      break;
  2987.       case XYFT_U: s = "binary undef"; break;
  2988. #else
  2989. #ifdef MAC
  2990.       case XYFT_B: s = "binary";       break;
  2991.       case XYFT_M: s = "macbinary";    break;
  2992. #else
  2993.       case XYFT_B: s = "binary";       break;
  2994. #ifdef CK_LABELED
  2995.       case XYFT_L: s = "labeled";      break;
  2996. #endif /* CK_LABELED */
  2997. #endif /* MAC */
  2998. #endif /* VMS */
  2999.       default: s = "unknown"; break;
  3000.     }
  3001.     return(s);
  3002. }
  3003. #ifndef NOXFER
  3004. VOID                                    /* SHOW TRANSFER */
  3005. shoxfer() {
  3006.     extern int docrc, usepipes;
  3007.     printf("n");
  3008.     printf(" Transfer Bell: %sn",showoff(xfrbel));
  3009.     printf(" Transfer Interruption: %sn",showoff(xfrint));
  3010.     printf(" Transfer Cancellation: %sn",showoff(xfrcan));
  3011. #ifndef NOCSETS
  3012.     printf(" Transfer Character-set: ");
  3013.     if (tcharset == TC_TRANSP)
  3014.       printf("Transparentn");
  3015.     else
  3016.       printf("%sn",tcsinfo[tcharset].keyword);
  3017. #endif /* NOCSETS */
  3018.     printf(" Transfer CRC-calculation: %sn",showoff(docrc));
  3019.     printf(" Transfer Display: ");
  3020.     switch (fdispla) {
  3021.       case XYFD_N: printf("%sn","none"); break;
  3022.       case XYFD_R: printf("%sn","serial"); break;
  3023.       case XYFD_C: printf("%sn","fullscreen"); break;
  3024.       case XYFD_S: printf("%sn","crt"); break;
  3025.       case XYFD_B: printf("%sn","brief"); break;
  3026.     }
  3027.     printf(" Transfer Locking-shift: ");
  3028.     if (lscapu == 2) {
  3029.         printf("forced");
  3030.     } else {
  3031.         printf("%s", (lscapr ? "enabled" : "disabled"));
  3032.         if (lscapr) printf(",%s%s", (lscapu ? " " : " not "), "used");
  3033.     }
  3034.     printf("n Transfer Mode: %sn",
  3035.            xfermode == XMODE_A ?
  3036.            "automatic" :
  3037.            "manual"
  3038.            );
  3039.     printf(" Transfer Pipes: %sn", showoff(usepipes));
  3040.     printf(" Transfer Protocol: %sn",ptab[protocol].p_name);
  3041.     printf(" Transfer Slow-start: %sn",showoff(slostart));
  3042.     printf("n");
  3043. }
  3044. #endif /* NOXFER */
  3045. VOID
  3046. shoflow() {
  3047.     int i, x;
  3048.     extern int cxflow[], cxtype, ncxname, nfloname;
  3049.     extern char * cxname[];
  3050.     printf("nConnection type:      %sn",cxname[cxtype]);
  3051.     printf("Current flow-control: %sn", floname[flow]);
  3052.     printf("nDefaults by connection type:n");
  3053.     debug(F111,"shoflow cxtype",cxname[cxtype],cxtype);
  3054.     debug(F101,"shoflow flow","",flow);
  3055.     for (i = 0; i < ncxname; i++) {
  3056. #ifdef NOLOCAL
  3057.         if (i > 0) break;
  3058. #endif /* NOLOCAL */
  3059. #ifndef NETCONN
  3060.         if (i > 2) break;
  3061. #endif /* NETCONN */
  3062. #ifndef DECNET
  3063.         if (i == CXT_DECNET) continue;
  3064. #endif /* DECNET */
  3065. #ifndef DECNET
  3066. #ifndef SUPERLAT
  3067.         if (i == CXT_LAT) continue;
  3068. #endif /* SUPERLAT */
  3069. #endif /* DECNET */
  3070. #ifndef CK_NETBIOS
  3071.         if (i == CXT_NETBIOS) continue;
  3072. #endif /* CK_NETBIOS */
  3073. #ifndef NPIPE
  3074.         if (i == CXT_NPIPE) continue;
  3075. #endif /* NPIPE */
  3076. #ifndef SSH
  3077.         if (i == CXT_SSH) continue;
  3078. #endif /* SSH */
  3079. #ifndef NETCMD
  3080.         if (i == CXT_PIPE) continue;
  3081. #endif /* NETCMD */
  3082. #ifndef ANYX25
  3083.         if (i == CXT_X25) continue;
  3084. #endif /* ANYX25 */
  3085.         x = cxflow[i];
  3086.         debug(F101,"shoflow x","",x);
  3087.         if (x < nfloname)
  3088.           printf("  %-14s: %sn",cxname[i],floname[x]);
  3089.         else
  3090.           printf("  %-14s: (%d)n",cxname[i],x);
  3091.     }
  3092.     printf("n");
  3093. }
  3094. #ifndef NOLOCAL
  3095. #ifdef ANYX25
  3096. int
  3097. shox25(n) int n; {
  3098.     if (nettype == NET_SX25) {
  3099.         printf("SunLink X.25 V%d.%d",x25ver / 10,x25ver % 10);
  3100.         if (ttnproto == NP_X3) printf(", PAD X.3, X.28, X.29 protocol,");
  3101.         printf("n");
  3102.         if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3103.         printf(" Reverse charge call %s",
  3104.                revcall ? "selected" : "not selected");
  3105.         printf (", Closed user group ");
  3106.         if (closgr > -1)
  3107.           printf ("%d",closgr);
  3108.         else
  3109.           printf ("not selected");
  3110.         printf("n");
  3111.         if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3112.         printf(" Call user data %s.n", cudata ? udata : "not selected");
  3113.         if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3114.     } else if (nettype == NET_VX25) {
  3115.         if (ttnproto == NP_X3) printf(", PAD X.3, X.28, X.29 protocol,");
  3116.         printf("n");
  3117.         if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3118.         printf(" Reverse charge call %s",
  3119.                revcall ? "selected" : "not selected");
  3120.         printf (", Closed user group [unsupported]");
  3121.         if (closgr > -1)
  3122.           printf ("%d",closgr);
  3123.         else
  3124.           printf ("not selected");
  3125.         printf (",");
  3126.         printf("n");
  3127.         if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3128.         printf(" Call user data %s.n", cudata ? udata : "not selected");
  3129.         if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3130.     } else if (nettype == NET_IX25) {
  3131.         printf("AIX NPI X.25n");
  3132.         if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3133.         printf("n Reverse charge call %s",
  3134.                revcall ? "selected" : "not selected");
  3135.         printf (", Closed user group [unsupported]");
  3136.         if (closgr > -1)
  3137.           printf ("%d",closgr);
  3138.         else
  3139.           printf ("not selected");
  3140.         printf (",");
  3141.         printf("n Call user data %s.n", cudata ? udata : "not selected");
  3142.     }
  3143.     return(n);
  3144. }
  3145. #ifndef IBMX25
  3146. int
  3147. shopad(n) int n; {
  3148.     int i;
  3149.     printf("nX.3 PAD Parameters:n");
  3150.     if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3151.     for (i = 0; i < npadx3; i++) {
  3152.         printf(" [%d] %s %dn",padx3tab[i].kwval,padx3tab[i].kwd,
  3153.                padparms[padx3tab[i].kwval]);
  3154.         if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3155.     }
  3156.     return(n);
  3157. }
  3158. #endif /* IBMX25 */
  3159. #endif /* ANYX25 */
  3160. VOID
  3161. shoparc() {
  3162.     extern int reliable, stopbits, clsondisc;
  3163.     int i; char *s;
  3164.     long zz;
  3165.     printf("Communications Parameters:n");
  3166.     if (network
  3167. #ifdef IKSD
  3168.          || inserver
  3169. #endif /* IKSD */
  3170.          ) {
  3171.         printf(" Host: %s%s",ttname,reliable == SET_ON ? " (reliable)" : "");
  3172.     } else {
  3173.         printf(" %s: %s%s, speed: ",
  3174. #ifdef OS2
  3175.                "Port",
  3176. #else
  3177.                "Line",
  3178. #endif /* OS2 */
  3179.                ttname,
  3180. #ifdef CK_TTYFD
  3181.                (local &&
  3182. #ifdef VMS
  3183.                 vmsttyfd() < 0
  3184. #else
  3185.                 ttyfd == -1
  3186. #endif /* VMS */
  3187.                 ) ?
  3188.                  " (closed)" :
  3189.                    (reliable == SET_ON ? " (reliable)" : "")
  3190. #else
  3191.                ""
  3192. #endif /* CK_TTYFD */
  3193.                );
  3194.         if (
  3195. #ifdef CK_TTYFD
  3196. #ifdef VMS
  3197.             vmsttyfd() < 0
  3198. #else
  3199.             ttyfd == -1
  3200. #endif /* VMS */
  3201.             ||
  3202. #endif /* CK_TTYFD */
  3203.             (zz = ttgspd()) < 0) {
  3204.             printf("unknown");
  3205.         } else {
  3206.             if (speed == 8880) printf("75/1200");
  3207.             else if (speed == 134) printf("134.5");
  3208.             else printf("%ld",zz);
  3209.         }
  3210.     }
  3211.     if (network
  3212. #ifdef IKSD
  3213.          || inserver
  3214. #endif /* IKSD */
  3215.          )
  3216.       printf("n Mode: ");
  3217.     else
  3218.       printf(", mode: ");
  3219.     if (local) printf("local"); else printf("remote");
  3220.     if (network == 0
  3221. #ifdef IKSD
  3222.          && !inserver
  3223. #endif/* IKSD */
  3224.          ) {
  3225. #ifdef CK_TAPI
  3226.         if (tttapi && !tapipass )
  3227.           printf(", modem: %s","TAPI");
  3228.         else
  3229. #endif /* CK_TAPI */
  3230.         printf(", modem: %s",gmdmtyp());
  3231.     } else {
  3232. #ifdef NETCONN
  3233.        if (nettype == NET_TCPA) printf(", TCP/IP");
  3234.        if (nettype == NET_TCPB) printf(", TCP/IP");
  3235.        if (nettype == NET_DEC) {
  3236.            if (ttnproto == NP_LAT) printf(", DECnet LAT");
  3237.            else if ( ttnproto == NP_CTERM ) printf(", DECnet CTERM");
  3238.            else printf(", DECnet");
  3239.        }
  3240.        if (nettype == NET_SLAT) printf(", Meridian Technologies' SuperLAT");
  3241. #ifdef NETFILE
  3242.        if (nettype == NET_FILE) printf(", local file");
  3243. #endif /* NETFILE */
  3244. #ifdef NETCMD
  3245.        if (nettype == NET_CMD) printf(", pipe");
  3246. #endif /* NETCMD */
  3247. #ifdef NETPTY
  3248.        if (nettype == NET_PTY) printf(", psuedoterminal");
  3249. #endif /* NETPTY */
  3250. #ifdef NETDLL
  3251.        if (nettype == NET_DLL) printf(", dynamic load library");
  3252. #endif /* NETDLL */
  3253. #ifdef SSH
  3254.        if (nettype == NET_SSH) printf(", Secure Shell");
  3255. #endif /* SSH */
  3256.        if (nettype == NET_PIPE) printf(", Named Pipes");
  3257. #ifdef ANYX25
  3258.        if (shox25(0) < 0) return;
  3259. #endif /* ANYX25 */
  3260.        if (ttnproto == NP_TELNET) {
  3261.            printf(", telnet protocol");
  3262.            if (0
  3263. #ifdef CK_ENCRYPTION
  3264.                || ck_tn_encrypting() && ck_tn_decrypting()
  3265. #endif /* CK_ENCRYPTION */
  3266. #ifdef CK_SSL
  3267.                || tls_active_flag || ssl_active_flag
  3268. #endif /* CK_SSL */
  3269.                )
  3270.              printf(" (SECURE)");
  3271.        }
  3272. #ifdef RLOGCODE
  3273.        else if (ttnproto == NP_RLOGIN || ttnproto == NP_K4LOGIN ||
  3274.                 ttnproto == NP_K5LOGIN)
  3275.          printf(", rlogin protocol");
  3276.        else if (ttnproto == NP_EK4LOGIN || ttnproto == NP_EK5LOGIN)
  3277.          printf(", rlogin protocol (SECURE)");
  3278. #endif /* RLOGCODE */
  3279. #endif /* NETCONN */
  3280.     }
  3281.     printf("n");
  3282.     if (hwparity && local && !network)
  3283.       s = parnam((char)hwparity);
  3284.     else
  3285.       s = parnam((char)parity);
  3286.     printf(" Parity: %s%s",hwparity ? "hardware " : "", s);
  3287. #ifndef NOLOCAL
  3288.     if (local && !network) {
  3289.         int sb;
  3290.         char c;
  3291.         c = s[0];
  3292.         if (islower(c)) c = toupper(c);
  3293.         sb = stopbits;
  3294.         if (sb < 1) {
  3295.             sb = (speed <= 110L) ? 2 : 1;
  3296.             printf(", stop-bits: (default)");
  3297.         } else {
  3298.             printf(", stop-bits: %d",sb);
  3299.         }
  3300.         if (hwparity)
  3301.           printf(" (8%c%d)",c,sb);
  3302.         else if (parity)
  3303.           printf(" (7%c%d)",c,sb);
  3304.         else
  3305.           printf(" (8N%d)",sb);
  3306.         printf("n D");
  3307.     } else
  3308.       printf(", d");
  3309. #endif /* NOLOCAL */
  3310.     printf("uplex: %s, ", duplex ? "half" : "full");
  3311.     debug(F101,"shoparp flow","",flow);
  3312.     printf("flow: %s", floname[flow]);
  3313.     printf(", handshake: ");
  3314.     if (turn) printf("%dn",turnch); else printf("nonen");
  3315. #ifdef COMMENT
  3316.     if (local && !network) {            /* SET CARRIER-WATCH */
  3317. #endif /* COMMENT */
  3318.         if (carrier == CAR_OFF) s = "off";
  3319.         else if (carrier == CAR_ON) s = "on";
  3320.         else if (carrier == CAR_AUT) s = "auto";
  3321.         else s = "unknown";
  3322.         printf(" Carrier-watch: %s", s);
  3323.         if (carrier == CAR_ON) {
  3324.             if (cdtimo) printf(", timeout: %d sec", cdtimo);
  3325.             else printf(", timeout: none");
  3326.         }
  3327. #ifdef COMMENT
  3328.     }
  3329. #endif /* COMMENT */
  3330.     printf(", close-on-disconnect: %sn",showoff(clsondisc));
  3331. #ifdef UNIX
  3332. #ifndef NOUUCP
  3333.     if (local && !network && haslock && *flfnam) /* UUCP lockfile, UNIX only */
  3334.       printf(" Lockfile: %s",flfnam);
  3335. #ifndef USETTYLOCK
  3336.     if (local && !network && haslock && lock2[0])
  3337.       printf("n Secondary lockfile: %s",lock2);
  3338. #endif /* USETTYLOCK */
  3339. #else
  3340. #ifdef QNX
  3341.     {
  3342.         extern int qnxportlock, qnxopencount();
  3343.         if (local)
  3344.           printf(" Qnx-port-lock: %s, Open count: %dn",
  3345.                  showoff(qnxportlock),
  3346.                  qnxopencount()
  3347.                  );
  3348.         else
  3349.           printf(" Qnx-port-lock: %sn", showoff(qnxportlock));
  3350.     }
  3351. #endif /* QNX */
  3352. #endif /* NOUUCP */
  3353. #endif /* UNIX */
  3354.     printf("n");
  3355.     if (local) {
  3356.         int i;
  3357.         i = parity ? 7 : 8;
  3358.         if (i == 8) i = (cmask == 0177) ? 7 : 8;
  3359.         printf(" Terminal bytesize: %d,",i);
  3360.         printf(" escape character: %d (^%c)n",escape,ctl(escape));
  3361.     }
  3362. }
  3363. #ifdef TNCODE
  3364. #ifdef CK_AUTHENTICATION
  3365. _PROTOTYP(int ck_tn_authenticated, (VOID));
  3366. extern int forward_flag, forwarded_tickets;
  3367. #endif /* CK_AUTHENTICATION */
  3368. #ifdef CK_ENCRYPTION
  3369. _PROTOTYP(int ck_tn_encrypting, (VOID));
  3370. _PROTOTYP(int ck_tn_decrypting, (VOID));
  3371. #endif /* CK_ENCRYPTION */
  3372. int
  3373. shotopt(n) int n; {
  3374.     int opt;
  3375.     printf("%20s %12s %12s %12s %12snn",
  3376.            "Telnet Option","Me (client)","U (client)",
  3377.            "Me (server)","U (server)");
  3378.     n += 2;
  3379.     if (n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3380.     for ( opt = TELOPT_FIRST; opt <= TELOPT_LAST; opt++) {
  3381.         switch (opt) {
  3382.           case TELOPT_AUTHENTICATION:
  3383.           case TELOPT_ENCRYPTION:
  3384.           case TELOPT_TTYPE:
  3385.           case TELOPT_NAWS:
  3386.           case TELOPT_BINARY:
  3387.           case TELOPT_NEWENVIRON:
  3388.           case TELOPT_SNDLOC:
  3389.           case TELOPT_XDISPLOC:
  3390.           case TELOPT_SGA:
  3391.           case TELOPT_ECHO:
  3392.           case TELOPT_KERMIT:
  3393.           case TELOPT_START_TLS:
  3394.           case TELOPT_FORWARD_X:
  3395.             break;
  3396.           default:
  3397.             continue;
  3398.         }
  3399. #ifdef COMMENT
  3400.         /* Some compilers choke on this: "too many instructions generated" */
  3401.         printf("%20s %12s %12s %12s %12sn",
  3402.                TELOPT(opt),
  3403.                TELOPT_MODE(TELOPT_DEF_C_ME_MODE(opt)),
  3404.                TELOPT_MODE(TELOPT_DEF_C_U_MODE(opt)),
  3405.                TELOPT_MODE(TELOPT_DEF_S_ME_MODE(opt)),
  3406.                TELOPT_MODE(TELOPT_DEF_S_U_MODE(opt))
  3407.                );
  3408. #else
  3409.         printf("%20s ",
  3410.                TELOPT(opt)
  3411.                );
  3412.         printf("%12s %12s ",
  3413.                TELOPT_MODE(TELOPT_DEF_C_ME_MODE(opt)),
  3414.                TELOPT_MODE(TELOPT_DEF_C_U_MODE(opt))
  3415.                );
  3416.         printf("%12s %12sn",
  3417.                TELOPT_MODE(TELOPT_DEF_S_ME_MODE(opt)),
  3418.                TELOPT_MODE(TELOPT_DEF_S_U_MODE(opt))
  3419.                );
  3420. #endif /* COMMENT */
  3421.         if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3422.         if (sstelnet)
  3423.           printf("%20s %12s %12s %12s %12sn",
  3424.                  "",
  3425.                  "",
  3426.                  "",
  3427.                  (TELOPT_ME(opt)?"WILL":"WONT"),
  3428.                  (TELOPT_U(opt)?"WILL":"WONT")
  3429.                  );
  3430.         else
  3431.           printf("%20s %12s %12s %12s %12sn",
  3432.                  "",
  3433.                  (TELOPT_ME(opt)?"WILL":"WONT"),
  3434.                  (TELOPT_U(opt)?"WILL":"WONT"),
  3435.                  "",
  3436.                  ""
  3437.                  );
  3438.         if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3439.     }
  3440.     return(n);
  3441. }
  3442. int
  3443. shotel(n) int n; {
  3444.     extern int tn_duplex;
  3445. #ifdef CK_ENVIRONMENT
  3446.     extern int tn_env_flg;
  3447.     extern char tn_env_acct[];
  3448.     extern char tn_env_disp[];
  3449.     extern char tn_env_job[];
  3450.     extern char tn_env_prnt[];
  3451.     extern char tn_env_sys[];
  3452. #endif /* CK_ENVIRONMENT */
  3453. #ifdef CK_SNDLOC
  3454.     extern char * tn_loc;
  3455. #endif /* CK_SNDLOC */
  3456.     printf("SET TELNET parameters:n echo: %sn NVT newline-mode: ",
  3457.            tn_duplex ? "local" : "remote");
  3458.     switch (tn_nlm) {
  3459.       case TNL_CRNUL: printf("%sn","off (cr-nul)"); break;
  3460.       case TNL_CRLF:  printf("%sn","on (cr-lf)"); break;
  3461.       case TNL_CR:    printf("%sn","raw (cr)"); break;
  3462.       case TNL_LF:    printf("%sn","(lf)"); break;
  3463.     }
  3464.     if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3465. #ifdef CK_AUTHENTICATION
  3466.     {
  3467.         int type = ck_tn_authenticated();
  3468.         printf(" authentication: ");
  3469.         switch (sstelnet ?
  3470.                 TELOPT_U_MODE(TELOPT_AUTHENTICATION) :
  3471.                  TELOPT_ME_MODE(TELOPT_AUTHENTICATION)
  3472.                 ) {
  3473.           case TN_NG_AC: printf( "accepted " ); break;
  3474.           case TN_NG_RF: printf( "refused  " ); break;
  3475.           case TN_NG_RQ: printf( "requested"); break;
  3476.           case TN_NG_MU: printf( "required "); break;
  3477.         }
  3478. #ifdef CK_SSL
  3479.         if ((ssl_active_flag || tls_active_flag) &&
  3480.              ck_tn_auth_valid() == AUTH_VALID &&
  3481.              (!TELOPT_U(TELOPT_AUTHENTICATION) ||
  3482.                type == AUTHTYPE_NULL ||
  3483.                type == AUTHTYPE_AUTO))
  3484.             printf("   in use: X.509 certificaten");
  3485.         else
  3486. #endif /* CK_SSL */
  3487.   printf("   in use: %sn",AUTHTYPE_NAME(type));
  3488.         if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3489.         if (forward_flag)
  3490.           printf("  credentials forwarding requested %sn",
  3491.                  forwarded_tickets ? "and completed" :
  3492.                  "but not completed");
  3493.         else
  3494.           printf("  credentials forwarding disabledn");
  3495.         if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3496.     }
  3497. #endif /* CK_AUTHENTICATION */
  3498. #ifdef CK_ENCRYPTION
  3499.     {
  3500.         int i,x;
  3501.         int e_type = ck_tn_encrypting();
  3502.         int d_type = ck_tn_decrypting();
  3503.         char * e_str = NULL, * d_str = NULL;
  3504.         static struct keytab * tnetbl = NULL;
  3505.         static int ntnetbl = 0;
  3506.         x = ck_get_crypt_table(&tnetbl,&ntnetbl);
  3507.         for (i = 0; i < ntnetbl; i++) {
  3508.             if (e_type == tnetbl[i].kwval)
  3509.               e_str = tnetbl[i].kwd;
  3510.             if (d_type == tnetbl[i].kwval)
  3511.               d_str = tnetbl[i].kwd;
  3512.         }
  3513.         printf(" encryption: ");
  3514.         switch (TELOPT_ME_MODE(TELOPT_ENCRYPTION)) {
  3515.           /* This should be changed to report both ME and U modes */
  3516.           case TN_NG_AC: printf( "accepted " ); break;
  3517.           case TN_NG_RF: printf( "refused  " ); break;
  3518.           case TN_NG_RQ: printf( "requested"); break;
  3519.           case TN_NG_MU: printf( "required "); break;
  3520.         }
  3521.         printf("       in use: ");
  3522.         switch ((e_type ? 1 : 0) | (d_type ? 2 : 0)) {
  3523.           case 0:
  3524.             printf("plain text in both directions");
  3525.             break;
  3526.           case 1:
  3527.             printf("%s output, plain text input",e_str);
  3528.             break;
  3529.           case 2:
  3530.             printf("plain text output, %s input",d_str);
  3531.             break;
  3532.           case 3:
  3533.             printf("%s output, %s input",e_str,d_str);
  3534.             break;
  3535.         }
  3536.         printf("n");
  3537.         if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3538.     }
  3539. #endif /* CK_ENCRYPTION */
  3540. #ifdef IKS_OPTION
  3541.     printf(" kermit: ");
  3542.     switch (TELOPT_U_MODE(TELOPT_KERMIT)) {
  3543.       case TN_NG_AC: printf( "u, accepted;  " ); break;
  3544.       case TN_NG_RF: printf( "u, refused;   " ); break;
  3545.       case TN_NG_RQ: printf( "u, requested; "); break;
  3546.       case TN_NG_MU: printf( "u, required;  "); break;
  3547.     }
  3548.     switch (TELOPT_ME_MODE(TELOPT_KERMIT)) {
  3549.       case TN_NG_AC: printf( "me, accepted;  " ); break;
  3550.       case TN_NG_RF: printf( "me, refused;   " ); break;
  3551.       case TN_NG_RQ: printf( "me, requested; "); break;
  3552.       case TN_NG_MU: printf( "me, required;  "); break;
  3553.     }
  3554.     if (TELOPT_U(TELOPT_KERMIT))
  3555.       printf(" u, %s",
  3556.              TELOPT_SB(TELOPT_KERMIT).kermit.u_start ?
  3557.              "started" :
  3558.              "stopped"
  3559.              );
  3560.     else
  3561.       printf(" u, n/a");
  3562.     if (TELOPT_ME(TELOPT_KERMIT))
  3563.       printf(" me, %s;",
  3564.              TELOPT_SB(TELOPT_KERMIT).kermit.me_start ?
  3565.              "started" :
  3566.              "stopped"
  3567.              );
  3568.     else
  3569.       printf(" me, n/a;");
  3570.     printf("n");
  3571.     if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3572. #endif /* IKS_OPTION */
  3573.     printf(" BINARY newline-mode: ");
  3574.     switch (tn_b_nlm) {
  3575.       case TNL_CRNUL: printf("%sn","off (cr-nul)"); break;
  3576.       case TNL_CRLF:  printf("%sn","on (cr-lf)"); break;
  3577.       case TNL_CR:    printf("%sn","raw (cr)"); break;
  3578.       case TNL_LF:    printf("%sn","(lf)"); break;
  3579.     }
  3580.     if (++n > cmd_rows - 3) if (!askmore()) return(-1); else n = 0;
  3581.     printf(" binary-mode: ");
  3582.     switch (TELOPT_U_MODE(TELOPT_BINARY)) {
  3583.       case TN_NG_AC: printf( "u, accepted;  " ); break;