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

通讯/手机编程

开发平台:

Windows_Unix

  1. days since 17 November 1858 -- which, coincidentally, is also Day Zero in VMS.
  2. I added system independent functions to convert from a free-format date to MJD
  3. (fmjd()) and vice versa (fmjd2date()).  So now we have date arithmetic,
  4. e.g.:
  5.   .%x := fmjd()                  ; Today's MJD
  6.   .%x ::= %x - 7                 ; MJD one week ago
  7.   send /after:fmjd2date(%x) *.*  ; Send all files created in the last week
  8. or more compactly:
  9.   send /after:fmjd2date(fmjd() - 7) *.*
  10. ckuusr.h, ckuus4.c, 3 Jul 98.
  11. Added fday(date) (day of week) and fnday(date) (numeric day of week).
  12. ckuusr.h, ckuus4.c, 4 Jul 98.
  13. Added help text and docs for new date functions, ckuus2.c, ckermit2.txt,
  14. 4 Jul 98.
  15. Added evalx(), which is a silent version of evala() -- does the same thing,
  16. but does not print any error messages.  ckuus5.c, 5 Jul 98.
  17. Fixed rdigits() not to succeed when given the null string or an empty string.
  18. ckucmd.c, 5 Jul 98.
  19. fdate() and fsize() did not fail or print error messages if given bad
  20. arguments.  Fixed in ckuus4.c, 5 Jul 98.
  21. Added ftime(), fntime(), and fn2time().  ckuusr.h, ckuus[24].c,
  22. ckermit2.txt, 5 Jul 98.
  23. Added v(tftime) - elapsed time in seconds of most recent file transfer.
  24. ckuusr.h, ckuus4.c, 5 Jul 98.
  25. From Kevin Handy: Although it is legal to take the address of a constant in
  26. VAXC, it is not legal in GCC (and not a good idea either!).  This was done in
  27. the VMS version of gftimer().  Fixed by assigning the constant to a variable
  28. and taking the address of the variable.  He can now build C-K 6.1 B.05
  29. successfully with GCC 2.8.1 on VMS 5.5-2 without network support.  ckvtio.c,
  30. 5 Jul 98.
  31. IKS changes from Jeff, many modules, 6 Jul 98.
  32. Removed the restriction from tod2sec() that hours must be 24 or less.  There
  33. is no reason why lots of hours can't be specified -- after all, we can still
  34. convert them to seconds.  ckuus6.c, 6 Jul 98.
  35. Changed cm/ckcvtdate() to allow hours to be > 24 if given a special argument.
  36. ckucmd.c, 6 Jul 98.
  37. Merged tod2sec() and fntime() -- they have the same purpose, but the latter
  38. is much more tolerant (see ckermit2.txt).  ckuus4.c, 6 Jul 98.
  39. Removed 75 lines of crufty code from doalarm() and replaced them by calls to
  40. the new date/time-handling functions, to fix problems with alarms that span
  41. midnight.  ckuus3.c, 6 Jul 98.
  42. Corrections to yesterday's changes -- missing args to ckcvtdate(), etc.
  43. ckuus3.c, ckuus6.c, 7 Jul 98.
  44. Added HADDRLIST definition for major Unixes to ckcnet.h, and removed them from
  45. the makefile.  7 Jul 98.
  46. Added CLEAR ALARM -- more intuitive than SET ALARM 0 (which still works).
  47. ckuusr.[ch], ckuus3.c, 7 Jul 98.
  48. Added CLEAR TEXT-PATTERNS and CLEAR BINARY-PATTERNS; everything that has an
  49. ADD or REMOVE command should also have a CLEAR command.  ckuusr[ch], 7 Jul 98.
  50. Updated HELP CLEAR -- it was way out of date.  ckuus2.c, 7 Jul 98.
  51. Added a section, 7.15, on alarms to ckermit2.txt.  7 Jul 98.
  52. Changes from Jeff to support server-side Telnet negotiations and remote/local
  53. echo.  ckuusr.h, ckuus[23457].c, ckcfn2.c, ckucon.c, ckucns.c, ckcnet.c,
  54. 11 Jul 98.
  55. Added hooks for SET NETWORK TYPE PTY, but they don't do anything yet.  Symbol
  56. NETPTY governs inclusion of PTY code, defined for now only for SunOS.
  57. ckcnet.h, ckuus[r3].c, ckutio.c, 11 Jul 98.
  58. Added REMOTE EXIT, 12 Jul 98.:
  59.  . Server side: ckcpro.w, ckcfns.c, ckcmai.c.
  60.  . Client side: ckuusr.h, ckuus[r7].c.
  61.  . { ENABLE, DISABLE } EXIT: ckuusr.[ch].
  62.  . SHOW SERVER.  ckuus[56].c.
  63.  . HELP REMOTE EXIT.  ckuus2.c.
  64.  . Documentation.  ckermit2.txt.
  65. Defined Option and Mode bits for Extended GET.  ckcker.h, 12 Jul 98.
  66. Added client side of Extended GET, single-packet, single-filespec version
  67. only, supporting only /DELETE /RECOVER /RECURSIVE options and /BINARY /TEXT
  68. /LABELED modes:
  69.  . Defined Option and Mode bits for Extended GET.  ckcker.h,
  70.  . Set opkt flag in GET cases where needed & get options.  doxget(), ckuus6.c.
  71.  . Added new start state "o" for Extended GET.  ckuus6.c, ckcpro.w.
  72.  . Added opkt parameter to srinit(): ckcker.h, ckcpro.w, ckcfn2.c.
  73.  . Reset O-Packet options after transaction complete. ftreset(), ckuusx.c,
  74.  . Added code to srinit() to send O-packet.  ckcfn2.c.
  75. Added server side of Extended GET.  New state for incoming O packet, new
  76. second arg to sgetinit() indicating O packet, sgetinit() parses the O packet,
  77. extracts the flags, mode, and filename.  Allows for multiple incoming O
  78. packets, even though the client doesn't send them yet.  Does not yet allow for
  79. multiple filespecs.  Does not yet support selectors of any kind (date, size,
  80. exception list).  Cleaned up various other bits in sgetinit().  ckcpro.w,
  81. 12 Jul 98.
  82. Tested all combinations of GET switches on regular files as well as commands;
  83. it all seems to work nicely, including GET /DELETE /RECOVER /RECURSIVE when
  84. recursion and recovery actually are involved.  If a new client sends an O
  85. packet to an old server, the server complains about unknown packet type.  If
  86. an OLD client sends GET, REGET, RETRIEVE, etc, to a new server it works as
  87. expected.
  88. No particular documentation or help messages were needed since it's all under
  89. the surface -- it makes some GET switch combinations work that didn't work
  90. before.
  91. Will add selectors and multiple filenames (mget) later.  Ditto for quoting
  92. and generic wildcards (but since wildcards already work nobody will notice
  93. that this part isn't done).
  94. Changes from Jeff to ckcfn2.c and ckcnet.c, 13 Jul 98.
  95. Fixed a bug in O-Packet encoding (it neglected to terminate the string).
  96. ckcfn2.c, 13 Jul 98.
  97. Added comments to O-packet decoder.  ckcpro.w, 13 Jul 98.
  98. Changed O-Packet encoder to build a linked list of fields, and O-Packet sender
  99. to fill one or more packets with one or more fields on a first-fit basis.
  100. Various errors are now possible (malloc failure, filename too long, missing
  101. filename, etc), so an appropriate message is set for the E-Packet.  ckcfn2.c,
  102. 14 Jul 98.
  103. Changed protocol engine to include a new state for sending and getting ACKs
  104. to O-Packets, and another new state for sending a sequence of O-Packets.
  105. ckcpro.w, 14 Jul 98.
  106. Tested OK with GET /RECURSIVE /RECOVER /DELETE /BIN short-filename (so it
  107. assembles the O-Packet fields from the linked list OK).  Tested with a very
  108. long filename and verified that it triggers a second O-Packet.  Tested
  109. with a null filename and verified it sends the proper error message (which
  110. should never occur in real life).
  111. Then came a test where the filename exactly reached the end of the packet,
  112. leaving no space for the 2-byte EOP tag ("@ ").  This failed for a subtle
  113. reason in the getpkt() routine, namely that it did not distinguish between
  114. real data and memory-string data.  Real data (such as file data) could leave
  115. behind leftovers that would be picked up next time.  But getpkt() is called
  116. only once on string data -- the encoded argument string is supposed to fit
  117. into one packet.  But getpkt() was (a) making leftovers, and (b) returning
  118. success, rather than failing in this case, thus truncating the data.  This bug
  119. must have other consequences too, but none that have ever been reported.
  120. Once this was fixed it was possible to test the other cases.  So now the
  121. protocol part is working -- the client will send as many O-Packets as it takes
  122. to handle all the O-Packet fields, and the server will read and process
  123. incoming O-Packets until the final one is received, and then will switch into
  124. send state, and the client will switch into receive state.
  125. There is a still one remaining area to handle -- packet loss:
  126.  . What if the final O-Packet is lost?  No problem, the server NAKs it.
  127.  . What if the server's S-packet is lost?  Here we have a problem if
  128.    the client times out and resends its final O-Packet *and* this O-Packet
  129.    has a nonzero sequence number: the server's transport layer
  130.    rejects the packet.  I'll handle this tomorrow...
  131. Still to do (easy now):
  132.  . Handle multiple filenames
  133.  . Handle selectors
  134.  . Redo MGET to use O with multiple filenames (?)
  135. Merged LOGIN and LOGOUT commands from Jeff.  Made lots of portability changes,
  136. plus some corrections (cklogin/out routines already existed; various malloc'd
  137. buffers were not being freed on error return from routines, etc).
  138. ckcdeb.h, ckuusr.[ch], ckuus7.c, 15 Jul 98.
  139. With the changes above, C-Kermit would not run properly when chroot'd because
  140. it could not find "/dev/tty", which it normally opens when entering protocol
  141. mode.  This could be worked around with "-l 0" on the command line, except
  142. then Kermit thought it was in local mode.  Fixed by making ttopen(), when
  143. given a device name of "0", set remote mode rather local.  ckutio.c,
  144. 16 Jul 98.
  145. Added "-A" command-line option.  Starts K95 as an Internet server on device
  146. "0".  ckuusy.c, 16 Jul 98.
  147. Problem with both the above, at least on SunOS: After return from protocol
  148. mode, CRs are no longer supplied by the terminal driver after LFs (CRMOD
  149. function is lost).  Explicitly setting it in concb() doesn't help.  Turns out
  150. the problem was that UNIX concb() would just return if Kermit was started with
  151. device "0".  Commented out that code and it works OK, but I wonder why it was
  152. there to begin with (i.e. I wonder what I just broke).  ckutio.c, 16 Jul 98.
  153. Changed main program to call ckxlogin(NULL,NULL,NULL) if C-Kermit invoked with
  154. -A option, so the first thing the user sees is a login prompt.  This happens
  155. before the initialization file, script, or any command-line action option is
  156. executed, but after Kerberos initialization, and it works OK,  ckcmai.c,
  157. 16 Jul 98.   (Presumably ckxlogin() will return 1 if user has already
  158. authenticated via Kerberos...)
  159. But when running C-Kermit in this manner, for some reason it gets a SIGHUP
  160. when receiving a file.  Experimentation shows this happens whenever we use
  161. "-l 0" and the receive packet length (or the product of packet length and
  162. window size) is greater than 897, which looks suspiciously close to the TCP
  163. MSS.  So all the changes made to accommodate file descriptor 0, though perhaps
  164. useful in other contexts, don't help here.  The real trick is to go back to
  165. opening /dev/tty, but doing it before the chroot(), while we can still see it.
  166. Fixed in ckcmai.c, ckuus4.c, ckuusy.c.  16 Jul 98.
  167. Cleanups from Jeff for login code.  ckuus7.c, 18 Jul 98.
  168. Tried building a version with:
  169. "LIBS= -L/usr/local/lib -lpwent -lcurses -ltermcap"
  170. to see if it would use the local authentication methods, found lots of bugs
  171. in the code that logs in a real user.  Fixed them, now it works.  ckuus7.c,
  172. 18 Jul 98.
  173. Moved user ID and password-checking code to new system-dependent routines,
  174. zvuser() and zvpass().  ckufio.c, 18 Jul 98.
  175. Changed ckxlogin() to behave consistently in call cases, always prompting for
  176. both a user ID and password, and not giving a failure message until after the
  177. user has given both, and always giving the same message in case of failure:
  178. "Access denied".  ckuus7.c, 18 Jul 98.
  179. Verified that when logged in via ckxlogin() that "set line /dev/blah" fails
  180. properly when lockfile directory is protected against the logged-in user,
  181. even though the real user is root.
  182. Built a copy with CK_LOGIN, local libs, and NOLOCAL, since this is the
  183. configuration that will probably be used in the real world -- allowing an
  184. Internet Kermit server to dial out or make Telnet connections would make about
  185. as much sense as allowing an FTP server to do this.  (But with Kermit, it
  186. would actually work -- but it would also open up enormous security holes...)
  187. Got this working OK after adjusting some #ifdefs, and the resulting executable
  188. is about 200K smaller.  NOTE: We can't enclose all of ckcnet.c in #ifndef
  189. NOLOCAL because now we support server-side Telnet negotiation.  However, I was
  190. able to #ifdef out a rather large portion of it.  This involved making sure
  191. that TNCODE was not disabled if NETCONNN or TCPSOCKET were not defined, or
  192. if NOLOCAL was defined.  So another 25K cut away.  Many modules, 18 Jul 98.
  193. Rather massive rearrangement of ckcnet.c to allow TELNET routines and
  194. variables to exist even when NETCONN & TCPSOCKET are not defined and/or
  195. NOLOCAL is defined.  18 Jul 98.
  196. Enabled SET/SHOW TELNET when TNCODE defined, even if NETCONN & TCPSOCKET
  197. not defined or NOLOCAL defined.  ckuus3.c, 18 Jul 98.
  198. All of the above will obviously need a lot more work, testing, and thought
  199. (not necessarily in that order).  For example, how does Kermit, when in remote
  200. mode, know if it should be doing server-side Telnet negotiation?  If it's
  201. already under a telnetd, then the only time it will see an IAC is if a quoted
  202. IAC has been unquoted and passed down, but how do we tell the difference?
  203. There's no way, unless we are told, e.g. by a command-line argument.
  204. For example, constructions like:
  205.     if (netconn && (ttnproto == NP_TELNET) && (n == IAC))
  206. when used to decide whether to call tn_doop(), tn_siks(), etc, are completely
  207. wrong.  They should be more like:
  208.     if (n == IAC &&
  209. ((local && network && (ttnproto == NP_TELNET)) ||
  210. (!local && sstelnet)))
  211. where sstelnet is nonzero when we should be doing server-side Telnet
  212. negotiation.  Such changes need be made only in code that can be executed in
  213. remote mode, e.g. in ttinl(). doinput(), etc.  For now, we set the sstelnet
  214. flag when the -A command-line option is given (but we might want to make
  215. separate cases in the future for Telnet and non-Telnet servers that must be
  216. logged in to -- e.g. Kermit replacing login for incoming serial connections).
  217. Anyway, I think I caught most of these cases.  Many modules, 18 Jul 98.
  218. Made a new makefile entry for testing all this: sunos41gccx.  It adds NOLOCAL,
  219. TNCODE, and IKS_OPTION.  18 Jul 98.
  220. A debug log from Ron Heiby showed that we are accepting 0x81 as Start of
  221. Packet (SOP) even though we know parity is none.  This is an artifact of the
  222. automatic parity detection code -- since we don't know in advance if the first
  223. packet has parity, we check for SOP using a mask of 0x7f.  But after we know
  224. there is no parity, we should change the mask to 0xff.  Fixed in ttinl().
  225. Also, improved the way ttinl() decides whether a parity check is needed by
  226. (re)setting the flag in ttpkt(), which is always called at the beginning of
  227. packet operations.  I also rearranged the code a bit to test for interruption,
  228. SOP, and length in a more sensible (and efficient) order.  ckutio.c, 19 Jul 98.
  229. Made "set prefixing none" invisible.  ckuus3.c, 19 Jul 98.
  230. From Jeff, 19 Jul 98:
  231.  . Moved cmdini() call to higher up in main() just in case anything that
  232.    happens in prescan() needs the command parser or buffers.  ckcmai.c.
  233.  . Moved some code from prescan() to main().  ckuus4.c, ckcmai.c.
  234.  . Change end_login() to zvlogout().  ckufio.c, ckuus7.c.
  235. Added protytpes for zv{user,pass,logout}() to ckcdeb.h, 19 Jul 98.
  236. Updated some comments in input().  ckcfn2.c, 19 Jul 98.
  237. Removed NONE from HELP SET PREFIXING message (Jeff), ckuus2.c, 21 Jul 98.
  238. Added SET SERVER CD-MESSAGE { ON, OFF }.  When ON, and the user successfully
  239. CDs to a directory that contains a READ.ME file (name configurable), its
  240. contents are sent to the client's screen, similar to what wu-ftpd does.  If
  241. such a file does not exist, or is not readable, the directory name is sent
  242. back in the ACK, as before.  The default CD Message filename is defined in
  243. ckcker.h as DFCDMSG.  This can be overridden by defining DDFCDMSG on the CC
  244. command line to be the quoted filename, e.g.:
  245.   make xxx "KFLAGS=-DDFCDMSG=\"newname\""
  246. (the number of 's depends on the shell, how deeply nested the makefile entry
  247. is, etc).  The default for UNIX and OS-9 is "./.readme"; for others it's
  248. "READ.ME".  The default for SET SERVER CD-MESSAGE is OFF, except when user
  249. logs in anonymously, in which case it's ON.  ckcmai.c, ckcker.h, ckuusr.h,
  250. ckuus[23].c, ckcfns.c, ckcpro.w, 21 Jul 98.
  251. Added SET SERVER CD-MESSAGE FILE <name> to allow the message-file name to be
  252. specified at runtime.  ckuus3.c, 21 Jul 98.
  253. Added REMOTE SET SERVER CD-MESSAGE { ON, OFF }, client side and server side,
  254. Code 420, ckuus3.c, ckcfns.c, 21 Jul 98.
  255. Added CD Message material to SHOW SERVER.  ckuus5.c, 21 Jul 98.
  256. Considered adding ENABLE/DISABLE CD-MESSAGE, but I don't see a need for it.
  257. If you can CD to a directory, you can GET or REMOTE TYPE any file in it that
  258. you have read access to, so there is no reason to disable the CD message
  259. feature; the user can turn it on or off as desired, and whoever sets up the
  260. server can set the initial state.
  261. Don't set the sstelnet flag if in local mode.  ckuus4.c, 21 Jul 98.
  262. Made -A imply -z (force foreground), for when we are running under inetd.
  263. ckcmai.c, 22 Jul 98.
  264. Changed default CD-message file for non-UNIX to README.TXT.  ckcker.h,
  265. 22 Jul 98.
  266. Problem with filename patterns, first noted by Peter Eichhorn:
  267.  1. Person sending files is running C-Kermit 6.1 on UNIX with SET FILE
  268.     PATTERNS ON (which is the default) and SET FILE TYPE BINARY.
  269.  2. The Kermit program on the receiving end does not support Attribute packets.
  270.  3. The sender switches between text and binary mode per file, but since the
  271.     receiver does not support A-packets, the sender has no way to tell the
  272.     receiver about the mode switching.
  273.  4. Text files are sent with CRLFs.
  274. Consequences:
  275.  1. If the receiver is UNIX, this ruins the text files (at least for certain
  276.     applications).  This is an incompatible change from past behavior, and
  277.     it is bad.
  278.  2. If the receiver is on a DOS-like file system, the text files arrive in
  279.     the proper format.  This, too, is a change from previous behavior in
  280.     which the text files would have been sent in UNIX format.
  281. Possible solutions:
  282.  1. Leave matters as they are.  Not good, since this breaks something that
  283.     used to work.
  284.  2. As soon as the transfer starts, C-Kermit knows whether the other Kermit
  285.     supports A-packets.  If it does not, disable per-file mode switching.
  286.     This eliminates Bad Consequence 1 above, restoring the earlier (and
  287.     expected) behavior.  It also eliminates Good Consequence 2 above, but
  288.     that's OK since it is not a change from previous behavior.
  289.  3. Solution 2 is satisfactory but less than optimal, since one would expect
  290.     that in SET FILE PATTERNS ON, "ON" means ON.  It also rules out Good
  291.     Consequence 2 even in cases where we might want it.  A better solution
  292.     might be to add SET FILE PATTERNS AUTO and make it the default.  Then
  293.     ON would mean ON, OFF would mean OFF, and AUTO would mean "ON but only
  294.     if the other Kermit accepts Attribute packets".
  295. Option 3 restores the original behavior when the receiver does not support
  296. A-packets, but allows for mode switching when A-packets can be used, and it
  297. also allows for Good Consequence 2 when A-packets can't be used if you SET
  298. FILE PATTERNS ON.  So...
  299.  . Added AUTO to SET FILE PATTERNS keywords, value 2.  ckuus7.c.
  300.  . Changed default to AUTO.  ckcmai.c.
  301.  . Changed SHOW FILE and SHOW PATTERNS to display "auto".  ckuus5.c.
  302.  . Updated HELP SET FILE message.  ckuus2.c.
  303.  . Changed spar() to set patterns = 0 if AUTO && A-packets not negotiated.
  304.    The prevailing setting is restored automatically at the end of protocol.
  305.    ckcfns.c, ckuusr.c.  22 Jul 98.
  306. Corrected some filename patterns that were missing "*".  ckcmai.c, 22 Jul 98.
  307. Server-side telnet changes from Jeff, including recognition of Telnet
  308. negotiations when at prompt.  23 Jul 98.
  309. Some minor server-side Telnet corrections:
  310.  . When packet mode interrupted by ^C^C^C, echo "^C..." to stdout not stderr.
  311.  . Flush typeahead before username and password prompts.
  312. Changed UNIX packet reader to print ^X... when interrupted, where ^X is the
  313. actual transfer cancellation character, rather than always printing "^C...".
  314. ttinl(), ckutio.c, 23 Jul 98.
  315. If TCPSOCKET is defined but TNCODE is not, define TNCODE for the benefit of
  316. any modules that might need it for server-side Telnet protocol, but that don't
  317. need to include all of ckcnet.h.  ckcdeb.h, 23 Jul 98.
  318. The previous change still wasn't good enough for ckucmd.c, so I made it
  319. include ckcnet.h.  23 Jul 98.
  320. Added SET COMMAND AUTODOWNLOAD { ON, OFF }, independent of SET TERMINAL
  321. AUTODOWNLOAD { ON, OFF }.  When ON, which is the default, the command parser
  322. recognizes Kermit packets.  An S packet makes it go into receive mode, an I
  323. packet makes it go into server mode.  ckuusr.h, ckuus[235].c, 23 Jul 98.
  324. Implemented SET COMMAND AUTODOWNLOAD in gtword(), ckucmd.c, and
  325. kstart(), ckcfn2.c, 23 Jul 98.  For now, works only for Kermit protocol.
  326. Add Zmodem later.
  327. Changed server end of REMOTE LOGIN as follows:
  328.  1. If a login attempt fails, send back an Error packet rather than an ACK
  329.     with an error message, so the client can tell that it failed.
  330.  2. If started with -A, authenticate the user via ckxlogin() rather than
  331.     the SET SERVER LOGIN strings.
  332.  3. If the client tries to log in when already logged in, send an E packet,
  333.     but leave them logged in.
  334. The next step is to allow a REMOTE LOGIN packet to be received and processed
  335. at the Username: prompt.  This almost works -- kstart() recognizes the packet
  336. OK, but since the command parser has not entered its keyword parsing loop yet,
  337. the mechanism that is used under normal circumstances (stuff "server" or
  338. "receive" into the command buffer) is inappropriate here -- it just looks like
  339. a username.  I'll fix this tomorrow.
  340. Add server idle-timeout into to SHOW SERVER, from Jeff.  ckuus5.c, 24 Jul 98.
  341. printf(), putchar(), perror() replacements from Jeff for UNIX, to translate
  342. "n" to CRLF when C-Kermit is an Internet server, in which case there is no
  343. terminal driver to do this.  When run as an Internet server, C-Kermit now
  344. prints normal-looking output rather than giving the stairstep effect.
  345. ckutio.c, ckcdeb.h, 24 Jul 98.
  346. Changed '-A' to include '-Q' (fast protocol settings) and (from Jeff) to
  347. set "nopush".  Previously, nopush was set only for guest logins; now it is
  348. set for regular ones too, not for security reasons, but because output from
  349. inferior processes has bare LFs, since there is no terminal driver to convert
  350. them to CRLF.  ckcmai.c, ckuusy.c, 24 Jul 98.
  351. Changed ckwart to not use the printf(), putchar(), perror() replacements,
  352. since it does not have access to them.  ckwart.c, 24 Jul 98.
  353. Added numerous casts to shut up picky Sun ANSI cc.  ckcfn[2s].c, ckcpro.w,
  354. ckuus[r7].c, 24 Jul 98.
  355. Yesterday's code broke regular logins at the Username: prompt by failing to
  356. set the "logged in" variable checked by the server whenever a command is given
  357. that requires the user to be logged in.  Fixed in ckcmai.c, 24 Jul 98.
  358. Adjusted the method for the command parser to let the upper level code know
  359. that a Kermit packet had been received, so now it doesn't depend on the
  360. top-level keyword table.  Instead, it just sets the start-state appropriately.
  361. This method could be used by the CONNECT command too, since it's a lot simpler
  362. and does not rely on APC or the script language being configured in, but it
  363. would also require changing every CONNECT module plus the mainline code that
  364. calls the CONNECT module.  ckucmd.c, 24 Jul 98.
  365. Adjusted the main program to call ckxlogin() in a loop in a way that allows
  366. direct login at the prompt, or via Kermit REMOTE LOGIN packet.  But this fails
  367. because of the autoupload string "kermit -x" has already been read at the
  368. Username prompt and taken as the user name.  But then if the password reader
  369. also checks for autoupload, we undo this and it works quite nicely.  Made sure
  370. that "kermit -A" exits after three successive unsuccessful attempts to log in,
  371. no matter whether this is at the prompt or by REMOTE LOGIN.  But this does not
  372. close the connection to the client, since it is the superior program (such as
  373. inetd) that has it open, so that program has to be relied upon to close the
  374. connection when the server program exits.  ckcmai.c, ckuus7.c, 24 Jul 98.
  375. Added a pause after each unsuccessful login attempt.  ckcmai.c, 24 Jul 98.
  376. Even assuming the connection is closed by the remote after 3 bad login
  377. attempts, if the client is sitting at its prompt sending REMOTE LOGIN
  378. requests, there is no indication to the user that the connection has been
  379. closed.  Changed the client so if REMOTE LOGIN or any other REMOTE command is
  380. given when in local mode but ttchk() returns < 0, it prints "?No connection"
  381. and fails.  ckcpro.w, 24 Jul 98.  (I probably should do this for SEND and
  382. RECEIVE too...)
  383. Changed DIRECTORY command, general case, to call domydir() (built-in
  384. directory-listing generator) if NOPUSH is defined or if nopush is set.
  385. ckuus6.c, 24 Jul 98.
  386. Added an easier way to access command-line arguments.  In:
  387.   kermit -a -b -c ... = word1 word2 word3 ...
  388. "/path/kermit" is assigned to top-level %0, word1 is assigned to top-level
  389. %1, word2 to %2, and so on.  If a Kermit script is started on the command
  390. line, %0 is set to the pathname of the script rather than the pathname of
  391. Kermit.  cmdini(), ckuus5.c, 25 Jul 98.
  392. Made "show args" work for top level.  doshow(), ckuus5.c, 25 Jul 98.
  393. Made v(argc) work for top-level.  nvlook(), ckuus4.c, 25 Jul 98.
  394. Now it's a lot easier to write Kermit scripts for UNIX that have "shbang"
  395. lines, and pass arguments to them on the command line -- it works just like
  396. a shell script, except for the "=", which is needed to separate arguments
  397. for Kermit itself from arguments for the script.
  398. Beefed up UNIX zfnqfp().  Previously it was susceptible to "/./", "/../",
  399. "..", "//", and similar tricks.  Now I hope it's bulletproof.  For example,
  400. "fpathname(/usr/olaf/tmp/./foo/../../x.y)" now returns "/usr/olaf/x.y"
  401. rather than "/usr/olaf/tmp/./foo/../../x.y".  The latter wasn't exactly wrong,
  402. but now we can be more confident if we want to change DISABLE CD in the server
  403. to restrict the user to a rooted directory *tree* rather than just a single
  404. directory.  ckufio.c, 25 Jul 98.
  405. Fleshed out the syslog() and wtmp features of IKS.  I separated the two, and
  406. enabled only wtmp, since I have no idea what syslog() does or how to test
  407. whether we're using it right.  So now Kermit makes a wtmp entry when I log
  408. into the Kermit server, and another one when I log out.  But even after I log
  409. out, "last" says I'm still logged in.
  410. But while testing this, the client Kermit started crashing (this is what
  411. prevented the logout entry from getting into wtmp).  The debug log shows a
  412. ttinl() timer going off while I'm in the command parser, which indicates that
  413. it thinks it got a packet from the keyboard (which it did not) (the crash
  414. occurs because no handler is armed for the SIGALRM).  Furthermore, the log
  415. shows that the streaming flag gets turned off for some reason (which is why
  416. the timer is going off in the first place, since ttinl() is untimed when
  417. streaming).  I disabled the wtmp code in case that caused it, but no
  418. difference, so I turned it back on.
  419. OK, one thing at a time.  wtmp...  As near as I can tell from "man last",
  420. logout and login records are matched by username and "terminal name", which
  421. should form a unique pair.  When somebody logs in to ftpd, it records the
  422. terminal name as "ftp" followed by the ASCIIized pid of the ftpd incarnation,
  423. like "ftp12345".  The "last" program evidently has code in it to strip off the
  424. numeric part after "ftp", so this never shows up in a listing.  If I do the
  425. same thing in Kermit, it seems to work -- "last" shows the session as logged
  426. out, but does not strip off the pid so the listing looks ugly ("kermit92",
  427. instead of just "kermit").  So I made it "kermit_xxxx", where xxxx is the pid
  428. in hex.  I hope this doesn't overflow any buffers anywhere, since this is a
  429. rather long "terminal name".  ckufio.c, 25 Jul 98.
  430. The hostname did not show up in "last" listing since the Kermit server is
  431. communicating over stdio and has no idea what the client host is.  But when
  432. inserver != 0 stdio is really a socket, so we can call getpeername() on it.
  433. And this works, but of course, only if C-Kermit is built with -DTCPSOCKET
  434. (i.e. without NOLOCAL).  I added a ckgetpeer() routine to ckcnet.c to return
  435. the hostname or address of the peer, and call it from the inserver startup
  436. section in ckcmai.c; seems to work fine.  25 Jul 98.
  437. As for the crashing...  It seems to be an aftereffect of recognizing a packet
  438. while in the command parser.  It happens later on, but it never happens if
  439. I don't exercise that code.  It can happen on either end too, not good.
  440. (I knew adding this feature was too easy!)
  441. Rearranged things to allow -x to appear on command line with -A, and if it
  442. does, to skip the Username: prompt and go straight into server mode.  Testing
  443. in this mode shows solid operation, no crashes.  So this seems to confirm that
  444. the crashing problem is caused by the command-mode autoupload feature.
  445. ckcmai.c, ckuus[4y].c, 26 Jul 98.
  446. When -A given on command line, enter server mode automatically if me_iks_start
  447. has been set in the Telnet negotiations.  But this never happens because the
  448. server does not send START KERMIT until after it enters server mode, which is
  449. probably a good thing.  ckcmai.c, 26 Jul 98.
  450. When BYE was sent to the server, it called zkself() immediately, bypassing
  451. zvlogout(), so the logout record was not being written to wtmp.  Made BYE
  452. call ckxlogout() instead if zkself() if inserver.  ckcpro.w, 26 Jul 98.
  453. Moved "Enter Client/Server Mode..." message from ckucon.c to doconect() in
  454. ckuus4.c, so it doesn't need to be replicated in all CONNECT modules, and
  455. added REMOTE LOGIN and REMOTE HELP lines.  26 Jul 98.
  456. Fixed command-mode autodownload code to be active only when C-Kermit is in
  457. remote mode, since it can't possibly work when in local mode.  ckucmd.c,
  458. 26 Jul 98.
  459. Allowed server to execute BYE (if it is not disabled) even if user is not
  460. logged in (but not FIN since we don't want not-logged-in users getting to
  461. the prompt).  ckcpro.w, 26 Jul 98.
  462. Reorganized ckxlogin() to have a common exit to make sure prompt is restored,
  463. malloc'd items are freed, etc.  ckuus7.c, 26 Jul 98.
  464. Recent additions to ttinl() to handle Telnet negotiations, etc, failed to
  465. turn off the alarm() at each return point.  I added them, and this fixes the
  466. crashing.  ckutio.c, 26 Jul 98.
  467. Protocol engine was not sending back an error packet in response to
  468. REMOTE HOST commands when nopush in effect.  Fixed in ckcpro.w, 26 Jul 98.
  469. Allowed REMOTE HELP when not logged in, and made the message say REMOTE
  470. LOGIN required in that case.  ckcpro.w, 26 Jul 98.
  471. Added a help message for the Username prompt, and a herald above it.
  472. ckcmai.c, ckuus7.c, 26 Jul 98.
  473. Added code to zvpass(), at the point where the user is logged in, to set
  474. environment variables HOME, USER, and LOGNAME, and to copy the username into
  475. uidbuf[] and make homdir point to the login user's home directory, or if it's
  476. a guest login, to "/".  Now $() returns the right things for these, and so do
  477. v(user) and v(home).  This also fixes the problem of executing the real
  478. user's .kermrc, rather than the effective user's.  ckufio.c, 26 Jul 98.
  479. PWD in the UNIX version at the server's prompt ran the external pwd command.
  480. Replaced this by a call to zgtdir().  ckcmain.c, 26 Jul 98.
  481. Verified that:
  482.  . If you send BYE to the Username: prompt, it logs out the server.
  483.  . If "kermit -Ax" is used to start server mode (so user must log in with
  484.    REMOTE LOGIN), and the client does not negotiate IKS and therefore can
  485.    CONNECT, that ^C^C^C prior to login does not give the user the prompt --
  486.    instead it makes C-Kermit exit, which is exactly what should happen.
  487.  . If you start it as "kermit -AxS", then ^C^C^C also exits (I had to put
  488.    in special code for this).
  489.  . You can not SEND a file to the Username: prompt, or do REMOTE CD, or
  490.    anything else that is not allowed prior to login.
  491. Replaced the following:
  492.   len = (binary && !parity && !memstr && !funcstr) ?
  493.     bgetpkt(spsiz) : getpkt(spsiz,1);
  494. with:
  495.   if (binary && !parity && !memstr && !funcstr)
  496.     len = bgetpkt(spsiz);
  497.   else
  498.     len = getpkt(spsiz,1);
  499. in ckcfns.c, since the former caused the OS-9 compiler to generate bad code.
  500. Confirmed by Gregorie Martin, who also supplied a new OS-9 makefile and a
  501. new ck9asm.a module, allowing 32-bit builds, which are now necessary since
  502. data space is more than 64K in some modules.  27 Jul 98.
  503. Disabled logfile creation by anonymous users.  ckuus4.c, 27 Jul 98.
  504. From Jeff: Implement NVT and Telnet-Binary handling of CR, CRLF, CR-NUL in the
  505. command parser for server-side command input.  This fixes the bug with SHOW
  506. MACROS needing two CRs to confirm.  gtword(), ckucmd.c, 27 Jul 98.
  507. From Jeff: Recognize Ctrl-D as EOF in the command parser.  This allows users
  508. to cancel a login at the Username: or Password: prompt.  ckuus7.c, 27 Jul 98.
  509. Disabled Ctrl-D as EOF except when (inserver && !x_logged), and made Ctrl-C
  510. act like Ctrl-D.  ckucmd.c, 27 Jul 98.
  511. From Jeff: Clear all owner permission bits when creating files as guest,
  512. like wuftpd.  Also, fix an octal mask that missing its leading 0.  ckufio.c,
  513. 27 Jul 98.  Notes: When storing files in (say) kermit/incoming, they are
  514. created with ----rw-r--.  This prevents anonymous ftp users from reading
  515. them or overwriting them.  But wuftp uses ----r----- (how does it know?).
  516. From Jeff: Disable FTP, PING, and WHO commands if nopush set.  ckuusr.c,
  517. 27 Jul 98.
  518. From Jeff: Minor corrections to Telnet negotiations.  Implement server-side
  519. NAWS.  ckcnet.c, 27 Jul 98.
  520. NAWS stuff didn't quite work -- even though the negotiations are OK, every
  521. time thereafter the server goes to check its screen size, it gets its own
  522. rather than the client's.  That's because ttgwsiz() calls a local ioctl().
  523. To solve this, I changed Jeff's new code in ckcnet.c to set environment
  524. variables for LINES and COLUMNS from incoming NAWS subnegotiations, and then
  525. made ttgwsize() call xttgwsize() (which checks these values) if inserver is
  526. set (there might be a faster way to do this, but this mechanism was already
  527. there for other reasons -- come back and improve later if peformance is a
  528. problem).  ckcnet.c, ckutio.c, 27 Jul 98.
  529. Various interactive-mode features were not working in the Internet Kermit
  530. server: KERMIT READY TO... messages, askmore(), etc.  Since fd 0 is a
  531. redirected socket, isatty() was failing, and backgrd was being set.  Fixed in
  532. conbgt(), ckutio.c.  Similarly, changed is_a_tty() (the isatty() front end) to
  533. return(1) if inserver.  ckcmai.c, 27 Jul 98.
  534. I commented out the code that set SIGHUP to SIG_IGN (see 16 Jul 98 notes).
  535. We don't need it any more.  ckutio.c, 27 Jul 98.
  536. Three failed REMOTE LOGINs in a row did not make the server drop the
  537. connection as it should.  Fixed in ckcpro.w, 27 Jul 98.
  538. Removed "Entering Client/Server..." message from ckucon.c.  27 Jul 98.
  539. Bugs:
  540.  . Client and server get into a loop negotiating SGA (the loop is broken
  541.    automatically after 4, but should not happen in the first place) (not
  542.    really a bug -- needs to be this way for DG Telnet server).
  543.  . If you try to SEND a file to the Username: prompt, you get an error "?Login
  544.    required", as expected, but for some reason the server is still in receive
  545.    mode, sending NAKs, rather than back at the Username: prompt.
  546.  . Something is messed up with packet recognition at the Username: prompt
  547.    again.  The first one is not recognized, but subsequent ones are.
  548. To do:
  549.  . Create special pre-login init.
  550.  . Do what wuftp does about incoming. Consider both anonymous and logged-in
  551.    users.  This is probably something for the pre-login init.
  552.  . If user is guest, don't allow OPEN WRITE?
  553.  . No need to send "kermit -x" if IKS (but no harm either).
  554.  . Fix built-in DIR command to show permissions in UNIX, VMS, etc.
  555.  . Make ckxlogin() do if (me_iks) tn_siks(IKS_START) ???  No, this would
  556.    prevent use of the Username: prompt by those who prefer it.
  557.  . Change "kermit_xxxx" to "iks_xxxx" because of uname.h length limits.
  558.  . DISABLE BYE should have no effect when IKS
  559.  . Add runtime "nolocal" variable, turn it on & enforce it for guest logins.
  560.  . Set local environment variables from NEW_ENV?
  561. Added Atlas/Newcom 33600ifxC modem type -- there's evidently a big demand
  562. for this since they are selling for $9.95.  ckuusr.h, ckudia.c, 28 Jul 98.
  563. Added TX_9LATIN symbol for ISO 8859-15, Latin Alphabet 9.  ckcxla.h, 29 Jul 98.
  564. Added FC_9LATIN and FC_CP858 file character-set symbols.  ckuxla.h, 29 Jul 98.
  565. Changed references to "Latin-15" to "Latin-9".  ckouni.[ch], 29 Jul 98.
  566. After hours of research found that the proposed (but not final) registration
  567. number for ISO 8859-15 Latin Alphabet 9 is 203, so now we have a Kermit code
  568. for it.  Reference: DOCUMENT REGISTER JTC1/SC2, Character sets and information
  569. coding, N 3099 - N 3000, Item E3086, 1998-05-01.  Filled in functions and
  570. tables for Latin-9 and CP858.  Seems to work OK, but needs refinement and
  571. more testing.  Meanwhile, hurray, we're "Euro compliant".  ckuxla.c, 29 Jul 98.
  572. Integrated recent changes from Jeff, 1 Aug 98:
  573.  . Conditionalize printf() replacement in UNIX, since it conflicts with
  574.    Linux curses library.  ckcdeb.h.
  575.  . Change TELOPT_IKS definition from 45 to 47, since 45 has already been
  576.    assigned by IANA for something else.
  577.  . Add some missing #ifdef CK_AUTODL.  ckuus3.c...
  578.  . Refine conditions under which tn_iks(IKS_STOP) is called at the
  579.    top of the parse loop.  ckuus5.c.
  580.  . And when returning from CONNECT mode.  ckuus4.c.
  581.  . Refine conditions for which "Enter Client/Server Mode" msg.  ckuus4.c.
  582.  . Make sure we have a Kerberos principal name in AUTH cmd.  ckuus7.c.
  583.  . Show principal name in AUTH Password: prompt.  ckuus7.c.
  584.  . Save username to uidbuf[] in ckxlogin().  ckuus7.c.
  585.  . Various corrections to ckufio.c.
  586.  . Save peer's IP address even if SET TCP REVERSE not ON.  ckcnet.c.
  587.  . Add tn_push() and tn_wait() to solve the following problem: traditional
  588.    Telnet clients are always reading from the socket.  But when C-Kermit is
  589.    at the prompt, it is not reading from the socket.  When the user says
  590.    "set host blah", C-Kermit sends some Telnet negotiations, but never reads
  591.    the responses until the user goes into CONNECT mode or does an INPUT
  592.    command (or, now, starts Kermit protocol).  The new routines allow
  593.    negotiations to go back and forth until all commands that require an answer
  594.    have completed, or a certain amount of time has gone by, whichever comes
  595.    first, AND also saves any plain text that arrived during this period for
  596.    subsequent processing by the first command that tries to read regular data
  597.    from the socket.  This should allow immediate Kerberos or SRP authentication
  598.    upon initial connection, without swallowing the host's messages or prompts,
  599.    and it also takes care of hosts (like VMS) that issue the login prompt
  600.    in the middle of Telnet negotiations.  ckcnet.c.
  601.  . Various changes to authentication negotiation.  ckcnet.c.
  602. Changed IKS banner to show its own hostname.  ckcmai.c, 1 Aug 98.
  603. Added a new entry for ICL DRS6000 (SPARC) with DRS/NX 4.2MP 7MPlus.
  604. makefile, 6 Aug 98.
  605. Integrated Jeff's changes, 10 Aug 98:
  606.  . Add symbols & cmds for Telnet encryption on/off commands: ckuusr.h, ckuus3.c
  607.  . Allow for non-stdio IKS operation: ckuusy.c.
  608.  . Allow for command parsing on encrypted connections: ckucmd.c.
  609.  . Issue warnings or errors for SEND/BYE/FINISH w/TKO but no server: ckuusr.c.
  610.  . Ditto for GET: ckuus6.c.
  611.  . Ditto for REMOTE: ckuus7.c.
  612.  . Make REMOTE LOGIN prompt for missing info.  ckuus7.c
  613.  . Rearranged assorted TKO/IKS items: ckuus4.c.
  614.  . Recognize REQ, etc, as REQUESTED (vs REQUIRED): ckuus3.c.
  615.  . Updated SHOW FEATURES for Authentication/Encryption/etc: ckuus5.c.
  616.  . Added encryption to console i/o: ckutio.c.
  617.  . Adjustments to login process & for encryption: ckcmai.c.
  618.  . Lots of IKS/TKO adjusments: ckcnet.c.
  619. Fixed up REMOTE LOGIN parsing/prompting code to never exit without restoring
  620. prompt and freeing malloc'd storage, etc.  ckuus7.c, 10 Aug 98.
  621. Changes from Gregorie Martin to work around OS-9 C compiler bugs, and added a
  622. missing clause to snddir() so it would work for OS-9.  ckcfns.c, 11 Aug 98.
  623. Also from Gregorie Martin, separate text and binary filename pattern lists
  624. for OS-9.  ckcmai.c, 11 Aug 98.
  625. Added "set modem data-compression", which was missing from the keyword table;
  626. ("compression" was there, but "data-compression" is the phrase used in all the
  627. other commands; left "compression" there but invisible).  ckuus3.c, 11 Aug 98.
  628. A couple minor corrections & changes from Jeff: ckcmai.c, ckcnet.c, 12 Aug 98.
  629. A couple minor changes from Jeff: ckcmai.c, ckcnet.c, 13 Aug 98.
  630. Added a nolocal variable.  When nonzero, setlin() returns an error rather than
  631. opening a connection.  nolocal is set to 1 automatically by -A.  This is a
  632. patch in the true sense, and might need some refinement.  ckcmai.c, ckuus7.c,
  633. 13 Aug 98.
  634. Added invisible (and irreversible) NOLOCAL command: ckuusr.[ch], 13 Aug 98.
  635. Added another invisible and irreversible command: DISABLE ENABLE.  This allows
  636. the sysadmin to disable selected services, and prevent the user from
  637. re-enabling them even when they can get to the prompt (as in the client-side
  638. server arrangement of IKS).  ckuusr.h, ckuus[r56].c, 13 Aug 98.
  639. Fixed server end of REMOTE LOGOUT, which didn't work at all.  Various other
  640. combinations didn't work either, from among login required / not required;
  641. logged in already / not logged in; logging in / logging out.  All combinations
  642. work sensibly now.  Note: Logging out does not break the connection, so a
  643. subsequent login is allowed on the same connection.  This might change.
  644. ckcpro.w, 13 Aug 98.
  645. Added code to prevent guests from using SET FILE COLLISION APPEND or RENAME.
  646. However, they can still use OVERWRITE and UPDATE -- this might change.
  647. ckuus7.c, 13 Aug 98.
  648. Changed wtmp record for IKS to say "iks_xxxx" rather than "kermit_xxxx" to
  649. stay within 8 chars, which is the limit in SunOS and probably many other
  650. platforms too.  ckufio.c, 13 Aug 98.
  651. Added code to zprint() and zmail() to fail immediately if called by guest.
  652. ckutio.c, 13 Aug 98.
  653. Ditto at a higher level: after user logs in anonymously, do an implicit
  654. DISABLE PRINT and DISABLE MAIL.  ckcmai.c, ckcpro.c, 13 Aug 98.
  655. Don't allow ENABLE MAIL or ENABLE PRINT if user is anonymous.  ckuus6.c,
  656. 13 Aug 98.
  657. And as a failsafe, in case they somehow re-enabled them, have the protocol
  658. module disable them again whenever it is entered.  ckcpro.c, 13 Aug 98.
  659. Fixed getyesno() (which is called whenever we want to print a question and
  660. parse a yes/no answer, e.g. "OK to close?") to not put the answer in the
  661. recall buffer.  ckuus3.c, 13 Aug 98.
  662. Added XXRxxx symbols for top-level R-commands equivalent to each REMOTE
  663. command: RCD, RPWD, RDIR, RWHO, etc.  But not RLOGIN because that already
  664. means something else.  ckuusr.h, 13 Aug 98.
  665. Made REMOTE { L, LO, LOG } be synonyms for REMOTE LOGIN.  ckuusr.c, 13 Aug 98.
  666. Moved REMOTE LOGIN parsing code to its own routine, plogin().  ckuus7.c,
  667. 13 Aug 98.
  668. The LOGIN command that we added a few weeks ago can not possibly be of any
  669. use, so I changed it to call plogin().  So LOGIN is now a synonym for REMOTE
  670. LOGIN.  And I added a LOGOUT command that is a synonym for REMOTE LOGOUT.
  671. ckuusr.c, 13 Aug 98.
  672. Added a few R commands: RASG/RASSIGN, RCD/RCWD, RCOPY, RDELETE.  These simply
  673. chain to the corresponding REMOTE commands.  They work fine.  ckuusr.c,
  674. 13 Aug 98.
  675. Added the rest: RDIR, REXIT, RHELP, RHOST, RKERMIT, RPWD, RRENAME, RREMDIR,
  676. RSET, RSPACE, RTYPE, and RWHO.  ckuusr.c, 13 Aug 98.
  677. Merged first stage of Jeff's changes to reorganize Telnet protocol support.
  678. All Telnet symbol & struct definitions moved to new ckctel.h.  All IKS_*
  679. and *_IKS symbols changed to KERMIT_* and *_KERMIT.  Many modules, 14 Aug 98.
  680. Added ckctel.h dependencies to UNIX makefile.  14 Aug 98.
  681. Changed C-Kermit version number from 6.1 to 7.0 and test level from Beta.06
  682. back to Alpha.01.  makefile, ckcmai.c, 14 Aug 98.
  683. Fixed command parser to not respond to recall keys when on_recall == 0,
  684. as it is (e.g.) in getyesno().  ckucmd.c, 14 Aug 98.
  685. Chasing down "Receive window full" problems...  First, I found a scenario that
  686. would always create it: start server, go back to client, and tell client to
  687. "remote login blah" (when login not required), "remote logout", "remote cd
  688. invalid-directory", "remote cd valid-directory", "remote dir".  Debug logs
  689. showed some mighty strange paths thru the code...  First discovery: the SERVE
  690. macro definition contains more than one statement, but did not enclose the
  691. statements in braces.  Therefore, subsequent constructions like "if (blah)
  692. xxx; else SERVE;" did not work as intended.  Added braces around definitions
  693. of SERVE and RESUME.  ckcpro.w, 14 Aug 98.
  694. But this did not make the problem go away.  Next discovery: sometimes the
  695. sequence above would result in an error "It's a directory", which is found
  696. only in the REMOTE DELETE code.  How did we get there???  Well, sending the
  697. "Receive window full" error packet set the packet type to E, so the next call
  698. to input() returned 'E'.  But the protocol machine was still in "generic"
  699. state, and "<generic>E" is REMOTE DELETE.  So I had the errpkt() routine
  700. reset the protocol state to 0.  So no more "falling" into the REMOTE DELETE
  701. code.  ckcfn2.c, 14 Aug 98.
  702. Next...  Server sends a "Receive window full" error packet, but it is not
  703. displayed by the client.  Why?  Because C-Kermit always ignores E packets that
  704. arrive in response to an I packet, to allow for the possibility that the server
  705. does not understand I packets.  We can't do anything about this, but it has
  706. probably been hiding the "Receive window full" problem enough that we did not
  707. realize how often it was really happening.
  708. So why is it happening?  Logs show that we are not always calling tinit()
  709. (transaction initialization) after sending a short-form reply to a server
  710. command, or an ACK to an I packet.  I-packet first...  After the code to ACK
  711. the I packet, I replaced the call to pktinit(), which simply reset winlo and
  712. pktnum to 0, with tinit(), which resets everything.  Ten minutes of testing
  713. now shows that (a) this does no harm (and in any case it is proper since the
  714. I/Y exchange is, by definition, a complete protocol transaction), and (b)
  715. seems to isolate the problem to whatever transaction follows a successful
  716. REMOTE CD.  Finally...  the problem with REMOTE CD turned out to be the code I
  717. added on July 21st to send back the contents of a .readme file, if any -- it
  718. neglected to handle the case where there was not a .readme.  Fixed in
  719. ckcpro.w, 14 Aug 98.
  720. I also fixed a potential problem on the server end of REMOTE PWD, in which
  721. it would fail to send a response if the directory name was too long.
  722. ckcpro.w, 14 Aug 98.
  723. From Jeff:
  724. Date: Sat, 15 Aug 98 0:33:04 EDT
  725. From: Jeffrey Altman <jaltman@watsun.cc.columbia.edu>
  726. To: fdc@watsun.cc.columbia.edu
  727. Subject: new files
  728. just about every file has been touched.  The new telnet code is
  729. operational but the initialization stuff has barely been addressed.
  730. Basicly what I have done is implemented all of the major changes to
  731. tn_doop() and its related support functions to use the new model.
  732. I have replaced all variables such as Me_binary, U_binary, ... with
  733. calls to the new TELOPT macros.  I did not make these changes to
  734. VMS specific files such as console and terminal i/o.
  735. me_binary becomes TELOPT_ME(TELOPT_BINARY)
  736. u_binary becomes TELOPT_U(TELOPT_BINARY)
  737. etc.  These macros may be used on both the left and right sides of an
  738. assignment.  What I have not doone is address any of the issues we
  739. spoke about regarding initialization of the ME and U modes.  There is
  740. a new function tn_set_modes() which is called in ckcmai.c that is used
  741. to set the initial defaults.  tn_ini() needs to be modified to read
  742. user defaults for client and server modes.  These fileds of the
  743. structures are not yet defined.
  744. For compilation purposes the tn_binary, tn_echo, tn_auth,
  745. ... variables are still declared in ckcnet.c.  These are needed so the
  746. command parser will compile but the variables are not used at all
  747. anymore in ckcnet.c.  So don't try to use them to control telnet
  748. option activation.  They won't work.  I will address these issues
  749. either tomorrow night or Sunday.
  750. Something I noticed is that server mode does not exit anymore when
  751. started by a terminal autodownload "kermit -Iig ..."  This appears to
  752. be a side effect of the changes you made this afternoon.  However, I
  753. have not spent any time to try and track it down.
  754. The changes to ckcnet.c reduced the code by over 400 lines and 100K in
  755. exe size.
  756. (end quote)
  757. IBM added the Euro symbol to a vacant position in CP857; updated the
  758. corresponding tables in ckouni.c.  15 Aug 98.
  759. Incorporated the network code changes from Jeff's message above.  Most
  760. modules, 17 Aug 98.
  761. Made DISABLE apply not only to REMOTE commands sent to the server, but also,
  762. when C-Kermit is an Internet Server, to the corresponding commands given at
  763. the prompt.  For example, if C-Kermit has been told to DISABLE RENAME, then
  764. it won't execute REMOTE RENAME commands in server mode, nor RENAME commands
  765. from its prompt.  ckuusr.c, 17 Aug 98.
  766. Made DISABLE CD when inserver also SET { SEND, RECEIVE } PATHNAMES OFF.
  767. ckuus6.c, 17 Aug 98.
  768. Made wtmp entry always use at least 4 digits for the hex pid.  ckufio.c,
  769. 17 Aug 98.
  770. Discovered that "set proto kermit {} {} {}" did not undo the "autosever"
  771. command string.  This uncovered a rat's nest resulting from the fact that this
  772. string is not part of the regular protocol info struct, so I redefined the
  773. struct to include it and removed the special case from all modules that knew
  774. about it.  ckcker.h, ckcmai.c, ckcpro.w, ckuus3.c, 18 Aug 98.
  775. The check in cmdlin() for command-line options not valid with -A was
  776. preventing "kermit" commands, when given at the prompt (e.g. the "kermit -r"
  777. autoupload string from a client), from working.  Fixed in ckuusy.c, 18 Aug 98.
  778. Don't send auto-blah strings ("kermit -r", "kermit -x", etc) if we know the
  779. other Kermit is a server.  ckcpro.w, 18 Aug 98.
  780. Set flow to NONE (except in VMS) for IKS.  ckcmai.c, 18 Aug 98.
  781. Jeff's changes & fixes: ckcnet.h, ckcpro.w, ckcmai.c, ckutio.c, ckcnet.c,
  782. 19 Aug 98.
  783. Make ttol() and conol()/conoll() copy their arg before encrypting (ttol()
  784. already did) in case they are called with a literal string.  Buffers are
  785. malloc'd only if/when needed; copy is done only when encrypting.  ckutio.c,
  786. 19 Aug 98.
  787. Added partial ttpush() support to ckutio.c within #ifdef TTLEBUF..#endif.
  788. More pieces added by Jeff.  ckutio.c, ckcnet.c, 19 Aug 98.
  789. Fixed spurious "?Packet log wasn't open" message when CLOSE command given
  790. with no operand.  ckuusr.c, 19 Aug 98.
  791. Changed CLOSE command not to ask "OK to close?".  Obviously the user knows a
  792. connection was open or she wouldn't be trying to close it.  ckuusr.h,
  793. ckuus[r7].c, 19 Aug 98.
  794. REMOTE commands that only result in sending text to the client's screen can
  795. have no useful effect when issued from a remote-mode client when the result is
  796. not redirected.  These commands include DIR, TYPE, WHO, etc, but not SET,
  797. ASSIGN, QUERY, etc.  C-Kermit now refuses to execute REMOTE commands that
  798. can have no useful effect.  ckuus7.c, 19 Aug 98.
  799. Due to confusion between console and communications buffers, made the
  800. following conxxx() functions route to the corresponding ttxxx() functions when
  801. (inserver && !local): conoc(), conxo(), conol(), conola(), conoll(), conchk(),
  802. coninc(), congks().  ckutio.c, 20 Aug 98.
  803. Adapted REMOTE HELP text to IKS.  ckcfns.c, 20 Aug 98.
  804. When REMOTE LOGIN prompts for user ID & password, don't put them in the
  805. command recall buffer.  ckuus7.c, 20 Aug 98.
  806. Got rid of LOGIN command, and made LOGOUT act locally rather than being a
  807. synonym for REMOTE LOGOUT.  So:  REMOTE LOGIN must be used to log in from a
  808. client to a server; REMOTE LOGOUT is used to log a client out from a server;
  809. and LOGOUT is used to log out the server from its prompt.  ckuusr.c, 20 Aug 98.
  810. Added HELP LOGOUT and updated HELP REMOTE.  ckuus2.c, 20 Aug 98.
  811. Removed #include "ckucmd.h" from ckcmai.c and ckutio.c.  Added the struct
  812. keytab definition to ckcdeb.h, so all modules can use it without reference to
  813. ckucmd.h.  20 Aug 98.
  814. Got rid of getchar() calls from ckucmd.c, since they were not going thru the
  815. myread buffering, and therefore were wrecking decryption.  ckucmd.c, 20 Aug 98.
  816. Fixes from Jeff: ckctel.h, ckucmd.c, ckutio.c, ckcmai.c, ckcnet.c, 21 Aug 98.
  817. Fixed a typo in tn_ini() that prevented client from sending initial Telnet
  818. negotiations on port 1649.  ckcnet.c, 21 Aug 98.
  819. Added an "iksd" personality, which simply sets inserver to 1 automatically
  820. when the binary is called "iksd".  ckcker.h, ckcmai.c, ckuus4.c, 21 Aug 98.
  821. Added extended-format command-line args for iksd:
  822.  --anonymous:{on,off}
  823.  --syslog:{on,off}
  824.  --permissions:<octal-value> (like wuftpd -- permissions, not umask)
  825.  --wtmp:{on,off}
  826. These are parsed in prescan().  Currently, *all* extended-format options are
  827. parsed in prescan.  Later we'll need a way to separate those that are done
  828. in prescan from those that are done after the init file.  Note: {on,off}
  829. also has synonyms {yes,no} and {true,false}.  ckuusy.c, ckuus4.c, 21 Aug 98.
  830. From Jeff: fix a char declaration to be unsigned char to prevent sign
  831. extension, which was wrecking encryption: ckutio.c.  Prevent encryption from
  832. being negotiated if Telnet authentication failed: ckcnet.c.  Make all
  833. file i/o routines go through con/tt routines when the file is really the
  834. terminal, since the con/tt routines now take care of en/decryption, and
  835. bypassing them destroys the encryption stream: ckufio.c. 22 Aug 98.
  836. Updated the SunOS IKS makefile entry and renamed it to sunos41giks.
  837. This entry does not define CK_CURSES or link with the curses library.
  838. makefile, 22 Aug 98.
  839. Disable file-transfer display for IKS in such a way that tgetent() is never
  840. called by IKS, even if it is compiled in and even if the fullscreen file
  841. transfer display would normally be used.  ckuusx.c, 22 Aug 98.
  842. Modified Jeff's changes to ckufio.c.  The idea was to catch the case where
  843. the client was printing stuff on its "screen" coming back from the server in
  844. response to a REMOTE command.  But in this case, the screen his hidden from
  845. the user anyway, so there is no point going through all the overhead of
  846. encrypting, then printing it -- now these routines simply discard the output
  847. but act as if they had printed it (in terms of return codes, global variables,
  848. etc).  Left Jeff's code in the source file, commented out. ckufio.c, 22 Aug 98.
  849. Defined a new keyword flag, CM_PRE, to be used with long-form command-line
  850. options.  If set, the option is to handled by prescan(), i.e. prior to init
  851. file processing; otherwise it is handled after the init file along with other
  852. command-line options.  ckucmd.h, ckuus[4y].c, 22 Aug 98.
  853. Rules for long-form command-line options are:
  854.  1. All long-form options must begin with "--" (two hyphens) or "-+".  If the
  855.     option begins with "--" it is executed before or after the init file,
  856.     according to its internal keyword flags.  If it begins with "-+", it is
  857.     executed before the init file, regardless of the flag bits.  There is no
  858.     way to force an argument to be executed after the init file if it has the
  859.     CM_PRE bit set.  (The "+" business will not necessarily be advertised...)
  860.  2. No spaces are allowed in the keyword.
  861.  3. If an operand contains spaces, it (or the entire option) must be quoted
  862.     according to the rules of the shell from which Kermit is invoked.
  863.  4. Case doesn't matter in the option keyword (unlike with regular
  864.     single-letter options).
  865.  5. If an operand is required, it must be included.  If no operand is
  866.     required, no operand must be included.
  867.  6. The operand follows the keyword, separated by a colon (:) or equal
  868.     sign (=).  There are no spaces between the separator and the keyword
  869.     or operand.
  870.  7. Long-form option names may be abbreviated according to the same rules as
  871.     interactive keywords.
  872.  8. On/Off operands can be On, Off, Yes, No, True, or False.
  873.  9. Long-form options are available only when the interactive command parser
  874.     is built-in (i.e. not NOICP).
  875. Added code to actually use the new command-line options:
  876.  --permissions are applied as given to anonymously uploaded files.
  877.  --anonymous:off disables anonymous logins.
  878.  --wtmp:off disables wtmp.
  879. syslogging still isn't being done, so no effect there.  ckufio.c, 22 Aug 98.
  880. Discovered that permission-setting code works only if ATTRIBUTES ON, so
  881. anybody could defeat it by uploading files with SET ATTRIBUTES OFF.
  882. Rearranged the code to plug this loophole.  ckufio.c, 22 Aug 98.
  883. After all this, it seems that all sorts of trouble ensues from prescan()
  884. being called twice; for example, "kermit commandfilename" no longer works.
  885. I have no idea why prescan() is called twice, so I commented out the second
  886. call, now all seems well.  ckcmai.c, 22 Aug 98.
  887. Fleshed out the command-line options some more.  Now they are:
  888.   --anonymous    on/off      anonymous login allowed
  889.   -+cdfile       filename    CD message filename
  890.   -+cdmessage    on/off      CD messages on/off
  891.   -+cdmsg        on/off      synonym for cdmessage
  892.   --logsyslog    on/off      syslog logging on/off
  893.   --logwtmp      on/off      wtmp logging on/off
  894.   --permissions  octalnum    permissions for files uploaded anonymously
  895.   --perms        octalnum    synonym for permissions
  896.   --wtmpfile     filename    pathname of wtmp logfile
  897. Those shown with "-+" can be given by ordinary users.  The CD message
  898. items correspond to SET SERVER CD-MESSAGE { ON, OFF, FILE <name> }.
  899. These all work except for syslog.  ckuusy.c, 22 Aug 98.
  900. Minor corrections from Jeff to yesterday's changes: ckuusy.c, ckutio.c,
  901. 23 Aug 98.
  902. Added the appropriate #ifndef NOICP..#endif's to long-form command-line
  903. option code.  ckuusy.c, 23 Aug 98.
  904. Finished the half-done IKS-related #ifdef section in ckcdeb.h, 23 Aug 98.
  905. Ensured that /pub/ftp/.kermrc is TAKEn as init file when user logs in to
  906. IKS anonymously.  ckuus5.c, 23 Aug 98.
  907. Added --initfile:<path> to allow sysadmin to change the default init file
  908. for anonymous users.  ckuusy.c, ckuus5.c, 23 Aug 98.
  909. Added MKDIR and RMDIR to list of functions automatically disabled for
  910. anonymous users (which previously included only MAIL and PRINT), since leaving
  911. them enabled clashed with wuftpd behavior (e.g. ftpd could not create a
  912. directory in kermit/incoming, but iksd could).  It is still possible for the
  913. sysadmin to enable directory creation (and removal too).  ckcmai.c, 23 Aug 98.
  914. Another loophole: OPEN WRITE / WRITE / CLOSE WRITE bypassed the
  915. --permission:xxx value.  In fact, there are lots of file creation methods that
  916. did this: logs (even though we have disabled the LOG command), TRANSLATE, and
  917. REMOTE BLAH > file.  And who knows what else.  So I moved the chmod() code
  918. from zstime(), which is called only when receiving files with Kermit protocol,
  919. to zopeno(), which is called whenever *any* file is to be created.  ckufio.c,
  920. 23 Aug 98.
  921. Don't let guests SET FILE COLLISION OVERWRITE or UPDATE (they already could
  922. not use RENAME or UPDATE).  This prevents guests from overwriting or changing
  923. or destroying existing files.  ckuus7.c, 23 Aug 98.
  924. Minor corrections to yesterday's work from Jeff, plus beginning of SSL
  925. support.  ckuusy.c, ckcnet.c, etc, 24 Aug 98.
  926. If NOICP defined, then -A implies -x.  ckuusy.c, 24 Aug 98.
  927. When client sends REMOTE LOGOUT and gets the ACK, it now closes the connection
  928. (same as it already did with BYE).  ckuus7.c, 24 Aug 98.
  929. Added openlog() call for IKSD, specifying tag of "iksd" and LOG_PID, and going
  930. to the regular daemon log.  Now syslogging works for regular logins, but the
  931. anonymous ones doen't seem to be making it into the log.  To be continued.
  932. ckufio.c, 24 Aug 98.
  933. Verified that sending huge strings to the IKS (e.g. to the Username: or
  934. Password: prompt) does not break it.  26 Aug 98.
  935. Merged Jeff's recent changes, mostly for SSL / TLS.  Many modules, 28 Aug 98.
  936. Made v(line) return ckgetpeer() value in IKS.  ckuus4.c, 28 Aug 98.
  937. Fixed v(nday) not to depend on English day names.  ckuus4.c, 28 Aug 98.
  938. Added --userfile:filename to command line for IKS: filename of forbidden
  939. user file.  Fixed checkuser() routine, which was not working before.
  940. ckuusy.c, ckufio.c, 28 Aug 98.
  941. Added "ok" to list of valid extended option on/off value synonyms.
  942. ckuusy.c, 28 Aug 98.
  943. More SSL / TLS changes from Jeff, many modules, 29 Aug 98.
  944. Changes to extended command-line options:
  945.   --logwtmp changed to --wtmplog (on/off)
  946.   --logsyslog:on/off removed.
  947.   --syslog:<number> added, where <number> = level of logging.
  948. So far this is parse-only, no action.  ckcdeb.h, ckuusy.c, ckufio.c, 29 Aug 98.
  949. Added logging for commands (level 4).  At first I logged all commands but that
  950. was WAY too much.  Now only interactive commands (not TAKE files or macros).
  951. Also, cleaned up login/logout entries.  ckufio.c, ckucmd.c, ckuusx.c,
  952. 29 Aug 98.
  953. Discovered that "implied partial dial", which occurs when you use the DIAL
  954. command but terminate the phone number with a semicolon, CONNECTs
  955. automatically when done at top level.  Which is very confusing when you're
  956. dialing a numeric pager.  Fixed in ckudia.c, 30 Aug 98.
  957. Automatically DISABLE ENABLE for anonymous users.  ckcmai.c, 30 Aug 98.
  958. Added missing "extern" to telopt_states[] declaration in ckctel.h, 30 Aug 98.
  959. Spent many hours trying to figure out why syslogging does not work in iksd
  960. when user is logged in anonymously.  It turns out that in SunOS, chroot(),
  961. once called, totally breaks syslog() -- i.e. syslog() will never write another
  962. entry after chroot() is called.  It makes no difference whether openlog() is
  963. called before or after chroot(), or not at all.  So is this a SunOS
  964. peculiarity?  To test, went to build on Solaris (for the first time in months)
  965. and of course had all sorts of trouble compiling.  Once it compiled, anonymous
  966. logins did not work because there is no /pub/ftp directory.  So I temporarily
  967. dummied up a different root for testing, and then all worked OK.  So it seems
  968. to be a SunOS peculariarity?  There seems to be nothing I can do about it.
  969. Sent off a query to the sys folks.  30 Aug 98.
  970. Found that struct utmp member ut_host is not portable, so started building
  971. a pile of #ifdefs for when to include it.  This will be an ongoing project.
  972. ckufio.c, 30 Aug 98.
  973. Added --root:xxx so an alternative root for anonymous users can be supplied
  974. at runtime.  ckuus[5y].c, ckufio.c, 30 Aug 98.
  975. Started adding syslog() code for file creation / deletion / modification.
  976. File creation and appending in zopeno().  File deleting in zdelet().
  977. File renaming in zrename().  File copying in zcopy().  ckufio.c, 2 Sep 98.
  978. Fixed mutually reinforcing bugs in ttpeek() (ckutio.c) and the code in
  979. ckucns.c that calls it, that stopped CONNECT mode dead; ttpeek() wasn't
  980. taking the new local-echo buffer into account, so CONNECT would think there
  981. was nothing to read, when in fact some stuff was sitting in the new buffer,
  982. and so would block on a network read when in fact the network was waiting for
  983. a reply.  Fixed 3 Sep 98.
  984. Fixes from Jeff for a Telnet negotiation problem in ckcnet.c and for an "=="
  985. that should have been an "=" in ckcfns.c (affecting the EOF/Ctrl-Z code).
  986. Also, revision of the C1 control symbols in ckcasc.h to avoid conflicts with
  987. new Microsoft symbols.  4 Sep 98.
  988. Enclosed reference to <asm/termios.h> for Linux-on-Alpha in #ifndef __GLIBC__
  989. to avoid yet another conflict.  ckutio.c, 4 Sep 98.
  990. Microsoft added upper- and lowercase Z caron to CP1252.  I added these to the
  991. CP1252/Unicode translations, and also corrected a typo in the translation of
  992. the 'oe' character from Unicode to CP1252.  ckuouni.c, 4 Sep 98.
  993. Changes from Jeff.  Protect SET FILE DISPLAY FULL tgetent() from trapping if
  994. trmbuf not allocated: ckuus[7x].c; server-side terminal type negotiation:
  995. ckcnet.c, 5 Sep 98.
  996. Fixed a bug that limited the LOCAL command to only 10 variables, even though
  997. the advertised maximum was 64.  dolocal(), ckuus5.c, 5 Sep 98.
  998. Added a check for sequence number out of range to ttinl().  See comments in
  999. source code for a detailed explanation.  ckutio.c, 5 Sep 98.
  1000. VMS cdate[] array declaration, used for setting file date,  needed to be 24,
  1001. not 23.  ckvfio.c, 5 Sep 98.
  1002. For DEC C (VMS or Digital UNIX), when _POSIX_C_SOURCE is not defined, #define
  1003. it with a value, such as 1, rather than without one, since its value is used
  1004. in comparisons in DEC C header files like unistd.h.  ckcdeb.h, 5 Sep 98.
  1005. Various mysterious problems with SEND /AS-NAME: were traced to the keywords
  1006. in sndtab[] being out of alphabetical order.  Fixed in ckuusr.c, 5 Sep 98.
  1007. However, some additional problems remained, in which certain switches were not
  1008. parsed successfully if COMMAND QUOTING was OFF and they were entered without
  1009. completion (Tab or Esc).  This was due to failure to set the field length in
  1010. one of the paths through cmkey2().  Fixed in ckucmd.c, 5 Sep 98.
  1011. Changes from Jeff to start supporting an overhauled way of setting/showing
  1012. Telnet options.  Many modules, 8 Sep 98.
  1013. Added "OE compliance" -- Latin-9 conversion for DEC MCS and NeXT, which both
  1014. contain OE characters.  ckuxla.c, 8 Sep 98.  (I could do the same for DG, but
  1015. I doubt anyone would notice.)  (Ditto for Macintosh.)
  1016. Changed protocol machine to take connection loss in response to a BYE command
  1017. (while waiting for the ACK) as success rather than failure. ckcpro.w, 8 Sep 98.
  1018. Preliminary code for dynamic Telnet-wait timer from Jeff.  ckcnet.c, 9 Sep 98.
  1019. Removed "if (srvbuf)" from setlin() routine, since srvbuf is an array, not a
  1020. pointer, and this crashes the ICL compiler.  ckuus7.c, 9 Sep 98.
  1021. Added GETKEYCODE <var> <prompt> for K95.  Lets user get the keycode of any
  1022. key event (F-key, Alt-combination, etc) into a variable.  Also changed GETC
  1023. to put console in raw mode to read the one character, so any character at all
  1024. can be typed, even Ctrl-C, after which we go back to CBREAK mode.  Needs
  1025. testing.  ckuusr.[ch], ckuus6.c, 9 Sep 98.
  1026. Changed the way the MODEM ESCAPE-CHARACTER is specified and used:
  1027.  < 0 means the escape mechanism is disabled.
  1028.  = 0 means to use (restore) the default value from the modem database.
  1029.  > 0 and < 128 is a literal value to be used instead of the default one.
  1030.  > 127 means the escape mechanism is disabled.
  1031. This affects "modem hangup".  When the escape mechanism is disabled, but SET
  1032. MODEM HANGUP-METHOD is MODEM-COMMAND, it sends the hangup command immediately,
  1033. without the <pause>+++<pause> business first.  This is useful (for example)
  1034. when sending lots of numeric pages, a process in which we never go online, and
  1035. so never need to escape back.  Eliminating the unnecessary pauses and escape
  1036. sequence allows a lot more pages to be sent per unit time.  Needs testing.
  1037. ckudia.c, 9 Sep 98.
  1038. In order to test modem, dial, and serial port items, tried building on HP-UX
  1039. 10.20 for the first time in months.  Compiled OK (!) but failed to find
  1040. sete[ug]id() at link time.  Made it use setre[ug]id() instead.  Obviously this
  1041. area will need a lot more attention since we don't want to mess up when
  1042. logging in IKS users...  Needs testing.  ckufio.c, 9 Sep 98.
  1043. Changes from Jeff to show a spinner during telnet negotiation wait, to reorder
  1044. the terminal-type negotiation list, and to check for failure of tn_ini(), e.g.
  1045. when connection rejected by TCP Wrappers.  ckuusr.[ch], ckuus7.c, ckcnet.c,
  1046. 10 Sep 98.
  1047. Some #ifdefs to allow compilation on ICL DRS/NX, plus adjustments to the ICL
  1048. makefile entries.  ckcmai.c, makefile, 10 Sep 98.
  1049. Somehow a DECC Alpha VMS build is picking up both the bzero/bcopy macro
  1050. definitions AND the prototypes for bzero() and bcopy().  Added #ifdefs to
  1051. prevent this.  ckcnet.h, 10 Sep 98.
  1052. Added *.pdf to default binary-patterns list.  ckcmai.c, 11 Sep 98.
  1053. Changed the main Linux build to #define CK_NCURSES, which in turn #include's
  1054. <ncurses.h> rather than <curses.h>, and links with libncurses rather than
  1055. libcurses, since newer Linux systems seem to lack symlinks from curses to
  1056. ncurses, and added a "linuxc" entry that still references curses.  However,
  1057. neither curses.h nor ncurses.h can be found on the Red Hat 5.1 system I have
  1058. access to.  makefile, ckcdeb.h, ckuusx.c, 12 Sep 98.
  1059. Building on Linux 1.2 (some old Red Hat version, not sure of the number),
  1060. complained of a syntax error in <syslog.h>:
  1061.   /usr/include/sys/syslog.h:189: unrecognized format specifier for `'
  1062. Building again with -DNOSYSLOG moves the problem to ncurses.h.  The problem
  1063. is that both of these header files refer to "printf" in macro definitions, but
  1064. (in UNIX) we have defined printf to be a macro that expands to "ckxprintf".
  1065. Thus, before including any headers that refer to printf, we have to #undef
  1066. printf, and then redefine it afterwards.  YUK!!!  ckucmd.c, ckuusx.c,
  1067. ckufio.c, 12 Sep 98.  NOTE: In the future, we should add a new header file,
  1068. which is to be included in each module AFTER ALL OTHER header files, to undo
  1069. whatever the earlier headers might have done, and to define macros that
  1070. substitute homegrown routines for library routines or system calls, so we
  1071. don't have to remember to insert little undef...redef clauses around #includes
  1072. all over the place.
  1073. Back to Linux 2.0.34...  The logwtmp() declaration blew up the compiler,
  1074. needed ANSIfication.  ckufio.c, 12 Sep 98.
  1075. With the fixes above, and using a new "linuxnc" (no-curses) makefile entry,
  1076. we still fail in the link step because the crypt() routine can't be
  1077. found.  Digging through the libraries shows it has moved from libc to
  1078. libcrypt.  Swell, so we need yet another makefile entry, linuxlcnc ("link
  1079. with libcrypt, no curses").  So now it builds on Red Hat 5.1, kernel 2.0.34,
  1080. but without curses support.  makefile, 12 Sep 98.
  1081. Noticed that the code contained various #ifdef LINUX constructions, but
  1082. LINUX was never defined anywhere.  Added a clause to ckcdeb.h to define
  1083. LINUX if it was not defined but __linux__ was defined, and also added
  1084. -DLINUX to all Linux entries.  makefile, ckcdeb.h, 12 Sep 98.
  1085. Defined -DDYNAMIC by default for all UNIX builds, and removed it from all
  1086. makefile entries that included it.  ckcdeb.h, makefile, 12 Sep 98.
  1087. Found that Linux keeps its wtmp file in a different place than other UNIXes.
  1088. Adjusted via #ifdefs.  ckufio.c, 12 Sep 98.
  1089. Found that UNIX ttinl() still had one or two return points where it failed to
  1090. turn off its alarm(), due to recent changes, and of course whenever that
  1091. happened, the alarm would eventually go off, crashing the program.  Fixed in
  1092. ckutio.c, 12 Sep 98.
  1093. Put Telnet-wait "spinner" display code in #ifdef CKSPINNER, and left it
  1094. undef'd, put back the regular dots.  The spinner is not good for speech
  1095. devices, scripts, etc, and is unlike anything else in C-Kermit's user
  1096. interface, and also wouldn't look right when viewed through any terminal or
  1097. emulator using an NRC.  ckcnet.c, 12 Sep 98.
  1098. Defined KANJI by default if NOCSETS not defined and NOKANJI not defined; same
  1099. as for all other character-set families (Latin-1, Latin-2, Greek, Hebrew,
  1100. Cyrillic): ckcxla.h.  Removed all explicit #defines for KANJI from ckcdeb.h
  1101. and makefile.  13 Sep 98.
  1102. Made some adjustments to the ex-spinner code so it doesn't spurt out a burst
  1103. of dots, but only prints one every second (i.e. when there is a timeout), and
  1104. labeled this section "Negotiations:" and put "(OK)" at end, like in the DNS
  1105. section.  Also, made this section disablable via SET QUIET ON, like the other
  1106. sections.  ckcnet.c, 13 Sep 98
  1107. In an effort to handle the /dev/modem problem in Linux, and the
  1108. lockfile-versus-symlink problem in general, added code to ttlock() to see if
  1109. device name is a symlink.  If so, islink is set to nonzero and linkto[] (yet
  1110. another static buffer) contains the name pointed to by the symlink.  Using
  1111. stat() and then S_ISLNK() does not work on some platforms, so instead we
  1112. always just call readlink(), which fails if it is not a link, but returns the
  1113. file's real name if it is.  If device name is a link we create a second
  1114. lockfile, which is a link to the first one, but based on the device's real
  1115. name.  The second lockfile is removed in ttunlk().  This code works everywhere
  1116. but in systems that use ttlock() (currently only AIX) and HP-UX, which has its
  1117. own dual-locking system.  All the symlink/readlink related code is #ifdef
  1118. CKSYMLINK, so it can be disabled on platforms that don't have readlink(), or
  1119. where it doesn't work.  ckutio.c, 13 Sep 98.
  1120. After yet another prolonged discussion of lockfile names for SCO...  The
  1121. concensus of the experts is that the device name should be lowercased for
  1122. creating the lockfile, and this is how it was already.  However, Dmitri
  1123. Zuryanovich reports from Russia that this is not consistent with mgetty.
  1124. Example: "set line /dev/tty1A" creates LCK..tty1a, and while cu and friends
  1125. follow the same convention, mgetty creates and checks for LCK..tty1A.  So,
  1126. piggybacking onto the previous item, if the given device name is not a
  1127. symlink, I pretend that the original name is a symlink.  Then, after
  1128. lowercasing the name, if the result is different from the original, I keep the
  1129. original name as the basis for the second lockfile, otherwise I create only
  1130. one lockfile as before.  If a second lockfile is created, it is deleted
  1131. automatically at the same time the first one is.  The possible pitfall here,
  1132. of course, is that there might actually be a distinct device with
  1133. corresponding lowercase name.  But since that was the name we always used for
  1134. the lockfile anyway, this change can't possibly do any additional harm.
  1135. ttlock(), ckutio.c, 13 Sep 98.
  1136. Changed "show comm" to report any secondary lockfile.  ckuus4.c, 13 Sep 98.
  1137. Discovered that when SET MODEM HANGUP-METHOD is MODEM-COMMAND, that if a
  1138. HANGUP command is given before a DIAL command was given, it doesn't use the
  1139. modem hangup command.  Fixed in mdmhup(), ckudia.c, 13 Sep 98.
  1140. Discovered that MODEM HANGUP-METHOD is not displayed by SHOW MODEM.  Fixed in
  1141. ckuus3.c, 13 Sep 98.
  1142. Verified that SET MODEM SPEED-MATCHING works correctly.  The confusion comes
  1143. when users SET MODEM TYPE HAYES (2400 or 1200) to dial a more modern type of
  1144. modem -- Kermit automatically SETs MODEM SPEED-MATCHING ON, as it must for any
  1145. kind of modem that does not do speed buffering.  Let's keep this in mind when
  1146. explaining how to write alpha pager scripts.
  1147. Increased character spacing for Rolm DCM dialing from 5 msec to 50, since
  1148. some failures had been observed.  Seems to work fine for both Rolm DCM and
  1149. 600-Series AT-dialing.  ckudia.c, 13 Sep 98.
  1150. Found that starting a phone number with "=", which is supposed to indicate
  1151. a literal string to be dialed, was no longer stripping off the "=" before
  1152. dialing the string.  Fixed in dodial(), ckuus6.c, 13 Sep 98.
  1153. From Jeff: Enabled CKSPINNER for K95 and adjusted spinner-vs-dots code.
  1154. ckcdeb.h, ckcnet.c, 14 Sep 98.
  1155. The SET LINE / SET HOST command was printing an annoying blank line.  Fixed in
  1156. gtword() by disabling echo not only if reading from chars already in command
  1157. buf, but also if reading a pushc'd character.  ckucmd.c, 14 Sep 98.
  1158. Fixed a reference to a null pointer in mdmhup(), from Jeff.  ckudia.c,
  1159. 14 Sep 98.
  1160. Fixed dohexdump() prototypes to avoid ANSI complaints.  ckcdeb.h, 14 Sep 98.
  1161. Added assorted casts in tn_doop() to shut up ANSI complaints.  ckcnet.c,
  1162. 14 Sep 98.
  1163. Verified that IKSD writes just fine to syslog() on Solaris 5.1, even after
  1164. chroot().  So the problem with syslog() entries disappearing into the void
  1165. after chroot() is not universal, and perhaps might be peculiar to SunOS.
  1166. We'll see...
  1167. Added --syslog:5 (debugging) support.  Automatically opens debug log and
  1168. writes debug records to syslog.  ckuus[xy].c, 15 Sep 98.
  1169. Added code to turn off syslogging around login/password dialog, so user ID
  1170. and Password are not entered in logs for levels 4 and 5 (commands and debug).
  1171. this change does not affect the secure entry of Authentication info at syslog
  1172. level 1.  ckuus7.c, 15 Sep 98.
  1173. Added a system-independent syslogging routine to UNIX C-Kermit:
  1174. cksyslog(int,char *,char *,char *).  This needs to be added to any other
  1175. ck?fio.c module for builds in which CKSYSLOG is defined.  It allows the system
  1176. independent modules to call the syslogging function without using system
  1177. dependent code, and (at least in the UNIX case) isolates the #ifdef printf
  1178. craziness to one place.  ckcdeb.h, ckuusx.c, ckucmd.c, ckufio.c, 15 Sep 98.
  1179. Added incoming server commands to level 4 syslogging.  ckcpro.w, 15 Sep 98.
  1180. Changed default prompt to say IKSD rather than C-Kermit or K-95 (etc) when
  1181. running as IKSD.  Also changed default UNIX prompt to show current directory
  1182. in parens rather than brackets since brackets don't show up right if an NRC
  1183. is in use.  ckuus5.c, 15 Sep 98.
  1184. Made the syslog messages a bit more consistent:
  1185.   login: user host
  1186.   login: anonymous host password
  1187.   logout: user host
  1188.   command: text             <-- Should these also include user
  1189.   server: text              <-- and host?  (They do include the
  1190.   file[n] name: text        <-- PID, but PIDs can wrap...)
  1191. ckufio.c, 15 Sep 98.
  1192. Logging commands currently has the failing that the result (success or
  1193. failure) is not shown.  Tried moving the logging point from cmcfm() to the
  1194. top of the parse loop, and logging the contents of cmdbuf[] (which should
  1195. contain the previous command) and the success variable (which applies to the
  1196. previous command), but by that time too many things have might have happened
  1197. to the command buffer.  So for now we'll leave it as is.
  1198. Found a double-ended bug in the READ command, potentially affecting all
  1199. versions, but only showing up in the VMS version: the zsinl() function
  1200. properly returned -1 on EOF, but the READ command code (too) cleverly ignored
  1201. the return code if there was also something in the buffer (to allow reading a
  1202. final line that lacked a terminator).  But if the buffer was not cleared
  1203. prior to trying to read, the final line would be read successfully forever.
  1204. Fixed at both ends.  ckufio.c, ckvfio.c, ckuus5.c, 16 Sep 98.
  1205. Added a new level of syslogging: 5 = commands from macros or files.  Debug
  1206. level moved up to 6.  ckcdeb.h, ckuusy.c, 16 Sep 98.
  1207. Added an optional and separate iksd log.  Opened in zvpass() prior to
  1208. chroot(), so works for anonymous logins even on SunOS.  Writes its record in
  1209. zclose().  Format is exactly the same as wu-ftpd, except instead of "ftp" it
  1210. says "iks" in the 11th field.  A couple items still need to be fixed, and
  1211. format of the log needs to be documented.  Also, I need to test if iksd can
  1212. share the actual ftpd.log with wu-ftp.  ckuusy.c, ckufio.c, 16 Sep 98.
  1213. Sequence-number out-of-range check added to ttinl() on 5 Sep 98 was looking
  1214. at the wrong field, spotted by Jeff.  Fixed in ckutio.c, 17 Sep 98.
  1215. Added original file-system root to beginning of fullname[] in iksdlog when
  1216. user is anonymous and therefore chroot'd, so complete filespec is logged.
  1217. Also fixed elapsed-time field, which previously always registered 0.  Also
  1218. fixed the i/o field, which had reverse sense.  ckufio.c, 17 Sep 98.
  1219. Verified that iksd can log to the same file as ftpd.  However, I noticed that
  1220. ftpd does not log transfers by real users, and also that it does not show
  1221. the full filespec.  I commented out the code that adds the chroot path to the
  1222. filespec since ftpd doesn't show the full real path, and the object is to stay
  1223. compatible.  ckufio.c, 17 Sep 98.
  1224. Changes from Jeff mainly for new SET TELOPT command.  ckuus3.c, ckuusr.h,
  1225. etc., 18 Sep 98.
  1226. Supplied missing */ from comment in ckuusr.h.  18 Sep 98.
  1227. Fixed various other preprocessor syntax errors.  ckcfns.c, ckuus6.c, 18 Sep 98.
  1228. Discovered that {get,end}usershell() is not portable.  So #ifdef City has
  1229. another population explosion...  ckcdeb.h, ckufio.c, 18 Sep 98.
  1230. Disabled DELETE command for guests.  ckuus[r67].c, ckufio.c, 18 Sep 98.
  1231. RENAME is the only file collision option that is safe for guests to use.  All
  1232. the others destroy or rename or alter existing files.  Added code to enforce
  1233. this.  FILE COLLISION RENAME is set at anonymous login time and the SET FILE
  1234. COLLISION command is disabled for guests.  Also the server rejects any REMOTE
  1235. SET FILE COLLISION commands.  ckcfns.c, ckuus7.c,  18 Sep 98.
  1236. Fixed DISABLE DELETE to also set FILE COLLISION to RENAME and to disable the
  1237. SET FILE COLLISION command.  ckuus[67].c, 18 Sep 98.
  1238. Fixed COPY command to check if destination file already exists and if so
  1239. to fail if DELETE is DISABLEd or if user is anonymous.  ckuus6.c, 18 Sep 98.
  1240. Made snddir() and snddel() return 0 upon failure to do their jobs (as now),
  1241. or -1 if the given filespec did not match any existing files (new).  ckcnfs.c,
  1242. 18 Sep 98.
  1243. Made protocol module send Error packet if REMOTE DELETE or REMOTE DIRECTORY
  1244. was executed on a filespec that could not be found, thus causing the client
  1245. command to fail rather than succeed, to match the reasonable expectations of
  1246. users.  ckcpro.w, 18 Sep 98.
  1247. Made COPY command enforce one-file restriction; no wildcards.  It already
  1248. did this in K95.  ckuus6.c, 18 Sep 98.
  1249. Don't allow changing of protocol to anything but Kermit in IKSD.  ckuus3.c,
  1250. ckcfn2.c, 18 Sep 98.
  1251. Added provision for NOIKSD at compile time, which defines all the appropriate
  1252. NOblah symbols to disable IKSD-specific code.  If NOIKSD is not defined, IKSD
  1253. is defined automatically (but currently not used for anything).  ckcdeb.h,
  1254. 18 Sep 98.
  1255. Changes to SET TELOPT parsing from Jeff, ckuus3.c, 21 Sep 98.
  1256. Added TYPE /PAGE (and /NOPAGE).  /PAGE forces askmore() prompting.  /NOPAGE
  1257. disables it.  Default (if no switch given) is according to the current COMMAND
  1258. MORE-PROMPTING setting.  Prevailing setting is undisturbed by switches, and
  1259. is restored automatically if the TYPE command is interrupted with SIGINT.
  1260. ckuusr.h, ckuus[r56x].c, 21 Sep 98.
  1261. Added --bannerfile:filename, which tells the herald() routine to print the
  1262. contents of the given file, rather than what it normally prints.  Uses more-
  1263. prompting (i.e. works like TYPE /PAGE).  For use with IKSD, but can also be
  1264. used in regular C-Kermit.  ckuus[56x].c, 21 Sep 98.
  1265. Fixed herald() to put console in cbreak mode before calling askmore().
  1266. ckuus5.c, 22 Sep 98.
  1267. Added --help, which lists the available extended command-line options.
  1268. ckuusy.c, 22 Sep 98.
  1269. Added HELP EXTENDED-OPTIONS, which is like HELP OPTIONS, but for the extended
  1270. ones (and also is like --help, but with more-prompting).  Also added a pointer
  1271. from HELP OPTIONS to HELP EXTENDED.  Also added a very brief HELP IKSD.
  1272. ckuusr.[ch], ckuus2.c, 22 Sep 98.
  1273. Added SHOW EXTENDED-OPTIONS, but left it invisible since it's pretty much only
  1274. for IKSD sysadmins to check their command lines before going into production.
  1275. If an IKSD client user stumbles on it, it won't show them any IKSD-specific
  1276. options, only the innocuous ones.  ckuusr.h, ckuus[r5].c, 22 Sep 98.
  1277. Prevented access to command-line argument vector via &@[] array to IKSD
  1278. users.  There is no reason they would need to see the command line, and every
  1279. reason why they shouldn't.  cmdini(), ckuus5.c, 22 Sep 98.
  1280. Added brief synopsis of each command to REMOTE HELP text.  ckcfns.c, 23 Sep 98.
  1281. Added a #define for zfnqfp() to strncpy() when ZFNQFP is not defined, so we
  1282. don't have to guard every reference to zfnqfp() with #ifdefs.  ckcdeb.h plus
  1283. many modules, 23 Sep 98.
  1284. Changed all --blah:<filename> options to expand the filename before storing
  1285. it, except --cdfile, which is normally relative.  ckuusy.c, 23 Sep 98.
  1286. Added --helpfile:<filename> to allow a custom file to be substituted for the
  1287. top-level HELP text.  Can be any length, using more-prompting by default.
  1288. Also works for regular non-IKSD Kermit sessions.  ckuusr.h, ckuus[y25].c.,
  1289. 23 Sep 98.
  1290. Added --cdmsg:n, n > 1, to mean CD message should also be displayed when CD
  1291. (but not BACK) command given at prompt.  Set it to 2 automatically when -A
  1292. given on command line.  Uses "type /page".  Works in non-IKSD Kermit sessions.
  1293. ckuus[5y].c, 23 Sep 98.
  1294. Fixed makelist() to allow recyclying of list.  ckuusr.c, 23 Sep 98.
  1295. Changed --cdfile:<name> to also accept a list of filenames in the standard
  1296. C-Kermit format for lists: --cdfile:{{file1}{file2}...{filen}}, up to 8.
  1297. And changed SHOW { SERVER, EXTENDED-OPTIONS } to show CD message-file list.
  1298. ckcmai.c, ckcfns.c, ckcpro.w, ckuus[35y].c, 23 Sep 98.
  1299. Changed default CD message file from a single filename to a list.  ckcker.h,
  1300. ckcmai.c, 23 Sep 98.
  1301. Added SET CD MESSAGE { ON, OFF, FILE <list> }, like SET SERVER CD-MESSAGE, but
  1302. applies to command mode rather than server mode.  Also added SET CD PATH to
  1303. allow the CD PATH to be set from within C-Kermit.  Note that SET SERVER
  1304. CD-MESSAGE FILE and SET CD MESSAGE FILE do exactly the same thing, and one
  1305. does (and undoes) the other.  However, SET CD MESSAGE { ON, OFF } and SET
  1306. SERVER CD-MESSAGE { ON, OFF } are separate.  ckuus3.c, ckuusr.h, 23 Sep 98.
  1307. Added SHOW CD.  Shows current directory, previous dir, cd path, cd message,
  1308. server cd-message, and cd message file.  ckuusr.h, ckuus[r5].c, 23 Sep 98.
  1309. Added HELP SET CD and updated HELP SET SERVER, HELP CD, and HELP TYPE.
  1310. ckuus2.c, 23 Sep 98.
  1311. Added a "-7" command-line option.  This is approximately equivalent to -A,
  1312. except without the login phase, chroot(), etc, so it is for use by ordinary
  1313. users who are already logged in, rather than as a daemon.  It just sets
  1314. sstelnet = 1, thus enabling server-side Telnet negotiation, substitute printf,
  1315. etc.  Works OK if run redirected under another Kermit that accepts the
  1316. incoming connection, but needs additional work to allow:
  1317.   kermit -7 -J * 3000
  1318. to allow a single copy of Kermit to be started in such a way that it accepts
  1319. an incoming Telnet connection and then presents a command prompt to the Telnet
  1320. client.  ckuus[47].c, ckcmai.c, ckutio.c, 23 Sep 98.
  1321. Updated HELP SET CD PATH text to account for platform differences.  ckuus2.c,
  1322. 24 Sep 98.
  1323. Changes from Jeff, mainly for automatically setting default protocol for
  1324. different sockets in SET HOST / TELNET.  ckcnet.[ch], ckuus7.c, 24 Sep 98.
  1325. Changes from Jeff, 1 Oct 98:
  1326.  . Add SET SESSION-LOG for K95: ckcker.h, ckuusr.c. makefile, ckuusx.c
  1327.    Default is binary for K95, text for UNIX, etc.
  1328.  . Added DEBUG session-log type: ckuus3.c.
  1329.  . Some reorganization of SSL selection code: ckuus3.c.
  1330.  . Add SSL support: ckucns.c, ckutio.c.
  1331.  . Add NTVT emulation: ckuusr.h, ckuus7.c.
  1332.  . Add NTVT unknown authorization method: ckctel.h.
  1333.  . Various updates to authentication code: ckcnet.c.
  1334.  . Clarifying comments added about CP1258 -- it's for Viet Nam: ckouni.c.
  1335. Reformatted ckouni.c to not have long lines, 1 Oct 98.
  1336. Changes from Jeff, 19 Oct 98:
  1337.  . SET TERM PRINT
  1338.  . Additional of NTVT and SSL authentication types
  1339.  . Assorted minor corrections
  1340. Some minor corrections from Jeff: ckuus[5x].c, 20 Oct 98.
  1341. Added RESET command; closes all open files and logs.  Probably could do some
  1342. other things too...  ckuusr.h, ckuus[rx].c, ckcker.h, ckcpro.w, 20 Oct 98.
  1343. Moved logchar() from cku{con,cns}.c to ckuusx.c, and added logstr() (but
  1344. it's not called from anywhere).  These might need #ifdefs for K95.
  1345. Prototypes in ckcker.h.  20 Oct 98.
  1346. It has always bugged me that Kermit could not automatically switch to an
  1347. appropriate character set when receiving a file whose transfer character-set
  1348. is announced.  With IKSD, this is no longer just a convenience, but a
  1349. necessity.  So...
  1350.  . Added initcsets() to initialize charset associations.  These are done in
  1351.    a way appropriate to each system with #ifdefs.  initcsets() is called at
  1352.    program startup (after sysinit()).  ckcker.h, ckcmai.c, ckuxla.c, 20 Oct 98.
  1353.  . Added ASSOCIATE XFER/FILE-CHARACTER-SETS command.  ckuusr.[ch], 20 Oct 98.
  1354.  . Added SET { SEND, RECEIVE } CHARACTER-SET-SELECTION { AUTO, MANUAL }.
  1355.    ckuusr.h, ckuus7.c, 20 Oct 98.
  1356.  . Added S/R CHAR setting to SHOW CHARACTER-SETS.  ckuus4.c, 20 Oct 98.
  1357.  . Added SHOW ASSOCIATIONS separately, since there was no good way to put it
  1358.    in SHOW CHARACTER-SETS with more-prompting, since SHO CHAR is split between
  1359.    modules.  (We need a better method of handling more-prompting!)  ckuusr.h,
  1360.    ckuus[45].c, 20 Oct 98.
  1361.  . Changed Attribute-packet handler to automatically switch file character-set
  1362.    according to incoming transfer charset announcer if RECEIVE CHAR AUTO.  The
  1363.    original setting is saved and restored around file transfer and/or keyboard
  1364.    interruption.  ckcfn3.c, ckuusx.c, 20 Oct 98.
  1365.  . SET FILE CHARACTER-SET blah now automatically sets the transfer charset
  1366.    if SEND CHAR is AUTO.  It set it before too, but using 70+ lines of ugly
  1367.    code, now replaced by 2 lines of pretty code.  ckuus7.c, 20 Oct 98.
  1368.  . SET XFER CHARACTER-SET blah now automatically sets the file charset from
  1369.    the associations table if SEND CHAR is AUTO.  ckuus3.c, 20 Oct 98.
  1370.  . Added help text for the new commands.  ckuus2.c, 20 Oct 98.
  1371.  . Fixed a bug that kept the transfer character-set from showing up in
  1372.    transaction log entries for received files.  ckcfn3.c, 20 Oct 98.
  1373.  . Fixed the descriptive names that are common to fcsinfo[] and tcsinfo[]
  1374.    to be in the same format, and also renamed code pages from "IBM Code Page"
  1375.    to "PC Code Page".  ckuxla.c, 20 Oct 98.
  1376. So now a user, when receiving a file in text mode that comes with a charset
  1377. announcer will automatically get a reasonable translation.  And when users who
  1378. are about to send a file give either a SET FILE or SET TRANSFER CHARACTER-SET
  1379. command, the other is set accordingly.  The defaults should be entirely
  1380. appropriate (and of course can be changed with the ASSOCIATE command), so now
  1381. C-Kermit and K95 should almost always "do the right thing" as long as the
  1382. sender properly identifies the file character-set of the source file.  And in
  1383. fact, this happens by default in K95, since it gets the current code page at
  1384. startup and makes this the file character-set value.  Unfortunately there is
  1385. no good (or at least remotely portable) way to do the same in Unix.
  1386. From Jeff: Deployment of logstr() in many modules.  21 Oct 98.
  1387. Added bounds checking to auto charset switch in gattr().  ckcfn3.c, 21 Oct 98.
  1388. Ditto for SET XFER CHARACTER-SET.  ckuus3.c, 21 Oct 98.
  1389. Ditto for SET FILE CHARACTER-SET.  ckuus7.c, 21 Oct 98.
  1390. Fixed ?-help messages for ASSOCIATE command.  ckuusr.c, 21 Oct 98.
  1391. Some changes from Jeff to SSL option setting commands.  ckuus3.c, 22 Oct 98.
  1392. Added { RECEIVE, GET, MGET } /EXCEPT:<list>.  If a file arrives whose name
  1393. matches any name in the exception list, it is rejected using the attribute
  1394. refusal mechanism, reason: name.  This does not use the O-packet exception
  1395. list mechanism; it is done purely on the client side; thus it can work with
  1396. current/older Kermit programs on the other end.  It does, however, require
  1397. A-packets to be negotiated and in use, since this is the only way we have of
  1398. rejecting a file within a group without cancelling the entire transfer.  But
  1399. that's true of the collision-based and other refusals too.  ckuus[26].c,
  1400. ckcfn[s2].c, 22 Oct 98.  Later, once C-Kermit 7.0 servers are prevalent, we
  1401. can convert to using the more graceful O-packet method.
  1402. Various minor fixes to transaction log format.  ckcfn[s2].c, 22 Oct 98.
  1403. Inclusion of extended-format command-line options (like --helpfile:blah)
  1404. caused command-line parser to skip the next option, oops.  Fixed in ckuusy.c.
  1405. Also fixed command-line error message to print actual program name, not
  1406. hardwired text.  22 Oct 98.
  1407. Previously the wuftpd-like log, enabled by --iksdlog:1 --iksdfile:name, was
  1408. available only to the iksd.  I rearranged the code to allow regular user-mode
  1409. C-Kermit to use this too, and renamed the options (and corresponding
  1410. variables) to xferlog and xferfile.  UNIX only.  ckuusy.c, ckufio.c,
  1411. 22 Oct 98.
  1412. Added SET TRANSACTION-LOG FTP (it already had BRIEF and VERBOSE options) to
  1413. let the ftpd-like log be selected by command.  UNIX only.  This bypasses the
  1414. regular transaction-log mechanisms, but that's not visible to the user.  It's
  1415. hooked into SHOW LOG via special code.  ckuus[35].c, 22 Oct 98.
  1416. Fixed FTP log format -- two of the fields were switched.  Also put the actual
  1417. username in the username field in the non-IKSD case.  And put the connection
  1418. name (network host or serial device name) in the clienthost field for the
  1419. non-IKSD case.  ckufio.c, 23 Oct 98.
  1420. Made LOG TRANSACTIONS default disposition be APPEND when using the FTP-format
  1421. log, for compatibility with the ftp log.  ckuus4.c, 23 Oct 98.
  1422. Substituted built-in code for zshcmd() in UNIX zcopy(), because the zshcmd()
  1423. version can't be used in IKSD.  It works, but it's not finished -- need to add
  1424. informative error returns (see ckcplm.txt), do all the checks that cp does
  1425. (e.g. source file is a directory, whether it's ok to overwrite existing files,
  1426. etc), and fix up permissions afterwards, e.g. to carry forward the execute
  1427. bit.  Will finish after the weekend.  ckufio.c, 23 Oct 98.
  1428. Discovered that UNIX zxpand() wrote into its argument (e.g. when concatenating
  1429. "/*" to a directory name).  It's been this way forever, and obviously could
  1430. have resulted in countless horrible consequences.  Fixed it to make a safe
  1431. copy first.  ckufio.c, 25 Oct 98.
  1432. Discovered that RENAME did not work when the source file was a directory.
  1433. This was due to a deficiency in cmifi2(), which did not allow for the case in
  1434. which the argument "d" was nonzero (meaning "parse files or directories"), but
  1435. the argument "dirflg" was 0 (meaning "not directories-only").  Fixed in
  1436. ckucmd.c, 25 Oct 98.
  1437. Fixed UNIX zcopy() to:
  1438.  . Check for source file is a directory / is wild / etc.
  1439.  . Check for source file == destination file by comparing their inodes.
  1440.    This works even for symlinks.
  1441.  . Allow destination file to be a directory, in which case the source file
  1442.    is copied into it.
  1443.  . Overwrite existing destination file if its permission allows.
  1444.  . Set new file's permission according to umask but also carry forward
  1445.    the source file's exececute permission bits (but this only works if the
  1446.    destination file did not already exist -- this appears to be a property
  1447.    of UNIX open()).
  1448.  . Fail if interrupted by Ctrl-C.
  1449.  . Return standardized error codes (listed in ckcplm.txt).
  1450. ckufio.c, 25 Oct 98.
  1451. Fixed COPY command to:
  1452.  . Not allow a directory as the source file (give a parser error and fail).
  1453.  . Not allow wildcards (ditto).
  1454.  . Print error messages appropriate to zcopy() return code.
  1455. ckuus6.c, 25 Oct 98.
  1456. Made sure server end of REMOTE COPY and REMOTE RENAME work with new code
  1457. (they do), which was the main reason for doing all this.  Added checks within
  1458. zcopy() and zrename() themselves against being called by IKSD guests.
  1459. ckufio.c, 25 Oct 98.
  1460. Problem: REMOTE HOST blah will time out and fail if the "blah" command takes
  1461. too long to finish and/or to produce output.  Ditto for sending from a pipe.
  1462. zinfill() in this case needs a way to time out when reading from a process,
  1463. which can be done (in UNIX) with select().  Since all the hairy
  1464. select()-related #ifdefs, etc, are in ckutio.c, I added a new routine there,
  1465. ttwait(fd,secs), to wait the given number of seconds for data to become
  1466. available on the given file descriptor.  zinfill() calls ttwait() when it
  1467. knows it is reading from a pipe, and it works fine (at least in SunOS).  Now
  1468. the trick will be to interface this mechanism with the file transfer code:
  1469.  . What should the timeout be?  Well, these days we have no idea what the
  1470.    other Kermit's timeout interval is, because it might be dynamic.  For
  1471.    starters, it might be OK to hardwire this to 1 second.  After all, neither
  1472.    Kermit program is doing anything anyway if no output is arriving from the
  1473.    pipe, so why not give them something to do?
  1474.  . How to return timeout condition?  Have zinfill() return a unique negative
  1475.    number (-3 is currently not used), and then make sure everybody else along
  1476.    the way knows what it means.
  1477.  . Who are the clients of zinfill()?  It is called only through the zminchar()
  1478.    macro.  zminchar(), in turn, is called by: kgetf() (Kanji file-transfer),
  1479.    bgetpkt(), getpkt(), transmit(), xlate(), fcommand(), and dotype().  Of
  1480.    these, [b]getpkt() and fcommand() might be reading from a pipe, but
  1481.    timeouts are important only during file transfer, so we can ignore
  1482.    everything but [b]getpkt().
  1483. This means that zinfill() should call ttwait() only when Kermit protocol is
  1484. active.  We can test this with a new variable, kactive: ckuusx.c, ckcpro.w,
  1485. ckufio.c, 25 Oct 98.
  1486. zinfill(), upon timeout, returns -3 to [b]getpkt(), which passes -2 up to its
  1487. caller, sdata().  If sdata() gets this, it simply sends an empty data packet
  1488. (for testing, it sends a data packet containing a dot).  ckcfns.c, 25 Oct 98.
  1489. It works, but will need a lot of testing and refinement (for example, a packet
  1490. log shows that after a bunch of timeouts, when the output first appears, a
  1491. NUL is inserted into the data stream).  As far as non-UNIX versions go, this
  1492. is strictly an matter of making their versions of zinfill() return -3 on
  1493. timeout.
  1494. The spurious NUL at the beginning of the data packet was caused by the now
  1495. invalid assumption that getpkt() will always either read a character or get an
  1496. EOF indication.  Since it does at-least-one-character lookahead, it uses the
  1497. "first == 1" as an indicator that there was no previous character, and sets
  1498. first = 0 the first time through.  But if the first time through it gets a
  1499. timeout from zinfill(), the first flag should be left alone.  Now the first
  1500. flag is unset only when zinfill() returns an actual character.  [b]getpkt():
  1501. ckufio.c, 26 Oct 98.
  1502. The second bad assumption was that timeouts would only occur at the beginning;
  1503. in fact, they can happen anywhere, any number of times.  Juggling the code to
  1504. make sure getpkt() returns partial packets upon timeouts reveals that once
  1505. some data is returned by zinfill(), no further timeouts occur.  That's
  1506. because fread() is called with INBUFSIZE, and so it blocks until the buffer
  1507. is filled or EOF is encountered.  But for the new code to work, it has to
  1508. read only what is there, without blocking.  So I made the input file pointer
  1509. for pipes (in zxcmd()) nonblocking, and then adjusted zinfill() and getpkt()
  1510. to behave appropriately.  It's still not perfect, but it's getting close.
  1511. ckufio.c, ckcfns.c, 26 Oct 98.
  1512. Fixed a bug in yesterday's changes that broke the case where timeouts occurred
  1513. before any data had been read.  getpkt(): ckcfns.c, 27 Oct 98.
  1514. Migrated all getpkt() changes to bgetpkt().  ckcfns.c, 27 Oct 98.
  1515. Tested the following successfully:
  1516.  . remote host echo foo
  1517.  . remote host sleep 5;echo foo
  1518.  . remote host sleep 5;echo foo;sleep 5
  1519.  . remote host sleep 5;echo foo;sleep 5;echo bar
  1520.  . remote host echo foo;sleep 5;echo bar;sleep 5
  1521.  . remote host echo foo;sleep 5;echo bar;sleep 5;echo baz
  1522.  . (etc)
  1523. BUG: GET /BIN does not force the server to send in binary mode.  Diagnosis:
  1524. Due to changes to ckcpro.w from 14 Aug 98 (see notes above) tinit() can be
  1525. called *after* spar(), but whatru is set in spar() but zero'd in tinit().
  1526. Hmmm, this also explains why the "who are you" info went missing around the
  1527. same time...  Cure: move initialization of whatru (and whoaru[]) to spar().
  1528. ckcfns.c, 27 Oct 98.
  1529. This seems to take care of everything.  When PATTERNS are OFF on the server,
  1530. GET /BIN always transfers in binary mode and GET /TEXT always transfers in
  1531. text mode.  However, if PATTERNS are ON, they still take precedence, since
  1532. there is presently no way for the server to know *how* the binary bit in the
  1533. client's WHOAMI field was set -- because it happened to be the prevailing
  1534. mode (in which case the server's patterns should have precedence) or because
  1535. the user said GET /BINARY (in which case the client's command should govern).
  1536. Unfortunately there are no spare bits in the WHOAMI field to express the
  1537. difference.  (It can, however, be easily added to the O Packet.)  In the
  1538. meantime, REMOTE SET TRANSFER MODE MANUAL effectively disables PATTERNS in
  1539. the server and allows the GET /BINARY and /TEXT switches to operate in the
  1540. expected way.
  1541. So now the following work too (server has SET TRANSFER PIPES ON):
  1542.   get /bin wermit ; (after "remote set xfer mode manual")
  1543.   get /bin /as:x.x {!(sleep 5;cat wermit)}
  1544. In light of successful experience with GFTIMER, redid UNIX ztime() to call
  1545. gettimeofday() if GFTIMER is defined (since that has been working anyway for
  1546. many months), rather than the bizarre cascade of historical #ifdef'd code.
  1547. The advantage being that gettimeofday() gives us not just date and time to
  1548. the second, but also the fraction of the second in microseconds.
  1549. UNIX ztime() now also set two variables:
  1550.   long ztmsec; Fraction of second in millisec (or -1L if not set)
  1551.   long ztusec; Fraction of second in microsec (or -1L if not set)
  1552. These variables are defined in ckcmai.c, and externs for them are in
  1553. ckcdeb.h, so they can be freely referenced in the code without #ifdefs, but
  1554. customers of these variables should always check to make sure they are not
  1555. -1L before using them.  ckufio.c, 28 Oct 98.
  1556. For time-critical debugging, added SET DEBUG TIMESTAMP { ON, OFF }.  When ON,
  1557. it puts an hh:mm:ss.xxx timestamp at the beginning of each debug log line,
  1558. where .xxx (1000ths of sec) is included if ztmsec is > -1L.  Timestamping
  1559. can be turned off and on at will, even while the debug log is open.
  1560. ckuus[23x].c, 28 Oct 98.
  1561. Made debug() recursion-proof.  If debug() ever called itself, or called a
  1562. routine (such as zstime(), which it now calls for timestamps) which contains
  1563. debug() statements, it would recurse forever and crash when the stack
  1564. overflowed.  dodebug(): ckuusx.c, 28 Oct 98.
  1565. Noticed that all the documentation said SET CLEAR-CHANNEL but the code said
  1566. SET CLEARCHANNEL.  Added alternative keywords & abbreviations to make them
  1567. both right.  ckuusr.c, 28 Oct 98.
  1568. Checked to make sure we still build OK on:
  1569.  . Linux (RH 3.0.3): OK
  1570.  . Solaris 2.5.1 (gcc): OK
  1571.  . SunOS 4.3.1: OK
  1572.  . HP-UX 10.20 (no opt): OK
  1573.  . UnixWare 2.1.3: OK
  1574.  . Sinix 5.42: OK
  1575.  . AIX (no space)
  1576.  . VAX/VMS 5.5: OK
  1577. The first few were OK but Sinix, Unixware, and VMS required a fair amount of
  1578. #ifdef juggling and syntax adjustment.  Problem areas in Unixware and Sinix
  1579. included: no getusershell() (so must add -DNOGETUSERSHELL); no setreuid() etc
  1580. in Sinix, so just use setuid() (man page says it does it all), adding -lcrypt
  1581. to LIBS here & there, etc.  ckuus2.c, ckcfns.c, ckcmai.c, ckcnet.c, ckvfio.c,
  1582. 28 Oct 98.
  1583. Noticed that:
  1584.   rem host sleep 5;echo one;sleep 5;echo two;sleep 5;echo three
  1585. works fine with SunOS server, but stops after "one" with UnixWare, SINIX.
  1586. HP-UX, Linux, and Solaris.  Found and fixed a potential problem with the
  1587. use of fcnctl() to set the pipe nonblocking, but it made no difference.
  1588. Debug log shows:
  1589.   getpkt nleft=0
  1590.   getpkt zminchar 2=110
  1591.   getpkt zminchar 2=101
  1592.   ZINFILL feof
  1593.   getpkt zminchar 2=-1
  1594.   getpkt eof/eot[one]=3
  1595. In other words, feof() is returning true, even though the pipe is not closed.
  1596. I don't know why, but removing the first of two feof() tests from zinfill()
  1597. in this case (reading from pipe) makes the problem go away.  ckufio.c,
  1598. 29 Oct 98.
  1599. Tried building on Sequent DYNIX/ptx(R) V4.4.2:
  1600.  . Warnings about trigraphs in comments, e.g. "/* yyyy-mm-dd */".
  1601.    So what -- these warnings are too stupid to fix.
  1602.  . Typo in _SYS_NML #ifdefs in ckutio.c.
  1603.  . struct timeval not declared because SELECT not defined.
  1604.  . struct timezone does not exist.
  1605.  . gettimeofday() needs to be called with arg #2 = NULL.
  1606.  . set[r]e{u,g}id() do not exist.  Added USE_SETUID to ckufio.c for IKSD.
  1607.    In fact, I'm not sure that there is any reason at all not to always
  1608.    use setuid() and setgid() in IKSD -- but I'm not sure it's safe either.
  1609.  . {get,set}usershell() don't exist.
  1610.  . Most DYNIX/ptx makefile entries were missing the $(KFLAGS) clause.
  1611.  . Fixed these, then updated makefile DYNIX/ptx entries to all have
  1612.    -DNOGETUSERSHELL, and added new dynixptx44 entry that also has
  1613.    -DSELECT and -DBIGBUFOK.
  1614.  . This gets lots of select() warnings, which I fixed with #ifdefs.
  1615.  . It also gets warnings on args of getsockopt(), getsockname(), and accept();
  1616.    all these fixed with #ifdefs in ckcnet.c.
  1617.  . Banner was wrong -- said POSIX instead of DYNIX/ptx, fixed in ckuver.h.
  1618. Now it builds and runs fine.  29 Oct 98.
  1619. Reconciled Jeff's recent changes with mine, many modules, plus an adjustment
  1620. to the getpeername() call for Unixware.  3 Nov 98.
  1621. Changes from Jeff to allow fatal error messages from host to be viewed in
  1622. case of disconnect during tn_ini().  ckcnet.c, ckutio.c, 4 Nov 98.
  1623. Updates for ckvins.txt and ckvbwr.txt, 5 Nov 98.
  1624. Made sure that TIOCGSIZE was a synonym for TIOCGWINSZ in Digital Unix, and
  1625. that ttgwsiz() worked OK.  Added comments.  Made sure it still builds OK on
  1626. DU 3.2 and 4.0B.  ckutio.c, 5 Nov 98.
  1627. Allowed "--" as a synonym for "=" on the command line to separate program
  1628. arguments from script arguments, a`la getopt().  prescan(): ckuus4.c,
  1629. cmdini(): ckuus5.c, doarg(): ckuusy.c, HELP OPTIONS: ckuus2.c, documented in
  1630. ckermit2.txt, 5 Nov 98.
  1631. Noticed that LOCAL variable stack depth was defined as MACLEVEL rather than
  1632. CMDSTKL.  Fixed in ckuus5.c, 5 Nov 98.
  1633. As an experiment, added a few lines of code to the TAKE command parser to
  1634. allow arguments to follow the filename (also some minor adjustments were
  1635. required to xword()).  So now the TAKE command does the same thing as the DO
  1636. command, except it does not push the macro stack.  Thus, if any args are
  1637. given, they overwrite the current macro args, if any, just as if the user had
  1638. given explicit DEFINE or ASSIGN commands for them.  To test, create a file
  1639. (say xxx) that contains the SHOW ARGS command and then tell C-Kermit to "take
  1640. xxx foo bar baz".  Works great, doesn't seem to break anything.
  1641. However, nested TAKEs just keep writing over the same set of arguments, unlike
  1642. nested macros or function calls. which save and restore context.  This is a
  1643. bit ugly to explain, so perhaps a better course would be to tie the argument
  1644. stack to the command level rather than the macro level.  This would be a
  1645. rather massive (but mostly mechanical) change, involving all references to:
  1646.   m_line[level]     stack of macro invocation lines
  1647.   macx[level]       stack of pointers to macro definitions
  1648.   macp[level]       stack of pointers to current position in macro
  1649. + m_arg[level][arg] stack of pointers to args at level 0..MACLEVEL
  1650. + m_xarg[level]     stack of pointers to arg vector array
  1651. + n_xarg[level]     stack of dimensions of arg vector array
  1652. + macargc[level]    stack of argc's
  1653. ? mrval[level]      stack of RETURN values
  1654.   topargc           argc at top level
  1655.   topxarg           argv at top level
  1656. Presumably we could (a) replace all MACLEVEL dimensions for the arrays marked
  1657. "+" (and maybe mrval[] too if we want command files to be able to return
  1658. values) by CMDSTKL; (b) move the argument setting / restoring code from dodo()
  1659. to a common place; (c) call the common routine from both dodo() and dotake();
  1660. (d) index all arrays by cmdlvl rather than maclvl; (e) get rid of the many
  1661. special hacks for top level; (f) preserve compatibility with current behavior
  1662. by having TAKE without args supply current args as default.  This could work,
  1663. but if a subordinate command file changed its arguments, the changes would be
  1664. undone when it returned to its caller, which is counter to current behavior.
  1665. So we can't make this change.
  1666. Discovered that &_[] does not work at top level.  Commented out two lines of
  1667. code in chkarray() that prevented it from working.  ckuus5.c, 5 Nov 98.
  1668. Worse than that, &_[] does not work inside FOR, WHILE, SWITCH, XIF.  That's
  1669. because dogta() doesn't handle this array.  Fixed in dogta(): ckuus6.c,
  1670. 5 Nov 98.
  1671. Fixed popclvl() to restore &_[] array when popping back to top level.
  1672. popclvl(): ckuus5.c, 5 Nov 98.
  1673. So now it is possible for a first-level command file (that is invoked
  1674. without arguments) to access the non-Kermit command line options as follows:
  1675.   for %i 0 v(argc)-1 1 { echo %i. "&_[%i]" }
  1676. So, for example, if Kermit was invoked as "kermit -Y -i -- foo bar baz", the
  1677. loop would print:
  1678.   1. "/usr/local/bin/kermit"
  1679.   2. "foo"
  1680.   3. "bar"
  1681.   4. "baz"
  1682. OK, so now back to the problem at hand.  Note that:
  1683.   define mtake take
  1684.   mtake filename arg1 arg2 ...
  1685. allows %0..9 to be saved and restored.  But it also shifts the arguments
  1686. to the right: once inside the command file, %1 is the filename, %2 is
  1687. arg1, etc.  This can be partially corrected by defining MTAKE as follows:
  1688.   define mtake {
  1689.      local %f %i
  1690.      assign %f fcontents(%1)
  1691.      for %i 1 v(argc)-2 1 {
  1692.        assign &_[%i] &_[%i+1]
  1693.        if < %i 10 _assign \%%i &_[%i]
  1694.      }
  1695.      take %f
  1696.   }
  1697. This works fine except it does not (can not) adjust v(argc).  Two solutions
  1698. spring to mind: (a) add a SHIFT command to shift all the args to the left one
  1699. position (and also move &_[10] to %9), adjusting v(argc) (and %*) in the
  1700. process, or (b) add a built-in MTAKE command.  (a) seems more generally
  1701. useful so let's give it a shot...
  1702. Added SHIFT [ n ] command.  ckuusr.[ch], 5 Nov 98.
  1703. Added doshift(n) routine.  First top-level &_[] vector.  Then top-level
  1704. globals.  Almost got it working, but ran out of time.  Will try to finish
  1705. tomorrow.  ckuus5.c, 5 Nov 98.
  1706. Fixed doshift(), ckuus5.c, 6 Nov 98.  Now MTAKE can be defined as follows:
  1707.   define mtake {
  1708.      local %f
  1709.      assign %f fcontents(%1)
  1710.      shift
  1711.      take %f
  1712.   }
  1713. and it works.  Still need to (a) handle %* (might not be possible), and
  1714. (b) document all this.  Also think about adding MTAKE as a built-in command.
  1715. Updates to ckubwr.txt based on recent reports.  6 Nov 98.
  1716. Some network-related changes from Jeff, mostly in ckcnet.c.  9 Nov 98.
  1717. Added HELP SHIFT.  ckuus2.c, 9 Nov 98.
  1718. SET CLEARCHANNEL OFF had no effect if the other Kermit wanted to negotiate
  1719. clearchannel.  Fixed in spar(), ckcfns.c, 9 Nov 98.
  1720. Made SET PREFIXING ALL or CAUTIOUS automatically also SET CLEARCHANNEL OFF.
  1721. ckcmai.c, 9 Nov 98.
  1722. Added *.lzh to binary types.  ckcmai.c, 10 Nov 98.
  1723. DIAL and LOOKUP did not recognize internal PBX numbers if PBX-EXCH and PBX-IN
  1724. are set, but PBX-OUT is not set.  No big deal, but confusing.  So now it is
  1725. possible to handle a PBX that does not require an outside prefix (in case
  1726. there is any such thing).  Fixed in dncvt(): ckuus6.c, 10 Nov 98.
  1727. Loading of dial parameters from environment variables at startup had K_PBX_OCP
  1728. and K_PBX_XCH mixed up.  Fixed in ckudia.c, 10 Nov 98.
  1729. SET DIAL PBX-EXCHANGE allowed only one exchange to be specified.  But some
  1730. PBXs have more than one (e.g. 853-xxxx and 854-xxxx).  Changed dialpxx from a
  1731. scalar to an array; changed SET DIAL PBX-EXCHANGE command to load the array,
  1732. and all code that refers to dialpxx to treat it as an array.  Also changed
  1733. startup code to load the array from K_PBX_XCH, which now can be defined as a
  1734. series of numbers.  ckudia.c, ckuus[346].c, 10 Nov 98.
  1735. But there is still only one PBX-INSIDE-PREFIX.  So we need a way of deriving
  1736. the inside prefix dynamically from the exchange that was matched, e.g.:
  1737.  SET DIAL PBX-INSIDE-PREFIX fsubstr(xxx,3,1)
  1738. where xxx is some new variable to stand for "the PBX exchange that was
  1739. matched", whose evaluation is delayed until dial string processing, similar
  1740. to the v(filename) variable used in SEND and RECEIVE commands.
  1741. Defined VN_D_PXX for this new variable, and named it v(d$px).  Changed
  1742. parsing of SET DIAL PBX-INSIDE PREFIX to not evaluate its operand if it is a
  1743. function call (i.e. starts with "f") or if it *is* the new variable.  Changed
  1744. dial string processing to evaluate the PBX inside prefix at dial time, after
  1745. matching one of the PBX exchanges.  Works great:
  1746.   set dial pbx-out  93,
  1747.   set dial pbx-exch 853 854
  1748.   set dial pbx-in fright(v(d$px),1)
  1749.   lookup +1 (212) 854-9876 ; gives 4-9876
  1750.   lookup +1 (212) 853-1234 ; gives 3-1234
  1751.   lookup +1 (212) 765-4321 ; gives 93,765-4321
  1752.   lookup +1 (333) 765-4321 ; gives 93,1333765-4321
  1753. Also checked that SET DIAL LC-PREFIX works right (I had a report that it was
  1754. broken around the end of May -- it applied itself to long-distance, rather
  1755. than local, calls).  It seems to be fine now; I must have fixed it:
  1756.   set dial lc-prefix 8,
  1757.   set dial pbx-out  93,
  1758.   set dial pbx-exch 853 854
  1759.   set dial pbx-in fright(v(d$px),1)
  1760.   lookup +1 (212) 854-9876 ; gives 4-9876
  1761.   lookup +1 (212) 853-1234 ; gives 3-1234
  1762.   lookup +1 (212) 765-4321 ; gives 93,8,765-4321
  1763.   lookup +1 (333) 765-4321 ; gives 93,1333765-4321
  1764. ckuus[346].c, 10 Nov 98.
  1765. Change from Jeff for SET LOGIN PASS vs quoting.  ckuus3.c, 11 Nov 98.
  1766. Added "set file character-set cp1252" as a synonym for "set file character-set
  1767. latin1".  As far as Kermit file transfer is concerned, they are the same.
  1768. The same can not be said, however, for the other Windows 12xx code pages.
  1769. ckuxla.c, 11 Nov 98.
  1770. Added CP855 as a file character-set, including invertible tables from
  1771. CP855 to Latin/Cyrillic and back.  Ditto for Windows CP1251. ckuxla.[ch],
  1772. 11 Nov 98.
  1773. Changed "cp856" keyword to "bulgaria-pc".  ckouni.c, 11 Nov 98.
  1774. Added "bulgaria-pc" as a file character set.  The only meaningful (and
  1775. invertible) translations are between it and Latin/Cyrillic.  This is the PC
  1776. code page known in Bulgaria as CP856, but we don't call it that because the
  1777. real CP856 is something totally different (a Hebrew code page).  ckuxla.[ch],
  1778. 11 Nov 98.
  1779. Added CP1250 (Windows Latin 2) as a file character set, with an invertible
  1780. translation to Latin-2 and back.  ckuxla.[ch], 12 Nov 98.
  1781. Added Polish Mazovia PC Code Page as a file character set.  Translation tables
  1782. filled in provisionally, pending confirmation from Poland.  Not invertible.
  1783. ckuxla.[ch], 12 Nov 98.
  1784. Added some #ifdefs to allow building with -DNOLATIN2.  Verified all is OK with
  1785. with -DNOCYRIL &/or -DNOLATIN2.  ckuxla.h, 12 Nov 98.
  1786. Changes from Jeff: CKXPRINTF vs curses in ckuusx.c, some casts added in
  1787. ckcnet.c, 13 Nov 98.
  1788. Added &S0 (DSR on always) to USR init string for SunOS 4.x -- it doesn't work
  1789. without it, due to some strange peculiarity of the driver.  Solaris works
  1790. without it, other modems work without it on SunOS.  Go figure.  (Note: I used
  1791. to have &S0 in ALL init strings that supported it but removed it after
  1792. numerous sysadmins complained that Kermit should not mess with it.)  ckudia.c,
  1793. 13 Nov 98.
  1794. In cmcvtdate(), "if (dbuf[8] = SP) dbuf[8] = '0';" was supposed to have "=="
  1795. in the if condition.  Fixed in ckucmd.c, 13 Nov 98.
  1796. For IRIX 6.5: added IRIX65 symbol to ckcdeb.h and ckuver.h, plus new makefile
  1797. entry.  13 Nov 98.
  1798. Missing "int" added to assorted extern declarations.  ckuus[6x].c, 13 Nov 98.
  1799. extern int stchr in ttinl() should have been extern CHAR.  ckutio.c, 13 Nov 98.
  1800. Back to mid-September work on UUCP lockfiles versus symlink'd devices, in
  1801. which we create a lockfile for both the symlink name and the real name, e.g.
  1802. /dev/modem and /dev/ttyS0, which works fine.  But what if the symlink points
  1803. to a device of the same name but in a different directory?  Example:
  1804. /dev/ttyd2 => /hw/ttys/ttyd2 (in IRIX 6.5).  Both lockfiles have the same
  1805. name (in this case LCK..ttyd2).  The device is opened OK, but at close time
  1806. when we go to delete the lockfiles, we get an error because deleting the first
  1807. one also makes the second one disappear (since they are the same).  Fixed
  1808. by adding a check for this to ttlock().  ckutio.c, 13 Nov 98.
  1809. Added a rather elaborate set of #ifdefs to account for the facts that: (a)
  1810. utmp.h might or might not define a ut_host[] member; (b) utmpx.h, which does
  1811. define one, might or might not be available; and (c) if utmpx.h is used
  1812. instead of utmp.h, then it has a struct timeval ut_tv member rather than a
  1813. scalar ut_time member.  This allows compilation on Linux and SunOS, in which
  1814. ut_host[] is in utmp.h, as well as on Solaris, IRIX, Unixware, and HP-UX,
  1815. which have utmpx.h, and on platforms that have a utmp.h that does not define
  1816. ut_host[], and no utmpx.h.  ckufio.c, 13 Nov 98.
  1817. Added Mazovia as a terminal character set to K95.  ckouni.[ch], 13 Nov 98.
  1818. Converted ckouni.[ch] for compilation by non-ANSIC compilers and cleaned up
  1819. formatting, long lines, etc.  NOTE: There is some funniness in the
  1820. ucs2_to_utf8() function.  Its ucs2 argument is USHORT, but there is a series
  1821. of comparisons of it with numbers like 0x10000, 0x200000, 0x4000000, which
  1822. will always fail, so why are they there?  Also note that 0xnnnnUL is not
  1823. supported for non-ANSIC compiles, but then I'm not quite sure how to specify
  1824. an unsigned long constant whose high-order bit is 1.  Anyway, the changes to
  1825. ckouni.c are rather massive, so thorough testing is needed.  13 Nov 98.
  1826. this paves the way for moving file-transfer charset translation to the Unicode
  1827. base if we decide to go that route.  However, there will still be some
  1828. wrinkles:
  1829.  . It will involve a three-step process: x -> Unicode -> y, whereas now we
  1830.    generally have only 2 steps (file <=> xfer charset).
  1831.  . ckouni.o is more than 3 times bigger than ckuxla.o, and the functions
  1832.    are a lot more expensive to call, some of them involving long switch
  1833.    statements.
  1834.  . The translations in ckuxla.c have evolved over time to meet users' needs.
  1835.    Some are invertible, some are not (so as to be readable).
  1836.  . ckouni.c does not support language-specific transliterations (such as
  1837.    u-umlaut => ue when converting Latin-1 to ASCII with SET LANGUAGE GERMAN).
  1838. Added support for 153600 and 307200 bps serial speeds, which are supported
  1839. (at least) in Solaris 2.5.1.  ckutio.c, 13 Nov 98.
  1840. From Jeff: make "sh" an abbreviation for SHOW (because of new conflict with
  1841. SHIFT); some TLS refinements.  ckuusr.c, ckcnet.c, 17 Nov 98.
  1842. Made the "Show what?" message a bit more helpful.  ckuus4.c, 17 Nov 98.
  1843. Added new makefile entry for UnixWare 7.0.1 and built it there OK.  makefile,
  1844. ckuver.h, 17 Nov 98.  Makes Telnet connections OK, transfers files over them.
  1845. Other tests from ckuins.txt Section 7 passed OK, except no way to test serial
  1846. comms, modems & dialing.  Also made a unixware7g entry (for gcc) but it fails
  1847. miserably.  I can't tell why, but it appears to have something to do with the
  1848. UNIX macro -- gcc seems to undefine it for some reason, so #ifdef UNIX clauses
  1849. are not executed (e.g. MAXFCSETS is not defined, which I think could only
  1850. happen if an #ifdef UNIX clause was skipped).
  1851. UnixWare builds only support speeds up to 38400.  No Bnnnn symbols are defined
  1852. for them.  Instead, we are supposed to use tcsetspeed(), giving it a long
  1853. representing the desired speed in bps.  But (a) this requires a POSIX build,
  1854. which fails rather badly; (b) there is, at present, no tcsetspeed() code in
  1855. ckutio.c; and (c) how are we supposed to get the list of supported speeds?
  1856. Discovered that "make sco32v504net KFLAGS=-DNOGETUSERSHELL" works OK on
  1857. UnixWare 7.  But it still doesn't give us the high serial speeds.
  1858. So let's try adding -DPOSIX to the unixware7 make.  Lots of complaints about
  1859. tv_sec, timeval, etc, so added #ifdefs for UW7 to #include <sys/time.h>.  But
  1860. this doesn't help because of the fascist clauses to prevent struct timeval
  1861. from being defined in a POSIX build (see earlier notes about SCO OSR5 on the
  1862. same topic).  So now we define the struct ourselves if time.h didn't (luckily
  1863. UW7 also defines a macro to indicate it has defined the struct).  Ditto for
  1864. struct timezone.  Now it compiles OK, but still lacks serial speeds > 38400.
  1865. Meanwhile, the same <sys/time.h> treatment is needed for the network module
  1866. too.  ckcnet.c, 17 Nov 98.
  1867. Added a tcgetspeed() / tcsetspeed() interface to ttgspd() and ttsspd(), and
  1868. then in this case had ttdpdlist() return a hardwired list of all possible
  1869. speeds up to 900K, and let the OS complain at runtime if a speed is not
  1870. supported.  Now we get:
  1871. UX:acomp: ERROR: "ckutio.c", line 5620: undefined symbol: TCS_ALL
  1872. UX:acomp: ERROR: "ckutio.c", line 6045: undefined symbol: TCS_OUT
  1873. These are the function codes for tc[gs]etspeed().  But "cd /usr/include ; grep
  1874. TCS_ *.h sys/*.h" turns up no definitions for these symbols anywhere.  For
  1875. that matter, tcsetspeed() is not defined in POSIX.1, nor can I find any
  1876. reference to it on any other POSIX-based system I have access to, or on the
  1877. web, or anywhere else.  So it must be a UnixWareism.  Fine, let's guess at the
  1878. TCS_* values, say 3 2 1?  Compiles OK, doesn't work.  Try 2 1 0, now it works.
  1879. However, since we can't use the Bnnnn symbols to build a legal-speed list,
  1880. I had to build a hardwired list, containing all the speeds I ever heard of.
  1881. ckutio.c, 17 Nov 98.
  1882. Now that we can run it, trial and error shows the following speeds are
  1883. supported:
  1884.  110     1200    150     19200   2400    300     4800    57600   76800
  1885.  115200  14400   1800    200     28800   38400   50      600     9600
  1886. So I commented the others out of the hardwired list.  ttspdlist(): ckutio.c,
  1887. 17 Nov 98.
  1888. The ttget/setspeed() interface is enabled if USETCSETSPEED is defined, which
  1889. is currently the case only for UW7.  These functions do not exist in earlier
  1890. versions of UnixWare, so there is no point converting them to POSIX.
  1891. Finalized unixware7 makefile target to include -DPOSIX and use the xermit
  1892. target for select-based, rather than fork-based, CONNECT.  Also added a short
  1893. name for it: "make uw7".  makefile, 17 Nov 98.
  1894. After all that work on tcget/setspeed(), it looks like it only APPEARS to
  1895. work, but in fact does nothing at all.  tcsetspeed() says it succeeds, and a
  1896. subsequent tcgetspeed() shows the speed that was just set, but the speed does
  1897. not change.  I verified this by assigning a line (whose nominal speed was 9600
  1898. bps), changing the speed to 57600, and transferring a precompressed file over
  1899. various modem connections: 14400, 24000, ...  In every case, the throughput
  1900. was 900 cps.  So I rebuilt the non-POSIX version, set the serial port speed to
  1901. 38400 (the max for this build) and got 1600 cps throughput.  Thus, the old
  1902. speed-setting API works (but only up to 38400) and tcsetspeed() is a cruel
  1903. hoax.
  1904. Or is it?  Maybe I guessed the TCS_* values wrong.  Let's try a different set;
  1905. TCS_ALL = 0 (the only one we use).  Aha, that does it.  Now I get transfer
  1906. rates of 2700 cps over a 24000 bps connection (same precompressed file).  As
  1907. further confirmation, the initial transfer rate is about 5700 cps while the
  1908. modem buffers stuff up (== the interface speed of 57600) and then decays to
  1909. 2700 once the pipe is full.  So yay, speed setting works.  (As additional
  1910. confirmation, everything falls apart at 115200 bps due to the PC's crummy
  1911. UART.)
  1912. But modem signals, carrier detection, etc, do not work.  Same reason: POSIX
  1913. builds deselect the TIOCMGET definition from <sys/termios.h>.  So we use the
  1914. same trick here as in OSR5 -- define it ourselves.  But that's not enough --
  1915. we also have to define all the TIOCM_xx symbols for each modem signal, since
  1916. those definitions, too, are hidden from POSIX.  ckutio.c, 18 Nov 98.
  1917. Ensured that "make unixware2" still works.
  1918. Added code to allow user to SET SPEED to any number at all, even if it is not
  1919. in the keyword table, if USETCSETSPEED is defined.  As it stands, the user
  1920. gets a parse error message, but the request still goes through and succeeds or
  1921. fails based on whether the OS accepts the speed.  ckuus3.c, 18 Nov 98.
  1922. Built on QNX 4.24.  Needs -DNOGETUSERSHELL, and does not have initgroups().
  1923. wtmp log is /var/adm/wtmp.1.  <utmp.h> has no ut_host[] and there is no
  1924. <utmpx.h>.  32-bit and 16-bit versions OK.  ckufio.c, makefile, 18 Nov 98.
  1925. Now on to IRIX 6.5.1 on the Origin:
  1926.   System: SGI Origin 200, 2xR10000 180MHz
  1927.   OpeSys: SGI IRIX 6.5.1 + Patches
  1928.   Memory: 256 MB
  1929.   DiskSp: 15.8 GB
  1930. Builds and runs fine.  Speeds up to 115200 supported, but there's no way to
  1931. test if they actually work.  Noted that the Indy can run the Origin binary
  1932. and vice versa, good.  No changes needed.
  1933. Fix from Jeff for a problem that causes "set host *" to loop, eating up CPU
  1934. time, till the connection comes in.  Built the result on HP-UX 10.20, since
  1935. that's where the looping problem was reported.  Checked against C-Kermit 6.0,
  1936. which makes the CPU lights come on solid, and rises rapidly to the top of
  1937. "top", consuming 95% of the CPU.  The fixed version does not make the lights
  1938. come on, and after a minute or two "top" says it uses 0% of the CPU.
  1939. ckcnet.c, 18 Nov 98.
  1940. Added a missing #ifndef NOHELP clause in ckuusy.c, 18 Nov 98.
  1941. Added some missing #ifdef TNCODE's in ckuus4.c so it could be built with
  1942. no network support.  18 Nov 98.  (STILL NEEDS FIXING ON VMS)
  1943. Added -DNDSYSERRLIST to OpenBSD makefile target.  19 Nov 98.
  1944. Added a solaris7g makefile entry to build on Solaris 7 with gcc.  It works
  1945. fine, except for some warnings from curses.h about redefinitions of items
  1946. that C-Kermit doesn't use (getwc, putwc, getwchar, putwchar).  This makes a
  1947. 32-bit version (sizeof int = sizeof long = 4), since gcc doesn't know how to
  1948. make a 64-bit one.  It makes Telnet connections OK and transfers files over
  1949. them OK.  When dialed in to a Sun serial port, file transfer is a bit flaky
  1950. when sending files out (but this particular machine is known to have flaky
  1951. serial ports).  Makefile, 19 Nov 98.
  1952. Added a couple more missing #ifdefs to allow linking after compilation without
  1953. network supportk.  ckcmai.c, ckuus4.c, 19 Nov 98.
  1954. Changed password argument to zvpass() and kpass() from "passwd" to "p", since
  1955. passwd conflicts with a struct name, which is fatal in some builds.  ckufio.c,
  1956. 19 Nov 98.
  1957. Added #ifdefs to protect all the new gettimeofday() calls from having 2 args
  1958. in Motorola System V/88 R4.  ckutio.c, 19 Nov 98.
  1959. Built OK on VMS 5.5 with NONET and with UCX 2.0.  19 Nov 98.
  1960. While running thru the ckuins.txt testing instructions, I discovered that
  1961. ?-help doesn't work in a filename after SEND, e.g. "send *?".  This took a
  1962. good bit of sleuthing but eventually I fixed with apparently no ill effects.
  1963. gtword(): ckucmd.c, 19 Nov 98.
  1964. Changed FAST macro definition for IRIX65 to not restrict send packets to
  1965. 4000 bytes, since this version does not have the Telnet server bug noted in
  1966. IRIX 6.2 and earlier.  ckuus5.c, 19 Nov 98.
  1967. Added MAINTYPE symbol, which can be defined on the CC command line to answer
  1968. complaints about "main: return type is not blah".  ckcmai.c, 20 Nov 98.
  1969. Added a note about MAINTYPE to the openbsd makefile entry, pending
  1970. verification.  20 Nov 98.
  1971. From Jeff: Symbols and keywords added for VT220PC and VT320PC terminal types.
  1972. ckuusr.h, ckuus[57].c, 23 Nov 98.
  1973. Changed zvpass(), after authenticating the user, to always use setuid() and
  1974. setgid(), rather than set[r]e{u,g}id().  This eliminates a lot of #ifdefs
  1975. and it's what we want: once we establish ourselves as the authenticated user,
  1976. we do not need or want any possibility of switching back to root.
  1977. ckufio.c, 23 Nov 98.
  1978. Readjusted MAINTYPE to take precedence over all other declarations.
  1979. ckcmai.c, 23 Nov 98.
  1980. Made #ifdefs around main() declaration in wart agree with those in kermit,
  1981. including MAINTYPE.  ckwart.c, 23 Nov 98.
  1982. Added symbol HWPARITY and parsing for "hardware parity" (8 data bits plus
  1983. parity generated by system / driver / hardware outside Kermit).  Defined
  1984. HWPARITY for SVORPOSIX.  Builds OK (e.g. on SunOS) where HWPARITY not defined,
  1985. and also on Solaris, where it is.  ckcdeb.h, ckcmai.c, ckuus[34].c, 23 Nov 98.
  1986. Will fill in the action code tomorrow...
  1987. Fixed some #ifdefs to allow successful compilation and linking with -DNOLOGIN.
  1988. ckuus5,c, cku[ft]io.c, 24 Nov 98.  Builds OK now on Motorola SV88R4.0 and
  1989. SV68R3.6.  Also on Solaris 2.6 Intel.
  1990. Back to hardware parity.  UNIX APIs do not offer any way to set mark or space
  1991. parity.  So... SET PARITY HARDWARE { EVEN, ODD }.  If some other platforms
  1992. have APIs for 8M or 8S we can add them later.  This setting takes effect only
  1993. on SET LINE devices, not on network connections and not in remote mode.
  1994. Added SET STOP-BITS { 1, 2 }, only if HWPARITY is defined.  ckuusr.[ch],
  1995. ckuus[23].c, ckutio.c, 24 Nov 98.
  1996. For convenience and familiarity, added SET SERIAL { 7E1,7E2,...8N1,8E2,... }.
  1997. Any choice with 2 stop bits or 8 data bits + parity is available only if
  1998. HWPARITY is defined.  ckuusr.[ch], ckuus3.c, ckutio.c, 24 Nov 98.
  1999. Updated SHOW COMM to display new parity settings, stop bits, etc.
  2000. ckuus4.c, 24-25 Nov 98.
  2001. Discovered that ckucns.c, unlike ckucon.c, failed to assign the v(trigger)
  2002. value when a TERM TRIGGER was encountered.  Fixed in ckucns.c, 25 Nov 98.
  2003. Discovered that both ckucns.c and ckucon.c failed to reset the v(trigger)
  2004. value upon entry to CONNECT, so a subsequent exit could still show a previous
  2005. trigger value.  Fixed in both, 25 Nov 98.
  2006. Changed the LOG command to allow logging to pipes.  Very handy.  See Section
  2007. 1.13 of ckermit2.txt.  ckuus4.c, 25 Nov 98.
  2008. Added transparent printing within #ifdef XPRINT, 25-26 Nov 98:
  2009.  . UNIX only, and then only in the ckucns.c module.
  2010.  . SET TERM PRINT { ON, OFF }: ckuusr.h, ckuus7.c.
  2011.  . Added to SHOW TERM.  ckuus5.c.
  2012.  . Documented in ckermit2.txt Section 3.3.
  2013. Much fancy footwork required to pass all material through transparently,