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

通讯/手机编程

开发平台:

Windows_Unix

  1. command skipping files it should have listed.  ckufio.c, 9 Mar 99.
  2. Supplied a missing "" in the unixware2 makefile target.  9 Mar 99.
  3. Increased size of v(filespec) buffer and removed warning about overflow.
  4. ckuus[rx].c, 9 Mar 99.
  5. Changes to SCO XENIX 2.3.4 makefile entry to update it to 7.0.  9 Mar 99.
  6. Put all of ckctel.c within #ifdef TNCODE..#endif, since there is no point in
  7. compiling it if TNCODE is not defined, and it chokes the SCO 3.2.4 compiler
  8. with "expression too complex".  Various other minor tweaks to ckutio.c,
  9. ckucon,c, ckctel.c, and ckuver.h for XENIX.  9 Mar 99.
  10. Moved #include <signal.h> to above #ifdef SIGWINCH, since <signal.h> is where
  11. SIGWINCH is defined (David Sanderson).  ckctel.c, 9 Mar 99.
  12. Fixes from Jeff to prevent IKSD from issuing Login: or Password: prompts when
  13. it is in server mode, and therefore accepting null passwords for anonymous
  14. users.  ckcdeb.h, ckcmai.c, ckuus7.c, ckcpro.w, 9 Mar 99.
  15. Patches for NetBSD from the NetBSD group.  ckcdeb.h, cku[ft]io.c, ckuusx.c,
  16. 10 Mar 99.
  17. Minor adjustments to the makefile to build on XENIX 2.3.4 with curses.
  18. 10 Mar 99.
  19. More Kerberos changes from Jeff.  ckctel.c, 10 Mar 99.
  20. Added check for guest to { SEND, GET, RECEIVE } { /MOVE-TO, /RENAME-TO }.
  21. ckuus[r6].c, 10 Mar 99.
  22. Updates for DG/UX 5.4R4.11 on m88k.  makefile, ckuver.h, ckuus[r5].c,
  23. 10 Mar 99.
  24. Updates for DG/UX 5.4R3.10 on m88k.  makefile, ckutio.c (had to simplify the
  25. GTODONEARG #ifdefs to unconfuse its cpp), 11 Mar 99.
  26. Changed message about CONNECT failing because no CD to a hint.  ck[uv]con.c,
  27. ckucns.c, 11 Mar 99.
  28. Changes from Jeff to accommodate (nonstandard) SAK Telnet option from IBM:
  29. ckuusr.h, ckuus[r3].c, ckctel.[ch], 13 Mar 99.
  30. Moved sw_armed and winchh() from ckcnet.c to ckctel.c, and added some needed
  31. #ifdefs to allow nonet builds.  13 Mar 99.
  32. Made rlog_naws() not static because it is called from ckctel.c module.
  33. ckctel.c, ckcnet.c, 13 Mar 99.
  34. Added -funsigned-char to SCO OSR5 makefile entries.  makefile, 13 Mar 99.
  35. Discovered that the DIRECTORY command returned total garbage for perms, size,
  36. and date on SCO 5.0.5.  It seems that lstat() is available and pretends to
  37. work (returns 0), but in fact puts junk in the stat buffer.  Added -DNOLSTAT
  38. to SCO targets.  (The SCO man page also mentions a statlstat() function but it
  39. works just as poorly as lstat()).  However, even using stat() and testing with
  40. S_ISLNK() failed to reveal symlinks.  Therefore a forced call to readlink()
  41. was required in this case.  But even that did not work -- it turns out SCO
  42. readlink() doesn't like it if a "/" is on the end of a directory name.  So now
  43. we strip it off before calling readlink().  zgetfs(): ckufio.c, 13 Mar 99.
  44.   Actually the problem with lstat() seems to be more like this: On some
  45.   platforms lstat() is to be used ONLY on symlinks; first stat() must be
  46.   called to see if it is a symlink() and then (only) if it is, then call
  47.   lstat() on it.  But on other platforms, stat() does not tell you if a
  48.   file is a symlink; you must call lstat() on all files to find out which
  49.   ones are symlinks.  Yet on OTHER files, lstat() still doesn't tell you if
  50.   a file is a symlink -- it either behaves like stat() or else it returns
  51.   garbage.  In that case you have to call stat() and then readlink() on
  52.   each file to see if it is a link.
  53. Another discovery: if DIR /RECURSIVE encounters a symlink to a directory, it
  54. follows it even if the linked-to directory is in the same directory, in which
  55. case it descends the same tree again.  This happens on all UNIXes.  So isdir()
  56. also has to check if it's a link, which fixes this problem.  But breaks CD,
  57. etc.  Another hornet's nest.  I think I fixed it but it might need more work:
  58. isdir() says a file is a directory if it is a directory OR if the recursive
  59. flag is NOT set and it is a link to a directory.  ckufio.c, 13 Mar 99.
  60. Previous change needed additional work for SCO 5.0.5.  Generalized
  61. SCO-specific #ifdefs to be usable on any UNIX build: -DNOLINKBITS means that
  62. neither S_ISLNK() nor _IFLNK test is reliable and readlink() should be called
  63. instead.  Added this to SCO CFLAGS.  ckufio.c, makefile, 14 Mar 99.
  64. SCO 3.2v4.2 supports symlinks but C-Kermit doesn't sense them.  Added
  65. -DNOLSTAT -DNOLINKBITS to the make targets.  XENIX entries are OK since it
  66. doesn't support symlinks anyway.  makefile, 14 Mar 99.
  67. Later, this was found in "man NS lstat" on OSR5.0.5:
  68.   lstat obtains information about the file named by path. In the case of a
  69.   symbolic link, lstat returns information about the link, and not the file
  70.   named by the link. It is only used by the NFS automount daemon and should
  71.   not be utilized by users.
  72. Send from remote, interrupt with X at local, connect back to remote.  REMOTE
  73. prints SEND-failure hint ("interrupted" not set).  Fixed in ckcfn[s3].c,
  74. 14 Mar 99.
  75. Added -DDCLPOPEN to SCO 3.2v4.2 makefile entries to suppress warnings about
  76. getcwd() and -DDCLPOPEN for popen().  Also added a new symbol, DCLFDOPEN, to
  77. force C-Kermit to declare fdopen() to suppress warnings about that one too,
  78. and added -DDCLFDOPEN to the 3.2v4.2 targets.  Now it builds without
  79. complaint.  makefile, cku[ft]io.c, 14 Mar 99.
  80. Updated the install target in the makefile to actually do most of the right
  81. stuff.  15 Mar 99.
  82. Added code to look around for the ckermit2.txt file at startup and keep a
  83. record of where (if anywhere) it was found.  This is used in various messages
  84. and help text: NEWS, SUPPORT, SHOW FILE, etc.  Also, updated assorted HELP,
  85. NEWS, INTRO, etc, texts.  ckuins.txt, ckuus[245].c, 15 Mar 99.
  86. Updates to ckuusr.c and ckctel.c from Jeff.  15 Mar 99.
  87. Finished PURGE command.  UNIX only.  ckuus[27].c, 15 Mar 99.
  88. Fixed a few fencepost errors in the PURGE command.  ckuus7.c, 16 Mar 99.
  89. Fixed znext() (again!) to return a positive number if it returned a file,
  90. and 0 when no more files left.  ckufio.c, 16 Mar 99.
  91. From Jeff: integration of the TELOPT command with the Telnet protocol state
  92. machine.  ckuusr.c ckctel.c ckuath.c ckctel.h ckuus5.c ckuus2.c, 16 Mar 99.
  93. Added SET OPTIONS PURGE.  ckuusr.h, ckuus[237].c, ckermit2.txt, 16 Mar 99.
  94. The WHOAREWE mechanism was slightly off kilter: it was not setting FILE NAMES
  95. LITERAL unless the TRANSFER MODE was AUTOMATIC.  In fact, it should always use
  96. literal file names when it recognizes a kindred spirit, regardless of the
  97. transfer mode -- text/binary file transfer is independent of filename
  98. conversion.  This was causing REGET to fail -- the original file would come
  99. with a literal filename, the REGotten file would come with a converted one,
  100. thus appearing to be a different file and thwarting recovery.  whoarewe():
  101. ckcfns.c, 16 Mar 99.
  102. Forgot to make the FAST, CAUTIOUS, ROBUST HELP-keywords invisible, so the
  103. 80x24 top-level "?" screen was overflowing.  ckuusr.c, 16 Mar 99.
  104. Added -DCK_NEWTERM to Unixware entries -- buffering problem after file
  105. transfer...  It's beginning to look like I should use newterm() whenever it's
  106. available.
  107. Fixed VMS-specific #ifdef foulups in ckudia.c and ckctel.c, 16 Mar 99.
  108. Updates to makefile from Jeff for KRB & SRP.  16 Mar 99.
  109. Adjustments for 16-bit QNX build.  Had to remove a couple features (CSETS,
  110. KVERBS, etc) since ckuus4.o segment got too big.  ckuus3.c, makefile,
  111. 16 Mar 99.
  112. Telnet changed to request binary mode in the other direction only if the
  113. TELOPT setting for that direction is REQUEST.  This fixes stairstep problem
  114. when Telnetting to the BSDI Telnet server.  From Jeff.  ckctel.c, 17 Mar 99.
  115. Lots of picky little changes from compiler complaints on many platforms.
  116. Most modules, 17 Mar 99.
  117. It looks like AIX 4.2 needs CK_NEWTERM after all.  But AIX 4.3 hangs at the
  118. end of a file transfer if built with CK_NEWTERM.  So no more sharing makefile
  119. entries between AIX 4.2 and 4.3.  makefile, 17 Mar 99.
  120. Had to add -DCK_NEWTERM for IRIX 5.3.  makefile, 17 Mar 99.
  121. Support for VMS PRN files from Lucas Hart.  ckvfio.c, 17 Mar 99.
  122. VMS CONNECT was missing a crucial IKSD start/stop negotiation.  ckvcon.c,
  123. 18 Mar 99.
  124. UNIX builds without CKSYMLINK could not expand wildcards due to a missing
  125. #else part in the #ifdef CKSYMLINK..#endif clause in isdir().  ckufio.c,
  126. 18 Mar 99.
  127. I thought that UNIX znewn() took MAXNAMLEN into account when creating backup
  128. names, but I must have dreamed it.  File transfer failed miserably when
  129. sending files to a 14-char file system when the backup name would be longer
  130. than 14 chars.  Rewrote znewn() to lop the minimum necessary number of
  131. characters from the end of the filename before creating the backup name, and
  132. tested the result on a real 14-char file system with filenames ranging from 10
  133. to 14 and with backup numbers crossing decade boundaries; all OK now.
  134. ckufio.c, 18 Mar 99.
  135. Some weeks ago I noticed that sometimes the DIR command on HP-UX 5.00 would
  136. produce a phantom entry like:
  137.   ----------        -1  0000-00-00 00:00:00
  138. Today I discovered that the phantom entries are deleted files, and there can
  139. be lots of them.  It turns out that on some platforms, read() from a directory
  140. (or readdir()) can return deleted files, so the result of each read should be
  141. checked immediately for existence by looking at the inode.  The code to do
  142. that was already there, but now in the wrong place due to the many additions
  143. for recursion, etc.  Fixed in traverse(), ckufio.c, 18 Mar 99.
  144. From Jeff, 18 Mar 99:
  145.  . Fix an IKSD deadlock: ckctel.c.
  146.  . Make TELOPT command wait for responses: ckuusr.c.
  147.  . Add SET TELNET BUG INFINITE-LOOP-CHECK: ckuus[23].c, ckctel.c.
  148.  . Some fixes for SAVE KEY: ckuus7.c.
  149. From Jeff, 19 Mar 99:
  150.   We received reports from Lucas Hart that the IKSD would not respond to
  151.   packet requests from VMS C-Kermit 7.0 Beta 5.  It was determined that
  152.   VMS C-Kermit was not adhering to Telnet Protocol and was sending bare
  153.   CRs on the wire from spack() when TELOPT_ME(TELOPT_BINARY) was WONT.
  154.   Why was this happening when the code to properly handle Telnet
  155.   Protocol was in spack() and worked fine on Unix and K95?  It turns out
  156.   that TCPSOCKET was not defined in ckcfn2.c because in VMS we define
  157.   TCPSOCKET conditionally depending on the TCP/IP stack that is being
  158.   used.
  159.   I doubled-checked all of the other files that reference TCPSOCKET to
  160.   determine if they failed to include ckcnet.h or included it in an #ifdef
  161.   TCPSOCKET.  ckcfns.c failed to include ckcnet.h at all and no other
  162.   file wrapped ckcnet.h in an ifdef.
  163.   Tests show VMS C-Kermit now works fine.
  164. Added ckcnet.h to dependencies for ckcfns.c and ckcfn2.c.  makefile, 19 Mar 99.
  165. Added prototypes for tn_wait() and tn_push() to ckctel.h.  19 Mar 99.
  166. The DG/UX 5.4R3.10 version did not have any of the "check if chars waiting at
  167. the console" methods enabled.  Added -DSELECT to the makefile entries, but
  168. that made ckutio.c blow up in the preprocessor, which apparently does not like
  169. #ifdefs inside function call argument lists.  Rearranged the gettimeofday()
  170. call in msleep().  ckutio.c, 20 Mar 99.
  171. Assorted minor fixes to the UNIX makefile.  20 Mar 99.
  172. ---Beta.05---
  173. From Jeff, 23 Mar 99:
  174.  . A fix for fword() and fsplit().  ckuus4.c.
  175.  . Telnet details... close in progress ... ckcnet.c, ckctel.c.
  176.  . Add DONT/WONT Kermit to "-0" command-line actions.  ckuusy.c.
  177.  . Force K95 to restore the cursor in SET TERM CURSOR.  ckuus7.c.
  178.  . Authorization/encryption changes.  ckuath.c, ckuat2.h, ckctel.c, makefile.
  179. If the first command line arg is a filename, do not automatically execute the
  180. initialization file.  If the script author wants the init file to be executed
  181. she can include a TAKE command in the script.  Prior to this, there was no
  182. way to *prevent* init file execution when a script was invoked in this manner.
  183. prescan(), ckuus4.c, 23 Mar 99.
  184. Along similar lines: a rather drastic change to promote the use of C-Kermit as
  185. a scripting tool -- if a filename is given as the first command-line argument,
  186. the rest of the words on the command line are arguments for the script, NOT
  187. for Kermit.  So no more "scriptname -x -y = arg1 arg2 arg3 ...".  Now it's
  188. just "scriptname arg1 arg2 arg3 ...", just like writers of scripts in any
  189. other language would expect.  If the first command-line arg is NOT a filename,
  190. the behavior is as before; this required considerable code juggling between
  191. prescan() and cmdini(), and also required that ckcmai() *always* call cmdini()
  192. before prescan().  Thus the conditional internal call to cmdini() from within
  193. prescan() was removed.  Now we can have Kermit scripts that behave exactly
  194. like shell scripts: no init file execution, no messages, no banner, etc, and
  195. argument passing is exactly the same.  ckcmai.c, ckuus[45].c, and documented
  196. in the new section 7.19 of ckermit2.txt, 23 Mar 99.
  197. At Jeff's suggestion, redid yesterday's work to preserve existing behavior
  198. mainly so as not to break K95 startup scripts & shortcuts.  New syntax is
  199. the same, except the "kerbang" line now must end with " +" (a space and a
  200. plus sign).  ckcmai.c, ckuusr.h, ckuus[45].c, 24 Mar 99.
  201. From Jeff: Put back the fix to fword/split() that was lost in yesterday's
  202. edits.  ckuus4.c, 25 Mar 99.  Later, Mark Sapiro (who reported the problem)
  203. verified the fix.
  204. From William Bader: Cleanup of the older SCO makefile targets.  Some of these
  205. have a limit of 25 -D's in a cc invocation, and so a common block of
  206. definitions for these targets was moved to ckcdeb.h.  Plus he found a data
  207. declaration at the entry to a switch() statement (a no-no): ckuus3.c.  Plus a
  208. place where strcpy() was copying something to itself in doxsend(): ckuusr.c.
  209. Built from new sources & makefile on SCO OSR5.0.5 (5 different targets) -- all
  210. OK, but that proves nothing about the others.  25 Mar 99.
  211. Added BUILDID=yyyymmdd to makefile.  It doesn't do anything; it's just there
  212. for anybody (like Peter E) who uses shell scripts to do lots of builds from
  213. intermediate (e.g. inter-Beta) test versions and wants a unique ID.  makefile,
  214. 25 Mar 99.
  215. Added brace-stripping to EXIT message.  ckuusr.c, 25 Mar 99.
  216. Added help for the "+" option.  ckuus2.c, 25 Mar 99.
  217. Cleaned up the hideous #ifdef mess around #include <sys/time.h> in ckutio.c
  218. by moving it to ckcdeb.h.  Any make targets that are not covered by the new
  219. symbol SYSTIMEH, or are improperly covered by it, can add -DSYSTIMEH or
  220. -DNOSYSTIMEH.  Did quick builds on SunOS, SCO, HP-UX, and AIX to make sure I
  221. didn't break anything big.  ckcdeb.h, makefile, ckccfg.txt, 25 Mar 99.
  222. Added vanity banners for Motorola SV/68 and SV/88.  makefile, ckuver.h,
  223. 25 Mar 99.
  224. Changed prescan to handle the case where "+" is given with nothing after
  225. (it just errors out).  ckuus4.c, 25 Mar 99.
  226. Changed SHOW FILE and SHOW PROTO to add SHOW XFER to their Also See lists.
  227. ckuus4.c, 25 Mar 99.
  228. Added a new symbol USE_STRERROR, which should be defined if strerror() is
  229. available for use.  Added a new FreeBSD 3.x makefile target that defines this.
  230. plus designer heralds for the three FreeBSD versions.  makefile, ckuusx.c,
  231. ckcdeb.h, ckuver.h, 25 Mar 99.
  232. FAST, CAUTIOUS, and ROBUST did not work as top-level commands because I put
  233. them in the command keyword table but never filled in the action routines.
  234. Since they were invisible anyway, I just removed them.  Now they are executed
  235. as macros, just as they were before.  ckuusr.c, 25 Mar 99.
  236. Minor corrections to yesterday's Motorola SV/68 and /88 fixes from Gerry
  237. Belanger.  ckcdeb.h, makefile, 26 Mar 99.
  238. Another updated SCO makefile target from Wm Bader.  26 Mar 99.
  239. Moved the flonam[] declaration so NOSPL builds would work. ckuus4.c, 26 Mar 99.
  240. Although statements of the form:
  241.   if <condition> .%a = <definition>
  242. worked correctly, the same construction used for a macro:
  243.   if <condition> .macroname = <definition>
  244. was parsed incorrectly, so subsequent "if defined macroname" would fail when
  245. it should succeed.  Fixed in dodef(): ckuus6.c, 26 Mar 99.
  246. Added DIR /MESSAGE:text to append the given message to the end of each
  247. directory listing line.  Handy in scripts.  ckuusr.h, ckuus6.c, ckermit2.txt,
  248. 26 Mar 99.
  249. Changed SHOW OPTIONS to call prtopt() to manage word wrap and page pausing,
  250. rather than just doing printf's, since lines can easily get longer than the
  251. screen.  ckuus[r567].c, 26 Mar 99.
  252. Added a "netbsdxx" target, which includes -DNOIKSD.  makefile, 26 Mar 99.
  253. Updated sys3upcgm target to remove redundant -D's.  makefile, 26 Mar 99.
  254. Fixed the SET HOST hint about Rlogin being a priv'd port not to appear unless
  255. they actually were trying to make an Rlogin connection.  ckuus7.c, 26 Mar 99.
  256. From Jeff: More fixes to auth and encrypt stuff, added /USERID to SET HOST
  257. command switches: security modules + ckuusr.h, ckuus7.c, 27 Mar 99.
  258. From Jeff: Allow /USERID switch to take empty value; update SET HOST help
  259. text; ckuus[27].c, 29 Mar 99.
  260. One of the more embarrassing and unprofessional aspects of Kermit's script
  261. language is the IF/XIF distinction.  A simple change allows multiple commands
  262. on one line if the line is surrounded by braces and commands are separated by
  263. commas:
  264.   C-Kermit> { echo one, echo two }
  265.   one
  266.   two
  267.   C-Kermit>
  268. This, in turn, makes it possible to have constructions like:
  269.   if <condition> { command, command, ... }
  270.   else if <condition> { command, command, ... }
  271.   else if <condition> { command, command, ... }
  272.   else { command, command, ... }
  273. Another simple change allows XIF statements to include any statement after the
  274. "else" token, just as C programmers would expect:
  275.   xif <condition> {
  276.      commands
  277.   } else xif <condition> {  <-- This is new.
  278.      commands
  279.   } else while <condition> {
  280.      commands
  281.   }
  282. But the real goal is to consolidate IF and XIF without breaking existing
  283. scripts; difficult because "XIF <cond> { commands } else { commands }" is one
  284. command, whereas "IF <cond>" followed by ELSE is two commands.  So I finagled
  285. the internal rules:
  286.  a. If an IF command has a THEN-part that starts with "{" then treat it as XIF.
  287.  b. If an XIF command lacks an ELSE-part, treat it as an IF.
  288. This seems to allow all combinations, plus others not recognized before.
  289. Aside from testing each case individually I also changed all XIFs to IFs in
  290. ckedemo.ksc, and it worked fine.  So bye bye XIF.  ckucmd.h, ckuusr.h,
  291. ckuus[56].c, ckucmd.c, ckermit2.txt [1.21,7.20], 29 Mar 99.
  292. More auth stuff from Jeff: ckcnet.c, ckuath.c, ckuus3.c, ckuus5.c, ckuus7.c,
  293. makefile, 29 Mar 99.
  294. More auth stuff from Jeff: ckuath.c, ckuus7.c, 30 Mar 99.
  295. Added #ifdef NOSHOW around the SHOW OPTIONS routines.  ckuus[r7].c, 30 Mar 99.
  296. Moved IF/WHILE-condition evaluator to a separate routine, boolexp().  Changed
  297. boolexp() IF/WHILE parser to use chained FDBs rather than only cmkey() so it
  298. can parse not only regular IF/WHILE conditions, but also numbers and "fields".
  299. ckuus6.c, 30 Mar 99.
  300. Added flag for cmfld() as an option to parse items within parentheses instead
  301. of within braces.  This allows it to parse the parenthetical expression in
  302. "if (<condition>) <command>" as a field even if it contains spaces. ckucmd.c,
  303. 30 Mar 99.
  304. But the idea of parsing a parenthesized expression as a field and then
  305. reparsing it proved unfruitful so I gave up on that and simply made "(", ")",
  306. "&&" (and AND), and "||" (and "OR") keywords with the appropriate semantics.
  307. This has numerous advantages (?-help still works for the condition words, etc)
  308. but requires space around every token.  The result executes ckedemo.ksc
  309. without a hiccup and after some debugging, also handles boolean expressions
  310. of pretty much arbitrary complexity.  ckuus6.c, ckermit2.txt, 30 Mar 99.
  311. More auth stuff from Jeff: ckuusr.h,ckuus[37].c,ckcnet.c,ckuath.c, 30 Mar 99.
  312. From William Bader, 31 Mar 99:
  313.  . Updated SCO targets: makefile.
  314.  . Move USE_MEMCPY to after all system headers have been included: ckcdeb.h.
  315.  . Break down complex printfs for Xenix C compiler: ckctel.c, ckuus4.c.
  316.  . Xenix 2.3.4 cc adjustments to ckufio.c.
  317.  . Additional #includes for SCO Xenix 2.3.4 TCP/IP: ckcnet.h.
  318. WHILE command wasn't working after yesterday's changes.  Fixed by putting
  319. parens around the condition generated for the WHILE macro.  ckuus6.c,
  320. 31 Mar 99.
  321. Made XIF invisible.  ckuusr.c, 31 Mar 99.
  322. If "while true { get x.x }" is given in remote mode, typing lots of ^C's
  323. caused a core dump every time.  There was a window between when the console
  324. was restored to its previous modes (the ttres() call in proto()) and the
  325. interrupt handler was re-armed (in parser()).  I hacked around this by having
  326. proto() re-arm the interrupt handlers before ttres() is called (which, in
  327. remote mode, restored the terminal's sensitivity to ^C, etc).  ckcfn2.c, 31
  328. Mar 99.
  329. The ^C^C^C pseudointerrupt at server command wait always set success = 0.  In
  330. fact, it should leave the success variable alone if any file transfers have
  331. been attempted; should set it to 1 if no file transfers have been attempted
  332. since server mode was started, and should set to 0 if a transfer was in
  333. progress.  Fixed in ckcpro.w, 31 Mar 99.
  334. Reinstated FAST, ROBUST, and CAUTIOUS as top-level keywords (which simply
  335. run the macros of the same name), so now completion and HELP work for them.
  336. However, they are still invisible due to limited real-estate on the top-level
  337. "?" screen.  ckuusr.c, 31 Mar 99.
  338. Discovered that two top-level keyword symbols had the same value.  Fixed in
  339. ckuusr.h, 31 Mar 99.
  340. Assorted improvements to HELP texts.  ckuus2.c, 31 Mar 99.
  341. Made /LOG and /LIST and /VERBOSE all be synonyms for each other in the PURGE
  342. and DELETE switch tables.  Ditto for /NOLOG, /NOLIST, and /QUIET. ckuus[67].c,
  343. 31 Mar 99.
  344. Changed askmore() not to ask if not at top level.  That's because the terminal
  345. modes are likely to be messed up and so single-character responses (like space
  346. bar, "n", etc) can't be processed correctly anyway.  ckuusx.c, 31 Mar 99.
  347. Added DIRECTORY [ other-switches ] /ARRAY:x [ filespec ].  If the /ARRAY:x
  348. switch is given (x is the array name, required), the filenames are put in the
  349. array, rather than listed.  This allows the DIRECTORY file-selection switches
  350. to be used to build a custom file list easily and quickly.  ckuusr.h,
  351. ckuus6.c, 31 Mar 99.
  352. Fixed some long lines in ckuath.c.  1 Apr 99.
  353. Backed off on yesterday's askmore() change -- apparently it is not needed
  354. after all.  ckuusx.c, 1 Apr 99.
  355. Added three simple routines to allow rudimentary screen formatting by scripts:
  356. ck_cls(), ck_cleol(), and ck_curpos(row,col).  In UNIX, these rely on
  357. termcap/terminfo; elsewhere they use the built-in stuff (MYCURSES, SMG, etc).
  358. ckuusr.h, ckuusx.c, 1 Apr 99.
  359. Added SCREEN { CLEAR, CLEOL, MOVE <row> <col> }.  These all work fine on a
  360. termcap system (SunOS), on terminfo system (SCO, HP, Solaris), and on VMS with
  361. SMG, but obviously need wider testing.  The UNIX versions of these commands
  362. use the tgetent() info (which we were already getting) thru calls to
  363. tgetstr(), tgoto(), and tputs().  They don't depend on curses at all, and
  364. curses does not need to be initialized for these commands to be used (but SMG
  365. does; the new code takes care of that).  (I realize that some of these new
  366. commands have synonyms in K95; these are indicated in the K95 HELP SCREEN
  367. text.)  Also ensured that -DNOCURSES builds still work.  ckuusr.[ch],
  368. ckuus[x2].c, 1 Apr 99.
  369. Reinstated screen-clearing on Ctrl-L in the parser.  ckucmd.c, 1 Apr 99.
  370. Made CLS a visible command in all versions, not just K95.  ckuusr.c, 1 Apr 99.
  371. Auth changes from Jeff: ckuus[37].c, ckuath.c, 2 Apr 99.
  372. Fixed long lines in ckuath.c, 2 Apr 99.
  373. Makefile changes for AT&T 7300 and SCO UNIX.  2 Apr 99.
  374. Discovered that the NOT operator does not always work as intended in compound
  375. Boolean expressions.  E.g. in "if ( not true || false )" evaluates to true
  376. rather than false because NOT affects everything that follows.  NOT is a unary
  377. operator that should bind only to the quantity or expression immediately to
  378. its right.  To fix:
  379.  . I added a new math operator, "prefix !", which inverts the truth value
  380.    of its operand (as distinct from "prefix ~", which flips the bits, and
  381.    "postfix !", which is the factorial operator).
  382.  . Used this to implement NOT internally.
  383. ckuus[56].c, 2 Apr 99.
  384. More auth changes from Jeff: ckuath.c, ckcnet.c, ckuus3.c, 2 Apr 99.
  385. From Jeff: Make 2nd [x]makestr() arg const in ANSIC builds.  ckclib.[ch],
  386. 2 Apr 99.
  387. Changed GETC to not supply a gratuitous CRLF if given from a script (i.e.
  388. cmdsrc() != 0).  ckuus6.c, 2 Apr 99.
  389. Added != to repertoire of logical operators for Boolean assertions, as in
  390. "if ( != %c 3 ) ..."  ckuusr.h, ckuus6.c, 2 Apr 99.
  391. Deduced that termcap/terminfo cursor coordinates are 0-based, not 1-based.
  392. Adjusted the curses version of ck_curpos() accordingly.  ckuusx.c, 3 Apr 99.
  393. Discovered a new problem: missing macro parameters were not being replaced
  394. by an empty value.  For example:
  395.   def cd { cd %1 }
  396.   xx
  397. would cause an error, rather than defaulting to the current directory as it
  398. should.  Hmmm, actually, it's an old problem -- it was always there.  Years
  399. ago, we went to extreme lengths to try to accommodate backslashes in filenames
  400. in K95: cmifi() prescans the string (using the chkvar() function) to see if it
  401. contains variables.  So if the user said "cd c:blahfoo", the scan would not
  402. turn up any variables, and so we would not pass the string through the
  403. evaluator, which would have eaten the backslashes (or worse).  But what about
  404. "cd %a"?  Is "%a" a variable or an actual directory?  To solve this dilemma,
  405. chkvar() would send a copy of "%a" to the evaluator and see if it had a
  406. definition.  If it did, chkvar() would say it was a variable.  If it did not,
  407. chkvar() would say it was not a variable, and so therefore it would not be
  408. evaluated.  It turns out this has rather disastrous consequences for macro
  409. arguments that are omitted.  In the "xx" definition above, %1 does not have a
  410. definition, even though it is a variable, and therefore it is not evaluated,
  411. and therefore "%1" is given literally to the CD command.  The only sensible
  412. fix for this is to change chkvar() to check the syntax of the variable, but
  413. not whether it has a value.  That means if any PC users want to refer to a
  414. file that has the same syntax as a variable, they'll need to double the
  415. backslash.  chkvar(): ckuus6.c; cmifi2(): ckucmd.c, 3 Apr 99.
  416. This was (at least) a double-ended problem.  It also turns out the evaluator,
  417. zzstring(), gave a failure return code if a variable was empty, which is
  418. wrong -- emptiness is a perfectly valid value for any variable.  zzstring():
  419. ckuus4.c, 3 Apr 99.
  420. There's more.  cmifi(), rather than checking the return code from zzstring(),
  421. checked the length of the result (0 == failure, > 0 == success), which, again,
  422. prevented substitution of an empty variable value.  cmifi() was changed to
  423. test the zzstring return value; if negative we return a parse failure; if 0 or
  424. greater but the result was empty, we substitute the given default.  ckucmd.c,
  425. 2 Apr 99.
  426. In fact, the improper-checking-of-zzstring-success syndrome was pervasive
  427. throughout all the ckucmd routines and similar fixes had to be applied to most
  428. of them.  ckucmd.c, 3 Apr 99.
  429. The mess in cmofi() was especially bad.  Instead of calling chkvar(), it had
  430. its own inline -- but slightly different -- version of chkvar(), which in any
  431. case did not accomplish its purpose.  For example, "mkdir c:123" (the classic
  432. example) created a directory named "{".  But cmifi(), which does use chkvar(),
  433. could not handle "cd c:123" or "rmdir c:123" when 123 referred to "{".  So
  434. I changed cmofi() to use chkvar() like cmifi() does -- at least now they are
  435. symmetrical.  For total consistency, I put every reference to chkvar() in
  436. ckucmd.c in #ifdef OS2..#endif (previously some of them were this way and some
  437. weren't).  Obviously this will need testing and debugging in K95.  ckucmd.c,
  438. 3 Apr 99.
  439. Meanwhile, chkvar() was also called by IF DEFINED.  Since chkvar() no longer
  440. checks if a variable is defined, the IF DEFINED code had to be changed to
  441. check this itself.  doif(): ckuus6.c, 3 Apr 99.
  442. Bulletproofed all cm...() routines against null pointers passed as arguments.
  443. ckucmd.c, 3 Apr 99.
  444. In running the big script torture tests I saw a few glitches, and in trying to
  445. isolate them, was able to produce a core dump consistently.  At some time in
  446. the past not revealed in my notes, some of the cm...() routines were "fixed"
  447. to not write into their help-message argument (xhlp), by first copying it to a
  448. global malloc'd buffer using makestr() (thus freeing the previous one, if
  449. any), and then changing xhlp to point at the malloc'd buffer.  This seemed
  450. like a safe bet, and I'm still not sure why it wasn't, but these very makestr()
  451. calls (the free() in particular) were the location of each crash, which
  452. usually occurred only after the program had been running for quite a while.
  453. Changing the global malloc'd buffer to a series of local automatic ones cured
  454. the problem.  ckucmd.c, 3 Apr 99.
  455. Or did it?  There were still some infrequent glitches evident in any scripts
  456. involving arrays, or more to the point, arrays explicitly declared with the
  457. DECLARE statement that included a list of initial values.  Turns out I was
  458. malloc'ing BYTES rather than WORDS for the array pointers in the DECLARE
  459. parser.  This was obviously a serious memory leak and could have had any
  460. consequences at all.  The bad code has been with us since 18 Jun 1997 (i.e.
  461. after 6.0 was released, but before K95 1.1.13.  I doubt, however, that this
  462. has been the cause of any crashes in real life, because who uses array
  463. initializers?).  Fixed in ckuusr.c, 3 Apr 99.
  464. After these changes, "send *" wouldn't work.  This one was really scary.
  465. Something was writing over cmarg2.  I traced it to zfnqfp() in ckufio.c.
  466. There was a loop that, under certain bizarre conditions, might not terminate
  467. properly, and when it didn't it could write all over memory -- and it seems
  468. today was my lucky day at creating bizarre conditions. I put in a better
  469. termination test and also rearranged some code that didn't make sense.
  470. ckufio.c, 3 Apr 99.
  471. Certain debugging statements write memory addresses, PIDs, etc, into the debug
  472. log, some of them periodically -- e.g. for every command, which makes it very
  473. difficult to automatically compare long debug logs.  I commented out many of
  474. the debug statements that do this.  ckutio.c, ckucmd.c, ckuus4.c, 3 Apr 99.
  475. After all this I ran hundreds of script torture tests and transferred many
  476. gigabytes of files in both directions with no trouble.  I'm not 100% confident
  477. that all holes are plugged, but some are.  Progress...
  478. The next day...
  479. New simplified makestr() from Jeff -- I just took it without looking at
  480. it very much.  But I used it all day and it seemed OK.  Script torture tests
  481. still work, etc.  ckclib.c, 4 Apr 99.
  482. Putting zfnqfp() back the way it was before yesterday brings back the
  483. overwriting of cmarg2, so something is still wrong.  Added code to zfnqfp()
  484. to force a core dump at various places (before and after the code that writes
  485. over cmarg2), and then got a backtrace with gdb.  In all cases, the stack
  486. looked just fine.  Built a version with the malloc debugger.  Can still
  487. replicate the error, but the malloc debugger finds nothing wrong.  Built a
  488. version on an entirely different platform (PC with SCO 5.0.5, with both gcc
  489. and with SCO cc) and got exactly the same problem, so it's not architecture or
  490. compiler dependent.  So this pretty much narrows it down to plain old bad
  491. code.  But the zfnqfp() code looks just fine.  The problem involves its tmp[]
  492. buffer, an automatic array.  The 9th and subsequent bytes written into this
  493. buffer appear as the value of cmarg2 (if I make the buffer static global the
  494. problem disappears).  Therefore cmarg2 must be pointing at a memory address 8
  495. bytes to the right of this automatic buffer -- but how could that happen?
  496. Searching through doxsend() revealed the following mistake:
  497.   if ((x = cmtxt(m,"",&cmarg2,NULL)) < 0)
  498.     goto xsendx;
  499. This dates from about July 1997 so was present in C-Kermit 6.1 and K95 1.1.14
  500. and later.  The mistake was forgetting that the string pointer returned by any
  501. cm...() routine points to an ephemeral string (in fact it is the atom buffer);
  502. whatever string it points to must be copied to a safe place before calling any
  503. further cm...()'s.  So of course the buffer pointed to by cmarg2 in this case
  504. had probably been recycled 100 times by the time we finally needed it.  The
  505. fix is to treat "send foo bar" exactly like "send /as-name:bar foo", using the
  506. same data structures and buffers, etc, and then setting cmarg2 from them after
  507. the command has been confirmed.  doxsend(): ckuusr.c, 4 Apr 99.
  508. Could this have caused a core dump?  I don't think so.  It just meant that
  509. cmarg2 (the "as-name" pointer) might have been pointing to a random string,
  510. which would result in either (a) a file being sent with the wrong name, or
  511. (b) C-Kermit refusing to send a file because an as-name was given when the
  512. source specification was wild.
  513. Meanwhile, I removed about 400 useless lines from ckuusr.c that were left
  514. behind from before all the SEND-class commands (except PSEND) were routed to
  515. doxsend().  Made a new addsend() routine that consolidates the ADD SEND-LIST
  516. code which was previously scattered all over.  4 Apr 99.
  517. Fixed a bug in ADD SEND-LIST: it wasn't putting the full pathname in the send
  518. list, so if you changed directories, it wouldn't find the files -- or worse,
  519. it would send the wrong ones.  The code to get the full pathname was there,
  520. but it wasn't working right.  This goes all the way back to 6.0.  Fixed in
  521. ckuusr.c, 4 Apr 99.
  522. Made an improvement to ADD SEND-LIST: the file type (text or binary) is
  523. defaulted according to our pattern lists, rather than the prevailing file type
  524. if (a) PATTERNS are ON, and (b) we actually have pattern lists, (c) the
  525. prevailing file type is not IMAGE or LABELED, and (d) the file matches a
  526. pattern.  ckuusr.c, 4 Apr 99.
  527. Fixed a bug I introduced yesterday.  Don't supply default in cm...() functions
  528. when giving help -- only when the field is actually being entered (via field
  529. or command termination or by completion).  Otherwise we get incomplete menus
  530. when the user types "?" -- in fact, the menu only contains one item if a
  531. default was included in the cm...() call.  ckucmd.c, 4 Apr 99.
  532. After all these changes, made sure that SEND, MSEND, MAIL, PSEND, ADD, REMOVE
  533. still work.  Some didn't, but now they do.
  534. Added IF OPEN CONNECTION (fails if remote, gets ttchk() result if local)
  535. and IF OPEN CX-LOG.  ckuus6.c, 4 Apr 99.
  536. The preponderance of "output blah13" in scripts is (a) ugly, (b) confusing
  537. to newcomers, and (c) begs for a command to send a "line", so I added LINEOUT,
  538. which is just like OUTPUT, except it supplies a carriage return at the end
  539. (following Telnet rules, newline settings, etc).  (I thought of calling it
  540. OUTLINE but that means something else).  ckuusr.[ch], ckuus5.c, 4 Apr 99.
  541. Corrections from Jeff to yesterday's code: ckuus5.c, ckucmd.c, ckuusr.h,
  542. 5 Apr 99.
  543. Discovered that when sending from a SEND-LIST, the file type given in the
  544. ADD command was ignored if TRANSFER MODE was AUTO and PATTERNS were ON.
  545. Fixed sfile() to use the file type from the SEND-LIST.  ckcfns.c, 5 Apr 99.
  546. ^C^C^C at Kermit in remote RECEIVE mode was giving an annoying hint message.
  547. Fixed in parser(), ckuus5.c, 5 Apr 99.
  548. Made CLEAR SCREEN a synonym for SCREEN CLEAR.  (Yes, so now we have *four*
  549. commands that do the same thing.)  ckuusr.[ch], 5 Apr 99.
  550. SCREEN { CLEAR, MOVE, CLEOL } doesn't work in IKSD.  I wonder why.  It knows
  551. the terminal type (and TERM is defined).  Maybe tgetent() fails when called
  552. from a process that does not have a tty.  Added some diagnostics.  Also made
  553. the SCREEN command default to using ANSI sequences in UNIX if tgetent() fails.
  554. If this bothers anybody, I'll add SET commands or something.  Otherwise, it'll
  555. be like K95 host mode, which uses ANSI sequences no matter what (actually we
  556. might be able to do better in 1.1.18 -- if it knows the client's terminal type,
  557. it also knows the clear-screen, cleol, and curpos sequences, right?  So then
  558. the SCREEN command could "just work" if the ck_blah() routines were filled in
  559. for the 'sstelnet' case, no matter what the client's terminal type, as long
  560. as it was recognized & supported by K95).  ckuusx.c, 5 Apr 99.
  561. Gerry Belanger reported compilation errors with the new tgetstr() and tputs()
  562. calls.  Problem 1: tgetstr() was called before #include <curses.h>.  The
  563. obvious solution would have been to move the #include higher up, but it turns
  564. out it is where it is for a reason, namely that it clobbers numerous other
  565. symbols that we depend on.  So the actual solution was to extract the tgetstr()
  566. calls to a separate routine and put the new routine below the #include.  Since
  567. there was no point in having it return a value, I made it VOID but then it
  568. wouldn't compile -- eventually I rediscovered that VOID was one of the macros
  569. that <curses.h> clobbers.  Problem 2: tputs() wants a function pointer as its
  570. 3rd arg (OK) but the function must be one that takes an int as a parameter, not
  571. a char.  I was using conoc(), of course, but that takes a char.  So I installed
  572. a stupid interface routine that takes an int, converts it to a char and *then*
  573. calls conoc().  Isn't there a better language than C?  ckuusx.c, 5 Apr 99.
  574. Corrections to new ckuusx.c after trying to compile it on FreeBSD 2.2.7
  575. myself.  ckuusx.c, 6 Apr 99.
  576. Removed the old, commented-out doget() routine, about 250 lines.  ckuus6.c,
  577. 6 Apr 99.
  578. Changed REMOTE HOST and REMOTE KERMIT to copy the cmtxt buffer to a safe place
  579. before use; not strictly necessary, but it's poor practice to take advantage
  580. of this special case.  ckuus7.c, 6 Apr 99.
  581. New VOS network module from Jeff.  cklnet.c, 6 Apr 99.
  582. Added support for Motorola Codex modems.  ckuusr.h, ckudia.c, 6 Apr 99.
  583. Discovered that streaming transfers to C-Kermit on HP-UX 8.00, 9.00, or 10.20
  584. in remote mode do not work at all -- they lose characters galore; this is
  585. probably true, therefore, for all HP-UX versions.  In each case, if I turn off
  586. streaming and reduce the packet-size x window-size to 500, uploads work.  (But
  587. there's no problem with streaming downloads.)  Further experimentation shows
  588. the problem goes away if I tell the remote C-Kermit to "set flow xon/xoff"
  589. prior to transfer.  Evidently the HP-UX Telnet server treats "flow none" as a
  590. request to drop characters, just like VMS.  Pretty silly!  Changed default
  591. remote-mode flow-control for HP-UX from NONE to XON/XOFF (also tested KEEP and
  592. RTS/CTS and neither one works), and updated file-transfer failure hints
  593. accordingly.  ckcmai.c, ckuus5.c, ckermit2.txt, 6 Apr 99.
  594. Changed fsplit() to not require an array argument, in which case it simply
  595. returns the word count.  Also not to require that the array, if specified, be
  596. predeclared -- if it is not, it is created dynamically.  Also to allow an
  597. empty array argument followed by break and/or include arguments.  Also to
  598. work with no arguments at all, in which case it returns "0".
  599. ckuus4.c, 6 Apr 99.
  600. Changed DECLARE with initializers to accept empty subscript brackets in which
  601. case the array is sized according to the number of initializers (like C) --
  602. including none at all.  Also changed DECLARE to evaluate the initializers
  603. rather than copy them literally -- otherwise there would be no way to
  604. initialize an array element to the value of a variable, rather than its name.
  605. This way, a literal name can still be given according to normal rules,
  606. e.g. "dcl &a[] = \%a ..."  ckuusr.c, ckermit2.txt.  6 Apr 99.
  607. Auth stuff & help text from Jeff: ckcmai.c, ckuus2.c, ckuath.c, ckcssl.h,
  608. 7 Apr 99.
  609. Added date-time format info to HELP DATE and then added a reference to this
  610. from all other HELP texts that involve date/times.  ckuus2.c, 7 Apr 99.
  611. Added [wk]ermit to UNIX binary patterns.  ckcmai.c, 7 Apr 99.
  612. Increased the command buffer length from 10K to 64K for (BIGBUFOK + not NOSPL)
  613. builds.  This allows for longer strings, macros, etc.  Tested wermit10k
  614. against wermit64k running ckedemo.ksd (minus the interactive parts) side by
  615. side on the same computer under various loads (this is a compute-bound script
  616. with no i/o).  wermit64k is 10% to 30% slower under various loads.  In 21
  617. trials, wermit10K was faster than wermit64K 19 times and the same 2 times; on
  618. average the wermit10k version was 19.7% faster.  Changing the buffer to 32K
  619. reduces the difference to a fairly constant 10%.  The big hit in all cases
  620. comes in the evaluation of recursive user-defined functions (because we have
  621. to replicate the command buffers for every level of recursion).  If we remove
  622. the recursive function from the script, there is no difference in execution
  623. time among the three versions.  So... whereas:
  624.  . There will always be SOME limit on string length;
  625.  . Most people will never write or use a recursive function;
  626.  . Other script languages like DCL have a 32K limit;
  627.  . 64K is (more) likely to cause trouble on segmented architectures;
  628.  . In SunOS at least the buffer size doesn't affect the executable size;
  629.  . Kermit is a very high level language so scripts are relatively short;
  630.  . Nobody has complained about the 10K restriction on script length;
  631.  . Long macros can always be decomposed anyway;
  632.  . The only complaint has been about the max length of a variable's value;
  633.  . It would be a bad idea to add a runtime SET command for this (since it
  634.    would pull the rug out from under the very command parser that was
  635.    parsing it)...
  636. ... I changed the buffer length to (32K - 1).
  637. Added v(inwait) = timeout value of most recent INPUT command.  ckuusr.h,
  638. ckuus4.c, 7 Apr 99.
  639. Defined a bunch of switches to the DELETE command to make it more consistent
  640. with DIRECTORY, PURGE, and SEND.  ckuusr.h, ckuus6.c, 7 Apr 99.
  641. Filled in the DELETE switch definitions:
  642.   /LIST = /LOG = /VERBOSE    (These were there before but I redid them)
  643.   /NOLIST = /NOLOG = /QUIET  (ditto)
  644.   /[NO]HEADINGS
  645.   /[NO]DOTFILES
  646.   /[NO]PAGE
  647.   /EXCEPT:<exception-list>
  648.   /BEFORE:<date>, /NOT-BEFORE:<date>, /AFTER:<date>, /NOT-AFTER:<date>.
  649. And added SET OPTIONS DELETE and added DELETE options to SHOW OPTIONS.
  650. Still needs fine tuning, help text, and maybe a few more switches, etc.
  651. ckuus[356].c, 7 Apr 99.
  652. From Jeff, IKSD fixes:
  653.  . initialize socket for non-blocking I/O and OOB inline
  654.  . correct handling of CKXPRINTF definitions in ckuusx.c that was
  655.    resulting in data corruption on encrypted sessions.
  656.  . Many corrections to data transfer and negotiations for SSL/TLS
  657.  . Traced further data corruption on encrypted sessions to the
  658.    output of informational messages to the socket during negotiations.
  659.    The messages were meant for the end user but when IKSD is being
  660.    used they should be skipped.  Solves lots of miscellaneous issues.
  661.  . Discovered that when DES is not available from K95CRYPT.DLL and
  662.    not exported from the Kerberos DLLs we can't performed Mutual
  663.    authentication.  I'm not sure whether we care or not at the
  664.    present time.
  665.  . Do not initialize Telopt negotiation defaults until after sysinit()
  666.    so that we can make responsible choices based upon installed
  667.    libraries.
  668. Plus: The ckgetpid() prototype should not be #ifdef CKGETPID, corrections for
  669. Stratus.  ckcmai.c ckuusr.h ckuus6.c ckutio.c ckuath.c ckctel.c ckcnet.c
  670. cklnet.c ckuusx.c, 8 Apr 99.
  671. Later...  The Stratus version builds!  (Dat Thuc Nguyen built it with TCP/IP
  672. and X.25 support on two architectures.)
  673. Parameterized fileselect() and moved it to ckclib.  ckcfns.c, ckclib.[ch],
  674. 8 Apr 99.
  675. Changed DELETE to use fileselect().  ckuus6.c, 8 Apr 99.
  676. Added cmgkwflags() to get keyword flags after successful cmkey() parse.
  677. This makes it much easier to check if a switch requires an argument.  Added
  678. appropriate calls everywhere (or at least most places) switches are parsed.
  679. ckucmd.[ch], 8 Apr 99.
  680. Today's project is to make SEND, DIRECTORY, DELETE, and PURGE use the same
  681. set of file-selection switches, and then use fileselect() based on them:
  682.  DIRECTORY:
  683.   /[NOT-]{BEFORE,AFTER},/LARGER,/SMALLER,/EXCEPT.
  684.  DELETE:
  685.   /[NOT-]{BEFORE,AFTER},/LARGER,/SMALLER,/EXCEPT.
  686.  PURGE:
  687.   /[NOT-]{BEFORE,AFTER},/LARGER,/SMALLER,/EXCEPT,/[NO]DOTFILES,/[NO]HEADING
  688. Also added /SIMULATE to DELETE and PURGE for testing / previewing.  Also Added
  689. /ASK to DELETE and PURGE (like "rm -i") because people ASKed for it; this
  690. required adding a "quit" option to getyesno().  ckcfns.c ckclib.c ckclib.h
  691. ckcpro.c ckucmd.c ckucmd.h ckuus3.c ckuus5.c ckuus6.c ckuus7.c ckuusr.c
  692. ckuusr.h ckuusx.c ckermit2.txt.  8 Apr 99.
  693. From Jeff -- corrections to yesterday's work, plus pseudoimplementation of
  694. the Telnet LFLOW option.  ckctel.c, ckcnet.c, ckuusr.h, ckuus[r36].c, ckucmd.c,
  695. 9 Apr 99.
  696. Added /QUIET /VERBOSE (and their synomyms) to COPY and RENAME, for the benefit
  697. of script writers who want to provide visual feedback easily.  ckuus6.c,
  698. 9 Apr 99.
  699. Added SET DIAL METHOD AUTO and made it the default.  This means that if Kermit
  700. knows your local country code, and it is on the list of countries in which
  701. tone dialing is universally available, tone dialing is used automatically.
  702. The initial list includes North America, the UK, Germany, and Sweden.  There
  703. is also a list for countries in which pulse dialing is required (initially
  704. empty).  Also added SET DIAL { TONE-COUNTRIES, PULSE-COUNTRIES } to modify the
  705. lists, and updated SHOW DIAL to show the lists.  Also allow setting of dial
  706. method from K_DIAL_METHOD environment variable.  ckuusr.h, ckuus[346].c,
  707. ckudia.c, ckermit2.txt, 9 Apr 99.
  708. IKSD login fix for AIX (and probably others) from Jeff.  ckufio.c, 9 Apr 99.
  709. Added Finland to tone-dialing default list.  ckudia.c, 11 Apr 99.
  710. Added prototypes for tn_sxdisploc() and tn_sndloc() to ckctel.h, 11 Apr 99.
  711. Added a default: break; case to a switch statement that has no cases if
  712. none of {AUTH,CRYPT,IKSD} are defined.  ckctel.c, 11 Apr 99.
  713. Changed date/time parsing to allow YESTERDAY, TODAY, TOMORROW, + or - <number>
  714. { DAYS, WEEKS, MONTHS, YEARS }.  This affects all date fields and switches (so
  715. you can say, for example, "delete /before:today *" or "send /since:yes *"), the
  716. DATE command, and also the date-related functions, particularly fcvtdate().
  717. ckucmd.c, ckermit2.txt, 11 Apr 99.
  718. Minor corrections to yesterday's date work after more testing.  ckucmd.c,
  719. 12 Apr 99.
  720. Added HELP PURGE, HELP DELETE.  Updated HELP DATE text to show new options.
  721. ckuus2.c, 12 Apr 99.
  722. Removed trailing blanks & tabs from just about every source file.  12 Apr 99.
  723. Oops, the trimming was done with the EMACS "trim" command, which has the
  724. unfortunate side effect of also tabifying the file, even the insides of string
  725. constants.  Put 'em all back the way they were before, then wrote a trim
  726. program that trims trailing whitespace from all the files in its arglist
  727. without messing with tabs.  Checked to make sure HELP and SHOW text is still
  728. formatted correctly.  All modules, 12 Apr 99.
  729. Updated HELP text for other changes since Beta.05 that had not yet been
  730. reflected in the HELP command.  ckuus2.c, 12 Apr 99.
  731. Fixed date arithmetic to handle years prior to 1000, but only back to 0.
  732. Negative years (or years after 9999) are not handled due to limitations of the
  733. fixed yyyymmdd notation.  ckucmd.c, 12 Apr 99.
  734. Fixed parser foulups when editing back into a /SINCE, /BEFORE (etc), or
  735. /EXCEPT switch in domydir(), dodel(), and dopurge().  Also Fixed PURGE and
  736. DELETE /SIMULATE to automatically select /LIST also, since what's the point
  737. otherwise?  Also added the PURGE and DELETE defaults to the SHOW OPTIONS
  738. display.  ckuus[67].c, 12 Apr 99.
  739. Adjustments to make -DNOICP builds work.  ckuus[4y].c, ckucns.c, ckcnet.c,
  740. 12 Apr 99.
  741. Fixed another problem in fsplit(), in which it wasn't dealing correctly with
  742. the no-array-specified case.  ckuus4.c, 13 Apr 99.
  743. From Jeff: Kerberos ticket auto-delete/destroy: ckcnet.c ckcnet.h ckuath.h
  744. ckuus2.c ckuus3.c ckuus7.c ckuusr.h ckuusx.c, 13 Apr 99.
  745. Fixed messed-up spacing in ckcpro.c because of tabification of ckwart.c that
  746. was not undone yesterday.  ckwart.c, 13 Apr 99.
  747. Increased sizes of INPUT buffer, TAKE and DO stacks, and some other stuff for
  748. BIGBUFOK builds.  ckuusr.h, 13 Apr 99.
  749. When C-Kermit was in CONNECT mode and the Kermit on the far sent an I packet,
  750. causing the local Kermit to enter server mode automatically, and then sent a
  751. FINISH request, the local Kermit would return to its prompt rather than
  752. resuming CONNECT mode.  Diagnosis: the FINISH handler never set the success
  753. variable, so the autodownload code thought a transfer had failed and therefore
  754. deliberately did not resume CONNECT mode so the user could see the error
  755. message.  Solution: the server should set success = 1 when a FINISH has been
  756. executed successfully.  ckcpro.w, 13 Apr 99.
  757. Bug: A command file makes a connection, then if success takes a command file
  758. and then CONNECTs.  The command file defines a macro that includes an ASK
  759. command and assigns it to a key.  User presses key, and ASK reads a linefeed
  760. that was "pushed" by the command parser due to its command state.  Attempted
  761. to work around by setting a global flag, "askflag", whenever ASK, ASKQ, GETOK,
  762. etc, are active, to bypass the pushing (and therefore also the popping).
  763. Can't test in C-Kermit because no Kverbs, but at least it seems to do no harm;
  764. needs to be tested in K95.  ckucmd.c, ckuus[56].c, 13 Apr 99.
  765. Eliminated a bunch of unresolved references at link time for NOICP builds
  766. by shuffling declarations & #ifdefs.  Various modules, 13 Apr 99.
  767. SSL/TLS changes from Jeff.  ckcnet.c, ckutio.c, ckcssl.h, 14 Apr 99.
  768. Jeff fixed my fix to the ASK bug.  ckucmd.c, 14 Apr 99.
  769. Added Netherlands & Belgium to tone-countries list.  ckudia.c, 14 Apr 99.
  770. Made NOICP imply NODIAL, since there's no way to dial if there is no
  771. interactive command parser.  This eliminated various unresolved references
  772. at link time.  Also made NOICP imply NOCKXYZ (no external protocols), since
  773. there is no way to choose them without an interactive command parser.
  774. ckcdeb.h, 14 Apr 99.
  775. Moved declaration of noprinter from ckuus3.c to ckcmai.c for NOICP.  14 Apr 99.
  776. Now that I can build a NOICP version, I checked command-line option processing.
  777. As suspected, items handled by prescan() were not being handled in the NOICP
  778. build.  Rearranged prescan() code and calls to make everything work.  ckcmai.c,
  779. ckuus4.c, 14 Apr 99.
  780. The NOICP version did not handle the "command-line personalities" business
  781. (e.g. act like Telnet if called Telnet).  Fixed by juggling #ifdefs in
  782. ckcmai.c, 14 Apr 99.
  783. However, when a NOICP version of Kermit is called Telnet, there is no way for
  784. it to transfer files: no file-transfer command-line options, no command parser
  785. to escape back to, and autodownload doesn't work because it depends on having
  786. a command parser.  For UNIX/NOICP only, I implemented autodownload by having
  787. the CONNECT module call proto() directly.  ckcker.h, ckucns.c, 14 Apr 99.
  788. The NOICP telnet client can send files fine (via autoupload/server), but can't
  789. receive them.  It goes into receive mode but then fails to advance its packet
  790. number and ACKs packet 1 with ACK(0).  The sequence number in the ACK is
  791. winlo, which the debug log shows is set to 1 at this point.  Further debugging
  792. shows that winlo is reset to 0 when rcvfil() calls zfnqfp().  However, adding
  793. debug() calls within zfnqfp() made the problem go away.  Hours later, the aha
  794. experience: zfnqfp() itself was not the culprit -- it was the parameters
  795. passed to it by rcvfil().  Very non-obvious: we were writing into the fspec[]
  796. buffer using CKMAXPATH as the max length.  However, fspec[] was sized to CMDBL
  797. if NOMSEND was defined, which happens when NOICP is also defined.  Normally
  798. CMDBL is (much) longer than CKMAXPATH, but in the NOICP case, CMDBL
  799. (command-buffer length) is 508, whereas CKMAXPATH (on the platform in
  800. question, at least) is 1024.  Since we were using strncpy() to write the
  801. results into the buffer, and since (at least this version of) strncpy()
  802. right-pads with NULs all the way the end of its destination buffer based on
  803. the given length, this wrote all over memory.  Fixed by setting a variable,
  804. fspeclen, to the length of the fspec[] buffer, and using that in all
  805. references to its length, rather than CKMAXPATH.  I don't think this
  806. particular problem would ever have occurred before today, but there were many
  807. other places where fspec[] was the object of a strncpy() (directly, or
  808. indirectly thru zfnqfp()), and any of these might have been the source of a
  809. memory leak, since some of them specified CMDBL as the length and others
  810. CKMAXPATH.  Fixed in ckuus[r46x].c, ckcfn[s3].c, ckcpro.w, 14 Apr 99.
  811. Why does rcvfil() call zfnqfp() and then <rfile>F also calls it after calling
  812. rcvfil()?  Changed <rfile>F to use fspec[], which rcvfil() always sets.  This
  813. eliminates the redundant call to zfnqfp().  ckcpro.w, 14 Apr 99.
  814. Anyway, after all this, it is possible to build a NOICP version of Kermit
  815. that can upload and download files (but since it has no user interface, file
  816. transfer must always be initiated by the remote via autoup/download).
  817. More SSL changes from Jeff: ckcnet.c, ckutio.c, 14 Apr 99.
  818. Juggled #ifdefs & declarations to make "sunos41x" build.  ckcfns.c, ckuusx.c,
  819. ckutio.c, 14 Apr 99.
  820. Did the same for some other builds on SunOS:
  821.   sunos41gcc:    1.3MB <-- Full build for SunOS with gcc.
  822.   ditto+NODEBUG: 1.1MB <-- Full build but no debugging.
  823.   sunos41m:      229KB <-- Command-line only - no interactive commands.
  824.   ditto+NOLOCAL: 212KB <-- Ditto, remote only.
  825.   sunos41mi:     377KB <-- Minimum interactive - no script language.
  826.   ditto+NOLOCAL: 360KB <-- Ditto, remote only.
  827.   NOXFER:        917KB <-- Full scripting & comms but no file transfer.
  828.   NOXFER+NOICP:  229KB <-- Communications only - no scripting or file transfer.
  829. Many modules affected.  14 Apr 99.
  830. Some fallout from the April 3rd work regarding application of defaults for
  831. missing command fields -- Peter E noticed that on HP-UX, "echo" by itself
  832. would print some garbage.  Sigh, cmtxt() and some of the other functions were
  833. returning a pointer to an automatic array in this case, which of course is
  834. likely to be pointing to something else after the function exits.  Fixed in
  835. ckucmd.c, 15 Apr 99.
  836. Fix from Jeff for K95 not finding its init file under certain conditions.
  837. ckuus5.c, 15 Apr 99.
  838. If VMS C-Kermit received a file whose name contained any parts that were more
  839. than 39 chars long, the transfer would fail because zmkdir()'s sys$parse()
  840. call failed with "Bad filename" (RMS$_FNM).  Changed VMS zmkdir() to ignore
  841. this error.  There is still a potential problem with an illegal name given by
  842. the user as an as-name, but that's easily overcome by not giving an illegal
  843. name (we don't run as-names thru nzrtol() on purpose, because we want the user
  844. to be able to have the final word).  ckvfio.c, 15 Apr 99.
  845. Implemented PURGE the cheap way for VMS -- as a built-in macro that calls DCL
  846. PURGE.  ckuus[r257].c, ckermit2.txt, 15 Apr 99.
  847. Changed v(model) in HP-UX to not run the "model" command.  This was bad
  848. because (a) running external programs is a no-no in captive environments like
  849. IKSD and when nopush is in effect, and (b) because a frequent result of
  850. running "model" is the string "not found".  Now we treat HP-UX like any other
  851. UNIX and have v(model) return the machine name from uname() if the model
  852. has not been filled in (some uname() implementations fill it in, some don't).
  853. ckuus4.c, 15 Apr 99.
  854. Verified that I can send to C-Kermit on HP-UX 8.00 on a Telnet connection with
  855. streaming (since we now default to Xon/Xoff in HP-UX for remote mode).  This
  856. is to an HP-9000/385 about 3000 miles from here.  As noted in the beware file,
  857. this kind of transfer is painfully slow.  Bypassing the Telnet server with
  858. "set host *" gets 10 times the speed.
  859. Juggled some more #ifdefs in ckctel.h to make sure we don't have switch
  860. statements with no non-default cases.  15 Apr 99.
  861. Peter E reported various other problems with HP-UX 8.00.  First, that Kermit
  862. thought it was in the background after escaping back from CONNECT.  He says
  863. this started happening during the Beta.04+ period.  But the code related to
  864. background testing hasn't changed in a very long time.  Anyway, I was able
  865. to fix it by observing that the conbgt() "signal test" was finding its old
  866. SIGINT handler was SIGN_IGN, which it takes to be a sign of backgroundness,
  867. so I switched the conint() and concb() calls that are done before calling
  868. conbgt() after returning from CONNECT (but only for HPUX8).  Not very
  869. satisfying, since it doesn't address the real cause -- whatever it is.
  870. doconect(): ckuus4.c, 15 Apr 99.
  871. While I was at it, I went to build an optimized version on HP-UX 8.00 and saw
  872. (as Peter had reported) that ckuusr.c takes forever to compile, so I went to
  873. the hpux80 makefile entry and did the trick to make it build this module
  874. without optimization -- the same trick that was already there for ckcpro.c.
  875. But then I noticed that not all of the CFLAGS had been copied into the ckcpro
  876. section -- which might very well explain numerous peculiarities in the HP-UX
  877. 8.00 version.  So I changed the hpux80 entry to have consistent CFLAGS.
  878. makefile, 15 Apr 99.
  879. Warnings occur on HP-UX 10.20 ANSIC-C builds 10 about lines 4091, 4114, and
  880. 4136 in ckuusx.c: too bad.  The warnings come from calls to tputs(), whose
  881. third argument is supposed to be a pointer to a function that (a) has a
  882. certain return type (such as int or void), and (b) takes a certain type of
  883. argument (such as int or char).  "man tputs" says one thing, but the
  884. prototypes in curses.h and term.h each contradict the man page -- and each
  885. other.  No combination of int/int, void/int, int/char, etc, would shut the
  886. warnings up.  Despite the warnings, however, the code works fine, so no
  887. changes.
  888. In anticipation of lots more trouble with tputs(), made all references to
  889. its return type and its argument type symbolic: TPUTSFNTYPE and TPUTSARGTYPE,
  890. with default definitions of int and int; these can be overridden on the
  891. cc command line.  ckuusx.c, 16 Apr 99.
  892. Improved SEND/RECEIVE/GET failure hints a bit.  ckuus5.c, 16 Apr 99.
  893. "get /etc/hosts x.x" did not work if both Kermits had PATHNAMES ON.  In this
  894. case zchko() was being called on the packet name rather than the as-name.
  895. Fixed in rcvfil(): ckcfns.c, 16 Apr 99.
  896. Dat Thuc Nguyen had problems debugging a script involving fsplit().  It soon
  897. became apparent that the real problem was the lack of informative error
  898. messages.  So I changed the way SET FUNCTION DIAGNOSTICS and SET FUNCTION
  899. ERROR work so they stand a chance of doing some good without people having to
  900. know about these commands in advance:
  901.  . FUNCTION ERROR is now ON by default, rather than OFF.
  902.  . FUNCTION DIAGNOSTICS, rather than FUNCTION ERROR, now governs whether
  903.    an error message is printed when a function fails.
  904. I also added an array-index-out-of-bounds error for fsplit() (to cover the
  905. case where it is called with a predeclared array).
  906. In checking these changes, I discovered that local arrays become global if
  907. there is no global copy of the same array.  For example:
  908.   define xx {
  909.     local &a[] = one two three
  910.     show array a
  911.   }
  912.   xx
  913.   show array a
  914. The second "show array a" shows the local array which should have been
  915. destroyed when xx finished instead of saying "?Array not declared".
  916. Diagnosis: popclvl() had no way of knowing whether a local-array pointer was
  917. NULL because no array of that name had been declared at that level (in which
  918. case it should leave the global definition alone) or because there was no
  919. global definition originally (in which case it should delete the current
  920. definition).  This was handled by pushing a "secret code" on the
  921. local-variable stack for this array.  dolocal(), pusharray(), popclvl():
  922. ckuus5.c, 16 Apr 99.
  923. Also discovered that popping local arrays off the stack never worked at any
  924. level unless scalar variables were also on the stack at the same level.
  925. Fixed in popclvl(): ckuus5.c, 16 Apr 99.
  926. More authentication / encryption changes from Jeff: ckcnet.h, ckuusr.h,
  927. ckuus[37].c, 16 Apr 99.
  928. More authentication / encryption changes from Jeff: ckcnet.h, ckuusr.h,
  929. ckuus7.c, 17 Apr 99.
  930. HP-UX 8.00 adjustments to makefile, 17 Apr 99.
  931. Plus more HP-UX adjustments to makefile from Peter E, 17 Apr 99.
  932. Fixed unbalanced quotes in the sco32v4netgcc makefile entry, 17 Apr 99.
  933. Further improvements to GET-class command failure hints.  They're obnoxious,
  934. but they're pretty useful.  ckuus5.c, 17 Apr 99.
  935. For months, I've been hearing of a problem with the fullscreen file-transfer
  936. display in VMS but was never able to reproduce it.  Finally I got the needed
  937. hint -- it happens only when autouploading.  The problem occurs when we use
  938. printw() to write on the bottom screen line.  For some reason, only when
  939. autouploading (go figure), an extra CRLF comes out and pushes all the labels
  940. up one line.  The stupid solution was to not write on the bottom line (in VMS
  941. only).  ckuusx.c, 17 Apr 99.
  942. Tried to give VMS C-Kermit the ability to send "keepalive" packets while in
  943. server mode executing a subprocess that takes a long time to produce output
  944. (as the UNIX version can -- see notes from Oct 25).  I made the VMS
  945. get_subrc_line() routine do a timed read and then added all the appropriate
  946. tests, return codes, etc.  It doesn't break anything; REMOTE HOST commands
  947. still work fine.  But the timeout feature doesn't work.  To test, put VMS C-K
  948. in server mode and then tell the client "remote host wait 00:00:30".  VMS C-K
  949. is supposed to send back an empty data packet every second but it doesn't.
  950. The debug log shows that it does indeed return a timeout indication, but only
  951. after the subprocess exits.  ckvfio.c, 17 Apr 99.
  952. Notes on the Beta.06 build-all...
  953.  . After building on each platform, I transferred a 3MB binary file to the
  954.    remote just-built version to make sure the default FLOW /REMOTE selection
  955.    was appropriate.  Some of these transfers exceeded 500000 cps -- through
  956.    the Telnet server!  (Results: only HP-UX and VMS need Xon/Xoff; all the
  957.    others work OK with NONE.)  Then I used the same new binary to make a
  958.    Telnet connection back to here and send itself, thus testing the network
  959.    code, file-sending code, etc, as well as the fullscreen file-transfer
  960.    display.  Also Ctrl-L or "cls" was typed at the C-Kermit> prompt to
  961.    ensure the new SCREEN code works.
  962.  . On HP-UX versions where I had access to a serial port, I made sure I
  963.    could CONNECT to the port and escape back, and still have a prompt.
  964.    The mixup with SIGINT is apparently peculiar to HP-UX 8.00.  This is
  965.    handled by adding -DCKCONINTB4CB to CFLAGS.  It was not needed in
  966.    HP-UX 5.21 or 10.20.  Don't know yet about 6.x, 7.x, or 9.x.
  967.  . Discovered that you must SET PREFIXING ALL when sending binary files
  968.    thru the Ultrix Telnet server.  Made a note in ckubwr.txt.
  969.  . Digital UNIX (both 3.2 and 4.0) gets a segmentation fault when calling
  970.    tgetstr() (yes, after a successful call to tgetent()).  Curses works, but
  971.    termcap calls don't.  Added -DNOTERMCAP and supporting code to avoid these
  972.    routines, and added -DNOTERMCAP to the DU entries.  I guess they really
  973.    mean it when they say in the man page that these are "old" routines and
  974.    you should use curses instead.  ckuus[5x].c, makefile, 17 Apr 99.
  975.  . NOTE: In case anybody wants to look into a better workaround for tgetstr()
  976.    in DU, note that DU's curses.h says "#define tgetstr _bsd_tgetstr", but
  977.    then the latter doesn't appear in any header files or man pages I can find.
  978.    Also the DU 3.2 and DU 4.0 man pages disagree on the calling conventions
  979.    (even though the header files show the normal ones).
  980. Next day...  Spent a few more hours on the OSF/1 tgetstr() problem to no
  981. avail.  A short test program that calls tgetent(), tgetstr(), and then
  982. tputstr() works OK, but the exact same sequence in C-Kermit gets the
  983. segmentation fault.  The difference is probably due to some conflict or
  984. confusion in the many more header files included by ckuusx.c than by the short
  985. test program (which includes only curses.h).  There's all kinds of crazy stuff
  986. going on in OSF/1 curses.h that is obviously extremely sensitive to what other
  987. symbols have been defined, what universes we're in, etc.  No amount of
  988. finagling helped, not #including <term.h> before <curses.h>, not calling
  989. _bsd_tblah() explicitly, not #undefing the tgetstr (etc) macros, etc, so I
  990. left the NOTERMCAP definition in place.  Very unsatisfying.  18 Apr 99.
  991. Further build-all observations:
  992.  . Streaming transfers into AIX 4.2 or 4.3 (through the AIX Telnet server)
  993.    consistently failed, when exactly the same kind of transfers into AIX 4.1
  994.    worked without incident.  The error reported by AIX is "interrupted system
  995.    call".  Changing flow control, packet length, prefixing, parity, etc, makes
  996.    no difference.  Streaming transfers work perfectly, however, if the AIX
  997.    Telnet server is removed from the picture (e.g, by using "set host * 3000"
  998.    on AIX, or by using Rlogin instead of Telnet).  They also work perfectly if
  999.    the Telnet connection is forced into binary mode (C-Kermit command "set
  1000.    telopt requested requested").  (But oddly enough, transfers are much slower
  1001.    through the Rlogin server or the binary-mode Telnet server than through
  1002.    the same Telnet server in NVT mode.)  Otherwise "set streaming off" does
  1003.    the trick.
  1004. Finally figured out how to squelch ANSI compiler warnings from HP-UX 9 and 10
  1005. about tputs().  makefile, ckuusx.c, 18 Apr 99.
  1006. Added -DDCLGETCWD to sco234* entries.  makefile, 18 Apr 99.
  1007. Added prototype for pusharray() to ckuusr.h, 18 Apr 99.
  1008. ---Beta.06---
  1009. From Lucas Hart: Proper implementation of timed reads for pipes (mailboxes)
  1010. in VMS, allowing REMOTE HOST keepalive.  ckvfio.c, 19 Apr 99.
  1011. Somehow in all these years I never heard of the UNIX realpath() function.
  1012. Changed zfnqfp() to use it if CKREALPATH defined.  It does what zfnqfp() does
  1013. (including all the "../.././../" stuff) plus resolving symlinks.  We'll see
  1014. how portable it is in the next build-all.  So far it's OK on Sun, HP-UX 10,
  1015. and SCO OSR5.  ckufio.c, ckcdeb.h, 22 Apr 99.
  1016. Added -DCKCONINTB4CB to all HP-UX 7.xx makefile entries.  23 Apr 99.
  1017. Added sys3upcgfd target, from Peter Mauzey.  makefile, 23 Apr 99.
  1018. From Jeff, 23 Apr 99:
  1019.  . Corrections to X.25-but-no-TCP builds: ckctel.c.
  1020.  . SET TELNET TRANSFER-MODE: ckuusr.h, ckuus[23].c, ckctel.c, ckcpro.w.
  1021.  . v(authstate), f(krbflags), ckuusr.h, ckuus4.c.
  1022.  . IKSD login/auth improvements: ckcmai.c.
  1023.  . Fixes to command-line/command-file botches from kerbang changes: ckcmai.c.
  1024.  . Make Telnet Option keywords not depend on #ifdefs: ckuus3.c.
  1025.  . Various other auth/crypt changes: ckuat[h2].[ch], ckuus7.c.
  1026. From Martin Whitaker, 23 Apr 99:
  1027.  . Fixes for OS-9: ck9fio.c, ckuus5.c.
  1028.  . Bad IF stmt in doxconn(): "if (xx = ttchk() < 0) dologend();"
  1029.    Should be: "if ((xx = ttchk()) < 0) dologend();"
  1030.  . Ditto in dodial(): "if (y = conchk() > 0)" -> "if ((y = conchk()) > 0)"
  1031.  . ttnet not found at link time in no-network builds.  ckcnet.c.
  1032.    (Why is #ifdef CK_LOGIN commented out around that big section in ckcmai?)
  1033.    (Maybe it should be #ifdef something else?)
  1034. Regular and -DNONET builds on SunOS were OK.
  1035. Fixed fsplit() not to dump core if given an empty string. ckuus4.c, 23 Apr 99.
  1036. Changed SET LINE to not print open() failure message if QUIET ON and SET LINE
  1037. command not given from prompt.  This makes the GETLINE script run smoother.
  1038. ckuus7.c, ckutio.c, 23 Apr 99.
  1039. Put QUIET variable (quiet) on the command stack, so a macro or TAKE file can
  1040. SET QUIET ON or OFF without affecting its caller.  This was done differently
  1041. from the other stackable settings (like INPUT CASE, etc) since the 'quiet'
  1042. variable is used in so many places, even in modules that must not have any
  1043. notion of such things as a command stack.  This way the quiet variable can
  1044. be used just as it always was; only those routines that change command level
  1045. need to be concerned with pushing and popping it.  ckuus[356].c, 23 Apr 99.
  1046. Added IF QUIET so scripts can test SET QUIET setting when printing messages.
  1047. ckuusr.h, ckuus6.c, 23 Apr 99.
  1048. Changed DIAL to cancel automatic redialing if call failed because no dialtone.
  1049. ckuus6.c, 23 Apr 99.
  1050. Added the following dial-modifier variables:
  1051.  v(dm_lp) Long pause
  1052.  v(dm_sp) Short pause
  1053.  v(dm_pd) Pulse dial
  1054.  v(dm_td) Tone dial
  1055.  v(dm_wa) Wait for answer
  1056.  v(dm_wd) Wait for dialtone
  1057.  v(dm_rc) Return to command mode
  1058. The modifier strings are obtained by calling getdm() in ckudia.c.
  1059. ckuusr.h, ckuus4.c, ckudia.c, 23 Apr 99.
  1060. Added /HEAD:n and /TAIL:n switches to TYPE.  ckuus[r256].c, 23 Apr 99.
  1061. Fixed TYPE /TAIL:n to work when n > file lines.  ckuus6.c,24 Apr 99.
  1062. Added TYPE /MATCH:pattern -- like grep (but only works for one file).  And
  1063. TYPE /WIDTH:cols, for truncating lines (e.g. to prevent wraparound).  Added
  1064. TYPE /PREFIX:string to put any desired string at the head of each line.  Added
  1065. TYPE /COUNT to only count (matching) lines, but not print them - like "wc -l".
  1066. Added /WIDTH:n to SET/SHOW OPTIONS TYPE.  ckuusr.[ch], ckuus6.c,24 Apr 99.
  1067. Added:
  1068.  v(ty_ln)  TYPE line number
  1069.  v(ty_lc)  TYPE line count
  1070.  v(ty_mc)  TYPE match count
  1071. v(ty_ln), or any other variable(s), can be used with TYPE /PREFIX.  Examples:
  1072.   TYPE /PREFIX:{v(time): }   <-- puts time of TYPE command on each line.
  1073.   TYPE /PREFIX:{\v(time): }  <-- puts current, running time on each line.
  1074.   TYPE /PREFIX:{\v(ty_ln): } <-- puts line number on each line.
  1075.   TYPE /PREFIX:{\flpad(\v(ty_ln),3): } <-- Ditto, right-adjusted.
  1076. After a TYPE command, SHOW VAR TY gives the statistics: line count of file,
  1077. plus count of lines that matched if a pattern was given.
  1078. ckuusr.h, ckuus4.c, 24 Apr 99.
  1079. Improved parsing of Windows Printer Queue name from Jeff.  ckuus3.c, 24 Apr 99.
  1080. Brought ckermit2.txt up to date.  24 Apr 99.
  1081. From Jeff: missing default return for getdm().  ckudia.c, 26 Apr 99.
  1082. With hints from Lucas Hart, fixed the Digital UNIX termcap problem from April
  1083. 18th.  Once again, the problem derived from referring to a termcap/terminfo
  1084. function (in this case tgetent()) before the <curses.h> include.  The solution
  1085. was to move fxdinit() to below the #include.  Verified on DU 3.2 and 4.0.
  1086. ckuusx.c, 26 Apr 99.
  1087. Defined NOREALPATH for HP-UX 8.00 and earlier.  Verified that realpath() is OK
  1088. in HP-UX 9 (and we already knew about 10).  ckcdeb.h, 26 Apr 99.
  1089. From Jeff, fix IKSD login to not assume anonymous if we don't know who the
  1090. user is after authentication (mainly for TLS).  ckcmai.c, 26 Apr 99.
  1091. Using unsigned chars for buffers and pointers in dotype() caused all sorts of
  1092. stupid mindless fascist warnings to spew forth from picky compilers, so I made
  1093. the offending items regular (signed) char instead.  Can I still TYPE 8-bit
  1094. text files on platforms where C-Kermit can't be built with -funsignedchar?
  1095. Seems OK on HP-UX 10.20.  Time will tell about the others.  Checked to see
  1096. whether HP-UX ANSI compiler has an option to treat all chars as unsigned (it
  1097. doesn't).  ckuus6.c, 26 Apr 99.
  1098. Fixed declaration/ifdef glitches for VOS x25-but-no-tcpip build.  cklnet.c,
  1099. ckuscr.c, ckuus4.c, 26 Apr 99.
  1100. When executing Kerbang scripts, the console was not in cbreak mode, so
  1101. askmore() didn't work normally.  That's because concb() was called only when
  1102. C-Kermit reached top level (e.g. after executing the init file).  But now
  1103. we're executing ASK[Q], GETOK, GETC, and askmore() without ever reaching top
  1104. level, so I added concb() calls for all these.  ckuus[56].c, 26 Apr 99.
  1105. From Jeff: Fix for END given at top level trying to free stuff that was never
  1106. malloc'd.  ckuusr.c, 27 Apr 99.
  1107. Changed DIAL to cancel automatic redialing if call failed because of a
  1108. dialing directory error, access is forbidden, blacklisted, or locked.
  1109. ckuus6.c, 27 Apr 99.
  1110. From Lucas Hart: Fix gcc warnings in VMS gftimer(), ckvtio.c; add missing
  1111. #define for cklongjmp() in one of the #ifdef cases in ckcsig.h.  27 Apr 99.
  1112. In working on REVIEW 2.0 (one of our demo scripts) I discovered a subtle but
  1113. annoying problem: although the &_[] array could be accessed at top level,
  1114. and in an IF command, and in a FOR loop, it could not be accessed in a FOR
  1115. loop that was inside an IF statement.  Similarly, the v(argc) variable was
  1116. clobbered inside a FOR loop.  It seems the _GETARGS command was not quite
  1117. completely implemented.  Also, one critical step was lacking from addmac().
  1118. Both fixed in ckuus[56].c, 27 Apr 99.
  1119. Added v(maclevel), mainly for debugging.  ckuusr.h, ckuus4.c, 27 Apr 99.
  1120. The following (new) construction did not work:
  1121.   if ( condition ) { commands } else if defined %x { commands... }
  1122. We needed an additional layer of quoting in the else part.  doif(): ckuus6.c,
  1123. 28 Apr 99.  Verified that all script torture-tests still work, and added a
  1124. long "if ... else if ... else if ... else if ... else" section to the IFTEST
  1125. script.
  1126. Dat Thuc Nguyen reported the following problem:
  1127.   define try_this { END 999 }           ; Sets v(return) to 999
  1128.   try_this
  1129.   if FAIL echo RETURN1="v(return)"     ; This displays 999
  1130.   try_this
  1131.   if FAIL { echo RETURN2="v(return)" } ; This displays nothing, why?
  1132. This was yet another problem caused by the fact that IF ... { ... } (the
  1133. Command Formerly Known as XIF) is implemented internally as a macro (whereas
  1134. IF without braces is not), so it was looking in the wrong place on the stack
  1135. for the return value.  However, fixing this was not just a simple matter of
  1136. adding mrval[] to the items handled by _GETARGS and _PUTARGS, since dodo(), as
  1137. part of macro startup, initializes the RETURN value to NULL.  To make it not
  1138. do this for IF, FOR, WHILE, and SWITCH, while still doing for all other
  1139. macros, I added another command-stack flag, CF_IMAC (Internal Macro), which at
  1140. present is used only to prevent initialization of the macro's return value
  1141. (unfortunately it is ephemeral -- if we don't reset it right after use, it is
  1142. propogated to all lower levels -- so other applications for it are not
  1143. practical).  ckuus[56].c, 28 Apr 99.
  1144. Rearranging the declarations in ckuus4.c yesterday for the VOS x25-but-not-tcp
  1145. build caused tn_exit, ttnproto, tcp_incoming, autodl to come up missing on
  1146. nonet builds.  Fixed in ckuus4.c, checked by building with -DNONET, 28 Apr 99.
  1147. fxdinit() was not being included in non-curses builds after I moved it.  Fixed
  1148. (again) by juggling #ifdefs (again).  Fixed in ckuusx.c, fixed by building
  1149. with -DNOCURSES.  28 Apr 99.
  1150. Failure to open init file was not giving an error message.  Added code to
  1151. print a message in doinit(): ckuus5.c, 28 Apr 99.
  1152. Some Telnet authentication changes from Jeff.  ckctel.c, 30 Apr 99.
  1153. The MINPUT command, when typed at the prompt, was not getting into the
  1154. reparse() buffer.  Another case of not calling cmcfm()...  Fixed in ckuusr.c,
  1155. 30 Apr 99.
  1156. Changed SET BELL to be available in all versions, not just K95.  ckcdeb.h,
  1157. ckuusr.h, ckuus[r237].c, 30 Apr 99.
  1158. Added WILDCARD-EXPANSION setting to SHOW FILE.  ckuus4.c, 30 Apr 99.
  1159. Did a little digging on realpath():
  1160.  . SVID for SVR3 does not have it.
  1161.  . SVID for SVR4 does not have it.
  1162.  . POSIX 1003.1 does not have it.
  1163.  . ISO/IEC 9945-1 does not have it.
  1164.  . Apparently it originated with SVR4.2.
  1165. Determined the following UNIX platforms have it:
  1166.  . SunOS 4.1 and all Solaris
  1167.  . AIX 4.1 (and therefore 4.2, 4.3...)
  1168.  . Sinix 5.42
  1169.  . Digital UNIX 4.0.
  1170.  . HP-UX 9 and later.
  1171.  . SCO OSR5.0.5
  1172.  . QNX 4.25
  1173.  . Unixware 2.1.3
  1174.  . Red Hat Linux 5.2
  1175.  . IRIX 5.3 and later
  1176.  . NeXTSTEP 3.3
  1177.  . DG/UX 5.4R3.10 and later
  1178. Determined the following UNIX platforms do not have it:
  1179.  . HP-UX versions through 8.xx (we knew this already)
  1180.  . Motorola SV/68R3
  1181.  . SCO UNIX 3.2v4.x and earlier
  1182.  . SCO XENIX
  1183.  . Digital UNIX 3.2
  1184.  . Ultrix 4.3 (and presumably all other versions).
  1185. Expanded NOREALPATH section of ckcdeb.h to include all these.  2 May 99.
  1186. Tentative fix to Dat Thuc Nguyen's bug report regarding numeric STOP/END value
  1187. not being propogated up the call stack as v(return).  popclvl(): ckuus5.c, 2
  1188. May 99.
  1189. New HP-UX 6 through 8 makefile entries from Peter E.  Changing -DSVR3 to
  1190. -DSIG_V seems to cure some performance problems in these versions, and
  1191. eliminates the need for -DCONINTB4CB.  Also it seems hardware flow control
  1192. never worked in HP-UX 8.xx because -DSTERMIOX was missing from CFLAGS, so
  1193. this was added to the hpux80 entry.  makefile, 3 May 99.
  1194. kermit -C "" caused an infinite loop.  Fixed in ckuusy.c, 3 May 99.
  1195. The -C "command, command, ..." list did not work if tabs were used instead
  1196. of spaces.  Fixed in ckuusy.c, 3 May 99.
  1197. Fixed serial and CRT displays to wrap long filenames.  ckuusx.c, 3 May 99.
  1198. This did not work:
  1199.   _define abc%1 { blah blah }
  1200.   if defined m(abc%1) ...    <-- should succeed but fails.
  1201. Fixed in ckuus6.c (IF DEFINED did not handle compound macro names), 3 May 99.
  1202. From Jeff: Fix an off-by-one error in initializing the pointer list in
  1203. xwords(): ckuus5.c; cosmetic changes & typo fixes: ckctel.h, 4 May 99.
  1204. Added CK_NEWTERM to openbsd target.  makefile, 4 May 99.
  1205. Moved prototype for setbell() outside of #ifdef OS2.  ckuusr.h, 5 May 99.
  1206. Revisited the xwords() problem, undid Jeff's change.  xwords() itself was not
  1207. the problem; the problem was in some of the calls.  ckuus[r357].c, 5 May 99.
  1208. Found another problem in fsplit(): given the name of an array, e.g. "a" or
  1209. "A", we blindly compute the array base without first checking the case.
  1210. Changed dclarray() to return the array-base index for use by the caller,
  1211. rather than simply 0 to indicate success, and then changed the callers to use
  1212. the returned value rather than computing it themselves.  ckuus[45].c, 5 May 99.
  1213. From Raul Kacirek <raulka@raulka.mv.com>: Fixed a mismatched quote mark in the
  1214. is3 makefile target.  6 May 99.
  1215. Added a bunch of symbols for new commands, etc, to ckuusr.h:
  1216.   XX_INCR     _INCREMENT           (like INCREMENT but evaluate LHS too)
  1217.   XX_DECR     _DECREMENT           (like DECREMENT but evaluate LHS too)
  1218.   XX_EVAL     _EVALUATE            (like _ASSIGN + feval())
  1219.   XXARRAY     ARRAY                (Array ops -- copy, sort, declare, destroy)
  1220.   XXHTTP      HTTP                 (HTTP ops)
  1221.   XXPARSE     PARSE                (parse keyword, file, number, etc...)
  1222.   XYEVAL      SET EVALUATE         (old/new EVALUATE syntax, tsk tsk)
  1223.   IFXXCK      IF C-KERMIT          True if C-Kermit but not K-95
  1224.   IFXXK9      IF K-95              True if K-95
  1225.   IFXXMS      IF MS-KERMIT         True if MS-DOS Kermit
  1226.   IFXXWI      IF WILD <filespec>   True if filespec contains wildcard chars
  1227.   VN_XF_BC    v(xfer_badpacket)   (Transfer blockcheck errors)
  1228.   VN_XF_TM    v(xfer_timeout)     (Transfer timeouts)
  1229.   VN_XF_RX    v(xfer_retransmit)  (Transfer retransmissions)
  1230.   VN_M_NAM    v(m_name)           (Modem full name)
  1231.   FN_SEARCH   fsearch()           (Search for pattern in string)
  1232.   FN_XLATE    fxlate()            (Translate string character set)
  1233. But did not implement any of them yet, and might not anyway, we'll see.
  1234. 6 May 99.
  1235. Corrected a minor error in yesterday's changes regarding dclarray() in the
  1236. DIRECTORY /ARRAY:&a code.  domydir(): ckuus6.c, 6 May 99.
  1237. Implemented _INCREMENT and _DECREMENT.  ckuus6.c, 6 May 99.
  1238. Correction to a Kerberos #ifdef from Jeff.  ckuus7.c, 7 May 99.
  1239. Added symbols for modem-signal variables v(m_sig_xxx) to ckuusr.h, 7 May 99.
  1240. Implemented:
  1241.  v(m_name)
  1242.  v(m_sig_cd)  v(m_sig_dsr) v(m_sig_dtr)
  1243.  v(m_sig_cts) v(m_sig_rts) v(m_sig_ri)
  1244.  v(xfer_badpackets) v(xfer_timeouts) v(xfer_retrans)
  1245. ckuus4.c, 7 May 99.
  1246. Changed EVALUATE <expression> to EVALUATE <variable> <expression>.  This is
  1247. an incompatible change, but I doubt it will break any scripts, since the
  1248. old EVALUATE command was pretty useless.  But to be nice, I added an invisible
  1249. SET EVAL { NEW, OLD } command to choose the new or old syntax (default = new).
  1250. Then I added an _EVALUATE command, which is to EVALUATE as _ASSIGN is to
  1251. ASSIGN and _INCREMENT is to INCREMENT, etc.  Now we have a nice, symmetrical
  1252. set of variable-assignment operations providing a choices of whether (and
  1253. how, and how much) to evaluate the LHS and/or the RHS, to facilitate OOP-like
  1254. constructions.  ckuusr.c, 7 May 99.
  1255. Examples:
  1256.   _assign Words::%1.count[%2] feval(m(Words::%1.count[%2]) + 1)
  1257. can now be written as:
  1258.   _increment Words::%1.count[%2]
  1259. and:
  1260.   _assign complex::%1.re feval(m(complex::%1.re) + m(complex::%2.re))
  1261. can be:
  1262.   _evaluate complex::%1.re m(complex::%1.re) + m(complex::%2.re)
  1263. Changed [_]{IN,DE}CREMENT, when given a variable that is not defined, to
  1264. automatically define it with a value of 0.  ckuus5.c, 7 May 99.
  1265. Integrated Jeff's PAM code.  ckuus7.c, ckufio.c, 7 May 99.
  1266. Finished SET EVAL.  ckuus3.c, 8 May 99.
  1267. Added IF { C-KERMIT, K-95, MS-KERMIT }.  ckuus6.c, 8 May 99.
  1268. Made "!" a synonym for NOT in IF conditions.  ckuus6.c, 8 May 99.
  1269. Added IF WILD <filespec> <command>.  ckuus6.c, 8 May 99.
  1270. Added ckitoa() and ckltoa() -- the opposite of atoi() and atol().
  1271. ckclib.[ch], 8 May 99.
  1272. Added fsearch(pattern,string,start) and frsearch() -- just like findex()
  1273. and rindex(), except the object to search for is a pattern rather than a
  1274. literal string.  ckuusr.h, ckuus[24].c, 8 May 99.
  1275. Fixed Yet Another Bug in frindex(); it was misinterpreting its optional 3rd
  1276. argument.  ckuus4.c, 8 May 99.
  1277. Shadow password support from Jeff.  ckufio.c, 8 May 99.
  1278. "make linuxc" (Linux on systems that have curses but not ncurses) didn't work
  1279. because it had -lcrypt hardwired into it instead of using the trick of looking
  1280. for it first.  Made new "linuxc" and "linuxnc" (no curses at all) entries.
  1281. makefile, 8 May 99.
  1282. When adding f[r]search() I also broke up the huge switch() statement in
  1283. fneval() into a bunch of smaller ones, but neglected to prevent them from
  1284. falling thru to the default (error) case at the end.  Fixed by Jeff in
  1285. ckuus4.c, 10 May 99.
  1286. From Martin Whitaker: Recursive directory traversal and built-in DIRECTORY
  1287. command for OS-9: ck9fio.c, ckcdeb.h, 10 May 99.
  1288. Changed ckitoa() and ckltoa() to return string pointers from a revolving 1K
  1289. buffer pool, rather than a single buffer, so that successive calls within the
  1290. same statement would return distinct pointers.  Converted lots of crufty code
  1291. mainly in the ckuus*.c routines to use ckitoa() when appropriate, like when
  1292. numbers need to be passed as function parameters in string form, e.g. as
  1293. defaults for cmnum() calls, or in calls to setgen() by client for REMOTE SET.
  1294. Also handy for debug() when you want to put a number in both the second and
  1295. third fields.  ckclib.c, ckuus[r34567].c, 10 May 99.
  1296. Discovered that DIRECTORY prints total garbage for permissions, size, and date
  1297. in Unixware 7.  Diagnosis: lstat() doesn't work in Unixware 7, even though it
  1298. does work in earlier releases.  Adding -DNOLSTAT to the Unixware 7 makefile
  1299. targets fixes it.  10 May 99.  (SCO evidently does not believe in lstat()
  1300. since it also does not work in XENIX, SCO UNIX, or OSR5.)
  1301. From Jeff: fix a typo in ckuus7.c from yesterday's changes.  11 May 99.
  1302. Added HTTP command parser.  It's completely contained in ckuusr.c within
  1303. #ifndef NOHTTP.  ckuusr.c, 11 May 99.
  1304. Added ARRAY command to collect all array ops together: DECLARE, SORT, SHOW,
  1305. etc.  Made top-level DECLARE and SORT commands invisible.  Old syntax still
  1306. works, of course.  ckuusr.h, ckuus[r5].c, 11 May 99.
  1307. Moved the array-segment-parsing code from SHOW ARRAY to a separate routine,
  1308. arraybounds().  SHOW ARRAY &a[12:16] still works.  ckuus5.c, 11 May 99.
  1309. Added ARRAY COPY <source> <target>.  This copies an array much more quickly
  1310. than a script FOR loop.  Furthermore, either or both of the source and target
  1311. arrays can include range specifiers, so this command can be used to copy
  1312. pieces of arrays, or to create an array that is a piece of another array, etc.
  1313. A few quick tests look OK, but needs more verification.  ckuusr.c, 11 May 99.
  1314. Discovered that the following:
  1315.   $ kermit + filename arg1 arg2 arg3
  1316. would execute the file and pick up the args, as adverised, but then would say:
  1317.  "filename" - invalid command-line option, type "wermit -h" for help
  1318. Similarly, there would be a complaint if the first arg was "=".  Both fixed in
  1319. ckuusy.c, 12 May 99.
  1320. Finished ARRAY COPY.  Added ARRAY { DESTROY, CLEAR, SET, RESIZE }.  Changed
  1321. [ ARRAY ] DECLARE to accept array-name syntax consistent with the other ARRAY
  1322. commands.  Changed [ ARRAY ] SORT to allow range specification in the array
  1323. brackets.  ckuus[r7].c, 12 May 99.
  1324. Added farraylook(array,pattern) to search an array and return the index of
  1325. the first matching element.  ckuusr.h, ckuus[24].c, 12 May 99.
  1326. Removed trailing whitespace from source file lines: ckuus[r345].c, 12 May 99.
  1327. New ckuath.c from Jeff, 13 May 99.
  1328. Removed "search" keyword from arraytab[] and fixed a type in rszarray().
  1329. ckuusr.c, 13 May 99.
  1330. Filled in HELP ARRAY and updated HELP EVAL.  ckuus2.c, 13 May 99.
  1331. Added v(match), which contains the string that matched the pattern most
  1332. recently given to ckmatch(), e.g. by IF MATCH, fsearch(), farraylook(),
  1333. wildcard comparisons, etc.  But then I removed it since it turns out that most
  1334. calls to ckmatch() internally append a "*", so the result is usually more than
  1335. you expect.  What we really need is something like SNOBOL's:
  1336.   STRING ( PATTERN . RESULT )
  1337. I'll come back to this later...  ckuusr.h, ckuus4.c, 13 May 99.
  1338. Realized the arguments to farraylook() were in reverse order from those in
  1339. all the other string-search functions -- findex(), fsearch(), etc -- so
  1340. reversed them.  ckuus[24].c, 13 May 99.
  1341. Discovered that top-level &_[] array was dimensioned 1 greater than it should
  1342. have been.  Fixed in cmdini(): ckuus5.c, 13 May 99.
  1343. Fixed Yet Another Problem with Kerbang invocation: "kermit + file arg1 arg2..."
  1344. would pick up the args and execute the file OK, but then would say "arg1 -
  1345. invalid command-line argument".  Changed command-line parser to simply return
  1346. if the first argument was "+".  (I thought I fixed this problem yesterday, but
  1347. in reality I only shifted it to the right.)  ckuusy.c, 13 May 99.
  1348. Added IF LOCAL <command>.  ckuusr.h, ckuus6.c, 13 May 99.
  1349. Upped MAC_MAX from 4K to 16K for BIGBUFOK builds and from 0.5K to 1K for
  1350. other builds.  ckuusr.h, 14 May 99.
  1351. Added v(setlinemsg) to contain the error message that was generated by the
  1352. most recent SET LINE / PORT / HOST (or TELNET or RLOGIN) command, if it failed.
  1353. ckuusr.h, ckuus[47].c, 14 May 99.
  1354. From Jeff: Move misplaced #ifdef in v(setlinemsg) code.  ckuus7.c, 18 May 99.
  1355. The following modems had software flow-control commands defined, but were
  1356. missing the CKD_SW capability: Microlink, Telepath, Motorola X-Jack, Quickcomm
  1357. Spirit II, Megahertz AT&T V.34.  Fixed in ckudia.c, 18 May 99.
  1358. Wrapping of long filenames in Serial and CRT displays did not take the length
  1359. of the first name into account.  Fixed in dpyinit(): ckuusx.c, 18 May 99.
  1360. From Brian Tillman: Updated ckvker.com and ckcnet.h for Wollongong Pathway 3.1.
  1361. 18 May 99.
  1362. From Jeff: Preserve printer settings between invocations.  ckuus3.c, 19 May 99.
  1363. From Jeff: Perform reverse DNS lookup when a numeric IP address is given and
  1364. Kerberos is available so a successful Kerberized connection can be achieved.
  1365. (Previously we skipped the reverse lookup for numeric addresses, but for
  1366. Kerberized connections we need the hostname to get the Kerberos realm.)
  1367. Added #ifdef CK_KERBEROS to the new tests.  ckcnet.c, 19 May 99.
  1368. Added missing dosort() prototype.  ckuusr.[ch], 19 May 99.
  1369. Dale Dellutri reported that in the sequence "set flow keep", "set line tta0",
  1370. "connect", the device's flow control changed when it shouldn't have.  This is
  1371. because the SET LINE code calls setflow(), and for some unknown reason the "if
  1372. (!autoflow) return;" statement in setflow() was commented out.  There's
  1373. nothing in the notes about it, nor any comment in the code.  Clearly we should
  1374. not be switching the flow control automatically if it was set to something
  1375. specific like KEEP or RTS/CTS.  Was the commenting-out done for a reason???  I
  1376. guess there's only one way to find out...  Restored the if (autoflow) test to
  1377. setflow().  But that didn't help -- it seems that setlin() was also setting
  1378. the flow control directly, without going through setflow(), in the serial
  1379. device case (there must have been some logic behind this but I don't see it
  1380. now).  Changed setlin() to call setflow() like everybody else.  ckuus[7x].c,
  1381. 19 May 99.
  1382. changed cmkey() to not print "?No keywords match" if QUIET is ON.  Changed
  1383. command-file reader not to print "Command file: filename, line number" when
  1384. QUIET ON.  And when it does print "Command file:", now it also prints the
  1385. name of the active macro, if any.  ckucmd.c, ckuus5.c, 19 May 99.
  1386. Added /opt to the list of UNIX directories to search for Kermit text files.
  1387. ckuus5.c, 19 May 99.
  1388. Several weeks ago when writing a script, I wanted to send an ATI6 command to
  1389. a USR modem and the parse the results (about 20 lines of text that end with
  1390. "OK") on fly like so:
  1391.   set flag off
  1392.   set input echo on
  1393.   while not flag {
  1394.      minput 10  Blers  Retrains  Speed  OK
  1395.      switch v(minput) {
  1396.        :1, clear input, input 2 10, .blers := fword(v(input),1), break
  1397.        :2, clear input, input 2 10, .retrains := fword(v(input),5), break
  1398.        :3, clear input, input 2 10, .speed := fword(v(input),1), break
  1399.        :4, set flag on, break
  1400.      }
  1401.   }
  1402. I was discouraged to find that this didn't work at all (on Windows 95).  Huge
  1403. chunks of the modem's report were lost.  I looked closely at the INPUT/MINPUT
  1404. code but found nothing to explain it:  Reads are not buffered -- we do ttinc()
  1405. or coninc() to get each character and deposit it in inpbuf[] one at a time.
  1406. Therefore, reading stops as soon as we have a full match, so we have not read
  1407. ahead at all.  CLEAR INPUT simply clears inpbuf[], which contains only the
  1408. chars that INPUT read, and resets inpbp to the beginning of the buffer.
  1409. Therefore "input 2 10" should read to the next linefeed, and there should be
  1410. no wraparound since we just cleared the inpbuf[] buffer.  But lots of stuff
  1411. (many lines at once) were being lost anyway.
  1412. So instead I did it like this (get the whole report in one gulp and then parse
  1413. it afterwards):
  1414.   output ATI613
  1415.   input 20 OK
  1416.   if fail end 1
  1417.   .%x := findex(Retrains Granted,v(input))
  1418.   if %x .retrains := fword(fsubstr(v(input),%x),3)
  1419.   .%x := findex(Blers,v(input),%x+16)
  1420.   if %x .blers := fword(fsubstr(v(input),%x),2)
  1421.   .%x := findex(Speed,v(input),%x+16)
  1422.   if %x .ospeed := fword(fsubstr(v(input),%x),2,,/)
  1423. which worked fine (so no, it wasn't a flow control problem).
  1424. Today I went back to investigate, but this time on an HP workstation with
  1425. HP-UX, and the first method worked perfectly.  I tried it on Windows with an
  1426. external USR modem and it worked perfectly too.  So either some fix that we
  1427. made in the last couple weeks cleared up the problem, or else it's something
  1428. to do with the Compaq (TAPI) Winmodem, so who cares.  So this clears away
  1429. a big item from the list.
  1430. Changed UNDEF <name> to parse but ignore text after the <name>.  This provides
  1431. a clean way to comment out a macro definition without removing it or putting
  1432. semicolons in front of each line.  ckuus6.c, 19 May 99.
  1433. Fixed a typo in yesterday's flow-control changes (comment-close typed as
  1434. *? rather than */).  setflow(): ckuusx.c, 20 May 99.
  1435. From Jeff: /NOPOSTSCRIPT switch for SET PRINTER to under previous /POSTSCRIPT
  1436. switch.  ckuusr.h, ckuus3.c, 20 May 99.
  1437. From Jeff: Updated HELP text for SET TCP REVERSE-DNS-LOOKUP for Kerberos.
  1438. ckuus2.c, 20 May 99.
  1439. From Jeff: new security.txt and telnet.txt, updated iksd.txt.  20 May 99.
  1440. Fixed some mistakes in the Compaq modem definition, and raised the max speed
  1441. parameter for Compaq and USR to 115200.  Made the maximum speed warning a
  1442. hint.  ckudia.c, 20 May 99.
  1443. Added SIG_V and SIG_I to SHOW FEATURES.  ckuus5.c, 20 May 99.
  1444. Made SET LINE messages in UNIX about access to lock or device a hint.
  1445. ckuus7.c, 20 May 99.
  1446. Added v(textdir), the directory where the C-Kermit/K-95 text files are kept.
  1447. ckuusr.h, ckuus4.c, 20 May 99.
  1448. Added ftablelook(), just like farraylook() except it assumes the table is
  1449. sorted, allows array elements to have fields, requires a nonambiguous match,
  1450. and returns -2 on an ambiguous match.  ckuusr.h, ckuus[24].c, 20 May 99.
  1451. From Jeff: move a mispaced brace in setlin(): ckuus7.c, 21 May 99.
  1452. Merged copyright text into VERSION command except in K95 where it wouldn't
  1453. fit.  ckuusr.c, 21 May 99.
  1454. Made the HTTP command (not filled in yet) invisible.  ckuusr.c, 21 May 99.
  1455. Fixed a glitch in filename completion that affected UNIX but not K95:
  1456. "send ./foo<ESC>" would lose the next two name characters after "foo" in the
  1457. expansion.  cmifi2(): ckucmd.c, 21 May 99.
  1458. Moved XYB_xxx definitions from ckuusr.h to ckcker.h for NOSPL/NOICP builds.
  1459. 21 May 99.
  1460. Moved all cmdlvl declarations outside of NOSPL sections.  ckuus*.c, 21 May 99.
  1461. Fixed Solaris 2.3 and 2.4 banners.  ckuver.h, 21 May 99.
  1462. Fixed TCPware "show net" display to say TCPware instead of UCX.  ckuus4.c,
  1463. 21 May 99.
  1464. Fixed linux entry to accept KFLAGS from other Linux entries.  makefile,
  1465. 21 May 99.
  1466. Multinet 4.2 on VMS 7.1 with DECC 6.0 needed <if.h>.  ckcdeb.h, 22 May 99.
  1467. Shuffled some #ifdefs and version numbers and redid the overlay structure to
  1468. enable building on 2.11BSD (first time in 3 years).  ckcker.h, ckcfns.c,
  1469. ckustr.c, ckustr.sed, ckubs2.mak, 23 May 99.
  1470. ---Beta.07---
  1471. Added Base64 conversion routines.  ckclib.[ch], 26 May 99.
  1472. Updates from Jeff, 26 May 99.
  1473.  . Some misplaced case statements fixed in ckcnet.c.
  1474.  . Initial work on HTTP routines: ckuusr.c, ckcnet.[ch].
  1475.  . Additional PRINT switch work -- decoupling port parameter setting
  1476.    from bidirectional mode: ckuus3.c.
  1477. Added -DNOREALPATH to AT&T 3Bx and System III entries, and to all AIX entries
  1478. prior to 4.0.  makefile, 26 May 99.
  1479. Added include for inet.h to Wollongong section of ckcnet.h.  26 May 99.
  1480. Fixed a typo in the Wollongong section of the VMS build procedure.  ckvker.com,
  1481. 26 May 99.
  1482. Changed PA-RISC level indicator for HP-UX 10.20; John Bigg of HP says 10.20
  1483. and up do not support PA-RISC 1.0.  makefile, 26 May 99.
  1484. Changed optimization flag for SNI 5.44 from -F to -K.  makefile, 26 May 99.
  1485. The Base-64 functions did not null-terminate their results, thus forcing the
  1486. caller to do it.  Changed them to deposit a NUL after the result (if the
  1487. buffer had room for it).  ckclib.c, 27 May 99.
  1488. Added fb64encode() and fb64decode().  ckuusr.h, ckuus4.c, ckclib.c,
  1489. 27 May 99.
  1490. Fixed funhexify() to return an appropriate error if called with a non-hex
  1491. string.  ckuus4.c, 27 May 99.
  1492. Fixed solaris25x25 makefile target -- it had unbalanced quotes.  However the
  1493. make doesn't work at all -- the SunLink X.25 9.x header files are broken.
  1494. makefile, 28 May 99.
  1495. In gtword() (the "token getter" of the command parser), there were a couple
  1496. places where we compared the user's keystroke with NL (== whatever 'n' is
  1497. defined to be) when we meant to be checking for LF (linefeed).  This needed
  1498. fixing for OS-9, where 'n' is CR.  This fix also applies to the Macintosh
  1499. in case C-Kermit is ever built there again.  ckucmd.c, 28 May 99.
  1500. Added a NOTTGWSIZ symbol to allow builds without CK_TTGWSIZ to test for
  1501. spurious dependencies.  In UNIX this must be used with -DNORLOGIN, since
  1502. Rlogin requires ttgwsiz().  ckcdeb.h, 28 May 99.
  1503. In the NOTTGWSIZ version, the DIRECTORY command did not list anything, and the
  1504. TYPE command referenced an initialized variable.  Fixed in ckuusr.c, ckuus6.c,
  1505. 28 May 99.
  1506. A bunch of similar fixes: ckuus[r67x].c, 28 May 99.
  1507. Modernized HELP SET FILE (TYPE).  Kermit had changed so much out from
  1508. underneath it that it was positively misleading.  ckuus2.c, 28 May 99.
  1509. With the help of DJ Hagberg at Global Atmospherics, Inc, got past some of the
  1510. initial difficulties with SunLink X.25 9.xx header files.  ckcnet.h, 28 May 99.
  1511. In ckucmd.c, #include "ckcnet.h" was after the includes for ckucmd.h and
  1512. ckuusr.h, and this caused some conflicts with the SunLink header files.  Moved
  1513. it up to after ckcdeb.h and ckcnet.h, and before ckucmd.h and ckuusr.h.
  1514. Now the X.25 version builds OK on Solaris 2.6.  ckucmd.c, 28 May 99.
  1515. Added #ifndef NOCOTFMC around the code in tthang() that closes and reopens
  1516. the device, so we can disable when necessary (or not needed).  This is to see
  1517. if it helps with a problem in Unixware 2.0.3, where the TCSETAW ioctl returns
  1518. an "invalid argument" after the close/open.  ckutio.c, 1 Jun 99.
  1519. Adjusted HELP SET FILE TYPE text again.  ckuus2.c, 1 Jun 99.
  1520. Removed the spurious "?Directory already exists" message that MKDIR always
  1521. printed.  ckuusr.c, 1 Jun 99.
  1522. From Jeff, 1 Jun 99:
  1523.  . Add missing cmdate2tm prototype to ckucmd.h.
  1524.  . Adjust http prototypes in ckcnet.h.
  1525.  . Adjust some prototypes in ckuath.h.
  1526. Moved cmdate2tm() from ckucmd.c to ckutio.c, since it is highly unportable.
  1527. Made a symbol CMDATE2TM that must be defined before we can use this routine,
  1528. and defined it by default for UNIX.  Made another symbol NOCMDATE2TM to
  1529. override the default definition.  If this routine is to be used on non-UNIX
  1530. platforms, it must be copied to their ck*tio.c modules and adapted, but this
  1531. can work only when struct tm is supported.  Therefore, to make it more widely
  1532. useful, we need to define a portable abstraction.
  1533.  . Some Kerberos-realm-getting changes in ckuus7.c
  1534.  . HTTP code fleshed out ckcnet.c.
  1535. The HTTP code in ckcnet.c is not going to be easily portable.  It includes
  1536. <time.h>, which is not portable to all platforms.  Even in UNIX, there are
  1537. many varieties where it is <sys/time.h>, or has an entirely different name.
  1538. That's why I moved cmdate2tm() to ckutio.c, which already has #ifdefs to take
  1539. care of this.  This will need some serious sorting out before we go public.
  1540. Also, you refer to _timezone in http_date() but it's not defined anywhere
  1541. (at least not in SunOS).
  1542. Also, there are calls to nonportable routines like memset(), etc.
  1543. Fixed the call to http_index() in ckuusr.c to have the right number of args.
  1544. From Jeff, IKSD and Kerberos fixes:
  1545.  . syslog'ing was not being performed since the syslog flag was saved
  1546.    before the syslog was opened and then restored after it was opened.
  1547.  . syslog'ing was not being performed during login because the syslog was
  1548.    purposely turned off during login.  I assume to hide passwords.  This
  1549.    is a legitimate concern and I specificly turned off the syslog in the
  1550.    readpass() and in ckxlogin() around the password reading code.
  1551.  . When iksd was compiled with CK_PAM anonymous users would not be
  1552.    prompted for a password and would be summarily rejected.
  1553.  . corrections to yesterday's kerberos autoget ticketing.
  1554.  . Defined CMDATE2TM for K95.
  1555. ckufio.c ckuusr.c ckuus7.c ckuath.c ckucmd.c ckcdeb.h ckcmai.c, 2 Jun 99.
  1556. Changed HTTP code in ckcnet.c to check SYSTIMEH symbol (which is defined in
  1557. ckcdeb.h) before deciding which time.h file to include.  Also added some
  1558. comments and #ifdefs to HTTP code in ckcnet.c, but it will never be truly
  1559. portable in its present form.  It does, however, build OK on at least Solaris,
  1560. SunOS, HP-UX, and Linux, and presumably also in Win32 and OS/2, so it's worth
  1561. keeping.  2 Jun 99.
  1562. Added /ARRAY: switch to the HTTP command parser for INDEX.  dohttp() gets
  1563. the array letter as a new 9th parameter (NUL if none).  The action (actually
  1564. assigning stuff to the array) is filled in, but not used, in http_mkarray()
  1565. in ckcnet.c.  I guess http_index() needs to call http_mkarray()?  2 Jun 99.
  1566. Still more #ifdefs added to the SCREEN support code to allow for the case
  1567. where tputs() requires a pointer to a void function.  ckuusx.c, 3 Jun 99.
  1568. tthang() for some reason stopped working on Unixware 2.0.3.  It used to work
  1569. OK in C-Kermit 6.0, and line-by-line comparison of the tthang() code showed
  1570. no change since then.  It was following the System V path, first trying to
  1571. manipulate the modem signals (because TIOCMBIS, TIOCMBIC, and TIOCM_DTR were
  1572. defined) and failing because these ioctl's were not actually implemented
  1573. (errno 22), so then falling through to the section that gets the current
  1574. speed, saves it, sets it to 0, waits a bit, and then restores the speed.
  1575. The speed-restoring part was failing (ioctl(ttyfd,TCSETA,...)) with errno 22.
  1576. I have no idea why.  Tried "make unixware2 KFLAGS=-DPOSIX", failed miserably.
  1577. So I duplicated the BSD44POSIX speed setting code in #ifdef HUP_POSIX, which
  1578. is defined internally for non-POSIX builds (e.g. Unixware prior to 7.0) that
  1579. need to do POSIX-style hangup.  Later, the fix was verified to work on UW2.0.3
  1580. but who knows what effect it will have on 1.x or 2.1.  ckutio.c, 3 Jun 99.
  1581. Added -DNOREALPATH to Plan 9 makefile.  ckpker.mk, 3 Jun 99.
  1582. From Michal Jaegermann:
  1583.   With a separate 'libcrypt' in glibc there is also a header file
  1584.   <crypt.h> which provides a prototype for 'crypt()'.  Without including
  1585.   it a return value from crypt is losing a half of its significant bits
  1586.   with 64-bit pointers as crypt() type defaults to int.  To work around
  1587.   required "frugal" preprocessors (comments in ckcdeb.h) I added
  1588.   HAVE_CRYPT_H define in makefile flags where -lcrypt is used with Linux
  1589.   and a corresponding conditional include in ckcdeb.h
  1590.   time_t type on Linux/Alpha is long but 'tv_sec' field in 'struct timeval'
  1591.   is int.  I heard that is a POSIX requirement.  Looks to me more like a
  1592.   bug but quite likely is both.  The net effect is that using an address
  1593.   of tv.tv_sec (ckufio.c via macro, ckutio.c) where an address of time_t
  1594.   is needed results in a unaligned trap.  I bracketed these changes with
  1595.   LINUX as 64-bit apps on Sparc and on the future ia64 **may** have the
  1596.   same problem.  In any case an overhead is totally negligible so why
  1597.   not be safe.  In case ckufio.c 'ut.ut_time = time(NULL);' would likely
  1598.   work equally well but I wanted to a keep a consistent style.
  1599.   There is a bunch of unused variables (quite likely some are used with
  1600.   other defines active) but 'static char lockname[DEVNAMLEN+1]' is
  1601.   needed only with USETTYLOCK defined.  'static suftab' in ckuus3.c is
  1602.   not used by anything at all.
  1603.   Wrong format in sprintf resurfaced in some new place (ckuus4.c) and
  1604.   ckussx.c requires a bunch of prototypes from <term.h>. Undeclared
  1605.   functions always make me nervous on Alpha. :-)
  1606. Michal's patches installed in makefile, cku[ft]io.c, ckuus[34x].c, 3 Jun 99.
  1607. Added an HTTP feature-selection section to ckcdeb.h.  Since the HTTP code is
  1608. not portable, it is disabled by default except for SunOS, Solaris, Linux, and
  1609. HP-UX 10 (the places where I've built it successfully so far), and K-95, and
  1610. disabled by default elsewhere unless -DCKHTTP is given on the CC command line
  1611. or in the makefile target.  ckcdeb.h, 3 Jun 99.
  1612. Redid HTTP parser so /ARRAY switch applies to all subcommands and INDEX has
  1613. same filename operands as GET and HEAD:
  1614. HTTP [ /AGENT:<string> ] [  /HEADER:<list of strings> ] -
  1615.      [ /PASSWORD:<string> ] [ /USER:<string>  ] [  /ARRAY:<array> ] -
  1616.      { { GET, HEAD, INDEX } <remote> <local> }, -
  1617.        { PUT, POST }  /MIME:<string> <local> <remote> }
  1618. ckuusr.c, 3 Jun 99.
  1619. Cast all string args to ttol() to (CHAR *) in the http_blah() routines.
  1620. ckcnet.c, 3 Jun 99.
  1621. Tried building with -DCKHTTP in AIX 4.1.  Found that "struct tm" was not
  1622. defined.  Why not?  There was a clause in ckutio.c specifically to avoid
  1623. including <time.h> if AIXRS was defined.  I can't remember why, so I assume it
  1624. must be some peculiarity of AIX 3.x, so I included it after all for AIX41.
  1625. That makes ckutio.c compile.  ckcnet.c had the same complaint.  In this case
  1626. it was deliberately including <sys/time.h> rather than <time.h> if AIXRS was
  1627. defined.  Adding an escape clause for AIX41 here too fixed it, and now we can
  1628. build for AIX 4.1 with HTTP.  ckutio.c, ckcnet.c, 3 Jun 99.
  1629. Added -DCKHTTP for AIX41 and Unixware.  ckcdeb.h, 3 Jun 99.
  1630. Changes for COHERENT 4.2 from Fred Smith: ckcdeb.h, ckcnet.h, ckctel.c,
  1631. cku[tf]io.c, 4 Jun 99.
  1632. From Jeff: Renaming of ck_krb_ functions to make sense since they are no
  1633. longer tied specifically to Kerberos.  ck_krb_* were renamed to ck_tn_* when
  1634. Telnet-related or to ck_auth_* when used for authentication.  Fixed prototypes
  1635. in headers to be in the right place and not duplicated.  Many modules,
  1636. 4 Jun 99.
  1637. A command like "take xxx" (where xxx does not exist) could give a message like:
  1638. "?Error in TAKE command file: Line too long or contains NUL characters".
  1639. That's because TAKE searches an internal "TAKE path" if the filename is not
  1640. absolute and it can't find the file in the current directory, and a file "xxx"
  1641. that is a directory happens to exist in the TAKE path.  TAKE tries to execute
  1642. the directory.  Fixed in ckuusr.c, 4 Jun 99.
  1643. If an error occured in a macro that was invoked from a command file, the
  1644. error message would erroneously identify the macro name as the command file
  1645. name.  Fixed (I think) in ckuus5.c, 4 Jun 99.
  1646. Implemented SHOW STACK for non-Macintosh platforms (it shows the Kermit
  1647. command stack -- macros & command files).  ckuus5.c, 4 Jun 99.
  1648. The stack display was a lot more informative than the previous error message,
  1649. so now we show it every time there's an error in a command file or macro,
  1650. unless QUIET is ON.  ckuus5.c, 4 Jun 99.
  1651. New Coherent 4.2 makefile entry from Fred Smith.  7 Jun 99.
  1652. Changed parsing of "help function" to allow "help func substr" or "help func
  1653. fsubstr" or "help func fsubstr".  Also fixed "help func" to always go into
  1654. the recall buffer.  ckuus2.c, 8 Jun 99.
  1655. Moved rdigits() and chknum() from ckucmd.c to ckclib.c.  ckucmd.[ch],
  1656. ckclib.[ch], 8 Jun 99.
  1657. Added isfloat().  ckclib.[ch], 8 Jun 99.
  1658. Added a selection of floating-point functions: ffpadd(), ffpsubtract(),
  1659. ffpsqrt(), etc.  Each has one or two floating-point args, and then an
  1660. optional "decimal places" (d) arg.  These functions are included if FNFLOAT is
  1661. defined at a compile time.  In UNIX at least, it is also necessary to add
  1662. "-lm" to LINKFLAGS, since the math functions are not included in the regular C
  1663. library.  Enabled this stuff in SunOS and Linux.  So far so good.  Will have
  1664. to add them in to others as we go along -- too dangerous to enable by default.
  1665. ckuusr.h, ckuus4.c, 8 Jun 99.
  1666. Added fabsolute().  ckuusr.h, ckuus4.c, 8 Jun 99.
  1667. Peter Eichhorn verified that -DFNFLOAT works on all HP-UX releases 6.5 thru
  1668. 10.20 and updated the makefile targets.  9 Jun 99.
  1669. Discovered that C-Kermit's expression evaluator did not accept '+' as a
  1670. unary operator, so added it.  ckuus5.c, 9 Jun 99.
  1671. Fixed a bug in evaluating signed "d" arg in fp functions.  ckuus4.c, 9 Jun 99.
  1672. Added rounding for fp results when d > 0.  ckuus4.c, 9 Jun 99.
  1673. Added ffpround(), ffpmin(), ffpmax(), ffpsin(), ffpcos(), ffptan().
  1674. ckuusr.h, ckuus4.c, 9 Jun 99.
  1675. Fixed fmod(), fmin(), and fmax(), which were all broken by "goto fnend"s
  1676. that were inserted before they had a chance to write their results to the
  1677. result buffer.  ckuus4.c, 9 Jun 99.
  1678. Changed IF <, <=, =, !=, >=, and > to take floating-point operands and to
  1679. allow the <number> in "IF <number> <command>" to be a floating-point number.
  1680. ckuus6.c, 9 Jun 99.
  1681. Verified that FP builds OK on Unixware 2 and 7; updated the makefile targets
  1682. accordingly.  makefile, 9 Jun 99.
  1683. Added v(math_pi), v(math_e), and v(cmdbufsize).  ckuusr.h, ckuus4.c,
  1684. 9 Jun 99.
  1685. Added HELP FUNC text for all new functions.  ckuus2.c, 9 Jun 99.
  1686. A report of an infinite loop during INPUT seemed to indicate that a hack that
  1687. had been added to boost efficiency by preventing extraneous calls to gtimer()
  1688. was, in fact, having the opposite effect.  Removed the hack.  Also, if INPUT
  1689. got a NUL, it went straight back to the top of the loop, skipping the
  1690. termination checks, thus allowing the burst count to go negative; I fixed this
  1691. by having jump ahead to the termination checks in that case.  But the log
  1692. revealed that the NULs were not data, but in fact were being returned by
  1693. coninc() when read(0,&ch,1) failed with errno 19, "No such device" -- not your
  1694. normal kind of error when reading from standard input.  Changed coninc() to
  1695. return -1 rather than 0 if read() returns 0 and sets errno to nonzero.  I
  1696. don't know how to test this, since I have no idea how the guy got read() from
  1697. stdin to get error 19.  At least the changes don't seem to break anything --
  1698. login scripts still work, INPUT from the controlling terminal still works.
  1699. ckuus4.c, ckutio.c, 9 Jun 99.
  1700. Fixed bsdi2, 3, and 4, plus assorted Solaris makefile targets to pass along
  1701. KFLAGS.  makefile, 9 Jun 99.
  1702. More FNFLOAT verifying:
  1703.  . VMS/Alpha:   OK (so updated ckcdeb.h).
  1704.  . BSDI 3.1:    OK (so updated makefile targets).
  1705.  . AIX 4.3:     OK (ditto)
  1706.  . DU 3.2:      OK (ditto)
  1707.  . DU 4.0:      OK (ditto)
  1708.  . SINIX 5.42   OK (ditto)
  1709.  . Solaris 2.4: OK (ditto, for all Solaris versions).
  1710. Made sure we can still build without FNFLOAT defined, then added -DFNFLOAT
  1711. and -lm to all (non-Test) SunOS entries.  9 Jun 99.
  1712. Updated ckcdeb.h to not allow FNFLOAT if CKFLOAT not defined or if NOFLOAT
  1713. is defined.  9 Jun 99.
  1714. The CONINTB4CB business was done in only one of two places that needed it.
  1715. Added it to the other place (but more work needed here for SV/68 R3V6).
  1716. ckuus4.c, 10 Jun 99.
  1717. Changed some -FNFLOAT's to -DFNFLOAT.  makefile, 10 Jun 99.
  1718. Changes from Jeff: prototype for ck_krb_rlogin() needed #ifdefs; additional
  1719. support for SRP; new blah-export makefile targets for building with Kerberos
  1720. or SRP but without forbidden modules, etc.  ckcnet.[ch], ckuus4.c, ckufio.c,
  1721. ckuath.c, makefile, 10 Jun 99.
  1722. Added prototypes for readpass() and readtext() to ckcdeb.h, 10 Jun 99.
  1723. Defined NOHTTP automatically if OS2ORUNIX is not defined.  Now we can build
  1724. a network version again on VMS.  ckcdeb.h, 10 Jun 99.
  1725. Fixed a printf() in showstk() that had a %d with no int to print.  10 Jun 99.
  1726. Jeff noticed that packet recognition at the command prompt sometimes doesn't
  1727. work when packets contain spaces, which cause gtword() to return.  Mostly they
  1728. work anyway, because the piece of the packet before the space usually does not
  1729. correspond to a top-level command keyword or token, and so we continue
  1730. absorbing packet characters until the CR or LF is reached.  It's awkward,
  1731. however, since the command parser is beeping and spewing out error messages
  1732. all the while, and packet detection probably *could* fail if a piece of
  1733. ("word" in) a packet corresponded to something legal in a command at that
  1734. point.  I made an initial stab at fixing this problem by setting a global
  1735. variable, kstartactive, whenever kstart() thinks it's in a packet, and
  1736. unsetting it whenever it gets any control character besides SOP (since control
  1737. characters can't appear within an S or I packet).  This seems to work OK.  You
  1738. can get in trouble by typing ^A at the prompt, but you get out of it again as
  1739. soon as you type another control char.  Needs testing and maybe some
  1740. refinement.  ckcnf2.c, ckucmd.c, 10 Jun 99.
  1741. Installed a new initfloat() routine to be called at startup when FNFLOAT is
  1742. defined, which determines by inspection (a) the precision of floating-point
  1743. numbers, and (b) whether printf("%f",x) does rounding.  This way we don't need
  1744. any #ifdefs or system/hardware-dependent code.  On a Sparc, we get 16 decimal
  1745. digits of precision (more like 16.25).  As a reality check, assuming 3.3219282
  1746. bits per decimal digit, that gives us 54 bits for the mantissa, allowing 10
  1747. bits for the exponent and sign, which seems about right. ckuusr.h, ckcmai.c,
  1748. ckuus[45].c, 11 Jun 99.
  1749. Changed floating-point output code to (a) create an sprintf() format string
  1750. for the desired number of decimals; (b) let sprintf() do the rounding if
  1751. initfloat() says it can; (c) set all digits beyond the precision to 0 rather
  1752. than return random digits.  ckuus4.c, 11 Jun 99.
  1753. Made v(math_e) and v(math_pi) return the number of digits appropriate to
  1754. the machine precision.  ckuus4.c, 11 Jun 99.
  1755. From Jeff:
  1756.  . Define FNFLOAT for K95.
  1757.  . Protect refs to fp_digits in v(math_*) functions with #ifdef FNFLOAT.
  1758.  . Changes for compatibility with new Kerberos credential cache APIs.
  1759.  . Kerberos 4 realm was not being evaluated when the credentials cache is
  1760.    not a file.
  1761.  . Fixes for the IKSD packet problems (bad code).
  1762.  . When entering CONNECT mode iks_wait() must request a response.
  1763.    Otherwise, the receipt of an initial START can result in a premature
  1764.    exit to command mode.  This is not a change in the TKO protocol.
  1765. ckuath.c, ckctel.c, ckcpro.w, ckuusr.c, ckuus4.c, ckcdeb.h, 13 Jun 99.
  1766. Fix from Jeff for fprintf(stderr,...) front end for WRITE ERROR, which has
  1767. been writing to stdout instead of stderr ever since ckxprintf() was added for
  1768. IKSD.  ckutio.c, 13 Jun 99.
  1769. Fixed WRITE and WRITELN { SCREEN, ERROR } to handle EOL as requested.
  1770. ckuusr.c, 13 Jun 99.
  1771. Put the finishing touches on floating-point functions: handle the case where
  1772. the d arg is a variable with an empty value; fix HELP FUNC to handle ambiguous
  1773. keywords better, etc.  ckuus[245].c, 13 Jun 99.
  1774. Checked to make sure that gtword() was calling kstart() only if COMMAND
  1775. AUTODOWNLOAD was ON.  It was.  ckucmd.c, 13 Jun 99.
  1776. Minor code rearrangement in zvuser() to squelch "statement not reached"
  1777. warnings in non-Kerberos builds.  ckufio.c, 13 Jun 99.
  1778. Added -DFNFLOAT to NeXTSTEP targets; -lm was not needed in this case.
  1779. makefile, 13 Jun 99.
  1780. Added a status indication to SHOW CONNECTION (active, closed, or unknown),
  1781. which is obtained from calling ttchk().  ckuus3.c, 13 Jun 99.
  1782. Started Adding  new general-purpose file i/o commands:
  1783.   FILE { OPEN, CLOSE, READ, WRITE, REWIND, LIST } [ switches ] <channel> ...
  1784. These are parsed and executed if CKCHANNELIO is defined (it isn't defined yet
  1785. except if you "make blah KFLAGS=-DCKCHANNELIO).  Non-UNIX platforms need
  1786. z_xxx() routines filled in.  The idea is to allow multiple open files at once,
  1787. in any combination of read/write/append mode, referred to by their channel
  1788. number, which is assigned by FILE OPEN.  It works, but is not finished --
  1789. still need to:
  1790.  . Add more robustness to parser.
  1791.  . Make execution (esp. of READs) more efficient.
  1792.  . Pass error codes / messages back upon failure.
  1793.  . Put prototypes in header files.
  1794.  . Hook into IF OPEN command.
  1795.  . Document the API.
  1796.  . Document the commands.
  1797.  . Find out how to reasonably set Z_MAXCHAN in UNIX & elsewhere.
  1798.  . Add HELP text.
  1799.  . Test test test.
  1800. For now I'm leaving CKCHANNELIO undefined so people can build the current
  1801. sources normally without noticing it.  ckuusr.h, ckcker.h, ckuusr.c, ckuus7.c,
  1802. ckufio.c, 13 Jun 99.
  1803. Fixed v(math_pi) and v(math_e) to NUL-terminate themselves; when will I
  1804. learn to remember that strncpy() can't be trusted to do this...  ckuus4.c,
  1805. 14 Jun 99.
  1806. From Jeff: IKSD should not request the client to stop processing Kermit
  1807. packets simply because it is entering server mode.  ckcpro.w, 14 Jun 99.
  1808. From Jeff:
  1809.  . make v(authstate) work for the client side connection
  1810.  . added v(authtype) so a script can determine which method is being
  1811.    used to authenticate with the host.
  1812. ckuusr.h ckuus4.c ckuath.c, 14 Jun 99.
  1813. More work on the FILE command:
  1814.  . Added more robustness to parser.
  1815.  . Passed error codes / messages back upon failure.
  1816.  . Put prototypes in header files.
  1817.  . Documented the commands in ckermit2.txt.
  1818. So far only on SunOS.  ckcker.h, ckuusr.h, ckuus7.c, ckufio.c, 14 Jun 99.
  1819. Added "fi" as abbreviation for "finish", since "file" introduced a conflict.
  1820. ckuusr.c, 15 Jun 99.
  1821. Added #include <time.h> for SV68R3V6.  ckutio.c, 15 Jun 99.
  1822. Added some preprocessor tests for maximum number of open files: OPEN_MAX,
  1823. FOPEN_MAX, etc.  ckufio.c, 15 Jun 99.
  1824. Got z_getpos() working and improved the FILE STATUS display.
  1825. ckufio.c, 15 Jun 99.
  1826. Changed sv68r3v6 target to use wermit rather than xermit, since the xermit
  1827. built lost its mind when escaping back from CONNECT.  makefile, 16 Jun 99.
  1828. Added FOPEN, FREAD, FWRITE, FCLOSE, etc, as shortcuts for FILE OPEN, etc.
  1829. ckuusr.[ch], 16 Jun 99.
  1830. Added v(filemax) and v(fileerror).  ckuusr.h, ckuus4.c, ckufio.c, 16 Jun 99.
  1831. Straightened out parsing of read and write filenames.  ckuus7.c, 16 Jun 99.
  1832. Got READ/WRITE mode working.  ckufio.c, 16 Jun 99.
  1833. Made it possible for FREAD /CHAR and FWRITE /CHAR to handle NUL bytes.
  1834. ckuus7.c, ckufio.c, 16 Jun 99.
  1835. Fixed unguarded references to VN_FERR and VN_FMAX in ckuus4.c, 17 Jun 99.
  1836. Added EXEC command for UNIX only under #ifdef CKEXEC.  Like RUN, but overlays
  1837. C-Kermit with the given program.  Might be useful for who knows what -- PPP
  1838. dialing maybe?  ckcdeb.h, ckuusr.[ch], ckuus[25].c, ckufio.c, ckcplm.txt,
  1839. ckermit2.txt, 17 Jun 99.
  1840. Added "(R)" "(W)" "(RW)" "[EOF]" etc to FLIST display.  ckuus7.c, 17 Jun 99.
  1841. Added file functions:
  1842.   f_status(channel)     = 0 if not open; OPEN flags (1-7) if open.
  1843.   f_pos(channel)        = File pointer.
  1844.   f_handle(channel)     = File descriptor (UNIX).
  1845.   f_eof(channel)        = 1 if at EOF, 0 if not at EOF.
  1846.   f_getchar(channel)    = FREAD /CHAR.
  1847.   f_getline(channel)    = FREAD /LINE.
  1848.   f_getblock(channel,n) = FREAD /SIZE:n.
  1849.   f_putchar(channel)    = FWRITE /CHAR.
  1850.   f_putline(channel)    = FWRITE /LINE.
  1851.   f_putblock(channel,n) = FWRITE /STRING.
  1852. Removed all vestiges of BINREAD from code.  ckuus[r6].c, 17 Jun 99.
  1853. Changed FILE READ to allow variable name to be omitted, in which case it
  1854. just prints what it reads.  ckuus7.c, 17 Jun 99.
  1855. Added another arg to z_in() so allow length of buffer to be specified
  1856. separately from number of bytes to read.  ckcker.h, ckufio.c, ckuus[47].c,
  1857. 17 Jun 99.
  1858. Documented the new file i/o API, plus the new z_exec() function.  ckcplm.txt,
  1859. 17 June 99.
  1860. Made sure the code builds OK without CKCHANNELIO on HP-UX 10.20 and Linux.
  1861. Then tried building with CKCHANNELIO on HP-UX (non-ANSI compiler) and Linux
  1862. (ANSI).  It does, a good sign...
  1863. File i/o code verified on HP-UX 8.00, NeXT, ...  Since it uses <stdio.h>
  1864. features like fopen()/fread()/fwrite()/fclose()/etc, which have been used in
  1865. the mainline code since Day One for opening and reading command files, I'm
  1866. assuming it will be portable to all UNIXes, and so enabled it by default (i.e.
  1867. unless NOCHANNELIO is defined) for UNIX in ckcdeb.h.  Also moved the code to
  1868. ckvfio.c for VMS, where it built with no modifications (except I had to define
  1869. Z_MAXCHAN "by hand" since DECC defines OPEN_MAX as 5 (!).  Meanwhile, Jeff
  1870. copied the code to ckofio.c, where it built with no changes, suggesting we
  1871. should put it in a non-system-specific module...  So I moved the z_blah()
  1872. material from ckufio.c to ckuus7.c, and removed it from ckvfio.c and ckofio.c,
  1873. and took care of any difference in ckcdeb.h, and enabled the code for UNIX,
  1874. K95, VMS, and VOS.  18 Jun 99.
  1875. Added HELP text for FILE commands and functions.  ckuus2.c, 18 Jun 99.
  1876. Added v(math_precision).  ckuusr.h, ckuus4.c, 20 Jun 99.
  1877. OPEN !READ, READ ... was broken on VMS.  I don't see how it ever could have
  1878. worked -- the code to handle it was missing from rinfill().  Fixed in
  1879. ckvfio.c, 20 Jun 99.
  1880. Disallowed FILE OPEN 0 foo.bar, which worked and assigned the channel number
  1881. for foo.bar to the macro called "0".  Too confusing.  No numbers allowed here
  1882. from now on.  ckuus7.c, 20 Jun 99.
  1883. Added support for Multitech MT5634ZPX modem.  ckuusr.h, ckudia.c, 21 Jun 99.
  1884. Fixed a typo in the FREAD/FWRITE parser that could result in an infinite loop.
  1885. Also fixed a mistake in FREAD parsing that could make it ignore the target
  1886. variable.  ckuus7.c, 21 Jun 99.
  1887. Added FILE OPEN /BINARY.  ckcker.h, ckuus[27].c, 21 Jun 99.
  1888. On some platforms OPEN_MAX or FOPEN_MAX (from which we derive CKMAXOPEN) is
  1889. defined as a ridiculously small number so dimensioning our file array to
  1890. (CKMAXOPEN-ZNFILS-5) fails at compile time because the result is negative.
  1891. However, this tends to be a meaningless definition.  For example, DECC 6.0 for
  1892. VMS defines FOPEN_MAX to be the "minimum number of files that the DEC C
  1893. compiler for your system guarantees can be open simultaneously", which turns
  1894. out to be something like 5 when we all know that VMS will let you open
  1895. hundreds of files.  HP-UX 7.05 also has a very small number for this.  Since
  1896. we can't use relops in proprocessor directives (not portable), I changed the
  1897. code to allocate the file array dynamically to a minimum length of 16.  Let
  1898. the code fail at runtime if no more files can be opened.  ckcdeb.h, ckuus7.c,
  1899. 21 Jun 99.
  1900. Updated k95 Windows startup flags help text from Jeff.  ckuusy.c, 22 Jun 99.
  1901. Changed z_in() section that reads lines to do its own buffering.  z_in() now
  1902. contains three alternative methods for reading lines, chosen by #ifdef.  Ran
  1903. exhaustive trials and found no significant difference among the three, so I
  1904. went back the original and simplest one: fgets().  ckuus7.c, 22 Jun 99.
  1905. Installed a fix for Tru64 UNIX 5.0 from Farrel Woods at DEC; the utmp struct
  1906. used 64-bit times, but time() expected a 32-bit one.  ckufio.c, 22 Jun 99.
  1907. Added code to UNIX sysinit() to try getting the system configured open
  1908. file limit from sysconf(_SC_OPEN_MAX), called only if _SC_OPEN_MAX is defined.
  1909. Seems harmless enough, and works on at least SunOS and HP-UX 10.  ckutio.c,
  1910. ckuus[57].c, 22 Jun 99.
  1911. Added a cast to the malloc() for the array of file structs in z_open(),
  1912. plus assorted minor cleanups.  ckuus7.c, 23 Jun 99.
  1913. Peter E convinced me that the d=0 format for ffpxxx() functions was pretty
  1914. useless -- who cares what the "default precision" of the underlying C libary
  1915. "%f" printf format is?  So I changed it to give the maximum precision of the
  1916. hardware.  So, for example, when the precision is 16 digits, ffpdiv(10,3)
  1917. gives 3.333333333333333 instead of 3.333333.  But in making this change I
  1918. found that rounding is not done in many cases when d=0.  But it wasn't done
  1919. before either.  ckuus4.c, 23 Jun 99.
  1920. Kerberos changes from Jeff: ckuath.[ch], ckuus7.c, 23 Jun 99.
  1921. Peter E pointed out that server returns full pathname in ACK to F packet
  1922. when DISABLE CD is in effect.  Fixed in ckcpro.w, 24 Jun 99.
  1923. Fixed a typo in the new MT5634 modem support.  ckudia.c, 24 Jun 99.
  1924. Detlev Knorpp discovered that the sequence: "log packets" and then "log
  1925. connections" and then file transfer (in that order) makes C-Kermit dump core.
  1926. This was because of a typo in diaopn(), in which we closed the packet log
  1927. instead of the connection log, prior to opening the new one.  It seems that
  1928. logpkt() calls zsoutx() to write a packet-log record, but neither one of these
  1929. routines calls chkfn() to make sure the log file is actually open -- they just
  1930. assume it is.  Fixed the typo and had logpkt() call chkfn().  ckuus4.c,
  1931. ckcfn2.c, 24 Jun 99.
  1932. Added FCLOSE ALL to close all open files and FSEEK <channel> EOF to move the
  1933. file pointer to the end of the file.  ckuus7.c, 24 Jun 99.
  1934. Peter E has been reporting a bug in which FREAD would get an error the first
  1935. time it's called on an open file, but then works on all subsequent calls until
  1936. EOF.  This was because, for some reason on his HP-UX 6.5 and 7.05 systems, the
  1937. following sequence:
  1938.   errno = 0;
  1939.   x = fgets(buf,len,file);
  1940.   if (errno) ...
  1941. sets errno to something bizarre like ENOTTY, and z_in() was returning a
  1942. failure code in all cases if errno was nonzero after the fgets() or fread().
  1943. I changed the code to return an error only if fgets() or fread() actually
  1944. failed to return any characters.  Also added debugging statements to catch
  1945. when this happens.  ckuus7.c, 24 Jun 99.
  1946. Looked into getting ffpxxx() functions to round when d=0.  Not a chance.
  1947. The reason: The digit after the last significant digit is garbage, so it can't
  1948. be used to round the last significant digit.  ckuus7.c (comments only),
  1949. 24 Jun 99.
  1950. From Jeff:
  1951.  . Changes to allow K95 to be built with NO_ENCRYPTION
  1952.  . Correction to ckuus7.c.  ckferror() was being called with the wrong
  1953.    variable.
  1954.  . Fixes for SRP authentication problems.
  1955. ckcdeb.h ckuath.c, ckctel.c, ckuus7.c, 25 Jun 99.
  1956. The SRP business is as follows:
  1957. Several years ago it was discovered that there was an operating system whose
  1958. telnet server did not properly follow the telnet protocol.  In particular,
  1959. this OS vendor did not terminate its subnegotiations properly.  Instead of
  1960.  IAC SB <option> <data> IAC SE
  1961. the vendor sent
  1962.  IAC SB <option> <data> SE
  1963. Now, prior to implementing authentication and encryption there were no
  1964. subnegotiations that would send 8-bit high data.  So adding a check to enable
  1965. Kermit to work with this broken server was not a problem.  As it turns out,
  1966. when encryption or authentication is being used the chance for the <data> to
  1967. contain an SE byte is very likely.  Hence, the string that was supposed to be
  1968. 128 bytes was truncated at 45 bytes and the rest of the string was treated as
  1969. terminal data.  SRP didn't work and you got garbage.  This check had already
  1970. been removed for builds with encryption.  I have no removed this check for all
  1971. builds.  (End quote)
  1972. FILE OPEN channels were not being recycled.  Fixed in z_open(): ckuus7.c,
  1973. 25 Jun 99.
  1974. The SHOW STACK command, which is now also implicitly invoked any time we get a
  1975. command error, was not handling the FOR, WHILE, [X]IF, and SWITCH commands as
  1976. expected, since these are implemented as 2-level internal macros, in which we
  1977. stuff the %0..9 values from 2 levels up.  The stuffing can not change without
  1978. breaking existing scripts, so I added a hack to shostack() to test for these
  1979. four cases and make the appropriate substitutions in the display.  ckuus5.c,
  1980. 25 Jun 99.
  1981. Changed ?-help for switches to put a colon at the end of any switch that takes
  1982. an arg.  kwdhlp(): ckuus7,c, 25 Jun 99.
  1983. VMS C-Kermit 7.0 Beta.07 in server mode would crash if given a REMOTE HOST
  1984. command.  It doesn't crash any more, and responds correctly -- I must have
  1985. fixed it on June 20th when I fixed the broken OPEN !READ / READ sequence.
  1986. Made DELETE /QUIET not print error messages if file doesn't exist.  dodel():
  1987. ckuus6.c, 25 Jun 99.
  1988. Fixed HELP FUNC parsing once and for all.  Now you can type "help func" by
  1989. itself, or (e.g. for fsubstring()) "help func" followed by "sub", "fsub",
  1990. "sub()", "fsub()", "fsub", "fsub()", "\fsub()", "\fsub", etc etc, without
  1991. getting spurious error messages or having to confirm more than once, and a