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

通讯/手机编程

开发平台:

Windows_Unix

  1. Removed voluminous debug() statements from x[gp]nbyte().  ckcfns.c, 18 Oct 99.
  2. As an experiment, added a global flag wasclosed, which is set to 1 by any code
  3. that closes a connection (and sets ttyfd to -1), and is tested and reset at
  4. the top of the parse loop.  ckcmai.c (definition); ckuus5.c (test and reset);
  5. ck[uv]tio.c, ck[cl]net.c (set).  For this to work in other platforms requires
  6. similar additions to ck?tio.c.  A closed connection is noticed only in the
  7. command loop, because that's the only place that any user-defined actions can
  8. be executed.  If the user gives a SET LINE/PORT/HOST/etc command while another
  9. connection is still open, there is also a check in hupok(), so if they have
  10. SET EXIT WARNING ON it will work here too.  Otherwise it won't since both the
  11. close and the new open happen within the same call to ttopen().  A second
  12. variable, whyclosed, tells why the connection was closed: 0 is the catch-all
  13. "closed by remote"; 1 = HANGUP or CLOSE by user, 2 = auth failure.  At the top
  14. of the parse loop, if wasclosed is set and a macro called ON_CLOSE is defined,
  15. we set it up and execute it.  The close reason (0, 1, or 2) is passed to the
  16. macro as %1.  18 Oct 99.
  17. Spiffed up ON_CLOSE a bit by calling it in clsconnx(), which is our new
  18. all-purpose ckuus*.c connection-closing routine, and in the exit sequence,
  19. just before ON_EXIT.  This SEEMS to catch all the places where we need it.
  20. ckuus[57x].c, ckermit2.txt, 18 Oct 99.
  21. Fixed SET FILE CHARACTER-SET to not use the same chained FDBs as REMOTE
  22. SET  FILE CHARACTER-SET.  ckuus7.c, 19 Oct 99.
  23. From Jeff: ckcmai.c: the login functionality has to take place in the first
  24. thread on NT.  ckcfns.c: fix pnbyte() call in reof() to reference appropriate
  25. output function pointer.  ckcmai.c ckuus3.c: minor change to allow SET SYSLOG
  26. to only work on IKSD during the processing of IKSDCONF.  19 Oct 99.
  27. Next project: SEND /ARRAY:<arrayref>.  When done, this command lets Kermit
  28. send the contents of any array.  The major goal is to link file transfer and
  29. scripting.  With this, for example, a Kermit script can read selected lines
  30. from a file into an array, manipulate the lines or the array in any desired
  31. way, and send the result without intermediate files or filters.  Added parsing
  32. to ckuusr.[ch], plus a preliminary test routine that I'll finish & move
  33. tomorrow.  19 Oct 99.
  34. Finished SEND /ARRAY.  Removed test code from ckuusr.c, moved the dummy
  35. agnbyte() routine (get next byte from array) to ckcfns.c, changed zminchar()
  36. macro definition to call agnbyte() when sending from an array.  Faked the
  37. filename as "_array_a_" (or b, etc).  Made sure we can still build with
  38. -DNOSPL.  ckcker.h, ckuus[r2].c, ckcfn[s3].c, ckermit2.txt, 20 Oct 99.
  39. Merged in Jeff's changes mainly for Kerberos and ON_CLOSE reasons for Telnet
  40. protocol-based closure.  Many modules.  20 Oct 99.
  41. Removed the -DMAINISVOID's that were added to the makefile recently and
  42. changed the default type for main() from void to int, and simplified the
  43. hideous #ifdefs around it.  NOW let's see who hollers...  ckcmai.c, 20 Oct 99.
  44. Shuffled some lines in TRANSLATE to avoid "statement not reached" errors in
  45. HP-UX.  ckuus4.c, 21 Oct 99.
  46. Fixed a debug() call in ckcfn3.c, 21 Oct 99.
  47. Peter E reports that when using a Telnet modem server, after the following
  48. sequence of commands:
  49.   dial xxxx <-- does not exist in dialing directory
  50.   dial yyyy <-- does exist in dialing directory
  51. the redial number is xxxx and not yyyy.  It doesn't happen when dialing with a
  52. serial port.  The variable is dialnum.  I don't have a Telnet modem server and
  53. can't reproduce it, and inspection of the code shows that from between the
  54. time the number is fetched and it is stored, there is no different path
  55. through the code for serial and network dialing.  Will have to dummy it up
  56. with a fake modem server:
  57.   set host /connect * 3000
  58.   set terminal newline on  ; (So Enter sends CRLF)
  59. Client does the regular sequence to use it:
  60.   set host 0 3000
  61.   set modem type hayes
  62.   set dial display on
  63.   set dial directory foo ; File that has entry for yyyy but not xxxx
  64.   dial xxxx
  65. In the server window I type OK<Enter> to each setup command and then
  66. NO CARRIER<Enter> to the ATDTxxxx comand.  Then I tell client to "dial yyyy"
  67. and go thru the same sequence at the server.  Now SHOW DIAL on the client
  68. shows the correct redial number: yyyy (not xxxx).
  69. Changed character-set associations for incoming files when transfer character
  70. set is UCS-2 or UTF-8 to be UCS-2 in Windows, UTF-8 elsewhere.  ckuxla.c,
  71. 22 Oct 99.
  72. In testing the previous change noticed that SEND /TEXT did not work any more,
  73. i.e. it did not force a text-mode transfer.  Refer to previous notes
  74. throughout 1998 about automatic mode-switching versus SET TRANSFER MODE, etc.
  75. The notes make sense but the code in whoarewe() did not agree with the prose.
  76. Removed a mistaken test on the saved transfer mode.  ckcfns.c, 22 Oct 99.
  77. A minor command-parsing improvement.  Suppose you type "te" and then Esc at
  78. top level.  It beeps because more than one command starts with "te", so then
  79. you type "?" to see what they are but Kermit shows "telnet" as the only
  80. possibility.  So why the beep?  Because of invisible keywords like "telopt",
  81. "terminal", and "text".  But there is no way for the user to discover them.
  82. The improvement is: if ? is typed AFTER the beginning of a keyword field, then
  83. invisible keywords are shown too, but if it is typed at the beginning of a
  84. field, only visible keywords are shown, as before.  ckucmd.c, 22 Oct 99.
  85. Since we have the Base64 conversion routines anyway, added /FROMB64 and
  86. /TOB64 switches to the COPY command.  ckclib.[ch], ckuus[26].c, 22 Oct 99.
  87. From Jeff: Correction to TAPI dialing setup: ckuus6.c; minor Win9x
  88. authentication changes: ckcmai.c.  23 Oct 99.
  89. Added some debugging and commentary to makestr().  ckclib.c, 23 Oct 99.
  90. Put a malloc-failure error check after setting redial number to help catch
  91. Peter E's problem.  Ran the big demo script with debug log to see if any
  92. malloc entries appeared; none did.  ckuus6.c, 23 Oct 99.
  93. There was an inconsistency in macro invocations.  If xx is macro name, it can
  94. be invoked as "xx" or "do xx".  An "immediate" macro can be invoked as
  95. "{ command, command, ... }".  But "DO { command, command, ... }" gave a syntax
  96. error.  Fixed in ckuusr.c, 23 Oct 99.  Restriction: immediate macros can not
  97. take args (this would have been a big deal to program in the non-DO case but
  98. actually pretty easy in the DO case).  The big demo script still works.
  99. Rob Seace <rob@wordstock.com> reported that the getline script did not work
  100. in QNX.  Of course it doesn't, QNX has no UUCP lockfiles or any other method
  101. for locking dialout devices.  But Rob pointed out that QNX has a dev_info()
  102. call that returns the open count.  But we can't really use it as a lock since
  103. we don't necessarily know its full set of behaviors, nor do we know to what
  104. degree users depend on the current behavior.  So I added a new command, which
  105. is visible only in QNX (but which can be given anywhere, but does nothing):
  106. SET QNX-PORT-LOCK { ON, OFF }.  It is OFF by default.  When ON, it allows the
  107. open count to serve as a port lock.  In the meantime (until the next Beta),
  108. added a note to getline.  Then made a new getline that works right with QNX,
  109. which can be installed when Beta.11 is released.  In ckutio.c, I added
  110. a qnxopencount() routine, which gives the device open count.  ttlock() calls
  111. this and fails if the count is > 1 and QNX-PORT-LOCK is ON.  SHOW COMM (fo
  112. QNX only) displays the QNX-PORT-LOCK setting and, if a device is open, the
  113. current open count.
  114. In building on QNX I found some #ifdefs had slipped out of their places as
  115. they are wont to do, and so fixed them.  ckutio.c,
  116. Found that the old bug of curses working only once in QNX seems to be fixed,
  117. whether by Kermit or a newer QNX version I don't know.
  118. Tried resurrecting the 16-bit QNX version, this time with -DNOSPL and
  119. -DNOFLOAT.  It built fine, starts OK, but it beeps when you type a space, CR,
  120. etc, after the top-level keyword.  But aside from that it seems to work OK, so
  121. apparently the problems I've been having till how have to do with the new
  122. floating-point support (plus the large size of ckuus4.c).  The compiler is
  123. Watcom 10.6.  Extensive debugging shows the bell is not being run by Kermit
  124. calling bleep().  Tried building again with TCP/IP and found it would make the
  125. connection, complete the Telnet negotiations, show the login prompt, but
  126. apparently would not send keystrokes.  Comparing logs from the 16 and 32 bit
  127. versions showed that the qnx32 version had FIONREAD defined, but qnx16 did
  128. not.  Fiddled the #includes to force the 16-bit to include <ioctl.h>, and now
  129. it does use the FIONREAD ioctl, which works, but we still get the same
  130. symptom, and I really can not see the difference in the log.  This was all
  131. with ckucns.c.  Switched back to ckucon.c.  No difference.  The debug log
  132. of the 16-bit version looks just like the debug log of the 32-bit version...
  133. Well, to make a very much longer story short, it turns out a piece of
  134. buffer-filling code was lost in the #ifdefs for NOCSETS builds when Unicode
  135. support was added to ckucns.c, and the mistake was copied to ckucon.c.
  136. Fixed in both, 23 Oct 99.  (But we still get the mysterious beep.)
  137. Makefile updated to rehabilitate qnx16.  23 Oct 99.
  138. Fixed a misplaced last-minute #ifdef in yesterday's code that prevented
  139. ckcuni.c from compiling.  24 Oct 99.
  140. Propogated #indef NOCSETS correction to ckvcon.c, 24 Oct 99.
  141. There has always been a confusing lack of symmetry between OPEN and CLOSE.
  142. Also, SET LINE and SET HOST are misnamed because SET is not supposed to be
  143. an action command.  So...
  144.  . Uncoupled the OPEN command from file disposition symbols as keyword
  145.    values, and defined a new set of OPN_xxx symbols for it. ckcker.h,
  146.    ckuusr.h, 24 Oct 99.
  147.  . Made OPEN HOST, OPEN LINE (PORT) be synonyms for SET HOST, SET LINE
  148.    (PORT).  ckuus[36].c, 24 Oct 99.
  149.  . Made CLOSE !READ and CLOSE !WRITE acceptable synonyms for CLOSE READ
  150.    and WRITE, and CLOSE HOST, LINE, and PORT synonyms for CLOSE
  151.    CONNECTION.  ckuusr.c, 24 Oct 99.
  152. Some corrections to typos un_to_sj() noticed by Jeff.  ckcuni.c, 24 Oct 99.
  153. Another longstanding item on the to-do list: INPUT pattern matching.  Expect
  154. can do it, Kermit can't.  I thought of a way to add this that does not involve
  155. huge amounts of redesign or breaking existing scripts.  Since the pattern is
  156. always passed through xxstring at parse time anyway, I added a new function
  157. fpattern(), which simply returns its argument (after evaluation) and sets a
  158. flag saying it's a pattern.  Then a parallel array of flags is passed to
  159. doinput() along with the regular array of MINPUT search strings.  This allows
  160. both patterns and literal strings to be used with INPUT and lets MINPUT be
  161. given any mixture of patterns and literal strings.  In the matching loop, if
  162. the current search string is a pattern, we call ckmatch() on the pattern and
  163. all right substrings of the string we have input so far.  Crude but effective
  164. (and necessary, since we also want to set a variable to the piece that
  165. matched, and this could not be done otherwise).  ckuusr.h, ckuus[r24].c,
  166. ckermit2.txt, 24 Oct 99.
  167. Updated REINPUT to also accept a pattern.  ckuus4.c, 24 Oct 99.
  168. Protected a comparison of type KEY with > 255 by #ifdefs on platforms where
  169. KEY is CHAR or char.  showkeycode(): ckuus5.c, 25 Oct 99.
  170. Added debugging to dodial() and ckdial() to catch Peter E's bug.  ckuus6.c,
  171. ckudia.c, 25 Oct 99.
  172. Some minor syntax corrections for VMS.  ckvfio.c, ckuus6.c, 25 Oct 99.
  173. Built on VMS with runtime checking of array bounds, pointer values, and
  174. for references to uninitialized variables -- let's hear it for DECC!.  Tested
  175. CONNECT mode, file transfer, and script execution -- no problems were reported.
  176. 25 Oct 99.
  177. Added ON_OPEN.  It gets ttname[] as its only argument; probably most other
  178. items are available as v(things).  More open/close symmetry...  ckuus[7y].c,
  179. 25 Oct 99.
  180. Peter's REDIAL problem solved.  It's not Kermit, it's his modem.  The modem is
  181. told to "ATDsomestring" and replies "OK" because "somestring" contains an "s",
  182. which triggers some unknown function in the modem.  To Kermit, "OK" means
  183. "partial dialing successful" and so sets the partial flag, which in turn
  184. inhibits storage of the REDIAL number.  Changed so when the modem replies "OK"
  185. to an ATD command and the Kermit command was not PDIAL and the dial number did
  186. not end with ';', it is now considered an error.  ckudia.c, 26 Oct 99.
  187. Corrections from Jeff to dofast().  ckcfn3.c, 26 Oct 99.
  188. Lots of minor changes from Jeff, plus the beginning of an IKSD command (what
  189. is it?).  ckcdeb.h ckcfn3.c ckcker.h ckuath.c ckucns.c ckutio.c ckuus2.c
  190. ckuus4.c ckuusr.c ckuusr.h ckuusx.c ckwart.c, 27 Oct 99.
  191. Changed UNIX CONNECT-mode Ctrl-? menu to be clearer and to only list
  192. options that make sense on the current kind of connection.  ckucns.c,
  193. 27 Oct 99.
  194. In trying to chase down a report that K95 reported backwards file types
  195. when receiving files from TSO Kermit, which, unlike most other Kermits,
  196. includes the Format of Records within Packets attribute (/), changed gattr()
  197. to handle this attribute in incoming packets (previously it ignored it
  198. except in VOS, and the VOS code was bogus).  This made no difference.  So then
  199. I dummied up C-Kermit to send A-packets with the same fields as TSO Kermit.
  200. This made no difference either -- I still can't see anything wrong.  ckcfn3.c,
  201. 27 Oct 99.
  202. Found a couple places in ttinl() where wasclosed wasn't being set, which
  203. prevented ON_CLOSE from running if the connection dropped during a file
  204. transfer.  As a by-product, fixed this case so ttclos() was called, thus
  205. ensuring that subsequent calls to ttchk() would behave as expected, rather
  206. than indicating the connection was still open.  ckutio.c, 27 Oct 99.
  207. Added "iso2022jp" as a synonym for JIS-7.  They aren't exactly the same, but
  208. they're close enough (ISO 2022-JP is specified in RFC1463 and seems to be the
  209. same as DEC Kanji, which we also support as if it were JIS-7, different only
  210. in that JIS-7 includes SO/SI access to halfwidth Katakana and the other two
  211. don't).  ckuxla.c, 27 Oct 99.
  212. Rewrote UNIX ttclos() to handle the case better where close() doesn't return
  213. and we time out.  Now we set O_NDELAY first (if available) we also re-set the
  214. alarm before trying any operation that might hang, such as tthang(), ttres(),
  215. close(), etc, to avoid being stuck for a really long time (or forever), and
  216. in fact, since any or all of these might time out, the new implementation is
  217. a state machine that remembers how far it it got so it doesn't repeat any
  218. previous steps (which has been its mistake up till now).  ckutio.c, 28 Oct 99.
  219. Discovered that mdmhup() (the routine that hangs up a modem by sending +++ATH0
  220. or whatever to it) didn't work right if no prior DIAL command had been given,
  221. since the modem-command response-reading function pointer had not yet been set
  222. up.  Fixed in ckudia.c, 28 Oct 99.
  223. Added more error-checking and debugging to the POSIX section of tthang().
  224. ckutio.c, 29 Oct 99.
  225. Added Rockwell V.90 modem.  ckuusr.h, ckudia.c, 29 Oct 99.
  226. Assorted changes from Jeff: ckuath.c ckuusy.c ckuus5.c ckcnet.c ckuusr.h
  227. ckuusr.c, 29 Oct 99.
  228. From Jeff: ckcmai.c - iksdcfg flag in the wrong place; ckudia.c - typo in new
  229. modem def's; ckuusr.c - correction for OS2; ckuath.c - SSL/TLS improvements.
  230. 30 Oct 99.
  231. Dave Sneddon noticed when C-Kermit was in the middle between a terminal and a
  232. VMS system, that SET TERM/INQ on VMS caused errors if SET TERM APC is ON.  The
  233. same thing happens with the VMS and UNIX versions.  I seem to have broken this
  234. when adding the Transparent Print code.  The problem is that escape sequences
  235. from the keyboard are being treated just like escape sequences from the host
  236. -- buffered up and then sent to the "printer" when complete.  Oops.  In fact,
  237. this reveals a HUGE whole that opened up when I converted the UNIX CONNECT
  238. module from two forks to one.  In the 2-fork version, each fork had its
  239. separate data space, thus variables like "inesc" were separate for the
  240. incoming and outbound data streams.  In the single-fork version, the same
  241. state machine and variables were used simultaneously for the host-to-screen
  242. and keyboard-to-host streams, resulting in no end of confusion -- I'm
  243. astounded nobody noticed it till now.  This was fixed by making the state
  244. variables (inesc and oldesc) into 2-element arrays, indexed by 0 = char from
  245. host, 1 = char from keyboard.  Works well without breaking APC and transparent
  246. printing.  ckucns.c, 30 Oct 99.
  247. Same changes for VMS.  Built & tested OK.  ckvcon.c, 30 Oct 99.
  248. From Jeff: some debugging changes for the network modules.  ckctel.c,
  249. ckcnet.c, 31 Oct 99.
  250. Fixed trailing blanks & long lines.  ck[cuw]*.[cwh], 31 Oct 99.
  251. Got rid of startup message "Default file-transfer mode is ...", since it
  252. doesn't give the user any clues about how to change it.  Changed SHOW FILE to
  253. enunciate the relevant info a bit more clearly.  ckuus[45].c, 31 Oct 99.
  254. Fixed Linux ncurses target to allow for ncurses.h being in either /usr/include/
  255. or /usr/include/ncurses/.  From Thomas Dickey <dickey@clark.net>, 2 Nov 99.
  256. Fixed typos Rockwell V.90 modem entry.  ckudia.c, 2 Nov 99.
  257. Changed command module not to print "?Timed out" if ASK-TIMEOUT expires if
  258. QUIET is ON.  ckucmd.c, ckuus6.c, 2 Nov 99.
  259. The notation fsubstring(m(name),n1,n2) was annoying me, so I added a
  260. shorthand: s(name[n1:n2]).  Works like m(name) except the substring notation
  261. is allowed; the separate letter is to prevent collisions with do-it-yourself
  262. data structures like the ones in the script library.  ckuus4.c, ckermit2.txt
  263. Section 7.24, 2 Nov 99.
  264. Added fhex2n(), the inverse of fn2hex(), for converting a hex number to
  265. a decimal one.  Also fhex2ip() to convert a hex IP address into a dotted
  266. decimal one, and fip2hex() to do the inverse. ckuusr.h, ckuus[24].c, 2 Nov 99.
  267. SSL/TLS stuff from Jeff: ckuus3.c ckuus7.c ckudia.c ck_crp.c ckctel.c
  268. ckutio.c ckcnet.c ckuath.c ckuusr.c ckuus2.c makefile, 2 Nov 99.
  269. Fixed trailing blanks & longlines in Jeff's files.
  270. Added foct2n() for symmetry with fn2oct().  ckuusr.h, ckuus[24].c, 3 Nov 99.
  271. Nested s(blah[n:m])'s didn't work, e.g.
  272.   s(block[1025:fhex2n(s(block[101:4]))])
  273. Problem: zzstring()'s ?(name) parser didn't allow for nested parentheses.
  274. Therefore some other stuff that should have worked even prior to the
  275. introduction of s() wouldn't have worked either, e.g. m(fxxx(..)).
  276. Fixed in ckuus4.c, 3 Nov 99.
  277. Changed arraybounds() not to fail on negative numbers (because I cheat and
  278. use arraybounds() to parse the range specifier in s(blah[m:n]) and there
  279. is no reason not to allow negative numbers).  ckuus5.c, 3 Nov 99.
  280. SSL/TLS stuff from Jeff: ckuus7.c ckutio.c ckuath.c, 4 Nov 99.
  281. Peter E discovered an awful bug from the Oct 9-11 [ck]strncpy() work, namely
  282. that, under certain circumstances, after a command file or macro was executed,
  283. top-level commands could no longer be parsed.  It seems that the atom buffer
  284. (atmbuf[]) was the one place where we really did need strncpy()'s property of
  285. zero-filling to the given length, rather than depositing just one terminating
  286. NUL as ckstrncpy() does.  So changed all ckstrncpy(atmbuf,blah,ATMBL) back
  287. to strncpy(atmbuf,blah,ATMBL); atmbuf[ATMBL] = NUL.  I also make cmini()
  288. zero the atom buffer in addition to the command buffer (and in the process
  289. let it use memset() for this rather than a look if USE_MEMCPY is defined --
  290. a significant speedup now that these buffers are so big).  ckucmd.c, 4 Nov 99.
  291. From Jeff: A fix for the annoying problem of Kermits A->B->C, with A and B
  292. both having autodownload enabled.  Since B has it enabled, it should not also
  293. pass the packet on to A, so at the moment when it detects it has a valid
  294. packet, it purposely alters the last few chacters so A will not detect it too.
  295. ckucns.c, 4 Nov 99.
  296. From Jeff: preliminary changes to enable Telnet option debugging in command
  297. mode.  ckctel.c, 4 Nov 99.
  298. From Jeff: Rest of SET TELNET DEBUG, plus propogation of autodownload change
  299. to ckucon.c, plus casts to stifle complaints from yesterday's changes.  Many
  300. modules, 5 Nov 99.
  301. From Joel Soete <JSO@EUROPAY.COM>, changes to support "Trusted HP-UX".
  302. makefile, ckufio.c, 5 Nov 99.
  303. Propogated autodownload change to ckvcon.c. 5 Nov 99.
  304. Added another compact substring notation: :(variable[start:length]).  This
  305. differs from s(macro[start:length]) in that the result of expanding the
  306. variable is NOT looked up in the macro table.  So now we have compact
  307. substring notation for all kinds of variables.  ckuus4.c, 5 Nov 99.
  308. Over the past week, I prototyped an IKSD active-sessions database offline,
  309. using fopen, fseek, fread, fwrite, ftruncate, and fflush, which we know to be
  310. highly portable since they've been in C-Kermit 7.0 since the general file i/o
  311. package was added in Beta.08 back in July.
  312. A prototype display module was developed as a Kermit script, iksdpy, which is
  313. what prompted the recent changes to the script language -- hex and IP address
  314. conversion functions, compact substring notation for extracting database
  315. fields, etc.  Unfortunately, however, fread() doesn't work well for the
  316. display module.  Reading the records sequentially poses no problem (and works
  317. well), but suppose we want to read the same record repeatedly by fseek()ing
  318. and fread()ing in a loop.  In this case the C library tends not to refresh its
  319. buffer from the disk so we never see any updates.  The only remedy seems to be
  320. to close and reopen the file each time thru the loop to force a fresh disk
  321. read.  The script does this and it doesn't seem to slow it down much (this is
  322. done only when focussing on a single session).
  323. Preliminary documentation for the database is in the new file iksdb.txt, which
  324. will be merged with iksd.txt shortly.
  325. Now that the prototype seems to be in good shape, I merged the code into
  326. C-Kermit:
  327.  . Data and struct definitions: ckcker.h.
  328.  . Selection (IKSDB) and operating parameters: ckcdeb.h.
  329.  . General-purpose routines (lset, rset, long/hex conversion): ckclib.[ch].
  330.  . Database code: ckuusx.c.
  331. ckuusx.c was chosen for the database code because that was the least bad
  332. existing module to put it in, from the standpoint of size and appropriateness.
  333. I didn't want to create a new module since the amount of new code is not that
  334. large (about 500 lines), and adding a new module is a big pain.  With these
  335. changes, the code compiles and links OK both with IKSDB defined and not
  336. defined (when it's defined it adds only 8K to the image size).  5 Nov 99.
  337. I also built with Kerberos IV and OpenSSL (sunos41gcc+krb4+openssl): builds OK
  338. except for a bunch of warnings from ck_crp.c ("comparison is always 1..."),
  339. but then it acts very strange when started -- can't parse command files, beeps
  340. after every top-level keyword (hmmmm -- the same symptoms as the qnx16 build;
  341. see notes from 23 Oct...)  I don't think this has anything to do with IKSDB --
  342. it smells more like one of those ckstrncpy() things...  Nope, that's not it
  343. (I added code to turn ckstrncpy() back into real strncpy() and rebuilt but it
  344. made no difference: "touch ckclib.c; make blah KFLAGS=-DNOCKSTRNCPY").  I also
  345. built again with -DNOIKSDB: same thing, so it's something else.  5 Nov 99.
  346. Some minor adjustments to top-level command parsing; some of the error
  347. conditions were not giving error messages promptly.  The possibilities are:
  348.  1. Top-level keyword (cmdtab[])
  349.  2. Token (!, etc)
  350.  3. Macro name
  351.  4. Immediate macro (e.g. "{ echo foo, echo bar }").
  352. (1) includes the DO command, which can itself take a macro name or an
  353. immediate macro.  Allowing for all this created a situation in which typing
  354. something invalid as the first word in a command gave no error message (of
  355. course the error was still caught later).  Also "DO { commmand, ... }" seems
  356. to have been broken somewhere along the line.  Fixed in docmd(): ckuusr.c,
  357. 6 Nov 99.
  358. Added fradix(number,r1,r2), general-purpose radix conversion between any two
  359. radices 2-36.  Made all the silly "hex2n, n2oct", etc, functions invisible.
  360. Hurray, finally we have binary numbers, not to mention base 36, etc.  Also
  361. replaced custom code in fhex2n() and foct2n() to just the use general radix
  362. code.  ckuusr.h, ckuus[24].c, 6 Nov 99.
  363. Back to IKSDB...  Added --database:{on,off} and --dbfile:<filename>.
  364. ckuusr.h, ckuus[5y].c, 6 Nov 99.
  365. Added dbinit() to initialize database name, my IP address, pid, etc.  Changed
  366. getlocalipaddress() to store not only the string form but also the unsigned
  367. long form in the new var myxipaddr.  ckcnet.c, ckuusx.c, ckcmai.c, 6 Nov 99.
  368. Added call to dbinit() at startup and a call to freeslot() in doexit().
  369. ckcmai.c, ckuusx.c, 6 Nov 99.
  370. Added code to zvpass() to fill in user info.  I didn't check the auth stuff.
  371. ckufio.c, 6 Nov 99.
  372. Tested with IKSD.  Init is good -- PID, IP, peer IP, times, etc.  Login as
  373. real user is good; username is picked up, and then record is freed when user
  374. logs out or exits.  Ditto anonymous.
  375. Filled in state-change updates simply by calling slotstate() from within
  376. cksyslog().  ckufio.c, 6 Nov 99.
  377. Initialized current directory in zvpass() and updated in zchdir().  ckufio.c,
  378. 6 Nov 99.
  379. Compiles OK, but it doesn't totally work: the user's initial directory is
  380. not filled in for some reason.  The state changes are not always recorded,
  381. probably something to do with tying it to syslog.
  382. From Jeff: OS/2 adaptations and minor corrections to yesterday's work, plus
  383. more auth changes.  ckuath.c ckufio.c ckuusx.c ckuus7.c ckcdeb.h ckcnet.c
  384. ckclib.c, 7 Nov 99.
  385. Moved ckxlogging & ckxsyslog definitions from ckufio.c to ckcmai.c.
  386. Moved dbopen def from ckuusx to ckcmai.  Put externs for all these in ckcdeb.h.
  387. Then I tried to unify syslogging and the IKSD database with:
  388.   #define LOGSACTIVE(a) ((ckxsyslog>=(a)&&ckxlogging)||dbopen)
  389. and then using:
  390.   if (LOGSACTIVE(SYSLG_PR))
  391.     cksyslog(SYSLG_PR, ...)
  392. But it was a world of trouble.  First of all, it blew up the compiler (gcc
  393. 2.7.2) on ckcpro.c.  In cases where it didn't blow up, I still didn't get the
  394. required results.  So then I removed the macro and added separate calls to
  395. slotstate() when I wanted to update the database, which actually gives more
  396. control and therefore better results, at the cost of an extra function call
  397. (but not always).  But now ckcpro.c blows up the compiler again unless I build
  398. it without -O.  Will come back to this...  First:
  399.  1. Moved dbinit() so a record shows up as soon as session starts,
  400.     rather than waiting for login.  ckcmai.c.
  401.  2. Updated state for command mode.  ckuus5.c.
  402.  3. Changed locking method from link() to rename().  ckuusx.c.
  403.  4. Fixed fractured anonymous username.  ckuus7.c.
  404.  5. In Dir field, prepended anonroot for guest.  ckufio.c.
  405.  6. Made username for anonymous be "anonymous:<passwd>". ckufio.c.
  406.  7. #ifdef'd ftruncate() and kill() calls away for K95.
  407. Now it all works pretty well, and should build and run for K95 too, except
  408. there is no stale-pid detection (this can be fixed if the APIs have an "Is
  409. this pid active?" call).  7 Nov 99.
  410. Back to ckcpro.w.  We've been having trouble with it for some time -- more and
  411. more platforms are needing to build it without optimization because -O blows
  412. it up.  I think the problem is that the wart-generated switch() statement has
  413. become too big.  We know there is nothing wrong about having many cases in a
  414. switch() because in the charset modules we have some with hundreds or
  415. thousands of cases, whereas the protocol module only has 73.  So the touchy
  416. item seems to be either the amount of code in the largest case, or the total
  417. amount of code in the switch.
  418. Experiment 1: Build on watsol, which also has gcc 2.7.2, to see if it's
  419. something with watsun (swap space filled up or something).  Success.
  420. Experiment 2: Build on watsun with regular cc.  Success.
  421. Well, these are inconclusive, but we know we have problems elsewhere, so:
  422. Experiment 3: Move the code out of the "received an S packet" case into a
  423. separate routine and rebuild.  gcc still blows up, but cc builds it OK, and
  424. the result works OK -- that is, it receives files normally.
  425. Continuing in this vein I moved the eight longest cases to their own routines,
  426. handled the compilation glitches, added appropriate return values, rebuilt
  427. with gcc (this time with no complaint), and tested each routine successfully.
  428. Nevertheless, this was radical surgery and the patient should be watched
  429. carefully for a few weeks.  ckcpro.w, 7 Nov 99.
  430. Fixed some minor glitches in fradix().  ckuus4.c, 7 Nov 99.
  431. Built the Kerberized version and tested it OK (the trouble I had last time was
  432. probably because I didn't move the latest ck_*.[ch] files into the build
  433. directory).  Worked fine, authentication and all.  7 Nov 99.
  434. Yesterday's code shuffling in ckcpro.w had the nasty side effect that IKSD
  435. would never issue an interactive login prompt.  The problem was that I
  436. overlooked the QUIT macro, which is used in some of the new routines.  QUIT
  437. can return 0 or 1, whereas RESUME always returns 1.  I was using 0 to mean
  438. "stay in state machine".  Now the new routines return -1 for this, and 0 or
  439. 1 are passed up the call stack.  ckcpro.w, 8 Nov 99.
  440. Gerry Belanger reported some compilation errors revealing that IKSD was
  441. not disabled if NOLOGIN was defined, so I fixed that in ckcdeb.h, 8 Nov 99.
  442. Added a missing #endif in ckucon.c, 8 Nov 99.
  443. Ran the code through gcc with:
  444.  -Wreturn-type -Wcomment -Wformat -Wuninitialized
  445.  -Wpointer-arith -Wredundant-decls
  446. and removed various redundant declarations & prototypes, etc.
  447. "-Wwrite-strings" is useless because is produces tens of thousands of
  448. warnings about "discards 'const' from...".  Nothing especially serious was
  449. found, except one printf referencing a long with "%d" and a couple "returns
  450. without a value", which is what I was looking for.  Pretty much all modules
  451. were changed.  8 Nov 99.
  452. Added zchkpid() to ckufio.c, and changed all references to "kill(xxx,0);" in
  453. non UNIX-specific modules to zchkpid().  (This needs to be filled in for K95
  454. and VMS.)  ckcplm.txt, ckcdeb.h, ckufio.c, 8 Nov 99.
  455. As an experiment, I removed the "pop back to command mode after each protocol
  456. operation" feature from IKSD by #ifdef'ing out the "justone = 1;" commands in
  457. ckcmai.c (search for IKSDPOPBACK).  This seems to do absolutely no harm, and
  458. we no longer get the jarring state changes every time we do something (which
  459. are obvious now in IKSDPY); client/server mode stays put, but CONNECT from the
  460. client always forces IKSD back into command mode, and SERVER at the IKSD
  461. prompt still puts it in server mode and makes the client pop back.  FINISH
  462. works right, BYE works right, etc.  8 Nov 99.
  463. Spiffed up IKSDPY a bit; gave it consistent commands in each screen and
  464. a unified "command parser" and help screen rather than 2 different ones.
  465. 8 Nov 99.
  466. Revisiting the question of the LOGIN and LOGOUT commands from 20 Aug 98...
  467. Presently LOGIN is not a command.  LOGOUT is a command, but acts only locally;
  468. that is, it works only when given at the IKSD prompt.  To log in and out from
  469. the client requires REMOTE LOGIN and REMOTE LOGOUT.  Why can't these be just
  470. LOGIN and LOGOUT?  Let's see...
  471.    Client                           Server
  472.   LOGIN     Sends REMOTE LOGIN to server     Says "?Already logged in"
  473.   LOGOUT    Sends REMOTE LOGOUT to client    Logs out (as now).
  474. Made it so.  Seems fine.  If these commands are given to the client when it
  475. has no connection, an error message is printed and the command fails.
  476. Otherwise it acts as shown above.  Why didn't I like it before?  Probably
  477. because I thought that LOGIN could be given at the IKSD prompt to actually
  478. log in.  But it can't, so good, another wart removed.  ckuusr.c, 8 Nov 99.
  479. Updated & incorporated iksdb.txt into iksd.txt.  8 Nov 99.
  480. From Jeff:
  481.  . SRP encryption key generation was broken.
  482.  . Infinite loop in ckuusx.c in K95 only.
  483.  . Extra ENCRYPT messages when encryption can't possibly be used.
  484.  . NTLM AUTH not working on Win2K.
  485.  . IKSD now compatible with Win2K.
  486. ckuusx.c ckctel.c ckuath.c ck_crp.c, 9 Nov 99.
  487. Changed wart to never output lines with trailing blanks.  ckwart.c, 9 Nov 99.
  488. Fixed long lines & trailing blanks in all source files.  9 Nov 99.
  489. Shuffled a couple return()s and #ifdefs in the new routines in the protocol
  490. module to stifle "statement not reached" warnings.  ckcpro.w, 9 Nov 99.
  491. Added -DNOGETUSERSHELL and -DNOSYSLOG to the Unixware 1.x and 2.0 entries.
  492. makefile, 9 Nov 99.
  493. Discovered the DATE command was truncating the last character of the result.
  494. Another ckstrncpy() foulup (subtle difference in the meaning of the 3rd arg:
  495. the number of bytes to copy to strncpy, but to ckstrncpy it's the size of the
  496. buffer, which must be NUL-terminated; thus changing strncpy(dest,date,17)
  497. (which copies a 17-byte date string) to ckstrncpy(dest,date,17) won't work
  498. since the latter will chop off the last byte and replace it with a NUL,
  499. thinking the dest buffer is only 17 bytes long.  ckuus6.c, 9 Nov 99.
  500. A long time ago, before chained FDBs, code was added to allow the SLEEP (WAIT,
  501. INPUT, etc) time interval to be either a number of seconds or else a time of
  502. day (like MS-DOS Kermit), using a gross hack.  I changed this code -- at least
  503. in dopaus() (the routine that handles SLEEP/PAUSE, MSLEEP, and WAIT) -- to use
  504. chained FDBs instead.  ckuus6.c, 9 Nov 99.
  505. Now to the point of all this: I extended the WAIT command to wait for file
  506. events:
  507.   WAIT <time> { MODEM-SIGNALS <signal-list>, FILE <event> <filename> }
  508. The previous syntax is still accepted and works the same way; however, the
  509. modem-signal names are now invisible in the keyword list shown by ? after
  510. the time field; instead you see the two new keywords above (but you can
  511. still put a modem signal name in this field).  If you choose FILE, then
  512. you can choose an event: CREATION, DELETION, or MODIFICATION, and then the
  513. filename and then Kermit waits up to the timeout for the given event to occur
  514. with the given file and succeeds or fails accordingly.  ckuus6.c, 9 Nov 99.
  515. Fixed radix() (and therefore function()s that call it, such as fhex2n()) to
  516. use unsigned long internally, so args with high bit on won't go negative.
  517. ckuus4.c, 10 Nov 99.
  518. Fixed trailing blanks and long lines in ckuat*.[ch] and ck_*.[ch].  10 Nov 99.
  519. Compact substring notation was not being careful enough about exceeding
  520. boundaries.  Fixed in zzstring(), ckuus4.c, 10 Nov 99.
  521. Added a little robustness to iksdpy, checking that each record is exactly 4096
  522. bytes long.  Before the previous fix this would cause Kermit to crash; now
  523. this check should not be necessary except to allow a more appropriate recovery
  524. (i.e. quit with a message that the database is corrupt).  Also added clauses
  525. from Jeff to pick up the database in Windows.  iksdpy, 10 Nov 99.
  526. Added a prototype for ttyname() in the Sys V/68 R3V6 case. ckutio.c, 10 Nov 99.
  527. Removed some dangling return()'s from the new routines in ckcpro.w, again
  528. (the same ones I removed yesterday, but somehow the changes were lost).
  529. ckcpro.w, 10 Nov 99.
  530. Took 'extern int inserver' declaration out of #ifdef IKSD..#endif in ckcfns.c,
  531. since this variable should be available in all builds, but with a value of 0
  532. when IKSD is not available (and therefore not active).  ckcfns.c, 10 Nov 99.
  533. Similarly for the 'network' definition in ckuusr.c.  10 Nov 99.
  534. Changed IKSD database-opening code to use "r+b" rather than "r+" in K95 and
  535. VMS.  ckuusx.c, 10 Nov 99.
  536. More work on Unixware 1.x-2.0 makefile entries.  Removed the UNIXWARE
  537. definition and reverted to vanilla SVR4, but with OLD_UNIXWARE defined just
  538. for herald purposes.  This fixes the problem with close() of serial device
  539. hanging.  makefile, 10 Nov 99.
  540. On SunOS: Built OK with NOIKSD.  Built with NOSPL; this required some
  541. corrections to ckuus4.c and ckclib.c (NOSPL removes 300K from Sparc binary).
  542. Built with NONET OK.
  543. On HP-UX 10.20: Built with non-ANSI compiler OK.  10 Nov 99.
  544. On VMS 7.1: Built OK with DECC after supplying a missing exter for ksbuf[].
  545. ckvcon.c, 10 Nov 99.
  546. On SunOS: Built with NOICP (fixes needed to ckuus4.c) but lots of unresolved
  547. references show up at link time but the stupid linker doesn't show which
  548. modules the references occurred in.  Built again on VMS with NOICP to get
  549. better diagnostics.  Results:
  550.  . Moved prototypes for doconect() and setflow() from ckuusr.h to ckcker.h.
  551.  . Adjusted #ifdefs in ckvcon.c and ckuusx.c.
  552.  . #ifdef'd slrestor() references NOICP in ckcnet.c.
  553.  . Moved 'hints' declaration to ckcmai.c.
  554. It still didn't work but the remaining problems were all VMS-specific and
  555. we'll never really build a NOICP for VMS (or if we do they're easily fixed).
  556. Back to SunOS...  After a more shuffling, which is too boring to describe,
  557. the NOICP version built again.  The full version is 1.8MB on Sparc; the
  558. NOICP version is 0.5MB.  10 Nov 99.
  559. Added -lresolv to unixwarenetc target.  makefile, 11 Nov 99.
  560. Fixed trailing blanks & long lines in ckuath.c.  Gave up on ck_crp.c.
  561. 11 Nov 99.
  562. Fixed ckradix() (again) to ignore leading 0's (and whitespace) for overflow
  563. detection purposes (another previous fix that was lost).  Also moved ckradix()
  564. to ckclib.c.  ckuus4.c, ckclib.[ch], 11 Nov 99.
  565. A couple corrections to the ISO-8859-7 / Unicode mappings from updated
  566. official UCS maps at unicode.org.  ckcuni.c, 11 Nov 99.
  567. Added definitions, parsing, tables, and routines for KOI8-R and KOI8-U
  568. character sets, ckcuni.[ch], ckuxla.[ch], 11 Nov 99.
  569. Fixed xls[] and xlr[] charset-conversion function-pointer tables from
  570. yesterday's (and earlier) changes (one problem went all the way back to July
  571. 1998).  ckuxla.c, 12 Nov 99.
  572. Fixed fcsinfo[] table -- it too has skewed (during the Japanese changes of
  573. a few weeks ago).  ckuxla.c, 12 Nov 99.
  574. While tracking down yesterday's problems, I discovered that something was
  575. amiss with any character-set translation involving Unicode.  When translating
  576. from anything to (say) UTF-8, the non-ASCII characters were translated to
  577. simple, seemingly random, ASCII characters instead of to UTF-8 sequences.
  578. Somehow a temporary variable in xgnbyte() that had been a USHORT had become a
  579. CHAR, thus discarding the high byte of the UCS-2 result (you can't turn your
  580. back for a minute...)  So now translations *to* Unicode work again.  (This
  581. affected all translations, including file transfer.)  ckcfns.c, 13 Nov 99.
  582. But in the TRANSLATE command, translations *from* Unicode always gave a result
  583. in UCS-2 intstead of the target set.  Why?  Because setxlatype() was setting
  584. up the translation from the source set to UCS-2, period.  In all the testing
  585. of the new Japanese/Unicode interface, I must have overlooked the others.
  586. What was needed for TRANSLATE was a special routine to set up translation from
  587. any file character-set to any other file character-set with UCS-2 in the
  588. middle.  This seems to work well and it's a big improvement over the previous
  589. arrangement, in which the "most appropriate" transfer character-set was picked
  590. as the intermediate set, which resulted in loss when the source and
  591. destination sets had characters in common that were lacking from the TCS (this
  592. is especially noticeable with KOI8-R and -U, which are full of line-and-box
  593. drawing characters that are not in ISO 8859-5).  Several dozen tests with
  594. random pairs of charsets, including Japanese, check out fine, and file
  595. transfers seem fine too, as they should be after the previous fix.  So I
  596. changed TRANSLATE to always go through Unicode as long as Unicode support is
  597. built in.  ckuxla.c, ckuus4.c, ckermit2.txt, 13 Nov 99.
  598. Made KOI8-R and KOI8-U tables for ~kermit/charsets/.  koi8[ru].{c,txt},
  599. 13 Nov 99.
  600. From Jeff: "Was this one hard to pin down.  (All the encryption bugs are.)
  601. Noticed Sunday night that encryption was breaking with SRP on yclept but not
  602. on other platforms.  Tracked this down to a change in the headers in the newer
  603. SRP distributions.  The old headers were installed in /usr/local/include and
  604. were being read by Kermit instead of the newer ones in
  605. /usr/src/srp/srp..../include/.  Fixed.  While trying to find the above problem
  606. I discovered that encryption didn't work at all with any authentication method
  607. if there the connection was made with SET HOST *.  This bug was caused by two
  608. things.  First, a couple of 'inserver' tests were instead 'sstelnet' which
  609. meant we were encrypting/decrypting when we shouldn't have been.  Second, at
  610. some point the ckcgetc() functions were modified to make calls to ttxin().
  611. But the data returned from ttxin() was never decrypted.  So the state machine
  612. on incoming data was corrupted."  ckucon.c ckucns.c ckutio.c ck_crp.c
  613. ckuath.c, 14 Nov 99.
  614. Changed setting of local and peer IP addresses (the ones used for reporting
  615. and in the IKSD log) to use network format (htonl()).  ckcnet.c, 14 Nov 99.
  616. Tested KOI8-R and KOI8-U terminal charsets in new build of K95 GUI -- both
  617. work fine.  14 Nov 99.
  618. Some syntax improvements for the FOR command:
  619.  . Allow parens around the condition list for consistency with IF and WHILE.
  620.  . If parens included allow increment to be omitted & default appropriately.
  621.  . If command list lacks enclosing braces, supply them.
  622. Allow parens around SWITCH variable too.  Aside from improving consistency and
  623. robustness, these changes pave the way for future extensions, like
  624. "for ( %i in ck*.[ch] ) ..." (but exercising massive self-control, I deferred
  625. implementation of that til after 7.0).  ckuus6.c, ckermit2.txt, 14 Nov 99.
  626. In preparation for wrapping up Beta.11, did a bunch of builds with various
  627. -DNOxxxx's defined, on various platforms.  NOCYRILLIC (ok), NOAPC (ok),
  628. NOBIGBUF (ok)...  The latter only makes about 12K difference; hardly worth it
  629. any more in these days 2-3MB executables... (but yes, it's still needed at
  630. least for the PDP-11).
  631. NOLOCAL (ok) -- this took a fair amount of #ifdef shuffling, plus I managed
  632. to cut out a lot of additional stuff (e.g. all the file-transfer display
  633. code), reducing the executable size (on Sparc) by 400K.  This one is handy
  634. for building IKSD.  [Note: at the moment NOLOCAL also renders the SCREEN
  635. command useless, but I'll worry about that if anyone complains.]
  636. Also:
  637.  . NOXFER (ok) -- This one also took a lot of shuffling.  Saves 420K.
  638.  . NODISPLAY (ok) -- New; this one disables the file-transfer display.
  639.  . NOSHOW (ok)
  640.  . NOSERVER (ok) -- This one was a big deal.
  641.  . NOREDIRECT (ok)
  642.  . NOPUSH (ok)
  643.  . NOPIPESEND (ok)
  644.  . NOMSEND (ok)
  645.  . NOLOGIN (ok)
  646.  . NOIKSD (ok)
  647.  . NOHELP (ok)
  648.  . NODIAL (ok)
  649.  . MINIDIAL (ok)
  650.  . NOUNICODE (ok)
  651.  . NOCSETS (ok)
  652.  . NOSPL (ok) <-- Builds OK but has the beeping bug (*)
  653.  . NOICP (ok)
  654. Also built on some other platforms:
  655.  . HP-UX 10.20 non-ANSI (ok)
  656.  . HP-UX 10.20 ANSI (ok) (optimizer complains about ckuus[r34].c, ckcpro.c)
  657.  . HP-UX 9.05 non-ANSI (ok)
  658.  . HP-UX 9.05 ANSI (ok) (optimizer complans about various files)
  659.  . HP-UX 8.00 non-ANSI (ok)
  660.  . Linux RH 5.2 gcc 2.7.2.3 (ok)
  661.  . VMS 5.5/VAX VAXC 3.2 UCX (ok) and NONET (??)
  662.  . VMS 7.1/Alpha DECC 6.0 UCX (ok) and NONET (ok)
  663.  . AIX 4.1 (ok)
  664.  . Digital UNIX 3.2 (ok) (DU has 8-byte longs)
  665.  . BSDI 4.0.1 (ok) (Updated makefile target for tputs() complaints)
  666.  . Unixware 7 (ok)
  667.  . Unixware 2.1 ("libelf error: Request error: no string table elf_strptr"???)
  668. Many modules touched in many ways, some of them a lot.  14 Nov 99.
  669. Tracked down the beeping problem first noted on Oct 23rd: when built with
  670. NOSPL, there was a putchar('7') in docmd() that was not inside any 'if'
  671. clause, and therefore was always executed.  ckuus5.c, 15 Nov 99.
  672. Added the following new CHECK items: FILE-TRANSFER, MAKING-CONNECTIONS,
  673. UNICODE, IKSD, CX-LOG.  ckuus3.c, 15 Nov 99.
  674. Fixed a trailing non-comment after an #endif, ckcfns.c, 15 Nov 99.
  675. Replaced a lost comment-end after an #endif, ckcuni.h, 15 Nov 99.
  676. Fixed a bad mistake I made yesterday, when shuffling declarations around for
  677. NOXFER: I put the extern declaration for feol among the ints, when it should
  678. have been a CHAR.  This completely messed up end-of-line processing during
  679. file i/o.  ckcfns.c, 15 Nov 99.
  680. Checking out Dave Sneddon's renewed complaint about C-Kermit swallowing or
  681. mangling escape sequences while in CONNECT mode, which I thought I fixed a
  682. couple weeks ago.  Detailed analysis of the traffic shows VMS sends:
  683.   <ESC>[c<ESC>7<ESC>[255;255H<ESC>[6n<ESC>8<ESC>[62"p<ESC> F<ESC><RB>
  684. (where <ESC> is Escape and <RB> is right angle bracket).
  685. The CONNECT module passes <ESC>[c through OK to the terminal, and the terminal
  686. sends back the right response: <ESC>[?63;1;2;6;8;9;15;44c.  But when C-Kermit
  687. goes to read the next character from the host, it is '7' -- so it missed the
  688. escape between the 'c' and the '7'.  And in fact, the logs show several other
  689. escapes were missed too.  Let's compare with the UNIX version...  Hmmm, no
  690. problem there.  Next, compare VMS version with TERM APC OFF (which works) with
  691. same version with TERM APC ON (which doesn't).  Difference: chkaes() is never
  692. called if APC is OFF so the problem is obviously in chkaes().  It turned out
  693. to be a misplaced #ifdef XPRINT in one of the switch cases (which dates from
  694. when I added transparent printing a year ago), the one that handles escape
  695. sequences like <ESC>7.  The state-changing statement was inside #ifdef XPRINT,
  696. but XPRINT is not defined in VMS, so the state remained unchanged and the code
  697. to write out the saved-up Escape was never executed.  The same #ifdef was
  698. misplaced in the UNIX version, but it didn't matter there since XPRINT is
  699. defined in UNIX.  ckvcon.c, ckucns.c, 15 Nov 99.
  700. A new set of consistent HP-UX 10.xx and 11.xx makefile targets from Peter E,
  701. which now include regular and Trusted versions for each variation.  makefile,
  702. 16 Nov 99.
  703. From Jeff: Beginnings of PTY support.  ckutio.c ckuus7.c ckcdeb.h ckucon.c
  704. ckuus4.c ckucns.c ckuusr.c ckuusr.h, 16 Nov 99.
  705. Added top-level PTY command (not tested), similar to PIPE.  Created PTYORPIPE
  706. macro, which is defined if either NETCMD or NETPTY (or both) are defined.
  707. ckcdeb.h, ckucns.c, ckuus[r7].c, 16 Nov 99.
  708. Realized that it would be useful to know what character the user might have
  709. typed to interrupt a PAUSE, WAIT, INPUT, or similar command from the keyboard,
  710. so added a new variable v(kbchar) for this.  It is set by any command that
  711. times out and can be interrupted from the keyboard.  If it was interrupted,
  712. this variable is set to the (first) character the user typed.  If it was not
  713. interrupted, it is set to the empty string (thus "sleep 0" can reset it).
  714. v(kbchar) can be used in applications that need to wait for some event OR a
  715. keystroke, whichever comes first.  For example, iksdpy, which would rather not
  716. mindlessly refresh the screen if the database hasn't changed and the user
  717. hasn't touched a key.  Now instead of being driven by getc and timeout, it's
  718. driven by WAIT 60 FILE MOD <databasefile> -- if user presses a key, it's in
  719. the variable and it's our command.  ckuusr.h, ckuus[46].c, 16 Nov 99.
  720. From Jeff: the new pty modules, ckupty.[ch], plus fixes to Telnet debugging
  721. and BREAK-sending.  ckctel.c, ckcnet.c, 17 Nov 99.
  722. Added ckupty.c production to the xermit target.  makefile, 17 Nov 99.
  723. Converted ckupty.[ch] to Kermit coding conventions (there were still some
  724. #if's and preprocessor logical ops, unguarded ANSIisms, etc); cleaned up
  725. formatting, added copyright & author notices, removed unused HAVE_blah
  726. definitions.  Got it to build OK on SunOS with the non-ANSI compiler, and it
  727. works too.  17 Nov 99.
  728. On to Solaris...  This one was hopeless.  But then I realized that all the
  729. problems were in the utmp/wtmp code.  But we don't need that code.  So I
  730. #ifdef'd it out and poof, it builds and works on Solaris, and still builds
  731. and works on SunOS.  ckupty.[ch], 17 Nov 99.
  732. On to HP-UX.  After more twiddling of #ifdefs, got it to compile with no
  733. complaints, but at runtime it says:
  734.   ?Unable to open slave
  735.   ?Slave failed to initialize
  736. debug log says:
  737.   ttopen PTY[telnet watsun]
  738.   do_pty() Xline[/dev/ptyp3]
  739.   do_pty()[Slave starts]
  740.   getptyslave()
  741.   pty_open_slave()[pty_open_ctty() failed]=44806916 = PTY_OPEN_SLAVE_OPENFAIL
  742.   getptyslave()[Unable to open slave]=44806916
  743.   do_pty()[Slave fails to initialize]
  744.   set host line, errno[]=2
  745. In other words, there is "No such device or directory" as /dev/ptyp3.  But:
  746.   bash-2.00$ ls -l /dev/ptyp3
  747.   crw-rw-rw-   2 root       root        16 0x000003 Jun 10  1996 /dev/ptyp3
  748. The errno=2 indication is a red herring.  I changed the code to print a
  749. better message, now it says:
  750.   /dev/ptyp3: Device busy
  751. Why it's busy, I don't know.  Also we don't want to put words like "slave" in
  752. user messages -- they are upsetting to some people.  Also there is no need for
  753. the "?Slave failed to initialize" message if we already just printed a more
  754. informative message; fixed all this in ckupty.c, 17 Nov 99.
  755. From Jeff: Additional debugging in pty code, add pty modules to other Unix
  756. build targets.  makefile, ckutio.c, ckupty.c, 18 Nov 99.
  757. Fixed PTY command to actually use ptys, not pipes.  ckuusr.c, 18 Nov 99.
  758. Built with pty support on Unixware 7.1.0 and BSDI.  makefile, ckcdeb.h,
  759. 18 Nov 99.
  760. Added KTARGET clauses to all UNIX targets except those in the Antiquities
  761. section.  makefile, 18 Nov 99.
  762. Problem: "remote host blah" crashes the client if "blah" is longer than 84
  763. bytes.  This problem exposed many mistakes, each of which needed fixing.
  764. First, conol() was being called with a NULL pointer.  It should defend against
  765. this.  Second, the caller was not setting an error string it should have set.
  766. Third, the caller of the caller was not checking to see if the string was set.
  767. All this fixed in ckcpro.w, ckcfn2.c, ckutio.c, 18 Nov 99.
  768. But why should the limit be 84 when we had just negotiated 4000?  Because...
  769. we call tinit() after the I/Y exchange and it resets the packet length we just
  770. negotiated, tsk tsk...  This is another long-standing problem: tinit() is
  771. overloaded -- it was originally intended to be called before a transaction
  772. starts, i.e. before the S/I/Y exchange, but then we started calling it just
  773. after as well, because of the unfortunately fuzzy definition of "transaction"
  774. in the protocol.  So I changed tinit() to take an argument: 1 to reset
  775. EVERYTHING, 0 to reset only those things that are not set in the negotiations.
  776. Now you can send long REMOTE HOST commands.  ckcpro.w, ckcker.h, 18 Nov 99.
  777. Problem: Typing "mail" by itself causes a core dump.  Cause: a pair of
  778. statements was out of order in doxsend().  Fixed in ckuusr.c, 18 Nov 99.
  779. Built on IRIX 6.5 -- pty code compiles OK but doesn't work:
  780. /dev/ttyp5: No such file or directory...  18 Nov 99.
  781. Added code to ttinc(): if the read fails, and we were reading from a pty,
  782. call ttclos().  But it didn't prevent the annoying "A connection seems to
  783. be open... OK to close?" message, since the upper level code doesn't know
  784. the connection was closed except by calling ttchk(), and ttchk() was not
  785. doing the right thing.  ttchk() was being called to "test the connection",
  786. but it was testing ttyfd only if xlocal != 0, which is silly -- xlocal
  787. might have been reset by ttclos(), but if ttyfd == -1, we can definitely
  788. say we do not have an active connection, no matter what the value of
  789. xlocal!  ckutio.c, 18 Nov 99.
  790. Pty changes, plus more debugging, from Jeff for HP-UX.  ckupty.c, ckutio.c,
  791. 19 Nov 99.
  792. Built on FreeBSD 3.3.  Ptys work OK.  But with or without them, it dumps core
  793. when trying to initialize curses.  Tried building it with ncurses rather than
  794. curses; that fixed it.  Also discovered it did not have BIGBUFOK set, so set
  795. it.  makefile, ckcdeb.h, 19 Nov 99.
  796. Tried building on FreeBSD 2.2.7.  Hmmm, same thing -- it dumps core in
  797. fxdinit().  Why and when did this start happening???  Converted the freebsd2
  798. target to ncurses too.  Works fine -- curses, ptys, everything.  Also, added
  799. -funsigned-char to FreeBSD entries, since cc is gcc there.
  800. Dave Sneddon's bug, cont'd...  zkermini() was lopping off the final character
  801. of the init file name obtained from the CKERMIT_INI logical, thanks to global
  802. substitution of cknstrncpy() for strncpy().  In this case, the length of the
  803. source string was specified, rather than the length of the buffer.  Fixed in
  804. zkermini(), ckvfio.c, 19 Nov 99.
  805. Fixes from Jeff for ptys on HP-UX 10 and also to add IRIX 6.x to the list of
  806. pty-cabable builds: ckcdeb.h, ckupty.c, ckucns.c. 22 Nov 99.
  807. Tried building on DU 4.0E and 3.2 -- both OK, ptys work fine; added to list.
  808. ckcdeb.h, 22 Nov 99.
  809. Tried building on HP-UX 9.05.  Compiles and links OK, but doesn't work.  Once
  810. a connection is make (as in "pty telnet localhost") the program seems to hang;
  811. no chars appear on the screen, and you can't escape back.  Tried building on
  812. HP-UX 8.00.  Compiles OK but doesn't link: _vhangup and _ptsname unresolved.
  813. Changed ckupty.c to not define CK_VHANGUP for HPUX8; then it compiles OK, but
  814. hangs when run, just like HP-UX 9.05.  Rebuilt on HP-UX 9.05 without the
  815. ioctl() trap that Jeff added for HP-UX 10.  No change, except now it actually
  816. reads "Connection closed by foreign host."  from the pty but remains totally
  817. impervious to keystrokes.  Juggled #ifdefs to include ptys only for HP-UX
  818. 10.00 and above.  ckcdeb.h, ckupty.c
  819. Tred building on SINIX 5.42.  Compiles and links OK but:
  820.   ttopen PTY[telnet 128.59.39.2]
  821.   do_pty()[pty_getpty() fails]=44806914
  822.   set host line, errno[]=2
  823. Since there was a /dev/ptmx, I tried defining HAVE_STREAMS; this was an
  824. improvement; now we get:
  825.   ttopen PTY[telnet 128.59.39.2]
  826.   pty_getpty()[open(/dev/ptmx) success]
  827.   pty_getpty() ttyname()[(NULL)]
  828.   pty_getpty() slavebuf[/dev/ttyp4]
  829.   do_pty() Xline[/dev/ttyp4]
  830.   do_pty()[Slave starts]
  831.   getptyslave()
  832.   ptyint_void_association()[setsid()]
  833.   ptyint_void_association()[open("/dev/tty", O_RDWR)]=-1
  834.   pty_open_ctty() slave[/dev/ttyp4]
  835.   ptyint_void_association()[setsid()]
  836.   ptyint_void_association()[open("/dev/tty", O_RDWR)]=-1
  837.   pty_open_ctty() open failure[/dev/ttyp4]=2
  838.   pty_open_slave()[pty_open_ctty() failed]=44806916
  839.   getptyslave()[Unable to open slave]=44806916
  840.   do_pty()[getptyslave() fails - exiting]
  841.   do_pty()[Slave fails to initialize]
  842.   set host line, errno[]=22 <-- "Invalid Argument"
  843. The user sees:
  844.   /dev/ttyp4: No such file or directory
  845. Added #define HAVE_STREAMS for SINIX to ckupty.h, but won't define NETPTY
  846. for it unless we figure out how to make it work.  22 Nov 99.
  847. Built for DG/UX 5.4 -- ptys work ok, added DG/UX to the pty list.
  848. ckcdeb.h, 22 Nov 99.
  849. Futzed with "show features" paging.  ckuus5.c, 22 Nov 99.
  850. Installed missing pieces of developer tools on local DU 4.0E system.  Added a
  851. cast to an arg of bzero() to shut up DECC.  With that, latest code builds
  852. without complaint, and ptys work fine.  ckcnet.c, 22 Nov 99.
  853. Changes from Jeff for HAVE_STREAMS; now it works on SINIX.  ckcpty.c, etc;
  854. 23 Nov 99.
  855. Consolidated {Free,Net,Open}BSD pty support under BSD44.  ckcdeb.h, 23 Nov 99.
  856. Fixed ttopen() to set "ttnmsv" (saved ttname) for ptys too; otherwise, it
  857. when proto() calls ttopen(), it closes the connection.  ckutio.c, 23 Nov 99.
  858. Checked file transfer over pty connections:
  859.  . ssh connections work fine with default FAST settings, streaming, reliable
  860.    ON, etc, but SET PREFIXING ALL is needed because bare control characters
  861.    can make trouble on PTYs -- tab expansion, CR->CRLF, who knows what else.
  862.    8-bit files are sent OK too.  Obviously the transfer rate isn't great.
  863.  . Same deal for rsh / rlogin.
  864.  . For telnet, "set parity space" is also needed to transfer 8-bit data.  But
  865.    the transfer rate is about 10 times faster.  Obviously SET PREFIXING ALL
  866.    is needed here too for the Telnet escape character and probably also the
  867.    interrupt character, etc.
  868. Nothing special needs to be done about tilde on ssh/rsh connections since it
  869. is significant only at the "beginning of a line", and this never happens with
  870. Kermit packets.
  871. Changed SET NETWORK TYPE COMMAND to SET NETWORK TYPE PIPE (but kept COMMAND
  872. as an invisible keyword).  Ditto for switches, etc.  Because now we run
  873. commands on ptys too.  ckuus[r47].c, 23 Nov 99.
  874. Built on NetBSD 1.4.1.  Dumps core in fxdinit(), just like FreeBSD did before
  875. I switched it to ncurses.  Rather than just switch to ncurses again this time,
  876. let's find out what's wrong...  (Important because ncurses is an optional
  877. item, so many people won't have it.)
  878. First, installed NetBSD Project patches from Herbert Peyerl -- BIGBUFOK,
  879. assorted casts, plus support for 7200 bps serial speed which I seem to have
  880. overlooked.  ckcdeb.h, ckuusx, 24 Nov 99.
  881. Back to fxdinit() in BSD44...  The man page for tgetent() says you have to
  882. #include <termcap.h>.  That didn't help.  OK, it also said you had to declare
  883. some variables, like "char *UP, *BC, ..." but that only gave syntax errors.
  884. Tried linking with -ltermcap instead of -ltermlib.  Shuffling order of libs
  885. made no difference.  Tried linking with only -lcurses and neither -ltermcap
  886. nor -ltermlib.  Links OK but still crashes.  Tried casting 2nd tgetent() arg
  887. to (const char *) like it says in <termcap.h>.  Still crashes.  Tried using a
  888. static, rather than malloc'd tgetent buffer (16K!); it still crashes.  But a
  889. newly-built 6.0 still works fine, and it calls the tgetent() exactly the same
  890. way.  What's the difference?
  891. EVENTUALLY...  I found it: tgetent() internally calls cgetent(), which in
  892. turn calls dbopen(), which turns out to be "the library interface to database
  893. files".  But dbopon is also the name of a new variable in Kermit, an int flag
  894. meaning the IKSD database is open.  Unfortunately it is referenced in about
  895. 1000 places...  I changed them all to "ikdbopen" and poof, all better.  Many
  896. files, 24 Nov 99.
  897. While on NetBSD, checked UUCP lockfile conventions against cu: OK.  Tried
  898. dialing (with a Multitech modem) -- didn't work at all.  Why?  The modem
  899. responses seem to end with <LF> only, rather than <CRLF>.  Added code to
  900. dook() to allow for this and dialing works again.  But why did it break in the
  901. first place?  If I CONNECT with SET TERM DEBUG ON, I see CRLFs, so it's not
  902. the modem's fault.  Should I worry about this?  The debug log shows ttpkt() is
  903. being called normally and succeeding, so I wonder why DIAL is not seeing the
  904. CR's...  Instead, it looks like each CR is being converted to a LF, so
  905. responses look like "OK<LF><LF>".  ckudia.c, 24 Nov 99.
  906. Back to FreeBSD...  Built it with regular curses, now it's fine of course.
  907. Tried dialing out, that's fine too -- unlike NetBSD, it sees the CRLFs, so the
  908. previous trouble must have been NetBSD-specific.  Checked uucp lockfile
  909. against cu; it's OK.  Access to lockfile & port are thru the dialer group.
  910. 24 Nov 99.
  911. Added support for uu_lock() for FreeBSD 3.0 and later.  This is almost just
  912. like AIX ttylock(), but with different names and return values.  It's the
  913. preferred method of line locking on FreeBSD 2.2.2 and later (but no point
  914. making a new makefile entry to differentiate 2.0 from 2.2.2, so it's only in
  915. the 3.0 target -- anyway, the effect is the same either way).  ckcdeb.h,
  916. ckutio.c, makefile, 24 Nov 99.
  917. Fixes to HTTP PUT from Jeff: ckcnet.c, 24 Nov 99.
  918. Changed TRANSMIT /COMMAND to XMIT /PIPE (and left /COMMAND invisible).  Added
  919. TRANSMIT /NOWAIT, which means don't wait for a "prompt" after each line in
  920. text mode.  ckuusr.c, 24 Nov 99.
  921. Testing TRANSMIT...  Various failures were not producing error messages.
  922. Certain successes were not setting SUCCESS.  Also, now that the default file
  923. type is binary, TRANSMIT does not work as expected -- changed TRANSMIT to use
  924. text mode by default, no matter what the FILE TYPE is; therefore TRANSMIT
  925. /BINARY *must* be used to transmit in binary mode, which is, after all, a
  926. rather odd thing to do.  ckuus[r4].c, ckermit2.txt, 24 Nov 99.
  927. Corrected some type mismatches in the IKSD database code.  ckuusx.c,
  928. ckufio.c, 26 Nov 99.
  929. For QNX ptys, added #include <fcntl.h> and #define O_NDELAY O_NONBLOCK, etc,
  930. to make it compile OK, but it fails to initialize the pty at runtime.
  931. ckupty.[ch], 26 Nov 99.
  932. Added prototypes for ttyname() for HPUX 6 and 7.  ckutio.c, 26 Nov 99.
  933. Eliminated a spurious error message from fsplit() when it was asked to
  934. fill an array with more words than the array could hold.  ckuus4.c, 26 Nov 99.
  935. Fix from Lucas Hart for UNIX nzltor(), in which the last period is kept only
  936. if it is in a filename, not in a directory path segment, since VMS doesn't
  937. allow dots in directory names.  ckufio.c, 26 Nov 99.
  938. SSL/TLS stuff from Jeff, mostly more separation of this from other modules.
  939. ck_ssl.c ck_ssl.h ckuath.c ckuus3.c ckuus7.c ckuusr.h, 27 Nov 99.
  940. The change to ttchk() on November 18th broke remote-mode file transfer on QNX.
  941. Fixed, again.  ckutio.c, 27 Nov 99.
  942. Noticed that CKMAXOPEN was -2 on QNX.  There is no definition for this in the
  943. header files; wrote a little test program and found I could open 390 files
  944. at once; changed ckcdeb.h accordingly.  27 Nov 99.
  945. Fixes from Jeff for QNX ptys.  It all works except for noticing when the
  946. pty process terminates.  ckupty.c, 27 Nov 99.
  947. Added QNX to pty list.  ckcdeb.h, 27 Nov 99.
  948. Added pseudoterminal control to the list of major features included or not
  949. in SHOW FEATURES.  ckuus5.c, 27 Nov 99.
  950. Tested Pty feature on SCO OSR5.0.5 -- it's ok.  Added it to the list.
  951. ckcdeb.h, 27 Nov 99.
  952. Tried building with ptys on SCO 3.2v4.2, but compilation dies with a syntax
  953. error in <memory.h>.  Not worth pursuing.  Added prototype for ttyname().
  954. ckutio.c, 27 Nov 99.
  955. Moved the code to get the name of the controlling terminal in UNIX from
  956. ttopen() to sysinit(), since we only need to get it once, and generalized the
  957. test for local mode in ttopen() to include both the hardwired name (/dev/tty)
  958. and the actual name (such as /dev/ttyp5), and made the name available in a
  959. global string buffer, cttnam[], in case it's useful in the pty routines.
  960. ckutio.c, 27 Nov 99.
  961. Added a new variable v(ctty) to show the name of the controlling terminal,
  962. which is simply the contents of cttnam[].  For UNIX and VMS.  For the others
  963. it's just CTTNAM (e.g. "CON", "@output", etc).  ckuusr.h, ckcdeb.h, ckuus4.c,
  964. ck[uv]tio.c, 27 Nov 99.
  965. Changed QNX pty code to use cttnam[] instead of "/dev/tty" and removed
  966. NO_DEVTTY definition.  Works OK, ptyint_void_association() opens controlling
  967. terminal, all is OK.  But it doesn't make any difference in close detection.
  968. After logging out from a "pty telnet 0" connection, it reads Telnet's
  969. "Connection closed by foreign host" message, but select() never notices that
  970. the pty process died.  There must be some special API as in HPUX, but our QNX
  971. host doesn't have any man pages and none of my QNX manuals says a word about
  972. pseudoterminals, nor does the QNX website have any technical info.  I suppose
  973. we could check just before select() if the slave pid was still alive but (a)
  974. that could be pretty expensive, and (b) I'm not sure what to do if it isn't --
  975. some cleanup code in ckupty.c probably needs to run.
  976. Changed connection log to replace any spaces in the phone number with
  977. underscores.  ckudia.c, 27 Nov 99.
  978. Fixed misinterpretation of CARRIER message from Rockwell modems as equivalent
  979. to CONNECT.  This one was lost since last May, oops.  ckudia.c, 27 Nov 99.
  980. Somebody pointed out a while back that "?Not valid in this position" was not
  981. a very good error message for "type blah", where "blah" was the name of a
  982. nonexistent or inaccessible file.  A byproduct of chained FDBs.  The problem
  983. is that the message is not issued until after we go through all of the FDBs
  984. and none of them succeeds.  By that time, the real cause for any error is long
  985. gone.  But at least we can construct a better message like "?Does not match
  986. switch or filename", so I made this change in cmfdb(): ckucmd.c, 27 Nov 99.
  987. There was an odd case not caught by the command-file reader.  If command
  988. file's final line was a closing brace (e.g. of a loop or block) but lacked a
  989. terminator, the block would not be completed or executed.  Fixed in getnct():
  990. ckuus5.c, 27 Nov 99.
  991. The MANUAL command was not restoring the console terminal modes before
  992. escaping to the system; thus in VMS (for example) keystrokes didn't echo.
  993. Fixed in docmd(): ckuusr.c, 27 Nov 99.
  994. Went to check out a complaint about UUCP lockfiles on Digital UNIX, but UUCP
  995. wasn't installed, so I installed it.  Couldn't figure out how to use cu (it
  996. would just exit immediately with no message), but the man pages weren't
  997. installed either.  Installed the man pages and read them.  Configured a
  998. "direct" serial device by running uucpsetup -- nothing works unless you do
  999. this first; the original serial devices are useless.  Made a connection with
  1000. cu and then checked the lockfile.  Everything is fine: location
  1001. (/usr/spool/Locks), name (LCK..ttyxx), and contents (4-byte binary int PID).
  1002. But I added -DNOCOTFMC since the original person said it was necessary to keep
  1003. SET LINE from hanging -- I tested it here and it's fine (but it was also fine
  1004. before).  ckutio.c, 27 Nov 99.
  1005. Added a short HTTP section (2.15) to ckermit2.txt, 27 Nov 99.
  1006. From Jeff...  ckuusr.c: Fixes the LOGIN/LOGOUT problem on VMS.  This code
  1007. should not have been #define CK_LOGIN (since it's for the client).  ckupty.c:
  1008. More changes for QNX.  Still can't determine when the slave is invalid.  I am
  1009. concerned that write()ing to the pty after the slave is closed does not report
  1010. an error.  That leaves me with the impression that the device is still open.
  1011. ckcmai.c ckcnet.c ck_ssl.c ck_ssl.h: More removal of SSL code from the main
  1012. code.  ckuus3.c: Modifications to getyesno() to support K95.  28 Nov 99.
  1013. Checked new stuff on VMS: v(ctty) OK, LOGIN/OUT fixes OK.  TTY modes around
  1014. MANUAL command OK.  28 Nov 99.
  1015. Lucas Hart reports that recursive transfers of large directory trees stops
  1016. prematurely.  Test case: openssl-0.9.4.  Using the same file set on SunOS I
  1017. see even worse than that -- "dir /recursive openssl-0.9.4" doesn't even parse.
  1018. Added some debugging to addresult()...  Everything proceeds normally until
  1019. after the 166th file is added to the list.  From that point on, we never see
  1020. another regular file -- only directories.  Why?  segisdir is set to 1 when it
  1021. should be 0 -- a mystery since there is no way this can happen; there are
  1022. comments about this in the traverse() code already -- it's been a mystery for
  1023. some time.  But this code is so delicate I really can't risk touching it, so
  1024. let's see if we can find a workaround...  If I "cd openssl-0.9.4", then "dir
  1025. /recursive" works perfectly.  So therefore we can rule out anything special
  1026. about the directory tree itself (its size, depth, number of files, order of
  1027. files and directories, etc).  It must be something about the initial setup in
  1028. splitpath...  Another experiment: "dir /recursive openssl-0.9.4/*" works too.
  1029. So maybe the workaround is to simply tack "/*" onto the end if it's a
  1030. directory.  No, that's not it -- I already do that.  Anyway, most of this was
  1031. a wild goose chase since there was another error in cmifi() that was obscuring
  1032. everything: the '&wild' return value was not being set on recursive file
  1033. parses in which the filespec did not actually contain wildcards, which
  1034. prevented any command that operated on multiple files from working right.
  1035. Fixed in cmifi(): ckucmd.c, 28 Nov 99.
  1036. OK, back to traverse(), my least favorite place to be...  When we say "dir
  1037. openssl-0.9.4" (or "dir openssl-0.9.4/*") we still stop short of listing the
  1038. full directory, but when we cd to the directory and don't give a filespec, we
  1039. do get the full listing.  So what's the difference?
  1040. In the working case (A), a "*" is supplied as the filename, so the initial
  1041. isdir() fails since "*" isn't a directory, whereas in the failing case (B)
  1042. "openssl-0.9.4" is a directory.  That shouldn't matter, since in the latter
  1043. case we append "/*" to make it wild.
  1044. So fgen() in case A gets "*" but in case B it gets "openssl-0.9.4/*".  And
  1045. therefore splitpath() makes one segment in case A and two in B.  Well,
  1046. everything goes along OK for 85 files or so until we get to a certain
  1047. directory (one among many).  For some reason, when we retrieve the first file
  1048. from it, we call ckmatch() with the original filespec ("openssl-0.9.4/*")
  1049. rather than the current name part ("*").  Aha, once again the culprit is
  1050. segisdir...
  1051. OK, what is segisdir anyway?  As I recall it was a hack to cut down on the
  1052. number of calls to isdir(), which are quite expensive, at least in UNIX.  I
  1053. think the idea was that if the current segment had a forward link, then it was
  1054. guaranteed to be a directory, thus obviating the isdir() call.  OK, let's
  1055. see...  segisdir is set up above, but if we open a new directory after setting
  1056. it, that pretty much invalidates its meaning, so what good is it in this
  1057. context?  Finally I commented out the offending segisdir-based test, which
  1058. decides which string to match and this fixes the problem.  But what does it
  1059. break?
  1060. Dug up my old full-page checklist of directory-traversal tests...  Out of
  1061. fifty-some tests, the new version flunks only one that the old one passed:
  1062. "dir /recursive */*.txt" (or */*/*.txt, etc).  Hmmm, it's all coming back to
  1063. me now, vaguely -- this was the problem that the code I just removed was
  1064. intended to fix.  So what's the difference between the two cases?
  1065.  A. dir /recursive openssl-0.9.4 --> "openssl-0.9.4/*"
  1066.  B. dir /recursive */*.txt       --> "*/*.txt"
  1067. The difference, obviously, is left and right *'s.  The only way to keep them
  1068. both happy is to carry around the full relative pathame of each file, rather
  1069. than just the current segment.  To be continued...  ckufio.c, 28 Nov 99.
  1070. Some more SSL changes from Jeff.  ckcmai.c, 29 Nov 99.
  1071. Changed traverse() to compare full paths (rooted at starting position), rather
  1072. than all the clever stuff with segments.  This fixes B without breaking A;
  1073. however it breaks "dir */*.txt", "dir */*/*.txt", etc; any nonrecursive lookup
  1074. in which there is a wildcard in a directory path.  Everything else is fine
  1075. (except for one thing, which has always been broken, more about this later).
  1076. ckufio.c, 29 Nov 99.
  1077. The problem is that "subdir" does not match "*/*.txt" and so the subdirectory
  1078. is being skipped rather than opened.  Removing the clever trick to avoid
  1079. calling isdir() if listing is not recursive fixes this problem, but of course
  1080. slows us down.  But worse, it fails to fix "*/*/*.txt".  In this case,
  1081. ckmatch() is actually being called correctly:
  1082.   ckmatch string[subdir/thisdir/oofa.txt]
  1083.   ckmatch pattern[*/*/*.txt]
  1084. and fails to match.  Why?  Because it's an unstructured string match; it
  1085. doesn't treat filespec field separators differently from any other character,
  1086. whereas in UNIX filename globbing, directory separators are fences and can't
  1087. be gobbled up by "*", etc.  A simple change to ckmatch() to make "*" treat
  1088. "/" as a fence fixes the problem, but of course will break a thousand other
  1089. things.  So I changed the "matchdot" parameter to ckmatch() to be an "options"
  1090. parameter, bitmapped.  Bit 0 = match leading dot.  Bit 1 = filename globbing
  1091. so don't let * span field separators.  Set bit 1 in the appropriate calls,
  1092. mainly the ones from traverse().  Purposely did not set it in some other
  1093. places like SET FILE {TEXT-,BINARY-}PATTERNS because in that case we really
  1094. don't want to treat "/" specially.
  1095. Now in truth, "*/*/*.txt" should match "a/b/c.txt" whether it's a filespec or
  1096. not.  The above fix address filenames, but "if match a/b/c.txt */*/*.txt"
  1097. still does not succeed.  It seems we have two contradictory goals:
  1098.     Pattern    String
  1099.  A. */*/*.txt  a/b/c.txt
  1100.  B. a*bc,      abcbc
  1101. If A matches, B doesn't, and vice versa.  Yet both should match.  Currently
  1102. it's a matter of whether the "*" matcher searches for the rightmost or the
  1103. leftmost occurrence of the thing that follows it.  Until now, the strategy has
  1104. been rightmost, in which B worked.  Changing it to leftmost fixes A and breaks
  1105. B.  How can we make both work?  It appears to be a matter of whether the thing
  1106. that follows the thing that follows the "*" is another "*".  I added this
  1107. distinction and now both work, and "match.ksc" still passes.  Now I commented
  1108. out the previous filename-globbing change and ran the traverse() test again.
  1109. It worked fine, except one thing broke ("../.*").  Restoring the globbing code
  1110. fixed that.  But it broke "dir /recursive subdirname" so I removed it again.
  1111. So where are we now?  Everything works except:
  1112.  a. "directory ../.*" matches too much.
  1113.  b. Other unrelated problems involving symlinks are still there.
  1114. ckmatch() is being called with "../subdir" and ".*".  Well, clearly without
  1115. treating "/" as a fence, ".*" is going to match "../subdir".  But now for some
  1116. reason the fence business also breaks recursion.  This code is exactly like a
  1117. Whack-O-Mole -- you can't knock one down without making another one pop up.  So
  1118. let's leave it like this (no fence) for now; it's not perfect but it's a big
  1119. improvement.  The remaining problems are as above.
  1120. The symlink problem has several facets.  First, suppose the current directory
  1121. contains directory d1 and a symlink, d2, to d1.  Then "dir */*.txt" shows each
  1122. file in d1 twice, e.g. "d1/foo.bar" and "d2/foo.bar".  But "dir /recurs" is
  1123. smart enough to avoid this.  Oddly enough, UNIX "ls" and "ls -R" behave
  1124. exactly like Kermit.
  1125. Second, "dir /recursive /tmp/fdc/" says "empty directory" (when it's not).
  1126. Why?  In this case "/tmp" is a link to "/usr/tmp".  Here we are opening the
  1127. directory 0 times instead of 2 times (as in the previous case), or 1 time
  1128. (as we should).  (ls -R does NOT have this problem.)
  1129. Third, "dir /recursive /tmp" (same /tmp) just shows the symlink instead of
  1130. following it.  (ls -R does NOT have this problem.)
  1131. None of these symlink-related problems is new; they've been with us all along.
  1132. I'll see what I can about them tomorrow.
  1133. From Jeff: changes to the HTTP commands.  The DELETE command is now supported.
  1134. Like PUT it is almost never supported due to security concerns but we include
  1135. it for symetry.  Fixed several buffer over write errors in the allocation of
  1136. memory for the http request buffer.  Changed the local-file for GET and INDEX
  1137. to be optional.  If the file is not specified the output goes to the display.
  1138. (if we don't like it then we can simply modify the code in ckuusr.c (cx ==
  1139. XXHTTP) to ensure that a local file name is specified.)  Added checks to the
  1140. dohttp() function to insure that the command will not be attempted when there
  1141. is no connection or when Kermit is being used as IKSD.  Finished relocating
  1142. SSL/TLS code: Removed lots of variables that either wre not being used or
  1143. simply complicated the configuration of SSL/TLS.  With these changes I am now
  1144. confortable including SSL/TLS as a feature without any qualifications.
  1145. ck_ssl.c security.txt ck_ssl.h ckuath.c ckuus3.c ckctel.c ckuus7.c ckcnet.c
  1146. ckcmai.c ckuusr.c ckermit2.txt ckcnet.h, 29 Nov 99.
  1147. Fixed long lines & trailing blanks in ck_ssl.c.  29 Nov 99.
  1148. Never satisfied, went back to traverse() / ckmatch() problems.  Restored the
  1149. pathname fence changes to find out what the problem was with recursion, namely
  1150. that "dir /recursive subdir" does not recurse.  Why?  Obviously because
  1151. "subdir/*" does not match "subdir/a/b/c..." when "/" is a fence.  But since
  1152. the search is recursive, there should be no fences so I changed traverse() to
  1153. enable fences only in nonrecursive searches.  This change works, fixes the
  1154. "../.*" problem, but breaks two things:
  1155.  a. dir */*/*.txt  <-- no match
  1156.  b. dir /etc       <-- doesn't show subdirectories
  1157. These might actually be the same problem, namely that in nonrecursive
  1158. searches, we don't descend far enough.  The solution here is to open
  1159. directories not only on recursive searches, but also on nonrecursive ones
  1160. when the current search depth is less than the pattern depth.  This fixes
  1161. (a) but not (b).  In the latter case we are matching "/etc/blah" with "*"
  1162. (because blah is a directory), but the /'s preclude a match.  So one more
  1163. adjustment: turn off fences if the match object is a directory.  This
  1164. fixes (b).  Now let's run through the big list again to see what we broke:
  1165.  a. dir ./.*  (shows all files)
  1166.  b. dir ../.* (shows dot files plus directories)
  1167. Everything else works except for the symlink problems.
  1168. The problem with (a) is that, even though (say) "READ.ME" does not match ".*",
  1169. it is still being added because it is the end of a path segment.  Changed the
  1170. ELSE part of the big match-result IF statement to apply only if the current
  1171. item is a directory (rather than just ASSUMING it's a directory) AND it
  1172. matches the pattern OR the search is recursive, This fixes (a) but not (b).
  1173. Why?  Because we're matching "../blah" against ".*" without fences because of
  1174. the previous adjustment.  OK, but in this case we should be matching with
  1175. "../.*", not ".*".  I added a disgusting hack to handle this.
  1176. Ran the tests again.  Now we have a problem with "dir /recursive .*".  It
  1177. matches (for example) .xxx/oofa.txt.  Should it?  It didn't before...  But
  1178. worse, it misses some that it should match.  The problem in both cases is that
  1179. it is matching the whole path rather than the current segment, which is how we
  1180. got started on this tangent to begin with.  OK, how should it know when to
  1181. match only the current segment rather than the entire path?  When the search
  1182. is recursive?  OK, that fixes this problem, but breaks "dir /recursive
  1183. */*.txt".  OK, so when the search is recursive AND the pattern does not
  1184. contain slashes...  Good, this fixes "dir /recu .*".  Everything else works
  1185. now except:
  1186.  a. dir /recursive .. (or anything that starts with ..)
  1187.  b. dir /recursive ./ (anything that starts with ./)
  1188. These were fixed by moving the stripping of any leading "./"'s from fgen() to
  1189. traverse(), and changing the "if" for stripping to a "while".  Now we pass ALL
  1190. tests except for symlink problems.  Let's look at these now:
  1191.  a. "dir */*.txt", where the current directory contains a "foo" directory and
  1192.     a symlink, "bar", to foo.  In this case, the contents of the bar directory
  1193.     are shown as if it was a separate directory.  But as noted before, ls
  1194.     does the same thing.  So does "ls -R */*.txt".  But Kermit's "dir /recurs
  1195.     */*.txt" does not -- Is Kermit being too clever?
  1196.  b. "dir /recursive /tmp", where /tmp is a symlink, just displays the symlink
  1197.     rather than entering the directory.  This is no doubt related to the
  1198.     cleverness in (a).  "ls -R /tmp" does NOT have this problem.
  1199.  c. "dir /recursive /tmp/fdc", where /tmp is a symlink, says the directory is
  1200.     empty when it's not.  "ls -R /tmp" does NOT have this problem.
  1201. Conclusion: C-Kermit is being too clever.  How can it possibly know that some
  1202. symlink might be redundant when others are not?  It can't.  The clever bit was
  1203. located in isdir().  Commenting it out fixes a thru c and makes Kermit behave
  1204. like ls and ls -R.  But we'd better run the 60 tests again just to make sure...
  1205. Hmmm, they're all OK.
  1206. Well, a couple minor problems turned up, but they were there before too:
  1207. "dir /recursive ./.*" and "dir /recursive ../.*" are slightly off.  In case
  1208. anybody ever notices these, they can be easily worked around.
  1209. Finally, one more problem was introduced recently.  In the CD command,
  1210. completion no longer works on a directory name (absolute or relative) if the
  1211. part entered so far contains a path separator.  Example:
  1212.   cd subd<Esc>         works (subdir is a subdirectory of the current dir)
  1213.   cd subdir/ano<Esc>   doesn't (ano -> another)
  1214.   cd et<Esc>           works (from /) (for /etc)
  1215.   cd /et<Esc>          doesn't
  1216. Why?  ckmatch is being called with "ano*" and "subdir/another", which don't
  1217. match.  Fixing this in the obvious way would, of course, break everything I
  1218. fixed already.  So let's try something devious, a hideous disgusting hack
  1219. designed to catch exactly this case without disturbing any of the others.
  1220. This seems to work, in that it fixes the problem, and we get through almost
  1221. all of our test suite without difficulty, until reaching "dir /recursive /etc",
  1222. at which point we just hang (I bailed out after 2 minutes).  But removing the
  1223. hideous hack didn't change this.  Well, ls -R works, CK Beta.10 works.  Aha,
  1224. /etc contains a symlink to the NFS-mounted Columbia University mail spool,
  1225. which contains 40,000 directories...  OK, false alarm.  But why does ls -R not
  1226. stumble into the same hole?  Because if you give it the -R (Recursive) option,
  1227. it doesn't follow symlinks at all unless you include the -L option.  OK, back
  1228. to the test suite...  And now for the first time, C-Kermit passes every single
  1229. test.  ckufio.c, 30 Nov 99.
  1230. So what to do about the /etc problem?  Three choices:
  1231.  1. Nothing (keep following symlinks in recursive searches).
  1232.  2. Don't follow symlinks in recursive searches.
  1233.  3. Add a command or switch.
  1234. Option (3) is not practical since it would need to go on every command that
  1235. allows recursion, but even then we still have functions like frfiles().  If I
  1236. choose (2), then users won't have any way to defeat it.  So let's stick with
  1237. (1); if they get in trouble like I did, they can use circumlocutions.  Added
  1238. some notes about this to ckermit2.txt, 30 Nov 99.
  1239. So there you have it, another three long days on traverse().  If this ever
  1240. comes up again, remind me to throw the whole thing out and start over.  I'd do
  1241. it now, but it's working and we have to move on.
  1242. From Jeff: Plug some IKSD holes; more SSL/TLS shuffling.
  1243. ck_ssl.[ch] ckctel.c ckufio.c ckuus5.c, 30 Nov 99.
  1244. Changed DIR error message to more intelligently differentiate a bad switch
  1245. from a bad file or directory name.  ckuus6.c, 30 Nov 99.
  1246. Tried "pty tn3270 <ibm-mainframe>".  Works fine.  Added a section on this to
  1247. the doc.  ckermit2.txt, 30 Nov 99.
  1248. From Jeff: corrections to filename-matching code in ckmatch() for non-UNIX
  1249. builds: ckclib.c, 1 Dec 99.
  1250. From Jeff: The SET LOGIN PASSWORD password is now used for automated Kerberos
  1251. logins if the TGT was triggered by an Auto-GET and if the principal and realm
  1252. are known.  Otherwise, it is ignored and the user is prompted.  Now the dialer
  1253. can be configured with a user's password and it can trigger and auto login.
  1254. The same is true for SET HOST /PASSWORD:<pwd> <host>.  ckuath.c, ckuus[37].c,
  1255. 1 Dec 99.
  1256. Discovered that telling the client to "set transaction-log brief", "log
  1257. transactions", and then "remote pwd" produced a core dump.  The
  1258. transaction-log writing routines were not protecting against null pointers.
  1259. Fixed in ckuusx.c, 1 Dec 99.
  1260. Lucas Hart reported that "get /recursive" from VMS client to UNIX server
  1261. resulted in all files arriving in binary mode.  Sure enough.  The same thing
  1262. happens UNIX-to-UNIX so it's not a matter of peer recognition.  On the
  1263. Whack-A-Mole theory, tried backing out of the SEND /TEXT change from Oct 22,
  1264. but it made no difference (so I backed out of the backing out).  Turns out
  1265. the problem was in the GET command parser, introduced on 24 Feb 99 with the
  1266. change to make GET /RECOVER imply /BINARY; the problem was a fall-through
  1267. from one switch case to the next that was valid before this change, but not
  1268. after.  Strange nobody noticed the problem for 9 months.  Let's hear it for
  1269. long Betas!  Fixed in doxget(), ckuus6.c, 1 Dec 99.
  1270. Built & tested on VMS:
  1271.  . get *
  1272.  . get /recursive *
  1273.  . get /text *
  1274.  . get /binary *
  1275.  . get blah, get /text blah, get blah (to make sure global mode restored).
  1276. All work fine.
  1277. Added --privid:{ok,no,...} command-line option for IKSD.  Sets ckxpriv, which
  1278. is defined in ckufio.c (so also needs to be defined in other ck*fio.c);
  1279. initial value 1 for compatibility with current behavior, but maybe it should
  1280. be 0.  Does nothing at the moment, but if 0 should prevent login to IKSD as
  1281. a privileged user.  ckuusr.h, ckuus[5y].c, ckufio.c, 1 Dec 99.
  1282. From Jeff: "if not iksd" checks added for many top-level commands.  Many
  1283. modules, 1 Dec 99.
  1284. Added PURGE /RECURSIVE.  (DELETE /RECURSIVE would be easy to add too, except
  1285. it would only affect files; we don't have a good way of deleting a directory
  1286. tree, or knowing when to delete a particular directory and when not to).
  1287. ckuus[27].c, 1 Dec 99.
  1288. Suppose I'm in a directory that contains a bunch of files and backup files and
  1289. I "send *" with filenames literal.  All the files, including the backup files,
  1290. are sent with their own names, like "foo.c.~3~".  OK, fine.  But now suppose I
  1291. "send *" again, to the same directory.  Now the backup files get double backup
  1292. suffixes, like "foo.c.~3~.~1~".  Changed znewn() to automatically trim backup
  1293. suffixes from incoming files before assigning new ones.  ckufio.c, 1 Dec 99.
  1294. Peter E pointed out that constructions like:
  1295.   define foo {,-
  1296.     blah blah
  1297.   }
  1298. didn't work ("?Macros nested too deeply").  But there's no good reason they
  1299. shouldn't.  The rule is that a braced section begins with a line ending with
  1300. an open brace.  But ",-" also indicates a line break, so the construction
  1301. above should be exactly equivalent to the same construction without the ",-".
  1302. Added code to getnct() to account for this situation.  And while looking at
  1303. getnct(), I saw an opportunity for a big speedup (or, rather, to undo a major
  1304. stupidity): this routine allocated a new read buffer every time it was called.
  1305. I changed the code to allocate a new buffer only the first time called, or if
  1306. called later requesting a larger size.  I don't have a good benchmark, but a
  1307. rough measurement indicates a 100% speedup in the reading of command files and
  1308. dialing directories (but only when the command file doesn't actually do any
  1309. computation; in most cases the difference is imperceptible).  ckuus5.c,
  1310. 2 Dec 99.
  1311. Another GET command improvement: in GET [ switches ] <remote> <local>,
  1312. if <local> has the syntax of a directory name we try to CD to it, but if it
  1313. does not exist, GET fails.  Now if it does not exist, we try to create it
  1314. before trying to CD to it, but only if it seems to have directory syntax;
  1315. for example in UNIX if it ends with "/", or in VMS if it ends with "]"
  1316. or ">".  doxget(): ckuus6.c, 2 Dec 99.
  1317. Fixed a minor problem in VMS:  Suppose your current directory has a
  1318. subdirectory [.TMP].  You tell Kermit to "cd tm<Esc>"; Kermit correctly
  1319. expands this to (say) DKA0:[MYNAME]TMP.DIR;1, but when you press Return, it
  1320. says "Invalid argument".  Yet if you type "cd dka0:[myname]tmp.dir;1" it
  1321. works fine.  Too hard to explain.  Fixed in docd(): ckuus5.c, 2 Dec 99.
  1322. Fixed another problem reported by Lucas: if you tell Kermit to "set transfer
  1323. mode manual" (or whatever), then put it in server mode, then transfer some
  1324. files with a client whose transfer mode is auto (different from the server),
  1325. then finish the server, its transfer mode has changed to the client's.  Fixed
  1326. by making SET TRANSFER MODE set the global transfer mode as well as the
  1327. effective one.  ckuus3.c, 2 Dec 99.
  1328. Checked out Lucas's report from a while back about the VMS Kermit server's
  1329. response to REMOTE DIR being history-dependent.  As far as I can tell, it
  1330. doesn't happen any more.  2 Dec 99.
  1331. Lots o' changes from Jeff, mainly for checking in each command whether it may
  1332. be given to IKSD.  Mostly ckuus*.c, 2 Dec 99.
  1333. Changes from Jeff: minor corrections to stuff from yesterday, conversion of
  1334. many (more) sprintf's to ckstrncpy's.  ckcnet.c ckuus4.c ck_ssl.c ckuus2.c
  1335. ckuus6.c ckuus3.c, 3 Dec 99.
  1336. More c.f.j: ordered authentication type list: ck_ssl.c ckuath.c ckuath.h
  1337. ckuus3.c ckuus7.c, 3 Dec 99.
  1338. Made SET RECV a synonym for SET RECEIVE so we can write a lot SET SEND and
  1339. SET RECV commands and have them line up.  ckuusr.c, 4 Dec 99.
  1340. A final touchup to traverse().  There were still some small problems involving
  1341. ".." in UNIX, but removing one of the special cases I inserted in traverse()
  1342. for ".." a couple days ago cleared it up.  Also, the test in fgen() for
  1343. automically setting "matchdot" for a given match if the given filespec began
  1344. with "." was overlooking the "../blah" case, which also was responsible for
  1345. some of the ".." problems.  Fixed in ckufio.c, 4 Dec 99.
  1346. Suppose you want to use a version of C-Kermit that is stored on the host as
  1347. "wermit" or "ckermit".  If you change your local Kermit's autoupload strings
  1348. to to use this name, C-Kermit would still only recognize "kermit" at its
  1349. prompt.  Added "wermit" and "ckermit" as synonyms.  ckuusr.c, 4 Dec 99.
  1350. New security.txt and telnet.txt from Jeff plus a couple minor source
  1351. corrections.  4 Dec 99.
  1352. Added a new feature for VMS: SET { SEND, RECEIVE } VERSION-NUMBERS { ON, OFF }.
  1353. Normally both are OFF.  If SEND VER ON, the VMS version number is kept on the
  1354. outbound filename; if OFF it is stripped.  If REC VER OFF, any VMS version
  1355. number on the incoming filename is stripped; if ON, it is kept.  This setting
  1356. is independent of FILE NAMES { LITERAL, CONVERTED }.  ckuus[247].c, ckvfio.c,
  1357. 4 Dec 99.
  1358. Noticed that CD command in VMS doesn't work any more -- i.e. instead of
  1359. returning to your login directory, it does nothing at all.  It's because of
  1360. the seemingly innocent change I made to docd() a couple days ago.  Fixed by
  1361. focusing the change a little better.  ckuus5.c, 4 Dec 99.
  1362. Noticed that when uploading a file to VMS with specifying a path, it always
  1363. went in the home directory rather than the current directory.  Cause: a typo
  1364. in the GET-command-improvement code from 2 Dec.  Fixed in doxget(): ckuus6.c,
  1365. 4 Dec 99.
  1366. Noticed that when VMS C-Kermit sends back the full filespec to the sender, it
  1367. always ends in ";" without the version number.  Ditto for the transaction log,
  1368. etc.  It's been like that forever; it has nothing to do with recent changes.
  1369. After some investigation, it turns out that this is howsys$parse() works -- it
  1370. doesn't actually go to disk; it only parses the given string.  Added a new
  1371. routine, getvnum(), that gets the version number using lib$find_file()
  1372. (suggested by Hunter G), and it works, but when the zfnqfp() result includes
  1373. the version number, this breaks all sorts of commands, notably LOG.  For
  1374. example, if DEBUG.LOG;2 exists and you tell C-Kermit to "log debug debug.log",
  1375. zfnqfp() finds DEBUG.LOG;2 and then when we go to open for output we get an
  1376. error.  So I backed out of all this and left it as it was.  4 Dec 99.
  1377. Updated NEWS text.  ckuus2.c, 4 Dec 99.
  1378. Did some preliminary builds to catch major foulups before starting the
  1379. build-all: HP-UX 10 (with and without ANSI features, optimization), VMS
  1380. (UCX and nonet), FreeBSD, SINIX, ...
  1381. Built with various features deselected on FreeBSD: NONET, NOCSETS, NODEBUG,
  1382. NOUNICODE, NOHELP, NOSPL, NOIKSD, NOXFER, NOSHOW, NOSERVER, NOPUSH,
  1383. NOPIPESEND, NOPTY, NOMSEND, NOLOGIN -- various minor #ifdef adjustment were
  1384. needed.  ckuus3.c, etc, 4 Dec 99.
  1385. Changed default IKSD database directory from /tmp to /var/log.  ckcdeb.h,
  1386. 5 Dec 99.
  1387. Installed new "Open-Source-Friendly" copyright notice and changed VERSION
  1388. command to get the paging right.  ckcmai.c, ckuusr.c, 5 Dec 99.
  1389. Changed source-file copyright text to refer to main notice; all modules,
  1390. 5 Dec 99.
  1391. Adapted pty code to NeXTSTEP.  ckupty.c, 5 Dec 99.
  1392. Excluded 4.4 BSD #include for <termcap.h> from BSDI, since it doesn't
  1393. have it.  ckuusx.c, 5 Dec 99.
  1394. Big trouble with Ultrix 4.3 -- first of all it barfs on the new makefile's
  1395. KTARGET clauses.  Makefile, 5 Dec 99.
  1396. After removing the KTARGET phrases from the Ultrix entries, I get:
  1397.   ... -c ckcmai.c
  1398.   cpp: error /usr/include/netdb.h:94: Can't find include file sys/bitypes.h
  1399.   cpp: error /usr/include/netdb.h:96: Can't find include file sys/cdefs.h
  1400. Some header files have disappeared from this computer -- I verified this
  1401. by trying to rebuild Beta.10 (which built OK there before) and it gets the
  1402. same error.  So I could only build a nonet version for Ultrix.
  1403. The SET DIAL TEST { ON, OFF } case was nested inside another case.
  1404. Fixed in ckuus3.c, 5 Dec 99 (after most of the binaries were built).
  1405. Protected an unguarded "extern int ucsorder" declaration with #ifdef UNICODE
  1406. in ckcfns.c (the DG AOS/VS link step will fails if extern declarations are not
  1407. resolved, even though they are never referenced), 5 Dec 99.
  1408. Something was very wrong in VMS 7.2-1; the SMG-based fullscreen file transfer
  1409. display gets: "?refresh: smg$begin_pasteboard_update: %SMG-F-INVPAS_ID,
  1410. invalid pasteboard-id".  But this doesn't happen in VMS 7.1 or earlier.
  1411. Eventually I concluded, correctly I hope, that the problem was just a
  1412. misconfiguration of the terminal database on that machine (because the debug
  1413. log said "initscr: smg$create_pasteboard: %SMG-F-UNDTERNOS, undefined terminal
  1414. - couldn't access system terminal table".  However, Kermit was handling this
  1415. error very badly, spewing thousands of error messages to the screen.  I added
  1416. code to the VMS curses-simulation routines to check for this and to switch
  1417. automatically to the CRT display when it happens. ckuusx.c, 5 Dec 99.
  1418. On one of the Linux systems I have access to, which (last time I heard) was
  1419. Slackware 3.5.0 (how do you tell?) now complains when ckupty.c tries to
  1420. include <sys/select.h>.  There is no <sys/select.h> or <select.h>.  I had to
  1421. make a new Linux target, linuxns, to handle this case.  There must be a better
  1422. fix, since the problem happens only in ckupty.c and not in other modules that
  1423. use select(), but the better solution will have to wait till after Beta.11.
  1424. Hmmm, on second thought, it seems that <[sys/]select.h> is included by ckupty.c
  1425. only in Linux, but no version of Linux I have access to needs it.  So I simply
  1426. commented out the #include.  (NOTE: according to RH 5.2 "man select", the
  1427. needed header files for select() are <sys/time.h>, <sys/types.h>, and
  1428. <unistd.h>, but we don't call select() in ckupty.c so it appears we never
  1429. needed any of this.  makefile, 5 Dec 99.
  1430. Peter E discovered that if you log in to IKSD with REMOTE LOGIN (rather than
  1431. by hand), that IKSD accepts only 91-byte packets, and does not respond to
  1432. file interruption (X) requests.  The problem seems to be confined to IKSD,
  1433. since if you run an ordinary server and REMOTE LOGIN to it, this does not
  1434. happen.  Comparison of the debug logs shows that in spar(), urpsiz is 4000
  1435. in the normal case, 90 in the problem case.  It turns out that dofast()
  1436. (which sets up fast file-transfer parameters) was not being called if there
  1437. was no init file.  Moved the dofast() call to the mainline initialization
  1438. sequence in main(): ckcmai.c, 6 Dec 99.
  1439. Due to a typo, the LOGOUT command was dispatching to the LOGIN routine.
  1440. Fixed in ckuusr.c, 6 Dec 99.
  1441. The LOGIN and LOGOUT commands, if given with no connection, printed an error
  1442. message but did not advance to the next line.  Fixed in ckuus7.c, 6 Dec 99.
  1443. William Bader noticed that the SCO OSR5 version did not display a herald when
  1444. started.  The same in Unixware 2 (but not 7).  Diagnosis: the SCO compiler was
  1445. generating bad code for:
  1446.   if (noherald || bgset > 0 || (bgset != 0 && backgrd != 0)) x = 1;
  1447. x was 0 before this, all conditions are false, and afterwards x is -32.
  1448. Fixed by rephrasing in herald(): ckuus5.c, 6 Dec 99.  (Note: the bug does not
  1449. occur in a small test program; i.e. it is not easily reproducible.)
  1450. New HELP text from Jeff for SSL and HTTP, plus a minor correction to an
  1451. SRP-related ?-help string.  ckuus[23].c, 6 Dec 99.
  1452. Added new tru64-40g target.  makefile, 6 Dec 99.
  1453. Minor changes to the copyright and permissions notice based on text from
  1454. CU counsel.  COPYING.TXT, 6 Dec 99.
  1455. Tried building on SCO 3.2v4.2 with PTY support -- no go; we get a syntax
  1456. error in a system header file (memory.h).  6 Dec 99.
  1457. Fixed an unguarded reference to zmkdir() in the GET parser and generalized the
  1458. #ifdefs around z_exec() to allow disabling from the cc command line with
  1459. -DNOZEXEC.  ckuus6.c, ckufio.c, 7 Dec 99.
  1460. Added #ifndef OPENBSD..#endif around #include <termcap.h>. ckuusx.c, 7 Dec 99.
  1461. Trimmed trailing blanks, fixed long lines.  All modules, 7 Dec 99.
  1462. ---Beta.10---
  1463. From Jeff: Added missing TLS and NTLM keywords, plus some minor syntax
  1464. adjustments.  ckuus[367].c, 8 Dec 99.
  1465. Removed RD as an invisible synonym for RMDIR, now that we also have an
  1466. RDIR command.  ckuusr.c, 8 Dec 99.
  1467. Restored KTARGET clauses to Ultrix entries with new substitution syntax
  1468. from Peter E.  Makefile, 8 Dec 99.
  1469. Changes to #ifdefs around #include <termcap.h> for Mac OSX.  ckuusx.c,
  1470. 8 Dec 99.
  1471. From Jeff: Added version string for SSL/TLS; created a hook to identify the
  1472. Crypto Dll version number; Fixed a typo "|" should have been "&" that was
  1473. resulting in the server responding to ONE_WAY Kerberos authentication
  1474. incorrectly.  ckuath.c, ck_ssl.c, ck_crp.c, ckuus5.c, 8 Dec 99.
  1475. From Jeff: Many SSL changes and a syntax fix in rset().  ck_ssl.c ckctel.c
  1476. ckcmai.c ckctel.h ckuath.c ckclib.c ck_ssl.h ckuus5.c, 9 Dec 99.
  1477. Looked into the core dumping problem on SCO 505 when sending a file.  It
  1478. happens in the fullscreen display at F-packet time.  The core file is total
  1479. garbage.  The debug log shows we crash in zfnqfp().  In OSR5, zfnqfp() simply
  1480. hands off to realpath(), which, when called, scribbles all over memory and
  1481. dumps core.  Tried adding -DNOREALPATH to CFLAGS and poof, it works.  Fixed in
  1482. ckcdeb.h by defining NOREALPATH if CK_SCOV5 is defined.  9 Dec 99.
  1483. Added solaris26gnc target for use when libtermlib is missing.  makefile,
  1484. 10 Dec 99.
  1485. A fix from Jeff to my change of Nov 8 in which I "...removed the 'pop back to
  1486. command mode after each protocol operation' feature from IKSD by #ifdef'ing
  1487. out the 'justone = 1;' commands in ckcmai.c (search for IKSDPOPBACK)..."  This
  1488. change prevented the init file from being executed and the server idle time
  1489. limit from being set.  Fixed by setting justone = 1 during the authentication /
  1490. login phase.  ckcmai.c, ckcpro.w, 10 Dec 99.
  1491. Changes from Fred Smith for Coherent 4.2.  ckcdeb.h, cku[tf]io.c, ckupty.c,
  1492. ckuusx.c, 10 Dec 99.
  1493. Fixed a mixup with #ifdefs in z_exec() -- #ifndef should have been #ifdef.
  1494. This affects all Beta.11 builds; the "PPP dialer" feature (EXEC /REDIRECT)
  1495. won't work.  Let's see if anybody (besides Peter M) notices...  ckufio.c,
  1496. 10 Dec 99.
  1497. From Jeff: Updated help text for SET AUTH and AUTH commands.  Changed name of
  1498. a command to better match common practice.  Decided not to support Tim
  1499. Hudson's /etc/ssl.users file.  We will only support the much safer ~/.tlslogin
  1500. file for authenticated login with certificates.  ck_ssl.c ckctel.c ckuus2.c
  1501. ckuus3.c, 10 Dec 99.
  1502. Fixed custom banner for SCO ODT 3.0.  ckuver.h, 18 Dec 99.
  1503. A block in zvpass() had a variable p, which causes compiler warnings since
  1504. zvpass also has a parameter p.  Changed the former to p2.  ckufio.c, 18 Dec 99.
  1505. Changes from Jeff:
  1506.  . Increase username/password length for IKSD.
  1507.  . Various authentication changes.
  1508.  . UNIX CONNECT fix vs IKSD disconnect and local-echo buffer.
  1509.  . Some fixes to the weighted running CPS calculation.
  1510.  . New code for K95 IKSD to find its configuration file.
  1511.  . Enable SHOW at IKSD prompt
  1512.  . Enable SSL/TLS is OS/2
  1513. Many files.  18 Dec 99.
  1514. More SSL stuff from Jeff.  ckutio.c, ck_ssl.c, ckuath.c, ckcnet.c, 19 Dec 99.
  1515. Peter E complained that building file lists was a lot slower after the changes
  1516. of 28 Nov - 4 Dec.  That's true, but it's because the optimizations and tricks
  1517. that were used prior to that to achieve speed gave bad results in many cases.
  1518. The whole problem centers around calling isdir() on each file to find out if
  1519. it is a directory; this turns out to be quite expensive.  The traverse() code
  1520. uses all kinds of scary tricks to avoid this, which is what makes it so
  1521. delicate.  It occurred to me that the struct returned by readdir() might
  1522. contain some kind of bit saying whether this was a directory; I can't imagine
  1523. why it wouldn't, but if it does I can't find it.  Anyway, I got a 5-10%
  1524. speedup by making an xisdir() macro and calling it within ckufio.c instead of
  1525. isdir(), to avoid the function call.  Then I simplified the conditions under
  1526. which xisdir() is called and the places from which it is called.  This speeds
  1527. up nonrecursive searches about 100% and recursive ones by about 60%.  But
  1528. always remember: you can't fix anything in traverse() without breaking
  1529. something else.  The simplification breaks the nice feature of putting a "/"
  1530. at the end of directory names in file lists, so I backed off, leaving us
  1531. with the 5-10% improvement.  ckufio.c, 19 Dec 99.
  1532. Comparing ls -l * with Kermit's ffiles(*) shows that traverse() is about as
  1533. fast and therefore not the bottleneck.  The real bottleneck is the DIRECTORY
  1534. command.  Not because it sorts the results (the sort phase is negligible using
  1535. the current simple shellsort; substituting the way-more-complicated quicksort
  1536. gives no measurable speedup), but because it calls stat() AGAIN on each file to
  1537. get the size, permissions, etc.  The only remedy here would involve the
  1538. classic space-time tradeoff: we could make traverse() save the stat info for
  1539. each file.  But this could be quite big and furthermore would not be used
  1540. except in the DIRECTORY command anyway.  It could be done but I don't think
  1541. it's worth it since slowness is not noticed unless thousands of files are
  1542. involved.  So yes, in UNIX ls -l is faster than Kermit DIRECTORY because ls -l
  1543. only calls stat() once on each file.  No changes.  (Except a quicksort routine
  1544. was added to ckclib.c but #ifdef'd out.)
  1545. Ran traverse() tests, all OK.
  1546. Jeff noticed some spurious file transfer failures with "Error 0" since the
  1547. previous round of traverse() changes.  He caught C-Kermit in the act with a
  1548. 68MB debug.log file.  At the end of the last file in the list Kermit sends the
  1549. Z packet, gets the ACK, calls gnfile(), which calls znext(), which returns 0
  1550. with an empty file name when it reaches the end of the list, as it should.
  1551. But for some reason we go back to ssfile state rather than sseot.  Turns out
  1552. that when the final file returned by znext() is not selected by fileselect(),
  1553. gnfile() returns an empty filename but a positive value.  This bug has been
  1554. there since adding the fileselect() code more than 2 years ago.  Fixed in
  1555. gnfile(): ckcfns.c, 19 Dec 99.
  1556. Added code to ignore PROTOCOL and COMPRESSION messages from modem while
  1557. dialing.  ckudia.c, 19 Dec 99.
  1558. Added support for Diamond Supra Express V.90 modem.  Incredibly, it removed
  1559. the &S0/&S1 command available in earlier Supra models and most other modems.
  1560. Therefore it is unlikely this one could ever be used from VMS.  ckudia.c,
  1561. 19 Dec 99.
  1562. Added uw7ssl target for Unixware 7 with OpenSSL.  makefile, 19 Dec 99.
  1563. Went over new security.txt from Jeff.  19 Dec 99.
  1564. Trimmed trailing blanks from lots of files.  19 Dec 99.
  1565. Some corrections from Jeff to ckcnet.c and ckctel.c, plus more SSL/TLS stuff
  1566. in ckuath.c, ck_ssl.c.  20 Dec 99.
  1567. Changed UNIX sysinit() and syscleanup() to get and restore stdin flags.
  1568. ckutio.c, 20 Dec 99.
  1569. Added &S0 and &S1 to Supra Express init string -- it's not in the manual, but
  1570. it's valid anyway.  ckudia.c, 20 Dec 99.
  1571. Fixed a bug in which C-Kermit, when sending a file in local mode and
  1572. streaming, could hang if the user canceled with X or Z.  The problem was that
  1573. the code in sdata() that bumped the packet number when streaming did not also
  1574. bump winlo to match, and so input() did not recognize the resulting ACK from
  1575. the receiver because it seemed to have the wrong packet number.  ckcfns.c,
  1576. 20 Dec 99.
  1577. If such a transfer was interrupted at just the wrong time, the Z packet might
  1578. not contain the D(iscard) directive.  Fixed in ckcpro.w, 20 Dec 99.
  1579. Added "s" to "timestamp" in "set debug timestamp".  ckuus3.c, 20 Dec 99.
  1580. Converted '-P' command-line option to mean "literal filenames".  ckuusy.c,
  1581. 20 Dec 99.
  1582. Added missing carriage returns to the end of four Compaq modem commands that
  1583. lacked them.  ckudia.c, 21 Dec 99.
  1584. Some Supra Express V.90 init string corrections (incl removing Y0, which is
  1585. in the manual but not in the modem).  ckudia.c, 22 Dec 99.
  1586. From Jeff: Add Telnet environment variables to SHOW TELNET.  ckuus4.c,
  1587. 22 Dec 99.
  1588. Minor fixes for FreeBSD uucp lockfiles from Helge Oldach <hmo@sep.hamburg.com>,
  1589. ckutio.c, 22 Dec 99.
  1590. If Kermit given a -j or -J arg on the command line and ^C was typed during
  1591. the connection phase, Kermit would dump core, probably because the longjmp
  1592. buf isn't set up in the command-line parser.  Fixed by adding
  1593. signal(SIGINT,doexit) to cmdlin().  ckuusy.c, 22 Dec 99.
  1594. Added CHECK PTY.  ckuus3.c, 22 Dec 99.
  1595. Back to our old friend, traverse()...  As noted previously, Peter E reports a
  1596. drastic slowdown since the Nov 28 - Dec 4 workover.  I added code to count
  1597. every stat() call.  In a directory with 54 files, "echo ffiles(*)" results in
  1598. 62 calls (the 8 extra are more-or-less constant overhead).  This shows that
  1599. traverse() is calling stat() once per file.  However "directory *" in the same
  1600. directory results in 227 stat() calls; 62 by traverse and 165 by the DIRECTORY
  1601. code.  That's way more than twice as many as there needs to be.  For each
  1602. file, DIR calls zgetfs(), ziperm(), and zfcdat(), each of which calls stat()
  1603. on the same file.  But ziperm() and zfcdat() should be able to pick up the
  1604. info from zgetf's stat() call.  The whole trick is to make sure it's the same
  1605. file.  But it's not such a trick -- we just check the diractive flag.  Adding
  1606. this to ziperm() reduces the number of stat() calls from 227 to 176.  Then
  1607. adding it to zfcdat() brings it down to 121, which is just about the minimum.
  1608. In a directory with 2500 files, the DIRECTORY listing starts in 4 seconds,
  1609. compared to 6 before this change, about 33% faster.  ckufio.c, 22 Dec 99.
  1610. But this is a small gain, and anyway does not affect non-DIRECTORY file lists,
  1611. such as file menus on "?", file- and directory-name completion, etc.  The only
  1612. way to speed these up is to not call stat() on every file.  But if traverse()
  1613. does not call stat() on every file, it doesn't know whether it's a directory.
  1614. Why do we care if it's a directory?
  1615.  . If it's a recursive search, we must open each directory and read it.
  1616.  . If it's a directories-only search, we must not match regular files.
  1617.  . If it's a files-only search, we must not match directories.
  1618. It is possible to change traverse() to not call stat() if none of these three
  1619. conditions is true, and this speeds up list generation a lot, for example
  1620. reducing the number of stat() calls in a regular DIR command (with no
  1621. switches) to approximately the number of files.  So in the 54-file directory
  1622. we're down from 227 to 62 stat() calls.  In a 2500-file directory, we're
  1623. seeing results after 2 seconds, rather than 6-8.
  1624. The problem with this trick is that it prevents the names of directory files
  1625. from being tagged with '/' at the end and showing up nicely in a file list.
  1626. Aside from that, we still pass the traverse() torture test.  So it's a
  1627. tradeoff.  And whenever there's a tradeoff, there needs to be a SET COMMAND,
  1628. so I added a new, invisible command SET FILE FASTLOOKUP { ON, OFF }.  It's off
  1629. by default, since most people aren't getting file lists of huge NFS-mounted
  1630. directories.  So today's score: 33% speedup without sacrificing anything;
  1631. 300-400% with SET FILE FASTLOOKUP ON.  ckuus7.c, ckufio.c, 22 Dec 99.
  1632. Noticed that a couple details in the flow control handling in ttvt() were
  1633. different from those in ttpkt(), which might explain the problem that somebody
  1634. reported with switching flow control between OUTPUT statements.  There is,
  1635. no doubt, more to do here...  ttvt(): ckutio.c, 22 Dec 99.
  1636. Changed CHECK PIPE back to CHECK PIPES.  ckuus3.c, 23 Dec 99.
  1637. Rearraged command-line parser SIGINT handler to squelch complaints from picky
  1638. compilers.  ckuusy.c, 23 Dec 99.
  1639. Changes from Jeff for X forwarding.  ckcdeb.h, ckctel.[ch], 24 Dec 99.
  1640. Change from Jeff to command-line parser SIGINT handler to squelch even more
  1641. complaints from picky compilers.  ckuusy.c, 24 Dec 99.
  1642. Changed setprefix() for NONE (called when clearchannel is negotiated on a
  1643. network connection) to always prefix Xon and Xoff, regardless of the flow
  1644. control setting, as well as DEL (127), which seems to be particularly
  1645. troublesome, in addition to what it was prefixing before (CR, IAC, etc).  This
  1646. should allow CLEARCHANNEL to work even with connections to VMS and HP-UX.  Now
  1647. I can send from C-Kermit to gkermit on a Telnet connection with only the
  1648. following prefixed: 1, 13, 17, 19, 127, 255; unprefixing any of these kills
  1649. the tranfer (and sometimes the connection too).  ckcmai.c, 24 Dec 99.
  1650. Corrected a truly awful mistake in the command parser.  In any WHILE command,
  1651. the first left brace was treated as the beginning of the command list, so if
  1652. the condition contained a left brace, the parsing was totally bollixed, as in
  1653. "while not equal m(blah) {35} { commmands... }".  Fixed in doif() and
  1654. gtword(); the latter now sets global cmbptr to be a pointer to the CURRENT
  1655. position in the command buffer (cmdbuf[]).  Any higher-level routine can
  1656. examine it to see what has been parsed so far and what has not.  ckucmd.c,
  1657. ckuus6.c, 24 Dec 99.
  1658. Replaced clunky "does incoming file already have a backup suffix" code in
  1659. znewn() with cleaner (and better-working) code from gkermit.  ckufio.c,
  1660. 24 Dec 99.
  1661. From Jeff:
  1662.  . Make v(userid) return SET LOGIN USER value if one was given: ckuus4.c.
  1663.  . Expand setting of uidbuf[] in sysinit(): ckutio.c.
  1664.  . Some corrections to HTTP code: ckcnet.c.
  1665. 26 Dec 99.
  1666. From Carl Friend: Updated targets for CLIX.  makefile, 27 Dec 99.
  1667. If '-T' or '-i' is given on C-Kermit command line, then set transfer mode
  1668. manual, don't use binary/text patterns, etc.  Giving these options on the
  1669. command line should be just like SEND /BIN or SEND /TEXT at the prompt.
  1670. ckuusy.c, 27 Dec 99.
  1671. Telnet updates from Jeff: ckctel.[ch], ckcnet.c, 28 Dec 99.
  1672. Removed all mention of "regular expressions" from the docs.  They aren't
  1673. regular expressions.  ckermit2.txt, etc.  28 Dec 99.
  1674. Changed zopeno() and zclose() to handle ZCTERM and ZSTDIO better.  ckufio.c,
  1675. 28 Dec 99.
  1676. Corrections to MYDIAL macro in ckermod.ini suggested by David Sanderson, to
  1677. account for SET FLOW no longer being sticky.  28 Dec 99.
  1678. Show actual value of CK_SYSINI, if defined, in SHOW FEATURES.  ckuus5.c,
  1679. 28 Dec 99.
  1680. Added code to save previous handlers for SIGQUIT, SIGPIPE, SIGUSR1, and
  1681. SIGUSR2, and to restore them before any exec(), execl(), execvp(), etc.
  1682. suggested by David Sanderson, cku[ft]io.c, 28 Dec 99.
  1683. More work on ttvt() to make its handling of flow control parallel that of
  1684. ttpkt().  Plus additional debugging, etc.  In response to persistent reports
  1685. that changing flow control between OUTPUT statements doesn't work.  ckutio.c,
  1686. 28 Dec 99.
  1687. Revisited the problem of referring to files with spaces in their names.
  1688. The obvious way to do this is to put braces around the name, e.g.:
  1689.   send {this file}
  1690. This hasn't worked in years, maybe never.  The problem was simple: setatm()
  1691. was being called with the wrong "break mask" arg in this case (we were telling
  1692. setatm() to break on whitespace, but that's silly because the thing we're
  1693. putting in the atom buffer is already a "word" by definition, since it was
  1694. returned by gtword()).  Fixed in cmifi2(): ckucmd.c, 28 Dec 99.
  1695. Other methods are not so easy, however.  "send this32file" can't work because
  1696. of our stupid DOS/Windows filenames; "this32file" could easily be a DOS
  1697. filename (file = "32file", in the "this" subdirectory of the current
  1698. directory).  There is simply no way around this without having separate
  1699. fundamental parsing rules for different platforms.  Yes, we could first try a
  1700. match on this32file literally, and if it didn't match, then try running it
  1701. thru the backslash interpreter and trying again, but this presumes we know
  1702. what the user intended when they typed "this32file" and of course we can't.
  1703. Added clarification to ckermit2.bwr.  28 Dec 99.
  1704. Changes from Jeff for X forwarding.  ckcnet.c, ckctel.c, 29 Dec 99.
  1705. Backed off on yesterday's changes to zopeno() and zclose() -- they totally
  1706. broke client/server ops; for example, FINISH would get a "?Can't open file"
  1707. error.  ckufio.c, 29 Dec 99.
  1708. Made opent() succeed even if zopeno() returns 0, meaning "already open";
  1709. after all, that's no reason to fail.  ckcfn3.c, 29 Dec 99.
  1710. Fixed a dangling case in the protocol state table, which might have been
  1711. harmful if the new rcv_shortreply() returned -1, which normally would not
  1712. happen except if the client sends a REMOTE command with the response
  1713. redirected to a file, and writing to the file gets an error.  ckcpro.w,
  1714. 29 Dec 99.  [NOTE: This fix is in error and was undone on 31 Dec 99.]
  1715. WAIT 0 <modem-signals> skipped getting the modem signals because of a boundary
  1716. condition on the loop test.  Fixed in ckuus6.c, 29 Dec 99.
  1717. Switching RTS/CTS on and off still didn't work.  I think now I know why.
  1718. In tthflow(), we have constructions like this: 
  1719.   if ((temp.c_cflag & CRTSCTS) == CRTSCTS) ...
  1720. But it turns out that, at least on Linux, CRTSCTS has a definition like:
  1721.    020000000000
  1722. which is liable to go negative, causing an 'if' condition like the one above
  1723. to fail when it should succeed.  Fixed in tthflow() by testing flags & CRTSCTS
  1724. for 0 or non-0, rather than any particular value.  ckutio.c, 29 Dec 99.
  1725. The iksd log is full of references to a file called "//READ.ME" (two slashes).
  1726. A little investigation shows that when C-Kermit is chroot'd (in SunOS), this
  1727. is how realpath() returns names of files in the chroot'd root directory.
  1728. Added a code snippet to collapse multiple leading /'s to a single one.  Also
  1729. noticed many references to a file called "getwd:_can't_open_.." in the log,
  1730. also only when chroot'd; couldn't reproduce this but I suspect that realpath()
  1731. is storing an error message in the destination buffer.  I changed the code to
  1732. zero the buffer if realpath() fails; let's see if this comes out in the log
  1733. again after today.  zfnqfp(): ckufio.c, 29 Dec 99.
  1734. From Jeff: New ckctel.[ch] ckcnet.c ckcdeb.h more pleasing to DECC.  29 Dec 99.
  1735. Added notes to ckermit2.txt about leading 0's in numeric IP addresses.
  1736. 29 Dec 99.
  1737. From Jeff: more X forwarding.  ckcnet.c ckwart.c ckctel.c ckuus5.c ckuus3.c
  1738. ckcdeb.h ckctel.h ckucns.c ckuusr.h ckuus4.c, 30 Dec 99.
  1739. Removed definition of CK_FORWARD_X for UNIX from ckcdeb.h; we'll save this
  1740. for C-Kermit 7.1.  30 Dec 99.
  1741. Changed copyright dates to 2000.  All modules, 30 Dec 99.
  1742. Inserted the final copyright and permissions notice and disclaimer.  ckcmai.c,
  1743. 30 Dec 99.
  1744. Removed Beta references from NEWS text; updated SUPPORT text.  ckuus6.c,
  1745. 30 Dec 99.
  1746. Checked Lucas's bug (make a connection from CK on DU to IKSD, wait 10 min
  1747. until IKSD times out & closes the connection, re-CONNECT, C-Kermit pops back
  1748. because connection is closed, and now CBREAK mode is lost).  Can't reproduce
  1749. it on DU, SunOS, or anything else.  But for safety's sake, added a new
  1750. invisible command, SET COMMAND CBREAK, to force console into CBREAK mode in
  1751. case it got lost.  ckuus3.c, 30 Dec 99.
  1752. Put the tx_lucidasub() routine in #ifdef OS2..#endif, since this is a fairly
  1753. sizeable chunk of code used only by K95, and optimizers always complain about
  1754. it.  ckcuni.c, 30 Dec 99.
  1755. George Gilmer determined that C-Kermit 7.0 Beta.11 can be built for NCR MP-RAS
  1756. 2.03 and 3.02 by adding -DNOGETUSERSHLL and -DNO_DNS_SRV to the sys5r4sx[tcpc]
  1757. targets, and uploaded the resulting binaries.  Added new build targets and
  1758. designer banner for MP-RAS, to be picked up next time around.  makefile,
  1759. ckuver.h, 30 Dec 99.
  1760. Fixed a bug in UNIX zfnqfp() I introduced yesterday by copying the result
  1761. to the wrong buffer, thus breaking file reception whenever backing up was
  1762. necessary.
  1763. After building on VMS 5.5, found that something had gone wrong with the
  1764. "curses" (SMG) support.  The first call worked, subsequent ones didn't.  For
  1765. example, Ctrl-L works the first time but not the second; the prompt comes out
  1766. in the wrong place after the fullscreen file-transfer display.  The Beta.11
  1767. binary, however, works fine.  Comparison of screen-related code in Beta.11
  1768. ckuusx.c and in today's copy shows no differences at all.  What happened?  To
  1769. make a long story short, I *forced* Ctrl-L to work by always calling initscr()
  1770. before clear() and endwin() afterwards (refresh() too, though it doesn't make
  1771. a difference).  But SCREEN MOVE (move()) now behaves exactly like SCREEN
  1772. CLEAR, and yes, we really are calling the correct SMG$blah routine.  So I
  1773. replaced the current ckuusx.c with the one from Beta.11 and rebuilt -- and we
  1774. still have the same problems.  As a final experiment, I rebuilt from the
  1775. entire Beta.11 source set and guess what: this one has the same problems, even
  1776. though the binary I built from exactly the same sources on exactly the same
  1777. machine 24 days ago has no problems at all.  Y2K jitters?  It's only 30 hours
  1778. away...  Anyway, I changed back to the old, old MYCURSES code, despite the
  1779. cautions in the comments.  It works fine on both a fast Alpha and a sloooow
  1780. VAXstation 3100 and cuts about 5K off the binary.  ckuusx.c, 30 Dec 99.
  1781. Next problem -- C-Kermit is not sending back the full pathname in its ACK when
  1782. receiving a file if a file of the same name did not already exist.  Similarly,
  1783. fpathname(foo) no longer works if foo doesn't exist, but it did in Beta.11.
  1784. After wasting several hours on this, I rolled back all the zfnqfp() changes
  1785. from the past couple days; the only reason for them was to fix some glitches
  1786. in the idsd log, which who cares.  ckufio.c, 30 Dec 99.
  1787. Next problem -- Unix traverse() really is too slow.  People will hate it.
  1788. Changed default value of FASTLOOKUP (variable stathack) to 1.  ckuus7.c,
  1789. 30 Dec 99.
  1790. Added PROTECTION to HELP SET ATTRIBUTES.  ckuus2.c, 30 Dec 99.
  1791. Made sure that NOPUTENV was defined for not K95 or UNIX.  ckcdeb.h, 30 Dec 99.
  1792. More X forwarding from Jeff.  30 Dec 99.
  1793. Trimmed trailing blanks from source files.  30 Dec 99.
  1794. Made sure the result builds cleanly on VMS (net and nonet) and SunOS.
  1795. Some final X forwarding and IKSD changes from Jeff.  ckctel.c ckcnet.c
  1796. ckctel.h ckutio.c, 31 Dec 99.
  1797. David Sanderson reported that client commands that got short-form replies
  1798. from the server (RCD, FINISH, etc) always failed.  This was caused by the
  1799. "Fixed a dangling case in the protocol state table" item from Dec 29; it
  1800. wasn't dangling at all; fixed by removing the fix.  ckcpro.w, 31 Dec 99.
  1801. At the end of the Beta-test period, our census of binaries stands at:
  1802.  Beta 04 binaries:   9
  1803.  Beta 05 binaries:  20
  1804.  Beta 06 binaries:   6
  1805.  Beta 07 binaries:  25
  1806.  Beta 08 binaries:  19
  1807.  Beta 09 binaries:  21
  1808.  Beta 10 binaries:  70
  1809.  Beta 11 binaries: 179
  1810.  Total:            349
  1811. After 2000 came in Russia (Leningrad) I transferred a 1988 file from here
  1812. to there; the timestamp was correct.  Then I touched it there to get the
  1813. 1 Jan 2000 timestamp and transferred it back to NY, and this had the correct
  1814. timestamp too.  Later, same deal between here and Amsterdam.  No problems.
  1815. The pre-10.00 HP-UX builds were all done on systems that had their dates
  1816. set back to 1971, so at midnight they'll turn over 1972, which has the same
  1817. calendar as 2000 (and 1944).  HINT: touch all source files after unpacking
  1818. the tar archive :-)
  1819. A reference to uidbuf[] needed to be #ifdef NOSPL.  ckuus4.c, 31 Dec 99.
  1820. DECC on DU 3.2 now dumps core on ckuus6.c with -O.  makefile, 31 Dec 99.
  1821. Binaries built 31 Dec 1999 - 1 Jan 2000.
  1822. ---7.0.196 Released 1 Jan 2000---
  1823. Minor fixes applied 2 Jan 2000, after binaries built but before announcements
  1824. and final source-code packaging:
  1825.  1. WAIT n FILE MODIFICATION did not fail if interrupted from keyboard.
  1826.     Interfered with IKSDPY: ckuus6.c.
  1827.  2. Fixed NOICP builds by moving declaration of stathack from
  1828.     ckuus7.c to ckcmai.c.
  1829.  3. Fixed SET FLOW help message when CK_DTRCD and CK_DTRCTS are defined. 
  1830.     ckuus3.c.
  1831.  4. Some authentication-related HELP messages updated, ckuus2.c.
  1832.  5. Minor syntax corrections to telnet.txt, security.txt.
  1833.  6. Minor corrections to introductory comments in several modules.
  1834.  7. Server's response to GET xxx where xxx doesn't exist was changed from
  1835.     "No filespec given" to "File not found".  ckcfns.c.
  1836.  8. New makefile targets for NetBSD define DTR/CD and DTR/CTS flow control
  1837.  9. Replaced "??-" in comments with "xx-" to shut the compilers up about
  1838.     trigraphs.
  1839. 10. Replaced a missing comment terminator in ckcpro.w.  This one could
  1840.     cause the following problem: when sending a file and failing to close
  1841.     it, the discard directive would not be sent.  But it's hard to imagine
  1842.     a circumstance in which we would fail to close a file we just opened
  1843.     and read from successfully.
  1844. 11. Enclosed an unguarded reference to the sj struct in #ifdef KANJI.
  1845.     ckcfns.c.
  1846. SHOW VERSIONS of binaries built before these changes give a ckuusr date of
  1847. 1 Dec 1999; binaries with these fixes show 1 Jan 2000 for ckuusr.
  1848. ---7.0.196 Announced 3 Jan 2000---
  1849. Added sinix541 makefile target for SINIX-L (i386) 5.41, plus designer banner,
  1850. and added a couple #ifdefs to allow it to compile (it doesn't like fdopen()).
  1851. makefile, ckuver.h, ckufio.c, 6 Jan 2000.
  1852. Removed -O2 and added -DNODEBUG -DNOIKSD to the ultrix42c makefile entry;
  1853. although it compiled OK, it got bizarre relocation errors at link time and
  1854. this was the only (ok, first) way I could find to make them go away.
  1855. makefile, 6 Jan 2000.
  1856. Updated the ps2aix target for AIX 1.2.1 on the PS/2, and added a new
  1857. ps2aixnetc target in the makefile.  Had to put #ifndef PS2AIX10 around
  1858. #include <netdb.h> in ckcnet.c, and add a prototype for ttyname() to ckutio.c.
  1859. There's a warning about tlog() that's unavoidable (termio.h defines a tlog
  1860. macro and we redefine it).  OK, it's not really unavoidable...  6 Jan 2000.
  1861. Added a couple new paragraphs to the ckermit2.txt section about coping with
  1862. faulty Kermit implmentations.  6 Jan 2000.
  1863. Changes for CLIX from Carl Friend.  ckutio.c, ckcnet.c, makefile, 16 Jan 2000.
  1864. Added makefile entry for SINIX 5.41.  16 Jan 2000.
  1865. Changes from Joe Smith for SunOS 4.1 with X.25.  ckutio.c, makefile,
  1866. 16 Jan 2000.
  1867. Changes from David Lane for Stratus VOS: ckcdeb.h, ckcker.h, cklfio.c,
  1868. 16 Jan 2000.
  1869. A couple new variations on the 3B2/3B20 makefile targets from Peter
  1870. Mauzey.  makefile, 17 Jan 2000.
  1871. Text and binary filename patterns for VOS, and changes to VOS network module
  1872. to allow building for X.25 but not TCP/IP, from David Lane.  ckcmai.c,
  1873. cklnet.c, 17 Jan 2000.
  1874. Some changes to make C-Kermit compile on OSF/1 1.3.  First there is some kind
  1875. of foulup in the header files that turns off ANSI prototyping when C-Kermit
  1876. thinks it should be doing it, so this had to be undone in ckucmd.c, ckcnet.c,
  1877. ckucns.c, ckufio.c, and ckutio.c.  Then in ckuusr2.c there was a string
  1878. contstant that contained something like "/usr/share/kermit/*.*", which the
  1879. compiler took to be a comment begin and so lost an #ifdef.  This needed
  1880. "rewording".  Changed the dec-osf target to skip optimization and force
  1881. static linking.  18 Jan 2000.
  1882. Building C-Kermit 7.0 for OS-9/68000 on Steve Rance's Solaris 7 system in
  1883. Australia using the xcc (Ultra C 2.0) cross-compiler (reportedly, Microware no
  1884. longer supports development directly on OS-9, but requires cross-builds).
  1885. This needed a new makefile, ck9xcc.mak.  Notes (19-21 Jan 2000):
  1886.  . We can build wart but can't run it, so must touch ckcpro.c.
  1887.    Later I just took everything to do with wart out of the makefile.
  1888.    Later Steve changed the makefile to build wart for Sun and run it.
  1889.  . All ckc*.c and ckuus*.c build, and so do ck9con and ck9tio.
  1890.  . ck9fio.c blows up because of some inline assembly code.
  1891.    This was handled by changing #asm..#endasm to _asm("...");
  1892.    But we need to do this with #ifdefs to allow old way too?
  1893.  . ck9asm.a just builds, amazing.
  1894.  . ck9ren.c had to be removed from the makefile (not needed for this build).
  1895.  . References to {me,u}_binary in ck9con.c had to be updated to new macros.
  1896.  . Had to add NO_DNS_SRV.
  1897.  . Had to change <inet/...> to <INET/...> in ckcnet.h.
  1898.    But this was only for the cross compiler so I defined a new
  1899.    symbol OSKXXC for this.
  1900.  . Link step, libs, etc, needed changing/updating (termlib added).
  1901. Steve Rance made various other edits, mostly changing the names of error
  1902. symbols from E_blah to EOS_blah (should this be conditionalized? -- will
  1903. it break "native" OS-9 builds?)
  1904. Finally it built OK and runs on OS-9/68000 3.0.3.  It can make a Telnet
  1905. connection, transfer files, produce the fullscreen file-transfer display,
  1906. produce file lists and do filename completion, etc; pretty much fully
  1907. functional.  I did find one glitch: any reference to the v(ipaddress)
  1908. variable causes a crash, but only before any TCP connections have been made.
  1909. I "fixed" this by #ifndef OSK'ing the code in nvlook() that calls
  1910. getlocalipaddr().  ckuus4.c, 22 Jan 2000.
  1911. To remove voluminous warnings (when -cw added CFLAGS), added CK_STDLIBS to
  1912. OS-9 CFLAGS, but then had to put #include <unistd.h> within #ifndef
  1913. OSK..#endif.  Now it compiles cleanly except for the usual torrent of
  1914. "variable declared (or set) but never used" warnings (because of all the
  1915. #ifdefs), plus warnings about implicit declaration of a few functions,
  1916. including alarm(), isatty(), getpid(), ustrncmp(), _ev_unlink(), and
  1917. _ev_delete(); not sure what to #include to fix these but they should be
  1918. harmless anyway.  ckcdeb.h, 22 Jan 2000.
  1919. Fixed a bunch of nontrivial warnings in ck9tio.c -- nested comments, use of
  1920. uninitialized variables, and int conxxx() routines that did not return a
  1921. value.  22 Jan 2000.
  1922. The only serious remaining problem that I know about is: even though the
  1923. TELNET command works just fine, SET HOST dies immediately with a stack
  1924. overflow.  Tried rebuilding ckuus7.c (the module containing the SET HOST
  1925. code) without optimization but it made no difference.  Will have to wait for
  1926. OS-9 guys to fix this one; some magic incantation to increase the stack
  1927. size?  In the meantime we have a binary that's usable for most things (but
  1928. unfortunately SET HOST is needed for scripting).
  1929. Installed TCPware 5.4 on my Alpha and tried to build C-Kermit 7.0.  Total
  1930. disaster, horrible syntax errors in SYS$COMMON:[SYSLIB]DECC$RTLDEF.TLB;1 (not
  1931. in Kermit code).  Turned it over to Hunter Goatley.  21 Jan 2000.
  1932. Steve Rance fixed the OS-9 problem by increasing the stack size.  I cleaned
  1933. up the source files to #ifdef all the recent changes that depend on Ultra C.
  1934. ck9xcc.mak, ck9[tf]io.c, ck9con.c, 23 Jan 2000.
  1935. Worked on BeOS 4.5.  Got G-Kermit working in about 30 seconds.  C-Kermit is
  1936. harder because (a) no select(); (b) no curses; (c) no standard TCP/IP headers;
  1937. and (d) no /dev/tty.  The last was handled in a new way.  Instead of using
  1938. a hardwired string like "/dev/tty" for the controlling terminal as we have
  1939. always done, I made dftty = NULL for BEOS and #define'd CTTNAM to be dftty.
  1940. Then in sysinit I get the actual device name (like /dev/tt/p1) and make
  1941. dftty point to it.  Works like a charm.  But I have no idea if we can dial
  1942. out or anything...  But I do have a C-Kermit 7.0 binary that transfers files
  1943. in remote mode -- and FAST too!  ckcdeb.h, ckutio.c, ckuver.h, makefile,
  1944. 24 Jan 2000. 
  1945. Added SCO 3.2v5.0.2 makefile targets.  26 Jan 2000.
  1946. Tried to build on 4.3BSD/VAX.  Had to fix the KTARGET clause to avoid immediate
  1947. failure with "sh: bad substitution".  Fails miserably with "too many defines"
  1948. in ckuusr.h.  "make bsdm" gets a bit farther, but not much.  makefile,
  1949. 4 Feb 2000.
  1950. Tried building 6.0 on on 4.3BSD/VAX; the 6.0 ckuusr.h is not too big.  It
  1951. built OK.  4 Feb 2000.
  1952. Corrected KTARGET clauses in RT PC entries too.  makefile, 4 Feb 2000.
  1953. Back to 4.3BSD...  Some old preprocessors just don't expect so many #defines.
  1954. Yet there are huge blocks of #defines in ckuusr.h that are not protected by
  1955. #ifdefs, e.g. #ifndef NODIAL for all the DIAL-related definitions.  Added
  1956. these in and tried building "bsdm".  Then after working out some prototype
  1957. conflicts (ttyname, hostent, servent, etc) and defining the needed -DNOblah's
  1958. (realpath(), putenv(), ...) in the makefile target, the command-line-only
  1959. version built OK.  But the minimum interactive version (-DNOSPL) still won't
  1960. build -- too many defines.   makefile, ckuusr.h, ckutio.c, 5 Feb 2000.
  1961. Migrated a few of the 4.3BSD changes into the RT PC AOS/ACIS/BSD targets.
  1962. makefile, 5 Feb 2000.
  1963. Added Stratus FTX targets to the makefile.  6 Feb 2000.
  1964. Built on an SCO Xenix 2.3.4 TCP/IP development system assembled by Jeff
  1965. Liebermann.  This required addition of -DNO_DNS_SRV and removal of -lmalloc
  1966. from the sco234netc target.  makefile, 8 Feb 2000.
  1967. To build C-Kermit 7.0 on BSD4.3, I tried the following trick:
  1968.  . Tar the BSD4.3 /usr/include tree and ftp it back here.
  1969.  . Make a bsd43 directory with an include subdirectory.
  1970.  . Untar the BSD include tree into the bsd43/include subdirectory.
  1971.  . Copy the C-Kermit 7.0 sources into the bsd43 directory.
  1972.  . Run the following shell script on them:
  1973.    for i in *.c; do
  1974.        echo $i...
  1975.        cc -E -DCK_CURSES -DTCPSOCKET -DBSD4 -DNOREALPATH -DNOTIMEH 
  1976.    -DSYSTIMEBH -DNOIKSD -DNOPUTENV 
  1977.    -I./include $i > $i.e
  1978.        rm -f $i
  1979.        grep -v "^#" $i.e > $i    
  1980.    done
  1981.  . FTP the results back to the BSD system.
  1982.  . Give the regular "make bsd43c" command.
  1983. It almost worked except SunOS cpp seems to have a 1K buffer limit for macro
  1984. expansions, and certain macro expansions from stdio.h need more than 1K.
  1985. So I redid it with gcc instead of cc.  A quick check seems to indicate no
  1986. macro expansions were truncated.  Sent the results back to BSD.  Still no
  1987. good.  In ckucmd.c, routine cmdecho(), was a line:
  1988.   putchar(BS); putchar(SP); putchar(BS); 
  1989. The expansion of putchar() is quite long, and three of them in a row resulted
  1990. in a line that was truncated by cpp -- even in gcc!  The solution was to put
  1991. them on separate lines (so the problem is cpp's output-line buffer).  Then the
  1992. bit in traverse() that checked the inode needed a BSD42 #ifdef.  The whole
  1993. thing compiled and linked OK, and works fine: Telnet, curses, and all.  Since
  1994. the preprocessor ran on a Sun, I also had to change the v(cpu) and SHOW
  1995. FEATURES processor constants from "sparc" to "vax" by hand.  ckuus[45].c,
  1996. makefile, ckufio.c, 8 Feb 2000.
  1997. For the record, here's the final 4.2BSD script that uses gcc (the changes are
  1998. just to disable ANSI prototyping, void, etc).  The non-gcc one might still
  1999. work, however, now that the putchar() line is unfolded:
  2000.   cp <sourcepath>/ck[cu]*.[ch] .
  2001.   rm -f ckustr.c cku2tm.c ckcmdb.c
  2002.   for i in *.c; do
  2003.       echo $i...
  2004.       gcc -E -DCK_CURSES -DTCPSOCKET -DBSD4 -DNOREALPATH -DNOTIMEH 
  2005.    -DSYSTIMEBH -DNOIKSD -DNOPUTENV -DNOANSI -DBIGBUFOK -traditional 
  2006.    -I./include $i > $i.e
  2007.       rm -f $i
  2008.       grep -v "^#" $i.e > $i    
  2009.   done
  2010. Ditto for 4.2BSD.  Note that 4.2 and 4.3BSD on VAX are binary compatible.  The
  2011. only difference to Kermit is whether the acucntrl() program is called to grab
  2012. a dialout line.  8 Feb 2000.
  2013. In response to a sudden rash of complaints about failure to build on AIX 4.3.0
  2014. because of:
  2015.   ld: 0711-781 ERROR: TOC overflow. TOC size: 70908 Maximum size: 65536
  2016. Did some digging and discovered the "-bbigtoc" ld option for AIX.  But it's
  2017. strange that this was necessary, since the same code was built successfully on
  2018. AIX 4.1.3, 4.1.5, 4.2.1, 4.3.1, 4.3.2, and 4.3.3 without these changes.  Also
  2019. upped -qmaxmem to 16000 since the previous value of 8000 gave failure-to-
  2020. optimize warnings (so did 12000).  makefile, 8 Feb 2000.
  2021. Still on AIX... Here's a good one.  Look at the following code from ckcpro.w:
  2022.     } else if (x == -1) { /* EOF - finished sending data */
  2023. debug(F101,"<ssdata>Y cxseen","",cxseen);
  2024. window(1); /* Set window size back to 1... */
  2025. if (clsif() < 0) /* Close input file */
  2026.   cxseen = 1; /* Send EOF packet*/
  2027. debug(F101,"<ssdata>Y CALLING SEOF()","",cxseen);
  2028. seof(cxseen||czseen);
  2029. BEGIN sseof; /* and enter send-eof state */
  2030.     }
  2031. In AIX, this produced the warning: "'/*' detected in comment".  When I
  2032. inserted a space in "packet*/" the warning went away.  This would suggest that
  2033. the last three statements in the block were not being included in AIX builds.
  2034. But if that were true, sending files wouldn't work.  But sending files does
  2035. work.  ckcpro.w, 8 Feb 2000.
  2036. Added -DHUP_POSIX to unixware20 target to fix nonfunctional HANGUP command
  2037. (fix verified by Clarence Dold).  makefile, 8 Feb 2000.
  2038. Added tru64-40f target since we already have a tru64-40e and tru64-40g.
  2039. makefile, 8 Feb 2000.
  2040. Changed help text to not refer to a specific edition of the C-Kermit book.
  2041. ckuus2.c, 8 Feb 2000.
  2042. Changed version number to 7.0.197.  makefile, ckcmai.c, 8 Feb 2000.
  2043. --- 7.0.197 ---
  2044. ******************
  2045. (Build list moved from here to ckx196.txt, 18 Oct 1999).
  2046. ------
  2047. (End)