temporarily add .txt and .ini files from ckermit-211
authorIan Beckwith <ianb@erislabs.net>
Fri, 24 Jun 2011 02:29:52 +0000 (03:29 +0100)
committerIan Beckwith <ianb@erislabs.net>
Fri, 24 Jun 2011 02:29:52 +0000 (03:29 +0100)
12 files changed:
ckaaaa.txt [new file with mode: 0644]
ckc211.txt [new file with mode: 0644]
ckcbwr.txt [new file with mode: 0644]
ckccfg.txt [new file with mode: 0644]
ckcplm.txt [new file with mode: 0644]
ckermit.ini [new file with mode: 0644]
ckermit70.txt [new file with mode: 0644]
ckermit80.txt [new file with mode: 0644]
ckermod.ini [new file with mode: 0644]
ckubwr.txt [new file with mode: 0644]
ckuins.txt [new file with mode: 0644]
ckututor.txt [new file with mode: 0644]

diff --git a/ckaaaa.txt b/ckaaaa.txt
new file mode 100644 (file)
index 0000000..efa83a5
--- /dev/null
@@ -0,0 +1,385 @@
+ckaaaa.txt                                                        10 Apr 2004
+
+                          C-KERMIT VERSION 8.0.211
+                             OVERVIEW OF FILES
+
+              Communications software for UNIX and (Open)VMS.
+
+                      And in former versions also for:
+                         Stratus VOS, AOS/VS, QNX,
+            Plan 9, OS-9, Apollo Aegis, and the Commodore Amiga.
+                     The Apple Macintosh, the Atari ST.
+
+                 The Kermit Project - Columbia University
+
+           http://www.columbia.edu/kermit/ - kermit@columbia.edu
+
+
+  Copyright (C) 1985, 2004,
+    Trustees of Columbia University in the City of New York.
+    All rights reserved.  See the C-Kermit COPYING.TXT file or the
+    copyright text in the ckcmai.c module for disclaimer and permissions.
+
+
+DOCUMENTATION
+
+  C-Kermit is documented in the book "Using C-Kermit", Second Edition, by
+  Frank da Cruz and Christine M. Gianone, Digital Press, ISBN 1-55558-164-1,
+  supplementated by Web-based updates for C-Kermit 7.0 and 8.0.
+
+PLATFORMS
+                   Security
+   Name            Included   Last Updated
+
+   Unix               Yes     8.0.211  10 Apr 2004
+   (Open)VMS          No      8.0.208  10 Apr 2004
+   Windows (K95)      Yes     8.0.208  14 Mar 2003  (K95 2.1)
+   OS/2 (K95)         Yes     8.0.208  14 Mar 2003  (K95 2.1)
+   DG AOS/VS          No      7.0.196   1 Jan 2000
+   Stratus VOS        No      7.0.196   1 Jan 2000
+   Bell Plan 9        No      7.0.196   1 Jan 2000
+   Microware OS-9     No      7.0.196   1 Jan 2000
+   Commodore Amiga    No      7.0.196   1 Jan 2000
+   Macintosh          No      5A(190)  16 Aug 1994  (Mac Kermit 0.991)
+   Atari ST           No      5A(189)  30 Jun 1993
+
+QUICK START FOR FTP USERS
+
+  If you have a Web browser, go to:
+
+    http://www.columbia.edu/kermit/ckermit.html
+
+  And take it from there.  Otherwise...
+
+  The definitive FTP source for Kermit software is kermit.columbia.edu.
+  Kermit software obtained from other FTP sites is not necessarily complete
+  or up to date, and may have been modified.
+
+C-Kermit for UNIX computers that have a C compiler and 'make' program:
+
+  Directory kermit/archives, binary mode, file cku211.tar.Z or cku211.tar.gz
+
+  This is a compressed tar archive of UNIX C-Kermit source code, makefile, and
+  other files.  It unpacks into its current directory, so download it into a
+  fresh directory.  Transfer in binary mode, uncompress (or gunzip), untar (tar
+  xvf cku211.tar), and then give the appropriate "make" command to build for
+  your UNIX system; read the comments in the makefile and ckuins.txt for
+  further info.
+
+C-Kermit for VMS:
+
+  If you have VMS UNZIP, get the file kermit/archives/ckv211.zip in binary
+  mode, unzip, and build with CKVKER.COM.
+
+Others:  In the kermit/f or kermit/test directories under the appropriate
+prefixes, explained below.
+
+
+INSTALLATION
+
+Installation procedures depend on the system.  Please read the CK?INS.TXT,
+if any, file for your system (?=U for UNIX, V for VMS, etc).  Please note
+the naming and placement for the initialization files:
+
+  CKERMIT.INI
+    The standard initialization file.  Please leave it as is unless you
+    know what you are doing and (if you are changing it or replacing it
+    for others to use) you are prepared to support it.  Rename this file
+    to .kermrc in UNIX, OS-9, BeBox, or Plan 9.  In Stratus VOS, rename
+    it ckermit.ini (lowercase).  On multiuser systems, it goes either in the
+    (or EACH) user's home (login) directory, or else in a common shared
+    place if C-Kermit has been configured to look in that place (see
+    ckccfg.txt for details).
+
+  CKERMOD.INI
+    A *sample* customization file.  On multiuser OS's, a copy of this file
+    goes in each user's home directory, and then each user edits it to suit
+    her needs and preferences; e.g. by defining macros for their common
+    connections.
+
+  DIALING DIRECTORIES
+    Dialing directory files can be system-wide, per-group, or per-user, or
+    any combination.  For example, there can be a corporate wide directory
+    shared by all users, a supplemental directory for each division or
+    department, and a personal directory for each user.  Simply be sure the
+    dialing directory files are identified a SET DIAL DIRECTORY command in
+    the user's (or the system-wide) C-Kermit initialization file, or in the
+    environment variable (logical name, symbol) K_DIAL_DIRECTORY.  (The
+    standard initialization file looks by default in the user's home or login
+    directory.)  When installing C-Kermit on multiuser platforms from which
+    users will dial out, you can also set environment variables for area
+    code, country code, and the various dialing prefixes as described on page
+    478 of "Using C-Kermit" (second edition), so users don't have to worry
+    about defining these items themselves.   Network directories and service
+    directories can also be set up in a similar manner.
+
+  DOCUMENTATION
+    In UNIX, the general C-Kermit man page (or one of the versions tailored
+    for a specific platform, like HP-UX or Solaris) should be installed in
+    the appropriate place.  In VMS, the VMS help topic (CKVKER.HLP) should
+    be installed as described in CKVINS.TXT.  Plain-text documentation such
+    as CKERMIT2.TXT should be put in whatever place people are accustomed
+    to looking.
+
+FILES AND FILE NAMING CONVENTIONS
+
+C-Kermit is a family of Kermit programs for many different computer systems.
+The program shares a common set of system-independent file transfer protocol
+modules, written in the C language.  System-dependent operations are collected
+into system-specific modules for each system.
+
+C-Kermit file names all start with the letters "CK", followed by a single
+letter indicating the subgroup.  When referring to these files in the UNIX,
+AOS/VS, or VOS environments, use lowercase letters, rather than the uppercase
+letters shown here.  Subgroups:
+
+  _: Security/Authentication/Encryption code, possibly regulated by law
+  a: General descriptive material and documentation
+  b: BOO file encoders and decoders (obsolete)
+  c: All platforms with C compilers
+  d: Data General AOS/VS
+  e: Reserved for "ckermit" files, like CKERMIT.INI, CKERMIT80.TXT
+  f: (reserved)
+  g: (reserved)
+  h: (reserved)
+  i: Commodore Amiga (Intuition)
+  j: (unused)
+  k: (unused)
+  l: Stratus VOS
+  m: Macintosh with Mac OS
+  n: Microsoft Windows NT
+  o: OS/2 and/or Microsoft Windows 95/98/ME/NT/2000/XP/...
+  p: Bell Labs Plan 9
+  q: (reserved)
+  r: DEC PDP-11 with RSTS/E (reserved)
+  s: Atari ST GEMDOS (last supported in version 5A(189))
+  t: DEC PDP-11 with RT-11 (reserved)
+  u: UNIX or environments with UNIX-like C libraries
+  v: VMS and OpenVMS
+  w: Wart (Lex-like preprocessor, used with all systems)
+  x: (reserved)
+  y: (reserved)
+  z: (reserved)
+  0-3: (reserved)
+  4: IBM AS/400 (reserved)
+  5-8: (reserved)
+  9: Microware OS-9
+
+Examples:
+
+  ckaaaa.txt - This file
+  ckufio.c   - File i/o for UNIX
+  ckstio.c   - Communications i/o for the Atari ST
+  makefile   - makefile for building UNIX C-Kermit
+  ckpker.mk  - makefile for building Plan 9 C-Kermit
+  ckvker.com - build procedure for VMS C-Kermit
+
+IMPORTANT FILES (use lowercase names on UNIX, VOS, or AOS/VS):
+
+  ckaaaa.txt  - This file (overview of the C-Kermit files).
+                For system-specific distributions, this will normally
+                be replaced by a system-specific READ.ME file.
+
+  ckermit70.txt - Updates: Supplement to "Using C-Kermit", 2nd Ed, for 7.0.
+  ckermit80.txt - Updates: Supplement to "Using C-Kermit", 2nd Ed, for 8.0.
+  ckututor.txt  - C-Kermit Tutorial for Unix (plain text)
+  ckcbwr.txt  - "Beware file" (limitations, known bugs, hints), general.
+  ckermit.ini - Standard initialization file (rename to .kermrc in UNIX, OS-9)
+  ckermod.ini - Sample customization file (rename to .mykermrc in UNIX, OS-9)
+
+The following can be found at the Kermit FTP site:
+
+  ckermit.kdd - Sample dialing directory file (rename to .kdd in UNIX, OS-9)
+  ckermit.knd - Sample dialing directory file (rename to .knd in UNIX, OS-9)
+  ckermit.ksd - Sample services directory file (rename to .ksd in UNIX, OS-9)
+  ckedemo.ksc - Demonstration macros from "Using C-Kermit"
+  ckepage.ksc - Ditto
+  ckevt.ksc   - Ditto
+
+UNIX-specific files:
+
+  ckuins.txt - UNIX-specific installation instructions.
+  ckubwr.txt - UNIX-specific beware file.
+  ckuker.nr  - "man page" for UNIX.
+
+VMS-specific files:
+
+  ckvins.txt - VMS-specific installation instructions.
+  ckvbwr.txt - VMS-specific beware file
+  ckvker.hlp - VMS C-Kermit HELP topic (needs updating).
+
+DG AOS/VS-specific files:
+
+  ckdins.txt - Data General AOS/VS C-Kermit installation instructions
+  ckdbwr.txt - AOS/VS "beware" file
+  ckd*.cli   - Procedures for building AOS/VS C-Kermit
+
+The following files are of interest mainly to programmers and historians
+(find them at the Kermit ftp site):
+
+  ckcker.ann - Release announcements.
+  ckccfg.txt - Configuration information (feature selection), general.
+  ckcplm.txt - Program logic manual (for programmers).
+  ckc211.txt - Program update history for edit 201-211.
+  ckc200.txt - Program update history for edit 198-200 (big)
+  ckc197.txt - Program update history for edit 195-197 (big)
+  ckc190.txt - Program update history for edits 189-190 (big).
+  ckc188.txt - Program update history, edits 179-188 (big).
+  ckc178.txt - Program edit history, 5A edits through 178 (very big).
+  ckcv4f.txt - Program edit history, version 4F.
+  ckcv4e.txt - Program edit history, version 4E.
+
+BINARIES
+
+If you have FTP access to kermit.columbia.edu (also known as
+kermit.cc.columbia.edu, ftp.cc.columbia.edu), you can also retrieve various
+C-Kermit binaries from the directory kermit/bin/ck*.*, or more conventiently
+from the web page:
+
+  http://www.columbia.edu/kermit/ck80binaries.html
+
+Test versions would be in kermit/test/bin/ck*.*.  Be sure to transfer these
+files in binary mode.  The READ.ME file in that directory explains what's
+what.
+
+SOURCE FILES
+
+The source files for the UNIX version (all UNIX versions) are available in
+kermit/archives/ckuNNN.tar.Z, approximately 1MB in size.  Transfer this file
+in binary mode.  This is a compressed tar archive.  There is also a gzip'd
+version, cku211.tar.gz.  To get the binary tar archive:
+
+  mkdir kermit                   (at shell prompt, make a Kermit directory)
+  cd kermit                      (make it your current directory)
+
+  ftp kermit.columbia.edu        (make an ftp connection)
+  user: anonymous                (log in as user "anonymous", lower case!)
+  password:                      (use your email id as a password)
+  cd kermit/archives             (go to the archives directory)
+  type binary                    (specify binary file transfer)
+  get cku211.tar.Z               (get the tar archive) (or get cku192.tar.gz)
+  bye                            (disconnect and exit from ftp)
+
+  uncompress cku211.tar.Z        (at the shell prompt, uncompress the archive)
+  tar xvf cku211.tar             (extract the files from the tar archive)
+  make xxx                       (build C-Kermit for your system)
+
+(where "xxx" is the makefile entry appropriate for your system.)
+
+All C-Kermit source and other text files are also kept separately in the
+kermit/f directory.  The files necessary to build a particular implementation
+of C-Kermit are listed in the appropriate makefile or equivalent:
+
+       UNIX: makefile (or rename ckuker.mak to makefile)
+   2.11 BSD: ckubs2.mak (rename to makefile), ckustr.sed
+     Plan 9: ckpker.mk  (rename to mkfile)
+  Macintosh: ckmker.mak (rename to kermit.make, use MPW C 3.2)
+        VMS: CKVKER.COM (DCL) (and optionally also CKVKER.MMS)
+             or CKVOLD.COM (for VMS 4.x)
+      Amiga: CKIKER.MAK (Aztec C) or CKISAS.MAK (SAS C)
+   Atari ST: CKSKER.MAK
+       OS-9: ck9ker.mak or ck9ker.gcc
+     AOS/VS: ckdmak.cli, ckdcc.cli, ckdlnk.cli
+Stratus VOS: cklmak.cm
+
+Minimal source files for building selected versions (these patterns get all
+the files you need, and in some cases maybe a few extra):
+
+   UNIX:   ck[cuw]*.[cwh]  (including QNX, Plan 9, and BeBox)
+   UNIX:   ck[cuw_]*.[cwh] (Unix with security modules)
+   VMS:    ck[cuwv]*.[cwh]
+   Mac:    ck[cuwm]*.[cwhr]
+   AOS/VS: ck[cuwd]*.[cwh]
+   VOS:    ck[cwhl]*.[cwh]
+   Amiga:  ck[cuwi]*.[cwh]
+   Atari:  ck[cuws]*.[cwh]
+   OS-9:   ck[cuw9]*.[cwha]
+
+For a detailed, specific source file list for this C-Kermit release, see the
+file ckcxxx.txt, where xxx is the current C-Kermit edit number, such as 211.
+
+Finally, here is a more detailed description of the C-Kermit file naming
+conventions.  A C-Kermit filename has the form:
+
+  CK<system><what>.<type>
+
+where:
+
+<system> is described earlier in this file;
+
+<type> is the file type (use lowercase on UNIX, VOS, or AOS/VS):
+
+  c:   C language source
+  h:   Header file for C language source
+  w:   Wart preprocessor source, converted by Wart (or Lex) to a C program
+  r:   Macintosh resource file (8-bit text)
+  a:   Assembler source
+
+  txt: Plain text.
+  nr:  Nroff/Troff text formatter source for UNIX "man page"
+  mss: Scribe text formatter source
+  ps:  Typeset material to be printed on a PostScript printer
+  hlp: A VMS Help topic
+
+  ini: Initialization file
+  ksc: A Kermit Script to be executed by the TAKE command
+  kdd: A Kermit Dialing Directory
+  knd: A Kermit Network Directory
+  ksd: A Kermit Services Directory
+
+  mak: A Makefile or other build procedure (often needs renaming)
+  com: (VMS only) a DCL command procedure
+  cli: (AOS/VS only) a command procedure
+  cmd: (OS/2 only) a Rexx command procedure
+
+  boo: "boo"-encoded executable program, decode with CKBUNB program.
+  hex: "hex"-encoded executable program, decode with CKVDEH program (VMS only).
+  hqx: BinHex'd Macintosh Kermit program, decode with BinHex version 4.0.
+  uue: A uuencoded binary file, decode with uudecode or (DG only) CKDECO.
+
+  def: An OS/2 linker definitions file.
+  sh:  A UNIX shell script.
+  sed: A UNIX sed (editor) script.
+  str: A file of character strings extracted from C-Kermit (BSD 2.1x only).
+
+<what> is mnemonic (up to 3 characters) for what's in the file:
+
+NOTE: After C-Kermit 6.0, text filetypes such as .DOC and .HLP were changed
+to .TXT to avoid confusion in Windows-based Web browsers, which would
+otherwise mistake them for Microsoft Word or Windows Help documents.
+
+  aaa: A "read-me" file, like this one
+  ins: Installation instructions or procedures
+  bwr: "Beware" file -- things to watch out for, hints and tips
+  plm: Program Logic Manual
+  ker: General C-Kermit definitions, information, documentation
+
+  nnn: Digits: C-Kermit edit number (e.g. cku211.tar.gz)
+  cmd: Command parsing
+  con: CONNECT command
+  cns: CONNECT command (UNIX only - version that uses select(), not fork())
+  deb: Debug/Transaction Log formats, Typedefs
+  dia: Modem/Dialer control
+  fio: System-depdendent File I/O
+  fns: Protocol support functions
+  fn2: More protocol support functions (and FN3, ...)
+  lib: Common library routines module
+  mai: Main program
+  net: Network i/o module
+  pro: Protocol
+  scr: SCRIPT command
+  tel: Telnet protocol module
+  tio: System-dependent communications i/o & control and interrupt handing
+  sig: Signal handling module
+  usr: Interactive/script user interface
+  us2: More user interface (mainly help text)
+  us3: Still more user interface (and USR4, USR5, USR6, USR7)
+  usx: Common user interface functions
+  usy: Command-line parsing
+  xla: Character set translation module
+  uni: Unicode support
+  pty: Pseudoterminal support
+  mdb: Malloc-debugging module (not included in real builds)
+  str: Strings module (only for 2.xBSD)
+
+(End of ckaaaa.txt)
diff --git a/ckc211.txt b/ckc211.txt
new file mode 100644 (file)
index 0000000..1886725
--- /dev/null
@@ -0,0 +1,3595 @@
+C-KERMIT CHANGE LOG (Changes since 8.0.200 of 12 Dec 2001)
+
+Chronological order: Go to the bottom to find the newest edits.
+
+---8.0.200---
+
+Known bugs (+ = fixed after release):
+
+ + 1. tilde_expand() can call getcwd() with NULL arg.
+ + 2. getexedir() called too early (fatal in combination with (1)).
+ + 3. Kermit "get blah" where blah is a symlink; server refuses to send it.
+      Should not do this if GET not recursive.
+ ? 4. Dave Sneddon's report about VMS fore/background confusion.
+ + 5. FTP GET path/file doesn't work - path not stripped - but MGET works.
+ + 6. IRIX 5.3 compilation problems (have patches from Marcus Herbert)
+ X 7. Filename completion bug (see below) (deferred).
+ + 8. QNX6 herald and other problems.
+
+-------------
+
+Merged Jeff's changes, 20 Dec 2001:
+
+ . Changed all occurrences of "ttnproto == NP_TELNET" to "IS_TELNET()" to
+   account for the difference between SSH and Telnet.  ckuscr.c,
+   ckuus[3457].c, ckcnet.h, ckcfns.c, ckudia.c, ckutio.c, ckucon.c, ckucns.c.
+
+ . Moved SSH pty failure warnings.  ckuusr.c.
+
+ . Security adjustments to FTP module, plus fix an error message.  ckcftp.c.
+
+ . Adjustment of some security-related #ifdefs. ckcdeb.h, ckuus2.c, ckctel.c.
+
+ . Guard against calling getpwnam() with a NULL arg in tilde_expand() ckufio.c.
+ . Moved getexedir() call to later, where it's safe.  ckcmai.c.
+
+Added SSH ADD and many SSH SET commands from Jeff's spec.  Fixed SHOW SSH
+to not dump core if variables weren't set.  ckcker.h, ckuus[r3].c, 20 Dec 2001.
+
+C-Kermit in server mode, client says "get foo" where foo is a symlink.
+Server says "no files meet selection criteria" instead of sending the file.
+It should only refuse to follow symlinks if it's a recursive get.  Fixed
+in sgetinit(): ckcpro.w, 21 Dec 2001.
+
+More work on SSH and SET/SHOW SSH commands.  ckuus[r3].c, 21 Dec 2001.
+
+Undid Jeff's replacement of the SSH pseudoterminal allocation failure
+message, because now it comes out any time an SSH command has to be
+reparsed (in the non-SSHBUILTIN case).  ckuusr.c, 21 Dec 2001.
+
+More SSH and SET SSH command work back & forth with Jeff, plus Jeff added
+SET HOST /NET:SSH.  ckcmai.c, ckuus[r37].c, ckcdeb.h, ckuusr.h, 22 Dec 2001.
+
+Added SSH OPEN switches.  ckuusr.c, 22 Dec 2001.
+
+Added SSH CLEAR, HELP SSH, and HELP SET SSH.  ckuus[r2].c, 23 Dec 2001.
+
+From Jeff:
+ . SET TCP commands now apply to SSH
+ . SSH V2 REKEY and FORWRD-{LOCAL,REMOTE}-PORT  commands now implemented
+ . Missing DLLs automatically disable appropriate authentication mechanisms.
+ckuusr.c ckcnet.c ckuus3.c ckcmai.c ckcnet.h ckuus4.c, 26 Dec 2001.
+
+From Jeff:
+ . Remove SET SSH KEEPALIVES.
+ . Add help text for SSH AGENT { ADD, DELETE, LIST }.
+ckuus[23].c, 28 Dec 2001.
+
+Added parsing for SSH AGENT { ADD, DELETE, LIST }.  ckuusr.c, 28 Dec 2001.
+
+From Jeff:
+ . Fixed a crash that can happen when making an SSH connection.
+ . Filled in SSH AGENT actions.
+ . Changed default for strict host key check (to ASK) and help text.
+ . uploaded new binaries include ~kermit/os2test/beta/ssh-agent.exe
+ . Read man ssh-agent on ftp.kermit.columbia.edu for details on what it does.
+ckuus[r23].c, 28 Dec 2001.
+
+"ftp get path/filename" didn't work; the FTP client did not strip the path
+from the local copy of the filename when doing a GET, even though it did
+for MGET.  Diagnosis: in doftpget(), the "if (!getone && !skipthis)" statement
+lacked an "else" part for the getone case.  ckcftp.c, 28 Dec 2001.
+
+A while back Jeff reported that in FTP MGET, if you cancel a file with 'x',
+all the rest of the files arrive truncated to 0 bytes.  I tried this on both
+Unix and Windows and couldn't reproduce it.
+
+In the last-minute flurry to release C-Kermit 8.0, I thought I noticed the FTP
+client failing to update the fullscreen file-transfer display.  But it seems
+to work right, at least in Unix.  When downloading a big file with FTP, all
+the display fields are updated as expected.  But smaller files might go by too
+fast for the display to do anything.  HOWEVER, in K95 the file transfer
+display does not update itself until the end of the file, even if the file
+takes a long time to transfer.  This happens in both the Console and GUI
+versions.  A thread thing?  (Jeff says no.)  Yet the same display works fine
+on Telnet connections.
+
+In IRIX 5.3, the select()-based CONNECT module had to include <sys/time.h>
+or else it blew up with "struct timeval" unknown.  Since there already was
+a SYSTIMEH CFLAG, I added the #include within #ifdef SYSTIMEH..#endif and
+rebuilt with KFLAGS=-DSYSTIMEH, only to discover that the irix5* targets
+didn't bother to propogate KFLAGS.  Fixed in ckucns.c, makefile, 30 Dec 2001.
+
+Increased IRIX5x Olimit from 2400 to 3000 because of ckuus[34].c.  Added
+-ansi, since (Marcus Herbert reported) we were not actually getting ANSI-C
+compilation even though CK_ANSIC was defined.  But now that we are, we get
+warnings in <netinet/tcp.h>, which is included by ckcnet.h:
+
+  bit-field 'th_off' type required to be int, unsigned int, or signed int.
+  (3.5.2.1(30))
+         u_char  th_off:4,
+         ------  ^
+Tough.  makefile, 30 Dec 2001.
+
+But adding -ansi to the IRIX 5x targets also make compilation bomb whenever we
+referenced fdopen() or popen(), which evidently don't have prototypes in any
+of the header files.  Luckily we already have CFLAGS for this occasion too:
+DCLFDOPEN and DCLPOPEN.  Added these to the irix51 target.  Also had to copy
+the fdopen()-popen() prototype section to ckuusx.c, which has a new reference
+to fdopen() in a workaround for the curses console buffering bug.  makefile,
+ckuusx.c, 30 Dec 2001.
+
+The QNX6 version did not receive a proper herald (it announced itself as
+"unknown version".  Reshuffled #ifdefs in ckuver.h, added display of QNX6
+and NEUTRINO symbols to ckuus5.c, 30 Dec 2001.
+
+Lucas Hart sent in a patch for the VMS problem.  Apparently it was even worse
+than Dave Sneddon had reported: 8.0 couldn't run at all under Batch.  ckvtio.c,
+31 Dec 2001.
+
+A major obstacle to the usability of the FTP client is that certain commands
+don't behave as FTP users expect: CD, DIR, DELETE, MKDIR, etc, which are local
+rather remote, and there are no LCD (etc), USER, or ACCOUNT commands.  We
+could fix this by adding an FTP command-language personality, but file
+management commands can also be remote or local on connections to Kermit
+servers too.  So:
+
+SET LOCUS { LOCAL, REMOTE, AUTO }
+  Sets the locus for unprefixed file management commands.
+  When LOCAL, a REMOTE (or R) prefix is required for
+  to send file management commands to a remote server (e.g. RCD, RDIR).
+  When REMOTE, an L prefix is required to issue local file management
+  commands (e.g. LCD, LDIR).  The word LOCAL can't be used as a prefix
+  since it is used for declaring local variables.
+
+This applies to all types of connections, and thus is orthogonal to SET
+GET-PUT-REMOTE, which selects between Kermit and FTP for remote file-transfer
+and management commands.
+
+The default LOCUS is AUTO, which means we switch to REMOTE whenever an FTP
+connection is made, and to LOCAL whenever a non-FTP connection is made,
+and switch back accordingly whenever a connnection is closed.
+
+Implementation (31 Dec 2001):
+ . None of this is compiled if LOCUS is not defined.
+ . Added XYLOCUS (SET LOCUS) and LOCUS definitions: ckuusr.h.
+ . Override by defining NOLOCUS (which inhibits definition of LOCUS).
+ . Added LOCUS to SET keyword table: ckuusr.c.
+ . Added locus & autolocus variables: ckuusr.c.
+ . Added SET LOCUS parsing and variable setting: ckuus3.c.
+ . Added display of LOCUS setting to SHOW COMMAND: ckuus5.c.
+ . Added automatic locus setting to setlin(): ckuus7.c.
+ . Added automatic locus setting to ftpopen() and ftpclose(): ckcftp.c.
+
+How to catch all the places where a Kermit connection is closed?  Turns out
+we've done this before, when we added the connection log.  So I made
+dologend() take care of locus switching.  But dologend() was not compiled in
+if certain symbols were defined, such as NOLOCAL, or not defined, such as
+CKLOGDIAL.  So I (a) rearranged the #ifdefs so that even if these would
+otherwise have obliviated dologend(), now they leave a piece of it for
+locus-setting; (b) moved the prototype out of #ifdefs; and (c) took all calls
+to it out of #ifdefs.  ckcker.h, ckcfn2.c, ckcmai.c, ckucns.c, ckucon.c,
+ckuus[r347x].c, 31 Dec 2001.
+
+Added locus checking to the following commands: DIRECTORY, CD/CWD, CDUP,
+DELETE, PWD, MKDIR, RMDIR, RENAME.  ckuusr.c, 31 Dec 2001.
+
+Added LDIRECTORY, LCD/LCWD, LCDUP, LDELETE, LPWD, LMKDIR, LRMDIR,
+LRENAME.  ckuusr.[ch], 31 Dec 2001.
+
+Added USER and ACCOUNT commands, which are the same as FTP USER and FTP
+ACCOUNT.  ckuusr.[ch], ckcftp.c, 31 Dec 2001.
+
+Since automatic locus switching could be a big surprise for most people, I
+printed message any time it changed.  ckcftp.c, ckuus[37].c, 31 Dec 2001.
+
+Added help text for the new L commands and filled in missing HELP text for
+SET GET-PUT-REMOTE, CDUP, MKDIR, and RMDIR.  ckuus2.c, 31 Dec 2001.
+
+Changed help text of CD, DIR, etc, for LOCUS.  Changed the help text for
+RCD, RPWD, RDEL, RDIR, etc, to mention that they also work with FTP servers.
+Updated HELP REMOTE for this too.  ckuus2.c, 31 Dec 2001.
+
+Made sure code builds with NOLOCAL, NOLOGDIAL, and NOLOCUS (it does).
+
+The IKSD command, when given with a /USER: switch, sends the user ID to the
+IKSD.  But the SET HOST /USER: command does not, when making a connection to a
+Kermit service.  This makes it impossible to script IKSD interactions using
+only client commands.  Furthermore, even if you include a /PASSWORD switch
+with the IKSD command, it does not send the password.  I added code near the
+bottom of setlin() to do this.  If we have a connection to a Kermit service
+and a /USER: switch was given, then we attempt a REMOTE LOGIN.  If a
+/PASSWORD: switch was not given then if the username is "ftp" or "anonymous",
+we automatically supply a password of user@host; otherwise we prompt for a
+password.  If a /USER: switch was not given, it acts like before.  It all
+works, but it might not be the best way (or place) to do it.  setlin():
+ckuus7.c, 31 Dec 2001.
+
+  NOTE: The above change doesn't help with IKSD /USER:anonymous,
+  the server prompts for password anyway, not sure why.
+
+  NOTE 2: What about secure authentication?  We have to test to see
+  if user was already authenticated before sending the login packet.
+
+Added /opt/kermit and /opt/kermit/doc to info_dir[] list (for Solaris).
+ckuus5.c, 31 Dec 2001.
+
+From Jeff: new Help text for SET TERM FONT (K95 GUI).  ckuus2.c, 1 Jan 2002.
+
+More work on help text for file management commands -- e.g. we can't lump
+the L-commands together with the unprefixed ones; they need separate entries.
+Also: added missing HELP REMOTE PWD, improved the default case (in which
+help text had been omitted for a valid command).  ckuus2.c, 1 Jan 2002.
+
+It seems VMS C-Kermit was pretty much ignoring the -B (force background) and
+-z (force foreground) command-line options.  Fixed in congm(): ckvtio.c,
+1 Jan 2002.
+
+Tested the SET LOCUS business with VMS C-Kermit, which does not have a
+built-in FTP client.  Of course in this case there is no automatic locus
+switching, but SET LOCUS REMOTE works nicely on IKSD connections.
+
+From Jeff:
+ . #ifdef adjustments for LOCUS changes.
+ . SSH KEY CREATE /TYPE:SRP.
+ . Fix \v(serial) to not be 8N2 by default if speed is 0.
+ . Don't let doexit() run if sysinit() hasn't been called first.
+ckuus[r247x].c, 2 Jan 2002.
+
+Made SET BACKGROUND { ON, OFF } do exactly the same as -B and -z options.
+ckuus3.c, 2 Jan 2002.
+
+Updated user-visible copyright dates to 2002 (but still need to do all the
+source-module comments).  ckcmai.c, ckuus[25].c, 2 Jan 2002.
+
+Rearranged #include <sys/time.h> in ckucns.c that was done for IRIX 5.3,
+to avoid conflicts in SV/68 R3v6.  3 Jan 2002.
+
+From Dave Sneddon: Code changes in VMS sysinit() and congm() to work around
+problems in batch, SPAWN'd, etc, and change CTTNAM from TT: to SYS$INPUT:.
+ckcdeb.h, ckvtio.c, 3 Jan 2002.
+
+From Jeff:
+ . Fixed typo in definition of CTTNAM for VMS.  ckcdeb.h
+ . Moved macro definitions for SSHBUILTIN from ckuus3.c to ckuusr.h
+   so they can be referenced in ckuus7.c
+ . Added SSH functionality to SET HOST:
+     SET HOST /NET:SSH /CONNECT hostname [port] /switches
+ . Fixed SET NET TYPE so it won't reject SSH if SSH is installed.
+ . Changes to allow IKSD to continue functioning.  Somehow this minor change
+   to ckcmai.c got lost in one of the back and forth exchanges.
+ . HELP TEXT for UCS2 kverb
+ . Fix a problem in K95 where multiple threads could be attempting to
+   send a telnet negotiation simultaneously.
+ckcmai.c ckcdeb.h ckuus2.c ckuus3.c ckuusr.c ckuusr.h ckuus7.c ckctel.c
+ck_crp.c ckuat2.h ckuath.c, 4 Jan 2002.
+
+From Jeff:
+
+  Peter Runestig complaining that the Telnet Forward X code was corrupting
+  data.  This resulted in a very thorough examination of the telnet module
+  code and a discovery of some rather significant problems.  The root of the
+  problems is the lack of thread safety.  To correct this problem the
+  following was done.
+
+  All code (regardless of module) which outputs telnet commands is placed
+  into a mutex region to ensure that competing output threads do not result
+  in interleaving their output.  This could happen for instance when the
+  forward-x thread is forwarding data and the user changes the window size
+  or sends an AYT or BREAK.  Next the buffer used for input and output
+  processing were identical.  This means that output data could be treated
+  as input or vice versa.  Ugh....
+
+  I also spent some more time cleaning up setlin().  Mostly reorganizing the
+  code into single if (...) blocks so that breaking it up will be easier.
+
+ckctel.c ckuus7.c, 4 Jan 2002.
+
+Updated internal copyright notices.  All modules, 5 Jan 2002.
+
+From Jeff:
+  More of same, plus new makefile target and changes from Spike Gronim
+  for freebsd44+srp+openssl.
+ckcdeb.h ckcnet.c ckctel.c ckuus7.c ck_ssl.c makefile, 5 Jan 2002.
+
+Some minor updates and fixes to SSH and SET SSH help text.
+ckuus2.c, 6 Jan 2002.
+
+Added SET RGB-COLORS for GUI.  ckuusr.[ch], ckuus3.c, 6 Jan 2002.
+
+From Jeff: More Telnet changes, Debug semaphores for K95, etc: ckcdeb.h,
+ckuusr.h, ckuus[r35x].c, ckctel.[ch], ckuath.c, 7 Jan 2002.
+
+Added --xpos:n --ypos:n, SET GUI WINDOW POSITION x y, and changed SET
+RGB-COLORS to SET GUI RGBCOLOR.  Action needs to be filled in (in setguiwin()
+in ckuus3.c), and gui_xpos and gui_ypos need to be defined in cko???.c.
+ckuusr.h, ckuus[r3y].c, 7 Jan 2002.
+
+Added --fontname:name --fontsize:name (and facename as synonym for fontname).
+ckuusr.h, ckuus[7y].c, 7 Jan 2002.
+
+Moved GUI (not OS/2) SET TERM FONT code in ckuus7.c to its own routine,
+setguifont(), in ckuus3.c, and made GUI SET TERM FONT call this routine,
+and also made SET GUI FONT call the same routine.  ckuus[37].c, 7 Jan 2002.
+
+Added --termtype:, --height:, --width:, --user:.  Also added symbols for
+--telnet:, --ssh:, --ftp:, --[remote-]charset, and --password:, but didn't
+fill them in.  --password: is probably not a good idea (but we allow it for
+FTP); the others involve a lot of code-shuffling and reconciliation, which
+I'll try to do when I get a chance (especially the connection ones, which
+can be done as part of the setlin() restructuring).  ckuusr.h, ckuusy.c,
+8 Jan 2002.
+
+Also I tried commenting out the #ifndef KUI..#endif's around SET TERMINAL
+CHARACTER-SET (easier said than done because a crucial #endif was mislabeled).
+Let's see if it compiles & works...  ckuus7.c, 8 Jan 2002
+
+Added FTP [ OPEN ] /NOINIT, meaning don't send REST, STRU, and MODE commands
+upon making an FTP connection.  This allows connection to servers that close
+the connection (or worse) when given these commands (e.g. Linux 2.4 TUX 2.0
+FTP server).  ckcftp.c, 8 Jan 2002.
+
+Looked at adding caller ID support for the ANSWER command:
+
+ . SET ANSWER CALLER-ID { ON, OFF }
+ . SET ANSWER RINGS <number>
+ . \v(callid_xxx) xxx = { date, time, name, nmbr, mesg }
+ . CKD_CID modem capability
+ . Set CKD_CID for modems that have it.
+ . A quick survey shows:
+   - USR V.90:      No (but Jeff says some USRs have it).
+   - V.250:         No
+   - Lucent Venus:  No
+   - USR:           #CID=1 (the ones that have it -- X2?)
+   - Diamond Supra: #CID=1
+   - Rockwell 56K:  #CID=1
+   - PCTEL:         #CID=1
+   - Zoltrix:       +VCID=1
+   - Conexant:      +VCID=1
+ . Since there are different commands to enable caller ID reporting,
+   we need a new field in struct MDMINF.
+ . SHOW MODEM and SHOW DIAL would need updating.
+ . etc etc...
+
+This is all way too much for now so I just did the setting of the \v(callid_*)
+variables.  These are reset at the beginning of an ANSWER command, and then
+set by the ANSWER command if they come in; thus they persist from the time
+they are collected until another ANSWER command is given.  To take advantage
+of autoanswer, the user has to enable it in the modem (all the modems I found
+that support it have it disabled by default), and also has to set the number
+of rings to at least 2.  This can be done with (depending on the modem):
+
+  set modem command autoanswer on ATS0=2#CID=1\{13}
+  set modem command autoanswer on ATS0=2+VCID=1\{13}
+
+and undone with:
+
+  set modem command autoanswer on ATS0=1#CID=0\{13}
+  set modem command autoanswer on ATS0=1+VCID=0\{13}
+
+The variables can be accessed only after the call is answered.  Therefore the
+only way to refuse a call is to answer it, inspect the variables, and then
+hang it up if desired.  Future Kermit releases can do this more nicely (as
+sketched out above.)  Also while I was in the dialing code, I added result
+code VCON (= VOICE), used by several of the newer modems.  These changes are
+untested.  The SET ANSWER command is written but commented out.  ckuusr.h,
+ckcker.h, ckuus[r3].c, ckudia.c, 8 Jan 2002.
+
+From Jeff: fixes to --termtype:, --height:, --width:, --user:, and filling in
+of --rcharset:, which required extracting code from settrm() into a separate
+parse-method-independent remote character-set setting routine.  ckuus[7y].c,
+8 Jan 2002.
+
+From Jeff: More work on TERMINAL CHARACTER-SET code reorganization, and
+reinstatement of SET TERMINAL CHARACTER-SET in K95G.  Also, fix char/CHAR
+warnings in Telnet module.  ckuus7.c, ckctel.c, 9 Jan 2002.
+
+Made SET TERM CHARACTER-SET visible for all builds, including K95G, and filled
+in HELP text for it.  ckuus[27].c, 9 Jan 2002.
+
+Added help text for new extended options.  ckuusy.c, 9 Jan 2002.
+
+Commented out the return(-2) statement at the end of xgnbyte() to make the
+"Statement not reached" errors go away, after checking to make sure that there
+was no path that could fall through to the end.  I'm 99.99% sure there isn't,
+but that doesn't mean that some compilers might not still complain.  ckcfns.c,
+9 Jan 2002.
+
+From Jeff: fix typo in the K95 extended-option help text; add more
+semaphores to network i/o.  ckuusy.c, ckcnet.c, 10 Jan 2002.
+
+Undid ansiisms in set{lcl,rem}charset() declarations.  ckuus7.c, 10 Jan 2002.
+
+Removed a duplicated clause from the install target.  makefile, 10 Jan 2002.
+
+From Jeff: more semaphores.  ckcnet.c, 11 Jan 2002.
+
+Moved references to tmpusrid and tmpstring out of NOSPL #ifdefs -- they can
+be used with NOSPL.  setlin(): ckuus7.c, 13 Jan 2002.
+
+Made a dummy dologend() routine outside of #ifndef NOICP, so we don't have
+to enclose every reference to dologend in #ifdefs.  (I had added a bunch of
+calls to dologend() throughout the code to handle automatic LOCUS switching.)
+ckuus3.c, 13 Jan 2002.
+
+Moved "extern int nettype" outside of NOICP #ifdefs in ckuus4.c for NOICP
+builds.  13 Jan 2002.
+
+Moved a misplaced #ifdef in the VERSION command.  ckuusr.c, 13 Jan 2002.
+
+Did 81 different feature-selection builds on Linux (RH 7.0), all OK after the
+changes listed above for today.  13 Jan 2002.
+
+Added prototypes for set{rem,lcl}charset().  ckcxla.h, 13 Jan 2002.
+
+Added ckcxla.h to dependencies for ckuusy.c.  ckvker.com, 13 Jan 2002.
+
+Made a correction to the HELP SET LOCUS text and supplied a missing comma
+for HELP REMOTE.  ckuus2.c, 13 Jan 2002.
+
+Built OK on HP-UX 11.11 (K&R and ANSI), Solaris 8 (cc), Solaris 2.5.1 (gcc),
+SunOS 4.1.3 (cc and gcc), VMS 7.1 (DEC C, net and nonet), Unixware 7.1.1,
+Tru64 4.0G, HP-UX 10.20 (K&R), AIX 4.3.3, FreeBSD 2.2.8, Slackware 8.0, IRIX
+6.5.13f, IRIX 5.3 (??? Can't tell -- the computer ran out of swap space -- but
+it was OK a few days ago), VMS 5.5-2 (VAX C, UCX + nonet)...  HP-UX 9.05, ...
+
+Some corrections to comments in HP targets from PeterE.  makefile, 14 Jan 2002.
+
+Corrections to prototypes for set{rem,lcl}charset() (VOID, not void) from Jeff.
+ckcxla.h, 14 Jan 2002.
+
+Builds, cont'd...  SINIX 5.42, Red Hat Linux 5.2 on i386, SuSE 7.0 on S/390, 
+Red Hat 7.1 on IA64, QNX 4.25, HP-UX 5.21/WinTCP, ..., 
+
+Dell Coleman <dell@aleph.tum.com> noticed that in AIX, the COPY command always
+says "Source and destination are the same file" when the destination file
+doesn't exist.  This is because in AIX, realpath() fails with ENOENT (errno
+2).  The zfnqfp() code already accounts for this, but evidently not well
+enough.  So I did what I should have done long ago.  zfnqfp() was originally
+accomplished with do-it-yourself code.  Later I added support for realpath(),
+and partitioned the routine into mutually exclusive compile-time sections:
+#ifdef CKREALPATH realpath()... #else do-it-yourself... #endif.  But if
+realpath() failed, there was no recourse to the do-it-yourself code.  Today I
+replaced the #else with the #endif, so the do-it-yourself part is always
+included and is executed if the realpath() call fails.  Built and tested on
+AIX 4.3.3 and Solaris 2.5.1, as well as on Linux with and without the
+realpath() code included.  zfnqfp(): ckufio.c, 16 Jan 2002.
+
+Separated K95 and C-Kermit test version numbers, so C-Kermit can be RC.02
+while K95 is Beta.01.  ckcmai.c, 16 Jan 2002.
+
+Inhibited 0-length writes by conol() and conoll(), since they cause big
+trouble with the AIX 4.3.3 pty driver, e.g. when you have an SSH connection
+into AIX and run C-Kermit there.  ckutio.c, 16 Jan 2002.
+
+Suppressed "Switching LOCUS..." messages from FTP client when it was invoked
+from the command line.  ckcfns.c, 17 Jan 2002.
+
+Dave Sneddon noticed that FOPEN /APPEND gets "?Write access denied" in VMS
+if the file exists.  This is apparently because VMS zchko() does the wrong
+thing.  Commenting out the call zchko() in the VMS case gets past this but
+then the appended part of the file has different attributes than the orignal
+part, e.g.:
+
+  abc  <- original line (horizontal, normal)
+  d    <- appended line (vertical)
+  e
+  f
+
+VMS fopen() takes an optional 4th argument: a series of RMS keyword=value
+pairs.  Kermit doesn't give any.  Experimentation shows that appending to
+a Stream_LF works fine.  That'll be a restriction for now, until somebody
+sends in code to get the RMS attributes of the original file and feed them
+to fopen().  Also need code to fix VMS zhcko() to say whether it's OK to
+append to a file.  ckuus7.c, 17 Jan 2002.
+
+Somebody suggested I could get a working Kermit for Neutrino 2+ by doing the
+QNX6 build on Neutrino itself.  I verified that this can't be done -- at least
+not by me -- since Netutrino 2+ doesn't have a compiler, and we already know
+the version cross-built for it on QNX4 doesn't work.  17 Jan 2002.
+
+From Jeff: SET SSH GSSAPI KEY-EXCHANGE { ON, OFF } parsing, SHOW SSH.
+ckuus3.c, 18 Jan 2002.
+
+PeterE suggested that SET ESCAPE allow 8-bit escape characters because of the
+difficulty in entering Ctrl-\ on European keyboards and the hardship (e.g. to
+EMACS and VI users) of sacrificing another C0 control character.  Like
+everything these days, this turns out to be rather a bigger deal than it would
+seem.  The SET ESCAPE parser calls setcc(), which accepts control characters
+in various formats (literal, ^X notation, or numbers), and gives an error
+return if the value is not 0-31 or 127.  This is changed easily enough to also
+allow numbers between 128 and 255.  But who else calls setcc()?  The commands
+for setting Kermit packet start and end characters.  No big deal, this gives
+people a bit more flexibility in case they need it, but it won't be
+documented.  setcc(): ckuus7.c, 18 Jan 2002.
+
+Since code to display the escape character is scattered all over the place,
+and some of it indexes into an array based on the character value (which would
+now dump core if the escape character was > 128), I put the code in one place,
+a new shoesc() routine in ckuusx.c (which needs to be outside #ifndef NOICP,
+since the CONNECT modules use it even in command-line only builds).  Also
+discovered that this code was indexing into the nm[] array with tt_escape to
+get "enabled" or "disabled", which is no longer appropriate, so fixed this
+too.  ckuusr.h, ckuus[5x].c, 18 Jan 2002.
+
+Made SHOW ESCAPE, SHOW TERM, and the various CONNECT modules call shoesc(),
+and updated HELP SET ESC.  ckuus[25].c, ckucns.c, ck[cuvd9]con.c, 18 Jan 2002.
+
+After all that, it occurred to me that this is a really bad idea for K95,
+with all the confusion about Console code pages, OEM code pages, Windows
+code pages, and Unicode.  But I tried "echo \161" at the K95 prompt and got
+the expected 8-bit character in both the Console version and the GUI, so
+maybe it's OK after all.
+
+Removed the automatic IKSD login code from setlin() since it complicates
+interactive anonymous login.  ckuus7.c, 20 Jan 2002.
+
+An #ifdef clause from Matthew Clarke to avoid "redeclaration of free" error
+when building a curses version of C-Kermit for AIX 2.2.1 on RT PC.  ckuusx.c,
+22 Jan 2002.
+
+Took care of one detail I omitted when adding the 8-bit escape character:
+not stripping the 8th bit before comparing the keyboard char with the escape
+char.  ck[uv]con.c, ckucns.c, 24 Jan 2002.
+
+Started to go through Jeff's changes of the last week but he had run trim -t
+on them, which untabifies, so the diffs were huge.  Retabifying Jeff's files
+only makes matters worse.  So instead of comparing each old and new source
+file in EMACS windows with M-X Compare-Windows like I usually do (which can't
+be told to ignore whitespace), I had to work from the diff -c -b listings.
+In ascending order of size of diffs:
+
+ckcker.h: Add I_AM_SSHSUB definition.
+ckuusr.h: XXLINK and VN_PERSONAL, etc, definitions.
+ckuusy.c: Support for "I Am SSHSUB" invocation.
+ckuus5.c: Support for new K95 directory structure.
+ckcmai.c: Init endianness earlier (K95 TYPE was broken), "I Am SSHSUB" support.
+ckuus7.c: Security #ifdefs, SSH OPEN /PASSWORD, SSHSUB support
+ckcftp.c: <-- SAVE TIL LAST
+ckuus6.c: Add LINK command for K95 on NT.
+ckuus4.c: Support for new K95 directory structure; SSHSUB support
+ckuus3.c: Support for new K95 directory structure; some SSH changes
+ckuus2.c: Changes to SSH related help text, add HELP LINK text
+ckuusr.c: LINK command, SSH OPEN /PASSWORD: /SUBSYSTEM: switches,
+  Pattern-management fixes.
+ckctel.c, ck_ssl.c, ckuath.c, ckcnet.c:
+ Took Jeff's without looking.
+ckuusx.c, ckucns.c, ckucon.c, ckwart.c:
+  My changes from weeks ago that were never picked up.
+
+Built OK on Solaris with gcc and on SunOS with (K&R non-ANSI) cc.
+31 Jan 2002.
+
+Meanwhile, Jeff had made various changes in response to Jaya Natarajan at IBM,
+whose basic complaint was that numerous failure conditions were not being
+detected if the fullscreen file-transfer display was active.  Jeff found that
+this was because big blocks of code were skipped in that case and changed the
+code not to do that, which fixed the reported problems.  But later Jaya said
+that "ftp mget file1 file2" acted like "ftp mget *", so it seemed that Jeff's
+fixes broke file selection.  After taking Jeff's fixes for ckcftp.c, however,
+I still could not reproduce the problem.  ckcftp.c, 31 Jan 2002.  <-- Later,
+it turned out the problem was with IBM's custom FTP server.
+
+Fixed updates that I missed yesterday in ckcftp.c, ckuusr.c.  Moved misplaced
+#ifdef in ckuusy.c breaking nonet builds.  Added #ifdefs to sysinit() for
+nonet builds in ckutio.c.  Ran through build-in-many-configurations script
+in Linux, all builds OK.  1 Feb 2002.
+
+Moved shoesc() definition outside of NOXFER to fix NOXFER builds.
+ckuusx.c, 1 Feb 2002.
+
+Added MYCUSTOM definition alongside KERMRC and changed KERMCL to be the
+same as CKMAXPATH, instead of some random hardwired number.  ckuusr.h,
+1 Feb 2002.
+
+Changed ckcdeb.h to define DIRSEP and ISDIRSEP(), and put #ifndef
+[IS]DIRSEP..#endif around all [IS]DIRSEP definitions in ck[udso]fio.c, so we
+can finally put away the many repeated #ifdef chains when we get around to it.
+1 Feb 2002.
+
+Make VMS zkermini() return 1 on success, 0 on failure, rather than 0 always.
+ckvfio.c, 1 Feb 2002.
+
+Added code to doinit(), just before it goes to execute the init file.  If the
+init file name we are about to open is empty or fails zchki(), substitute the
+customization filename.  For now this code is in #ifdef USE_CUSTOM..#endif,
+which is not defined by default.  It does the trick in Unix and VMS.  Also
+included code from Jeff for K95, but this needs verification and testing.
+Also used DIRSEP and ISDIRSEP() throughout doinit() instead of the long #ifdef
+chains.  ckuus5.c, 1 Feb 2002.
+
+Moved shoesc() prototype from ckuusr.h to ckcker.h so modules that need it
+don't have to include ckuusr.h just for this one thing (example: ckvcon.c).
+1 Feb 2002.
+
+Defined USE_CUSTOM by default, except if NOCUSTOM is defined.  ckuusr.h,
+1 Feb 2002.
+
+Fixed kermit-sshsub code to really enter server mode, and to print
+"KERMIT READY TO SERVE..." so scripts can wait for it.  Also bumped the
+C-Kermit test ID to RC.03 and the K95 one to Beta.02.  ckcpro.w, ckcmai.c,
+2 Feb 2002.
+
+I was thinking about adding SET COMMAND BUFFER-SIZE to let people allocate
+as big a buffer as they wanted at runtime, mainly for defining huge macros.
+Moved the SCMD_blah definitions from ckuusr.h to ckuus3.c, since they aren't
+used anywhere else.  But stopped there since the rest turns out to be a rather
+big deal.  ckuusr.h, ckuus3.c, 2 Feb 2002.
+
+From Jeff, 3 Feb 2002:
+ . Fix an out-of-order modem name in the SET MODEM TYPE table: ckudia.c.
+ . Use SET LOGIN USER and PASSWORD if present. ckcftp.c.
+
+Cody Gould noticed that array declarations had become case sensitive, and
+upper case didn't work.  Diagnosis: misplaced case conversion in xarray().
+Fixed in ckuus5.c, 4 Feb 2002.
+
+SHOW VAR dumps core on \v(sexpression) or \v(svalue) -- failure to check for
+NULL pointer.  I wonder why this didn't happen before (answer: because I was
+doing it on SunOS; now I'm doing it on Solaris).  ckuus4.c, 6 Feb 2002.
+
+I've had several requests for "show var name name name...".  I added this to
+doshow(), such that SHOW VAR works exactly as it did before (if you don't give
+it an arg, it lists all variables; if you give it an arg, it appends "*" to it
+and lists all matching variables) but now you can also give more than one arg
+and it works the same way with each one as it did before if you gave it a
+single item (i.e., "*" is appended, so "show var os cmd" shows all variables
+whose names begin with "os" or "cmd".  You can also freely use pattern
+notation, including anchors.  Hmmm, no, actually it's different in that now
+each includes an implied * before AND after, so "show var version" shows all
+variables whose name contain "version" rather than all variables whose names
+start with it.  ckuus5.c, 6 Feb 2002.
+
+Cody Gould reported that WRITE FILE blah blah \fexec(anything) ... got a
+spurious "File or Log not open" error.  This turns out to be a rather
+pervasive problem -- whenever you use \fexec() it calls the parser recursively
+and this can run roughshod over global variables, such as our innocent little
+x, y, and s.  The fix in this case was to put x and y on the stack.  The same
+thing probably needs doing in about 10,000 other places.  Too bad C isn't
+Algol.  ckuusr.c, 6 Feb 2002.
+
+Minor fix to SHO VAR -- the "^" anchor wasn't working (e.g. "show var ^os").
+ckuus5.c, 6 Feb 2002.
+
+Fixes from Jeff for FTP file-transfer character-set translation in K95 and
+in WIKSD, plus updated K95 SSH help text.  ckcftp.c, ckcfns.c, ckuus2.c,
+7 Feb 2002.
+
+Server has its date set in the past.  Client says "remote dir".  Server sends
+A packet containing old date.  If client has FILE COLLISION UPDATE, it
+rejects the directory listing.  Changed gattr() to only reject real files
+(introduced by F packet), not X-packet material like directory listings.
+ckcfn3.c, 7 Feb 2002.
+
+Up-down arrow keys for command recall.  People have been asking for it for
+years but now it's actually important because of PDAs that don't have Ctrl
+keys.  Would have been trivial except that we use getchar() rather than
+coninc() for reading from the keyboard in Unix so conchk() doesn't help.  In
+fact there are lots of other places where conchk() is used this way and works
+only by accident.  The only reason we never noticed a problem before is that
+characters don't usually arrive from the keyboard that fast.  But when an
+arrow key sends "ESC [ A" all once, the stdin buffer gets some extra stuff in
+it, which getchar() will return next time, but which coninc()/conchk() will
+never see.  So I added a new cmdconchk() routine which, if the keyboard is
+being read with getchar() rather than coninc(), looks at the stdin buffer.
+Unfortunately, however, there is no API for this, nor is there any standard
+way to access the stdin buffer directly.  So first I did it for Solaris.  Then
+to make it portable requires a survey of the headers for every platform.  I
+found four major variations:
+
+  stdin->_r:
+    {Free,Open,Net}BSD, BSDI
+  stdin->_cnt:
+    SunOS, Solaris, HP-UX 5-6, AIX, VMS, SINIX, IRIX 5.3-6.5, DGUX
+    4.2BSD, 4.3BSD, OSF/1..Tru64, QNX4, Unixware 1.0-2.1.0
+  stdin->__cnt:
+    HP-UX 7-11, SCO: OSR5.0.6a, Unixware 2.1.3-7.x, OU8, UNIX 3.2v4.x
+  Subtract read from end pointer (_IO_file_flags defined):
+    Linux (tested on RH 5.2 thru 7.1)
+
+The Linux method is new and different to account for multibyte characters.
+All the others assume character == byte.
+
+For docs: ANSI only, 7-bit only; both application and cursor modes are
+accepted.  Only up and down arrow are handled; left and right arrows cause
+a beep.  ckucmd.c, 8 Feb 2002.
+
+Build-all: Discovered that changing CTTNAM from TT: to SYS$INPUT: in VMS
+(which was done on 3 Jan 2002 to work around problems starting Kermit in
+batch, spawn'd, etc) breaks Kermit on VMS 5.5/VAX (concb() fails with "lacks
+sufficient privilege"; if you enable all privs Kermit starts but then spews
+out a constant stream of BEL characters).  If you put dftty back to "TT:",
+everything is fine -- I have no idea why, so I used #ifdef VMSV70 to decide,
+which is totally crude.  Next I had to find where the boundary really is: VAX
+vs Alpha?  VAX C vs DEC C?  Or between VMS releases?  Built on:
+ . VMS 6.2 Alpha (DEC C) - OK with TT:
+ . VMS 6.2 Alpha (DEC C) - OK with SYS$INPUT: <-- keep this one
+ . VMS 7.1 VAX   (DEC C)
+So the final condition is #ifdef VMSV60.  ckvker.com, ckvtio.c, ckuus5.c.
+
+QNX 6 needed some attention too:
+ . Whoever did the makefile target made the default port "/dev/ser1".
+ . Arrow keys...
+But I gave up on getting arrow keys to work -- it should be just like *BSD,
+but for some reason gcc complains that struct FILE has no _r member, even
+though it does (getchar uses it).
+
+Checked stdio.h on Mac OS X and it looks like the *BSDs.
+
+--- C-Kermit 8.0.201 ---
+
+Removed -g from solaris2xg+krb5+krb4+openssl+shadow makefile target -- it
+was producing a 15MB binary!  makefile, 14 Feb 2002.
+
+Fixed a couple thinkos in "make install": $(DESTDIR) should not have been
+included in the tests for whether INFODIR or SRCDIR were desired.  makefile,
+14 Feb 2002.
+
+(tarball refreshed 16 Feb 2002)
+
+--- C-Kermit 8.0.201 ---
+
+From Jeff: Better seeding of \frandom(): ckcmai.c, ckuus4.c, 18 Feb 2002.
+
+From Jeff: Make arrow keys work in WIKSD, but now also unconditionally
+compile arrow-key code in all versions.  ckucmd.c, 18 Feb 2002.
+
+From Jeff: ckuath.c, ck_ssl.c, ckcnet.c (didn't look).  18 Feb 2002.
+
+Added ORIENTATION command, that lists the various important directories, and
+\flongpathname() and \fshortpathname(), which do path format conversions in
+Windows, and are just synonynyms for \fpathname() elsewhere.  The new functions
+need building and testing in Windows.  ckuusr.h, ckuus[r24].c, 18 Feb 2002.
+
+Changed PWD for Windows only to show both short and long paths (but only if
+they are different; otherwise it behaves as before).  ckuusr.c, 18 Feb 2002.
+
+Changed default Windows prompt to show long pathname. ckuus5.c, 18 Feb 2002.
+
+Updated INTRO command to mention FTP, HTTP, and SSH.  ckuus2.c, 18 Feb 2002.
+
+From Jeff: fixes for typos in GetLongPathName() code: ckuus[r4].c, 22 Feb 2002.
+
+From Jeff: net/auth updates: ckcnet.c, ckuath.c, 22 Feb 2002.
+
+Added -DUSE_FILE__CNT to NCR MPRAS targets, George Gilmer: makefile,
+24 Feb 2002.
+
+From Jeff: Add support for GetLongPathName() in Win95 and NT: ckcdeb.h,
+ckuus[r4].c, 24 Feb 2002.
+
+From Jeff: More fixes for FTP SIGINT, plus fix [M]PUT /MOVE.  ckcftp.c,
+24 Feb 2002.
+
+Fixed an unguarded reference to inserver, gtword(): ckucmd.c, 24 Feb 2002.
+
+Adapted RETRIEVE for use with FTP connections; this one was missed when
+adapting GET, REGET, MOVE, etc.  ckuus6.c, ckcftp.c, 24 Feb 2002.
+
+Added special COPYRIGHT command text for the free version of WIKSD.
+ckcmai.c, ckuusr.c, 24 Feb 2002.
+
+C-Kermit, when in CONNECT mode and given the <Esc-Char>U sequence, would
+unconditionally close the connection if it was a network connection.  This
+is bad when Telnetting to a modem server.  I added to code to prevent this
+in the RFC2117 TELNET COMPORT case but I'm not sure how to exend this to the
+general case (or whether it would be a good idea).  ckucns.c, 24 Feb 2002.
+
+During file transfer, chktimo() calls ttgspd() for every packet, which clearly
+doesn't make sense on network connections, especially since on Telnet COMPORT
+connections it results in a network speed query for every packet.  Rearranged
+the code so this happens only on true serial-port connections.  ckcfn2.c,
+24 Feb 2002.
+
+From Jeff: Fix reversed ANSI/non-ANSI function declarations clauses in
+ckcftp.c, 26 Feb 2002.
+
+Changed Unix CONNECT module to call kstart() only when it has a chance of
+doing anything (i.e. a Kermit packet has been partially detected, or the
+packet start character just came in), rather than unconditionally on every
+incoming character.  ckucns.c, 8 Mar 2002.
+
+FTP PUT /SERVER-RENAME:, /RENAME-TO:, /MOVE-TO: were sticky.  Patch: In
+ckcftp.c, near the top of doftpput(), add the lines marked with "+":
+
+    makestr(&filefile,NULL);            /* No filename list file yet. */
++   makestr(&srv_renam,NULL);          /* Clear /SERVER-RENAME: */
++   makestr(&snd_rename,NULL);         /*  PUT /RENAME */
++   makestr(&snd_move,NULL);           /*  PUT /MOVE */
+    putpath[0] = NUL;                   /* Initialize for syncdir(). */
+
+ckcftp.c, 26 Mar 2002.
+
+\fday() and \fnday() were broken for dates prior to 17 Nov 1858.  Fixed in
+fneval(): ckuus4.c, 28 Mar 2002.
+
+From Jeff:
+ . New calling convenion for demoscrn(): ckucmd.c, ckuusx.c
+ . Fix for host-initiated 80/132 col screen mode change.  ckuus7.c.
+ . New \v(desktop) variable: K95 user desktop directory, ckuusr.h, ckuus4.c
+ . New \v(rfc2717_signature) var: Telnet Com Port, ckuusr.h, ckuus4.c
+ . Uncomment "not-reached" return(-2) in xgnbyte(): ckcfns.c
+ . New dates: ckcmai.c.
+ . Telnet Com Port fixes: ckutio.c
+ . SET PRINTER fixes for K95: ckuus3.c
+ . Session limit adjustments: ckuus3.c
+ . New directory layout for K95 (TAKE, ORIENT): ckuusr.c
+ . Fixes for Telnet Com Port, recycling SSH connections: ckuusr.c
+
+From me, not picked up by Jeff previously:
+ . kstart() speedup: ckucns.c.
+
+1 Apr 2002.
+
+---K95 1.1.21---
+
+From Jeff, 4 Apr 2002:
+ . More fixes for Telnet Com Port: ckuus4.c, ckudia.c, ckutio.c, ckcnet.c:
+   . network connections will check for carrier detect if SET
+     CARRIER-WATCH is ON.   This could have a potential conflict if
+     the option is negotiated and the carrier is off, but the site
+     requires login.
+   . modem hangup message generated since the dial module did not
+     believe that network modems could be reset with a DTR drop.
+ . Version number adjustments: 8.0.203, 1.1.99: ckcmai.c.
+ . Security: ck_ssl.[ch], ckuath.c.
+
+---C-Kermit 8.0.203---
+
+From Jeff, 6 Apr 2002:
+ . Fix typo in HELP REMOTE HOST: ckuus2.c.
+ . More Telnet Com Port fixes: ckctel.c, ckcnet.c, ckudia.c, ckutio.c
+
+From Jeff, 9 Apr 2002:
+ . Fix autodownload problem: ckcfn[2s].c.
+
+Chiaki Ishikawa reported that in Linux (two different kinds), if you choose
+hardware parity, CONNECT, then escape back, the speed can change.  I tracked
+this down to the following statement in ttvt():
+
+       tttvt.c_cflag &= ~(IGNPAR);     /* Don't discard incoming bytes */
+
+Somehow execution of this statement corrupted the speed words of the termios
+struct, which are entirely separate words that are nowhere near the c_cflag
+member.  Anyway, the statement is wrong; it should be:
+
+       tttvt.c_cflag |= IGNPAR;        /* Don't discard incoming bytes */
+
+Fixing it cured the problem; don't ask me why.  ckutio.c, 9 Apr 2002.
+
+From Jeff:
+  fixes the problem reported by robi@hastdeer.com.au.  The request to
+  enter server mode was received while we were entering server mode.
+  But the server was waiting for the response to REQ_STOP sent to the
+  client.  Therefore, we weren't quite in server mode yet and the
+  request to enter server mode was rejected.  A check for the sstate
+  value solves the problem.  ckctel.c, 10 Apr 2002.
+
+Chiaki Ishikawa (CI) discovered the real cause for the speed changing problem.
+I was setting the IGNPAR bit in the wrong flag word: it should have been
+c_iflag instead of c_oflag, silly me.  Fixed in ttvt() and ttpkt(): ckutio.c.
+I also did a thorough census of all the termio[s] flags to ensure each was
+applied to the right flag word -- they were, IGNPAR in the HWPARITY case was
+the only mistake.  CI also discovered that the speed words in the Linux
+termios struct are not used at all -- the speeds are encoded in an
+undocumented field of c_cflag, which explains the problem.  10 Apr 2002.
+
+Any use of \{nnn} character notation in a macro definition, loop, or other
+braced block caused an "unbalanced braces" parse error.  The backslash in this
+case is not quoting the open brace; it's introducing a balanced braced
+quantity.  Special-cased in getncm(): ckuus5.c, 12 Apr 2002.
+
+The semantics of "if defined \v(xxx)" were changed in 8.0 to avoid obnoxious
+error messages when xxx was not a built-in variable (see notes of 19 Nov
+2000), such that "if defined \v(xxx)" would always succeed if there were such
+a variable, even if it had no value.  The behavior that is documented in the
+book (and also in ckermit70.html) and that we had in versions 6 and 7, was
+that IF DEFINED \v(xxx) would fail if \v(xxx) was defined but had an empty
+value OR if it was not defined, and would succeed only if it was defined and
+had a value.  Fixed in boolexp(): ckuus6.c, 12 Apr 2002.
+
+What about \function()s?  IF DEF \fblah() presently succeeds if the function
+exists; you don't even have to give arguments.  I think this behavior is more
+useful than if I required valid arguments and then evaluated the function --
+you can do that anyway with 'if not eq "\fxxx(a,b)" "" ...'  Of course this
+argument applies to "if def \v(xxx)" too, except that the current behavior is
+consistent with the 7.0 behavior, so there is no need for a change.
+
+Kent Martin discovered that if a macro contains a LOCAL statement for a
+variable whose name is the same as, or a unique left substring of, the macro's
+name, then undefining the local variable makes the macro disappear:
+
+  define DateDiff {
+    echo {DateDiff(\%1) executing...}
+  }
+  define Kent {
+    do DateDiff {2}
+    local date
+    assign date {}
+    do DateDiff {3}  <-- This fails (A)
+  }
+  do DateDiff {1}
+  do Kent
+  do DateDiff {4}    <-- So does this (B)
+
+The first part of the problem is that "assign date {}" called delmac with
+exact=0, so delmac evidently deleted first macro whose name started with
+"date" -- and since the only one was DateDiff, that's the one that was
+deleted.  Fixing this (change "delmac(vnp,0)" to "delmac(vnp,1)" in dodef())
+got us past A.  The second part was making the same fix to the delmac()
+call in popclvl().  ckuus[56].c, 13 Apr 2002.
+
+The INPUT command ignored the parity setting, thus SET PARITY EVEN,
+INPUT 10 "login:" didn't work.  Fixed in doinput(): ckuus4.c.  Also fixed a
+bogus #ifdef COMMENT section that messed up the block structure of the module
+and therefore EMACS's indenting.  18 Apr 2002.
+
+Added sco32v500net+ssl and Added sco32v505net+ssl targets, from Scott Rochford
+at Dell (not sure yet if they work).  Makefile, 19 Apr 2002.
+
+From Jeff, 22 Apr 2002:
+ . Added "darkgray" color and made "dgray" an invisible synonym: ckuus3.c.
+ . Fix carrier sense on Telnet Com Port immediately after dial: ckudia.c.
+ . Change krb5_des_blah() arg list: ckutio.c.
+ . Fix ttgmdm() for Telnet Com Port: ckutio.c.
+ . Fix tthang() return code: ckutio.c.
+ . Add aix43gcc+openssl target: makefile.
+
+From Jeff, 25 Apr 2002:
+ . Fix SET GUI keyword table: ckuus[37].c.
+ . A final fix to Telnet Com Port: ckctel.c, ckcnet.c.
+
+From Jeff, 26 Apr 2002:
+ . Another final fix to Telnet Com Port: ckctel.c, ckudia.c.
+
+From Jeff, 27 Apr 2002:
+ . separate the wait mechanism for TELNET SB COMPORT synchronous messages
+   from the asynchronous TELNET SB COMPORT MODEMSTATUS messages: ckctel.[ch]
+ . fix debug messages in Certificate verify functions: ck_ssl.c, ckcftp.c.a
+
+Frank, 27 Apr 2002:
+ . Fixed VMS zgetfs() to fail when file doesn't exist: ckvfio.c.
+ . Fixed UNIX zgetfs() to check for null or empty arg: ckufio.c.
+ . Added #include <time.h> for time() call: ckcmai.c.
+ . Add casts to args in tn_wait() calls: ckctel.c.
+
+SINIX-P 5.42 (Pyramid architecture) makefile target from Igor Sobrado.
+makefile (no source-code changes), 1 May 2002.
+
+From Jeff, 5 May 2002,
+ . Fix some "unknown host" messages: ckcftp.c.
+ . Add more casts to tnc_wait() calls: ckudia.c.
+ . Improvements to SHOW SSH, SHOW GUI: ckuus3.c.
+ . Fixes to SET COMMAND { WIDTH, HEIGHT }: ckuus3.c.
+ . Updates to ck_ssl.[ch], ckctel.c, ckcnet.c.
+
+Fixed the erroneous setting of ssh_cas during switch parsing rather than
+after cmcfm() in setlin(): ckuus7.c, 5 May 2002.
+
+setlin() decomposition (2300 lines), Part One: 
+
+ . Copied a big chunk from the end of setlin(), beginning with net directory
+   lookup, but only the network-specific and common parts, to a new routine,
+   cx_net(), 900 lines.
+
+ . Extracted many repetitious lines of error-message code from cx_net()
+   to a new routine, cx_fail().  Error messages are stored in slmsg, and
+   also printed but only if we were not called from a GUI dialog (and
+   QUIET wasn't set, etc etc).  Any adjutments in this policy can now be
+   made in one place.
+
+ . I put a call to cx_net() in setlin() just before all the code it replaced.
+   It works for TELNET and SET HOST /TELNET.
+
+ . Built with mkwatsol-k5k4ssl; after a couple fixes it builds OK and makes
+   Kerberized connections OK.
+
+ . Copied the serial-port and common parts of the setlin() post-cmcfm()
+   code to another new routine, cx_serial(), about 275 lines.  Fixed
+   messages not to come out when called from GUI dialog, etc.  Inserted
+   a call to cx_serial() at the appropriate spot in setlin().  Tested
+   serial connections on watsun with "set line /dev/ttyh6", works OK.
+
+ . Removed all the code from setlin() that was copied to cx_*().  This slims
+   setlin() down to 1120 lines.  Tested regular Telnet, Kerberized Telnet, and
+   serial connections again, all OK.  The Unix version of the SSH command is
+   OK too.
+
+setlin() deconstruction, Part Two:
+
+Now that we have the common network and serial connection pieces moved out of
+setlin(), we still need to move out the little code snippets for each network
+type that take place between command confirmation and the common code we just
+replaced.   As far as I can tell, this needs doing only for SSH.  The code
+labeled "Stash everything" copied to cx_ssh() but I didn't remove the original
+code since I can't test this.  I think I'm done -- maybe I'm overlooking
+something but I don't know what...  First we need to test the heck out of it
+in all command-line versions (K95 and C-Kermit).  Then to use this from
+the GUI, see the calling sequences for cx_serial(), cx_net(), and cx_ssh():
+
+ . For serial or TAPI connections, the GUI should call cx_serial().
+ . For SSH connections, it should call cx_ssh() and then cx_net().
+ . For all other network connections, just calls cx_net().
+
+ckuus7.c, Cinco de Mayo de 2002.
+
+New ckuus7.c from Jeff, 8 May 2002.  Merge cx_ssh() into cx_net().  Also: I
+had made line[] an automatic variable, since the global line[] buffer is used
+by almost every parsing routine in C-Kermit to hold string fields between
+parsing and execution but Jeff says he found that some code somewhere depended
+on line[] containing the hostname after setlin() was finished.
+
+From Jeff, 10 May 2002:
+ . Fix SET SSH STRICT-HOST-CHECKING parse: ckuus3.c.
+ . Add prototypes for cx_net() and cx_serial(): ckuusr.h.
+ . Add ANSI versions of cx_net() and cx_serial() declarations and supply a
+   missing parameter in the cx_serial() invocation, change SSHCMD cx_net()
+   invocation to new form.
+
+From Jeff, 16 May 2002:
+ . ANSI strictness changes: ck_ssl.[ch]
+ . New DIALER command: ckuusr.[ch]
+ . Correction to how -0 turns off autodownload: ckuusy.c
+ . Prototypes for GUI menu action functions: ckuusr.h.
+ . Replace setting of GUI-action variables by function calls: ckuus[3457x].c
+ . Fix FTP -z switch parsing: ckcftp.c.
+ . Fix SET HOST testing of setlin() return code: ckuus3.c
+
+From Jeff, 18 May 2002:
+ . Allow half-size GUI fonts: ckuus[35y].c.
+
+Fixed setguifont() to parse fractional font sizes and round to nearest half
+point.  ckuus3.c, 18 May 2002.
+
+For GUI, wrote front ends for getyesno(), readtext(), and readpass():
+
+ . uq_ok() prints text and gets Yes/No, OK/Cancel, or just OK response.
+   This replaces getyesno() and can also be used for alert or help boxes.
+
+ . uq_txt() prints text and gets a single text response.  Replaces
+   readtext() and readpass().
+
+ . uq_mtxt() is like uq_txt() but allows multiple text fields.  Replaces
+   any combination of readtext() and readpass().
+
+Obviously the #ifdef KUI portions of the uq_blah() routines need filling in.
+ckuusr.h, ckuus3.c, 18 May 2002.
+
+Converted selected getyesno() calls to uq_ok(): ckcftp.c, ckuus3.c, ckuus6.c.
+Some were not converted because it was inappropriate, e.g. DELETE /ASK; others
+because they're in Jeff's code.  The most interesting conversions are in the
+DIAL command when DIAL CONFIRMATION is ON.  Here there is a dialog for each
+phone number asking if it's OK (ug_ok()) and if not, asking for a replacement
+(uq_txt()); seems to work fine in C-Kermit.  All the candidates for uq_mtxt()
+are in Jeff's code.  18 May 2002.
+
+From Jeff: Convert remaining getyesno/readtext/readpass calls to uq_blah()
+so they can be GUI dialogs.  ckuus[37].c, ckcftp.c, ckuath.c, ck_ssl.c,
+21 May 2002.
+
+Added KCD command = CD to symbolic directory name (EXEDIR, COMMON, APPDATA,
+TMPDIR, etc etc).  ckuusr.h, ckuus[r25].c, 21 May 2002.
+
+From Jeff, 28 May 2002:
+ . --title: commandline option: ckuusr.h, ckuusy.c
+ . Fix some #includes, move some declarations: ckcfns.c
+ . Change K95 version from Dev.00 to Beta.01
+ . ASK[Q] /GUI: ckuus6.c.
+ . Various GUI screen updates and #ifdefs: ckuus7.c
+ . Add missing cx_net() calls to new setlin() for file SuperLAT..: ckuus7.c
+ . Updated uq_*() routines for GUI dialogs: ckuus3.c.
+
+Added GETOK switches (/TIMEOUT for all; /POPUP and /GUI for K95G):
+ckuus6.c, 29 May 2002.
+
+Added HELP SET GUI text.  ckuus2.c, 29 May 2002.
+
+From Jeff:
+ . Another K95-specific #include for ckcfns.c.
+ . More items for K95G Actions menu.
+ . Change K95G Locus switching to call setlocus() rather than set variable.
+ . Ditto for several other variables now settable from Actions menu.
+ . Fix SET HOST /NET:SSH status code so IF SUCCESS works.
+ . Fix SHOW SSH port-forwarding.
+ckcfns.c, ckuus[r367].c, ckcftp.c, ckcmai.c, 30 May 2002.
+
+Changed SET LOCUS to have a new value, ASK, corresponding to new autolocus
+value of 2, K95G only.  Changed setlocus() to not do anything if the new and
+old loci are the same, otherwise to invoke a GUI dialog in K95G if autolocus
+is 2, and also to handle any text messages.  Changed SHOW COMMAND to show ASK
+value for SET LOCUS.  Rewrote HELP SET LOCUS.  ckuusr.[ch], ckuus[23].c,
+ckcftp.c, 30 May 2002.
+
+Add a missing space to Locus popup, and fix Jeff's version of the code to
+compile in C-Kermit.  ckuusr.c, 31 May 2002.
+
+From Jeff, for K95 GUI, 6 June 2002:
+ . Force some GUI popups to be in foreground: ckuus3.c.
+ . Fix SHOW TERM font display: ckuus5.c.
+ . Update K95 version numbers and date (4 June 2002): ckcmai.c.
+ . Add note about encrypted private keys vs scripts to HELP SET AUTH: ckuus2.c.
+ . Fix SET HOST for DECnet: ckuus7.c.
+
+--- K95 2.0 ---
+
+From Jeff, 7 June 2002:
+ . Fix some #ifdefs for Unix builds (locus, dial, etc): ckuus7.c
+ . Add gui_resize_scale_font() prototype: ckuus3.c
+ . Add some missing SET GUI commands: ckuus3.c
+ . Update version numbers: ckcmai.c
+
+--- K95 2.0.1 ---
+
+From Jeff, 11 June 2002:
+ . Conditionalize Locus-switching popup text for GUI/Console: ckuusr.c.
+ . Fix the SRP_installed_as_server() function.  The new API returns TRUE even
+   if the SRP config and password files cannot be found.  Went back to the old
+   API.  This bug affects C-Kermit 8 when built with SRP as well as 1.1.21
+   through 2.0.1.  Since iksdnt.exe has not been shipped yet I fixed it and
+   uploaded a new non-beta build of it.  ckuath.c.
+
+From Jeff, 12 June 2002:
+ . Fix SSH AGENT ADD: ckuusr.c.
+ . Fix --facename: option to not fail if name unknown: ckuusy.c.
+ . Fixes for OpenSSL 0.9.7 and OpenBSD 3.1: ck_ssl.c.
+ . Fix SET AUTH TLS VERIFY NO to prevent a dialog but still a warning if
+   SET AUTH TLS VERBOSE ON is set: ck_ssl.c.
+ . Fix FTP code to verify the hostname as specified by the user and not
+   the hostname discovered by the reverse DNS lookup.  For example,
+     FTP OPEN kermit.columbia.edu
+   should produce a dialog because that name is not in the certificate
+   even though ftp.kermit.columbia.edu (the reverse DNS name) is:  ckcftp.c.
+
+Add support for Solaris 9 and NetBSD 1.6.  makefile, ckuver.h, ckcdeb.h,
+13 Jun 2002.
+
+Discovered that Solaris 9 wants to hide the members of struct FILE, and
+enforces this for 64-bit builds.  They offer some functions like __fbufsize()
+to get the info, but not the info we need for reading escape sequences (the
+_cnt member).  Let's hear it for political correctness.  Created new solaris9g
+(32-bit) and solaris9g64 (64-bit) targets.  Sorry, no arrow keys in 64-bit
+mode.  Also no more direct access to sys_errlist[]; must use strerror().
+makefile, ckucmd.c, 13 Jun 2002.
+
+Added solaris9g+openssl+zlib+pam+shadow, which in turn required adding
+solaris2xg32+openssl+zlib+pam+shadow, needed for gcc 3.1 in which you have
+to specify 32-bit.  Fails for some mysterious reason in link step
+(can't find libssl.so.0.9.6 even though it's there).  makefile, 13 Jun 2002.
+
+Solaris 8 empty socket problems again -- tthang() times out, subsequent
+tcsetattr() calls do horrible things.  Added a bandaid to ttclos(): don't
+call tcsetattr() any more if hangup timed out.  ckutio.c, 14 June 2002.
+
+Gerry B reported the bandaid got us bit farther but Kermit still disappears.
+Added code to reassert the alarm signal handler, since it is likely that
+Solaris has become stricter about this since last time I looked.  (Later
+Gerry reported back that this did the trick -- C-Kermit now exits normally
+and releases the lockfile).  ttclos(): ckutio.c, 17 Jun 2002.
+
+If you use Kermit to copy a file to a destination file that already exists and
+is longer than the source file, the destination file is not truncated.  I had
+mistakenly assumed that setting O_CREAT in the open() call in zcopy() would
+create a new copy of the file.  Fixed by also setting O_TRUNC.  ckufio.c,
+17 Jun 2002.
+
+Updated HELP INPUT and MINPUT text to explain 0 and -1 timeout values, and
+HELP DIAL to explain about entering CONNECT mode automatically.  ckuus2.c,
+17 Jun 2002.
+
+Got rid of client-side "Press the X or E key to cancel" message when giving
+a REMOTE command if QUIET is set or if XFER DISPLAY is NONE.  ckuus7.c,
+17 Jun 2002.
+
+From Jeff 25 Jun 2002:
+ . Add SUN terminal type: ckuusr.h, ckuus[57].c.
+ . Add GUI file transfer display: ckcker.h, ckuus[47x].c.
+ . Changes to allow C-Kermit to build with OpenSSL 0.9.7.  Current
+   C-Kermit code is designed to compile with 0.9.6 and earlier.  To
+   compile with 0.9.7 you must specify -DOPENSSL_097.  This avoids
+   missing symbols in the DES library.  The functions in OpenSSL were
+   renamed in 0.9.7 to avoid link time conflicts with Kerberos 4.
+   ckufio.c ck_crp.c ckuath.c ck_ssl.h ck_ssl.c, makefile.
+
+From Jeff 26 Jun 2002:
+ . apparently the SSL Passphrase Callback function was not converted
+   from readpass() to uq_txt()
+ . FTP Authentication failure errors were not being reported to the
+   user.  So a failure would appear to be a successful completion
+   unless FTP DEBUG was ON.  Now the message is reported unless
+   the QUIET flag is set.
+ck_ssl.c, ckcftp.c.
+
+SET TRANSFER MODE MANUAL didn't work for FTP; fixed in putfile() and getfile():
+ckcftp.c, 1 Jul 2002.
+
+Changed debug log for FTP to log "FTP SENT" and "FTP RECD" for protocol
+messages, just like we do for Telnet, to make it easy to grep them out of
+the log.  ckcftp.c, 1 Jul 2002.
+
+In FTP MGET /UPDATE, equal times spuriously caused download.  doftpget() was
+misinterpreting chkmodtime()'s return code.  ckcftp.c, 3 Jul 2002.
+
+In FTP MGET /RECOVER, recovery is skipped if the local file is newer than
+the remote.  This would seem to make sense, but when a download is
+interrupted, the partial file never gets the date of the remote file, so
+the partial file is always newer, and recovery never works.  Fixed in
+recvrequest() by commenting out the date check.  ckcftp.c, 3 Jul 2002.
+
+A better way to fix the previous problem is to always set the file date from
+the server and then only allow /RECOVER to work when the dates are equal.
+But that's not possible because MDTM is not implemented universally, and it
+conflicts with how Kermit currently works, namely that FTP DATES are OFF by
+default.  Also, checking dates prevents [M]GET /RECOVER from working with
+files that were incompletely downloaded by some other FTP client.
+
+In FTP MGET /RECOVER <wildcard> <wildcard> ..., the first file in each group
+is always downloaded.  Diagnosis: Kermit sends "TYPE A" prior to NLST (as it
+must).  Then when it sends its first SIZE command, it's still in ASCII mode,
+so the server sends the "ASCII size" rather than the binary size, which does
+not agree with the size of the local file (which was downloaded in binary
+mode), so recovery is always attempted even when the files are identical.  The
+TYPE A command is sent by initconn().  After the remote_files() call, we have
+to change the type back to the prevailing type before sending the first SIZE
+command.  Fixed in cmdlinget() and doftpget(): ckcftp.c, 3 Jul 2002.
+
+In FTP MGET /EXCEPT:<pattern> used with SET XFER DISPLAY brief, files that
+are skipped just say ERROR instead of saying why they were skipped.  Fixed
+in doftpget(): ckcftp.c, 3 Jul 2002.
+
+Added EXIT to top-level HELP text.  ckuus2.c, 13 Jul 2002.
+
+Strip braces in REINPUT n {string}.  ckuusr.c, 13 Jul 2002.
+
+Added /QUIET switch to ASK-class commands.  This means not to print any error
+messages when an ASK-class command times out waiting for a response.  Made
+sure that when a timeout occurs, the command fails.  Also made sure the
+c-Kermit prompt doesn't write over the ASK prompt if ASK times out.  Also
+fixed ASK, when it times out, not to return -9, which it did in one case,
+which causes a command-stack dump.  ckuus[267].c, ckucmd.c, 13 Jul 2002.
+
+Fixed SET FILE INCOMPLETE help text, which said that both KEEP and AUTO were
+the default.  ckuus2.c, 13 Jul 2002.
+
+If you SET FTP DEB ON and then turn it OFF, the MGET temp file is still kept.
+Fixed by getting rid of ftp_knf variable and using ftp_deb to control whether
+temp file is deleted (ftp_knf was being set from ftp_deb anyway, but then
+wasn't being reset by SET FTP DEB OFF).  ckcftp.c, 13 Jul 2002.
+
+If an FTP transfer was in progress but the FTP connection drops and automatic
+locus switching is enabled, the locus does not change; thus (for example) a
+subsequent DELETE command makes Kermit send a REMOTE DELETE packet on stdout.
+Fixed in lostpeer(): ckcftp.c, 13 Jul 2002.
+
+For docs: FTP CD with no arg might not be accepted by the server; e.g. the
+Kermit FTP server says "501 Invalid number of arguments".
+
+The FTP module never handled SET INCOMPLETE.  Fixed in doftprecv2().  ckcftp.c,
+13 Jul 2002.
+
+When FTP DATES is ON, we set an incoming file's date only if the file was
+received successfully.  Changed the code to set the file's date even if it was
+received only partially (assuming we can get the date from server).  ckcftp.c,
+13 Jul 2002.
+
+Suppose we were doing FTP MGET /UPDATE from a server directory of 100,000
+files.  Kermit would send a SIZE command for every file unconditionally.  On
+some connections, e.g. to the Red Hat Rawhide server, each one could take up
+to 30 seconds.  That would be 3 million seconds = 34 days.  Don't send a SIZE
+command during the selection phase unless a /SMALLER or /LARGER selector was
+given.  Once the file is selected, send a SIZE command only if one hadn't been
+sent for that file already.  ckcftp.c, 13 Jul 2002.
+
+Made [M]GET and [M]PUT /UPDATE switch imply FTP DATES ON, since they didn't
+work unless it was.  ckcftp.c, 13 Jul 2002.
+
+Added FTP [M]GET /DATES-DIFFER, which is like /UPDATE except it selects files
+that are newer or older, rather than only newer.  This allows updates from
+sources where files might be rolled back to earlier versions.  It's a bit
+dangerous if you use it without knowing what it's for, since it allows older
+files to overwrite newer ones.  (Code is also in place for [M]PUT
+/DATES-DIFFER, and it works, but I commented it out because it's either
+useless or dangerous since when uploading, you can't set the the file dates
+when they are arrive on the server.)  ckcftp.c, 13 Jul 2002.
+
+Changed chkmodtime() to remember if MDTM fails on a particular connection
+because it's an unknown command (500, 502, or 202), and if so, not to ask
+again.  ckcftp.c, 13 Jul 2002.
+
+With this last change, I think it's safe to change the default for FTP DATES
+from OFF to ON.  ckcftp.c, 13 Jul 2002. 
+
+Increased max number of /EXCEPT: patterns from 8 to 64 for file transfer (not
+necessarily for other things).  This is now a compile-time symbol NSNDEXCEPT.
+ckcker.h, ckcmai.c, ckclib.c, ckcfns.c, ckcftp.c, ckuus[rx].c.  13 Jul 2002.
+
+Fixed FTP MGET to not send SIZE command when there is a name collision and
+FILE COLLISION is DISCARD, even if /SMALLER or /LARGER were also specified.
+ckcftp.c, 15 Jul 2002.
+
+MGET fails if no files were transferred, even if the reason is that no files
+met the selection critieria: /COLLISION:DISCARD, /UPDATE, /SMALLER, etc.
+Changed MGET to succeed in that case.  domget(): ckcftp.c, 16 Jul 2002.
+
+Big problems with canceling MGET; Ctrl-C cancels the current file, but we
+don't break out of the file loop, we just go on to the next file.  Worse, if
+we're executing a command file that has a series of MGETs, Ctrl-C doesn't
+break us out of the command file.  Fixed by making failftprecv() and
+failftprecv2() "chain" to the main SIGINT handler, trap().  This is fine in
+Unix, but I'd be really surprised if it works in K95 so I put it in #ifndef
+OS2.  Ditto for MPUT: Added the same treatment to failftpsend() and
+failftpsend2().  Ditto for cmdcancel().  To adapt to K95, search for "TEST ME
+IN K95" (5 places).  ckcftp.c, 16 Jul 2002.
+Fixed previous fix to account for the fact that failftpblah() can be called
+not only upon Ctrl-C, but also if transfer interrupted with X or Z.
+ckcftp.c, 16 Jul 2002.
+
+Yesterday's fixes revealed another problem: Interrupt MGET with Ctrl-C, start
+another MGET, and the file list is total garbage.  Diagnosis: secure_getc()
+and secure_getbyte() use internal static buffer pointers.  The only way they
+ever get reset is when the data connection is closed by the server, so if you
+interrupt a GET, the pointers are not reset and the next network read (e.g. of
+an NLST response) returns whatever junk was lying around in the old buffer.
+ckcftp.c, 17 Jul 2002.
+
+FTP MGET temp file is kept only if FTP DEBUG is ON.  Changed FTP module to
+also keep it if the regular debug log is active.  ckcftp.c, 17 Jul 2002.
+
+Fixed version test in ckermit.ini: should be 6 digits, not 5.  17 Jul 2002.
+
+Changed C-Kermit version number to 8.0.205 so scripts can test for the
+recent changes.  ckcmai.c, 18 Jul 2002.
+
+---8.0.205---
+
+SET FILE COLLISION UPDATE would unset FTP DATES due to a typo in the recent
+changes.  ckcftp.c, 21 Jul 2002.
+
+FTP [M]GET /DATES-DIFFER really should have been a collision option.  Added
+this option (implemented for FTP only) to both SET FTP COLLISION and the
+FTP [M]GET /COLLISION: table, so this way if you have lots of [M]GETs, you
+don't have to put /DATES-DIFFER on each one.  ckcker.h, ckcftp.c, 21 Jul 2002.
+
+"FTP MGET a* b* c*" would fail to get any c*'s if no b*'s existed.
+ckcftp.c, 21 Jul 2002.
+
+From Jeff, 22 Jul 2002:
+ . Beginnings of Ann Arbor Ambassador terminal emulation for K95;
+   ckuus[57].c, ckuusr.h.
+ . Bump K95 version number to 2.0.2: ckcmai.c
+
+Added -DCK_PAM -DCK_SHADOW to all Solaris targets, 2.6 and above.  makefile,
+23 Jul 2002.
+
+Discovered that CK_SCRIPTS path search for TAKE files was #ifdef'd out
+except for K95.  Fixed in ckuusr.c, 25 Jul 2002.
+
+From Jeff: changes to support K95 italics: ckuus[57].c,  25 Jul 2002.
+
+Fixed path search for TAKE to not search the CK_SCRIPTS path if the filespec
+contains any directory or path parts.  Added a new function to check for
+this:  int hasnopath(filespec) in ckucmd.c: 26 Jul 2002.
+
+Update HP-UX build instructions from PeterE: makefile, 26 Jul 2002.
+
+Commented out "const" from struct pam_message declarations because it
+causes "initialization type mismatch" warnings.  ckufio.c, 26 Jul 2002.
+
+Suppose you have a network directory containing a listing for host "foo":
+
+  foo tcp/ip foo.bar.com
+
+Then in K95 you give a command "set host /network-type:ssh foo".  This
+results in the directory lookup replacing the "ssh" network type with TCP/IP,
+and making a Telnet connection.  Fix attempted at about line 8625 of ckuus7.c
+in cx_net(); needs testing in K95.  26 Jul 2002.
+
+FTP Password: prompt in Unix was not allowing editing.  The code looked right;
+I put in some debugging and suddenly it worked.  Took out the debugging and
+it still worked.  Maybe I dreamed it.  Anyway, I fixed the "FTP SENT" debug
+log entry to not record the password, and removed a redundant section above
+to log the same thing, but prior to any charset conversion.  ckcftp.c,
+27 Jul 2002.
+
+From Jeff, 28 Jul 2002:
+ . Fix typo in initxlist(): ckcmai.c.
+ . Fix typo in Friday's set-host fix: ckuus7.c.
+ . Move parsing of --height/width command-line args after prescan(): ckuusy.c.
+
+Added invisible top-level SITE and PASSIVE commands for FTP as a convenience
+for habituated FTP client users.  ckuusr.[ch], ckcftp.c, 28 Jul 2002.
+
+A while back a user asked if it was possible to MGET a bunch of files from
+an FTP server and have them all appended to each other upon arrival.  The
+obvious way to do this would have been:
+
+  mget /collision:append /as-name:bigfile *.*
+
+But to make this work, I had to get rid of the "as-name must contain
+variables" check in the MGET parser.  doftpget(): ckcftp.c, 28 Jul 2002.  
+
+Verified that it was possible to do the same thing (GET a bunch of files
+and append them all into one result file) with Kermit protocol.  It works
+fine but in this case there is no /COLLISION switch; you have to SET FILE
+COLLISION APPEND first.  30 Jul 2002.
+
+Changed COPY /APPEND to allow wild source to single destination file, e.g.
+"copy /append *.* bigfile".  ckuus6.c, 30 Jul 2002.
+
+From Mark Berryman: a replacement for zchkpath(), the VMS routine that checks
+whether a file is in the current directory; the old one (that I wrote) was
+a hack that only worked sometimes.  Martin Vorlaender verified Mark's code in
+the situation where mine was breaking (server running in captive account).
+ckvfio.c, 30 Jul 2002.
+
+PeterE reported a problem with SWITCH case labels that start with '#':
+The problem is that the SWITCH variable contents in this case happens to be
+a comment, e.g.:
+
+  CMD(M)[_forward # Stand: 24.07.2002<CR>]
+
+so the GOTO target is null.  The solution would be for SWITCH to put the GOTO
+(_FORWARD) target in quotes.  But GOTO does not strip quotes or braces from
+around its target.  Fixed in ckuusr.c, 30 Jul 2002.
+
+Fixed the SWITCH macro definition to put the _FORWARD target in quotes.
+ckuus5.c, 30 Jul 2002.
+
+PeterE also reported that an empty SWITCH case label did not work.  There's no
+particular reason why it should, but after a brief look, it wasn't that hard
+so I did it.  It required commenting out the check for empty labels and fixing
+the comparison in dogoto().  Now it's possible to read lines from a file and
+use each line as a SWITCH variable, with patterns as case labels, including an
+empty label to match empty lines, #* labels to match comment lines, etc.
+ckuus[r6].c, 30 Jul 2002.
+
+PeterE also reported the value of \%* acquiring a trailing blank when
+referenced inside a SWITCH statment.  This happens because \%* is formed using
+\fjoin() on the \&_[] array based on its dimension, and at some point the
+dimension is spuriously increased by one.  As a workaround, I made \fjoin()
+ignore trailing empty \&_[] array elements and oddly enough this also fixed
+the growing dimensions problem.  The many script torture tests reveal no ill
+effects, so it seems like a keeper.  ckuus4.c, 30 Jul 2002.
+
+Some of Peter's sample scripts made C-Kermit 8.0.201 dump core, but no more.
+
+Fixed "delete xxx" to print an error message and fail if if xxx does not exist.
+Ditto for when xxx is a directory.  ckuus6.c, 30 Jul 2002.
+
+Patches to SSL modules from Jeff based on yesterday's advisory.  ck_ssl.[ch],
+31 Jul 2002.
+
+Fixed some typos affecting the filename collision action during command-line
+FTP [M]GET.  ckcftp.c, 31 Jul 2002.
+
+Fixed SHOW FTP to handle FTP COLLISION DATES-DIFFER.  ckcftp.c, 31 Jul 2002.
+
+A while back someone pointed out that SET CONTROL UNPREFIX ALL and SET
+PREFIXING NONE gave different results.  Fixed them to use the same code.
+Also made "set prefixing none" visible.  ckuus3.c, 4 Aug 2002.
+
+Added SET CD HOME <path>, to let the user specify which directory is intended
+when "CD" or "KCD" is given by itself.  This is because in Windows, some
+applications set up their own HOME environment variable that isn't necessarily
+where the user wants "cd" to go, but redefining HOME can interfere with the
+application (example: Windows EMACS).  SET CD HOME was done by adding a myhome
+variable, initially a NULL pointer, and then changing homepath() to use it if
+it is set.  zhome() is not affected.  Also the homepath() prototype had been
+missing from header files.  ckcmai.c, ckuusr.h, ckuus[2345].c, 4 Aug 2002.
+
+PeterE got another core dump with his SWITCH statement.  Found a place where
+an out-of-bounds array reference could occur if the switch variable was
+empty.  ckuus6.c, 5 Aug 2002.
+
+PeterE noticed that if the switch variable contained a comma, spurious matches
+could occur with the label pattern.  The real problem turns out to be what
+happens when the SWITCH variable doesn't match any of the case labels and
+there is no DEFAULT label.  Fixed by having dogoto() in the SWITCH (_FORWARD)
+case pop the command stack before returning failure, i.e. by moving the
+"if (stopflg) return(0);" statement down a few lines.  ckuus6.c, 5 Aug 2002.
+
+PeterE noticed that a SWITCH case label of :* did not match an empty SWITCH
+variable.  Fixed in doswitch(): ckuus6.c, 6 Aug 2002.
+
+In testing the previous fix, I found it only worked sometimes.  Inspection
+of the debug log showed that a statement like:
+
+  if (y == -3) s = "{}";
+
+was assigning "{" rather than "{}" to s.  Replacing the string constant by a
+buffer containing the same string fixed it.  The reason (guessed correctly by
+PeterE) was the following sequence:
+
+  y = cmfld("Variable name","",&s,xxstring);
+  if (y == -3) s = "{}";
+  len = ckstrncpy(tmpbuf,brstrip(s),TMPBUFSIZ);
+
+brstrip() (by design and as documented) affects the string in place.  But in
+this case the string is a constant, not data in a buffer, so all further uses
+of "{}" get the wrong string (at least in optimized builds).  The only real
+cure is to change brstrip() to make a copy of its argument if it has to do
+anything to it.  This will slow down some scripts, but it's too risky to
+leave it as it was.  ckclib.c, 6 Aug 2002.
+
+The previous change required an audit of the C-Kermit code to make sure that
+no references to brstrip() depended the result buffer being persistent, or the
+result pointer indicating a position in the source buffer.  Oops, it turns out
+that thousands of places rely on brstrip() working in place.  Therefore the
+change had to be undone.  There's no good way to write a dummy-proof brstrip();
+programmers either have be sure they're not calling it with a pointer to a
+string constant, or else they have to copy the result back to the right place
+each time.  Better to leave it as it was and audit the code to fix any calls
+that refer to string constants (turns out there were only two).  Restored the
+original fix to doswitch() (replacing the string constant by a buffer holding
+the same string), plus minor fixes to ckcftp.c, ckuus[r36].c, 6 Aug 2002.
+
+We need file dialogs in several situations in the K95 GUI.  I added a "user
+query" routine for this, uq_file(), in ckuus3.c, filling it in only for Unix.
+Then I added code to call it from rcvfil() when (a) it's an autodownload, and
+(b) SET TERM AUTODOWNLOAD is ASK (I just added this option; it needs to be set
+to see it in action -- maybe it should be the default for KUI, in which case
+initialize "int autodl = ?" to TAD_ASK in ckcmai.c).  Works fine, except of
+course it interferes with the file-transfer display, but that won't be a
+problem in K95G.  ckuusr.h, ckuus[37].c, ckcfns.c, ckucns.c, 6 Aug 2002.
+
+Another place we need a file dialog is when Kermit is a URL interpreter.  The
+problem is: how can we let the user decide whether Kermit should ask?  There
+really isn't any way.  Either it always asks or it never does.  In this case I
+think it makes sense to always ask if it's KUI, otherwise never.  I added the
+code for ftp: URLs to to doftprecv2(), which I tested successfully in Unix
+before putting it into #ifdef KUI..#endif.  Also added code for http[s] to
+ckuusy.c in #ifdef KUI..#endif, not tested.
+
+Still need this added for K95G Actions->Capture.  The clearest example is the
+FTP one.  Just search for KUI in the FTP module.
+
+Some minor adjustments to yesterday's work, mainly just comments, plus
+generate the full pathname for the default file.  ckuus3.c, ckcftp.c,
+7 Aug 2002.
+
+Note: for some reason cmofi() is not supplying the default value if user
+enters an empty name... (but that won't affect the Windows version).
+
+Added /USER: and /PASSWORD: switches to SET TCP { HTTP-PROXY, SOCKS-SERVER }.
+ckuus3.c, 7 Aug 2002.
+
+New 'uninstall' target from PeterE, works by having the 'install' target
+write an UNINSTALL shell script.  makefile, 8 Aug 2002.
+
+Added some debugging statements to the VMS communications i/o module to try
+to track down a problem that occurs when the controlling terminal is a LAT
+device.  ckvtio.c, 10 Aug 2002.
+
+Fixed the non-K95 uq_file() to respect the given default name, but still show
+the fully qualified absolute pathname for the default in the dialog.  The
+reason to not use the fully qualifed name as the default in the cmxxx() calls
+is that this can easily result in a whole directory tree being created due to
+directory aliases, symlinks, etc.  So when you get a file by referring to its
+URL (e.g. ftp://kermit.columbia.edu/kermit/READ.ME), uq_file() converts the
+READ.ME part to (e.g.) /home/fdc/tmp/READ.ME but gives just "READ.ME" as the
+default when parsing the name.  This way the user knows where it will go and
+gets an opportunity to change it, and if the default is accepted, it goes into
+the current directory.  uq_file(): ckuus3.c, 10 Aug 2002.
+
+Found the spot for calling uq_file() for kermit:// URL downloads.  Added
+prefatory text to filename prompts for Kermit and FTP downloads.  ckcfns.c,
+ckcftp.c, 10 Aug 2002.
+
+Now with kermit:// or ftp:// URL downloads there's no way to disable the
+prompting.  I could easily make SET TERMINAL AUTODOWNLOAD ASK cover these
+cases too (even though "terminal" has nothing to do with FTP or URL
+downloads).  OK, I did this, but now prompting is disabled by default.
+ckcftp.c, ckcfns.c.  10 Aug 2002.
+
+Enabled file prompting (adl_ask) by default in K95G, disabled it by default
+everywhere else.  So now FTP and Kermit URL downloads as well as terminal-mode
+Kermit (but not Zmodem) downloads are prompted for if TERMINAL AUTODOWNLOAD is
+ASK, which is it by default only in K95G.  But this will happen only if
+uq_file() is filled in for K95G; otherwise everything should work as before.
+ckcmai.c, 10 Aug 2002.
+
+Notes:
+ . Need a better command to control this.
+ . FTP URL downloads are almost instantaneous, whereas Kermit URL downloads
+   take a really long time to set up (logging in takes at least 10 seconds).
+
+From Jeff, 13 Aug 2002:
+ . Increase K95 version to 2.1.0: ckcmai.c.
+ . SET TCP { HTTP-PROXY, SOCKS-SERVER } /USER: /PASSWORD: actions: ckuus3.c.
+
+From PeterE: a new install target that's only about half as a big as the
+previous one, yet still generates an UNINSTALL script.  makefile, 13 Aug 2002.
+
+Vace wanted to be able to give the FTP client an offset for the server time,
+in case the server's time (or timezone) is set incorrectly.  I added this by
+building on all the date/time parsing/arithmetic code -- notably delta times
+-- that was done for C-Kermit 8.0.  The new command is SET FTP
+SERVER-TIME-OFFSET delta-time; shows up in SHOW FTP and HELP SET FTP.
+ckcftp.c, 13 Aug 2002.
+
+Fixed HELP ASK and HELP GETOK text.  ckuus2.c, 14 Aug 2002.
+
+Fixed GETOK to accept /GUI switch even in K95.EXE and C-Kermit, just like ASK
+does (in which case, it just ignores it).  ckuus6.c, 14 Aug 2002.
+
+SET XFER CHAR TRANSPARENT no longer disables character-set translation because
+file-scanning turns it back on.  The "new way" to disable character-set
+translation is SET XFER TRANSLATION OFF.  This needlessly confuses users who
+expect the old way to still work.  So I fixed SET XFER CHAR TRANSPARENT to set
+XFER TRANSLATION OFF, and SET XFER CHAR anything-else to set it back ON.
+ckuus3.c, 15 Aug 2002.
+
+Fixed SET TERM AUTODOWNLOAD { ON, OFF } to turn off the ASK flag (adl_ask).
+ckuus7.c, 16 Aug 2002.
+
+Added FEAT query to FTP client from draft-ietf-ftpext-mlst-13.txt.  FEAT is
+sent along with REST 0, MODE S, and STRU F if /NOINIT is not included in the
+FTP OPEN command.  Parsing the FEAT result is handled by turning the "auth"
+argument to getreply() into a function code: GRF_AUTH to parse AUTH reply;
+GRF_FEAT to parse FEAT reply.  For GRF_FEAT, getreply() fills in a flag array,
+sfttab[] (server feature table); sfttab[0] > 0 means server responded to the
+FEAT query, in which case individual elements are set > 0 for each supported
+feature.  ckcftp.c, 18 Aug 2002.
+
+If server sends a feature list, display it if FTP DEBUG is on, then set mdtmok
+and sizeok (the flags that say whether it's OK to send MDTM and SIZE commands)
+accordingly.  If user gives an [M]PUT /RECOVER command and server has
+announced it doesn't support REST, print a warning but try anyway (maybe
+change this later).  Responses about other features that we use such as AUTH
+and PBSZ are ignored for now -- i.e. we try them anyway.  And of course
+responses for features we don't care about (LANG, TVFS, PROT) are ignored.
+ckcftp.c, 18 Aug 2002.
+
+If the server says it supports MLST, use MLSD instead of NLST to get the file
+list.  This is done in remote_files() with some simple string-twiddling.  Then
+replace the relevant (but not all) SIZE commands with code to first check if
+we already got the size from the MLSD response and use that instead rather
+than asking again.  Same deal for MDTM.  ckcftp.c, 18 Aug 2002.
+
+Checked that this works when giving pathnames in the MGET filespec.  Checked
+to make sure everything works as before with servers that don't support FEAT
+or MLSD.  Checked to make sure FTP OPEN blah /NOINIT worked with servers that
+do support FEAT and MLSD.  Checked that FTP CHECK works.  It's all OK.
+
+Tested only with Ipswitch server; need to find and test with others.
+
+The stack of temp files needed for MGET /RECURSIVE is annoying because what
+if we run out of file descriptors...  But the spec doesn't provide a way to
+request a recursive listing.
+
+Supplied a missing comma in HELP SET CD text.  ckuus2.c, 19 Aug 2002.
+
+Generalized parsing of MLST/MLSD file facts and values.  Got file type from
+server and had MGET skip non-regular files.  ckcftp.c, 19 Aug 2002.
+
+Kirk Turner-Rustin <ktrustin@owu.edu> reported that if Unix C-Kermit has a SET
+HOST PTY connection (e.g. SSH) open, local window size changes are not
+propogated through the connection to the host.  I imagine that must be because
+the SIGWINCH signal is caught by Kermit and its children don't see it; maybe
+if I pass it along to the child fork, all will be OK.  Began by exporting
+"slavepid" from the pty module and changing its name to pty_fork_pid.  Moved
+the SIGWINCH handler, winchh(), from ckctel.c to ckutio.c.  Armed it from Unix
+sysinit() so it's always armed.  This way window changes affect Unix C-Kermit
+no matter what mode it's in: tt_rows, tt_cols, cmd_rows, and cmd_cols are all
+kept in sync.  Then if we're not in remote mode (i.e. we have a ttyfd), we
+call tn_snaws() and rlog_snaws() (which should be ok since they return right
+away if the appropriate kind of connection is not open) and then if
+(pty_fork_pid > -1), a SIGWINCH signal is sent to it.  ckupty.c, ckctel.c,
+ckutio.c, 20 Aug 2002.
+
+All this works fine except the PTY part; in other words, the original problem
+is not fixed.  The "kill(pty_fork_pid,SIGWINCH)" call executes without error
+but has no effect because the size of the PTY never changed.  To make this
+work I had to add an ioctl() to change the size of the PTY before sending it
+the SIGWINCH.  Compiles and works ok on Linux and Solaris; Kirk also confirmed
+it for AIX 4.3.3.  ckutio.c, 20 Aug 2002.
+
+Fixed xlookup() to work for uppercase keywords.  ckucmd.c, 20 Aug 2002.
+
+Fixed FTP parsefeat() and parsefacts() to use xlookup() instead of lookup(),
+since abbreviated keywords are not allowed.  ckcftp.c, 20 Aug 2002.
+
+Adjusted some lines from yesterday's window-size code for platforms I hadn't
+tried yet.  ckutio.c, 21 Aug 2002.
+
+EXIT from K95 when it has an FTP connection open and it pops up the
+Locus dialog.  Made it not do this if it knows it's in the act of EXITing.
+ckuus[rx].c, 22 Aug 2002.
+
+In K95, FTP GET in ASCII mode results in a file with Unix line terminators
+even though the protocol is correct:
+
+  RETR smjulie.txt
+  150 Opening ASCII mode data connection for smjulie.txt (1878 bytes).
+
+The source file is a regular Unix text file with LF at the end of each line.
+It's incredible that nobody noticed this before.  It only came to light when
+somebody tried to open a downloaded text file with Notepad, which doesn't
+handle Unix-format files (Wordpad and Emacs have no problems with them).  The
+problem was in doftprecv2() in the FTT_ASC section.  There was no conditional
+code for Unix vs Windows.  In all cases, the code discarded incoming CR's in
+ASCII mode.  I put the CR-discarding code in #ifdef UNIX..#endif.  ckcftp.c,
+22 Aug 2002.
+
+Removed super-verbose debugging from gtword(): ckucmd.c, 23 Aug 2002.
+
+Gregory Bond reported a problem with "if defined \$(BLAH) ..." inside of a
+SWITCH statement.  It wasn't really the SWITCH that was doing it, it was the
+fact that he had enclosed the SWITCH case in braces, which made it an
+"immediate macro" (XXMACRO).  The XXMACRO code parsed the macro definition
+(the part inside the braces) with cmtxt(...,xxstring), which should have been
+cmtxt(...,NULL) to defer the evaluation of the interior of the macro until it
+was executed.  This is better illustrated with the following example:
+
+  { echo START, for \%i 1 3 1 { echo \%i }, echo STOP }
+
+which totally fell on its face prior to the fix.  Also fixed ?-help for
+immediate macros, which was broken too.  ckuusr.c, 23 Aug 2002.
+
+RFC959 says STOU does not take an argument.  But every FTP server I've
+encountered but one accepts the arg and constructs the unique name from it,
+which is better than making up a totally random name for the file, which is
+what RFC959 calls for.  Especially because there is no way for the client to
+find out the name chosen by the server (because RFC 959 and 1123 are
+contradictory, plus no servers follow either one of them for this anyway).  So
+we try STOU with the argument first, which works with most servers, and if it
+fails, we retry it without the arg, for the benefit of the one picky server
+that is not "liberal in what it accepts" UNLESS the first STOU got a 502 code
+("not implemented") which means STOU is not accepted, period (which happens
+with ProFTPD).  ckcftp.c, 25 Aug 2002.
+
+Added SET FTP ANONYMOUS-PASSWORD (plus help text and show value).  ckcftp.c,
+25 Aug 2002.
+
+Made FTP command "not available" if NOFTP is defined.  ckuusr.c, 25 Aug 2002.
+
+Forced client to send a TYPE command upon initial connection, since given
+the variable quality of FTP servers, it's not safe to assume the server is
+in ASCII or any other particular mode.  ckcftp.c, 25 Aug 2002.
+
+SET FTP CHARACTER-SET-TRANSLATION ON is completely broken in K95, although it
+works fine in C-Kermit.  Furthermore it is broken in both the GUI and Console
+versions, so it's not a Unicode vs OEM console-character-set issue.
+
+Added Concurrent PowerMAX OS target from Tom Horsley.  makefile, ckuver.h,
+27 Aug 2002.
+
+Minor fixes to FTP module from Jeff.  ckcftp.c, 27 Aug 2002.
+
+New Makefile target for Mac OS X 10.2, needs -DNDSYSERRLIST added, from
+William Bader.  2 Sep 2002.
+
+SET OPT DIR /DOTFILES didn't work for server listings.  A few years ago when
+I front-ended zxpand() with nzxpand(), I missed a couple places where
+traverse() needed to refer to xmatchdot (nzxpand's argument flag) rather than
+global matchdot.  Fixed in traverse(): ckufio.c, 2 Sep 2002.
+
+From Jeff, 4 Sep 2002:
+ . setautodl(x) -> setautodl(x,y): ckuusr.h, ckuus[7y].c
+ . Add another parameter to popup_readblah(): ckuus6.c
+ . Sort out some confusion in scanfile() where a parameter was also used as a
+   local flag.  ckuusx.c.
+ . Protect restoring of saved terminal idle parameters with a flag that says
+   they were actually saved.  ckuusr.c.
+ . Rework uq_text() and uq_mtxt().  ckuus3.c.
+ . Fix FTP charset translation for little-endian hardware: ckcftp.c.
+
+The latter still doesn't work in Linux:
+
+  (/home/fdc/kermit/) C-Kermit>set ftp server-character-set latin1-iso
+  (/home/fdc/kermit/) C-Kermit>set file character-set utf8
+  (/home/fdc/kermit/) C-Kermit>get latin1.txt
+
+Results in "????????: file not found".  But it works fine on the Sun.
+
+Jeff's patch removed a little-endian byte-swap (LEBS) from doftpsend2().  But
+the real problem was that LEBS was not being done consistently throughout the
+module.  There were similar xgnbyte()/xpnbyte() loops elsewhere in the code,
+and all of them needed to work the same way.  Undoing Jeff's fix and then
+adding the LEBS to the loop in getreply() makes downloads work right, but the
+messages are still messed up (they come out in Chinese :-)  Begin by moving all
+byte-swapping operations that occur in ckcftp.c itself into a new function,
+bytswap().  It's either right to do it all the time, or to do it never; this
+way we can turn it on and off in one place.
+
+xp/gnbyte() include behavior that depends on what Kermit is doing: W_SEND,
+etc.  xpnbyte() tests W_KERMIT, which is a combination of W_SEND, W_RECV, etc.
+Defined a new symbol W_XFER, which is like W_KERMIT but includes W_FTP.  These
+are all the "whats" in which character sets might need to be converted.
+Changed the W_KERMIT reference in xpnbyte() to W_XFER.  Fixed the inderminate
+"what" state after an FTP command by moving "what = W_COMMAND;" from before
+the main parse loop to inside it (this didn't matter before the addition of
+FTP but now it does).  ckcker.h, ckcftp.c, ckuus5.c, 6 Sep 2002.
+
+Finally I changed xlatec() to be consistent with all the other xgnbyte() /
+xpnbyte() usage throughout the FTP module and, poof, everything worked in
+Linux (and still works on the Sun).  We still need some work in Windows (where
+the file character-set is not necessarily the console character set for
+messages) but we can tackle that next.  ckcftp.c, 6 Sep 2002.
+
+Checking yesterday's work:
+
+Kermit file transfers with charset translation work fine in both directions.
+
+FTP GET with charset translation works fine on both BE and LE
+
+Fixed a typo in yesterday's changes that made FTP PUT with charset translation
+always upload 0-length files.  ckcftp.c, 7 Sep 2002.
+
+FTP PUT (after the typo was fixed) with charset translation works fine on BE,
+but on LE the message comes out in Chinese and the resulting file gets ? or
+nothing for all for the accented letters:
+
+      FTP...  Kermit 
+      Up  Dn  Up  Dn  Term
+  BE  OK  OK  OK  OK   xx
+  LE  no  OK  OK  OK   xx
+
+xx = C-Kermit CONNECT mode with translation doesn't seem to do anything, not
+only in today's code, but also in the 8.0 release version: "set term char
+latin1 utf8" -- SHOW CHAR shows the right stuff, but no translation is done.
+Ditto for the 7.0 release.  That can't be right...
+
+But one problem at a time -- what's wrong with LE FTP uploads?  Note that
+XLATE works on the same machine, so it's obviously confusion in xgnbyte()
+about "what".  Suppose we make xgnbyte() ALWAYS return bytes in BE order.
+This makes sense because xgnbyte() is almost always used to feed xpnbyte(),
+and xpnbyte() requires its bytes to come in BE order.  This means that all
+code that uses xgnbyte()/xpnbyte() loops can be simplifed, which I did for
+the FTP module.  ckcfns.c, ckcftp.c, 7 Sep 2002.
+
+Of course Kermit protocol uses xgnbyte() too, but only for filling
+packets, and packets never contain UCS2 and even if they did, it would have
+to be big-endian, so no changes needed for getpkt().  Now we have:
+
+      FTP...  Kermit 
+      Up  Dn  Up  Dn
+  BE  OK  OK  OK  OK
+  LE  OK  OK  OK  OK
+
+Now let's look at the remaining xgnbyte() calls in the rest of the code:
+
+ckuus4.c:
+  xlate() uses it of course.  I simplified the general-case loop.
+  Works OK on both Sun and Linux.
+
+ckuus6.c:
+  typegetline() uses it.  I commented out the byte swap.  Seems OK.
+
+Built and tested on Linux, Solaris, and SunOS.  I'm sure I must have broken
+something, but the main things are better than they were.  Kermit and FTP
+transfers need testing in K95, as well as the TYPE command (there's a bunch of
+special K95 code in there).  C-Kermit charset translation during CONNECT is
+still broken, or else I forgot how to use it, but that's a separate issue
+since xgnbyte()/xpnbyte() are not involved.  And we still need to do something
+in FTP getreply() for K95 to convert messages to the console character set for
+display, rather than the file character set (should be trivial).  Also there's
+still a lot of extra debugging and commented-out junk in ckcftp.c to be
+cleaned up after more testing.
+
+During yesterday's testing, I noticed that REMOTE SET { FILE, XFER }
+CHARACTER-SET didn't work.  The server accepted these commands but they didn't
+seem to do anything.  In fact, they did work, but they were undone later by
+code in sfile() that restored the global settings in case they had been
+temporarily overridden by autoswitching or whatever.  The solution is to
+"unsave" the saved values whenever a global setting is performed explicitly.
+Tested successfully against Sun and Linux servers.  Also the server end of
+REMOTE SET needed updating for Unicode.  ckcfn[s3].c, ckuus3.c, 8 Sep 2002.
+
+Cleaned commented-out cruft and extra debugging from ckcftp.c.  8 Sep 2002.
+
+Kermit autodownload with ASK file dialog: if user supplied an absolute
+pathname, it was treated like a relative one.  Fixed the invocation of
+uq_file() in rcvfil() to temporarily override the RECEIVE PATHNAMES setting.
+ckcfns.c, 10 Sep 2002.
+
+Added SET TERMINAL ROLL KEYSTROKES { SEND, RESTORE-AND-SEND, IGNORE }, parse
+only.  Needs implementation (search for tt_rkeys and rollkeytab in ckuus7.c).
+ckuusr.h, ckuus[27].c, 10 Sep 2002.
+
+If FILE INCOMPLETE is DISCARD and a file is being received by IKSD but IKSD
+gets a Telnet LOGOUT command, the partial file is not deleted.  In fact this
+happens any time doexit() is called for any reason during file reception,
+e.g. because of SIGHUP.  Added code to doclean() to check if a download
+output file was open, and if so, to delete it after closing it if keep==0.
+ckuusx.c, 10 Sep 2002.
+
+Added a brief one-line message after remote-mode file transfer saying
+what (or how many) file(s) were transferred, where they went, and whether
+the transfer was successful -- kind of an automatic WHERE command, useful
+with autodownloads so you know what happened.  ckcpro.w, 11 Sep 2002.
+
+The Unix and VMS C-Kermit CONNECT modules have botched remote-charset to
+local-UTF8 translation ever since the Unicode was first added in v7.0.  Fixed
+in ckucns.c, ckucon.c, ckvcon.c, 11 Sep 2002.
+
+On to pattern-matching...  The matchdot business should apply only for (Unix)
+filename matching, not for general string matching.  Fixed in ckmatch():
+ckclib.c, 11 Sep 2002.
+
+A bigger problem occurs in filename matching.  Somehow the dirsep == fence
+business interferes with matching {foo,bar,baz} segments.  For example, I have
+a filename "foo" and I want to match it with the pattern "{foo,bar}".  Somehow
+the segment pattern becomes "*/foo" and doesn't match the string.  Where does
+the '/' get tacked on?  I don't even know how to explain this, but the short
+story was that ckmatch(), under certain circumstances, would back up to before
+the beginning of the filename string, which just happened to contain a "/"
+(and before that a ".") because of who was calling it.  Obviously this is not
+how to write a pattern matching function...  Ensuring that it never backs up
+beyond the beginning of a string fixed the immediate problem and does not seem
+to have broken any other matching scenarios (I have 150 of them in my test
+script).  ckclib.c, 11 Sep 2002.
+
+There's still a problem though.  Suppose the a client sends "dir {{.*,*}}" to
+a server.  This asks for a directory listing of all files that begin with
+dot as well as all files.  Still doesn't work because we don't normally show
+dot-files, but in this case it SHOULD work because ".*" was explicitly
+requested.  Staring at the ckmatch() code revealed how to fix this, and I did,
+but that was only half the problem.  The other half was that the list of
+files being fed to ckmatch() did not include the dotfiles in the first place.
+The cure here is to change nzxpand() to prescan the pattern to see if it
+includes a leading dot, and if so to set the "xmatchdot" flag itself, even
+if it wasn't set by the caller.  ckclib.c, ckufio.c, 11 Sep 2002.
+
+Now that {foo,bar,...} patterns work better, I added a quick hack to the
+DIRECTORY command to allow multiple filespecs to be given, in which case we
+combine them into a {file1,file2,...} pattern before calling nzxpand().  Works
+fine but it's a hack because you don't get file lists upon "?" in the second
+and subsequent filespec fields, but I doubt anyone will notice.  So now,
+finally, people can do "dir .* *" like they do in Unix (except with ls) to get
+a listing of all files in a directory without having to know about or use the
+/DOTFILES switch.  This was NOT done for the server end of RDIR because of
+ambiguity of spaces as separators versus filename characters.)  domydir():
+ckuus6.c, ckuus[r2].c, 11 Sep 2002.
+
+Added a CONTINUE command.  In a script, this does whatever CONTINUE did before
+(e.g. in a FOR or WHILE loop).  At the prompt, it calls popclvl(), which gives
+a more natural way to continue a script that has "shelled out" to the prompt.
+ckuusr.[ch], 11 Sep 2002.
+
+Added help text for CONTINUE.  ckuus2.c, 12 Sep 2002.
+
+From Jeff, 16 Sep 2002:
+ . SET TERM ROLL KEYSTROKES for K95: ckuusr.h, ckuus7.c
+ . Remove the doexit() call from the Telnet TELOPT_LOGOUT handler: ckctel.c
+
+Fixed an FTP debug message to be consistent with Kermit ones.
+ckcftp.c, 16 Sep 2002.
+
+Added SET/SHOW TRANSFER REPORT to turn the post-transfer report off and on.
+ckuusr.h, ckuus[234].c, 16 Sep 2002.
+
+Fixed Solaris (and maybe some other SVORPOSIX builds) to find out their full
+hostname rather than just short form (e.g. watsol.cc.columbia.edu rather than
+just watsol).  ckhost(): ckuusx.c, 16 Sep 2002.
+
+"cat somefile | kermit -Ts -" is supposed to send stdin in text mode, but
+K95's file transfer display reports BINARY.  Looked at C-Kermit code; it seems
+fine.  Looked at packet and debug logs; C-Kermit was indeed sending in text
+mode and announcing it correctly.  K95 gattr() is doing the right thing:
+
+  gattr file type[AMJ]=3
+  gattr attribute A=text=0
+  gattr sets tcharset TC_TRANSP[A]
+
+Same thing happens when C-Kermit is receiving.  Yet when I send an actual
+file, rather than stdin, it's received in text mode.  The only difference is
+that stdin does not have a Length attribute in its A-packet, so in this case
+the receiver skips any calls to screen() that show the length or percent done.
+Aha, so maybe it's just a display problem -- scrft() is not being called to
+repaint the file type if the size was not known.  Fixed in opena() by
+removing the IF clause from "if (fsize > -1L) xxscreen(SCR_FS,0,fsize,"");".
+ckcfn3.c, 18 Sep 2002.
+
+K95 user has a listfile containing some regular filenames and then some
+filenames that include paths and has all kinds of problems with MGET /LISTFILE
+(pieces of different names concatenated to each other, etc).  Setting up the
+same scenario here, I don't see the same problems but I do see "Refused: Name"
+when we go to get a path/name file.  This happens because (a) we had already
+got a top-level file with a certain name, (b) a file in a subdirectory has the
+same name, (c) we are stripping the path before calling zchki(), and (d)
+FTP COLLISION is set to DISCARD.  How do we make FTP not strip the path?
+
+This is an interesting question...  The answer depends on where the user
+wants the file to go.  Normally if you tell an FTP client to "get foo/bar",
+you want the file "bar" to be downloaded to the current directory.
+
+Anyway, it turns out the FTP module uses paths locally during MGET only if
+/RECURSIVE was specified.  So:
+
+  mget /listfile:blah /recursive
+
+should have made this work, but it didn't because in the /LISTFILE case,
+we have effectively turned an MGET into a series of GETs, where the code to
+check whether to strip the path didn't check the recursive flag because how
+could a GET (as opposed to an MGET) be recursive?  Adding this exception to
+the if-condition got us a bit farther but now when we try to open the output
+file in doftprecv2(), zopeno() fails because the name contains a dirsep.
+We have to call zmkdir() first but that wasn't happening because some other
+flag wasn't set right in this case.  Finally zmkdir was called, but with
+the wrong string.  After fixing that, it works.  Now we should be able
+to use /RECURSIVE to force the pathname to be used on the local end.
+ckcftp.c, 19 Sep 2002.
+
+Checked FTP filename conversion issues.  FTP FILENAMES AUTO is supposed to
+mean LITERAL if "wearealike" OR server is UNIX or Windows, otherwise
+CONVERTED, but there were places where this rule was not applied consistently,
+fixed now.  ckcftp.c, 21 Sep 2002.
+
+Added SET FTP DISPLAY, which is like SET TRANSFER DISPLAY but applies only to
+FTP, mainly because I tended to type it all the time.  Now if you have dual
+sessions, each session can have its own transfer display style.  ckcftp.c,
+ckuusr.h, ckuus[347].c, 21 Sep 2002.
+
+Back to FTP MLSD.  We're supposed to match the pattern locally, not rely on
+the server to filter its list according to the client's pattern.  Thus we must
+also allow an empty argument to MGET and must not send a filespec with MLSD.
+Actually this is tricky -- how is the client supposed to know whether to send
+a filespec.  For example, if the user's command is "mget foo*bar", and the
+server supports MLSD, then what should the client do?  The client does not
+know the wildcard syntax on the server, so for all the client knows, this
+might be a valid directory name, in which case it should be sent.  On the
+other hand, the user might intend it as a wildcard, in which case it should
+NOT be sent.  But the FTP client can't read the user's mind.  This is another
+serious flaw in the Elz/Hethmon draft.  Anyway, I got the local matching
+business working for MLSD as long as the user's MGET arg is really a pattern
+and not a directory name.  To be continued...  ckcftp.c, 21 Sep 2002.
+
+Added FTP { ENABLE, DISABLE } { FEAT, MLST }.  If we always send FEAT, we
+usually get a complaint.  If we send FEAT and MLST is negotiated, there is a
+good chance it is misimplemented or will have undesirable side effects, such
+as sending huge file lists.  NOTE: /NOINIT on the FTP OPEN command also
+disables both of these.  ckcftp.c, 22 Sep 2002.
+
+Fixed mkstemp() code in FTP remote_files().  mktemp() does not open the file,
+mkstemp() does open it; previously we had been opening it again and never
+closing the first instance so every MGET would create another open file
+descriptor.  ckcftp.c, 22 Sep 2002.
+
+Added debug messages for temp-file creation and lines read from the temp file.
+ckcftp.c, 22 Sep 2002.
+
+Eliminated sending of some extraneous TYPE commands, but there's still room
+for improvement.  ckcftp.c, 22 Sep 2002.
+
+Moved definition of build date to top of ckcmai.c.  22 Sep 2002.
+
+Added recursion to MGET with MLSD...  It's all done in remote_files().
+Temp-file pointers are on a stack (max size 128).  When parsing MLSD lines
+from the temp file and we see "type=dir", we create the local directory by
+calling zmkdir(), change to the remote by sending CWD, increment the depth,
+and call ourselves.  When reading from a temp file, upon EOF we close and
+dispose of the temp file, return -3 if currently at top level, otherwise we
+free the tmpfile name, decrement the depth, send CDUP to the server, "cd .."
+locally, and go back and read the next line from the previous but now current
+temp file.  Conceptually simple but needed hours of debugging -- what must
+be static, what must be on the stack...  Seems OK now but still needs some
+heavy testing.  ckcftp.c, 22 Sep 2002.
+
+Added FTP { ENABLE, DISABLE } { SIZE, MDTM } and add help text for FTP
+ENABLE and DISABLE.  ckcftp.c, 23 Sep 2002.
+
+Don't allow restart if SIZE disabled.  ckcftp.c, 23 Sep 2002.
+
+Make sure all implicit SIZE commands are surpressed if SIZE disabled.
+ckcftp.c, 23 Sep 2002.
+
+If an explicit FTP MODTIME command is sent when MDTM is DISABLED, and it
+succeeds, re-ENABLE MDTM.  Ditto for SIZE.  ckcftp.c, 23 Sep 2002.
+
+If an explicit FTP FEATURES command is sent during an FTP session, redo the
+features database from it.  ckcftp.c, 23 Sep 2002.
+
+After further discussion with Robert Elz, I realized I had to expose the
+underlying MGET mechanisms to the user; the draft isn't going to change, and
+the new spec will result in undesirable effects if the client tries to "do the
+right thing" by magic in all situations; thus the user must have some new
+controls:
+
+  MGET [ /MLST, /NLST, /MATCH:xxx ] [ filespec [ filespec [ ... ] ] ]
+
+These switches let the user force the use of MLSD or NLST when there's a
+choice, and to force local use of a pattern rather than sending it to the
+server, and even to send a directory name to the server at the same time as
+specifying a pattern for local matching, and of course by default we try to do
+the right thing in all scenarios.  Symbols only; not coded yet.  ckuusr.h,
+23 Sep 2002.
+
+Added the three new switches to MGET, plus /MLST is an invisible synonym for
+/MLSD.  If /NLST or /MLSD is given it, it forces the corresponding FTP protocol
+directive.  ckcftp.c, 25 Sep 2002.
+
+Now for the tricky part: now we have two separate concepts for what to send to
+the server: a filename or wildcard to be interpreted by the server (NLST only)
+or a directory from which to get a list of all the files (NLST or MLSD),
+possibly together with a pattern to be used by the client to match filenames
+returned by the server.  This required giving remote_files() an additional
+argument.  Now it uses "pattern" (if any) strictly for local pattern matching
+(because now it is the /MATCH: switch argument, not the MGET filespec), and
+"arg" (the MGET filespec) is what it sends to the server, maybe (see the
+comments in the code for the actual details); either or both these can be
+null.  ckcftp.c, 25 Sep 2002.
+
+Discovered that "mget foo", where foo is a directory name, never worked.
+Fixed in remote_files(): ckcftp.c, 25 Sep 2002.
+
+Going through every combination of NLST, MLSD, /MATCH:, and MGET arg and
+debugging each case until OK...  Then also with the panix.com NetBSD server
+(lukemftpd 1.0) which also supports MLSD....  11 test cases all debugged and
+tested OK.  ckcftp.c, 26 Sep 2002.
+
+Added /NODOTFILES switch to FTP MGET, to control what happens with dot-files
+if the server includes their names in the list (as lukemftpd does).  There's
+no point in adding a /DOTFILES switch because what could it possibly do?
+ckcftp.c, 26 Sep 2002.
+
+Changed a bunch of "skipthis++" to "continue" in doftpget(), to avoid
+error messages when skipping files that user said she wanted to skip.
+ckcftp.c, 26 Sep 2002.
+
+Added help text for the new MGET switches.  ckcftp.c, 26 Sep 2002.
+
+Don't switch LOCUS when making an FTP connection until logged in.
+ckcftp.c, 26 Sep 2002.
+
+Fixed LDIR to run Kermit's built-in DIRECTORY code rather than the external
+directory program.  ckuusr.c, 26 Sep 2002.
+
+Protect iswild() against NULL args.  ckufio.c, 26 Sep 2002.
+
+From Jeff: SET GUI WINDOW RUN-MODE { MAXIMIZE, MINIMIZE, RESTORE },
+plus variables for GUI Window X position, GUI Window Y position, GUI
+Window X resolution, GUI Window Y resolution, GUI Window Run mode.
+ckuusr.h, ckuus[24].c, 27 Sep 2002.
+
+From Ronan Flood: updated FreeBSD 1.0 makefile entry, plus an #ifdef to protect
+sysconf() calls.  makefile, ckutio.c, 28 Sep 2002.
+
+Change ftp_auth() to return(0) if an AUTH command gets a 500 response, so it
+doesn't keep sending other kinds of AUTH commands.  ckcftp.c, 29 Sep 2002.
+
+Changes from Jeff to yesterday's changes.  ckcftp.c, 30 Sep 2002.
+
+From Jeff: SSH command-line personality.  Uses same command line as the Telnet
+personality.  ckcker.h, ckcmai.c, ckuus[4y].c, 3 Oct 2002.
+
+From Jeff, 7 Oct 2002:
+ . SET PRINTER CHARACTER-SET.  ckuxla.c, ckuusr.h, ckuus[25].c
+ . Promotion of K95 to Beta.01.  ckcmai.c
+ . Promotion of SET GUI { MENUBAR, TOOLBAR } to visible.  ckuus3.c
+
+Changed the URL parser as follows: if the username and/or password fields are
+present but empty, as in:
+
+           ftp://@ftp.xyzcorp.com/somepath
+  or:      ftp://:@ftp.xyzcorp.com/somepath
+  but not: ftp://:ftp.xyzcorp.com/somepath
+
+the pointer for these items becomes a pointer to an empty string, rather than
+a NULL pointer.  Then when we go to open the connection, if the username
+string pointer points to an empty string, we prompt for the username (and/or
+password).  ckuusy.c 9 Oct 2002.
+
+Jason Heskett reported an interesting bug involving a core dump when an
+ON_EXIT macro is defined that executes another macro.  Sometimes.  He was able
+to send a short command file that always crashed.  Diagnosis: ON_EXIT, when it
+is called, pokes itself out of the macro table by setting its own entry in the
+macro name list to an empty string.  But this interferes with any macro
+lookups that are done while executing ON_EXIT's body and also evidently some
+code is not happy with empty macro names...  To fix: replace "on_exit" with
+"on_exxx", so the replacement keyword is (a) nonempty, and (b) doesn't wreck
+the alphabetical sorting of the table.  ckuusx.c, 9 Oct 2002.
+
+Added makefile targets for FreeBSD 4.6 and 5.0.  Built and tested on 4.6;
+don't know about 5.0.  ckuver.h, makefile, 9 Oct 2002.
+
+Added targets for AIX 5.2 and 5.3; totally untested.  ckuver.h, makefile,
+9 Oct 2002.
+
+Built current source on Unixware 7.1.3 (make uw7); it's fine.  9 Oct 2002.
+
+Promoted C-Kermit to 8.0.206 Beta.01 in hopes of a simultaneous release
+with K95 2.1.  ckcmai.c, 9 Oct 2002.
+
+From Jeff: Change KERMITFONT definitions to use the new (Unicode 3.1) code
+points for the terminal graphics characters (such as VT100 horizontal scan
+lines), rather than private-use codes.  ckcuni.c, 10 Oct 2002.
+
+Jason Heskett also complained that REMOTE CD would print the name of the new
+directory returned by the server even if he SET QUIET ON.  This is a tricky
+one.  Which server replies should the QUIET settings apply to?  If I give a
+REMOTE DIRECTORY command, it means I want to see the directory listing,
+period.  But if I give a REMOTE CD command, I get an "unsolicited" response
+message that SET QUIET ON should suppress.  Adding message suppression to 
+rcv_shortreply() is close, but not totally right; for example, it also
+suppresses the response to REMOTE PWD, which is not helpful.  The only right
+way to do this is to suppress for REMOTE CD only, which can be done only by
+setting a (new) global flag, rcdactive.  ckuus[r57].c, ckcpro.w, 10 Oct 2002.
+
+Ditto for REMOTE LOGIN response message ("Logged in").  ckuus7.c, 11 Oct 2002.
+
+From Jeff: SET GUI WINDOW FONT { NAME, SIZE }. ckuusr.h, ckuus4.c, 11 Oct 2002.
+
+Quick preliminary 8.0.206 build-all:
+
+ OK SunOS 4.1.3
+ OK Solaris 2.5.1
+ OK Solaris 9
+ OK AIX 4.3.3
+ OK HP-UX 10.20
+ OK VMS 7.1 Alpha + TCP/IP
+ OK VMS 7.1 Alpha nonet
+ OK VMS 5.5 VAX + TCP/IP
+ OK VMS 5.5 VAX nonet
+ OK Unixware 7.1.3
+ OK FreeBSD 3.1
+ OK FreeBSD 4.6
+ OK NetBSD 1.5.2 MVME (Gerry B)
+ OK Sinix 5.42
+
+Sinix build got stuck on ckuusr.c even though we're not optimizing on Sinix
+any more.  Rebooting the machine fixed it.
+
+Fixed some #ifdefs for VMS in new incomplete-file deletion code in doclean().
+ckuusx.c, 11 Oct 2002.
+
+Moved uq_blah() prototypes from ckuusr.h to ckcker.h because these routines
+are called in modules that don't (and shouldn't have to) include ckuusr.h.
+11 Oct 2002.
+
+Jeff verified secure builds on Linux and Solaris.
+
+Custom-build workout: 80 different feature-selection combinations:
+ . Fixed yesterday's change for NOSPL: ckcfns.c.
+ . Fixed conflict between NORECALL and USE_ARROWKEYS: ckucmd.c.
+ . Moved setseslog() from ckuus5.c to ckuusx.c to avoid link-time foulups.
+ . Fixed an unguarded reference to zmkdir() in ckcftp.c.
+ . Protected rmsg() by #ifndef NOXFER: ckuus7.c.
+ . Protected initxlist() by #ifndef NOXFER: ckcmai.c.
+ . Fixed unguarded references to g_url struct in xx_ftp(): ckuusy.c.
+ . Fixed unguarded references to tt_snaws() in winchh(): ckutio.c.
+
+--- 8.0.206 Beta.01 11 Oct 2002 ---
+
+From Jeff, 16 Oct 2002:
+ . Fix K95 RMDIR: ckcfn3.c.
+ . Makefile targets for Red Hat 7.2, 7.3, 8.0: ckuver.h, makefile.
+ . Added \v(log_xxx) for each kind of log for PeterE: ckuusr.h, ckuus4.c.
+ . Added SET TERM ATTRIBUTE DIM { ON, OFF }: ckuus[27].c.
+ . Change "const" to "CONST" in some PAM declarations.  ckufio.c.
+
+Added SET MATCH { DOTFILE, FIFO } { ON, OFF }.  A FIFO special file is a named
+pipe, used for interprocess communication.  It must be opened at both ends, so
+it's silly to match them by default; opening a FIFO and attempting to read
+will block forever unless somebody is writing into the other end.  Made the
+MATCH FIFO default OFF in all cases.  The dotfile default is the same as
+always (OFF for UNIX, ON elsewhere); SET MATCH DOTFILE is simply a more
+untuitive and findable command than SET WILD KERMIT /MATCH-DOT-FILES.  Note
+that SET MATCH DOTFILE undoes SET OPTIONS DIRECTORY /[NO]DOTFILES, and vice
+versa.  ckcmai.c, ckuusr.h, ckuus[23].c, ckufio.c. 17 Oct 2002.
+
+Added client and server end of REMOTE SET MATCH { DOTFILE, FIFO } { ON, OFF }.
+The new protocol codes are 330 and 331, respectively.  ckuus[367].c, ckcfns.c,
+17 Oct 2002.
+
+Adjusted the "match dot if pattern starts with dot" heuristic in nzxpand()
+to not kick in if the filespec is "./foo".  This probably needs more work.
+ckufio.c, 17 Oct 2002.
+
+Fixed typo in transcribing Jeff's ckcfn3.c code from yesterday.  18 Oct 2002.
+
+Moved some help text out of #ifdef ANYSSH that had nothing to do with SSH.
+(Idea for a new EMACS feature: M-X list-ifdef-environment.)
+ckuus2.c, 18 Oct 2002.
+
+Removed "set file { permission, protection }" keywords, which led nowhere.
+ckuus7.c, 18 Oct 2002.
+
+Added -DSV68 to all SV/68 targets.  Make ckgetfqhostname() just return its
+argument in SV/68; it dumps core otherwise.  In case this happens anywhere
+else, add -DNOCKGETFQHOST to CFLAGS.  makefile, ckcnet.c, 18 Oct 2002.
+
+For PeterE, added SET { SEND, RECEIVE } PERMISSIONS { ON, OFF } so incoming and
+outbound permission attributes can be set separately. ckuus[27].c, 18 Oct 2002.
+
+Changed SHOW ATTRIBUTES to show In and Out permissions separately.
+ckuus5.c, 18 Oct 2002.
+
+Fixed REDO to display the command it's redoing and to add it to the bottom
+of the recall buffer.  ckuusr.c, 18 Oct 2002.
+
+Discovered that DATE SATURDAY dumps core...  Apparently it always did; this
+case was not included in the date-time torture test script.  The crash happens
+because the DATE parsing code doesn't check for a NULL date-converion
+error-message pointer.  Fixed in ckuusr.c, 18 Oct 2002.
+
+The reason DATE SATURDAY got a date-conversion error was that this path thru
+the code left a result pointer unset.  Fixed in cmcvtdate(): ckucmd.c,
+19 Oct 2002.
+
+DATE SUNDAY +1DAY returned incorrect results (for any day-of-week name, any
+delta time), even though DATE TODAY +1DAY worked fine.  Fixed in cmcvtdate():
+ckucmd.c, 19 Oct 2002.
+
+SET TAKE ECHO ON counted each line twice when GOTO was active.  Fixed in
+dogoto(): ckuus6.c, 19 Oct 2002.
+
+Jeff noticed:
+"KERMIT READY TO GET...
+ RCVD: (2 files) Last: [/amd/prost/p/kd/jaltman/.src/ckonet.c] (OK)
+the last file attempted may have been ckonet.c but it certainly was
+not the last file received" (similarly for sending).  Fixed by having two
+pointers for each name; a preliminary pointer, which is set for each file at
+the beginning of the transfer (when we have all the needed info), and a final
+one that is set from the preliminary one only after the file was transferred
+successfully.  This corrects not only the automatic "wheremessage" at the end
+of a remote-mode transfer, but also the WHERE and SHOW FILE command results.
+ckuusx.c, ckcfn[s3].c, ckcpro.w, 19 Oct 2002.
+
+From Jeff: Improve ORIENTATION message for K95 to say which directories are
+for which INI files.  ckuusr.c, 23 Oct 2002.
+
+Removed Beta designation from herald.  ckcmai.c, 23 Oct 2002.
+
+Put final dates and ID strings in Unix and VMS build procedures.
+Makefile, ckvker.com, 23 Oct 2002.
+
+Build-all...  #ifdef adjustments: ckcfns.c...  83 different feature-set
+combinations build OK on Linux.  23 Oct 2002.
+
+From Jeff: SET WIN95 HORIZONTAL-SCAN-LINE-SUBSTITUTIONS.  ckuusr.h, ckuus7.c,
+24 Oct 2002.
+
+Fixed Heath-19 graphic character-set table to use new Unicode 3.1 values
+if WIN95 HORIZ OFF.  ckcuni.c, 24 Oct 2002.
+
+Changed tx_usub() to return Unicode 3.1 values if WIN95 HORIZ OFF.
+ckcuni.c, 24 Oct 2002. <-- No backed off on this.
+
+Some problems during build-all:
+
+ . VMS 7.1 TGV 4.2: If I make a Telnet connection with it, then try to send
+   a file (itself. wermit.exe) over the connection, the connection drops
+   after about 20%, the thermometer zooms out to 100% and SUCCESS is reported.
+   This doesn't happen with UCX.
+
+ . VMS 7.3 TGV 4.3: ckcmai.c won't compile because of a complaint about the
+   declaration of select() (which ckcmai.c doesn't use) in
+   SYS$COMMON:[SYSLIB]DECC$RTLDEF.TLB.  Ditto in VMS 7.2 TGV 4.3.
+   Adding NOSELECT to CFLAGS doesn't help.  I don't think the VMS version
+   even uses select().  But the TGV 4.3 builds were OK in 8.0.201, so what
+   changed?  I don't see anything in ckcnet.h that would have done it.
+
+It builds OK with VMS 7.1 / TGV 4.2 but sending files on Telnet connections
+fails in a strange way: the connection drops, but the thermomoter goes to 100%
+and success is reported.  I don't know why the connection is dropping (s_errno
+is 32 == "broken pipe"), but the spurious success indication is because of
+a double failure in sdata(): (1) The packet-sending loop index could go
+negative without breaking the loop when streaming; (2) if spack() fails,
+sdata() should return -2, not -1 (which means EOF).  Also if any ttchk() in
+sdata() returns < 0, sdata should return -2.  I fixed this code (which has
+been this way for YEARS) and now VMS C-Kermit properly fails when it gets
+the spack() error, but ttchk() in this case still doesn't think the connection
+is lost, but that must be our new problem with MultiNet.  ckcfns.c,
+27 Oct 2002.
+
+The compilation failure in ckcmai.c is a clue...  The problem was that I added
+#ifdef VMS / #include <time.h> / #endif to shut up complaints about the time()
+call.  Evidently something in VMS <time.h> gives MultiNet a bad case of
+indigestion; removing it fixes the compilation and the result works fine.  The
+transmission failures in the other case seem to be a coincidence -- something
+to do with the U of Arizona (probably some obscure VMS quota on my IDs there,
+or some kind of network connection throttling), since it doesn't happen
+anywhere else.  ckcmai.c, 27 Oct 2002.
+
+Changed four occurrences of "void" to "VOID" in ckcftp.c, 27 Oct 2002.
+
+Defined NOCKFQHOSTNAME for HPUXPRE65.  Might also need this for HP-UX 7
+and maybe 8.  ckcnet.c, 27 Oct 2002.
+
+From Jeff: PAM_CONST definition to clear up warnings caused by different
+vendors' definitions of PAM structs.  ckufio.c, 28 Oct 2002.
+
+Unixware 2.1.0 build bombs immediately with "UX:make: ERROR: line too long"
+(which line?)  Not worth chopping up the makefile to fix but in a pinch it
+could be done.  2.1.3 builds OK.
+
+Did another 20-some platform builds, bringing the total to 83, plus a final
+runthrough of the build-with-84-different-feature-set-combinations script on
+Linux.  Should be good to go!
+
+--- 8.0.206 24 Oct 2002 ---
+
+Finally got access to Linux on IA64 again.  Builds OK but dumps core
+immediately on startup.  Adding -DNOCKGETFQHOST was necessary but not
+sufficient.  In this case, the very call to ckgetfqhostname() from ckhost()
+(which is in ckuusx.c) was dumping core; thus I had to move the definition of
+NOCKGETFQHOST from ckcnet.c to ckcdeb.h, add an #ifdef __ia64__ clause to it,
+and protect the call to ckgetfqhostname() with it.  Obviously there has to be
+a better fix but this will have to for now.  ckcnet.c, ckuusx.c, ckcdeb.h,
+31 Oct 2002.
+
+Link step fails in Mandrake 9.0 with undefined references to res_search,
+dn_expand, and crypt.  Turns out the linux makefile target tests for the
+existence of libcrypt.a and libresolv.a, but in Mandrake 9.0 they exist
+only as *.so.  Changed linux target to look for both.  makefile, 1 Nov 2002.
+
+Vace reported that "ftp mget a b c" would get ALL files from the server's
+directory if c did not exist.  Diagnosis: off-by-one error in counting MGET
+args processed.  Naturally fixing this bug revealed another (this time
+cosmetic) one, which resulted in spurious error messages when hitting MGET
+args that have no match on the server.  Fixed in ckcftp.c, 1 Nov 2002.
+
+Rebuilt about 60 of the most important Unix binaries to pick up the fixes
+31 Oct - 1 Nov 2002, and refreshed the FTP site with new sources, tarballs,
+ZIP files, etc.  Sat Nov  2 19:11:30 2002
+
+From Martin Vorlaender and Jeff, SSL/TLS support for VMS:
+ckuusr.h, ckuath.h, ckcnet.c, ckctel.c, ckuath.c, 10 Nov 2002.
+
+Added PASV as invisible synonym for PASSIVE.  ckcftp.c, 10 Nov 2002.
+
+--- 8.0.206 24 Oct 2002 #2 ---
+
+More work on SSL in VMS: Jeff + Martin Vorlaender: ck_ssl.c ckcmai.c ckcnet.c
+ckctel.c ckuath.h ckvcon.c ckvtio.c ckvker.com 10-15 Nov 2002.
+
+Discovered that ckvfio.c would not compile on VMS 6.1 with UCX 4.1 because 
+<conv$routines.h> was missing, which is explicitly included.  Enclosed the
+#include in #ifdef NOCONVROUTINES..#endif and rebuilt with
+@[users.fdc.src]ckvker.com "" "" "NOCONVROUTINES".  16 Nov 2002.
+
+Fixed the "ftp mget */data/*" problem with two small changes to doftpget():
+ckcftp.c, 16 Nov 2002.  Placed a copy of ckcftp.patch in ~kermit/f.
+
+From Lucas Hart: Fixes for VAX C 2.x and CMU TCP/IP.  "Can't guarantee that
+the revised CKVOLD will work for all combinations of more recent
+VMS/compiler/TCPIP releases, but I've tested it for compatibility on our AXP
+VMS 6.2, UCX 4.0, DECC 5.6, your AXP VMS 7.1, DEC TCPIP 5.1, DECC 6.0 as well
+as with VAX VMS 5.4, VAX C 3.2, CMU12 and VAX VMS 4.7, VAX C 2.4."  ckvfio.c,
+ckvtio.c, ckuus5.c, ckvker.com, ckvold.com, 17 Nov 2002.
+
+From Jeff: More work on VMS SSL.  Now it actually works, even in CONNECT mode,
+except it hangs when it gets an error alert or the remote closes the
+connection.  ckcnet.c. ckvtio.c, 17 Nov 2002.
+
+NOTE: Lucas's changes should go into the 8.0.206 source code but it's too
+late since ckvtio.c (upon which he based his changes) is already full of
+SSL code.
+
+MGET in K95 in totally broken FOR SOME PEOPLE (mainly me) if the TMP (or TEMP)
+value is too long.  It works fine if you set these to C:\TMP.  Diagnosis: (1)
+we were malloc'ing only 16 bytes for the temp file name (I think this was my
+fault -- I was only looking at the "ckXXXXXX" part and forgetting that this
+was appended to the TMP path); (2) the Windows version of mktemp() wants you
+to use the value pointed to by the pointer it returns, rather than assuming
+the mktemp() arg will be modified in place.  The code was changed to malloc a
+longer string and to use the return value from mktemp() (if any) rather than
+assuming that mktemp() modified its argument string (in K95 only -- not sure
+about Unix platforms; the man pages differ on this, but at least this way if
+some mktemp() version does NOT alter its argument, we still have a usable
+filename (like /tmp/ckXXXXXX)).  Of course this won't be good for recursive
+MLSD downloads, but we can always issue patches for the Unix version later if
+needed.  The Linux and BSD versions use mkstemp() anyway.  There is, however,
+a danger of a memory leak in the Unix version if the user has defined a TMPDIR
+or CK_TMP environment variable whose value is longer than 9 bytes.  All this
+is highly unlikely so we should be OK.  ckcftp.c, 17 Nov 2002.
+
+--- K95 2.1.1 and updated ck[uv]206.{tar,zip} but not C-Kermit binaries ---
+
+From Jeff: Fixes for Telnet Com Port Control, update to a newer release of
+OpenSSL: ck_ssl.c ck_ssl.h ckcdeb.h ckcftp.c ckcmai.c ckcnet.c ckctel.c
+ckuath.c ckuath.h ckucns.c ckuus4.c ckuus5.c ckuusr.c ckuusr.h ckvcon.c
+ckvfio.c ckvker.com ckvtio.c ckvvms.h, 25 Nov 2002.
+
+--- K95 2.1.2 and C-Kermit 8.0 CDROM ---
+
+From Jeff, 28 Nov 2002:
+ . Updated SSL modules: ck_ssl.[ch].
+ . Fixed cipher-list display in SHOW AUTH & FTP ssl_auth(): ckuus7.c. ckcftp.c
+ . Some minor tn_wait() fixes: ckctel.c.
+ . Preliminary SSL support for VMS CONNECT: ckvcon.c.
+
+Bumped C-Kermit edit number to 207.
+
+From Jeff, 29 Nov 2002: "[C-Kermit was dumping core on SCO OSR5 Telnet Com Port
+connections because] the SCO compiler treats all characters as signed.  This
+was causing 'sprintf(buf,"02x ",ch);' to produce strings such as "ffffffc2"
+instead of "c2" for values between 128 and 255.  This wrote beyond the end of
+a buffer and blew away the stack.  Having fixed this I also noticed that
+conect() did not properly check for carrier when TN CPC was negotiated.  This
+has now been fixed as well."  ckucns.c, ckucon.c, ckctel.c, 29 Nov 2002.
+
+From Jeff, 30 Nov 2002: Fix SSL for VMS and also carry forward the CPC fixes
+to VMS.  ckcnet.c, ckvtio.c, ckvcon.c, 30 Nov 2002.
+
+Changed copyright dates that are displayed (but not yet all the internal
+ones) from 2002 to 2003.  ckcmai.c, 3 Jan 2003.
+
+Fixed the FTP module's brief-format transaction log, which had the status
+inverted: OK for FAILED and v.v.  ckcftp.c 3 Jan 2003.
+
+From Jeff, 4 Jan 2003:
+ . Make /MOVE-TO:xxx convert xxx to full pathname: ckuus[r67].c,
+ . Make SHOW OPTIONS ALL show both kinds of options: ckuus2.c.
+ . More command-line personalities: ckcmai.c, ckuusy.c.
+ . New NOSCROLL command for K95: ckuusr.[ch], ckuus2.c.
+ . New lockdown and other command-line options: ckuusr.h, ckuusy.c.
+ . SSL interface updated to OpenSSL 0.9.7: ck_ssl.c.
+ . SET TERM LINE-SPACING and CURSOR xxx NOBLINK: ckuus[27]c.
+ . Expanded SHOW GUI command: ckuus3.c
+ . New SHOW TABS code: ckuus5.c.
+
+Updated SUPPORT (BUG), NEWS, and INTRO texts.  ckuus[26].c. 5 Jan 2003.
+
+Fixed FTP module to suppress "'FEAT': Command not understood" message
+unless FTP DEBUG is ON.  ckcftp.c, 6 Jan 2003.
+
+Got a report that C-Kermit dumps core on Solaris when executing a certain
+script.  Seems to be related to changing vnambuf[] in zzstring() from an
+automatic array to a malloc'd buffer (see notes from 29 Jun 2000).  Changed
+it to an automatic buffer except for K95.  ckuus4.c, 6 Jan 2003.
+
+Nope, that's not it.  It evidently happens only after FTP PUT has been used.
+Fixed solaris9g makefile target to include -funsigned-char and built a new
+binary.  Determined that building with gcc and -funsigned-char makes no
+difference.  makefile, 7 Jan 2003.
+
+I did a preliminary audit, looking at the items in the left column: if used in
+a given routine, are there any obvious mistakes:
+
+                       1        2          3           4              5
+                   doftpput->putfile->sendrequest->doftpsend2->secure_write
+malloc                OK       OK         OK          OK             OK
+makestr               OK       OK        OK          OK             OK
+automatic arrays      OK       OK        OK          OK             OK
+[ck]str[n]cpy         OK       OK        OK          OK             OK
+[ck]str[n]cat         OK       OK        OK          OK             OK
+sprintf               OK       OK        OK          OK             OK
+nzltor                OK       OK        OK          OK             OK
+zfnqfp                OK       OK        OK          OK             OK
+memcpy                OK       OK        OK          OK             OK
+bcopy                 OK       OK        OK          OK             OK
+
+secure_write sends the data directly on clear-text connections.  On secure
+connections, it calls secure_putbuf(), which calls secure_putbyte(), but we
+aren't using those, so secure_write() is the end of the call chain for FTP
+PUT.  doftpsend2 has buf[] as an automatic array, which it reads file data
+into using zxin (binary mode only), but this looks OK.  Still, I changed it
+read 1 less than the buffer size (fread) just in case.  Also there was one
+debug() statement that referred to an automatic array (fullname[]) before it
+was initialized (but not used in this case), which I fixed.  ckcftp.c,
+7 Jan 2003.
+
+FTP GET /RECURSIVE somepath/somefile still didn't work, despite what the
+notes of 19 Sep 2001 say.  There are so many paths through the code,
+depending on switch values, GET vs MGET, etc, that a crucial spot was missed.
+Fixed in doftpget(): ckcftp.c, 7 Jan 2003.
+
+Back to the core dump...  after two days of full-time debugging, I found the
+culprit: the buffer-full test in the zzout() macro should have been ">="
+rather than just ">", thus Kermit wrote 1 byte past the end of the malloc'd
+FTP PUT output buffer, ucbuf.  Why did it never happen in K95?  Because, since
+it's a secure build, FUDGE_FACTOR is defined there.  But it's not defined in
+Solaris or other clear-text builds.  Although the crash wouldn't happen in
+secure builds, the 1-byte leak might have caused errors in the data transfer.
+In non-Solaris clear-text builds, like Linux, I suspect that malloc() tends
+add something for safety (especially given the man page statement that it
+allocates "at least" what you asked for).  Another reason the problem escaped
+notice is that zzout() is used only for text-mode PUTs (and then only when
+there is no character-set translation), but most transfers these days are
+binary and/or downloads.  Anyway, in the course of debugging, a lot of small
+cleanups were done: sizeof(blah) for all arrays was replaced by the same
+symbolic size that was used to allocate the array, numeric array sizes were
+replaced with symbolic ones, etc.  The real fix is one character long.
+ckcftp.c, 9 Jan 2003.
+
+Got a report that "mget /recursive */somedir/*" downloaded the files into
+the current directory, rather than re-creating the remote directory structure.
+Fixed in doftpget(): ckcftp.c, 10 Jan 2003.
+
+Unix C-Kermit did not allow file transfer if started under inetd and accessed
+via Internet raw socket (or whatever).  Diagnosis: isatty() and friends would
+fail causing ttopen() to fail.  Fixed by adding escape clauses for "-l 0"
+situations (i.e. Kermit invoked with an already-open file descriptor) at the
+appropriate places.  ckcmai.c, ckutio.c, 14 Jan 2003.
+
+From Jeff for K95 2.1.3
+ . Add test for startflags & 128 to trap() for ignoring BREAK.
+ . Fix for SHOW TRANSMIT.
+
+--- K95 2.1.3 ---
+
+FTP USER, FTP ACCOUNT, plus the various prompts and switches for FTP username,
+password, and account all neglected to strip quotes, and in most cases quotes
+are necessary to specify a username that contains spaces.  ckcftp.c,
+15 Jan 2003.
+
+FTP MPUT f1 f2 f3... gets a parse error if any of the fn's do not match an
+existing file.  This is bad for scripts.  In doftpput(), cmfdb() looks for
+keywords (switches) or CMIFI.  When it hits CMIFI, it exits from the initial
+parse loop and then does additional cmifi()s in a loop until done.  The most
+obvious fix is to parse each field with cmfdb(CMIFI,CMFLD), i.e. fall back to
+CMFLD if CMIFI doesn't match anything.  Then if CMFLD was used, we don't add
+the filespec to the list.  This is a rather big change but it seems to work.
+No error messages or failures happen for non-matching fields, but an error
+message is printed (and the MPUT command fails) if none of the fields match
+any files.  This fix got in too late for 2.1.3; workaround: use C-Shell
+like wildcard list (ftp mput "{*.abc,foo.*}").  ckcftp.c, 16 Jan 2003.
+
+GREP did not pass its pattern through the expander, thus variables could
+not be used for patterns.  This must have been an oversight -- I can't find
+anything in my notes about it.  Fixed in dogrep(): ckuus6.c, 24 Jan 2003.
+
+New makefile target for HP-UX 11.xx with OpenSSL from Tapani Tarvainen.
+makefile, 31 Jan 2003.
+
+From Jeff:
+ . Avoid core dump when dereferencing tnc_get_signature(): ckuus4.c.
+ . Bump version numbers to 8.0.208, 2.1.4: ckcmai.c.
+
+Added /NOLOGIN to FTP [OPEN].  ckcftp.c, 10 Feb 2003.
+
+Don't dump core if FTP DEBUG is ON and FTP OPEN does not include a service.
+openftp(): ckcftp.c, 10 Feb 2003.
+
+HELP PATTERN text incorrectly identified commands and functions with
+floating and anchored patterns.  The corrected lists are:
+Floating: GREP, TYPE /MATCH:, /EXCEPT: patterns, \farraylook(),
+Anchored: IF MATCH, file-matching wildcards, \fsearch(), \frsearch()
+ckuus2.c, 10 Feb 2003.     
+
+INPUT n \fpattern(xxx) did not work for case-independent comparisons.
+Fixed in doinput(): ckuus4.c, 10 Feb 2003.
+
+It seems \fpattern() didn't work with MINPUT at all.  There was no code to
+handle \fpattern() in the MINPUT parse loop, so it never worked.  The code
+had to be totally rewritten to use cmfld() in a loop, rather than cmtxt()
+and then cksplit().  Furthermore, whenever any of the fields was an
+\fjoin(), this had to be split.  ckuusr.c, 10 Feb 2003.
+
+Macro replacement via \m() and \fdefinition() does not work as advertised
+(i.e. case sensitively) for associative array elements; e.g. \m(xxx<abc>) is
+treated the same as \m(xxx<ABC>), contrary to section 7.10.10 of the C-Kermit
+7.0 update notes, and to the fact that the two really do exist separately.
+Fixed by adding a static function isaarray(s) which succeeds if s is an
+associative array reference and fails otherwise, and then having \m()
+and \fdef() call mxxlook() (case-sensitive lookup) if isaarray(), otherwise
+(as before) mxlook()).  ckuus4.c, 11 Feb 2003.
+
+Fixed FTP OPEN to allow the /USER switch to override SET FTP AUTOLOGIN OFF,
+just as /NOLOGIN overrides SET FTP AUTOLOGIN ON.  ckcftp.c, 11 Feb 2003.
+
+In K95, "set key \1234 \27H" (any SET KEY command in which the first char of
+the definition was backslash, and the ONLY character after the backslash
+quantity was an uppercase letter, that letter would be lowercased).  Diagnosis:
+xlookup() poking its argument (see notes from July 2000).  Jeff sent a fix.
+ckucmd.c, 15 Feb 2003.
+
+Ran my S-Expression torture test to make sure Sexps still worked.  They do,
+except the bitwise & and | operators were broken, e.g. (& 7 2) and (| 1 2 4)
+get "Invalid operand" errors.  Jeff's code had added an early failure return
+from the lookup loop when when a single-byte keyword matched a keyword that
+started with the same byte but was more than one byte long.  So "&" would hit
+"&&" and fail instead of continuing its search (xlookup tables aren't sorted
+so there can be no early return).  Fixed in xlookup(): ckucmd.c, 16 Feb 2003.
+
+Got rid of "krbmit" target from makefile.  It's still there, but we don't
+use it any more.  All secure targets now use "xermit", and produce a binary
+called wermit, just like the regular ones do (except the old ckucon.c ones).
+Non-secure targets, since they don't define any of the security symbols,
+wind up compiling and linking to (mostly) empty security modules.  makefile,
+15 Feb 2003.
+
+Added \fcvtdate(xxx,3) to format its result in MDTM format (yyyymmddhhmmss,
+all numeric, no spaces or punctuation).  Of course these numeric strings
+are too big to be 32-bit numbers and are useless for arithmetic, but they're
+useful for lexical comparison, etc.  ckuus[24].c, 16 Feb 2003.
+
+The following FTP commands did not set FAILURE when they failed: RMDIR,
+CD, CDUP, Fixed in the corresponding doftpblah() routines.  ckcftp.c,
+16 Feb 2003.
+
+RENAME would sometimes not print an error message when it failed, e.g. in K95
+when the destination file already existed.  ckuus6.c, 17 Feb 2003.
+
+Fixed COPY error messages, which did not come out in standard format when
+/LIST was not included.  ckuus6.c, 17 Feb 2003.
+
+Fixed #ifdefs in ck_crp.c to allow nonsecure builds on old platforms like
+System V/68 R3.  19 Feb 2003.
+
+Similar treatment for ck_ssl.c.  20 Feb 2003.
+
+From Jeff, 21 Feb 2003:
+ . AIX53 and AIX52 symbols for ckcdeb.h, makefile.
+ . New gcc targets for various AIX 4.x/5.x versions: makefile.
+ . Copyright date updates: ck_crp.c, ck_ssl.c.
+ . ENABLE/DISABLE QUERY broken because keyword table out of order: ckuusr.c.
+ . Fixed the use of HTTP proxies for HTTP [RE]OPEN for Unix: ckcnet.c.
+
+Also for K95 only: Allow file transfer when K95 is invoked on the remote end
+of a connection to a Pragma Systems Terminal Server connection; automatically
+SET EXIT HANGUP OFF when invoked with open port handle ("k95 -l nnnn").
+
+"cd a*" failed even when "a*" matched only one directory.  Fixed in cmifi():
+ckucmd.c, 21 Feb 2003.
+
+In the Unix version, replace "extern int errno;" with "#include <errno.h>"
+if __GLIBC__ is defined, since glibc now defines a thread-specific errno.
+ckcdeb.h, 26 Feb 2003.
+
+Added #ifdefs to skip compilation of ckuath.c in nonsecure builds.  Tested
+by building both secure and regular versions in Linux.  ckuath.c, 26 Feb 2003.
+
+Ran the build-in-84-different-configurations script on Linux to make sure it
+still builds with all different combinations of feature selection options.
+All OK.  26 Feb 2003.
+
+Built on VMS.  Needed to add a prototype for mxxlook*() to ckuusr.h; built
+OK otherwise.  26 Feb 2003.
+
+From Jeff: More #ifdef shuffling for nonsecure builds: ckuath.c, ck_ssl.c,
+27 Feb 2003.
+
+Added code to ensure \v(download) ends in a directory separator in Unix,
+Windows, and OS/2.  ckuus7.c, 27 Feb 2003.
+
+Added code to K95 zfnqfp() to tack on directory separator when returning
+a directory name.  ckofio.c, 27 Feb 2003.
+
+Somehow an old copy of ckuath.c popped to replace the new one.  Put the new
+one back.  28 Feb 2003.
+
+From Jeff: Fix typo in my K95 zfnqfp() code from yesterday; fixes for handling
+UNCs uniformly, no matter which way their slashes are leaning.  ckofio.c,
+28 Feb 2003.
+
+At Jeff Mezei's suggestion, separate text and binary mode open sequences
+for VMS session log.  ckvfio.c, 28 Feb 2003.
+
+Added freebsd48 target for FreeBSD 4.8.  makefile, 1 Mar 2003.
+
+Changed Mac OS X entries to include -DUSE_STRERROR.  makefile, 2 Mar 2003.
+
+Fixed GETOK /GUI to evaluate its text argument.  ckuus6.c, 3 Mar 2003.
+
+Jeff fixed the K95 Dialer QUICK dialog to (a) allow templates, and (b) have
+a Save-As option.  3 Mar 2003.
+
+Jeff fixed a problem with the Xmodem-CRC checksum being crunched whenever
+there was a retransmission.  7 Mar 2003.
+
+Added target/banner for Tru64 5.1B.  makefile, ckuver.h, 5 Mar 2003.
+
+In Unix, the zcopy() routine (used by the COPY command) reset the user's umask
+to 0 for the remainder of the Kermit process lifetime.  The bug was in
+ckufio.c 8.0.194, 24 Oct 2002, and is fixed in ckufio.c 8.0.195, 6 Mar 2003.
+Of course this happened after building 155 C-Kermit 8.0.208 binaries.  (But
+before officially releasing 8.0.208.)
+
+In the VMS version, changed:
+
+        while ((n--) && xx_inc(2) > -1) ;
+to:
+        while ((n--) && xx_inc(2) >= 0) ;
+
+to suppress the "...is being compared with a relational operator to a constant
+whose value is not greater than zero" warning.  ckvtio.c, 7 Mar 2002.
+
+Added a debug call to dologend in hopes of catching overzealous Locus
+switching, which seems to happen only in K95.  ckuus3.c, 7 Mar 2002.
+
+Rebuilt binaries for some of the more current Unix releases: AIX 4.3.3-5.1,
+Solaris 7-9 , Red Hat 7.0-8.0, Slackware 8.1, Freebsd 4.7-4.8, NetBSD 1.6,
+OpenBSD 3.2, Unixware 7.1.3, Open Unix 8, OSR5.0.6a, etc.  A Unix binary with
+COPY umask fix shows a 6 Mar 2003 date for "UNIX File support" in SHOW
+VERSIONS; a binary without the fix shows 24 Oct 2002.
+
+C-Kermit 8.0.208 dated 14 March 2003 released on 10 March 2003.
+
+---8.0.208---
+
+From Jeff 13 Mar 2003:
+ . Updated SSL module allows importation of tickets from host.
+ . freebsd50+openssl target: makefile.
+ . FTP PUT /PERMISSIONS error message for K95: ckcftp.c.
+Fixed MINPUT to strip quotes or braces from around targets (this was broken
+on Feb 10th).  Thanks to Jason Heskett for discovering and reporting this
+(killer) bug.  ckuusr.c, 14 Mar 2003.
+
+Changed version number to 209 Dev.00.  ckcmai.c, 14 Mar 2003.
+
+While debugging the alphapage script, I found that the command "minput 8 \6\13
+\21\13 \13\27\4\13 \30\13" gets "?Not confirmed" in 8.0.208 and 8.0.209, but
+not in 206 and earlier.  This problem too was introduced on Feb 10th by
+changing MINPUT parsing from cmtxt() followed by cksplit() to cmfld() in a
+loop.  cmfld() uses setatm() to return its result and of course setatm()
+breaks on \13.  Changing setatm() not to do this would break everything else.
+But cmfld() has no arguments that let us tell it to do anything different in
+this case.  Changing the API would be a disaster.  The only solution is to add
+an "MINPUT ACTIVE" (minputactive) global variable that tells cmfld() to tell
+setatm() not to break on CR.  Now MINPUT with braced targets containing CR
+and/or LF works in 209, 206, and 201 (but not 208).  ckucmd.c, ckuusr.c,
+ckuus5.c, 15 Mar 2003.
+
+MINPUT n \fjoin(&a) works OK if all the members of \&a[] are text strings, but
+if they are strings of control chars (as above), they don't get separated by
+the spaces.  For example in:
+
+  dcl \&a[] = "\4\5" "\6\7" xxx
+  minput 10 \fjoin(&a)
+
+MINPUT gets two targets: "aaa" and "\4\5 \6\7 xxx".  The bug was in the
+cksplit() call in the \fjoin() case of MINPUT: it needed to specify an
+include set consisting of all the control characters except NUL.  ckuusr.c,
+16 Mar 2003.
+
+But there's still a problem:
+
+  dcl \&a[] = "\4\5\13\10" "\6\7" "xxx"
+
+creates an array whose first member is "^D^E (one doublequote included).  But
+if braces are used instead, there's no problem.  Same deal as MINPUT: cmfld()
+breaks on CR or LF, thus the end quote is lost.  If I set minputactive for
+DECLARE initializers too, that fixes it.  Is there any reason not to do this?
+Can't think of any (famous last words)...  ckuusr.c, 16 Mar 2003.
+
+Since it has multiple applications, changed the flag's name from minputactive
+to keepallchars.  ckucmd.c, ckuus[r5].c, 16 Mar 2003.
+
+\v(exedir) wasn't being set correctly (it included the program name as well
+as the directory).  Fixed in getexedir(): ckuus4.c, 16 Mar 2003.
+
+SET CARRIER-WATCH <Esc> "auto matic" (spurious space in supplied keyword).
+Cosmetic only; it still worked.  Fixed in setdcd(): ckuus3.c, 16 Mar 2003.
+
+"directory a b c" listed too many files -- all files whose names END WITH a,
+b, or c, rather than the files whose names WERE a, b, or c.  Diagnosis: The
+filespec is changed into a pattern: {a,b,c}, which is the correct form.  It is
+passed to nzxpand(), which goes through the directory getting filenames and
+sending each one to ckmatch() with the given pattern.  ckmatch() receives the
+correct pattern but then prepends a "*" -- that's not right.  It's not just
+in filename matching either.  The following succeeds when it shouldn't:
+
+  if match xxxxc {{a,b,c}} <command>
+
+Changing ckmatch() to not prepend the "*" to each segment fixes the command
+above but breaks lots of others.  Running through the "match" torture-test
+script shows the problem occurs only when the {a,b,c} list is the entire
+pattern, and not embedded within a larger pattern.  Testing for this case
+fixed the problem.  ckmatch(): ckclib.c, 16 Mar 2003.
+
+Fixed FTP MODTIME to not print anything if QUIET ON.  ckcftp.c, 16 Mar 2003.
+
+Picked up a new ckuath.c from Jeff, not sure what the changes are. 16 Mar 2003.
+
+Did a few regular and secure builds to make sure I didn't wreck anything.
+
+Changed version number to 209 (final).  ckcmai.c, 16 Mar 2003.
+
+Jason Heskett found another bug: if you define a macro FOO inside the
+definition of another macro BAR, and FOO's definition includes an odd number
+of doublequotes (such as 1), FOO's definition absorbs the rest of BAR's
+definition.  Example:
+
+  def TEST {
+    .foo = {X"}
+    sho mac foo
+  }
+  do test
+  sho mac foo
+
+Results in:
+
+  foo = {X"}, sho mac foo
+
+Diagnosis: the TEST definition becomes:
+
+  def TEST .foo = {X"}, sho mac foo
+
+and the macro reader is erroneously treating the doublequote as an open
+quote, and then automatically closes the quote at the end of the definition.
+The error is that a doublequote should be significant only at the beginning of
+a field.  But the macro reader isn't a command parser; it doesn't know what
+a field is -- it's just looking for commas and skipping over quoted ones.
+First we have to fix an oversight: SET COMMAND DOUBLEQUOTING OFF should have
+worked here, but it wasn't tested in this case.  Fixed in getncm(): ckuus5.c,
+17 Mar 2003.
+
+There are only certain cases where it makes sense to treat doublequotes as
+signicant:
+
+ . An open quote must be at the beginning or preceded by a space.
+ . A close quote is only at the end or else followed by a space.
+
+This too was fixed in getncm(): ckuus5.c, 17 Mar 2003.
+
+A fix from Jeff SSL/TLS FTP data decoding.  ckcftp.c, 18 Mar 2003.
+
+Tried building C-Kermit on a Cray Y-MP with UNICOS 9.0.  "int suspend",
+declared in ckcmai.c and used in many modules, conflicts with:
+
+  unistd.h:extern int suspend __((int _Category, int _Id));
+
+The "=Dsuspend=xsuspend" trick doesn't work for this; there is no way around
+the conflict other than to rename the variable: ckcmai.c, ckutio.c,
+ckuus[35xy].c.  26 Mar 2003.  VMS and K95 not affected.
+
+OK that gets us past ckcmai.c...  Then in ckutio.c I had to add a new #ifdef
+around the LFDEVNO setting, because the Cray didn't have mkdev.h.  Could not
+find a Cray-specific manifest symbol, so I made a new makefile target (cray9)
+that sets this symbol.  Having done this I have no idea what kind of lockfile
+would be created, but I also doubt if anybody dials out from a Cray.  The
+binary should run a C90, J90, or Y-MP.  makefile, 26 Mar 2003.
+
+Added a target for SCO OSR5.0.7.  makefile, ckuver.h, 30 Mar 2003.
+
+Changed since 208:
+makefile ckuver.h ckcmai.c ckclib.c ckcftp.c ckucmd.c ckuus*.c ckutio.c.
+
+---8.0.209---
+
+From Mark Sapiro, a fix for the March 17th doubleqote fix, getncm(): ckuus5.c,
+4 Apr 2003.
+
+From Jeff, 29 Apr 2003:
+ . Corrected target for HP-UX 11.00 + OpenSSL: makefile, 
+ . Do not allow WILL AUTH before WONT START_TLS: ckctel.h ckctel.c
+ . Add hooks for SFTP and SET/SHOW SFTP: ckcdeb.h ckuusr.h ckuusr.c ckuus3.c
+ . Add SKERMIT ckuusr.h ckuusr.c
+ . Add ADM-5 terminal emulation: ckuus7.c, ckuus5.c
+ . Uncomment and update HELP SET SSH V2 AUTO-REKEY: ckuus2.c
+ . Enable IF TERMINAL-MACRO and IF STARTED-FROM-DIALER for C-Kermit: ckuus6.c
+ . Fix conflicting NOSCROLL keyword definition: ckuusr.h
+ . Set ttname when I_AM_SSH: ckuusy.c
+ . Add extended arg parsing for SSH, Rlogin, Telnet: ckuusy.c, ckuus4.c
+ . Security updates: ckuath.c, ck_ssl.c
+ . Change K95 version number to 2.2.0: ckcmai.c
+ . Save K95 term i/o state before executing keyboard macro: ckuus4.c
+ . Add tests for SSH Subsystem active during INPUT/OUTPUT/CONNECT: ckuus[45].c
+ . Enable K95 SET SSH V2 AUTO-REKEY: ckuus3.c
+
+SFTP and SET SFTP subcommands are implemented up to the case statements.
+
+Files of mine that Jeff hadn't picked up:
+  ckuver.h ckcftp.c ckutio.c ckuusx.c (just minor changes for last build-all)
+
+On 4 Jan 2003, SET RECEIVE MOVE-TO was changed to convert is argument to an
+absolute path, which made it impossible to specify a relative path, then
+move to different directories and have it apply relatively to each directory.
+Changed this as follows:
+
+ . Parser uses cmtxt() rather than cmdir() so it won't fail at parse time.
+ . If path is absolute, we fail at parse time if directory doesn't exist.
+ . In reof() we run the the path through xxstring (again, in case deferred
+   evaluation of variables is desired) and then, if not null, use it.
+ . If the directory doesn't exist, rename() fails and reof() returns -4,
+   resulting in a protocol error (this is not a change).  We do NOT create
+   the directory on the fly. 
+
+I also fixed SET SEND/RECEIVE RENAME-TO to parse with cmtxt() rather than
+cmdir(), since it's parsing a text template, not a directory name, e.g.
+"set receive rename-to file-\v(time)-v(date)-\v(pid)".  This was totally
+broken, since when I don't know.  We don't call xxstring() in this parse, so
+evaluation is always deferred -- I'd better not change this.  ckuus7.c,
+ckcfns.c, 1 May 2003.
+
+From Jeff, Sat May  3 14:15:23 2003:
+ . Pick up the right isascii definition for K95: ckctel.c
+ . malloc...  ckuath.c (new safe malloc routines for K95)
+ . Add author listing: ckuus5.c
+ . SSH Heartbeat support (K95 only): ckuus[23].c
+ . Prescan --height and --width to avoid window resizing at startup: ckuusy.c
+ . Add checks for fatal() or doexit() called from sysinit(): ckuusx.c
+ . Move some K95-specific definitions to ckoker.h: ckcdeb.h
+ . Add support for ON_CD macro in zchdir(): ckufio.c
+ . Add a command to let FTP client authenticate with SSLv2: ckcftp.c
+ . Fix parsing of FTP file facts like "UNIX.mode": ckcftp.c
+
+ON_CD will need some explaining (to be done).  It's implemented for Unix,
+VMS, WIndows, and OS/2.
+
+The FTP file facts fix came from first exposure to the new OpenBSD FTP
+server: ftp://ftp7.usa.openbsd.org/pub/os/OpenBSD/3.3/i386/
+The period in "UNIX.mode" caused an erroneous word break, adding junk to
+the filename.
+
+About the malloc changes, Jeff says "K95 is not behaving well in low memory
+environments.  I'm not sure that C-Kermit does much better.  The program does
+not crash but it certainly does not behave the way the user expects it to.
+I'm beginning to think that any malloc() error should be treated as fatal."
+
+Not visible in these changes because it's in K95-specific modules: Jeff made
+SET ATTRIBUTES OFF and SET ATTRIBUTES DATE OFF apply to XYZMODEM transfers.
+
+From Jeff, 11 May 2003:
+ . Add support for SSH Keepalive to relevant SET command (K95): ckuus3.c
+ . Reduce max overlapped i/o requests from 30 to 7 (K95): ckuus7.c
+ . Don't call sysinit() in fatal(): ckuusx.c.
+ . Some new conditionalizations for SSL module: ck_ssl.c
+
+The doublequote-parsing fixes from March and April broke the SWITCH statement,
+which is implemented by internally defining, then executing, a macro.  If I
+drop back to the old dumb handling of doublequotes, everything is fixed except
+the problem of March 17th.  But can we really expect getncm() to pre-guess
+what the parser is going to do?  getncm()'s only job is to find command
+boundaries, which are represented by commas.  Commas, however, is needed IN
+commands too.  We take a comma literally if it is quoted with \, or is inside
+a matched pair of braces, parens, or doublequotes.  It is not unreasonable to
+require a doublequote in a macro definition to be prefixed by \ when it is to
+be taken literally.  The proper response to Jason Heskett's complaint of March
+17th should have been to leave the code alone and recommand an appropriate
+form of quoting:
+
+  def TEST {
+      .foo = {X\"}
+      sho mac foo
+  }
+
+And this is what I have done.  Another reason for sticking with the old method
+is that it's explainable.  The "improved" method, even if it worked, would be
+be impossible to explain.  Btw, in testing this I noticed that the switch-test
+script made 8.0.201 dump core.  Today's version is fine.  The problem with
+quoted strings inside of IF {...} clauses and FOR and WHILE loops is fixed
+too.  Perhaps "unbroken" would be a better word.  ckuus5.c, 11 May 2003.
+
+Vace discovered that FTP MGET /EXCEPT:{... (with an unterminated /EXCEPT list)
+could crash Kermit.  Fixed in ckcftp.c, 11 May 2003.
+
+CONTINUE should not affect SUCCESS/FAILURE status.  ckuusr.c, 11 May 2003.
+
+Fixed an oversight that goes back 15 years.  While \{123} is allowed for
+decimal codes, \x{12} and \o{123} were never handled.  ckucmd.c, 11 May 2003.
+
+Added support for Red Hat <baudboy.h> and /usr/sbin/lockdev.  Supposedly this
+allows Kermit to be installed without setuid or setgid bits and still be able
+to lock and use the serial device.  Compiles and starts, but not tested.
+ckcdeb.h, makefile, ckutio.c, ckuus5.c, 16 May 2003.
+
+From Jeff: FTP ASCII send data to host when FTP /SSL was in use was broken.
+ftp_dpl is set to Clear when FTP /SSL is in use.  This was causing the data to
+be written to the socket with send() instead of the OpenSSL routines.
+ckcftp.c, ckuath.c, 21 May 2003.
+
+From Jeff: Stuff for Kerberos 524: ckcdeb.h.  Fixes for FTP; "FTP ASCII send
+data did not properly compute the end of line translations.  On Unix (and
+similar platforms) the end of line was correct for no character sets but
+incorrect when character sets were specified.  On Windows/OS2, the end of line
+was correct when character sets were specified and incorrect when they were
+not.  On MAC, both were broken.  Also, FTP Send Byte counts were incorrect
+when character sets were specified."  ckcftp.c.  17 Jun 2003.
+
+From Jeff: fixes to HTTP /AGENT: and /USER: switch action: ckcnet.c ckuus3.c
+ck_crp.c ckcftp.c ckuus2.c ckuusy.c ckuusr.c ckcnet.h, 21 Jun 2003.
+
+From Jeff: Fix SET DIALER BACKSPACE so it can override a previous SET KEY
+(e.g. from INI file): ckuus7.c.  Some SSL/TLS updates: ck_ssl.c.  HTTP support
+for VMS and other VMS improvements (e.g. a way to not have to hardwire the
+C-Kerit version number into the build script) from Martin Vorlaender:
+ckcnet.h, ckuus[r3].c, ckcdeb.h, ckvtio.c, ckcnet.c, ckvker.com.  Built on
+Solaris (gcc/ansi) and SunOS (cc/k&r).  The new VMS script tests the VMS
+version and includes HTTP support only for VMS 6.2 or later.  2 Jul 2003.
+
+Tried to build on our last VMS system but it seems to be dead.  Looks like a
+head crash (makes really loud noises, boot says DKA0 not recognized) (fooey, I
+just paid good money to renew the VMS license).  Tried building at another
+site with:
+
+  Process Software MultiNet V4.3 Rev A-X,
+  Compaq AlphaServer ES40, OpenVMS AXP V7.3
+  Compaq C V6.4-008 on OpenVMS Alpha V7.3
+
+Had to make a few corrections to ckvker.com.  But still, compilation of
+ckcnet.c bombs, indicating that the SELECT definition somehow got lost
+somewhere since the 209 release (i.e. no SELECT type is defined so it falls
+thru to "SELECT is required for this code").  But I don't see anything in
+ckcdeb.h or ckcnet.[ch] that would explain this.  Not ckvker.com either
+(putting the old one back gives the same result).  OK, I give up, maybe it's
+just that I haven't tried building it on MultiNet recently.  What about UCX?
+Aha, builds fine there except for warnings about mlook, dodo, and parser in
+ckvfio.c (because of ON_CD) -- I suppose I have #include <ckucmd.h>... (done)
+Anyhow it builds OK and the HTTP code is active and almost works (HTTP OPEN
+works; HTTP GET seems to succeed but creates an empty file every time).  Tried
+building under MultiNet at another installation; same bad result.
+
+OK so why won't it build for MultiNet?  Comparing ckcnet.c with the 209
+version, not a single #ifdef or #include is changed.  Tried building with
+p3="NOHTTP" -- builds OK, aha.  Where's the problem?  Not ckcnet.h...
+Not ckcdeb.h...  OK I give up, will revisit this next time I get time to
+do anything with the code.
+
+Later Jeff said "Martin did not implement VMS networking for the HTTP code.
+All he did was activate the #define HTTP which happens to work because his
+connections are using SSL/TLS connections.  http_inc(), http_tol(), etc have
+no support for VMS networking regardless of whether it is UCX or MULTINET.
+The vast majority of HTTP connections are not secured by SSL/TLS.  It makes no
+sense to support HTTP on VMS until someone is willing to either do the work or
+pay have the work done to implement VMS networking in that code base."  So the
+fix is to not enable HTTP for VMS after all.  Removed the CKHTTP definition
+for VMS from ckcdeb.h, 6 Jul 2003.
+
+Fixed ckvfio.c to #include <ckuusr.h> (instead of <ckucmd.h>) to pick up 
+missing prototypes.  6 Jul 2003.
+
+From Arthur Marsh: solaris2xg+openssl+zlib+srp+pam+shadow and the corresponding
+Solaris 7 target.  makefile, 6 Jul 2003.
+
+Remove duplicate #includes for <sys/stat.h>, <errno.h>, and <ctype.h> from
+ckcftp.c.  6 Jul 2003.
+
+Add -DUSE_MEMCPY to Motorola SV/68 targets because of shuffled #includes in 
+ckcftp.c.  8 Jul 2003.
+
+From Jeff: Fix problems mixing SSL and SRP without Kerberos.  Plus a few minor
+#define comment changes and a reshuffling of #defines in ckcdeb.h to allow me
+to build on X86 Windows without Kerberos.  ckcdeb.h, ck_crp.c, ckuath.c,
+10 Jul 2003.
+
+From Jeff: updated ckuat2.h and ckuath.c, 29 Jul 2003.
+
+Mats Peterson noticed that a very small Latin-1 file would be incorrectly
+identified as UCS-2 by scanfile().  Fixed in ckuusx.c, 29 Jul 2003.
+
+Fixed ACCESS macro definition to account for the fact that FIND is now a
+built-in command.  ckermit.ini, 30 Jul 2003.
+
+From Jeff: Fix for typo in urlparse() (svc/hos): ckuusy.c, 18 Aug 2003.
+
+From Jeff: Redhat9 makefile targets (needed for for OpenSSL 0.9.7):
+makefile, 19 Aug 2003.
+
+GREP /NOLIST and /COUNT did too much magic, with some undesirable fallout:
+"GREP /NOLIST /COUNT:x args" printed "file:count" for each file.  "GREP
+/COUNT:x /NOLIST args" did not print "file:count", but neither did it set the
+count variable.  Removed the magic.  Also one of the GREP switches,
+/LINENUMBERS, was out of order.  Fixed in ckuus6.c, 20 Aug 2003.
+
+From Jeff: "Reorganizing code to enable building with different subsets of
+options; a few typos corrected as well."  ckcdeb.h, ckuver.h (for RH9),
+ckcnet.c, ckuus7.c, ckuus3.c: 24 Aug 2003.
+
+Scanfile misidentified a big PDF file as text because the first 800K of it
+*was* text (most other PDF files were correctly tagged as binary).  Fixed
+by adding a check for the PDF signature at the beginning of the file.
+scanfile(): ckuusx.c, 25 Aug 2003.
+
+Ditto for PostScript files, but conservatively.  Signature at beginning of
+file must begin with "%!PS-Ado".  If it's just "%!" (or something nonstandard
+like "%%Creator: Windows PSCRIPT") we do a regular scan.  Also added "*.ps"
+to all binary filename patterns.  ckuusx.c, 4 Sep 2003.
+
+Ditto (but within #ifndef NOPCLSCAN) for PCL (<ESC>E) and PJL (<ESC>%) files,
+but no binpatterns (note: ".PCL" is the extension for TOPS-20 EXEC scripts).
+ckuusx.c, 4 Sep 2003.
+
+Added comments about OpenSSL 0.9.7 to all linux+openssl targets.
+makefile, 4 Sep 2003.
+
+From Jeff: Added - #define ALLOW_KRB_3DES_ENCRYPT.  When this symbol is defined
+at compilation Kermit will allow non-DES session keys to be used during Telnet
+Auth.  These session keys can then be used for Telnet Encrypt.  The reason
+this is not compiled on by default is that the MIT Kerberos Telnet does not
+follow the RFC for constructing keys for ENCRYPT DES when the keys are longer
+than 8 bytes in length.  ckuath.c, ckuus5.c, 4 Sep 2003.
+
+"ftp mget a b c" succeeded if one or more of the files did not exist, even
+with "set ftp error-action proceed".  This is because the server's NLST file
+list does not include any files that don't exist, so the client never even
+tries to get them.  Fortunately, the way the code is structured, this one was
+easy to fix.  ckcftp.c, 14 Sep 2003.
+
+From Jeff: Corrected code in ckcnet.c to ensure that Reverse DNS Lookups are
+not performed if tcp_rdns is OFF.  Fixed ck_krb5_getrealm() to actually return
+the realm of the credentials cache and not the default realm specified in the
+krb5.conf file.  Previously krb5_cc_get_principal() was not being called.
+Fixed ck_krb5_is_tgt_valid() to test the TGT in the current ccache and not the
+TGT constructed from the default realm.  ckcnet.c, ckuath.c, 14 Sep 2003.
+
+Marco Bernardi noticed that IF DIRECTORY could produce a false positive if
+the argument directory had previously been referenced but then removed.  This
+is because of the clever isdir() cache that was added to speed up recursion
+through big directory trees.  Changed IF DIRECTORY to make a second check
+(definitive but more expensive) if isdir() succeeds, and changed the
+directory-deleting routine, ckmkdir(), to flush the directory cache (UNIX
+only -- this also should be done in K95 but it's not critical).  This was
+done by adding a routine, clrdircache() to ckufio.c, which sets prevstat
+to -1 and prevpath[0] to NUL.  ckcfn3.c, ckuus6.c, ckufio.c, 18 Sep 2003.
+
+Marco reported the second fix still didn't work for him (even though it did
+for me).  Rather than try to figure out why, I concluded that the directory
+cache is just not safe: a directory found a second ago might have been deleted
+or renamed not only by Kermit but by some other process.  Why did I add this
+in the first place?  The log says:
+
+  Some debug logs showed that isdir() is often called twice in a row on the
+  same file.  Rather than try to sort out clients, I added a 1-element cache
+  to Unix isdir().  ckufio.c, 24 Apr 2000.
+
+Experimentation with DIR and DIR /RECURSIVE does not show this happening at
+all.  So I #ifdef'd out the directory cache (see #ifdef ISDIRCACHE in ckufio.c;
+ISDIRCACHE is not defined) and backed off the previous changes: ckufio.c,
+ckcfn3.c, ckuus6.c, 28 Sep 2003.
+
+From Jeff: Replace the compile time ALLOW_KRB_3DES_ENCRYPT with a run-time
+command SET TELNET BUG AUTH-KRB5-DES which defaults to ON: ckctel.[ch],
+ckuus[234].c, ck_crp.c, ckuath.c.  4 Oct 2003.
+
+Allow DIAL RETRIES to be any positive number, and catch negative ones.
+Also added code to check for atoi() errors (e.g. truncation).  At least on
+some platforms (e.g. Solaris) atoi() is supposed to set errno, but it
+doesn't.  ckuus3.c, ckucmd.c, 4 Oct 2003.
+
+Added /DEFAULT: to ASK-class commands (ASK, ASKQ, GETOK):
+
+ . For popups: no way to send defaults to popup_readtext() or popup_readpass().
+ . For GUI ASK[Q], pass default to gui_txt_dialog().
+ . For GUI GETOK, convert "yes" "ok" or "no" default to number for uq_ok().
+ . For Text GETOK, add default to cmkey().
+ . For Text ASK[Q], add default to cmtxt().
+ . For GETC, GETKEY, and READ: no changes.
+
+GETOK, ASK, and ASKQ with /TIMEOUT: no longer fail when the timer goes off
+if a /DEFAULT was supplied.  The GUI functions (uq_blah) don't seem to
+support timeouts.  Only the text version has been tested.  ckuus[26].c,
+4 Oct 2003.
+
+From Jeff: add /DEFAULT: for popups.  ckuus6.c. 6 Oct 2003.
+
+Change SET DIAL INTERVAL to be like SET DIAL RETRIES.  ckuus[34].c, 6 Oct 2003.
+
+Added target for HP-UX 10/11 + OpenSSL built with gcc, from Chris Cheney.
+Makefile, 12 Oct 2003.
+
+From Jeff, 6 Nov 2003:
+ . #ifdef adjustments: ckcftp.c, ckcdeb.h
+ . Fix spurious consumption of first byte(s) on Telnet connection: ckctel.c
+ . Another HP PJL test for scanfile: ckuusx.c.
+ . K95: Recognize DG4xx protected fields in DG2xx emulation: ckuus7.c.
+ . Add SSLeay version display to SHOW AUTH command: ckuus7.c
+ . Improved SET MOUSE CLEAR help text: ckuus2.c.
+ . Improved Kverbs help text: ckuus2.c (+ new IBM-3151 Kverbs).
+ . Some changes to ck_ssl.c, ckuath.c.
+
+From PeterE, 10 Nov 2003:
+ . Improved HP-UX 10/11 makefile targets for OpenSSL.
+ . #ifdef fix for OpenSSL on HP-UX: ck_ssl.c.
+
+Another new makefile from PeterE with improved and integrated HP-UX targets.
+12 Nov 2003.
+
+A couple fixes to the solaris9g+krb5+krb4+openssl+shadow+pam+zlib target
+from Jeff.  Added a solaris9g+openssl+shadow+pam+zlib target.  makefile,
+21 Nov 2003.
+
+From Jeff, 30 Nov 2003:
+ . Fix SEND /MOVE-TO: ckuusr.c.
+ . Fix K95 SET TITLE to allow quotes/braces around text: ckuus7.c.
+ . Improved "set term autodownload ?" response: ckuus5.c.
+ . Fix SHOW FEATURES to specify the protocol for encryption: ckuus5.c
+ . Make {SEND, RECEIVE} {MOVE-TO, RENAME-TO} work for XYZMODEM (K95 only).
+
+From Jeff: 7 Jan 2004:
+ . At one point Frank started to add a timer parameter to the
+   uq_txt() function but he only did it for the non-ANSI
+   compilers.  I added it for the ANSI compilers, fixed the
+   prototypes and provided a default value easily changed
+   DEFAULT_UQ_TIMEOUT: ckcker.h, ckuus[36].c, ck_ssl.c, ckcftp.c, ckuath.c.
+ . Fixed SET TERMINAL DEBUG ON (typo in variable name): ckuus7.c.
+ . Fixed BEEP INFORMATION; previously it made no sound, now uses
+   MB_ICONQUESTION.  ckuusx.c.
+
+From Ian Beckwith <ian@nessie.mcc.ac.uk> (Debianization), 7 Jan 2004:
+ . Search dir/ckermit for docs, as well as dir/kermit in cmdini(): ckuus5.c.
+ . New linux+krb5+krb4+openssl+shadow+pam target (kitchen sink minus SRP,
+   which Debian does not distribute): makefile.
+ ? Mangles the DESTDIR support in makefile to install into a staging area:
+   makefile (I didn't take this one yet).
+
+Updated copyright notices for 2004, all modules.  7 Jan 2004.
+
+Added INPUT /NOMATCH, allowing INPUT to be used for a fixed amount of time
+without attempting to match any text or patterns, so it's no longer
+necessary to "input 600 STRING_THAT_WILL_NEVER_COME".  If /NOMATCH is
+included, INPUT succeeds if the timeout expires, with \v(instatus) = 1
+(meaning "timed out"); fails upon interruption or i/o error.  ckuusr.h,
+ckuus[r24].c, 7 Jan 2004.
+
+Added SET INPUT SCALE-FACTOR <float>.  This scales all INPUT timeouts by the
+given factor, allowing time-sensitive scripts to be adjusted to changing
+conditions such as congested networks or different-speed modems without
+having to change each INPUT-class command.  This affects only those timeouts
+that are given in seconds, not as wall-clock times.  Although the scale
+factor can have a fractional part, the INPUT timeout is still an integer.
+Added this to SHOW INPUT, and added a \v(inscale) variable for it.
+ckuusr.h, ckuus[r257].c, 7 Jan 2004.
+
+undef \%a, \fverify(abc,\%a) returns 0, which makes it look as if \%a is a
+string composed of a's, b's, and/or c's, when in fact it contains nothing.
+Changed \fverify() to return -1 in this case.  ckuus4.c, 12 Jan 2004.
+
+\fcode(xxx) returned an empty string if its argument string was empty.  This
+makes it unsafe to use in arithmetic or boolean expressions.  Changed it to
+return 0 if its argument was missing, null, or empty.  ckuus4.c, 12 Jan 2004.
+
+Updated \verify() and \fcode() help text.  ckuus2.c, 12 Jan 2004.
+
+While setting up IKSD, Ian Beckwith noticed that including the --initfile:
+option caused Kermit to start parsing its own Copyright string as if it were
+the command line, and eventually crash.  I couldn't reproduce on Solaris /
+Sparc but I could in Linux / i386 (what Ian is using) -- a change from Jeff
+on 28 Apr 2003 set the command-line arg pointer to a literal empty string in
+prescan() about line 1740 of of ckuus4.c; the pointer is incremented next
+time thru the loop, resulting in random memory being referenced.  Fixed by
+setting the pointer to NULL instead of "".  ckuus4.c, 12 Jan 2004.
+
+declare \&a[999999999999999] would dump core on some platforms.  atoi()
+or whatever would truncate the dimension to maxint.  When we add 1 to the
+result, we get a negative number, which is used as an index, loop test, etc.
+Fixed both dodcl() and dclarray() to check for (n+1 < 0).  ckuus[r5].c,
+12 Jan 2004.
+
+Unix zchki() would fail on /dev/tty, which is unreasonable.  This prevented
+FOPEN /READ from reading from the terminal.  zchki() already allowed for
+/dev/null, so I added /dev/tty to the list of specials.  Ditto for FOPEN
+/WRITE and zchko().  ckufio.c 13 Jan 2004.
+
+Added untabify() routine to ckclib.[ch], 13 Jan 2004.
+Added FREAD /TRIM and /UNTABIFY.  ckuus[27].c, 13 Jan 2004.
+Added \funtabify().  ckuusr.h, ckuus[24].c, 13 Jan 2004.
+
+Dat Nguyen noticed that (setq u 'p') followed by (u) dumped core.  This was
+caused by an over-clever optimization that skipped mallocs for short
+literals, but then went on later to try to free one that hadn't been
+malloc'd.  Fixed in dosexp(): ckuus3.c, 14 Jan 2004.
+
+Catch another copyright date.  ckuus5.c, 14 Jan 2004.
+
+Fixed SWITCH to work even when SET COMMAND DOUBLEQUOTE OFF (from Mark
+Sapiro).  ckuus5.c, 15 Jan 2004.
+
+Changed version to 8.0.211 so scripts can test for recently added features.
+ckcmai.c, 15 Jan 2004.
+
+Fixed a glitch in K95 "help set port".  ckuus2.c, 20 Jan 2004.
+
+Fix from Jeff: Connections to a TLS-aware protocol which require a reconnect
+upon certificate verification failure could not reconnect if the connection
+was initiated from the command line or via a URL.  ckctel.c ckcmai.c
+ckuusr.c ckuus7.c ckuusy.c, 20 Jan 2004.
+
+From Alex Lewin: makefile target and #ifdef for Mac OS X 10.3 (Panther):
+makefile, ckcnet.c, 7 Feb 2004.
+
+Added KFLAGS to sco32v507 targets to make PTY and SSH commands work.  The
+same flags could probably also be added to earlier OSR5 targets but they
+have not been tested there.  makefile, 7 Feb 2004.
+
+Checked a complaint that "LOCAL &a" did not make array \&a[] local.  Indeed
+it did not, and can not.  You have to use the full syntax in the LOCAL
+command, "LOCAL \&a[]", or else it doesn't know it's not a macro named &a.
+7 Feb 2004.
+
+Fixed some confusion in creating IKSD database file and temp-file names.
+I was calling zfnqfp() without remembering that the path member of the
+returned struct included the filename, so to get just the directory name,
+I needed to strip the filename from the right.  ckuusy.c, 2 Mar 2004.
+
+New ckuath.c, ck_ssl.c from Jeff.  2 Mar 2004.
+
+Updated Jeff's affiliation in VERSION command text.  ckuusr.c, 2 Mar 2004.
+
+Designation changed from Dev.00 to Beta.01.  ckcmai.c, 2 Mar 2004.
+
+Fixed zrename() syslogging -- it had success and failure reversed.
+Beta.02: ckufio.c, 4 Mar 2004.
+
+Problem: when accessing IKSD via a kermit:// or iksd:// URL, and a user ID
+is given but no password, doxarg() set the password to "" instead of leaving
+it NULL, but all the tests in dourl() are for NULL.  Fixed in doxarg():
+ckuusy.c, 5 Mar 2004.
+
+The logic in dourl() about which macro to construct (login and connect,
+login and get directory listing, or login and fetch a file) was a bit off,
+so all three cases were not handled.  ckcmai.c, 5 Mar 2004.
+
+Trial Beta builds:
+ . HP-UX B.11.11 PA-RISC
+ . HP-UX B.11.23 IA64
+ . Tru64 4.0G Alpha
+ . Tru64 5.1B Alpha
+ . Debian 3.0 i386
+ . Red Hat ES 2.1 i386
+ . Slackware 9.1 i386
+ . VMS 7.3-1 Alpha + UCX 5.3
+ . VMS 7.3-1 Alpha no TCP/IP
+ . VMS 7.3 Alpha MultiNet 4.3 A-X
+ . SCO UnixWare 7.1.4 i386
+ . SCO OSR5.0.7 i386
+ . Solaris 9 Sparc
+
+Fixed compiler warning in doxarg() caused by typo (NULL instead of NUL) in
+the 5 March doxarg() edit.  ckuusy.c, 9 Mar 2004.
+
+IKSD (kermit://) command-line URLs did not work right if the client had
+already preauthenticated with Kerberos or somesuch because they tried to log
+in again with REMOTE LOGIN.  The macros constructed in doxarg() needed to
+check \v(authstate) before attempting REMOTE LOGIN.  ckcmai.c, 10 Mar 2004.
+
+Added ckuker.nr to x.sh (ckdaily upload) and updated ckuker.nr with current
+version number and dates.  10 Mar 2004.
+
+Replaced hardwired references to /usr/local in makefile with $(prefix)
+(which defaults to /usr/local, but can be overridden on the command line),
+suggested by Nelson Beebe for use with Configure.  10 Mar 2004.
+
+From Nelson Beebe: In the Kermit makefile in the install target commands,
+line 981 reads:
+
+        cp $(BINARY) $(DESTDIR)$(BINDIR)/kermit || exit 1;\
+
+Could you please add this line before it:
+
+        rm -f $(DESTDIR)$(BINDIR)/kermit;\
+
+Some sites (mine included) keep multiple versions of software around,
+with hard links between $(prefix)/progname and $(prefix)/progname-x.y.z.
+Failure to remove the $(prefix)/progname at "make install" time then
+replaces the old $(prefix)/progname-x.y.z with the new one, destroying
+an old version that the site wanted to be preserved.  makefile, 10 Mar 2004.
+
+Minor syntax and typo fixes (mostly prototypes): ckcdeb.h, ckcfns.c,
+ckclib.c, ckufio.c, ckuusr.h, ckuusx.c, 10 Mar 2004.  (I still have a few
+more to do.)
+
+Added CC=$(CC) CC2=$(CC2) to many (but not all) makefile targets that
+reference other makefile targets.  On some platforms (notably AIX, Solaris,
+SunOS) there are specific targets for different compilers, so I skipped
+those.  makefile, 10 Mar 2004.
+
+Added error checking to kermit:// URL macros, so they don't plow ahead
+after the connection is closed.  ckcmai.c, 11 Mar 2004.
+
+Added FreeBSD 4.9 and 5.1 targets (only the herald is affected).
+makefile, ckuver.h, 11 Mar 2004.
+
+Added "LIBS=-lcrypt" to bsd44 targets since nowadays crypt is almost always
+unbundled from libc.  Also added explanatory notes.  makefile, 11 Mar 2004.
+
+Changed MANDIR to default to $(manroot)/man/man1, and manroot to default
+to $(prefix).  More adding of CC=$(CC) clauses: {Free,Net,Open}BSD, 4.4BSD.
+makefile, 11 Mar 2004.
+
+Miscellaneous cleanups: ckuusx.c, ckcnet.c, ckufio.c, 11 Mar 2004.
+
+Corrected the check in the linux target to see if /usr/include/crypt.h
+exists, and if so to define HAVE_CRYPT_H, which is used in ckcdeb.h to
+#include <crypt.h> to get the prototype for crypt() and prevent bogus
+conversions on its return type on 64-bit platforms (the previous test wasn't
+quite right and the resulting symbol wasn't spelled right).  makefile,
+12 Mar 2004.
+
+From Jeff, 14 Mar 2004:
+ . Initialize localuidbuf[] in tn_snenv(): ckctel.c.
+ . Remove remote-mode checks in hupok() for K95G only (why?): ckuus3.c.
+ . Add help text for new K95-only TYPE /GUI switches: ckuus2.c.
+ . TYPE /GUI parsing, ...: ckuusr.c.
+ . TYPE /GUI action, dotype(): ckuus6.c
+ . Change Jeff's affiliation: most modules.
+
+20 Mar 2004: Looked into adding long file support, i.e. handling files more
+than 2GB (or 4GB) long.  Discovered very quickly this would be a major
+project.  Each platform has a different API, or environment, or transition
+plan, or whatever -- a nightmare to handle in portable code.  At the very
+least we'll need to convert a lot of Kermit variables from long or unsigned
+long to some new Kermit type, which in turn is #defined or typedef'd
+appropriately for each platform (to off_t or size_t or whatever).  Then we
+have to worry about the details of open() vs fopen(); printf() formats (%lld
+vs %Ld vs %"PRId64"...), platforms like HP-UX where you might have to use
+different APIs for different file systems on the same computer, etc.  We'll
+need to confront this soon, but let's get a good stable 8.0.211 release out
+first!  Meanwhile, for future reference, here are a few articles:
+
+General: http://freshmeat.net/articles/view/709/
+Linux:   http://www.ece.utexas.edu/~luo/linux_lfs.html
+HP-UX:   http://devrsrc1.external.hp.com/STK/partner/lg_files.pdf
+Solaris: http://wwws.sun.com/software/whitepapers/wp-largefiles/largefiles.pdf
+
+Looked into FTP timeouts.  It appears I can just call empty() (which is
+nothing more than a front end for select()) with the desired timeout before
+any kind of network read.  If it returns <= 0, we have a timeout.  This is
+not quite the same as using alarm() / signal() around a recv() (which could
+get stuck) but alarm() / signal() are not not used in the FTP module and are
+not naturally portable to Windows, but select() is already in use in the FTP
+module for both Unix and Windows.  This form of timeout could be used
+portably for both command response and data reads.  What about writes to the
+command or data socket?  They can get stuck for hours and hours without
+returning too, but the select() approach won't help here -- we need the
+actual send() or recv() to time out, or be wrapped in an alarm()/signal()
+kind of mechanism.  But if we can do that for sends, we can also do it for
+receives.  Better check with Jeff before I start programming anything.
+20 Mar 2004.
+
+Later: Decided to postpone the above two projects (ditto IPv6) until after
+8.0.211 is released because both will have major impacts on portability.
+Grumble: all i/o APIs should have been designed from the beginning with a
+timeout parameter.  To this day, hardly any have this feature.
+
+3-4 Apr 2004: More 8.0.211 Beta.02+ test builds:
+
+ . FreeBSD 3.3
+ . FreeBSD 4.4
+ . Linux Debian 2.1
+ . Linux RH 6.1
+ . Linux RH 7.1
+ . Linux RH 7.2
+ . Linux RH 9 (with 84 different combinations of feature selection)
+ . Linux SuSE 6.4
+ . Linux SuSE 7.0
+ . NetBSD 1.4.1
+ . NetBSD 1.5.2
+ . OpenBSD 2.5
+ . OpenBSD 3.0
+ . QNX 4.25
+ . SCO UnixWare 2.1.3
+ . SCO UnixWare 7.1.4
+ . SCO OpenServer 5.0.7
+ . SCO XENIX 2.3.4 (no TCP)
+
+Changes needed: None.
+
+Problem: SCO XENIX 2.3.4 network build failed in the FTP module with
+header-file syntax and conflicting-definitions trouble.  I'm not going to
+try to fix it; 8.0.209 built OK with FTP, so we'll just keep that one
+available.
+
+Got access to VMS 8.1 on IA64.  Building the nonet version of C-Kermit
+required minor modifications to ckvvms.h, ckv[ft]io.c, and ckvcon.c, to
+account for a third architecture.  Also to SHOW FEATURES in ckuus5.c.  Once
+that was done, the UCX 5.5 version built OK too.  Starts OK, makes Telnet
+connection OK, sends files.  Has some obvious glitches though -- "stat"
+after a file transfer reports 0 elapsed time (in fact it was 00:09:48) and
+1219174400 cps (when in fact it was 10364).  This doesn't happen on the
+Alpha.  Btw, the IA64 binary is twice as big as the Alpha one.  Changed
+to Beta.03.  5 Apr 2004.
+
+Fixed the ckdaily script to include the makefile and man page in the Zip
+file (they were not included because the Zip file was intended mainly for
+VMS users, but some Unix users prefer Zip to tar.gz).  6 Apr 2004.
+
+Traced problems in VMS/IA64 statistics report to rftimer()/gftimer() in
+ckvtio.c, which use sys$ and lib$ calls to figure elapsed time.  These work
+on VAX and Alpha but not IA64.  Sent a report to the chief engineer of the
+IA64 VMS port; he says it's probably a bug in VMS 8.1 (which is not a real
+release); he'll make sure it's fixed in 8.2.  As an experiment, tried
+swapping in the Unix versions of these routines (which call gettimeofday()
+etc).  They seem work just fine (it hung a couple times but I think that's
+because the underlying system hung too; trying it later on a new connection,
+it was fine; however I noticed a BIG discrepancy in throughput between
+sending and receiving).  Moved definitions for VMS64BIT and VMSI64 to
+ckcdeb.h so all modules can use them and added them to the SHOW FEATURES
+display.  Added VMSV80 definition to build procedure.  Beta.03+.  ckcdeb.h,
+ckcuus5.c, ckcvvms.h, ckvtio.c, ckvker.com, 6 Apr 2004.
+
+While doing the build-all, I noticed the VMS version did not build with
+Multinet or older UCX versions, always with the same errors -- undeclared
+variables, undefined symbols, all TCP/IP related.  This didn't happen a
+couple weeks ago...  Somehow the order of #includes was messed up --
+ckuusr.h depended on symbols that are defined in ckcnet.h, but ckcnet.h
+was being included after ckuusr.h...  this was compounded by two missing
+commas in ckvker.com.  11 Apr 2004.
+
+Removed Beta designation, released as 8.0.211, 10 Apr 2004.
+
+---8.0.211---
+
+I had somehow lost the edit to ckutio.c that changed the UUCP lockfile for
+Mac OS X from /var/spool/uucp to /var/spool/lock.  So I slipped it in and
+re-uploaded version 8.0.211.  You can tell the difference because SHOW
+VERSIONS has a 17 Apr 2004 for the Communications I/O module.  Also the 10.3
+executable now has a designer banner: "Mac OS X 10.3".  makefile, ckuver.h,
+ckutio.c, ckuus[45].c, 17 Apr 2004.
+
+***********************
diff --git a/ckcbwr.txt b/ckcbwr.txt
new file mode 100644 (file)
index 0000000..5e70e65
--- /dev/null
@@ -0,0 +1,1467 @@
+
+                      C-Kermit 8.0 General Hints and Tips
+
+     Frank da Cruz
+     [1]The Kermit Project, [2]Columbia University
+
+   As of: C-Kermit 8.0.211, 17 March 2003
+   This page last updated: Sat Apr 10 16:37:37 2004 (New York USA Time)
+
+     IF YOU ARE READING A PLAIN-TEXT version of this document, it is a
+     plain-text dump of a Web page. You can visit the original (and
+     possibly more up-to-date) Web page here:
+
+  [3]http://www.columbia.edu/kermit/ckcbwr.html
+
+   This document contains platform-independent C-Kermit hints and tips.
+   Also see the platform-specific C-Kermit hints and tips document for
+   your platform, for example:
+
+  [4]http://www.columbia.edu/kermit/ckubwr.html
+
+   for Unix. This document also applies to [5]Kermit 95 for Windows,
+   which is based on C-Kermit.
+
+   [ [6]C-Kermit ] [ [7]TUTORIAL ]
+    ________________________________________________________________________
+
+  CONTENTS
+
+   0. [8]PATCHES
+   1. [9]INCOMPATIBLE CHANGES
+   2. [10]THE C-KERMIT COMMAND PARSER
+   3. [11]MULTIPLE SESSIONS
+   4. [12]NETWORK CONNECTIONS
+   5. [13]MODEMS AND DIALING
+   6. [14]DIALING HINTS AND TIPS
+   7. [15]TERMINAL SERVERS
+   8. [16]TERMINAL EMULATION
+   9. [17]KEY MAPPING
+  10. [18]FILE TRANSFER
+  11. [19]SCRIPT PROGRAMMING
+    ________________________________________________________________________
+
+  0. PATCHES
+
+   [ [20]Top ] [ [21]Contents ] [ [22]Next ]
+
+   Source-level patches for C-Kermit 8.0.211:
+
+     (None)
+    ________________________________________________________________________
+
+  1. INCOMPATIBLE CHANGES
+
+   [ [23]Top ] [ [24]Contents ] [ [25]Next ]
+
+   These are not necessarily exhaustive lists.
+
+  1.1. C-Kermit 6.0
+
+   C-Kermit 6.0 was released 6 September 1996 and is completely
+   documented in [26]Using C-Kermit, 2nd Edition. The following
+   incompatible changes were made in C-Kermit 6.0:
+
+     * Unless you tell C-Kermit otherwise, if a serial or network
+       connection seems to be open, and you attempt to EXIT or to open a
+       new connection, C-Kermit warns you that an active connection
+       appears to be open and asks you if you really want to close it. If
+       you do not want these warnings, add SET EXIT WARNING OFF to your
+       customization file or script, or give this command at the prompt.
+     * The default for SET { SEND, RECEIVE } PATHNAMES was changed from
+       ON to OFF, to prevent unexpected creation of directories and
+       depositing of incoming files in places you might not know to look.
+     * The default for SET FILE INCOMPLETE was changed from DISCARD to
+       KEEP to allow for file transfer recovery.
+     * The default file-transfer block-check is now 3, rather than 1. If
+       the other Kermit does not support this, the two will drop back to
+       type 1 automatically unless the other Kermit fails to follow the
+       protocol specification.
+     * The default flow-control is now "auto" ("do the right thing for
+       each type of connection"), not Xon/Xoff.
+     * Backslash (\) is no longer a command continuation character. Only
+       - (hyphen, dash) may be used for this in C-Kermit 6.0 and later.
+     * Negative INPUT timeout now results in infinite wait, rather than 1
+       second.
+
+  1.2. C-Kermit 7.0
+
+   C-Kermit 7.0 was released 1 January 2000. Its new features are
+   documented in the C-Kermit 7.0 Supplement,
+   [27]http://www.columbia.edu/kermit/ckermit2.html. The following
+   incompatible changes were made in C-Kermit 7.0:
+     * The "multiline GET" command is gone. Now use either of the
+       following forms instead:
+  get remote-name local-name
+  get /as-name:local-name remote-name
+       If either name contains spaces, enclose it in braces (or, in
+       C-Kermit 8.0, doublequotes).
+     * To include multiple file specifications in a GET command, you must
+       now use MGET rather than GET:
+  mget file1 file2 file3 ...
+     * C-Kermit 7.0 and later use FAST Kermit protocol settings by
+       default. This includes "unprefixing" of certain control
+       characters. Because of this, file transfers that worked with
+       previous releases might not work in the new release especially
+       against a non-Kermit-Project Kermit protocol implementation (but
+       it is more likely that they will work, and much faster). If a
+       transfer fails, you'll get a context-sensitive hint suggesting
+       possible causes and cures. Usually SET PREFIXING ALL does the
+       trick.
+     * By default C-Kermit 7.0 and later send files in text or binary
+       mode by looking at each file to see which is the appropriate mode.
+       To restore the previous behavior, put SET TRANSFER MODE MANUAL and
+       the desired SET FILE TYPE (TEXT or BINARY) in your C-Kermit
+       initialization file.
+     * The RESEND and REGET commands automatically switch to binary mode;
+       previously if RESEND or REGET were attempted when FILE TYPE was
+       TEXT, these commands would fail immediately, with a message
+       telling you they work only when the FILE TYPE is BINARY. Now they
+       simply do this for you.
+     * SET PREFIXING CAUTIOUS and MINIMAL now both prefix linefeed (10
+       and 138) in case rlogin, ssh, or cu are "in the middle", since
+       otherwise <LF>~ might appear in Kermit packets, and this would
+       cause rlogin, ssh, or cu to disconnect, suspend,escape back, or
+       otherwise wreck the file transfer. Xon and Xoff are now always
+       prefixed too, even when Xon/Xoff flow control is not in effect,
+       since unprefixing them has proven dangerous on TCP/IP connections.
+     * In UNIX, VMS, Windows, and OS/2, the DIRECTORY command is built
+       into C-Kermit itself rather than implemented by running an
+       external command or program. The built-in command might not behave
+       the way the platform-specific external one did, but many options
+       are available for customization. Of course the underlying
+       platform-specific command can still be accessed with "!", "@", or
+       "RUN" wherever the installation does not forbid. In UNIX, the "ls"
+       command can be accessed directly as "ls" in C-Kermit.
+     * SEND ? prints a list of switches rather than a list of filenames.
+       If you want to see a list of filenames, use a (system-dependent)
+       construction such as SEND ./? (for UNIX, Windows, or OS/2), SEND
+       []? (VMS), etc.
+     * In UNIX, OS-9, and Kermit 95, the wildcard characters in previous
+       versions were * and ?. In C-Kermit 7.0 they are *, ?, [, ], {, and
+       }, with dash used inside []'s to denote ranges and comma used
+       inside {} to separate list elements. If you need to include any of
+       these characters literally in a filename, precede each one with
+       backslash (\).
+     * SET QUIET { ON, OFF } is now on the command stack, just like SET
+       INPUT CASE, SET COUNT, SET MACRO ERROR, etc, as described on p.458
+       of [28]Using C-Kermit, 2nd Edition. This allows any macro or
+       command file to SET QUIET ON or OFF without worrying about saving
+       and restoring the global QUIET value. For example, this lets you
+       write a script that tries SET LINE on lots of devices until it
+       finds one free without spewing out loads of error messages, and
+       also without disturbing the global QUIET setting, whatever it was.
+     * Because of the new "." operator (which introduces assignments),
+       macros whose names begin with "." can not be invoked "by name".
+       However, they still can be invoked with DO or \fexecute().
+     * The syntax of the EVALUATE command has changed. To restore the
+       previous syntax, use SET EVALUATE OLD.
+     * The \v(directory) variable now includes the trailing directory
+       separator; in previous releases it did not. This is to allow
+       constructions such as:
+  cd \v(dir)data.tmp
+       to work across platforms that might have different directory
+       notation, such as UNIX, Windows, and VMS.
+     * Prior to C-Kermit 7.0, the FLOW-CONTROL setting was global and
+       sticky. In C-Kermit 7.0, there is an array of default flow-control
+       values for each kind of connection, that are applied automatically
+       at SET LINE/PORT/HOST time. Thus a SET FLOW command given before
+       SET LINE/PORT/HOST is likely to be undone. Therefore SET FLOW can
+       be guaranteed to have the desired effect only if given after the
+       SET LINE/PORT/HOST command.
+     * Character-set translation works differently in the TRANSMIT
+       command when (a) the file character-set is not the same as the
+       local end of the terminal character-set, or (b) when the terminal
+       character-set is TRANSPARENT.
+
+  1.3. C-Kermit 8.0
+
+   The following incompatible changes were made in C-Kermit 8.0:
+     * C-Kermit now accepts doublequotes in most contexts where you
+       previously had to use braces to group multiple words into a single
+       field, or to force inclusion of leading or trailing blanks. This
+       might cause problems in contexts where you wanted the doublequote
+       characters to be taken literally. Consult [29]Section 5 of the
+       [30]C-Kermit 8.0 Update Notes for further information.
+     * Using the SET HOST command to make HTTP connections is no longer
+       supported. Instead, use the new [31]HTTP OPEN command.
+    ________________________________________________________________________
+
+  2. THE C-KERMIT COMMAND PARSER
+
+   [ [32]Top ] [ [33]Contents ] [ [34]Next ] [ [35]Previous ]
+
+   Various command-related limits are shown in the following table, in
+   which the sample values are for a "large memory model" build of
+   C-Kermit, typical for modern platforms (Linux, Solaris, AIX, VMS,
+   etc). You can see the values for your version of Kermit by giving the
+   SHOW FEATURES command. The maximum length for a Kermit command (CMDBL)
+   also determines the maximum length for a macro definition, since
+   DEFINE is itself a command. The maximum length for a variable name is
+   between 256 and 4096 characters, depending on the platform; for array
+   declarations and references, that includes the subscript.
+       ______________________________________________________________
+
+   Item Symbol Sample
+   Value Definition
+   Number of characters in a command CMDBL 32763 ckucmd.h
+   Number of chars in a field of a command    ATMBL 10238 ckucmd.h
+   Nesting level for command files MAXTAKE 54   ckuusr.h
+   Nesting level for macros MACLEVEL 128 ckuusr.h
+   Nesting level for FOR / WHILE loops FORDEPTH 32 ckuusr.h
+   Number of macros MAC_MAX 16384 ckuusr.h
+   Size of INPUT buffer INPBUFSIZ 4096 ckuusr.h
+   Maximum files to match a wildcard MAXWLD    102400 ckcdeb.h
+   Filespecs in MSEND command MSENDMAX 1024 ckuusr.h
+   Length for GOTO target label LBLSIZ 50 ckuusr.h
+   \fexecute() recursion depth limit CMDDEP 64 ckucmd.h
+       ______________________________________________________________
+
+   If you need to define a macro that is longer than CMDBL, you can break
+   the macro up into sub-macros or rewrite the macro as a command file.
+   In a pinch you can also redefine CMDBL and recompile C-Kermit. All of
+   these numbers represent tradeoffs: the bigger the number, the more
+   "powerful" Kermit in the corresponding area, but also the bigger the
+   program image and possibly disk footprint, and the longer it takes to
+   load and initialize.
+
+   In the interactive command parser:
+
+     * EMACS- or VI-style command line editing is not supported.
+     * Editing keys are hardwired (Ctrl-U, Ctrl-W, etc).
+
+   If you interrupt C-Kermit before it has issued its first prompt, it
+   will exit. This means that you cannot interrupt execution of the
+   initialization file, or of an "application file" (file whose name is
+   given as the first command-line argument), or of an alternative
+   initialization file ("-y filename"), and get to the prompt. There is,
+   however, one exception to this rule: you *can* interrupt commands --
+   including TAKE commands -- given in the '-C "command list"'
+   command-line argument and -- if there were no action commands among
+   the command-line arguments -- you will be returned to the C-Kermit
+   prompt. So, for example, if you want to start C-Kermit in such a way
+   that it executes a command file before issuing its first prompt, and
+   you also want to be able to interrupt the command file and get to the
+   prompt, include a TAKE command for the desired command in the -C
+   argument, for example:
+
+  kermit -C "take dial.scr"
+
+   At the command prompt, if you use the backslash (\) prefix to enter a
+   control character, space, or question mark into a command literally,
+   the backslash disappears and is replaced by the quoted character. If
+   it was a control character, it is shown as a circumflex (^). This
+   allows editing (backspace, delete, Ctrl-W) to work correctly even for
+   control characters.
+
+   Priot to C-Kermit 8.0, the only way to include a comma literally in a
+   macro definition -- as opposed to having it separate commands within
+   the definition -- is to enter its ASCII value (44) in backslash
+   notation, e.g.:
+
+  DEFINE ROWS RUN MODE CO80\{44}\%1
+
+   In C-Kermit 8.0 you can use constructions like this:
+
+  DEFINE ROWS RUN MODE "CO80,\%1"
+
+   If you quote special characters in a filename (e.g. in the SEND
+   command), filename completion may seem to work incorrectly. For
+   example, if you have a file whose name is a*b (the name really
+   contains an asterisk), and you type "send a\\*<ESC>", the "b" does not
+   appear, nor will Ctrl-R redisplay the completed name correctly. But
+   internally the file name is recognized anyway.
+
+   Question-mark help does not work during execution of an ASKQ command.
+   The question marks are simply accepted as text.
+
+   In OUTPUT commands only, \B sends a BREAK signal, \L sends a Long
+   BREAK signal, and \N sends a NUL (ASCII 0). BREAK and Long BREAK are
+   special signals, not characters, and NUL is a character that normally
+   cannot be included in a C string, since it is the C string terminator.
+   If you really want to output a backslash followed by a B, an L, or an
+   N (as is needed to configure certain modems, etc), double the
+   backslash, e.g. "output \\B". In C-Kermit 7.0 or later, you can disarm
+   and re-arm the special OUTPUT-command escapes (\B, \L, and \N) with
+   SET OUTPUT SPECIAL-ESCAPES { OFF, ON }.
+
+   When using the command-line processor ("kermit -l /dev/tty00 -b
+   19200", etc), note that in some cases the order of the command-line
+   options makes a difference, contrary to the expectation that order of
+   command-line options should not matter. For example, the -b option
+   must be given after the -l option if it is to affect the device
+   specified in the -l option.
+    ________________________________________________________________________
+
+  3. MULTIPLE SESSIONS
+
+   [ [36]Top ] [ [37]Contents ] [ [38]Next ] [ [39]Previous ]
+
+   C-Kermit 7.0 and earlier do not support multiple sessions. When you
+   SET LINE (or SET PORT, same thing) to a new device, or SET HOST to a
+   new host, the previous SET LINE device or network host connection is
+   closed, resulting in hangup of the modem or termination of the network
+   connection. In windowing environments like HP-VUE, NeXTSTEP, Windows,
+   OS/2, etc, you can run separate copies of Kermit in different windows
+   to achieve multiple sessions.
+
+   To achieve multiple sessions through a single serial port (e.g. when
+   dialing up), you can install SLIP or PPP on your computer and then use
+   C-Kermit's TCP/IP support over the SLIP or PPP connection, assuming
+   you also have TCP/IP networking installed on your computer.
+
+   C-Kermit 8.0 has the same restriction on SET LINE and SET HOST
+   sessions: only one regular session (dialout, Telnet, etc) can be open
+   at a time. However, version 8.0 adds two new kinds of sessions: FTP
+   and HTTP; one or both of these can be open at the same as a regular
+   session.
+    ________________________________________________________________________
+
+  4. NETWORK CONNECTIONS
+
+   [ [40]Top ] [ [41]Contents ] [ [42]Next ] [ [43]Previous ]
+
+  FTP Client Bugs
+
+   The Unix C-Kermit 8.0.206 FTP client had the following bugs at the
+   time most of the 8.0.206 binaries were built for the C-Kermit 8.0
+   CDROM:
+
+    1. FTP MGET fails when directory segments contain wildcards, as in
+       "ftp mget */data/*.dat". Work around by doing a separate MGET for
+       each source directory.
+    2. FTP MGET can fail or produce random side effects if you have a
+       TMPDIR or CK_TMP environment variable definition in effect, or a
+       SET TEMP-DIRECTORY value, longer than 7 characters. Work around by
+       giving a SET TEMP-DIRECTORY command with a short value, such as
+       "/tmp".
+
+   These two bugs are fixed in the source code that is included on the
+   CDROM, and also in Kermit 95 2.1.1. You can tell if a C-Kermit 8.0.206
+   binary has these fixes by typing SHOW VERSION; if it says "FTP Client,
+   8.0.200, 24 Oct 2002" it has the fixes; if the edit number is less
+   that 200, it doesn't, in which case can build a new binary from the
+   source code (or contact us and we'll try to get get one for you).
+
+  Making TCP/IP Connections Can Take a Long Time
+
+   The most frequently asked question in many newsgroups is "Why does it
+   take such a long time to make a Telnet connection to (or from) my
+   (e.g.) Linux PC?" (this applies to Kermit as well as to regular Telnet
+   clients):
+
+    1. Most Telnet servers perform reverse DNS lookups on the client for
+       security and/or logging reasons. If the Telnet client's host
+       cannot be found by the server's local DNS server, the DNS request
+       goes out to the Internet at large, and this can take quite some
+       time. The solution to this problem is to make sure that both
+       client and host are registered in DNS.
+    2. C-Kermit itself performs reverse DNS lookups unless you tell it
+       not to. This is to allow C-Kermit to let you know which host it is
+       actually connected to in case you have made a connection to a
+       "host pool" (multihomed host). You can disable C-Kermit's reverse
+       DNS lookup with SET TCP REVERSE-DNS-LOOKUP OFF.
+    3. C-Kermit 7.0 and later strictly enforce Telnet protocol rules. One
+       such rule is that certain negotiations must be responded to. If
+       C-Kermit sends a such a negotiation and the host does not respond,
+       C-Kermit waits a long time for the reply (in case the network is
+       congested or the host is slow), but eventually will time out. To
+       eliminate the waits (and therefore risk possible protocol
+       mismatches -- or worse -- between Telnet client and server), tell
+       C-Kermit to SET TELNET WAIT OFF (or include the /NOWAIT switch
+       with the TELNET command).
+
+  The Rlogin Client
+
+   In multiuser operating systems such as UNIX and VMS, TCP/IP Rlogin
+   connections are available only to privileged users, since "login" is a
+   privileged socket. Assuming you are allowed to use it in the first
+   place, it is likely to behave differently depending on what type of
+   host you are rlogging in to, due to technical reasons having to do
+   with conflicting interpretations of RFC793 (Out-Of-Band Data) and
+   Rlogin (RFC1122)... "Specifically, the TCP urgent pointer in BSD
+   points to the byte after the urgent data byte, and an RFC-compliant
+   TCP urgent pointer points to the urgent data byte. As a result, if an
+   application sends urgent data from a BSD-compatible implementation to
+   an [44]RFC-1122 compatible implementation then the receiver will read
+   the wrong urgent data byte (it will read the byte located after the
+   correct byte in the data stream as the urgent data byte)." Rlogin
+   requires the use of OOB data while Telnet does not. Therefore, it is
+   possible for Telnet to work between all systems while BSD and System V
+   TCP/IP implementations are almost always a bad mix.
+
+  The Telnet Client
+
+   On a TCP/IP TELNET connection, you should normally have PARITY set to
+   NONE and (except in VMS C-Kermit) FLOW-CONTROL also set to NONE. If
+   file transfer does not work with these settings (for example, because
+   the remote TELNET server only gives a 7-bit data path), use SET PARITY
+   SPACE. Do not use SET PARITY MARK, EVEN, or ODD on a TELNET connection
+   -- it interferes with TELNET protocol.
+
+   If echoing does not work right after connecting to a network host or
+   after dialing through a TCP/IP modem server, it probably means that
+   the TELNET server on the far end of the connection is executing the
+   TELNET protocol incorrectly. After initially connecting and
+   discovering incorrect echoing (characters are echoed twice, or not at
+   all), escape back, give the appropriate SET DUPLEX command (FULL or
+   HALF), and then CONNECT again. For a consistently misbehaving
+   connection, you can automate this process in a macro or TAKE file.
+
+   TELNET sessions are treated just like serial communications sessions
+   as far as "terminal bytesize" and "command bytesize" are concerned. If
+   you need to view and/or enter 8-bit characters during a TELNET
+   session, you must tell C-Kermit to SET TERMINAL BYTESIZE 8, SET
+   COMMAND BYTESIZE 8, and SET PARITY NONE.
+
+   If you SET TELNET DEBUG ON prior to making a connection, protocol
+   negotiations will be displayed on your screen. You can also capture
+   them in the debug log (along with everything else) and then extract
+   them easily, since all Telnet negotiations lines begin with
+   (uppercase) "TELNET".
+    ________________________________________________________________________
+
+  5. MODEMS AND DIALING
+
+   [ [45]Top ] [ [46]Contents ] [ [47]Next ] [ [48]Previous ]
+
+   External modems are recommended because:
+
+     * They don't need any special drivers.
+     * They are less likely to interfere with normal operation of your
+       computer.
+     * You can use the lights and speaker to troubleshoot dialing.
+     * You can share them among all types of computers.
+     * You can easily turn them off and on when power-cycling seems
+       warranted.
+     * They are more likely to have manuals.
+
+   Modems can be used by C-Kermit only when they are visible as or
+   through a regular serial port device. Certain modems can not be used
+   in this normal way on many kinds of computers: Winmodems, RPI modems,
+   Controllerless modems, the IBM Mwave, etc; all of these require
+   special drivers that perform some, most, or all of the modem's
+   functions in software. Such drivers are generally NOT available in
+   UNIX or other non-Windows (or non-OS/2, in the case of the Mwave)
+   platforms.
+
+   In order to dial a modem, C-Kermit must know its repertoire of
+   commands and responses. Each modem make and model is likely to have a
+   different repertoire. Since Kermit has no way of knowhing which kind
+   of modem will be dialed, normally you have to tell it with a SET MODEM
+   TYPE command, e.g.:
+
+  set modem type usrobotics
+  set line /dev/cua0
+  set speed 57600
+  dial 7654321
+
+   In the early days, there was a wide variety of modems and command
+   languages. Nowadays, almost every modem uses the Hayes AT command set
+   (but with some differences in the details) and its startup
+   configuration includes error correction, data compression, and
+   hardware (RTS/CTS) flow control. As long as C-Kermit is capable of
+   hardware flow control (as it is on many, but not all, the platforms
+   where it runs, since some operating systems don't support it), the
+   modem can be dailed immediately, without lengthy configuration
+   dialogs, and in fact this is what SET MODEM TYPE GENERIC-HIGH-SPEED
+   does. In C-Kermit 8.0, GENERIC-HIGH-SPEED has become the default modem
+   type, so now it is usually possible to SET LINE, SET SPEED, and DIAL
+   without having to identify your modem. If this doesn't work, of
+   course, then you might have to fall back to the tradiational method:
+   Give a SET MODEM TYPE for a specific modem first, then SET LINE, SET
+   SPEED, and DIAL.
+
+   An important change in C-Kermit 6.0 is that when you give a SET MODEM
+   TYPE command to tell Kermit what kind of modem you have, Kermit also
+   sets a number of other modem-related parameters automatically from its
+   internal modem database. Thus, the order in which you give
+   modem-related commands is significant, whereas in prior releases they
+   could be given in any order.
+
+   In particular, MODEM SPEED-MATCHING is set according to whether the
+   modem is known to be capable of speed buffering. SET MODEM TYPE
+   HAYES-2400 automatically turns SPEED-MATCHING ON, because when the
+   Hayes 2400 reports a particular speed in its CONNECT message, that
+   means its interface speed has changed to that speed, and C-Kermit's
+   must change accordingly if it is to continue communicating. This might
+   cause some confusion if you use "set modem type hayes" for dialing a
+   more advanced type of modem.
+
+   The new default for flow control is "auto", meaning "do the right
+   thing for each type of connection". So (for example) if your version
+   of C-Kermit supports SET FLOW RTS/CTS and your modem also supports
+   RTS/CTS, then Kermit automatically sets its flow control to RTS/CTS
+   and set modem's flow control to RTS/CTS too before attempting to use
+   the modem.
+
+   For these reasons, don't assume that "set modem type hayes" should be
+   used for all modems that uses the Hayes AT command set. "set modem
+   type hayes" really does mean Hayes 1200 or 2400, which in turn means
+   no hardware flow control, and no speed buffering. This choice will
+   rarely work with a modern high-speed modem.
+    ________________________________________________________________________
+
+  6. DIALING HINTS AND TIPS
+
+   [ [49]Top ] [ [50]Contents ] [ [51]Next ] [ [52]Previous ]
+
+   If you have a high-speed, error-correcting, data-compressing,
+   speed-buffering modem, you should fix the modem's interface speed as
+   high as possible, preferably (at least) four times higher than its
+   maximum connection (modulation) speed to allow compression to work at
+   full advantage. In this type of setup, you must also have an effective
+   means of flow control enabled between C-Kermit and the modem,
+   preferably hardware (RTS/CTS) flow control. On platforms that do not
+   support hardware flow control, it is usually possible to select
+   software flow control (Xon/Xoff), and C-Kermit will do its best to set
+   the modem for local Xon/Xoff flow control too (but then, of course,
+   Ctrl-S and Ctrl-Q characters can not be transmitted on the
+   connection).
+
+   If you are having trouble dialing your modem, SET DIAL DISPLAY ON to
+   watch the dialing interactions between C-Kermit and your modem.
+   Consult Chapters 3-4 of [53]Using C-Kermit (2nd Ed) for modem-dialing
+   troubleshooting instructions. The following sections offer some
+   addtional hints and tips.
+
+  6.1. Syntax
+
+   If you want to dial a number that starts with #, you'll need to quote
+   the "#" character (as \# or \{35}), since it is also a comment
+   introducer:
+
+  C-Kermit>dial #98765421-1-212-5551212   ; Looks like a comment
+  ?You must specify a number to dial
+  C-Kermit>dial \#98765421-1-212-5551212  ; Works OK
+  C-Kermit>dial =#98765421-1-212-5551212  ; This works too
+
+   When using a dialing directory, remember what happens if a name is not
+   found:
+
+  C-Kermit>dial xyzcorp
+  Lookup: "xyzcorp" - not found - dialing as given
+
+   This normally does no harm, but some modems might behave strangely
+   when given dial strings that contain certain letters. For example, a
+   certain German modem treats any dial string that contains the letter
+   "s" as a command to fetch a number from its internal list, and replies
+   OK to the ATD command, which is normally not a valid response except
+   for partial dialing. To avoid this situation, use:
+
+  lookup xyzcorp
+  if success dial
+
+  6.2. The Carrier Signal
+
+   Remember: In many C-Kermit implementations (depending on the
+   underlying operating system -- mostly Windows, OS/2, and
+   System-V-based UNIX versions, and in C-Kermit 7.0, also VMS), you
+   can't CONNECT to a modem and type the modem's dialing command (like
+   "ATDT7654321") manually, unless you first tell C-Kermit to:
+
+  SET CARRIER-WATCH OFF
+
+   This is because (in these implementations), the CONNECT command
+   requires the modem's Carrier Detect (CD) signal to be on, but the CD
+   signal doesn't come on until after dialing is complete. This
+   requirement is what allows C-Kermit to pop back to its prompt
+   automatically when the connection is hung up. See the description of
+   SET CARRIER-WATCH in "Using C-Kermit".
+
+   Similarly, if your dialed connection drops when CARRIER-WATCH is set
+   to AUTO or ON, you can't CONNECT back to the (now disconnected) screen
+   to see what might have happened unless you first SET CARRIER-WATCH
+   OFF. But sometimes not even SET CARRIER-WATCH OFF will help in this
+   situation: certain platforms (for example Unixware 2.1), once carrier
+   drops, won't let the application do i/o with the device any more. In
+   that case, if you want to use the device again, you have to CLOSE it
+   and OPEN it again. Or you can have Kermit do this for you
+   automatically by telling it to SET CLOSE-ON-DISCONNECT ON.
+
+  6.3. Dialing and Flow Control
+
+   Don't SET FLOW RTS/CTS if your modem is turned off, or if it is not
+   presenting the CTS signal. Otherwise, the serial device driver can get
+   stuck waiting for this signal to appear.
+
+   Most modern modems support RTS/CTS (if they support any hardware flow
+   control at all), but some computers use different RS-232 circuits for
+   the same purposes, e.g. DTR and CD, or DTR and CTS. In such cases, you
+   might be able to make your computer work with your modem by
+   appropriately cross-wiring the circuits in the cable connector, for
+   example the computer's DTR to the modem's RTS, and modem's CD to the
+   computer's CTS. HOWEVER, C-Kermit does not know you have done this. So
+   if you have (say) SET FLOW DTR/CD, C-Kermit will make no attempt to
+   tell the modem to use RTS/CTS. You probably did this yourself when you
+   configured the modem.
+
+  6.4. The Dial Timeout
+
+   If it takes your call longer to be completed than the timeout interval
+   that C-Kermit calculates, you can use the SET DIAL TIMEOUT command to
+   override C-Kermit's value. But beware: the modem has its own timeout
+   for completing the call. If it is a Hayes-like modem, C-Kermit adjusts
+   the modem's value too by setting register S7. But the maximum value
+   for S7 might be smaller than the time you need! In that case, C-Kermit
+   sets S7 to 0, 255, or other (modem-specific) value to signify "no
+   timeout". If Kermit attempts to set register S7 to a value higher than
+   your modem's maximum, the modem will say "ERROR" and you will get a
+   "Failure to initialize modem" error. In that case, use SET DIAL
+   TIMEOUT to override C-Kermit's calculation of the timeout value with
+   the highest value that is legal for your modem, e.g. 60.
+
+  6.5. Escape Sequence Guard Time
+
+   A "TIES" (Time-Independent Escape Sequence) modem does not require any
+   guard time around its escape sequence. The following text:
+
+  +++ATH0
+
+   if sent through a TIES modem, for example because you were uploading
+   this file through it, could pop the modem back into command mode and
+   make it hang up the connection. Later versions of the Telebit T1600
+   and T3000 (version LA3.01E firmware and later), and all WorldBlazers,
+   use TIES.
+
+   Although the probability of "+++" appearing in a Kermit packet is
+   markedly lower than with most other protocols (see the [54]File
+   Transfer section below), it can still happen under certain
+   circumstances. It can also happen when using C-Kermit's TRANSMIT
+   command. If you are using a Telebit TIES modem, you can change the
+   modem's escape sequence to an otherwise little-used control character
+   such as Ctrl-_ (Control-Underscore):
+
+  AT S2=31
+
+   A sequence of three consecutive Ctrl-_ characters will not appear in a
+   Kermit packet unless you go to extraordinary lengths to defeat more
+   than a few of Kermit's built-in safety mechanisms. And if you do this,
+   then you should also turn off the modem's escape-sequence recognition
+   altogether:
+
+  AT S48=0 S2=255
+
+   But when escape sequence recognition is turned off, "modem hangup"
+   (<pause>+++<pause>ATH0<CR>) will not work, so you should also SET
+   MODEM HANGUP RS232-SIGNAL (rather then MODEM-COMMAND).
+
+  6.6. Adaptive Dialing
+
+   Some modems have a feature called adaptive dialing. When they are told
+   to dial a number using Tone dialing, they check to make sure that
+   dialtone has gone away after dialing the first digit. If it has not,
+   the modem assumes the phone line does not accept Tone dialing and so
+   switches to Pulse. When dialing out from a PBX, there is almost always
+   a secondary dialtone. Typically you take the phone off-hook, get the
+   PBX dialtone, dial "9" to get an outside line, and then get the phone
+   company's dialtone. In a situation like this, you need to tell the
+   modem to expect the secondary dialtone. On Hayes and compatible
+   modems, this is done by putting a "W" in the dial string at the
+   appropriate place. For example, to dial 9 for an outside line, and
+   then 7654321, use ATDT9W7654321:
+
+  SET PBX-OUTSIDE-PREFIX 9W
+
+   (replace "9" with whatever your PBX's outside-line prefix is).
+
+  6.7. The Busy Signal
+
+   Some phone companies are eliminating the busy signal. Instead, they
+   issue a voice message such as "press 1 to automatically redial until
+   the number answers, or...". Obviously this is a disaster for modem
+   calls. If your service has this feature, there's nothing Kermit can do
+   about it. Your modem will respond with NO CARRIER (after a long time)
+   rather than BUSY (immediately), and Kermit will declare the call a
+   failure, rather than trying to redial the same number.
+
+  6.8. Hanging Up
+
+   There are two ways to hang up a modem: by turning off the serial
+   port's DTR signal (SET MODEM HANGUP-METHOD RS232-SIGNAL) or sending
+   the modem its escape sequence followed by its hangup command (SET
+   MODEM HANGUP-METHOD MODEM-COMMAND). If one doesn't work, try the
+   other. If the automatic hangup performed at the beginning of a DIAL
+   command causes trouble, then SET DIAL HANGUP OFF.
+
+   The HANGUP command has no effect when C-Kermit is in remote mode. This
+   is on purpose. If C-Kermit could hang up its own controlling terminal,
+   this would (a) most likely leave behind zombie processes, and (b) pose
+   a security risk.
+
+   If you DIAL a modem, disconnect, then SET HOST or TELNET, and then
+   HANGUP, Kermit sends the modem's hangup command, such as "+++ATHO".
+   There is no good way to avoid this, because this case can't reliably
+   be distinguished from the case in which the user does SET HOST
+   terminal-server, SET MODEM TYPE name, DIAL. In both cases we have a
+   valid modem type selected and we have a network connection. If you
+   want to DIAL and then later make a regular network connection, you
+   will have to SET MODEM TYPE NONE or SET DIAL HANGUP OFF to avoid this
+   phenomenon.
+    ________________________________________________________________________
+
+  7. TERMINAL SERVERS
+
+   [ [55]Top ] [ [56]Contents ] [ [57]Next ] [ [58]Previous ]
+
+   Watch out for terminal server's escape character -- usually a control
+   character such as Ctrl-Circumflex (Ctrl-^). Don't unprefix it in
+   Kermit!
+
+   Ciscos -- must often be told to "terminal download"... Cisco ASM
+   models don't have hardware flow control in both directions.
+
+   Many terminal servers only give you a 7-bit connection, so if you
+   can't make it 8-bit, tell Kermit to "set parity space".
+
+   The following story, regarding trouble transferring 8-bit files
+   through a reverse terminal server, was contributed by an Annex
+   terminal server user:
+
+     Using C-Kermit on an HP 9000 712/80 running the HP-UX 10.0
+     operating system. The HP was connected to a Xylogics Annex
+     MICRO-ELS-UX R7.1 8 port terminal server via ethernet. On the
+     second port of the terminal server is an AT&T Paradyne 3810 modem,
+     which is connected to a telephone line. There is a program which
+     runs on the HP to establish a Telnet connection between a serial
+     line on the Annex and a character special file on the HP (/dev
+     file). This is an Annex specific program called rtelnet (reverse
+     telnet) and is provided with the terminal server software. The
+     rtelnet utility runs on top of the pseudo-terminal facility
+     provided by UNIX. It creates host-originiated connections to
+     devices attached ot Annex serial ports. There are several command
+     line arguments to be specified with this program: the IP address of
+     the terminal server, the number of the port to attach to, and the
+     name of the pseudo-device to create. In addition to these there are
+     options to tell rtelnet how to operate on the connect: -b requests
+     negotiation for Telnet binary mode, -d turns on socket-leve
+     debugging, -f enables "connect on the fly" mode, -r removes the
+     device-name if it already exists, etc. The most important of these
+     to be specified when using 8 data bits and no parity, as we found
+     out, was the -t option. This creates a transparent TCP connection
+     to the terminal server. Again, what we assumed to be happening was
+     that the rtelnet program encountered a character sequence special
+     to itself and then "eating" those kermit packets. I think this is
+     all of the information I can give you on the configuration, short
+     of the values associated with the port on the terminal server.
+
+   How to DIAL from a TCP/IP reverse terminal server (modem server):
+
+    1. (only if necessary) SET TELNET ECHO REMOTE
+    2. SET HOST terminal-server-ip-name-or-address [ port ]
+    3. SET MODEM TYPE modem-type
+    4. (only if necessary) SET DIAL HANGUP OFF
+    5. (for troubleshooting) SET DIAL DISPLAY ON
+    6. DIAL phone-number
+
+   The order is important: SET HOST before SET MODEM TYPE. Since this is
+   a Telnet connection, serial-port related commands such as SET SPEED,
+   SET STOP-BITS, HANGUP (when MODEM HANGUP-METHOD is RS232), etc, have
+   no effect. However, in C-Kermit 8.0, if the modem server supports
+   [59]RFC-2217 Telnet Com-Port Control protocol, these commands do
+   indeed take effect at the server's serial port.
+    ________________________________________________________________________
+
+  8. TERMINAL EMULATION
+
+   [ [60]Top ] [ [61]Contents ] [ [62]Next ] [ [63]Previous ]
+
+   Except for the Windows, OS/2, and Macintosh versions, C-Kermit does
+   not emulate any kind of terminal. Rather, it acts as a
+   "semitransparent pipe", passing the characters you type during a
+   CONNECT session to the remote host, and sending the characters
+   received from the remote host to your screen. Whatever is controlling
+   your keyboard and screen provides the specific terminal emulation: a
+   real terminal, a PC running a terminal emulator, etc, or (in the case
+   of a self-contained workstation) your console driver, a terminal
+   window, xterm, etc.
+
+   Kermit is semitrantsparent rather than fully transparent in the
+   following ways:
+
+     * During a TELNET ("set host") session, C-Kermit itself executes the
+       TELNET protocol and performs TELNET negotiations. (But it does not
+       perform TN3270 protocol or any other type of 3270 terminal
+       emulation.)
+     * If you have changed your keyboard mapping using SET KEY, C-Kermit
+       replaces the characters you type with the characters or strings
+       they are mapped to.
+     * If you SET your TERMINAL CHARACTER-SET to anything but
+       TRANSPARENT, C-Kermit translates your keystrokes (after applying
+       any SET KEY definitions) before transmitting them, and translates
+       received characters before showing them on your screen.
+     * If your remote and/or local TERMINAL CHARACTER-SET is an ISO 646
+       7-bit national character set, such as German, French, Italian,
+       Swedish, etc, or Short KOI used for Cyrillic, C-Kermit's CONNECT
+       command automatically skips over ANSI escape sequences to avoid
+       translating their characters. Only ANSI/ISO standard
+       (VT100/200/300-like) 7-bit escape sequence formats are supported
+       for this purpose, no proprietary schemes like H-P, Televideo,
+       Tektronix, etc.
+     * If your version of C-Kermit includes SET TERMINAL APC command,
+       then C-Kermit's CONNECT command will handle APC escape sequences
+       if TERMINAL APC is not set to OFF (which is the default).
+
+   You can make C-Kermit fully transparent by starting it with the -0
+   (dash zero) command-line option.
+
+   If you are running C-Kermit under a console driver, or in a terminal
+   window, that emulates the VT100, and use C-Kermit to log in to a VMS
+   system, the console driver or terminal window (not Kermit) is supposed
+   to reply to the "what are you?" query (ESC Z) from the VAX. If it
+   doesn't, and you can't make it do so, then you can (a) live with the
+   "unknown terminal" problem; (b) tell VMS to SET TERMINAL/DEVICE=VT100;
+   (c) program a key using SET KEY to send the appropriate sequence and
+   then punch the key at the right time; or (d) use the VMSLOGIN macro
+   that is defined in CKERMIT.INI to do this for you automatically.
+
+   SET SESSION-LOG { TEXT, BINARY }, which is effective in UNIX and
+   AOS/VS but not other C-Kermit versions, removes CR, DEL, NUL, XON, and
+   XOFF characters (Using C-Kermit neglects to mention that XON and XOFF
+   are removed). The TEXT-mode setting is ineffective during SCRIPT
+   command execution, as well as on X.25 connections.
+    ________________________________________________________________________
+
+  9. KEY MAPPING
+
+   [ [64]Top ] [ [65]Contents ] [ [66]Next ] [ [67]Previous ]
+
+   Except in the terminal-emulating versions, C-Kermit's key mapping
+   facilities are limited to normal "ASCII" keys, and cannot be used with
+   function keys, arrow keys, arcane key combinations, etc. Since
+   C-Kermit runs on such a wide variety of hardware platforms (including,
+   for example, more than 360 different UNIX platforms), it is not
+   possible for C-Kermit to support every conceivable keyboard under
+   every release of every UNIX (or VMS, or ...) product on every
+   different kind of computer possibly under all manner of different
+   console drivers, even if it had the means to do so.
+
+   In technical terms, C-Kermit uses the read() function to read
+   keystrokes, and read() returns a single byte (value 0 through 255).
+   C-Kermit's SET KEY function applies to these single-byte codes.
+   "Extended function" keys, such as F-keys, arrow keys, etc, usually
+   return either a 2-byte "scan code" or else a character string (such as
+   an escape sequence like "<ESC> O p"). In both cases, C-Kermit has no
+   way to tell the difference between such multibyte key values, and the
+   corresponding series of single-byte key values. This could only be
+   done by accessing the keyboard at a much lower level in a highly
+   platform-dependent manner, probably requiring tens of thousands of
+   lines of code to support even a sampling of the most popular
+   workstation / OS combinations.
+
+   However, most workstation console drivers (terminal emulation windows,
+   etc) include their own key-mapping facility. For example in AIX, the
+   AIXterm program (in whose window you would run C-Kermit) allows
+   rebinding of the F1-F12 keys to arbitrary strings. The same is true of
+   Xterm and DECterm windows, etc. Consult the technical documentation
+   for your workstation or emulator. See sample Xterm (Xmodmap) mappings
+   in the [68]Unix C-Kermit Hints and Tips document.
+
+   The SET KEY command (except in Kermit 95) does not allow a key
+   definition to be (or contain) the NUL (\0) character.
+    ________________________________________________________________________
+
+  10. FILE TRANSFER
+
+   [ [69]Top ] [ [70]Contents ] [ [71]Next ] [ [72]Previous ]
+
+   C-Kermit 7.0 is the first release of C-Kermit to use fast (rather than
+   robust and therefore slow) protocol defaults: long packets, sliding
+   windows, control-character unprefixing, and streaming where possible.
+   This makes most transfers (partner willing) dramatically faster "out
+   of the box" but might break some combinations that worked before. If
+   transfers with C-Kermit 7.0 or later fail where transfers worked with
+   earlier C-Kermit versions, try the following (one at a time, in this
+   order):
+
+    1. SET PREFIXING ALL: Disables control-character unprefixing.
+    2. SET STREAMING OFF: Disables streaming.
+    3. CAUTIOUS: Selects medium but cautious protocol settings.
+    4. ROBUST: this command reverts to the most conservative protocol
+       settings.
+
+   Execution of multiple file transfers by C-Kermit from a command file
+   when in remote mode might exhibit long delays between each transfer.
+   To avoid this, just include the command "SET DELAY 0" in your command
+   file before any of the file-transfer commands.
+
+   File transfer failures can occur for all sorts of reasons, most of
+   them listed in Chapter 10 of [73]Using C-Kermit. The following
+   sections touch on some that aren't.
+
+   The [74]C-Kermit 7.0 Release Notes document SEND /COMMAND as taking an
+   argument, but it doesn't. Instead of SEND /COMMAND:{some command},
+   use:
+
+SEND /COMMAND [ other switches such as /AS-NAME: ] command [ arguments... ]
+
+  10.1. Laptops
+
+   Watch out for laptops and their assorted power-saver features; for
+   example, a built-in modem's "auto timeout delay" hanging up the
+   connection in the middle of a file transfer. Most modems, even if they
+   have this feature, do not have it enabled by default. But if you
+   experience otherwise inexplicable disconnections in the midst of your
+   Kermit sessions, check the modem manual for such things as "idle
+   timeout", "auto timeout", etc, and add the command to disable this
+   feature to Kermit's init string for this modem.
+
+  10.2. NFS
+
+   If uploading a large file to an NFS-mounted disk fails (or is
+   painfully slow), try uploading it to a local disk (e.g. /tmp on Unix)
+   and then copying to the NFS disk later.
+
+  10.3. Modems
+
+   If you are dialing out and find that downloads work but uploads don't,
+   try again with a lower serial-port speed. Case in point: dialing out
+   on a certain PC from Linux at 115200 bps using a USR Courier 56K
+   "V.Everything" external modem and RTS/CTS flow control. Downloads
+   worked flawlessly, uploads stopped dead after the first few packets
+   were sent. The modem lights showed constant retraining (ARQ light
+   blinks slowly), and the CTS light was off 95% of the time, allowing
+   nothing to get through. Reducing the serial port speed to 57600 bps
+   made the problems go away. Evidently the PC in question has a very
+   fast serial port, since dialing the same modem with a different PC at
+   115200 bps works without incident.
+
+  10.4. TCP/IP Connections
+
+   If you have trouble transferring files over a TCP/IP connection, tell
+   Kermit to SET PARITY SPACE and try again. If that doesn't work, also
+   try a shorter packet length or smaller window size (to compensate for
+   certain well-known broken Telnet servers), and/or SET RELIABLE OFF.
+
+  10.5. Multihop Connections
+
+   If you have a multihop connection, with the interior nodes in CONNECT
+   mode (Kermit, Telnet, Rlogin, or any other), you can expect (a) file
+   transfer to be slower, and (b) the connection to be less transparent
+   (to control characters, perhaps to the 8th bit) than a more direct
+   connection. C-Kermit 7.0 and later have a "-0" (dash-zero)
+   command-line option to make it 100% transparent in cases where it is
+   to be used in the middle.
+
+  10.6. Recovery
+
+   The recovery feature (RESEND command) that was added in version
+   5A(190) works only for binary-mode transfers. In order for this
+   feature to be useful at all, the default for SET FILE INCOMPLETE was
+   changed from DISCARD to KEEP. Otherwise an interrupted transfer would
+   leave no partial file behind unless you had remembered to change the
+   default. But now you have to pay closer attention to Kermit's messages
+   to know whether a transfer succeeded or failed -- previously, if it
+   failed, the file would not show up on the receiving end at all; in
+   5A(190) and later, you'll get a partial file which could easily be
+   mistaken for the complete file unless you change the default back to
+   DISCARD or read the screen messages, or keep a transaction log.
+
+  10.7. Filename Collisions
+
+   SET FILE COLLISION BACKUP is the default. This means:
+
+     * If you send the same file lots of times, there will be many backup
+       files. There is no automatic mechanism within Kermit to delete
+       them, no notion of a "version retention count", etc, but you can
+       use the PURGE command to clean them up.
+     * If a file arrives that has the same name as a directory, the file
+       transfer fails because Kermit will not rename a directory. Send
+       the file with another name, or use SET FILE COLLISION RENAME.
+     * If the directory lacks write permission, the file transfer fails
+       even if you have write access to the file that is being backed up;
+       in that case, switch to SET FILE COLLISION OVERWRITE or APPEND, or
+       send to a different directory.
+
+   SET FILE COLLISION UPDATE depends on the date/time stamp in the
+   attribute packet. However, this is recorded in local time, not
+   Universal Time (GMT), and there is no indication of time zone. The
+   time is expressed to the precision of 1 second, but some file systems
+   do not record with this precision -- for example, MS-DOS records the
+   file date/time only to the nearest 2 seconds. This might cause update
+   operations to send more files than necessary.
+
+   (This paragraph does NOT apply to UNIX, where, as of C-Kermit 7.0,
+   C-Kermit pipes incoming mail and print material directly the mail or
+   print program): When C-Kermit is receiving files from another Kermit
+   program that has been given the MAIL or REMOTE PRINT command, C-Kermit
+   follows the current filename collision action. This can be
+   disconcerting if the action was (for example) BACKUP, because the
+   existing file will be renamed, and the new file will be mailed (or
+   printed) and then deleted. Kermit cannot temporarily change to RENAME
+   because the file collision action occurs when the filename packet is
+   received, and the PRINT or MAIL disposition only comes later, in the
+   Attribute packet.
+
+   Watch out for SET FILE COLLISION RENAME, especially when used in
+   conjunction with recovery. Recall that this option (which is NOT the
+   default) renames the incoming file if a file already exists with the
+   same name (the default is to rename the previously existing file, and
+   store the incoming file with its own name). It is strongly recommended
+   that you do not use SET FILE COLLISION RENAME if you ever intend to
+   use the recovery feature:
+
+     * When the file is first received by C-Kermit, its name is changed
+       if another file already has the same name. When you RESEND the
+       same file after a failure, C-Kermit will probably try to append
+       the re-sent portion to the wrong file.
+     * Assuming that you get RESEND to work with FILE COLLISION RENAME,
+       C-Kermit, when receiving the remainder of the file during a RESEND
+       operation, will report back the wrong name. Nothing can be done
+       about this because the name is reported back before the receiving
+       Kermit program finds out that it is a recovery operation.
+
+   Also watch out for DISABLE DELETE, since this implicitly sets FILE
+   COLLISION to RENAME. And note tht DELETE is DISABLEd automatically any
+   time you Kermit is in local mode (i.e. it makes a connection). Also
+   note that for purposes of DISABLE and ENABLE, "set host *" connections
+   do not count as local mode even though, strictly speaking, they are.
+
+  10.8. DOS Pathnames
+
+   When referring to foreign MS-DOS, Windows, Atari ST, OS/2, or other
+   file specifications that contain backslash characters in a C-Kermit
+   command, you might have to double each backslash, for example:
+
+  C-Kermit>get c:\\directory\\foo.txt
+
+   This is because backslash is used in C-Kermit commands for introducing
+   special character codes, variables, functions, etc.
+
+  10.9. Cancellation
+
+   If attempting to cancel local-mode file reception at a very early
+   stage (i.e. before data packets are exchanged) with X or Z does not
+   work, use E or Ctrl-C instead, or wait until the first data packets
+   are sent.
+
+   If you cancel a transfer that is underway using X or Z, and a lot of
+   window slots are in use, it might take a while for the cancellation to
+   take effect, especially if you do this on the receiving end; that's
+   because a lot of packets might already be on their way to you. In that
+   case, just be patient and let Kermit "drain" them.
+
+   If C-Kermit is sending a file, remote-mode packet-mode breakout (three
+   consecutive Ctrl-C's by default) is not effective until after C-Kermit
+   sends its first packet. If C-Kermit is receiving a file or is in
+   server mode, it is effective right away. In the former case, the SET
+   DELAY value determines the earliest time at which you can break out of
+   packet mode.
+
+  10.10. Partner Peculiarities
+
+   When one or both partners is on an SCO operating system such as OSR5,
+   you might issue the command:
+
+mapchan -n
+
+   to disable character-set conversion by the terminal driver. Similarly
+   for AIX:
+
+setmaps -t NOMAP
+
+   When using C-Kermit to transfer files with the HP48SX calculator, you
+   must SET FLOW NONE. The HP48SX does not support flow control, and
+   evidently also becomes confused if you attempt to use it. You might
+   also need to use SET SEND PAUSE 100 (or other number). For greater
+   detail about transferring files the the HP-48, see:
+
+  [75]http://www.columbia.edu/kermit/hp48.html
+
+   Some communication programs have errors in their implementation of
+   Kermit attribute packets. If you get an error message from your
+   communication program like "Attribute error", tell C-Kermit to SET
+   ATTRIBUTES OFF. Better yet, switch to a real Kermit program.
+
+   Some communication software claims to implement Kermit sliding
+   windows, but does so incorrectly. If sliding window transfers fail,
+   set C-Kermit's window size to the smallest one that works, for
+   example, SET WINDOW 1.
+
+   For lots more detail about how to cope with defective Kermit partners,
+   see:
+
+     * [76]Coping with Faulty Kermit Implementations (C-Kermit 7.0 and
+       later).
+     * [77]Coping with Broken Kermit Partners (C-Kermit 8.0 and later).
+
+   The UNIX version of C-Kermit discards carriage returns when receiving
+   files in text mode. Thus, "bare" carriage returns (sometimes used to
+   achieve overstriking) are lost.
+    ________________________________________________________________________
+
+  11. SCRIPT PROGRAMMING
+
+   [ [78]Top ] [ [79]Contents ] [ [80]Previous ]
+
+  11.1. Comments Versus the SCRIPT Command
+
+   Remember that ";" and "#" introduce comments when (a) they are the
+   first character on the line, or (b) they are preceded by at least one
+   blank or tab within a line. Thus constructions like:
+
+  INPUT 5 ;
+  SCRIPT ~0 #--#--#
+
+   must be coded using backslash notation to keep the data from being
+   ignored:
+
+  INPUT 5 \59                   ; 59 is the decimal ASCII code for ";"
+  SCRIPT ~0 \35--#--#           ; 43 is the decimal ASCII code for "#"
+
+   or, more simply:
+
+  INPUT 5 \;                    ; Just quote the semicolon
+  SCRIPT ~0 \#--#--#            ; Just quote the "#"
+    ________________________________________________________________________
+
+  11.2. Alphabetic Case and the INPUT Command
+
+   INPUT and MINPUT caseless string comparisons do not work for non-ASCII
+   (international) characters. Workaround: SET INPUT CASE OBSERVE. Even
+   then, the "lexically less than" and "lexically greater than"
+   operations (IF LLT, IF LGT) probably won't work as expected. The same
+   is true for the case-conversion functions \Flower() and \Fupper().
+   C-Kermit does not know the collating sequence for different character
+   sets and languages. (On the other hand, it might work depending on
+   such items as how Kermit was linked, whether your operating supports
+   "locales", etc)
+    ________________________________________________________________________
+
+  11.3. NUL (0) Characters in C-Kermit Commands
+
+   You can't include a NUL character (\0) in C-Kermit command text
+   without terminating the character string in which it appears. For
+   example:
+
+  echo In these brackets [\0] is a NUL
+
+   will echo "In these brackets [". This applies to ECHO, INPUT, OUTPUT,
+   and all other commands (but you can represent NUL by "\N" in an OUTPUT
+   string). This is because C-language strings are terminated internally
+   by the NUL character, and it allows all of C-Kermit's string
+   comparison and manipulation functions to work in the normal "C" way.
+
+   To illustrate:
+
+  INPUT 5 \0
+
+   is equivalent to:
+
+  INPUT 5
+
+   and:
+
+  INPUT 5 ABC\0DEF
+
+   is equivalent to:
+
+  INPUT 5 ABC
+
+   INPUT operations discard and ignore NUL characters that arrive from
+   the communication device, meaning that they do not figure into
+   matching operations (e.g. A<NUL>B matches AB); they are not deposited
+   in the INPUT buffer (\v(input)); and they are not counted in
+   \v(incount), with two exceptions:
+
+    1. An arriving NUL character restarts the INPUT SILENCE timer.
+    2. An arriving NUL character terminates the INPUT command with the
+       SUCCESS condition if the INPUT command was given an empty search
+       string. In this case \v(incount) is set to 1.
+
+   Also, the \v(inchar) variable is null (completely empty) if the last
+   INPUT character was NUL. That is, there is no way to tell only by
+   looking at \v(inchar) the difference between a NUL that was INPUT and
+   no INPUT at all. If the INPUT command succeeded but \v(inchar) is
+   empty, then a NUL character was input. Also, \v(incount) will be set
+   to 1.
+
+   Here's a sample script fragment to read characters, possibly including
+   NUL, from the communication connection and write them to a file:
+
+  while true {
+      input 1                      ; read one byte
+      if fail break                ; timed out or connection closed
+      fwrite /char \%c \v(inchar)  ; record the byte
+  }
+
+   This works because when \v(inchar) is NUL, that's equivalent to FWRITE
+   /CHAR having no text argument at all, in which case it writes a NUL
+   character.
+
+   \v(incount) and \v(inchar) are NOT affected by the CLEAR command.
+    ________________________________________________________________________
+
+  11.4. \ffiles() and \fnextfile() Peculiarities
+
+   The following script program:
+
+  for \%i 1 \ffiles(oofa.*) 1 {
+      send \fnextfile()
+  }
+
+   did not work as expected in C-Kermit 6.0 and earlier but does work in
+   C-Kermit 7.0 and later.
+    ________________________________________________________________________
+
+  11.5. Commands That Have Only Local Effect
+
+   Certain settings are local to each command level, meaning that
+   subordinate command levels (macros or command files) can change them
+   without affecting their values at higher command levels. When a new
+   command level is invoked, the value is inherited from the previous
+   level. These settings are:
+
+  CASE
+  COUNT and \v(count)
+  INPUT CASE
+  INPUT TIMEOUT
+  MACRO ERROR
+  QUIET
+  TAKE ERROR
+
+   This arrangement allows CASE, TIMEOUT, and ERROR settings, which are
+   used to control automatic exit from a command file or macro upon
+   error, to be automatically restored when the command file or macro
+   exits.
+
+   The COUNT variable follows this rule too, which permits nested SET
+   COUNT / IF COUNT loops, as in this example in which the inner loop
+   counts down from the current COUNT value of the outer loop (try it):
+
+  DEFINE INNER WHILE COUNT { WRITE SCREEN {   Inner:}, SHOW COUNT }
+  SET COUNT 5
+  WHILE COUNT { WRITE SCREEN Outer:, SHOW COUNT, DO INNER }
+
+   Keep in mind that an inferior command level cannot manipulate the
+   COUNT value held by a higher level. For example:
+
+  DEFINE OOFA SHOW COUNT, IF COUNT GOTO LOOP
+  SET COUNT 5
+  :LOOP
+  OOFA
+  ECHO Done
+
+   results in an infinite loop; the COUNT value remains at 5 because it
+   is never decremented at the same level at which it was set.
+    ________________________________________________________________________
+
+  11.6. Literal Braces in Function Calls
+
+   Since braces are used in function calls to indicate grouping, there is
+   no way to pass literal braces to the function itself. Solution: Define
+   a variable containing the string that has braces. Example:
+
+  define \%a ab{cd
+  echo \fsubstring(\%a)
+  ab{cd
+
+   If the string is to start with a leading brace and end with a closing
+   brace, then double braces must appear around the string (which itself
+   is enclosed in braces):
+
+  define \%a {{{foo}}}
+  echo \fsubstring(\%a)
+  {foo}
+
+   This also works for any other kind of string:
+
+  define \%a {{ab{cd}}
+  echo \fsubstring(\%a)
+  ab{cd
+    ________________________________________________________________________
+
+  11.7. Defining Variables on the C-Kermit Command Line
+
+   To define variables on the C-Kermit command line, use the -C
+   command-line option with one or more DEFINE or ASSIGN commands. Note
+   that the C-Kermit command line must cope with the quoting rules of
+   your shell. Examples:
+
+  kermit -C "define \\%a foo, define phonenumber 7654321"
+
+   In this case we follow UNIX quoting rules by doubling the backslash.
+   Once C-Kermit starts, the \%a and \m(phonenumber) variables are
+   defined as indicated and can be used in the normal way.
+
+   In DOS or Windows or OS/2 the command would be:
+
+  kermit -C "define \%%a foo, define phonenumber 7654321"
+
+   Here we need to double the percent sign rather than the backslash
+   because of DOS shell quoting rules.
+    ________________________________________________________________________
+
+  11.8. Per-Character Echo Check with the OUTPUT Command
+
+   Sometimes the OUTPUT command must be used to send commands or data to
+   a device in "echoplex" mode, meaning that characters must be sent one
+   at a time, and the next character can not be sent until the echo from
+   the previous one has been received. For example, a certain PBX might
+   have this characteristic. Let's say a Kermit script is used to program
+   the PBX. If characters are sent too fast, they can be lost. It would
+   seem that the command:
+
+  SET OUTPUT PACING milliseconds
+
+   could be used to take care of this, but the pacing interval is
+   constant and must be set large enough to allow even the slowest echo
+   to finish. If the script is large (an actual example is 14,000 lines
+   long), this can cause it to take hours longer than it needs to.
+
+   Here is a macro you can use to OUTPUT a string in an Echoplex
+   environment:
+
+  define XOUTPUT {
+      local \%c \%i
+      set output pacing 0
+      for \%i 1 \flen(\%*) 1 {
+          asg \%c \fsubstr(\%*,\%i,1)
+          output \%c
+          input 2 \%c
+      }
+  }
+
+   C-Kermit 7.0 or later is required.
+
+   It sends one character at a time and then waits up to 2 seconds for
+   the character to be echoed back, but continues to the next character
+   as soon as the echo appears, so no time is wasted. You can add an IF
+   FAIL clause after the INPUT in case you want to do something special
+   about failure to detect an echo within the timeout period. Obviously
+   you can also change the 2-second limit, and adjust the script in any
+   other desired way.
+    ________________________________________________________________________
+
+  11.9. Scripted File Transfer
+
+   Sometimes a user complains that when she makes a connection by hand,
+   logs in, and transfers a file, there are no problems, but when she
+   scripts the the exact same sequence, the file transfer always fails
+   after a few packets. Here's a scenario where this can happen:
+
+    1. Upon logging in to the remote computer, it sends a "What Are You?"
+       escape sequence.
+    2. When you log in interactively, your terminal emulator sends the
+       response. This is invisible to you; you don't know it's happening.
+    3. When you script the login, and begin a file transfer immediately
+       upon logging in, the host still sends the "What Are You?"
+       sequence. Kermit's INPUT ECHO setting is ON by default, so the
+       escape sequence passes through to the terminal, and the terminal
+       sends its response. But by this time Kermit has already started
+       the file transfer.
+    4. By default, the local Kermit program examines the keyboard for
+       interruption characters between every packet. The "What Are You"
+       response is sitting in the keyboard buffer. Eventually Kermit will
+       read a character such as "c" that is a valid interruption
+       character, and the file transfer stops with "User cancelled".
+
+   The right way to handle this situation is to have your look for the
+   "What Are You?" sequence and send the response itself, as described in
+   Using C-Kermit, pp.429-431. Or you can work around it by telling the
+   local Kermit to "set input echo off" and/or "set transfer interruption
+   off".
+    ________________________________________________________________________
+
+  11.10. Other...
+
+   Escape sequences (or any strings that contain control characters)
+   can't be used as labels, GOTO targets, or SWITCH cases.
+
+   [ [81]Top ] [ [82]Contents ] [ [83]C-Kermit Home ] [ [84]C-Kermit 8.0
+   Overview ] [ [85]Kermit Home ]
+     _________________________________________________________________
+
+   C-Kermit 8.0 Unix Hints and Tips / [86]The Kermit Project /
+   [87]Columbia University / [88]kermit@columbia.edu / 10 April 2004
+
+References
+
+   1. http://www.columbia.edu/kermit/
+   2. http://www.columbia.edu/
+   3. http://www.columbia.edu/kermit/ckcbwr.html
+   4. http://www.columbia.edu/kermit/ckubwr.html
+   5. http://www.columbia.edu/kermit/k95.html
+   6. http://www.columbia.edu/kermit/ckermit.html
+   7. http://www.columbia.edu/kermit/ckututor.html
+   8. http://www.columbia.edu/kermit/ckcbwr.html#x0
+   9. http://www.columbia.edu/kermit/ckcbwr.html#x1
+  10. http://www.columbia.edu/kermit/ckcbwr.html#x2
+  11. http://www.columbia.edu/kermit/ckcbwr.html#x3
+  12. http://www.columbia.edu/kermit/ckcbwr.html#x4
+  13. http://www.columbia.edu/kermit/ckcbwr.html#x5
+  14. http://www.columbia.edu/kermit/ckcbwr.html#x6
+  15. http://www.columbia.edu/kermit/ckcbwr.html#x7
+  16. http://www.columbia.edu/kermit/ckcbwr.html#x8
+  17. http://www.columbia.edu/kermit/ckcbwr.html#x9
+  18. http://www.columbia.edu/kermit/ckcbwr.html#x10
+  19. http://www.columbia.edu/kermit/ckcbwr.html#x11
+  20. http://www.columbia.edu/kermit/ckcbwr.html#top
+  21. http://www.columbia.edu/kermit/ckcbwr.html#contents
+  22. http://www.columbia.edu/kermit/ckcbwr.html#x2
+  23. http://www.columbia.edu/kermit/ckcbwr.html#top
+  24. http://www.columbia.edu/kermit/ckcbwr.html#contents
+  25. http://www.columbia.edu/kermit/ckcbwr.html#x2
+  26. http://www.columbia.edu/kermit/ck60manual.html
+  27. http://www.columbia.edu/kermit/ckermit2.html
+  28. http://www.columbia.edu/kermit/ck60manual.html
+  29. http://www.columbia.edu/kermit/ckermit80.html#x5
+  30. http://www.columbia.edu/kermit/ckermit80.html
+  31. http://www.columbia.edu/kermit/ckermit80.html#x2.2
+  32. http://www.columbia.edu/kermit/ckcbwr.html#top
+  33. http://www.columbia.edu/kermit/ckcbwr.html#contents
+  34. http://www.columbia.edu/kermit/ckcbwr.html#x3
+  35. http://www.columbia.edu/kermit/ckcbwr.html#x1
+  36. http://www.columbia.edu/kermit/ckcbwr.html#top
+  37. http://www.columbia.edu/kermit/ckcbwr.html#contents
+  38. http://www.columbia.edu/kermit/ckcbwr.html#x4
+  39. http://www.columbia.edu/kermit/ckcbwr.html#x2
+  40. http://www.columbia.edu/kermit/ckcbwr.html#top
+  41. http://www.columbia.edu/kermit/ckcbwr.html#contents
+  42. http://www.columbia.edu/kermit/ckcbwr.html#x5
+  43. http://www.columbia.edu/kermit/ckcbwr.html#x3
+  44. ftp://ftp.isi.edu/in-notes/rfc1122.txt
+  45. http://www.columbia.edu/kermit/ckcbwr.html#top
+  46. http://www.columbia.edu/kermit/ckcbwr.html#contents
+  47. http://www.columbia.edu/kermit/ckcbwr.html#x6
+  48. http://www.columbia.edu/kermit/ckcbwr.html#x4
+  49. http://www.columbia.edu/kermit/ckcbwr.html#top
+  50. http://www.columbia.edu/kermit/ckcbwr.html#contents
+  51. http://www.columbia.edu/kermit/ckcbwr.html#x7
+  52. http://www.columbia.edu/kermit/ckcbwr.html#x5
+  53. http://www.columbia.edu/kermit/ck60manual.html
+  54. http://www.columbia.edu/kermit/ckcbwr.html#x10
+  55. http://www.columbia.edu/kermit/ckcbwr.html#top
+  56. http://www.columbia.edu/kermit/ckcbwr.html#contents
+  57. http://www.columbia.edu/kermit/ckcbwr.html#x8
+  58. http://www.columbia.edu/kermit/ckcbwr.html#x6
+  59. ftp://ftp.isi.edu/in-notes/rfc2217.txt
+  60. http://www.columbia.edu/kermit/ckcbwr.html#top
+  61. http://www.columbia.edu/kermit/ckcbwr.html#contents
+  62. http://www.columbia.edu/kermit/ckcbwr.html#x9
+  63. http://www.columbia.edu/kermit/ckcbwr.html#x7
+  64. http://www.columbia.edu/kermit/ckcbwr.html#top
+  65. http://www.columbia.edu/kermit/ckcbwr.html#contents
+  66. http://www.columbia.edu/kermit/ckcbwr.html#x10
+  67. http://www.columbia.edu/kermit/ckcbwr.html#x8
+  68. http://www.columbia.edu/kermit/ckubwr.html
+  69. http://www.columbia.edu/kermit/ckcbwr.html#top
+  70. http://www.columbia.edu/kermit/ckcbwr.html#contents
+  71. http://www.columbia.edu/kermit/ckcbwr.html#x11
+  72. http://www.columbia.edu/kermit/ckcbwr.html#x9
+  73. http://www.columbia.edu/kermit/ck60manual.html
+  74. http://www.columbia.edu/kermit/ckermi70.htm
+  75. http://www.columbia.edu/kermit/hp48.html
+  76. http://www.columbia.edu/kermit/ckermit70.html#x4.22
+  77. http://www.columbia.edu/kermit/ckermit80.html#x15
+  78. http://www.columbia.edu/kermit/ckcbwr.html#top
+  79. http://www.columbia.edu/kermit/ckcbwr.html#contents
+  80. http://www.columbia.edu/kermit/ckcbwr.html#x10
+  81. http://www.columbia.edu/kermit/ckcbwr.html#top
+  82. http://www.columbia.edu/kermit/ckcbwr.html#contents
+  83. http://www.columbia.edu/kermit/ckermit.html
+  84. http://www.columbia.edu/kermit/ck80.html
+  85. http://www.columbia.edu/kermit/index.html
+  86. http://www.columbia.edu/kermit/index.html
+  87. http://www.columbia.edu/
+  88. mailto:kermit@columbia.edu
diff --git a/ckccfg.txt b/ckccfg.txt
new file mode 100644 (file)
index 0000000..5870974
--- /dev/null
@@ -0,0 +1,1766 @@
+
+                        C-Kermit Configuration Options
+
+     Frank da Cruz
+     [1]The Kermit Project
+     [2]Columbia University
+
+   As of: C-Kermit 8.0.211, 10 April 2004
+   This page last updated: Sun Apr 11 16:45:55 2004 (New York USA Time)
+
+     IF YOU ARE READING A PLAIN-TEXT version of this document, note that
+     this file is a plain-text dump of a Web page. You can visit the
+     original (and possibly more up-to-date) Web page here:
+
+  [3]http://www.columbia.edu/kermit/ckccfg.html
+
+   [ [4]C-Kermit Home ] [ [5]Kermit Home ]
+    ________________________________________________________________________
+
+  CONTENTS
+
+  1. [6]FILE TRANSFER
+  2. [7]SERIAL COMMUNICATION SPEEDS
+  3. [8]FULLSCREEN FILE TRANSFER DISPLAY
+  4. [9]CHARACTER SETS
+  5. [10]APC EXECUTION
+  6. [11]PROGRAM SIZE
+  7. [12]MODEM DIALING
+  8. [13]NETWORK SUPPORT
+  9. [14]EXCEPTION HANDLING
+ 10. [15]SECURITY FEATURES
+ 11. [16]ENABLING SELECT()
+ 12. [17]I/O REDIRECTION
+ 13. [18]FLOATING-POINT NUMBERS, TIMERS, AND ARITHMETIC
+ 14. [19]SPECIAL CONFIGURATIONS
+  I. [20]SUMMARY OF COMPILE-TIME OPTIONS
+    ________________________________________________________________________
+
+  OVERVIEW
+
+   This document describes configuration options for C-Kermit (5A and
+   later). The major topics covered include program size (and how to
+   reduce it), how to include or exclude particular features, notes on
+   serial-port, modem, and network support, and a list of C-Kermit's
+   compile-time options.
+
+   For details about your particular operating system, also see the
+   system-specific installation instructions file, such as the
+   [21]C-Kermit Installation Instructions for Unix.
+
+   [ [22]C-Kermit Home ] [ [23]Kermit Home ]
+    ________________________________________________________________________
+
+  1. FILE TRANSFER
+
+   [ [24]Top ] [ [25]Contents ] [ [26]Next ] [ [27]Previous ]
+
+   Prior to version 7.0, C-Kermit was always built with the most
+   conservative Kermit file-transfer protocol defaults on every platform:
+   no control-character prefixing, 94-byte packets, and a window size of
+   1.
+
+   Starting in version 7.0, fast settings are the default. To override
+   these at compile time, include:
+
+  -DNOFAST
+
+   in the C compiler CFLAGS. Even with the fast defaults, C-Kermit
+   automatically drops down to whatever window and packet sizes requested
+   by the other Kermit, if these are smaller, when sending files (except
+   for control-character unprefixing, which is not negotiated, and which
+   is now set to CAUTIOUS rather than NONE at startup). C-Kermit's
+   settings prevail when it is receiving.
+
+   [ [28]C-Kermit Home ] [ [29]Kermit Home ]
+    ________________________________________________________________________
+
+  2. SERIAL COMMUNICATION SPEEDS
+
+   [ [30]Top ] [ [31]Contents ] [ [32]Next ] [ [33]Previous ]
+
+   As of 6 September 1997, a new simplified mechanism for obtaining the
+   list of legal serial interface speeds is in place:
+
+     * If the symbol TTSPDLIST is defined, the system-dependent routine
+       ttspdlist() is called at program initialization to obtain the
+       list.
+     * This symbol should be defined only for C-Kermit implementations
+       that have implemented the ttspdlist() function, typically in the
+       ck?tio.c module. See [34]ckutio.c for an example.
+     * TTSPDLIST is automatically defined in [35]ckcdeb.h for UNIX. Add
+       the appropriate #ifdefs for other platforms when the corresponding
+       ttspdlist() functions are filled in.
+     * If TTSPDLIST is (or normally would be) defined, the old code
+       (described below) can still be selected by defining NOTTSPDLIST.
+
+   The ttspdlist() function can obtain the speeds in any way that works.
+   For example, based simply on #ifdef Bnnnn..#endif (in UNIX). Although
+   it might be better to actually check each speed against the currently
+   selected hardware interface before allowing it in the array, there is
+   usually no passive and/or reliable and safe way to do this, and so
+   it's better to let some speeds into the array that might not work,
+   than it is to erroneously exclude others. Speeds that don't work are
+   caught when the SET SPEED command is actually given.
+
+   Note that this scheme does not necessarily rule out split speed
+   operation, but effectively it does in C-Kermit as presently
+   constituted since there are no commands to set input and output speed
+   separately (except the special case "set speed 75/1200").
+
+   Note that some platforms, notably AIX 4.2 and 4.3, implement high
+   serial speeds transparently to the application, e.g. by mapping 50 bps
+   to 57600 bps, and so on.
+
+   That's the whole deal. When TTSPDLIST is not defined, the following
+   applies:
+
+   Speeds are defined in two places: the SET SPEED keyword list in the
+   command parser (as of this writing, in the [36]ckuus3.c source file),
+   and in the system- dependent communications i/o module, ck?tio.c,
+   functions ttsspd() (set speed) and ttgspd() (get speed). The following
+   speeds are assumed to be available in all versions:
+
+  0, 110, 300, 600, 1200, 2400, 4800, 9600
+
+   If one or more of these speeds is not supported by your system, you'll
+   need to change the source code (this has never happened so far). Other
+   speeds that are not common to all systems have Kermit-specific
+   symbols:
+
+               Symbol       Symbol
+  Speed (bps)  to enable    to disable
+       50       BPS_50       NOB_50
+       75       BPS_75       NOB_75
+       75/1200  BPS_7512     NOB_7512
+      134.5     BPS_134      NOB_134
+      150       BPS_150      NOB_150
+      200       BPS_200      NOB_200
+     1800       BPS_1800     NOB_1800
+     3600       BPS_3600     NOB_3600
+     7200       BPS_7200     NOB_7200
+    14400       BPS_14K      NOB_14K
+    19200       BPS_19K      NOB_19K
+    28800       BPS_28K      NOB_28K
+    38400       BPS_38K      NOB_38K
+    57600       BPS_57K      NOB_57K
+    76800       BPS_76K      NOB_76K
+   115200       BPS_115K     NOB_155K
+   230400       BPS_230K     NOB_230K
+   460800       BPS_460K     NOB_460K
+   921600       BPS_921K     NOB_921K
+
+   The [37]ckcdeb.h header file contains default speed configurations for
+   the many systems that C-Kermit supports. You can override these
+   defaults by (a) editing ckcdeb.h, or (b) defining the appropriate
+   enabling and/or disabling symbols on the CC command line, for example:
+
+  -DBPS_14400 -DNOB_115200
+
+   or the "make" command line, e.g.:
+
+  make blah "KFLAGS=-DBPS_14400 -DNOB_115200"
+
+   Note: some speeds have no symbols defined for them, because they have
+   never been needed: 12.5bps, 45.5bps, 20000bps, etc. These can easily
+   be added if required (but they will work only if the OS supports
+   them).
+
+   IMPORTANT: Adding one of these flags at compile time does not
+   necessarily mean that you will be able to use that speed. A particular
+   speed is usable only if your underlying operating system supports it.
+   In particular, it needs to be defined in the appropriate system header
+   file (e.g. in UNIX, cd to /usr/include and grep for B9600 in *.h and
+   sys/*.h to find the header file that contains the definitions for the
+   supported speeds), and supported by the serial device driver, and of
+   course by the physical device itself.
+
+   ALSO IMPORTANT: The list of available speeds is independent of how
+   they are set. The many UNIXes, for example, offer a wide variety of
+   APIs that are BSD-based, SYSV-based, POSIX-based, and purely made up.
+   See the ttsspd(), ttgspd(), and ttspdlist() routines in [38]ckutio.c
+   for illustrations.
+
+   The latest entries in this horserace are the tcgetspeed() and
+   ttsetspeed() routines found in UnixWare 7. Unlike other methods, they
+   accept the entire range of integers (longs really) as speed values,
+   rather than certain codes, and return an error if the number is not,
+   in fact, a legal speed for the device/driver in question. In this
+   case, there is no way to build a list of legal speeds at compile time,
+   since no Bnnnn symbols are defined (except for "depracated, legacy"
+   interfaces like ioctl()) and so the legal speed list must be
+   enumerated in the code -- see ttspdlist() in [39]ckutio.c.
+
+   [ [40]C-Kermit Home ] [ [41]Kermit Home ]
+    ________________________________________________________________________
+
+  3. FULLSCREEN FILE TRANSFER DISPLAY
+
+   [ [42]Top ] [ [43]Contents ] [ [44]Next ] [ [45]Previous ]
+
+   New to edit 180 is support for an MS-DOS-Kermit-like local-mode full
+   screen file transfer display, accomplished using the curses library,
+   or something equivalent (for example, the Screen Manager on DEC VMS).
+   To enable this feature, include the following in your CFLAGS:
+
+  -DCK_CURSES
+
+   and then change your build procedure (if necessary) to include the
+   necessary libraries. For example, in Unix these are usually "curses"
+   or "ncurses" (and more recenlty, "ncursesw" and "slang"), perhaps also
+   "termcap", "termlib", or "tinfo":
+
+  "LIBS= -lcurses -ltermcap"
+  "LIBS= -lcurses -ltermlib"
+  "LIBS= -lncurses"
+  "LIBS= -ltermlib"
+  "LIBS= -ltinfo"
+
+   "man curses" for further information, and search through the Unix
+   [46]makefile for "CK_CURSES" to see many examples, and also see the
+   relevant sections of the [47]Unix C-Kermit Installation Instructions,
+   particularly Sections [48]4 and [49]9.2.
+
+   There might still be a complication. Some implementations of curses
+   reserve the right to alter the buffering on the output file without
+   restoring it afterwards, which can leave Kermit's command processing
+   in a mess when the prompt comes back after a fullscreen file transfer
+   display. The typical symptom is that characters you type at the prompt
+   after a local-mode file transfer (i.e. after seeing the curses
+   file-transfer display) do not echo until you press the Return (Enter)
+   key. If this happens to you, try adding
+
+  -DCK_NEWTERM
+
+   to your makefile target (see comments in screenc() in [50]ckuusx.c for
+   an explanation).
+
+   If that doesn't fix the problem, then use a bigger hammer and replace
+   -DCK_NEWTERM with:
+
+  -DNONOSETBUF
+
+   which tells Kermit to force stdout to be unbuffered so CBREAK mode can
+   work.
+
+   In SCO Xenix and SCO UNIX, there are two separate curses libraries,
+   one based on termcap and the other based on terminfo. The default
+   library, usually terminfo, is established when the development system
+   is installed. To manually select terminfo (at compile time):
+
+  compile -DM_TERMINFO and link -ltinfo
+
+   and to manually select termcap:
+
+  compile -DM_TERMCAP and link -ltcap -ltermlib
+
+   <curses.h> looks at M_TERMINFO and M_TERMCAP to decide which header
+   files to use. /usr/lib/libcurses.a is a link to either libtinfo.a or
+   libtcap.a. The C-Kermit compilation options must agree with the
+   version of the curses library that is actually installed.
+
+   NOTE: If you are doing an ANSI-C compilation and you get compile time
+   warnings like the following:
+
+  Warning: function not declared in ckuusx.c: wmove, printw, wclrtoeol,
+  wclear, wrefresh, endwin, etc...
+
+   it means that your <curses.h> file does not contain prototypes for
+   these functions. The warnings should be harmless.
+
+   New to edit 190 is the ability to refresh a messed-up full-screen
+   display, e.g. after receiving a broadcast message. This depends on the
+   curses package including the wrefresh() and clearok() functions and
+   the curscr variable. If your version has these, or has code to
+   simulate them, then add:
+
+  -DCK_WREFRESH
+
+   The curses and termcap libraries add considerable size to the program
+   image (e.g. about 20K on a SUN-4, 40K on a 386). On some small
+   systems, such as the AT&T 6300 PLUS, curses can push Kermit over the
+   edge... even though it compiles, loads, and runs correctly, its
+   increased size apparently makes it swap constantly, slowing it down to
+   a crawl, even when the curses display is not in use. Some new makefile
+   targets have been added to take care of this (e.g. sys3upcshcc), but
+   similar tricks might be necessary in other cases too.
+
+   On the curses file-transfer display, just below the "thermometer", is
+   a running display of the transfer rate, as a flat quotient of file
+   characters per elapsed seconds so far. You can change this to an
+   average that gives greater weight to recent history (0.25 *
+   instantaneous cps + 0.75 * historical cps) by adding -DCPS_WEIGHTED to
+   your CFLAGS (sorry folks, this one is not worth a SET command). You
+   can choose a second type of weighted average in which the weighting
+   smooths out progressively as the transfer progresses by adding
+   -DCPS_VINCE to -DCPS_WEIGHTED.
+
+   An alternative to curses is also available at compile time, but should
+   be selected if your version of Kermit is to be run in local mode only
+   in an ANSI terminal environment, for example on a desktop workstation
+   that has an ANSI console driver. To select this option in place of
+   curses, define the symbol MYCURSES:
+
+  -DMYCURSES
+
+   instead of CK_CURSES. The MYCURSES option uses built-in ANSI (VT100)
+   escape sequences, and depends upon your terminal or console driver to
+   interpret them correctly.
+
+   In some C-Kermit builds, we replace printf() via #define printf...
+   However, this can cause conflicts with the [n]curses header files.
+   Various hacks are required to get around this -- see [51]ckutio.c,
+   [52]ckufio.c, [53]ckuusx.c, [54]ckucmd.c, etc.
+
+   [ [55]C-Kermit Home ] [ [56]Kermit Home ]
+    ________________________________________________________________________
+
+  4. CHARACTER SETS
+
+   [ [57]Top ] [ [58]Contents ] [ [59]Next ] [ [60]Previous ]
+
+   Since version 5A, C-Kermit has included support for conversion of
+   character sets for Western European languages (i.e. languages that
+   originated in Western Europe, but are now also spoken in the Western
+   Hemisphere and other parts of the world), via ISO 8859-1 Latin
+   Alphabet 1, for Eastern European languages (ISO Latin-2), Hebrew (and
+   Yiddish), Greek, and Cyrillic-alphabet languages (ISO Latin/Cyrillic).
+   Many file (local) character sets are supported: ISO 646 7-bit national
+   sets, IBM code pages, Apple, DEC, DG, NeXT, etc.
+
+   To build Kermit with no character-set translation at all, include
+   -DNOCSETS in the CFLAGS. To build with no Latin-2, add -DNOLATIN2. To
+   build with no Cyrillic, add -DNOCYRIL. To omit Hebrew, add -DNOHEBREW.
+   If -DNOCSETS is *not* included, you'll always get LATIN1. To build
+   with no KANJI include -DNOKANJI. There is presently no way to include
+   Latin-2, Cyrillic, Hebrew, or Kanji without also including Latin-1.
+
+   [61]Unicode support was added in C-Kermit 7.0, and it adds a fair
+   amount of tables and code (and this is only a "Level 1" implementation
+   -- a higher level would also require building in the entire Unicode
+   database). On a PC with RH 5.2 Linux, building C-Kermit 7.0, we get
+   the following sizes:
+
+  NOCSETS NOUNICODE NOKANJI   Before    After                  
+   [   ]    [   ]    [   ]    1329014   (Full)
+   [   ]    [   ]    [ X ]    1325686   (Unicode but no Kanji)
+   [   ]    [ X ]    [   ]    1158837   (All charsets except Unicode)
+   [ X ]    [ x ]    [ x ]    1090845   (NOCSETS implies the other two)
+
+   Note, by the way, that NOKANJI without NOUNICODE only removes the
+   non-Unicode Kanji sets (Shift-JIS, EUC-JP, JIS-7, etc). Kanji is still
+   representable in UCS-2 and UTF-8.
+
+   [ [62]C-Kermit Home ] [ [63]Kermit Home ]
+    ________________________________________________________________________
+
+  5. APC EXECUTION
+
+   [ [64]Top ] [ [65]Contents ] [ [66]Next ] [ [67]Previous ]
+
+   The Kermit CONNECT and INPUT commands are coded to execute Application
+   Program Command escape sequences from the host:
+
+  <ESC>_<text><ESC>\
+
+   where <text> is a C-Kermit command, or a list of C-Kermit commands
+   separated by commas, up to about 1K in length.
+
+   To date, this feature has been included in the OS/2, Windows, VMS,
+   OS-9, and Unix versions, for which the symbol:
+
+  CK_APC
+
+   is defined automatically in [68]ckuusr.h. For OS/2, APC is enabled at
+   runtime by default, for UNIX it is disabled. It is controlled by the
+   SET TERMINAL APC command. Configuring APC capability into a version
+   that gets it by default (because CK_APC is defined in [69]ckuusr.h)
+   can be overridden by including:
+
+  -DNOAPC
+
+   on the CC command line.
+
+   C-Kermit's autodownload feature depends on the APC feature, so
+   deconfiguring APC also disables autodownload (it doesn't use APC
+   escape sequences, but uses the APC switching mechanism internally).
+
+   [ [70]C-Kermit Home ] [ [71]Kermit Home ]
+    ________________________________________________________________________
+
+  6. PROGRAM SIZE
+
+   [ [72]Top ] [ [73]Contents ] [ [74]Next ] [ [75]Previous ]
+
+   SECTION CONTENTS
+
+  6.1. [76]Feature Selection
+  6.2. [77]Changing Buffer Sizes
+  6.3. [78]Other Size-Related Items
+  6.4. [79]Space/Time Tradeoffs
+
+   (Also see [80]Section 4)
+
+   Each release of C-Kermit is larger than the last. On some computers
+   (usually old ones) the size of the program prevents it from being
+   successfully linked and loaded. On some others (also usually old
+   ones), it occupies so much memory that it is constantly swapping or
+   paging. In such cases, you can reduce C-Kermit's size in various ways,
+   outlined in this section. The following options can cut down on the
+   program's size at compile time by removing features or changing the
+   size of storage areas.
+
+   If you are reading this section because all you want is a small, fast,
+   quick-to-load Kermit file-transfer application for the remote end of
+   your connection, and the remote end is Unix based, take a look at
+   G-Kermit:
+
+  [81]http://www.columbia.edu/kermit/gkermit.html
+
+  6.1. Feature Selection
+
+   Features can be added or removed by defining symbols on the CC (C
+   compiler) command line. "-D" is the normal CC directive to define a
+   symbol so, for example, "-DNODEBUG" defines the symbol NODEBUG. Some C
+   compilers might use different syntax, e.g. "-d NODEBUG" or
+   "/DEFINE=NODEBUG". For C compilers that do not accept command-line
+   definitions, you can put the corresponding #define statements in the
+   file ckcsym.h, for example:
+
+  #define NODEBUG
+
+   The following table shows the savings achieved when building C-Kermit
+   8.0 (Beta.04) with selected feature-deselection switches on an
+   Intel-based PC with Red Hat Linux 7.0 and gcc 2.96. The sizes are for
+   non-security builds. The fully configured non-security build is
+   2127408 bytes.
+
+  Option      Size    Savings Effect
+  NOICP        545330   74.4% No Interactive Command Parser (command-line only)
+  NOLOCAL     1539994   27.6% No making connections.
+  NOXFER      1551108   27.1% No file transfer.
+  IKSDONLY    1566608   26.4% Internet Kermit Server only.
+  NOCSETS     1750097   17.7% No character-set conversion.
+  NOSPL       1800293   15.4% No Script Programming Language.
+  NONET       1808575   15.0% No making network connections.
+  NOUNICODE   1834426   13.8% No Unicode character-set conversion.
+  NOHELP      1837877   13.6% No built-in help text.
+  NODEBUG     1891669   11.1% No debug log.
+  NOFRILLS    1918966    9.8% No "frills".
+  NOFTP       1972496    7.3% No FTP client.
+  NODIAL      1984488    6.7% No automatic modem dialing.
+  NOPUSH      2070184    2.7% No shell access, running external programs, etc.
+  NOIKSD      2074129    2.5% No Internet Kermit Server capability.
+  NOHTTP      2082610    2.1% No HTTP client.
+  NOFLOAT     2091332    1.7% No floating-point arithmetic.
+  NOCHANNELIO 2095978    1.5% No FOPEN/FREAD/FWRITE/FCLOSE, etc.
+  MINIDIAL    2098035    1.4% No built-in support for many kinds of modems.
+  NOSERVER    2098987    1.3% No server mode.
+  NOSEXP      2105898    1.0% No S-Expressions.
+  NOPTY       2117743    0.5% No pseudoterminal support.
+  NORLOGIN    2121089    0.3% No RLOGIN connections.
+  NOOLDMODEMS 2124038    0.2% No built-in support for old kinds of modems.
+  NOSSH       2125696    0.1% No SSH command.
+
+   And here are a few combinations
+
+   Options Size Savings Effect
+   NODEBUG NOICP NOCSETS NOLOCAL 281641 86.7% No debug log, parser,
+   character sets, or making connections.
+   NOICP NOCSETS NOLOCAL 376468 82.3% No parser, character sets, or
+   making connections.
+   NOICP NOCSETS NONET 427510 79.9% No parser, character sets, or network
+   connections.
+   NOSPL NOCSETS 1423784 33.1% No script language, or character sets.
+
+   -DNOFRILLS removes various command synonyms; the following top-level
+   commands: CLEAR, DELETE, DISABLE, ENABLE, GETOK, MAIL, RENAME, TYPE,
+   WHO; and the following REMOTE commands: KERMIT, LOGIN, LOGOUT, PRINT,
+   TYPE, WHO.
+
+  6.2. Changing Buffer Sizes
+
+   Most modern computers have so much memory that (a) there is no need to
+   scrimp and save, and (b) C-Kermit, even when fully configured, is
+   relatively small by today's standards.
+
+   Two major factors affect Kermit's size: feature selection and buffer
+   sizes. Buffer sizes affect such things as the maximum length for a
+   Kermit packet, the maximum length for a command, for a macro, for the
+   name of a macro, etc. Big buffer sizes are used when the following
+   symbol is defined:
+
+  BIGBUFOK
+
+   as it is by default for most modern platforms (Linux, AIX 4 and 5,
+   HP-UX 10 and 11, Solaris, etc) in [82]ckuusr.h. If your build does not
+   get big buffers automatically (SHOW FEATURES tells you), you can
+   include them by rebuilding with BIGBUFOK defined; e.g. in Unix:
+
+  make xxxx KFLAGS=-DBIGBUFOK
+
+   where xxxx is the makefile target. On the other hand, if you want to
+   build without big buffers when they normally would be selected, use:
+
+  make xxxx KFLAGS=-DNOBIGBUF
+
+   There are options to control Kermit's packet buffer allocations. The
+   following symbols are defined in [83]ckcker.h in such a way that you
+   can override them by redefining them in CFLAGS:
+
+  -DMAXSP=xxxx - Maximum send-packet length.
+  -DMAXRP=xxxx - Maximum receive-packet length.
+  -DSBSIZ=xxxx - Total allocation for send-packet buffers.
+  -DRBSIZ=xxxx - Total allocation for receive-packet buffers.
+
+   The defaults depend on the platform.
+
+   Using dynamic allocation (-DDYNAMIC) reduces storage requirements for
+   the executable program on disk, and allows more and bigger packets at
+   runtime. This has proven safe over the years, and now most builds
+   (e.g. all Unix, VMS, Windows, and OS/2 ones) use dynamic memory
+   allocation by default. If it causes trouble, however, then omit the
+   -DDYNAMIC option from CFLAGS, or add -DNODYNAMIC.
+
+  6.3. Other Size-Related Items
+
+   To make Kermit compile and load successfully, you might have to change
+   your build procedure to:
+
+    a. Request a larger ("large" or "huge") compilation / code-generation
+       model. This is needed for 16-bit PC-based UNIX versions (most or
+       all of which fail to build C-Kermit 7.0 and later anyway). This is
+       typically done with a -M and/or -F switch (see your cc manual or
+       man page for details).
+    b. Some development systems support overlays. If the program is too
+       big to be built as is, check your loader manual ("man ld") to see
+       if an overlay feature is available. See the 2.10/2.11 BSD example
+       in the UNIX makefile. (Actually, as of version 7.0, C-Kermit is
+       too big to build, period, even with overlays, on 2.xx BSD).
+    c. Similarly, some small and/or segment-based architectures support
+       "code mapping", which is similar to overlays (PDP11-based VENIX
+       1.0, circa 1984, was an example). See the linker documentation on
+       the affected platform.
+
+   It is also possible to reduce the size of the executable program file
+   in several other ways:
+
+    a. Include the -O (optimize) compiler switch if it isn't already
+       included in your "make" entry (and if it works!). If your compiler
+       supports higher levels of optimization (e.g. -O2 or higher number,
+       -Onolimit (HP-UX), etc), try them; the greater the level of
+       optimization, the longer the compilation and more likely the
+       compiler will run out of memory. The the latter eventuality, some
+       compilers also provide command-line options to allocate more
+       memory for the optimizer, like "-Olimit number" in Ultrix.
+    b. If your platofrm supports shared libraries, change the make entry
+       to take advantage of this feature. The way to do this is, of
+       course, platform dependent; see the NeXT makefile target for an
+       example. some platforms (like Solaris) do it automatically and
+       give you no choice. But watch out: executables linked with shared
+       libraries are less portable than statically linked executables.
+    c. Strip the program image after building ("man strip" for further
+       info), or add -s to the LNKFLAGS (UNIX only). This strips the
+       program of its symbol table and relocation information.
+    d. Move character strings into a separate file. See the 2.11 BSD
+       target for an example.
+
+  6.4. Space/Time Tradeoffs
+
+   There are more than 6000 debug() statements in the program. If you
+   want to save both space (program size) and time (program execution
+   time), include -DNODEBUG in the compilation. If you want to include
+   debugging for tracking down problems, omit -DNODEBUG from the make
+   entry. But when you include debugging, you have two choices for how
+   it's done. One definition defines debug() to be a function call; this
+   is cheap in space but expensive in execution. The other defines debug
+   as "if (deblog)" and then the function call, to omit the function call
+   overhead when the debug log is not active. But this adds a lot of
+   space to the program. Both methods work, take your choice; IFDEBUG is
+   preferred if memory is not a constraint but the computer is likely to
+   be slow. The first method is the default, i.e. if nothing is done to
+   the CFLAGS or in [84]ckcdeb.h (but in some cases, e.g. VMS, it is). To
+   select the second method, include -DIFDEBUG in the compilation (and
+   don't include -DNODEBUG).
+
+   [ [85]C-Kermit Home ] [ [86]Kermit Home ]
+    ________________________________________________________________________
+
+  7. MODEM DIALING
+
+   [ [87]Top ] [ [88]Contents ] [ [89]Next ] [ [90]Previous ]
+
+   -DNODIAL removes automatic modem dialing completely, including the
+   entire [91]ckudia.c module, plus all commands that refer to dialing in
+   the various ckuus*.c modules.
+
+   -DMINIDIAL leaves the DIAL and related commands (SET/SHOW MODEM,
+   SET/SHOW DIAL) intact, but removes support for all types of modems
+   except CCITT, Hayes, Unknown, User-defined, Generic-high-speed, and
+   None (= Direct). The MINIDIAL option cuts the size of the dial module
+   approximately in half. Use this option if you have only Hayes or CCITT
+   modems and don't want to carry the baggage for the other types.
+
+   A compromise between full dialer support and MINIDIAL is obtained by
+   removing support for "old" modems -- all the strange non-Hayes
+   compatible 1200 and 2400 bps modems that C-Kermit has been carrying
+   around since 1985 or so. To remove support for these modems, add
+   -DNOOLDMODEMS to CFLAGS at compilation time.
+
+   Finally, if you keep support for old modems, you will notice that
+   their names appear on the "set modem ?" menu. That's because their
+   names are, by default, "visible". But the list is confusing to the
+   younger generation, who have only heard of modems from the
+   V.32bis-and-later era. If you want to be able to use old modems, but
+   don't want their names cluttering up menus, add this to CFLAGS:
+
+  -DM_OLD=1
+
+   [ [92]C-Kermit Home ] [ [93]Kermit Home ]
+    ________________________________________________________________________
+
+  8. NETWORK SUPPORT
+
+   [ [94]Top ] [ [95]Contents ] [ [96]Next ] [ [97]Previous ]
+
+   SECTION CONTENTS
+
+  8.1. [98]TCP/IP
+  8.2. [99]X.25
+  8.3. [100]Other Networks
+
+   C-Kermit supports not only serial-port and modem connections, but also
+   TCP/IP and X.25 network connections. Some versions support other
+   network types too like DECnet, LAT, NETBIOS, etc. If you define the
+   following symbol:
+
+  NONET
+
+   then all network support is compiled away.
+
+  8.1. TCP/IP
+
+   SUBSECTION CONTENTS
+
+  8.1.1. [101]Firewalls
+  8.1.2. [102]Compilation and Linking Problems
+  8.1.3. [103]Enabling Host Address Lists
+  8.1.4. [104]Enabling Telnet NAWS
+  8.1.5. [105]Enabling Incoming TCP/IP Connections
+  8.1.6. [106]Disabling SET TCP Options
+
+   C-Kermit's TCP/IP features require the Berkeley sockets library or
+   equivalent, generally available on any Unix system, as well as in
+   Windows 9x/NT, OS/2, VMS, AOS/VS, VOS, etc. The TCP/IP support
+   includes built-in TELNET, FTP, and HTTP protocol. To select TCP/IP
+   support, include -DTCPSOCKET in your makefile target's CFLAGS, or (in
+   VMS) the appropriate variant (e.g. -DWOLLONGONG, -DMULTINET,
+   -DEXCELAN, -DWINTCP, etc).
+
+   The VMS and/or early Unix third-party TCP/IP products are often
+   incompatible with each other, and sometimes with different versions of
+   themselves. For example, Wollongong reportedly put header files in
+   different directories for different UNIX versions:
+
+     * in.h can be in either /usr/include/sys or /user/include/netinet.
+     * telnet.h can be in either /usr/include/arpa or
+       /user/include/netinet.
+     * inet.h can be in either /usr/include/arpa or /user/include/sys.
+
+   In cases like this, use the -I cc command-line option when possible;
+   otherwise it's better to make links in the file system than it is to
+   hack up the C-Kermit source code. Suppose, for example, Kermit is
+   looking for telnet.h in /usr/include/arpa, but on your computer it is
+   in /usr/include/netinet. Do this (as root, or get the system
+   administrator to do it):
+
+  cd /usr/include/arpa
+  ln /usr/include/netinet/telnet.h telnet.h
+
+   ("man ln" for details about links.)
+
+   The network support for TCP/IP and X.25 is in the source files
+   [107]ckcnet.h, [108]ckctel.c, [109]ckctel.c, [110]ckctel.h,
+   [111]ckcftp.c, with miscellaneous SHOW commands, etc, in the various
+   ckuus*.c modules, plus code in the ck*con.c or ckucns.c (CONNECT
+   command) and several other modules to detect TELNET negotiations, etc.
+
+   Within the TCPSOCKET code, some socket-level controls are included if
+   TCPSOCKET is defined in the C-Kermit CFLAGS and SOL_SOCKET is defined
+   in in the system's TCP-related header files, such as <sys/socket.h>.
+   These are:
+
+  SET TCP KEEPALIVE
+  SET TCP LINGER
+  SET TCP RECVBUF
+  SET TCP SENDBUF
+
+   In addition, if TCP_NODELAY is defined, the following command is also
+   enabled:
+
+  SET TCP NODELAY (Nagle algorithm)
+
+   See the [112]C-Kermit user documentation for descriptions of these
+   commands.
+
+  8.1.1. Firewalls
+
+   There exist various types of firewalls, set up to separate users of an
+   internal TCP/IP network ("Intranet") from the great wide Internet, but
+   then to let selected users or services get through after all.
+
+   One firewall method is called SOCKS, in which a proxy server allows
+   users inside a firewall to access the outside world, based on a
+   permission list generally stored in a file. SOCKS is enabled in one of
+   two ways. First, the standard sockets library is modified to handle
+   the firewall, and then all the client applications are relinked (if
+   necessary, i.e. if the libraries are not dynamically loaded) with the
+   modified sockets library. The APIs are all the same, so the
+   applications do not need to be recoded or recompiled.
+
+   In the other method, the applications must be modified to call
+   replacement routines, such as Raccept() instead of accept(), Rbind()
+   instead of bind(), etc, and then linked with a separate SOCKS library.
+   This second method is accomplished (for SOCKS4) in C-Kermit by
+   including -DCK_SOCKS in your CFLAGS, and also adding:
+
+  -lsocks
+
+   to LIBS, or replacing -lsockets with -lsocks (depending on whether the
+   socks library also includes all the sockets entry points).
+
+   For SOCKS5, use -DCK_SOCKS5.
+
+   Explicit firewall support can, in general, not be a standard feature
+   or a feature that is selected at runtime, because the SOCKS library
+   tends to be different at each site -- local modifications abound.
+
+   The ideal situation occurs when firewalls are supported by the first
+   method, using dynamically linked sockets-replacement libraries; in
+   this case, all your TCP/IP client applications negotiate the firewall
+   transparently.
+
+  8.1.2. Compilation and Linking Problems
+
+   If you get a compilation error in [113]ckcnet.c, with a complaint like
+   "incompatible types in assignment", it probably has something to do
+   with the data type your system uses for the inet_addr() function,
+   which is declared (usually) in <arpa/inet.h>. Kermit uses "unsigned
+   long" unless the symbol INADDRX is defined, in which case "struct
+   inaddr" is used instead. Try adding -DINADDRX to CFLAGS in your make
+   entry, and if that fixes the problem, please send a report to
+   kermit@columbia.edu.
+
+   Compilation errors might also have to do with the data type used for
+   getsockopt() and setsockopt() option-length field. This is normally an
+   int, but sometimes it's a short, a long, or an unsigned any of those,
+   or a size_t. To fix the compilation problem, add -DSOCKOPT_T=xxx to
+   the CFLAGS in your makefile target, where xxx is the appropriate type
+   (use "man getsockopt" or grep through your system/network header files
+   to find the needed type).
+
+  8.1.3. Enabling Host Address Lists
+
+   When you give Kermit an IP host name, it calls the socket routine
+   gethostbyname() to resolve it. gethostbyname() returns a hostent
+   struct, which might or might not not include a list of addresses; if
+   it does, then if the first one fails, Kermit can try the second one,
+   and so on. However, this will only work if the symbol "h_addr" is a
+   macro defined as "h_addr_list[0]", usually in netdb.h. If it is, then
+   you can activate this feature by defining the following symbol in
+   CFLAGS:
+
+  HADDRLIST
+
+  8.1.4. Enabling Telnet NAWS
+
+   The Telnet Negotiation About Window Size (NAWS) option requires the
+   ability to find out the terminal screen's dimensions. E.g. in Unix, we
+   need something like ioctl(0, TIOCGWINSZ, ...). If your version of
+   Kermit was built with NAWS capability, SHOW VERSIONS includes CK_NAWS
+   among the compiler options. If it doesn't, you can add it by defining
+   CK_NAWS at compile time. Then, if the compiler or linker complain
+   about undefined or missing symbols, or there is no complaint but SHOW
+   TERMINAL fails to show reasonable "Rows =, Columns =" values, then
+   take a look at (or write) the appropriate ttgwsiz() routine. On the
+   other hand, if CK_NAWS is defined by default for your system (in
+   [114]ckcnet.h), but causes trouble, you can override this definition
+   by including the -DNONAWS switch on your CC command line, thus
+   disabling the NAWS feature.
+
+   This appears to be needed at least on the AT&T 3B2, where in
+   [115]ckutio.c, the routine ttgwsiz() finds that the TIOCGWINSZ symbol
+   is defined but lacks definitions for the corresponding winsize struct
+   and its members ws_col and ws_row.
+
+   The UNIX version of C-Kermit also traps SIGWINCH, so it can send a
+   NAWS to the Telnet server any time the local console terminal window
+   size changes, e.g. when you stretch it with a mouse. The
+   SIGWINCH-trapping code is enabled if SIGWINCH is defined (i.e. in
+   signal.h). If this code should cause problems, you can disable it
+   without disabling the NAWS feature altogether, by defining NOSIGWINCH
+   at compile time.
+
+  8.1.5. Enabling Incoming TCP/IP Connections
+
+   This feature lets you "set host * port" and wait for an incoming
+   connection on the given port. This feature is enabled automatically at
+   compile if TCPSOCKET is defined and SELECT is also defined. But watch
+   out, simply defining SELECT on the cc command line does not guarantee
+   successful compilation or linking (see [116]Section 11).
+
+   If you want to disable incoming TCP/IP connections, then build
+   C-Kermit with:
+
+  -DNOLISTEN
+
+  8.1.6. Disabling SET TCP Options
+
+   The main reason for this is because of header file / prototype
+   conflicts at compile time regardting get- / setsockopt(). If you can't
+   fix them (without breaking other builds), add the following in CFLAGS:
+
+  -DNOTCPOPTS
+
+  8.2. X.25
+
+   X.25 support requires (a) a Sun, (b) the SunLink product (libraries
+   and header files), and (c) an X.25 connection into your Sun. Similarly
+   (in C-Kermit 7.0 or later) Stratus VOS and IBM AIX.
+
+   In UNIX, special makefile targets sunos4x25 and sunos41x25 (for SUNOS
+   4.0 and 4.1, respectively), or aix41x25, are provided to build in this
+   feature, but they only work if conditions (a)-(c) are met. To request
+   this feature, include -DSUNX25 (or -DIBMX25) in CFLAGS.
+
+   SUNX25 (or -DIBMX25) and TCPSOCKET can be freely mixed and matched,
+   and selected by the user at runtime with the SET NETWORK TYPE command
+   or SET HOST switches.
+
+  8.3. Other Networks
+
+   Support for other networking methods -- NETBIOS, LAT, Named Pipes, etc
+   -- is included in ck*net.h and ck*net.c for implementations (such as
+   Windows or OS/2) where these methods are supported.
+
+   Provision is made in the organization of the modules, header files,
+   commands, etc, for addition of new network types such as DECnet, X.25
+   for other systems (HP-UX, VMS, etc), and so on. Send email to
+   [117]kermit@columbia.edu if you are willing and able to work on such a
+   project.
+
+   [ [118]C-Kermit Home ] [ [119]Kermit Home ]
+    ________________________________________________________________________
+
+  9. EXCEPTION HANDLING
+
+   [ [120]Top ] [ [121]Contents ] [ [122]Next ] [ [123]Previous ]
+
+   The C language setjmp/longjmp mechanism is used for handling
+   exceptions. The jump buffer is of type jmp_buf, which almost
+   everywhere is typedef'd as an array, in which case you should have no
+   trouble compiling the exception-handling code. However, if you are
+   building C-Kermit in/for an environment where jmp_buf is something
+   other than an array (e.g. a struct), then you'll have to define the
+   following symbol:
+
+  JBNOTARRAY
+
+   [ [124]C-Kermit Home ] [ [125]Kermit Home ]
+    ________________________________________________________________________
+
+  10. SECURITY FEATURES
+
+   [ [126]Top ] [ [127]Contents ] [ [128]Next ] [ [129]Previous ]
+
+   Security, in the sense of secure authentication and strong encryption,
+   can be built into versionf of C-Kermit for which the appropriate
+   libraries and header files are available (Kerberos IV, Kerberos V,
+   OpenSSL, SRP), as explained in great detail in the Kermit Security
+   Reference
+   . The following symbols govern C-Kermit's security features at build
+   time:
+
+   NO_AUTHENTICATION
+          Means do not configure any TELNET AUTHENTICATION support. It
+          implies NO_ENCRYPTION and undefines any of the auth and encrypt
+          types. It does not undefine CK_SSL even though builds with
+          CK_SSL cannot succeed without CK_AUTHENTICATION. (This will be
+          supported in a future release. It will be needed to allow
+          C-Kermit to be built only as an FTP client.)
+
+   NO_KERBEROS
+          Means do not compile in any KERBEROS support when
+          CK_AUTHENTICATION has been defined.
+
+   NO_SRP
+          Do not compile in any SRP support when CK_AUTHENTICATION has
+          been defined.
+
+   NO_SSL
+          Do not compile in any SSL/TLS support
+
+   NO_ENCRYPTION
+          Do not compile in any Telnet encryption support. It does not
+          affect the use of SSL/TLS
+
+   NOSSH
+          Do not compile in any SSH support whether internal or external
+
+   CK_AUTHENTICATION
+          Telnet AUTHENTICATION support. (Also, required if SSL/TLS
+          support is desired.) On most platforms this does not autodefine
+          any authentication mechanisms such as Kerberos V, Kerberos IV,
+          SRP, ... Those need to be defined separately.
+
+   CK_KERBEROS
+          Defined automatically when KRB4, KRB5, or KRB524 are defined.
+          Implies that some version of Kerberos is in use.
+
+   KRB4
+          Should be defined when Kerberos IV support is desired.
+
+   KRB5
+          Should be defined when Kerberos V support is desired.
+
+   KRB524
+          Should be defined if both Kerberos V and Kerberos IV are used
+          and the Kerberos IV support is provided by the MIT Kerberos IV
+          compatibility library in the current Kerberos 5 distribution.
+
+   KRB5_U2U
+          Should be defined if KRB5 is defined and Kerberos 5 User to
+          User mode is desired.
+
+   HEIMDAL
+          Should be defined if Kerberos V support is provided by HEIMDAL.
+          Support for this option is not complete in C-Kermit 8.0. Anyone
+          interested in working on this should contact kermit-support.
+
+   CK_SRP
+          Should be defined if SRP support is desired.
+
+   CK_ENCRYPTION
+          Should be defined if TELNET ENCRYPTION option support is
+          desired. This option does not define any particular encryption
+          types. That should be done by defining CK_DES or CK_CAST.
+
+   CK_DES
+          Should be defined if either DES or 3DES Telnet Encryption
+          option support is desired.
+
+   LIBDES
+          If CK_DES is defined and DES support is being provided by
+          either Eric Young's libdes.a or OpenSSL 0.9.6x or earlier, this
+          option must be defined. If it is not defined, it will be
+          assumed that DES support is provided by the MIT Kerberos IV
+          libraries.
+
+   CK_CAST
+          Should be defined if CAST Telnet Encryption option support is
+          desired
+
+   CK_SSL
+          Should be defined if SSL/TLS support (OpenSSL) is desired.
+
+   SSL_KRB5
+          If KRB5 is defined, and OpenSSL is built to support the
+          Kerberos 5 ciphers, then you should define SSL_KRB5
+
+   NOSSLKRB5
+          If you are using OpenSSL 0.9.7 or higher and do not wish to
+          build with support for Kerberos 5 TLS ciphers, this option must
+          be defined.
+
+   ZLIB
+          If you are using OpenSSL 0.9.6 or higher and it has been
+          compiled with support for ZLIB compression, this option should
+          be defined to enable Kermit to properly enable the use of
+          compression.
+
+   SSHCMD
+          Defined for C-Kermit to enable the use of external SSH clients
+          from the Kermit command language
+
+   SSHBUILTIN
+          Defined for Kermit implementations that have integrated SSH
+          support. Currently only Windows.
+
+   ANYSSH
+          Defined if either SSHCMD or SSHBUILTIN are defined.
+
+   CK_SNDLOC
+          Telnet Send Location support.
+
+   NOSNDLOC
+          Do not include Telnet Send Location support.
+
+   CK_XDISPLOC
+          Telnet X-Display Location support. Determines if the X-Display
+          location information is sent to the Telnet server either via
+          Telnet XDISPLOC or NEW-ENV options.
+
+   NOXDISPLOC
+          Do not include Telnet X-Display Location support.
+
+   CK_FORWARD_X
+          Telnet Forward X Windows Session Data option. Used to protect
+          the privacy and integrity of X Windows Sessions when secure
+          telnet sessions are in use.
+
+   NOFORWARDX
+          Do not include Telnet Forward X Windows Session Data option.
+
+   Besides the strong forms of security listed above, C-Kermit also
+   embodies various internal security features, including:
+
+   NOPUSH
+          Compiling with the NOPUSH symbol defined removes all the "shell
+          escape" features from the program, including the PUSH, RUN, and
+          SPAWN commands, the "!" and "@" command prefixes, OPEN !READ,
+          OPEN !WRITE, job control (including the SUSPEND command), the
+          REDIRECT command, shell/DCL escape from CONNECT mode, as well
+          as the server's execution of REMOTE HOST commands (and, of
+          course, the ENABLE HOST command). Add NODISPO to also prevent
+          acceptance of incoming MAIL or REMOTE PRINT files. For UNIX,
+          also be sure to read [130]Section 11 of the [131]Unix C-Kermit
+          Installation Instructions. about set[ug]id configuration.
+          Additional restrictions can be enforced when in server mode;
+          read about the DISABLE command in the user manual.
+
+   NOCCTRAP
+          Compiling with NOCCTRAP prevents the trapping of SIGINT by
+          Kermit. Thus if the user generates a SIGINT signal (e.g. by
+          typing the system's interrupt character), Kermit will exit
+          immediately, rather than returning to its prompt.
+
+   NOPUSH and NOCCTRAP together allow Kermit to be run from restricted
+   shells, preventing access to system functions.
+
+   [ [132]C-Kermit Home ] [ [133]Kermit Home ]
+    ________________________________________________________________________
+
+  11. ENABLING SELECT()
+
+   [ [134]Top ] [ [135]Contents ] [ [136]Next ] [ [137]Previous ]
+
+   Kermit works best if it can do nonblocking reads, nondestructive input
+   buffer checking, and millisecond sleeps. All of these functions can be
+   accomplished by the select() function, which, unfortunately, is not
+   universally available. Furthermore, select() is required if incoming
+   TCP/IP connections are to be supported.
+
+   select() was introduced with Berkeley UNIX, rejected by AT&T for
+   System V, but is gradually creeping in to all UNIX versions (and other
+   operating systems too) by virtue of its presence in the sockets
+   library, which is needed for TCP/IP. AT&T SVID for System V R4
+   includes select(), but that does not mean that all SVR4
+   implementations have it.
+
+   Furthermore, even when select() is available, it might work only on
+   socket file descriptors, but not on others like serial ports, pipes,
+   etc. For example, in AOS/VS and BeOS, it works only with file
+   descriptors that were created by socket() and opened by connect() or
+   accept().
+
+   Other alternatives include poll() and rdchk(). Only one of these three
+   functions should be included. The following symbols govern this:
+
+     SELECT  Use select() (BSD, or systems with sockets libraries)
+     CK_POLL Use poll()   (System V)
+     RDCHK   Use rdchk()  (SCO XENIX and UNIX)
+
+   If your system supports the select() function, but your version of
+   C-Kermit does not, try adding:
+
+  -DSELECT
+
+   to the CFLAGS, and removing -DRDCHK or -DCK_POLL if it is there. If
+   you get compilation errors, some adjustments to ck*tio.c and/or
+   ck*net.c might be needed; search for SELECT (uppercase) in these files
+   (note that there are several variations on the calling conventions for
+   select()).
+
+   Various macros and data types need to be defined in order to use
+   select(). Usually these are picked up from <types.h> or <sys/types.h>.
+   But on some systems, they are in <sys/select.h>. In that case, add the
+   following:
+
+  -DSELECT_H
+
+   to the CFLAGS to tell C-Kermit to #include <sys/select.h>. A good
+   indication that you need to do this would be if you get compile-time
+   complaints about "fd_set" or "FD_SET" not being declared or defined.
+
+   In UNIX, the use of select() vs fork() in the CONNECT command is
+   independent of the above considerations, and is governed by choosing a
+   particular makefile target.
+
+   As of C-Kermit 7.0, select() is also the preferred control mechanism
+   for the CONNECT command. Unfortunately, the structures used by the
+   original UNIX CONNECT command, based on fork(), and those used by
+   select(), are so different, it was not practical to implement them
+   both in one module. So the select()-based CONNECT command module for
+   UNIX is [138]ckucns.c, and the fork-based one remains [139]ckucon.c.
+   To choose the fork-based one, which is more portable (but slower and
+   more fragile), use "wermit" as the make target. To choose the
+   select-based one, use "xermit". Only do this if you can verify that
+   the CONNECT command works on serial connections and PIPE connections
+   as well as TCP connections.
+
+     The select()-based Unix CONNECT module, ckucns.c, must be used if
+     encryption is to be done, since the fork() version (ckucon.c) loses
+     its ability to share vital state information between the two forks.
+     Also note that the select() version is superior in many other ways
+     too. For example, it recovers better from exterior killing, forced
+     disconnections, etc, plus it goes faster.
+
+   SHOW VERSIONS tells whether the CONNECT module uses fork() or
+   select().
+
+   C-Kermit 8.0 adds learned script capability, which depends on
+   select(). All the "wermit" based targets (as opposed to "xermit") had
+   NOLEARN added to them. Whenever changing a target over from wermit to
+   xermit, also remember to remove NOLEARN.
+
+   [ [140]C-Kermit Home ] [ [141]Kermit Home ]
+    ________________________________________________________________________
+
+  12. I/O REDIRECTION
+
+   [ [142]Top ] [ [143]Contents ] [ [144]Next ] [ [145]Previous ]
+
+   The REDIRECT command allows a local program to be run with its i/o
+   redirected over the communications connection. Your version of
+   C-Kermit has a REDIRECT command if it was built with the following
+   CFLAG:
+
+  -DCK_REDIR
+
+   This, in turn, is possible only if the underlying API is there. In the
+   case of UNIX this is just the wait() system call, so all UNIX versions
+   get this feature as of 6.0.192 (earlier versions needed a <sys/wait.h>
+   header file defining the symbols WIFEXITED and WEXITSTATUS).
+
+   As of version 7.0, file transfer can be done using pipes and filters.
+   To enable this feature, #define PIPESEND (and fill in the code). To
+   disable on systems where it is normally enabled, define NOPIPESEND.
+   This feature is, of course, also disabled by building with NOPUSH (or
+   giving the "nopush" command at runtime).
+
+   C-Kermit 7.0 also adds the PIPE and SET HOST /COMMAND commands, which
+   provide another form of redirection. This feature is selected with
+   -DNETCMD. CK_RDIR must also be defined, since the same mechanisms are
+   used internally.
+
+   [ [146]C-Kermit Home ] [ [147]Kermit Home ]
+    ________________________________________________________________________
+
+  13. FLOATING-POINT NUMBERS, TIMERS, AND ARITHMETIC
+
+   [ [148]Top ] [ [149]Contents ] [ [150]Next ] [ [151]Previous ]
+
+   Floating-point support was added in C-Kermit 7.0.
+
+   Floating-point numbers are enabled internally, at least for use in
+   high-precision file-transfer timers and statistics, unless the
+   following symbol is defined at compile time:
+
+  -DNOFLOAT
+
+   This might be necessary on old PCs that do not have built-in
+   floating-point hardware.
+
+   When NOFLOAT is not defined, the following symbol tells which
+   floating-point type to use:
+
+  -DCKFLOAT=xxxx
+
+   The value is either "double" (normal for 32- and 16-bit architectures)
+   or "float" (normal for 64-bit architectures).
+
+   C-Kermit can be configured to use high-precision file-transfer timers
+   for more accurate statistics. This feature is enabled with:
+
+  -DGFTIMER
+
+   and disabled with:
+
+  -DNOGFTIMER
+
+   If you try to build with -DGFTIMER but you get compilation errors,
+   either fix them (and send email to kermit@columbia.edu telling what
+   you did), or else give up and use -DNOGFTIMER (or -DNOFLOAT) instead.
+   Hint: depending on your machine architecture, you might have better
+   luck using double than float as the data type for floating-point
+   numbers, or vice versa. Look in [152]ckcdeb.h for the CKFLOAT
+   definition.
+
+   Floating-point arithmetic is also supported in the script programming
+   language. First via the \fpp...() functions, such as \fppadd(), which
+   adds two floating-point numbers, second in S-Expressions. Addition,
+   subtraction, multiplication, and division are always available. But
+   other functions such as logs, raising to powers, sines and cosines,
+   etc, require the C Math library. To include user-level floating-point
+   math you must put:
+
+  -DFNFLOAT
+
+   and in Unix you must link with the Math library:
+
+  LIBS=".... -lm"
+
+   In K95 and VMS, FNFLOAT is defined automatically if CKFLOAT is
+   defined. In Unix, however, FNFLOAT must be added to each makefile
+   target individually, because of the special linking instructions that
+   must also be added to each target.
+
+   Note: S-Expressions require FNFLOAT.
+
+   [ [153]C-Kermit Home ] [ [154]Kermit Home ]
+    ________________________________________________________________________
+
+  14. SPECIAL CONFIGURATIONS
+
+   [ [155]Top ] [ [156]Contents ] [ [157]Previous ]
+
+   As of C-Kermit 7.0, if you build C-Kermit normally, but with -DNOICP
+   (No Interactive Command Parser), you get a program capable of making
+   serial connections (but not dialing) and network connections (if
+   TCPSOCKET or other network option included), and can also transfer
+   files using Kermit protocol, but only via autodownload/upload.
+   Furthermore, if you call the executable "telnet", it will act like
+   Telnet -- using the command-line options. However, in this case there
+   is nothing to escape back to, so if you type Ctrl-\c, it just prints a
+   message to this effect.
+
+   You can also build C-Kermit with -DNOXFER, meaning omit all the
+   file-transfer features. This leaves you with a scriptable
+   communications program that is considerably smaller than the full
+   C-Kermit.
+
+   [ [158]C-Kermit Home ] [ [159]Kermit Home ]
+    ________________________________________________________________________
+
+  APPENDIX I: SUMMARY OF COMPILE-TIME OPTIONS
+
+   [ [160]Top ] [ [161]Contents ]
+
+   These are the symbols that can be specified on the cc command line,
+   listed alphabetically. Others are used internally, including those
+   taken from header files, those defined by the compiler itself, and
+   those inferred from the ones given below. Kermit's SHOW VERSIONS
+   command attempts to display most of these. See [162]ckcdeb.h and
+   [163]ckcnet.h for inference rules. For example SVR3 implies ATTSV,
+   MULTINET implies TCPSOCKET, and so on.
+
+   Here is the complete list of the Kermit-specific compile-time
+   switches:
+
+   ACUCNTRL Select BSD 4.3-style acucntrl() bidirectional tty control.
+   aegis Build for Apollo Aegis (predefined on Apollo systems).
+   AIX370 Build for IBM AIX/370 for IBM mainframes.
+   AIXESA Build for IBM AIX/ESA for IBM mainframes.
+   AIXPS2 Build for IBM AIX 3.0 for PS/2 series (never formally
+   released).
+   AIXRS Build for IBM AIX 3.x on RS/6000.
+   AIX41 Build for IBM AIX 4.x on RS/6000.
+   AMIGA Build for Commodore Amiga with Intuition OS.
+   ATT6300 Build for AT&T 6300 PLUS.
+   ATT7300 Build for AT&T 7300 UNIX PC (3B1).
+   ATTSV Build for AT&T System III or V UNIX.
+   AUX Build for Apple A/UX for the Macintosh.
+   BIGBUFOK OK to use big buffers - "memory is not a problem"
+   BPS_xxxx Enable SET SPEED xxxx
+   BSD29 Build for BSD 2.9 or 2.10.
+   BSD4 Build for BSD 4.2.
+   BSD41 Build for BSD 4.1.
+   BSD43 Build for BSD 4.3.
+   BSD44 Build for BSD 4.4.
+   C70 Build for BBN C/70.
+   CIE Build for CIE Systems 680/20.
+   CKCONINTB4CB Work around prompt-disappears after escape back from
+   CONNECT.
+   CKLEARN Build with support for learned scripts.
+   CKLOGDIAL Enable connection log.
+   CKMAXPATH Maximum length for a fully qualified filename.
+   CKREGEX (misnomer) Include [...] or {xxx,xxx,xxx} matching in
+   ckmatch().
+   CKSYSLOG Enable syslogging.
+   CK_ANSIC Enable ANSI C constructs - prototypes, etc.
+   CK_ANSILIBS Use header files for ANSI C libraries.
+   CK_APC Enable APC execution by CONNECT module.
+   CK_CURSES Enable fullscreen file transfer display.
+   CK_DSYSINI Use system-wide init file, with name supplied by Kermit.
+   CK_DTRCD DTR/CD flow control is available.
+   CK_FAST Build with fast Kermit protocol defaults.
+   CK_FORK_SIG UNIX only: signal() number for CONNECT module forks.
+   CK_IFRO IF REMOTE command is available (and can run in remote mode).
+   CK_INI_A System-wide init file takes precedence over user's.
+   CK_INI_B User's init file takes precedence over the system-wide one.
+   CK_LABELED Include support for SET FILE TYPE LABELED.
+   CK_LBRK This version can send Long BREAK.
+   CK_LINGER Add code to turn of TCP socket "linger" parameter.
+   CK_MKDIR This version has a zmkdir() command to create directories.
+   CK_NAWS Include TELNET Negotiate About Window Size support.
+   CK_NEWTERM Use newterm() rather than initscr() to initialize curses.
+   CK_PAM Include PAM authentication (might also require -lpam).
+   CK_PCT_BAR Fullscreen file transfer display should include
+   "thermometer".
+   CK_POLL System-V or POSIX based UNIX has poll() function.
+   CK_POSIX_SIG Use POSIX signal handing: sigjmp_buf, sigsetjmp,
+   siglongjmp.
+   CK_READ0 read(fd,&x,0) can be used to test TCP/IP connections.
+   CK_REDIR Enable the REDIRECT command.
+   CK_RESEND Include the RESEND command (needs zfseek() + append).
+   CK_RTSCTS RTS/CTS flow control is available.
+   CK_SHADOW Include support for shadow passwords (e.g. for IKSD
+   authentication).
+   CK_SOCKBUF Enable TCP socket-buffer-size-increasing code.
+   CK_SOCKS UNIX only: Build with socks library rather than regular
+   sockets
+   CK_SOCKS5 UNIX only: Build with socks 5 lib rather than regular
+   sockets
+   CK_SPEED Enable control-character unprefixing.
+   CK_SYSINI="xxxxx" Quoted string to be used as system-wide init file
+   name.
+   CK_TIMERS Build with support for dynamically calculated packet
+   timeouts.
+   CK_TMPDIR This version of Kermit has an isdir() function.
+   CK_TTYFD Defined on systems where the communications connection file
+   descriptor (ttyfd) can be passed to other processes as a command-line
+   argument via \v(ttyfd).
+   CK_URL Parse URLs as well as hostnames, etc.
+   CK_XONXOFF Xon/Xoff flow control available.
+   CK_XYZ Include support for XYZMODEM protocols.
+   CK_WREFRESH Curses package includes wrefresh(),clearok() for screen
+   refresh.
+   CKFLOAT=type Floating-point data type, "double" or "float".
+   CKTYP_H=xxx Force include of xxx as <types.h> file.
+   CLSOPN When hanging up a tty device, also close and reopen it.
+   CMDDEP Maximum recursion depth for self-referential user-defined fn's.
+   COHERENT Build for Mark Williams Coherent UNIX
+   CONGSPD Define if this version has congspd() routine in ck?tio.c
+   datageneral Build for Data General AOS/VS or AOS/VS II
+   DCLPOPEN popen() is available but needs to be declared
+   DEC_TCPIP Build with support for DEC TCP/IP (UCX) for (Open)VMS
+   DGUX430 Build for DG/UX 4.30
+   DGUX540 Build for DG/UX 5.40
+   DEFPAR=x Default parity, 0, 'e', 'o', 'm', or 's'.
+   DFTTY=xxx Default communications device name.
+   DIRENT UNIX directory structure to be taken from <dirent.h>.
+   DIRPWDRP Prompt for password in REMOTE CWD command.
+   DTILDE Include UNIX ~ notation for username/home-directory
+   DYNAMIC Allocate file transfer packet buffers dynamically with malloc.
+   ENCORE Build for Encore Multimax computers.
+   EXCELAN Build with excelan TCP/IP.
+   FNFLOAT Include floating-point math functions (logs, sin, cos, exp,
+   etc)
+   FT18 Build for Fortune For:Pro 1.8.
+   FT21 Build for Fortune For:Pro 2.1.
+   GEMDOS Build for Atari ST GEMDOS.
+   GFTIMER Use high-precision floating-point file-transfer timers.
+   GID_T=xxx Group IDs are of type xxx (usually int, short, or gid_t).
+   HADDRLIST If gethostbyname() hostent struct contains a list of
+   addresses.
+   HDBUUCP Build with support for Honey DanBer UUCP.
+   HPUX Build for Hewlett Packard HP-UX.
+   HPUX9 Build for Hewlett Packard HP-UX 9.x.
+   HPUX10 Build for Hewlett Packard HP-UX 10.x.
+   HWPARITY Define if this version can SET PARITY HARDWARE { EVEN,
+   ODD...}
+   I386IX Build for Interactive System V R3.
+   IFDEBUG Add IF stmts "if (deblog)" before "debug()" calls.
+   INADDRX TCP/IP inet_addr() type is struct inaddr, not unsigned long.
+   INTERLAN Build with support for Racal/Interlan TCP/IP.
+   ISDIRBUG System defs of S_ISDIR and S_ISREG have bug, define
+   ourselves.
+   ISIII Build for Interactive System III.
+   IX370 Build for IBM IX/370.
+   KANJI Build with Kanji character-set translation support.
+   LCKDIR UUCP lock directory is /usr/spool/uucp/LCK/.
+   LFDEVNO UUCP lockfile name uses device numbers, as in SVR4.
+   LINUXFSSTND For Linux, use FSSTND UUCP lockfile conventions (default).
+   LOCK_DIR=xxx UUCP lock directory is xxx (quoted string).
+   LOCKF Use lockf() (in addition to lockfiles) on serial lines
+   LONGFN BSD long filenames supported using <dir.h> and opendir().
+   LYNXOS Build for Lynx OS 2.2 or later (POSIX-based).
+   MAC Build for Apple Macintosh with Mac OS.
+   MATCHDOT Make wildcards match filenames that start with period (.)
+   MAXRP=number Maximum receive-packet length.
+   MAXSP=number Maximum send-packet length.
+   MDEBUG Malloc-debugging requested.
+   MINIDIAL Minimum modem dialer support: CCITT, Hayes, Unkown, and None.
+   MINIX Build for MINIX.
+   MIPS Build for MIPS workstation.
+   MULTINET Build with support for TGV MultiNet TCP/IP (VAX/VMS).
+   M_UNIX Defined by SCO.
+   NAP The nap() is available (conflicts with SELECT and USLEEP)
+   NAPHACK The nap() call is available but only as syscall(3112,...)
+   NDIR BSD long filenames supported using <ndir.h> and opendir().
+   NDGPWNAM Don't declare getpwnam().
+   NDSYSERRLIST Don't declare sys_errlist[].
+   NEEDSELECTDEFS select() is avaible but we need to define FD_blah
+   ourselves.
+   NETCMD Build with support for SET HOST /COMMAND and PIPE commands.
+   NEXT Build for NeXT Mach 1.x or 2.x or 3.0, 3.1, or 3.2.
+   NEXT33 Build for NeXT Mach 3.3.
+   NOANSI Disable ANSI C function prototyping.
+   NOAPC Do not include CK_APC code.
+   NOARROWKEYS Exclude code to parse ANSI arrow-key sequences.
+   NOB_xxxx Disable SET SPEED xxxx
+   NOBIGBUF Override BIGBUFOK when it is the default
+   NOBRKC Don't try to refer to t_brkc or t_eof tchars structure members.
+   NOCKFQHOSTNAME Exclude code to get fully qualified hostname in case it
+   causes core dumps.
+   NOCCTRAP Disable Control-C (SIGINT) trapping.
+   NOCKSPEED Disable control-prefix removal feature (SET CONTROL).
+   NOCKTIMERS Build without support for dynamic timers.
+   NOCKXYZ Overrides CK_XYZ.
+   NOCKREGEX Do not include [...] or {xxx,xxx,xxx} matching in ckmatch().
+   NOCMDL Build with no command-line option processing.
+   NOCOTFMC No Close(Open()) To Force Mode Change (UNIX version).
+   NOCSETS Build with no support for character set translation.
+   NOCYRIL Build with no support for Cyrillic character set translation.
+   NOCYRILLIC Ditto.
+   NODEBUG Build with no debug logging capability.
+   NODIAL Build with no DIAL or SET DIAL commands.
+   NODISPO Build to always refuse incoming MAIL or REMOTE PRINT files.
+   DNODISPLAY Build with no file-transfer display.
+   NOESCSEQ Build with no support for ANSI escape sequence recognition.
+   NOFAST Do not make FAST Kermit protocol settings the default.
+   NOFDZERO Do not use file descriptor 0 for remote-mode file transfer.
+   NOFILEH Do not #include <sys/file.h>.
+   NOFLOAT Don't include any floating-point data types or operations.
+   NOFRILLS Build with "no frills" (this should be phased out...)
+   NOFTRUNCATE Include this on UNIXes that don't have ftruncate().
+   NOGETUSERSHELL Include this on UNIXes that don't have getusershell().
+   NOGFTIMER Don't use high-precision floating-point file-transfer
+   timers.
+   NOHEBREW Build with no support for Hebrew character sets.
+   NOHELP Build with no built-in help.
+   NOIKSD Build with IKSD support excluded.
+   NOINITGROUPS Include this on UNIXes that don't have initgroups().
+   NOICP Build with no interactive command parser.
+   NOJC Build with no support for job control (suspend).
+   NOKANJI Build with no support for Japanese Kanji character sets.
+   NOKVERBS Build with no support for keyboard verbs (\Kverbs).
+   NOLATIN2 Build with no ISO Latin-2 character-set translation support.
+   NOLEARN Build with no support for learned scripts.
+   NOLINKBITS Use of S_ISLNK and _IFLNK untrustworthy; use readlink()
+   instead.
+   NOLOCAL Build without any local-mode features: No Making Connections.
+   NOLOGDIAL Disable connection log.
+   NOLOGIN Build without IKSD (network login) support.
+   NOLSTAT Not OK to use lstat().
+   NOMDMHUP Build without "modem-specific hangup" (e.g. ATH0) feature.
+   NOMHHOST Exclude the multihomed-host TCP/IP code (if compilcation
+   errors)
+   NOMINPUT Build without MINPUT command.
+   NOMSEND Build with no MSEND command.
+   NONAWS Do not include TELNET Negotiate About Window Size support.
+   NONET Do not include any network support.
+   NONOSETBUF (See NOSETBUF)
+   NOPARSEN Build without automatic parity detection.
+   NOPIPESEND Disable file transfer using pipes and filters.
+   NOPOLL Override CK_POLL definition.
+   NOPOPEN The popen() library call is not available.
+   NOPURGE Build with no PURGE command.
+   NOPUSH Build with no escapes to operating system.
+   NOREALPATH In UNIX, realpath() function is not available.
+   NORECALL Disable the command-recall feature.
+   NOREDIRECT Disable REDIRECT command.
+   NORENAME Don't use rename() system call, use link()/unlink() (UNIX).
+   NORESEND Build with no RESEND command.
+   NORETRY Build with no command-retry feature.
+   NOSCRIPT Build with no SCRIPT command.
+   NOSELECT Don't try to use select().
+   NOSERVER Build with no SERVER mode and no server-related commands.
+   NOSETBUF Don't make console writes unbuffered.
+   NONOSETBUF DO make console writes unbuffered.
+   NOSETREU setreuid() and/or setregid() not available.
+   NOSHOW Build with no SHOW command (not recommended!).
+   NOSIGWINCH Disable SIGWINCH signal trapping.
+   NOSPL Build with no script programming language.
+   NOSTAT Don't call stat() from mainline code.
+   NOSYMLINK Include this for UNIXes that don't have readlink().
+   NOSYSIOCTLH Do not #include <sys/ioctl.h>.
+   NOSYSTIMEH Co not include <sys/time.h>.
+   NOSYSLOG Disable syslogging code.
+   NOTCPOPTS Build with no SET TCP options or underlying support.
+   NOTLOG Build with no support for transaction logging.
+   NOTM_ISDST Struct tm has no tm_isdst member.
+   NOUNICODE Build with no support for Unicode character-set translation.
+   NOURL Don't parse URLs
+   NOUUCP Build with no UUCP lockfile support (dangerous!).
+   NOWARN Make EXIT WARNING be OFF by default (otherwise it's ON).
+   NOWREFRESH Override built-in definition of CK_WREFRESH (q.v.).
+   NOXFER Build with no Kermit or other file-transfer protocols.
+   NOXMIT Build with no TRANSMIT command.
+   NOXPRINT Disables transparent print code.
+   OLDMSG Use old "entering server mode" message (see [164]ckcmai.c).
+   OLINUXHISPEED Build in old Linux hi-serial-speed code (for Linux <=
+   1.0).
+   OPENBSD Build for OpenBSD.
+   OS2 Build for OS/2.
+   OSF Build for OSF/1.
+   OSFPC Build for OSF/1 on a PC.
+   OSF32 Digital UNIX 3.2 or later.
+   OSF40 Build for Digital UNIX 4.0.
+   OSF50 Build for Digital UNIX 5.0.
+   OSK Build for OS-9.
+   OXOS Build for Olivetti X/OS 2.3.
+   PCIX Build for PC/IX
+   PID_T=xxx Type for pids is xxx (normally int or pid_t).
+   POSIX Build for POSIX: use POSIX header files, functions, etc.
+   _POSIX_SOURCE Disable non-POSIX features.
+   PROVX1 Build for Venix 1.0 on DEC Professional 3xx.
+   PTX Build for Dynix/PTX
+   PWID_T=xxx getpwid() type is xxx.
+   RBSIZ=xxx Define overall size of receive-packet buffer (with DYNAMIC).
+   RDCHK rdchk() system call is available.
+   RENAME rename() system call is available (UNIX).
+   RTAIX Build for AIX 2.2.1 on IBM RT PC.
+   RTU Build for Masscomp / Concurrent RTU.
+   SAVEDUID BSD or other non-AT&T UNIX has saved-setuid feature.
+   SBSIZ=xxx Define overall size of send-packet buffer (use with
+   DYNAMIC).
+   SDIRENT Directory structure specified in <sys/dirent.h>.
+   SELECT select() function available (conflicts with RDCHK and CK_POLL)
+   SELECT_H Include <sys/select.h> for select()-releated definitions.
+   SETEUID BSD 4.4-style seteXid() functions available.
+   SIG_V Type for signal() is void. Used to override normal assumption.
+   SIG_I Type for signal() is int. Used to override normal assumption.
+   SOCKOPT_T Override default data type for get/setsockopt() option
+   length.
+   SOLARIS Build for Solaris.
+   SOLARIS25 Build for Solaris 2.5 or later.
+   SONYNEWS Build for Sony NEWS-OS.
+   STERMIOX <sys/termiox.h> is available.
+   STRATUS Build for Stratus VOS.
+   STRATUSX25 Include Stratus VOS X.25 support.
+   SUN4S5 Build for SUNOS 4.x in the System V R3 environment.
+   SUNOS4 Build for SUNOS 4.0 in the BSD environment.
+   SUNOS41 Build for SUNOS 4.1 in the BSD environment.
+   SUNX25 Build with support for SunLink X.25.
+   SVR3 Build for AT&T System V Release 3.
+   SVR3JC Allow job control support on System V Release 3 UNIX versions.
+   SVR4 Build for AT&T System V Release 4.
+   SW_ACC_ID UNIX only -- swap real & effective ids around access()
+   calls.
+   sxaE50 Build for PFU Compact A Series SX/A TISP.
+   SYSLOGLEVEL=n Force syslogging at given level.
+   SYSTIMEH Include <sys/time.h>.
+   SYSUTIMEH Include <sys/utime.h> for setting file dates (88OPEN)
+   TCPSOCKET Build with support for TCP/IP via Berkeley sockets library.
+   TERMIOX <termiox.h> header file is available (mostly SVR4).
+   TNCODE Include TELNET-specific code.
+   TOWER1 Build for NCR Tower 1632 with OS 1.02.
+   TRS16 Build for Tandy 16/6000.
+   UID_T=xxx Type for uids is xxx (normally int or uid_t).
+   UNIX Must be defined for all UNIX versions.
+   UNIX351M AT&T UNIX 3.51m on the AT&T 7300 UNIX PC.
+   USE_ARROWKEYS Include code to parse ANSI arrow-key sequences.
+   USE_LSTAT OK to use lstat().
+   USE_MEMCPY Define this if memcpy()/memset()/memmove() available.
+   USE_STRERROR Define this if strerror() is available.
+   USLEEP usleep() system call available (conflicts with NAP & SELECT).
+   UTEK Build for Tektronix workstations with UTEK OS.
+   UTIMEH Include <utime.h> for setting file dates (SVR4, POSIX)
+   UTS24 Build for Amdahl UTS 2.4.
+   V7 Build for Version 7 UNIX.
+   VMS Build for VAX/VMS.
+   VOID=xxx VOID type for functions (int or void).
+   VXVE Build for CDC VX/VE 5.2.1.
+   WAIT_T=xxx Type of argument passed to wait().
+   WINTCP Build with Wollongong VAX/VMS TCP/IP (implies TCPSOCKET)
+   WOLLONGONG Build with Wollongong UNIX TCP/IP (implies TCPSOCKET)
+   XENIX Build for Xenix (SCO, Tandy, others).
+   XNDIR Support for BSD long filenames via <sys/ndir.h>.
+   XYZ_INTERNAL Support for XYZMODEM protocols is internal, not external.
+   ZFCDAT Define this if zfcdat() function is available in Kermit.
+   ZILOG Build for Zilog ZEUS.
+   ZJDATE Has zjdate() function that converts date to Julian format.
+   XPRINT Transparent print code included in CONNECT module.
+
+   [ [165]Top ] [ [166]Contents ] [ [167]C-Kermit Home ] [ [168]Kermit
+   Home ]
+     _________________________________________________________________
+
+
+    C-Kermit Configuration Options / [169]The Kermit Project /
+    [170]Columbia University / [171]kermit@columbia.edu / 14 March 2003
+
+References
+
+   1. http://www.columbia.edu/kermit/
+   2. http://www.columbia.edu/
+   3. http://www.columbia.edu/kermit/ckccfg.html
+   4. http://www.columbia.edu/kermit/ckermit.html
+   5. http://www.columbia.edu/kermit/index.html
+   6. http://www.columbia.edu/kermit/ckccfg.html#x1
+   7. http://www.columbia.edu/kermit/ckccfg.html#x2
+   8. http://www.columbia.edu/kermit/ckccfg.html#x3
+   9. http://www.columbia.edu/kermit/ckccfg.html#x4
+  10. http://www.columbia.edu/kermit/ckccfg.html#x5
+  11. http://www.columbia.edu/kermit/ckccfg.html#x6
+  12. http://www.columbia.edu/kermit/ckccfg.html#x7
+  13. http://www.columbia.edu/kermit/ckccfg.html#x8
+  14. http://www.columbia.edu/kermit/ckccfg.html#x9
+  15. http://www.columbia.edu/kermit/ckccfg.html#x10
+  16. http://www.columbia.edu/kermit/ckccfg.html#x11
+  17. http://www.columbia.edu/kermit/ckccfg.html#x12
+  18. http://www.columbia.edu/kermit/ckccfg.html#x13
+  19. http://www.columbia.edu/kermit/ckccfg.html#x14
+  20. http://www.columbia.edu/kermit/ckccfg.html#xa1
+  21. http://www.columbia.edu/kermit/ckuins.html
+  22. http://www.columbia.edu/kermit/ckermit.html
+  23. http://www.columbia.edu/kermit/index.html
+  24. http://www.columbia.edu/kermit/ckccfg.html#top
+  25. http://www.columbia.edu/kermit/ckccfg.html#contents
+  26. http://www.columbia.edu/kermit/ckccfg.html#x2
+  27. http://www.columbia.edu/kermit/ckccfg.html#x0
+  28. http://www.columbia.edu/kermit/ckermit.html
+  29. http://www.columbia.edu/kermit/index.html
+  30. http://www.columbia.edu/kermit/ckccfg.html#top
+  31. http://www.columbia.edu/kermit/ckccfg.html#contents
+  32. http://www.columbia.edu/kermit/ckccfg.html#x3
+  33. http://www.columbia.edu/kermit/ckccfg.html#x1
+  34. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+  35. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h
+  36. ftp://kermit.columbia.edu/kermit/c-kermit/ckuus3.c
+  37. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h
+  38. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+  39. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+  40. http://www.columbia.edu/kermit/ckermit.html
+  41. http://www.columbia.edu/kermit/index.html
+  42. http://www.columbia.edu/kermit/ckccfg.html#top
+  43. http://www.columbia.edu/kermit/ckccfg.html#contents
+  44. http://www.columbia.edu/kermit/ckccfg.html#x4
+  45. http://www.columbia.edu/kermit/ckccfg.html#x2
+  46. ftp://kermit.columbia.edu/kermit/c-kermit/makefile
+  47. http://www.columbia.edu/kermit/ckuins.html
+  48. http://www.columbia.edu/kermit/ckuins.html#x4
+  49. http://www.columbia.edu/kermit/ckuins.html#x9.2
+  50. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusx.c
+  51. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+  52. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c
+  53. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusx.c
+  54. ftp://kermit.columbia.edu/kermit/c-kermit/ckucmd.c
+  55. http://www.columbia.edu/kermit/ckermit.html
+  56. http://www.columbia.edu/kermit/index.html
+  57. http://www.columbia.edu/kermit/ckccfg.html#top
+  58. http://www.columbia.edu/kermit/ckccfg.html#contents
+  59. http://www.columbia.edu/kermit/ckccfg.html#x5
+  60. http://www.columbia.edu/kermit/ckccfg.html#x3
+  61. http://www.columbia.edu/kermit/unicode.html
+  62. http://www.columbia.edu/kermit/ckermit.html
+  63. http://www.columbia.edu/kermit/index.html
+  64. http://www.columbia.edu/kermit/ckccfg.html#top
+  65. http://www.columbia.edu/kermit/ckccfg.html#contents
+  66. http://www.columbia.edu/kermit/ckccfg.html#x6
+  67. http://www.columbia.edu/kermit/ckccfg.html#x4
+  68. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusr.h
+  69. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusr.h
+  70. http://www.columbia.edu/kermit/ckermit.html
+  71. http://www.columbia.edu/kermit/index.html
+  72. http://www.columbia.edu/kermit/ckccfg.html#top
+  73. http://www.columbia.edu/kermit/ckccfg.html#contents
+  74. http://www.columbia.edu/kermit/ckccfg.html#x7
+  75. http://www.columbia.edu/kermit/ckccfg.html#x5
+  76. http://www.columbia.edu/kermit/ckccfg.html#x6.1
+  77. http://www.columbia.edu/kermit/ckccfg.html#x6.2
+  78. http://www.columbia.edu/kermit/ckccfg.html#x6.3
+  79. http://www.columbia.edu/kermit/ckccfg.html#x6.4
+  80. http://www.columbia.edu/kermit/ckccfg.html#x4
+  81. http://www.columbia.edu/kermit/gkermit.html
+  82. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusr.h
+  83. ftp://kermit.columbia.edu/kermit/c-kermit/ckcker.h
+  84. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h
+  85. http://www.columbia.edu/kermit/ckermit.html
+  86. http://www.columbia.edu/kermit/index.html
+  87. http://www.columbia.edu/kermit/ckccfg.html#top
+  88. http://www.columbia.edu/kermit/ckccfg.html#contents
+  89. http://www.columbia.edu/kermit/ckccfg.html#x8
+  90. http://www.columbia.edu/kermit/ckccfg.html#x6
+  91. ftp://kermit.columbia.edu/kermit/c-kermit/ckudia.c
+  92. http://www.columbia.edu/kermit/ckermit.html
+  93. http://www.columbia.edu/kermit/index.html
+  94. http://www.columbia.edu/kermit/ckccfg.html#top
+  95. http://www.columbia.edu/kermit/ckccfg.html#contents
+  96. http://www.columbia.edu/kermit/ckccfg.html#x9
+  97. http://www.columbia.edu/kermit/ckccfg.html#x7
+  98. http://www.columbia.edu/kermit/ckccfg.html#x8.1
+  99. http://www.columbia.edu/kermit/ckccfg.html#x8.2
+ 100. http://www.columbia.edu/kermit/ckccfg.html#x8.3
+ 101. http://www.columbia.edu/kermit/ckccfg.html#x8.1.1
+ 102. http://www.columbia.edu/kermit/ckccfg.html#x8.1.2
+ 103. http://www.columbia.edu/kermit/ckccfg.html#x8.1.3
+ 104. http://www.columbia.edu/kermit/ckccfg.html#x8.1.4
+ 105. http://www.columbia.edu/kermit/ckccfg.html#x8.1.5
+ 106. http://www.columbia.edu/kermit/ckccfg.html#x8.1.6
+ 107. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.h
+ 108. ftp://kermit.columbia.edu/kermit/c-kermit/ckctel.c
+ 109. ftp://kermit.columbia.edu/kermit/c-kermit/ckctel.c
+ 110. ftp://kermit.columbia.edu/kermit/c-kermit/ckctel.h
+ 111. ftp://kermit.columbia.edu/kermit/c-kermit/ckcftp.c
+ 112. http://www.columbia.edu/kermit/ckermit.html
+ 113. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.c
+ 114. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.h
+ 115. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 116. http://www.columbia.edu/kermit/ckccfg.html#x11
+ 117. mailto:kermit@columbia.edu
+ 118. http://www.columbia.edu/kermit/ckermit.html
+ 119. http://www.columbia.edu/kermit/index.html
+ 120. http://www.columbia.edu/kermit/ckccfg.html#top
+ 121. http://www.columbia.edu/kermit/ckccfg.html#contents
+ 122. http://www.columbia.edu/kermit/ckccfg.html#x10
+ 123. http://www.columbia.edu/kermit/ckccfg.html#x8
+ 124. http://www.columbia.edu/kermit/ckermit.html
+ 125. http://www.columbia.edu/kermit/index.html
+ 126. http://www.columbia.edu/kermit/ckccfg.html#top
+ 127. http://www.columbia.edu/kermit/ckccfg.html#contents
+ 128. http://www.columbia.edu/kermit/ckccfg.html#x11
+ 129. http://www.columbia.edu/kermit/ckccfg.html#x9
+ 130. http://www.columbia.edu/kermit/ckuins.html#x11
+ 131. http://www.columbia.edu/kermit/ckuins.html
+ 132. http://www.columbia.edu/kermit/ckermit.html
+ 133. http://www.columbia.edu/kermit/index.html
+ 134. http://www.columbia.edu/kermit/ckccfg.html#top
+ 135. http://www.columbia.edu/kermit/ckccfg.html#contents
+ 136. http://www.columbia.edu/kermit/ckccfg.html#x12
+ 137. http://www.columbia.edu/kermit/ckccfg.html#x10
+ 138. ftp://kermit.columbia.edu/kermit/c-kermit/ckucns.c
+ 139. ftp://kermit.columbia.edu/kermit/c-kermit/ckucon.c
+ 140. http://www.columbia.edu/kermit/ckermit.html
+ 141. http://www.columbia.edu/kermit/index.html
+ 142. http://www.columbia.edu/kermit/ckccfg.html#top
+ 143. http://www.columbia.edu/kermit/ckccfg.html#contents
+ 144. http://www.columbia.edu/kermit/ckccfg.html#x13
+ 145. http://www.columbia.edu/kermit/ckccfg.html#x11
+ 146. http://www.columbia.edu/kermit/ckermit.html
+ 147. http://www.columbia.edu/kermit/index.html
+ 148. http://www.columbia.edu/kermit/ckccfg.html#top
+ 149. http://www.columbia.edu/kermit/ckccfg.html#contents
+ 150. http://www.columbia.edu/kermit/ckccfg.html#x14
+ 151. http://www.columbia.edu/kermit/ckccfg.html#x12
+ 152. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h
+ 153. http://www.columbia.edu/kermit/ckermit.html
+ 154. http://www.columbia.edu/kermit/index.html
+ 155. http://www.columbia.edu/kermit/ckccfg.html#top
+ 156. http://www.columbia.edu/kermit/ckccfg.html#contents
+ 157. http://www.columbia.edu/kermit/ckccfg.html#x13
+ 158. http://www.columbia.edu/kermit/ckermit.html
+ 159. http://www.columbia.edu/kermit/index.html
+ 160. http://www.columbia.edu/kermit/ckccfg.html#top
+ 161. http://www.columbia.edu/kermit/ckccfg.html#contents
+ 162. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h
+ 163. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.h
+ 164. ftp://kermit.columbia.edu/kermit/c-kermit/ckcmai.c
+ 165. http://www.columbia.edu/kermit/ckccfg.html#top
+ 166. http://www.columbia.edu/kermit/ckccfg.html#contents
+ 167. http://www.columbia.edu/kermit/ckermit.html
+ 168. http://www.columbia.edu/kermit/index.html
+ 169. http://www.columbia.edu/kermit/index.html
+ 170. http://www.columbia.edu/
+ 171. mailto:kermit@columbia.edu
diff --git a/ckcplm.txt b/ckcplm.txt
new file mode 100644 (file)
index 0000000..9c2f44f
--- /dev/null
@@ -0,0 +1,3076 @@
+
+                         C-Kermit Program Logic Manual
+
+     Frank da Cruz
+     [1]The Kermit Project
+     [2]Columbia University
+
+   As of: C-Kermit 8.0.211, 10 April 2004
+   This page last updated: Sat Apr 10 16:45:30 2004 (New York USA Time)
+
+     IF YOU ARE READING A PLAIN-TEXT version of this document, note that
+     this file is a plain-text dump of a Web page. You can visit the
+     original (and possibly more up-to-date) Web page here:
+
+  [3]http://www.columbia.edu/kermit/ckcplm.html
+
+   [ [4]C-Kermit Home ] [ [5]Kermit Home ]
+    ________________________________________________________________________
+
+  CONTENTS
+
+  1. [6]INTRODUCTION
+  2. [7]FILES
+  3. [8]SOURCE CODE PORTABILITY AND STYLE
+  4. [9]MODULES
+     4.A. [10]Group A: Library Routines
+     4.B. [11]Group B: Kermit File Transfer
+     4.C. [12]Group C: Character-Set Conversion
+     4.D. [13]Group D: User Interface
+     4.E. [14]Group E: Platform-Dependent I/O
+     4.F. [15]Group F: Network Support
+     4.G. [16]Group G: Formatted Screen Support
+     4.H. [17]Group H: Pseudoterminal Support
+     4.I. [18]Group I: Security
+  I. [19]APPENDIX I: FILE PERMISSIONS
+    ________________________________________________________________________
+
+  1. INTRODUCTION
+
+   The Kermit Protocol is specified in the book Kermit, A File Transfer
+   Protocol by Frank da Cruz, Digital Press / Butterworth Heinemann,
+   Newton, MA, USA (1987), 379 pages, ISBN 0-932376-88-6. It is assumed
+   the reader is familiar with the Kermit protocol specification.
+
+   This file describes the relationship among the modules and functions
+   of C-Kermit 5A and later, and other programming considerations.
+   C-Kermit is designed to be portable to any kind of computer that has a
+   C compiler. The source code is broken into many files that are grouped
+   according to their function, as shown in the [20]Contents.
+
+   C-Kermit has seen constant development since 1985. Throughout its
+   history, there has been a neverending tug-of-war among:
+
+    a. Functionality: adding new features, fixing bugs, improving
+       performance.
+    b. Adding support for new platforms.
+    c. "Buzzword 1.0 compliance".
+
+   The latter category is the most frustrating, since it generally
+   involves massive changes just to keep the software doing what it did
+   before in some new setting: e.g. the K&R-to-ANSIC conversion (which
+   had to be done, of course, without breaking K&R); Y2K (not a big deal
+   in our case); the many and varied UNIX and other API "standards";
+   IPv6.
+
+   [ [21]Contents ] [ [22]C-Kermit ] [ [23]Kermit Home ]
+    ________________________________________________________________________
+
+  2. FILES
+
+   C-Kermit source files begin with the two letters "ck", for example
+   ckutio.c. Filenames are kept short (6.3) for maximum portability and
+   (obviously I hope) do not contain spaces or more than one period. The
+   third character in the name denotes something about the function group
+   and the expected level of portability:
+
+     a     General descriptive material and documentation (text)
+     b     BOO file encoders and decoders (obsolete)
+     c     All platforms with C compilers (*)
+     d     Data General AOS/VS
+     e     Reserved for "ckermit" files, like ckermit.ini, ckermit2.txt
+     f     (reserved)
+     g     (reserved)
+     h     (reserved)
+     i     Commodore Amiga (Intuition)
+     j     (unused)
+     k     (unused)
+     l     Stratus VOS
+     m     Macintosh with Mac OS 1-9
+     n     Microsoft Windows NT/2000/XP
+     o     OS/2 and/or Microsoft Windows 9x/ME/NT/2000/XP
+     p     Plan 9 from Bell Labs
+     q     (reserved)
+     r     DEC PDP-11 with RSTS/E (never used, open for reassigment)
+     s     Atari ST GEMDOS (last supported in version 5A(189))
+     t     DEC PDP-11 with RT-11 (never used, open for reassigment)
+     u     Unix-based operating systems (*)
+     v     VMS and OpenVMS
+     w     Wart (Lex-like preprocessor, platform independent)
+     x     (reserved)
+     y     (reserved)
+     z     (reserved)
+     0-3   (reserved)
+     4     IBM AS/400
+     5-8   (reserved)
+     9     Microware OS-9
+     _     Encryption modules
+
+   (*) In fact there is little distinction between the ckc*.* and cku*.*
+   categories. It would make more sense for all cku*.* modules to be
+   ckc*.* ones, except ckufio.c, ckutio.c, ckucon.c, ckucns.c, and
+   ckupty.c, which truly are specific to Unix. The rest (ckuus*.c,
+   ckucmd.c, etc) are quite portable.
+
+   One hint before proceeding: functions are scattered all over the
+   ckc*.c and cku*.c modules, where function size has begun to take
+   precedence over the desirability of grouping related functions
+   together, the aim being to keep any particular module from growing
+   disproportionately large. The easiest way (in UNIX) to find out in
+   what source file a given function is defined is like this (where the
+   desired function is foo()...):
+
+  grep ^foo\( ck*.c
+
+   This works because the coding convention has been to make function
+   names always start on the left margin with their contents indented,
+   for example:
+
+static char *
+foo(x,y) int x, y; {
+    ...
+}
+
+   Also note the style for bracket placement. This allows
+   bracket-matching text editors (such as EMACS) to help you make sure
+   you know which opening bracket a closing bracket matches, particularly
+   when the opening bracket is above the visible screen, and it also
+   makes it easy to find the end of a function (search for '}' on the
+   left margin).
+
+   Of course EMACS tags work nicely with this format too:
+
+  $ cd kermit-source-directory
+  $ etags ck[cu]*.c
+  $ emacs
+  Esc-X Visit-Tags-Table<CR><CR>
+
+   (but remember that the source file for ckcpro.c is [24]ckcpro.w!)
+
+   Also:
+
+     * Tabs should be set every 8 spaces, as on a VT100.
+     * All lines must no more than 79 characters wide after tab
+       expansion.
+     * Note the distinction between physical tabs (ASCII 9) and the
+       indentation conventions, which are: 4 for block contents, 2 for
+       most other stuff (obviously this is not a portability issue, just
+       style).
+
+   [ [25]Contents ] [ [26]C-Kermit ] [ [27]Kermit Home ]
+    ________________________________________________________________________
+
+  3. SOURCE CODE PORTABILITY AND STYLE
+
+   C-Kermit was designed in 1985 as a platform-independent replacement
+   for the earlier Unix Kermit. c-Kermit's design was expected to promote
+   portability, and judging from the number of platforms to which it has
+   been adapted since then, the model is effective, if not ideal
+   (obviously if we had it all to do over, we'd change a few things). To
+   answer the oft-repeated question: "Why are there so many #ifdefs?",
+   it's because:
+
+     * Many of them are related to feature selection and program size,
+       and so need to be there anyway.
+     * Those that treat compiler, library, platform, header-file, and
+       similar differences have built up over time as hundreds of people
+       all over the world adapted C-Kermit to their particular
+       environments and sent back their changes. There might be more
+       politically-correct ways to achieve portability, but this one is
+       natural and proven. The basic idea is to introduce changes that
+       can be selected by defining a symbol, which, if not defined,
+       leaves the program exactly as it was before the changes.
+     * Although it might be possible to "clean up" the "#ifdef mess",
+       nobody has access to all the hundreds of platforms served by the
+       #ifdefs to check the results.
+
+   And to answer the second-most-oft-repeated question: "Why don't you
+   just use GNU autoconfig / automake / autowhatever instead of
+   hard-coding all those #ifdefs?" Answers:
+
+     * The GNU tools are not available on all the platforms where
+       C-Kermit must be built and I wouldn't necessarily trust them if
+       they were.
+     * Each platform is a moving target, so the tools themselves would
+       need to updated before Kermit could be updated.
+     * It would only add another layer of complexity to an already
+       complex process.
+     * Conversion at this point would not be practical unless there was a
+       way to test the results on all the hundreds of platforms where
+       C-Kermit is supposed to build.
+
+   When writing code for the system-indendent C-Kermit modules, please
+   stick to the following coding conventions to ensure portability to the
+   widest possible variety of C preprocessors, compilers, and linkers, as
+   well as certain network and/or email transports. The same holds true
+   for many of the "system dependent" modules too; particularly the Unix
+   ones, since they must be buildable by a wide variety of compilers and
+   linkers, new and old.
+
+   This list does not purport to be comprehensive, and although some
+   items on it might seem far-fetched, they would not be listed unless I
+   had encountered them somewhere, some time. I wish I had kept better
+   records so I could cite specific platforms and compilers.
+
+     * Try to keep variable and function names unique within 6
+       characters, especially if they are used across modules, since 6 is
+       the maximum for some old linkers (actually, this goes back to
+       TOPS-10 and -20 and other old DEC OS's where C-Kermit never ran
+       anyway; a more realistic maximum is probably somewhere between 8
+       and 16). We know for certain that VAX C has a 31-character max
+       because it complains -- others might not complain, but just
+       silently truncate, thus folding two or more routines/variables
+       into one.
+     * Keep preprocessor symbols unique within 8 characters; that's the
+       max for some preprocessors (sorry, I can't give a specific
+       example, but in 1988 or thereabouts, I had to change character-set
+       symbols like TC_LATIN1 and TC_LATIN2 to TC_1LATIN and TC_2LATIN
+       because the digits were being truncated and ignored on a platform
+       where I actually had to build C-Kermit 5A; unfortunately I didn't
+       note which platform -- maybe some early Ultrix version?)
+     * Don't create preprocessor symbols, or variable or function names,
+       that start with underscore (_). These are usually reserved for
+       internal use by the compiler and header files.
+     * Don't put #include directives inside functions or { blocks }.
+     * Don't use the #if or #elif preprocessor constructions, only use
+       #ifdef, #ifndef, #define, #undef, and #endif.
+     * Put tokens after #endif in comment brackets, e.g.
+       #endif /* FOO */.
+     * Don't indent preprocessor statements - # must always be first char
+       on line.
+     * Don't put whitespace after # in preprocessor statements.
+     * Don't use #pragma, even within #ifdefs -- it makes some
+       preprocessors give up.
+     * Same goes for #module, #if, etc - #ifdefs do NOT protect them.
+     * Don't use logical operators in preprocessor constructions.
+     * Avoid #ifdefs inside argument list to function calls (I can't
+       remember why this one is here, but probably needn't be; we do this
+       all the time).
+     * Always cast strlen() in expressions to int:
+       if ((int)strlen(foo) < x)...
+     * Any variable whose value might exceed 16383 should be declared as
+       long, or if that is not possible, then as unsigned.
+     * Avoid typedefs; they might be portable but they are very confusing
+       and there's no way to test for their presence or absence at
+       compile time. Use preprocessor symbols instead if possible; at
+       least you can test their definitions.
+     * Unsigned long is not portable; use a preprocessor symbol (Kermit
+       uses ULONG for this).
+     * Long long is not portable. If you really need it, be creative.
+     * Similarly 1234LL is not portable, nor almost any other constant
+       modifier other than L.
+     * Unsigned char is not portable, use CHAR (a preprocessor symbol
+       defined in the Kermit header files) and always take precautions
+       against character signage (more about this [28]below).
+     * Don't use initializers with automatic arrays or structs: it's not
+       portable.
+     * Don't use big automatic arrays or structs in functions that might
+       be called recursively; some platforms have fixed-size stacks (e.g.
+       Windows 9x: 256K) and recursive functions crash with stack
+       overflow. Even when there is not a compiler limitation, this
+       causes memory to be consumed without bound, and can end up filling
+       swap space.
+     * Don't assume that struct assignment performs a copy, or that it
+       even exists.
+     * Don't use sizeof to get the size of an array; someone might come
+       along later and and change it from static to malloc'd. Always use
+       a symbol to refer to the array's size.
+     * Don't put prototypes for static functions into header files that
+       are used by modules that don't contain that function; the link
+       step can fail with unresolved references (e.g. on AOS/VS).
+     * Avoid the construction *++p (the order of evaluation varies; it
+       shouldn't but at least one compiler had a bug that made me include
+       this item).
+     * Don't use triple assignments, like a = b = c = 0; (or quadruple,
+       etc). Some compilers generate bad code for these, or crash, etc
+       (some version of DEC C as I recall).
+     * Some compilers don't allow structure members to have the same
+       names as other identifiers. Try to give structure members unique
+       names.
+     * Don't assume anything about order of evaluation in boolean
+       expressions, or that they will stop early if a required condition
+       is not true, e.g.:
+  if (i > 0 && p[i-1] == blah)
+       can still dump core if i == 0 (hopefully this is not true of any
+       modern compiler, but I would not have said this if it did not
+       actually happen somewhere).
+     * Don't have a switch() statement with no cases (e.g. because of
+       #ifdefs); this is a fatal error in some compilers.
+     * Don't put lots of code in a switch case; move it out to a separate
+       function; some compilers run out of memory when presented with a
+       huge switch() statement -- it's not the number of cases that
+       matters; it's the overall amount of code.
+     * Some compilers might also limit the number of switch() cases, e.g.
+       to 254.
+     * Don't put anything between "switch() {" and "case:" -- switch
+       blocks are not like other blocks.
+     * Don't jump into or out of switches.
+     * Don't make character-string constants longer than about 250 bytes.
+       Longer strings should be broken up into arrays of strings.
+     * Don't write into character-string constants (obviously). Even when
+       you know you are not writing past the end; the compiler or linker
+       might have put them into read-only and/or shared memory, and/or
+       coalesced multiple equal constants so if you change one you change
+       them all.
+     * Don't depend on '\r' being carriage return.
+     * Don't depend on '\n' being linefeed or for that matter any SINGLE
+       character.
+     * Don't depend on '\r' and '\n' being different (e.g. as separate
+       switch() cases).
+     * In other words, don't use \n or \r to stand for specific
+       characters; use \012 and \015 instead.
+     * Don't code for "buzzword 1.0 compliance", unless "buzzword" is K&R
+       and "1.0" is the first edition.
+     * Don't use or depend on anything_t (size_t, pid_t, etc), except
+       time_t, without #ifdef protection (time_t is the only one I've
+       found that is accepted everywhere). This is a tough one because
+       the same function might require (say) a size_t arg on one
+       platform, whereas size_t is unheard of on another; or worse, it
+       might require a totally different data type, like int or long or
+       some other typedef'd thing. It has often proved necessary to
+       define a symbol to stand for the type of a particular argument to
+       a particular library or system function to get around this
+       problem.
+     * Don't use or depend on internationalization ("i18n") features,
+       wchar_t, locales, etc, in portable code; they are not portable.
+       Anyway, locales are not the right model for Kermit's
+       multi-character-set support. Kermit does all character-set
+       conversion itself and does not use any external libraries or
+       functions.
+     * In particular, don't use any library functions that deal with wide
+       characters or Unicode in any form. These are not only nonportable,
+       but a constantly shifting target (e.g. the ones in glibc).
+     * Don't make any assumption about signal handler type. It can be
+       void, int, long, or anything else. Always declare signal handlers
+       as SIGTYP (see definition in ckcdeb.h and augment it if necessary)
+       and always use SIGRETURN at exit points from signal handlers.
+     * Signals should always be re-armed to be used again (this barely
+       scratches the surface -- the differences between BSD/V7 and System
+       V and POSIX signal handling are numerous, and some platforms do
+       not even support signals, alarms, or longjmps correctly or at all
+       -- avoid all of this if you can).
+     * On the other hand, don't assume that signals are disarmed after
+       being raised. In some platforms you have to re-arm them, in others
+       they stay armed.
+     * Don't call malloc() and friends from a signal handler; don't do
+       anything but setting integer global variables in a signal handler.
+     * malloc() does not initialize allocated memory -- it never said it
+       did. Don't expect it to be all 0's.
+     * Did You Know: malloc() can succeed and the program can still dump
+       core later when it attempts to use the malloc'd memory? (This
+       happens when allocation is deferred until use and swap space is
+       full.)
+     * memset(), memmove(), and memcpy() are not portable, don't use them
+       without protecting them in ifdefs (we have USE_MEMCPY for this).
+       bzero()/bcopy() too, except we're guaranteed to have
+       bzero()/bcopy() when using the sockets library (not really). See
+       examples in the source.
+     * Don't assume that strncpy() stops on the first null byte -- most
+       versions always copy the number of bytes given in arg 3, padding
+       out with 0's and overwriting whatever was there before. Use
+       C-Kermit ckstrncpy() if you want predictable non-padding behavior,
+       guaranteed NUL-termination, and a useful return code.
+     * DID YOU KNOW.. that some versions of inet_blah() routines return
+       IP addresses in network byte order, while others return them local
+       machine byte order? So passing them to ntohs() or whatever is not
+       always the right thing to do.
+     * Don't use ANSI-format function declarations without #ifdef
+       CK_ANSIC, and always provide an #else for the non-ANSI case.
+     * Use the Kermit _PROTOTYP() macro for declaring function
+       prototypes; it works in both the ANSI and non-ANSI cases.
+     * Don't depend on any other ANSI preprocessor features like
+       "pasting" -- they are often missing or nonoperational.
+     * Don't assume any C++ syntax or semantics.
+     * Don't use // as a comment introducer. C is not C++.
+     * Don't declare a string as "char foo[]" in one module and "extern
+       char * foo" in another, or vice-versa: this causes core dumps.
+     * With compiler makers falling all over themselves trying to outdo
+       each other in ANSI strictness, it has become increasingly
+       necessary to cast EVERYTHING. This is increasingly true for char
+       vs unsigned char. We need to use unsigned chars if we want to deal
+       with 8-bit character sets, but most character- and string-oriented
+       APIs want (signed) char arguments, so explicit casts are
+       necessary. It would be nice if every compiler had a
+       -funsigned-char option (as gcc does), but they don't.
+     * a[x], where x is an unsigned char, can produce a wild memory
+       reference if x, when promoted to an int, becomes negative. Cast it
+       to (unsigned), even though it ALREADY IS unsigned.
+     * Be careful how you declare functions that have char or long
+       arguments; for ANSI compilers you MUST use ANSI declarations to
+       avoid promotion problems, but you can't use ANSI declarations with
+       non-ANSI compilers. Thus declarations of such functions must be
+       hideously entwined in #ifdefs. Example: latter:
+  int                          /*  Put character in server command buffer  */
+  #ifdef CK_ANSIC
+  putsrv(char c)
+  #else
+  putsrv(c) char c;
+  #endif /* CK_ANSIC */
+  /* putsrv */ {
+      *srvptr++ = c;
+      *srvptr = '\0';           /* Make sure buffer is null-terminated */
+      return(0);
+  }
+     * Be careful how you return characters from functions that return
+       int values -- "getc-like functions" -- in the ANSI world. Unless
+       you explicitly cast the return value to (unsigned), it is likely
+       to be "promoted" to an int and have its sign extended.
+     * At least one compiler (the one on DEC OSF/1 1.3) treats "/*" and
+       "*/" within string constants as comment begin and end. No amount
+       of #ifdefs will get around this one. You simply can't put these
+       sequences in a string constant, e.g. "/usr/local/doc/*.*".
+     * Avoid putting multiple macro references on a single line, e.g.:
+  putchar(BS); putchar(SP); putchar(BS)
+
+   This overflows the CPP output buffer of more than a few C
+   preprocessors (this happened, for example, with SunOS 4.1 cc, which
+   evidently has a 1K macro expansion buffer).
+
+   C-Kermit needs constant adjustment to new OS and compiler releases.
+   Every new OS release shuffles header files or their contents, or
+   prototypes, or data types, or levels of ANSI strictness, etc. Every
+   time you make an adjustment to remove a new compilation error, BE VERY
+   CAREFUL to #ifdef it on a symbol unique to the new configuration so
+   that the previous configuration (and all other configurations on all
+   other platforms) remain as before.
+
+   Assume nothing. Don't assume header files are where they are supposed
+   to be, that they contain what you think they contain, that they define
+   specific symbols to have certain values -- or define them at all!
+   Don't assume system header files protect themselves against multiple
+   inclusion. Don't assume that particular system or library calls are
+   available, or that the arguments are what you think they are -- order,
+   data type, passed by reference vs value, etc. Be conservative when
+   attempting to write portable code. Avoid all advanced features.
+
+   If you see something that does not make sense, don't assume it's a
+   mistake -- it might be there for a reason, and changing it or removing
+   is likely to cause compilation, linking, or runtime failures sometime,
+   somewhere. Some huge percentage of the code, especially in the
+   platform-dependent modules, is workarounds for compiler, linker, or
+   API bugs.
+
+   But finally... feel free to violate any or all of these rules in
+   platform-specific modules for environments in which the rules are
+   certain not to apply. For example, in VMS-specific code, it is OK to
+   use #if, because VAX C, DEC C, and VMS GCC all support it.
+
+   [ [29]Contents ] [ [30]C-Kermit ] [ [31]Kermit Home ]
+    ________________________________________________________________________
+
+  3.1. Memory Leaks
+
+   The C language and standard C library are notoriously inadequate and
+   unsafe. Strings are arrays of characters, usually referenced through
+   pointers. There is no native string datatype. Buffers are fixed size,
+   and C provides no runtime bounds checking, thus allowing overwriting
+   of other data or even program code. With the popularization of the
+   Internet, the "buffer exploit" has become a preferred method for
+   hackers to hijack privileged programs; long data strings are fed to a
+   program in hopes that it uses unsafe C library calls such as strcpy()
+   or sprintf() to copy strings into automatic arrays, thus overwriting
+   the call stack, and therefore the routine's return address. When such
+   a hole is discovered, a "string" can be constructed that contains
+   machine code to hijack the program's privileges and penetrate the
+   system.
+
+   This problem is partially addressed by the strn...() routines, which
+   should always be used in preference to their str...() equivalents
+   (except when the copy operation has already been prechecked, or there
+   is a good reason for not using them, e.g. the sometimes undesirable
+   side effect of strncpy() zeroing the remainder of the buffer). The
+   most gaping whole, however, is sprintf(), which performs no length
+   checking on its destination buffer, and is not easy to replace.
+   Although snprintf() routines are starting to appear, they are not yet
+   widespread, and certainly not universal, nor are they especially
+   portable, or even full-featured.
+
+   For these reasons, we have started to build up our own little library
+   of C Library replacements, ckclib.[ch]. These are safe and highly
+   portable primitives for memory management and string manipulation,
+   such as:
+
+   ckstrncpy()
+          Like strncpy but returns a useful value, doesn't zero buffer.
+
+   ckitoa()
+          Opposite of atoi()
+
+   ckltoa()
+          Opposite of atol()
+
+   ckctoa()
+          Returns character as string
+
+   ckmakmsg()
+          Used with ck?to?() as a safe sprintf() replacement for up to 4
+          items
+
+   ckmakxmsg()
+          Like ckmakmsg() but accepts up to 12 items
+
+   More about library functions in [32]Section 4.A.
+
+   [ [33]Contents ] [ [34]C-Kermit ] [ [35]Kermit Home ]
+    ________________________________________________________________________
+
+  3.2. The "char" vs "unsigned char" Dilemma
+
+   This is one of the most aggravating and vexing characteristics of the
+   C language. By design, chars (and char *'s) are SIGNED. But in the
+   modern era, however, we need to process characters that can have (or
+   include) 8-bit values, as in the ISO Latin-1, IBM CP 850, or UTF-8
+   character sets, so this data must be treated as unsigned. But some C
+   compilers (such as those based on the Bell UNIX V7 compiler) do not
+   support "unsigned char" as a data type. Therefore we have the macro or
+   typedef CHAR, which we use when we need chars to be unsigned, but
+   which, unfortunately, resolves itself to "char" on those compilers
+   that don't support "unsigned char". AND SO... We have to do a lot of
+   fiddling at runtime to avoid sign extension and so forth.
+
+   Some modern compilers (e.g. IBM, DEC, Microsoft) have options that say
+   "make all chars be unsigned" (e.g. GCC "-funsigned-char") and we use
+   them when they are available. Other compilers don't have this option,
+   and at the same time, are becoming increasingly strict about type
+   mismatches, and spew out torrents of warnings when we use a CHAR where
+   a char is expected, or vice versa. We fix these one by one using
+   casts, and the code becomes increasingly ugly. But there remains a
+   serious problem, namely that certain library and kernel functions have
+   arguments that are declared as signed chars (or pointers to them),
+   whereas our character data is unsigned. Fine, we can can use casts
+   here too -- but who knows what happens inside these routines.
+
+   [ [36]Contents ] [ [37]C-Kermit ] [ [38]Kermit Home ]
+    ________________________________________________________________________
+
+  4. MODULES
+
+   When C-Kermit is on the far end of a connection, it is said to be in
+   remote mode. When C-Kermit has made a connection to another computer,
+   it is in local mode. (If C-Kermit is "in the middle" of a multihop
+   connection, it is still in local mode.)
+
+   On another axis, C-Kermit can be in any of several major states:
+
+   Command State
+          Reading and writing from the job's controlling terminal or
+          "console". In this mode, all i/o is handled by the Group E
+          conxxx() (console i/o) routines.
+
+   Protocol State
+          Reading and writing from the communicatons device. In this
+          mode, all i/o is handled by the Group E ttxxx() (terminal i/o)
+          routines.
+
+   Terminal State
+          Reading from the keyboard with conxxx() routines and writing to
+          the communications device with ttxxx() routines AND vice-versa.
+
+   When in local mode, the console and communications device are
+   distinct. During file transfer, Kermit may put up a file-transfer
+   display on the console and sample the console for interruption
+   signals.
+
+   When in remote mode, the console and communications device are the
+   same, and therefore there can be no file-transfer display on the
+   console or interruptions from it (except for "in-band" interruptions
+   such as ^C^C^C).
+
+   [ [39]Contents ] [ [40]C-Kermit ] [ [41]Kermit Home ]
+    ________________________________________________________________________
+
+  4.A. Group A: Library Functions
+
+   Library functions, strictly portable, can be used by all modules on
+   all platforms: [42]ckclib.h, [43]ckclib.c.
+
+   (To be filled in... For now, see [44]Section 3.1 and the comments in
+   ckclib.c.)
+
+   [ [45]Contents ] [ [46]C-Kermit ] [ [47]Kermit Home ]
+    ________________________________________________________________________
+
+  4.B. Group B: Kermit File Transfer
+
+   The Kermit protocol kernel. These files, whose names start with "ckc
+   are supposed to be totally portable C, and are expected to compile
+   correctly on any platform with any C compiler. "Portable" does not
+   mean the same as as "ANSI" -- these modules must compile on 10- and
+   20-year old computers, with C preprocessors, compilers, and/or linkers
+   that have all sorts of restrictions. The Group B modules do not
+   include any header files other than those that come with Kermit
+   itself. They do not contain any library calls except from the standard
+   C library (e.g. printf()). They most certainly do not contain any
+   system calls. Files:
+
+   [48]ckcsym.h
+          For use by C compilers that don't allow -D on the command line.
+
+   [49]ckcasc.h
+          ASCII character symbol definitions.
+
+   [50]ckcsig.h
+          System-independent signal-handling definitions and prototypes.
+
+   [51]ckcdeb.h
+          Originally, debugging definitions. Now this file also contains
+          all definitions and prototypes that are shared by all modules
+          in all groups.
+
+   [52]ckcker.h
+          Kermit protocol symbol definitions.
+
+   [53]ckcxla.h
+          Character-set-related symbol definitions (see next section).
+
+   [54]ckcmai.c
+          The main program. This module contains the declarations of all
+          the protocol-related global variables that are shared among the
+          other modules.
+
+   [55]ckcpro.w
+          The protocol module itself, written in "wart", a lex-like
+          preprocessor that is distributed with Kermit under the name
+          CKWART.C.
+
+   [56]ckcfns.c, [57]ckcfn2.c, [58]ckcfn3.c
+          The protocol support functions used by the protocol module.
+
+   [59]Group B modules may call upon functions from [60]Group E, but not
+   from [61]Group D modules (with the single exception that the main
+   program invokes the user interface, which is in Group D). (This last
+   assertion is really only a conjecture.)
+
+   [ [62]Contents ] [ [63]C-Kermit ] [ [64]Kermit Home ]
+    ________________________________________________________________________
+
+  4.C. Group C: Character-Set Conversion
+
+   Character set translation tables and functions. Used by the [65]Group
+   B, protocol modules, but may be specific to different computers. (So
+   far, all character character sets supported by C-Kermit are supported
+   in [66]ckuxla.c and [67]ckuxla.h, including Macintosh and IBM
+   character sets). These modules should be completely portable, and not
+   rely on any kind of system or library services.
+
+   [68]ckcxla.h
+          Character-set definitions usable by all versions of C-Kermit.
+
+   ck?xla.h
+          Character-set definitions for computer "?", e.g. [69]ckuxla.h
+          for UNIX, [70]ckmxla.h for Macintosh.
+
+   [71]ck?xla
+          Character-set translation tables and functions for computer
+          "?", For example, CKUXLA.C for UNIX, CKMXLA.C for Macintosh. So
+          far, these are the only two such modules. The UNIX module is
+          used for all versions of C-Kermit except the Macintosh version.
+
+   [72]ckcuni.h
+          Unicode definitions
+
+   [73]ckcuni.c
+          Unicode module
+
+   Here's how to add a new file character set in the original
+   (non-Unicode modules). Assuming it is based on the Roman (Latin)
+   alphabet. Let's call it "Barbarian". First, in ck?xla.h, add a
+   definition for FC_BARBA (8 chars maximum length) and increase
+   MAXFCSETS by 1. Then, in ck?xla.c:
+
+     * Add a barbarian entry into the fcsinfo array.
+     * Add a "barbarian" entry to file character set keyword table,
+       fcstab.
+     * Add a "barbarian" entry to terminal character set keyword table,
+       ttcstab.
+     * Add a translation table from Latin-1 to barbarian: yl1ba[].
+     * Add a translation table from barbarian to Latin-1: ybal1[].
+     * Add a translation function from Barbarian to ASCII: xbaas().
+     * Add a translation function from Barbarian to Latin-1: xbal1().
+     * Add a translation function from Latin-1 to Barbarian: xl1ba().
+     * etc etc for each transfer character set...
+     * Add translation function pointers to the xls and xlr tables.
+
+   Other translations involving Barbarian (e.g. from Barbarian to
+   Latin-Cyrillic) are performed through these tables and functions. See
+   ckuxla.h and ckuxla.c for extensive examples.
+
+   To add a new Transfer Character Set, e.g. Latin Alphabet 9 (for the
+   Euro symbol), again in the "old" character-set modules:
+
+   In ckcxla.h:
+
+          + Add a TC_xxxx definition and increase MAXTCSETS accordingly.
+
+   In ck?xla.h (since any transfer charset is also a file charset):
+
+          + Add an FC_xxxx definition and increase MAXFCSETS accordingly.
+
+   In ck?xla.c:
+
+          + Add a tcsinfo[] entry.
+          + Make a tcstab[] keyword table entry.
+          + Make an fcsinfo[] table entry.
+          + Make an fcstab[] keyword table entry.
+          + Make a tcstab[] keyword table entry.
+          + If necessary, make a langinfo[] table entry.
+          + Make entries in the function pointer arrays.
+          + Provide any needed functions.
+
+   As of C-Kermit 7.0, character sets are also handled in parallel by the
+   new (and very large) Unicode module, ckcuni.[ch]. Eventually we should
+   phase out the old way, described just above, and operate entirely in
+   (and through) Unicode. The advantages are many. The disadvantages are
+   size and performance. To add a character to the Unicode modules:
+
+   In ckcuni.h:
+
+          + (To be filled in...)
+
+   In ckcuni.c:
+
+          + (To be filled in...)
+
+   [ [74]Contents ] [ [75]C-Kermit ] [ [76]Kermit Home ]
+    ________________________________________________________________________
+
+  4.D. Group D: User Interface
+
+   This is the code that communicates with the user, gets her commands,
+   informs her of the results. It may be command-line oriented,
+   interactive prompting dialog, menus and arrow keys, windows and mice,
+   speech recognition, telepathy, etc. The one provided is command-and
+   prompt, with the ability to read commands from various sources: the
+   console keyboard, a file, or a macro definition. The user interface
+   has three major functions:
+
+    1. Sets the parameters for the file transfer and then starts it. This
+       is done by setting certain (many) global variables, such as the
+       protocol machine start state, the file specification, file type,
+       communication parameters, packet length, window size, character
+       set, etc.
+    2. Displays messages on the user's screen during the file transfer,
+       using the screen() function, which is called by the group-1
+       modules.
+    3. Executes any commands directly that do not require Kermit
+       protocol, such as the CONNECT command, local file management
+       commands, parameter-setting commands, FTP client commands, etc.
+
+   If you plan to imbed the [77]Group B, files into a program with a
+   different user interface, your interface must supply an appropriate
+   screen() function, plus a couple related ones like chkint() and
+   intmsg() for handling keyboard (or mouse, etc) interruptions during
+   file transfer. The best way to find out about this is to link all the
+   C-Kermit modules together except the ckuu*.o and ckucon.o modules, and
+   see which missing symbols turn up.
+
+   C-Kermit's character-oriented user interface (as opposed to the
+   Macintosh version's graphical user interface) consists of the
+   following modules. C-Kermit can be built with an interactive command
+   parser, a command-line-option-only parser, a graphical user interface,
+   or any combination, and it can even be built with no user interface at
+   all (in which case it runs as a remote-mode Kermit server).
+
+   [78]ckucmd.h
+   [79]ckucmd.c
+          The command parsing primitives used by the interactive command
+          parser to parse keywords, numbers, filenames, etc, and to give
+          help, complete fields, supply defaults, allow abbreviations and
+          editing, etc. This package is totally independent of Kermit,
+          but does depend on the [80]Group E functions.
+
+   [81]ckuusr.h
+          Definitions of symbols used in Kermit's commands.
+
+   ckuus*.c
+          Kermit's interactive command parser, including the script
+          programming language: [82]ckuusr.c (includes top-level keyword
+          tables); [83]ckuus2.c (HELP command text); [84]ckuus3.c (most
+          of the SET command); [85]ckuus4.c (includes variables and
+          functions); ckuus[567].c (miscellaneous);
+
+   [86]ckuusy.c
+          The command-line-option parser.
+
+   [87]ckuusx.c
+          User interface functions common to both the interactive and
+          command-line parsers.
+
+   [88]ckuver.h
+          Version heralds for different implementations.
+
+   [89]ckuscr.c
+          The (old, uucp-like) SCRIPT command
+
+   [90]ckudia.c
+          The DIAL command. Includes specific knowledge of many types of
+          modems.
+
+   Note that none of the above files is actually Unix-specific. Over time
+   they have proven to be portable among all platforms where C-Kermit is
+   built: Unix, VMS, AOS/VS, Amiga, OS-9, VOS, etc etc. Thus the third
+   letter should more properly be "c", but changing it would be too
+   confusing.
+
+   ck?con.c, ckucns.c
+          The CONNECT command. Terminal connection, and in some cases
+          (Macintosh, Windows) also terminal emulation. NOTE: As of
+          C-Kermit 7.0, there are two different CONNECT modules for UNIX:
+          [91]ckucon.c -- the traditional, portable, fork()-based version
+          -- and [92]ckucns.c, a new version that uses select() rather
+          than forks so it can handle encryption. ckucns.c is the
+          preferred version for Unix; ckucon.c is not likely to keep pace
+          with it in terms of upgrades, etc. However, since select() is
+          not portable to every platform, ckucon.c will be kept
+          indefinitely for those platforms that can't use ckucns.c. NOTE:
+          SunLink X.25 support is available only in ckucon.c.
+
+   ck_*.*, ckuat*.*
+          Modules having to do with authentication and encryption. Since
+          the relaxation of USA export laws, they are included with the
+          general source-code distribution. Secure C-Kermit binaries can
+          be built using special targets in the standard makefile.
+          However, secure prebuilt binaries may not be distributed.
+
+   For other implementations, the files may, and probably do, have
+   different names. For example, the Macintosh graphical user interface
+   filenames start with "ckm". Kermit 95 uses the ckucmd and ckuus*
+   modules, but has its own CONNECT command modules. And so on.
+
+   Here is a brief description of C-Kermit's "user interface interface",
+   from ckuusr.c. It is nowhere near complete; in particular, hundreds of
+   global variables are shared among the many modules. These should, some
+   day, be collected into classes or structures that can be passed around
+   as needed; not only for purity's sake, but also to allow for multiple
+   simultaneous communication sessions and or user interfaces. Our list
+   of things to do is endless, and reorganizing the source is almost
+   always at the bottom.
+
+   The ckuus*.c modules (like many of the ckc*.c modules) depend on the
+   existence of C library features like fopen, fgets, feof, (f)printf,
+   argv/argc, etc. Other functions that are likely to vary among
+   operating systems -- like setting terminal modes or interrupts -- are
+   invoked via calls to functions that are defined in the [93]Group E
+   platform-dependent modules, ck?[ft]io.c. The command line parser
+   processes any arguments found on the command line, as passed to main()
+   via argv/argc. The interactive parser uses the facilities of the cmd
+   package (developed for this program, but, in theory, usable by any
+   program). Any command parser may be substituted for this one. The only
+   requirements for the Kermit command parser are these:
+
+    1. Set parameters via global variables like duplex, speed, ttname,
+       etc. See [94]ckcmai.c for the declarations and descriptions of
+       these variables.
+    2. If a command can be executed without the use of Kermit protocol,
+       then execute the command directly and set the sstate (start state)
+       variable to 0. Examples include SET commands, local directory
+       listings, the CONNECT command.
+    3. If a command requires the Kermit protocol, set the following
+       variables:
+ sstate                             string data
+   'x' (enter server mode)            (none)
+   'r' (send a 'get' command)         cmarg, cmarg2
+   'v' (enter receive mode)           cmarg2
+   'g' (send a generic command)       cmarg
+   's' (send files)                   nfils, cmarg & cmarg2 OR cmlist
+   'c' (send a remote host command)   cmarg
+
+       cmlist is an array of pointers to strings.
+       cmarg, cmarg2 are pointers to strings.
+       nfils is an integer (hmmm, probably should be an unsigned long).
+
+        cmarg can be:
+                A filename string (possibly wild), or:
+                a pointer to a prefabricated generic command string, or:
+                a pointer to a host command string.
+
+        cmarg2 is:
+                The name to send a single file under, or:
+                the name under which to store an incoming file; must not
+                be wild.
+                If it's the name for receiving, a null value means to
+                store the file under the name it arrives with.
+
+        cmlist is:
+                A list of nonwild filenames, such as passed via argv.
+
+        nfils is an integer, interpreted as follows:
+                -1: filespec (possibly wild) in cmarg, must be expanded
+                internally.
+                0: send from stdin (standard input).
+                >0: number of files to send, from cmlist.
+
+   The screen() function is used to update the screen during file
+   transfer. The tlog() function writes to a transaction log (if TLOG is
+   defined). The debug() function writes to a debugging log (if DEBUG is
+   defined). The intmsg() and chkint() functions provide the user i/o for
+   interrupting file transfers.
+
+   [ [95]Contents ] [ [96]C-Kermit ] [ [97]Kermit Home ]
+    ________________________________________________________________________
+
+  4.E. Group E: Platform-Dependent I/O
+
+   Platform-dependent function definitions. All the Kermit modules,
+   including the command package, call upon these functions, which are
+   designed to provide system-independent primitives for controlling and
+   manipulating devices and files. For Unix, these functions are defined
+   in the files [98]ckufio.c (files), [99]ckutio.c (communications), and
+   [100]ckusig.c (signal handling).
+
+   For VMS, the files are [101]ckvfio.c, ckvtio.c, and [102]ckusig.c (VMS
+   can use the same signal handling routines as Unix). It doesn't really
+   matter what the files are called, except for Kermit distribution
+   purposes (grouping related files together alphabetically), only that
+   each function is provided with the name indicated, observes the same
+   calling and return conventions, and has the same type.
+
+   The Group E modules contain both functions and global variables that
+   are accessed by modules in the other groups. These are now described.
+
+   (By the way, I got this list by linking all the C-Kermit modules
+   together except ckutio and ckufio. These are the symbols that ld
+   reported as undefined. But that was a long time ago, probably circa
+   Version 6.)
+
+  4.E.1. Global Variables
+
+   char *DELCMD;
+          Pointer to string containing command for deleting files.
+          Example: char *DELCMD = "rm -f "; (UNIX)
+          Example: char *DELCMD = "delete "; (VMS)
+          Note trailing space. Filename is concatenated to end of this
+          string. NOTE: DELCMD is used only in versions that do not
+          provide their own built-in DELETE command.
+
+   char *DIRCMD;
+          Pointer to string containing command for listing files when a
+          filespec is given.
+          Example: char *DIRCMD = "/bin/ls -l "; (UNIX)
+          Example: char *DIRCMD = "directory "; (VMS)
+          Note trailing space. Filename is concatenated to end of this
+          string. NOTE: DIRCMD is used only in versions that do not
+          provide their own built-in DIRECTORY command.
+
+   char *DIRCM2;
+          Pointer to string containing command for listing files when a
+          filespec is not given. (currently not used, handled in another
+          way.)
+          Example: char *DIRCMD2 = "/bin/ls -ld *";
+          NOTE: DIRCMD2 is used only in versions that do not provide
+          their own built-in DIRECTORY command.
+
+   char *PWDCMD;
+          Pointer to string containing command to display current
+          directory.
+          Example: char *PWDCMD = "pwd ";
+          NOTE: PWDCMD is used only in versions that do not provide their
+          own built-in PWD command.
+
+   char *SPACMD;
+          Pointer to command to display free disk space in current
+          device/directory.
+          Example: char *SPACMD = "df .";
+          NOTE: SPACMD is used only in versions that do not provide their
+          own built-in SPACE command.
+
+   char *SPACM2;
+          Pointer to command to display free disk space in another
+          device/directory.
+          Example: char *SPACM2 = "df ";
+          Note trailing space. Device or directory name is added to this
+          string. NOTE: SPACMD2 is used only in versions that do not
+          provide their own built-in SPACE command.
+
+   char *TYPCMD;
+          Pointer to command for displaying the contents of a file.
+          Example: char *TYPCMD = "cat ";
+          Note trailing space. Device or directory name is added to this
+          string. NOTE: TYPCMD is used only in versions that do not
+          provide their own built-in TYPE command.
+
+   char *WHOCMD;
+          Pointer to command for displaying logged-in users.
+          Example: char *WHOCMD = "who ";
+          Note trailing space. Specific user name may be added to this
+          string.
+
+   int backgrd = 0;
+          Flag for whether program is running in foreground (0) or
+          background (nonzero). Background operation implies that screen
+          output should not be done and that all errors should be fatal.
+
+   int ckxech;
+          Flag for who is to echo console typein:
+          1: The program (system is not echoing).
+          0: The OS, front end, terminal, etc (not this program).
+
+   char *ckxsys;
+          Pointer to string that names the computer and operating system.
+          Example: char *ckxsys = " NeXT Mach 1.0";
+          Tells what computer system ckxv applies to. In UNIX Kermit,
+          this variable is also used to print the program herald, and in
+          the SHOW VERSION command.
+
+   char *ckxv;
+          Pointer to version/edit info of ck?tio.c module.
+          Example: char *ckxv = "UNIX Communications Support, 6.0.169, 6
+          Sep 96";
+          Used by SHOW VERSION command.
+
+   char *ckzsys;
+          Like ckxsys, but briefer.
+          Example: char *ckzsys = " 4.3 BSD";
+          Tells what platform ckzv applies to. Used by the SHOW VERSION
+          command.
+
+   char *ckzv;
+          Pointer to version/edit info of ck?fio.c module.
+          Example: char *ckzv = "UNIX File support, 6.0.113, 6 Sep 96";
+          Used by SHOW VERSION command.
+
+   int dfflow;
+          Default flow control. 0 = none, 1 = Xon/Xoff, ... (see FLO_xxx
+          symbols in ckcdeb.h)
+          Set by Group E module. Used by [103]ckcmai.c to initialize flow
+          control variable.
+
+   int dfloc;
+          Default location. 0 = remote, 1 = local. Set by Group E module.
+          Used by ckcmai.c to initialize local variable. Used in various
+          places in the user interface.
+
+   int dfprty;
+          Default parity. 0 = none, 'e' = even, 'o' = odd, 'm' = mark,
+          's' = space. Set by Group E module. Used by ckcmai.c to
+          initialize parity variable.
+
+   char *dftty;
+          Default communication device. Set by Group E module. Used in
+          many places. This variable should be initialized the the symbol
+          CTTNAM, which is defined in ckcdeb.h, e.g. as "/dev/tty" for
+          UNIX, "TT:" for VMS, etc. Example: char *dftty = CTTNAM;
+
+   char *mtchs[];
+          Array of string pointers to filenames that matched the most
+          recent wildcard match, i.e. the most recent call to zxpand().
+          Used (at least) by command parsing package for partial filename
+          completion.
+
+   int tilde_expand;
+          Flag for whether to attempt to expand leading tildes in
+          directory names (used in UNIX only, and then only when the
+          symbol DTILDE is defined.
+
+   int ttnproto;
+          The protocol being used to communicate over a network device.
+          Values are defined in ckcnet.h. Example: NP_TELNET is network
+          protocol "telnet".
+
+   int maxnam;
+          The maximum length for a filename, exclusive of any device or
+          directory information, in the format of the host operating
+          system.
+
+   int maxpath;
+          The maximum length for a fully specified filename, including
+          device designator, directory name, network node name, etc, in
+          the format of the host operating system, and including all
+          punctuation.
+
+   int ttyfd;
+          File descriptor of the communication device. -1 if there is no
+          open or usable connection, including when C-Kermit is in remote
+          mode. Since this is not implemented everywhere, references to
+          it are in #ifdef CK_TTYFD..#endif.
+
+   [ [104]Contents ] [ [105]C-Kermit ] [ [106]Kermit Home ]
+    ________________________________________________________________________
+
+  4.E.2. Functions
+
+   These are divided into three categories: file-related functions (B.1),
+   communication functions (B.2), and miscellaneous functions (B.3).
+
+    4.E.2.1. File-Related Functions
+
+   In most implementations, these are collected together into a module
+   called ck?fio.c, where ? = "u" ([107]ckutio.c for Unix), "v"
+   ([108]ckvtio.c for VMS), [109]etc. To be totally platform-independent,
+   C-Kermit maintains its own file numbers, and provides the functions
+   described in this section to deal with the files associated with them.
+   The file numbers are referred to symbolically, and are defined as
+   follows in ckcker.h:
+
+  #define ZCTERM      0           /* Console terminal */
+  #define ZSTDIO      1           /* Standard input/output */
+  #define ZIFILE      2           /* Current input file for SEND command */
+  #define ZOFILE      3           /* Current output file for RECEIVE command */
+  #define ZDFILE      4           /* Current debugging log file */
+  #define ZTFILE      5           /* Current transaction log file */
+  #define ZPFILE      6           /* Current packet log file */
+  #define ZSFILE      7           /* Current session log file */
+  #define ZSYSFN      8           /* Input from a system function (pipe) */
+  #define ZRFILE      9           /* Local file for READ command */  (NEW)
+  #define ZWFILE     10           /* Local file for WRITE command */ (NEW)
+  #define ZMFILE     11           /* Auxilliary file for internal use */ (NEW)
+  #define ZNFILS     12           /* How many defined file numbers */
+
+   In the descriptions below, fn refers to a filename, and n refers to
+   one of these file numbers. Functions are of type int unless otherwise
+   noted, and are listed mostly alphabetically.
+
+   int
+          chkfn(n) int n;
+          Checks the file number n. Returns:
+           -1: File number n is out of range
+            0: n is in range, but file is not open
+            1: n in range and file is open
+
+   int
+          iswild(filspec) char *filespec;
+          Checks if the file specification is "wild", i.e. contains
+          metacharacters or other notations intended to match multiple
+          filenames. Returns:
+            0: not wild
+            1: wild.
+
+   int
+          isdir(string) char *string;
+          Checks if the string is the name of an existing directory. The
+          idea is to check whether the string can be "cd'd" to, so in
+          some cases (e.g. DOS) it might also indicate any file
+          structured device, such as a disk drive (like A:). Other
+          nonzero returns indicate system-dependent information; e.g. in
+          VMS isdir("[.FOO]") returns 1 but isdir("FOO.DIR;1") returns 2
+          to indicate the directory-file name is in a format that needs
+          conversion before it can be combined with a filename. Returns:
+            0: not a directory (including any kind of error)
+            1: it is an existing directory
+
+   char *
+          zfcdat(name) char *name;
+          Returns modification (preferably, otherwise creation) date/time
+          of file whose name is given in the argument string. Return
+          value is a pointer to a string of the form yyyymmdd hh:mm:ss,
+          for example 19931231 23:59:59, which represents the local time
+          (no timezone or daylight savings time finagling required).
+          Returns the null string ("") on failure. The text pointed to by
+          the string pointer might be in a static buffer, and so should
+          be copied to a safe place by the caller before any subsequent
+          calls to this function.
+
+   struct zfnfp *
+          zfnqfp(fn, buflen, buf) char * fn; int buflen; char * buf;
+          Given the filename fn, the corresponding fully qualified,
+          absolute filename is placed into the buffer buf, whose length
+          is buflen. On failure returns a NULL pointer. On success
+          returns a pointer to a struct zfnfp containing pointers to the
+          full pathname and to just the filename, and an int giving the
+          length of the full pathname. All references to this function in
+          mainline code must be protected by #ifdef ZFNQFP..#endif,
+          because it is not present in all of the ck*fio.c modules. So if
+          you implement this function in a version that did not have it
+          before, be sure to add #define ZFNQFP in the appropriate spot
+          in ckcdeb.h or in the build-procedure CFLAGS.
+
+   int
+          zcmpfn(s1,s2) char * s2, * s2;
+          Compares two filenames to see if they refer to the same.
+          Internally, the arguments can be converted to fully qualified
+          pathnames, e.g. with zfnqfp(), realpath(), or somesuch. In Unix
+          or other systems where symbolic links exist, the link should be
+          resolved before making the comparison or looking at the inodes.
+          Returns:
+            0: Files are not identical.
+            1: Files are identical.
+
+   int
+          zfseek(pos) long pos;
+          Positions the input pointer on the current input file to the
+          given position. The pos argument is 0-based, the offset
+          (distance in bytes) from beginning of the file. Needed for
+          RESEND, PSEND, and other recovery operations. This function is
+          not necessarily possible on all systems, e.g. record-oriented
+          systems. It should only be used on binary files (i.e. files we
+          are sending in binary mode) and stream-oriented file systems.
+          Returns:
+           -1: on failure.
+            0: On success.
+
+   int
+          zchdir(dirnam) char *dirnam;
+          Changes current or default directory to the one given in
+          dirnam. Returns:
+            0: On failure.
+            1: on success.
+
+   long
+          zchki(fn) char *fn;
+          Check to see if file with name fn is a regular, readable,
+          existing file, suitable for Kermit to send -- not a directory,
+          not a symbolic link, etc. Returns:
+           -3: if file exists but is not accessible (e.g.
+          read-protected);
+           -2: if file exists but is not of a readable type (e.g. a
+          directory);
+           -1: on error (e.g. file does not exist, or fn is garbage);
+          >=0: (length of file) if file exists and is readable.
+          Also see isdir(), zgetfs().
+
+   int
+          zchkpid(pid) unsigned long pid;
+          Returns:
+            1: If the given process ID (e.g. pid in UNIX) is valid and
+          active
+            0: otherwise.
+
+   long
+          zgetfs(fn) char *fn;
+          Gets the size of the given file, regardless of accessibility.
+          Used for directory listings. Unlike zchki(), should return the
+          size of any kind of file, even a directory. zgetfs() also
+          should serve as a mini "get file info" function that can be
+          used until we design a better one, by also setting some global
+          variables:
+            int zgfs_link   = 1/0 = file is (not) a symbolic link.
+            int zgfs_dir    = 1/0 = file is (not) a directory.
+            char linkname[] = if zgfs_link != 0, name of file link points
+          to.
+          Returns:
+           -1: on error (e.g. file does not exist, or fn is garbage);
+          >=0: (length of file) if file exists and is readable.
+
+   int
+          zchko(fn) char *fn;
+          Checks to see if a file of the given name can be created.
+          Returns:
+           -1: if file cannot be created, or on any kind of error.
+            0: if file can be created.
+
+   int
+          zchkspa(fn,len) char *f; long len;
+          Checks to see if there is sufficient space to store the file
+          named fn, which is len bytes long. If you can't write a
+          function to do this, then just make a dummy that always returns
+          1; higher level code will recover from disk-full errors. The
+          receiving Kermit uses this function to refuse an incoming file
+          based on its size, via the attribute mechanism. Returns:
+           -1: on error.
+            0: if there is not enough space.
+            1: if there is enough space.
+
+   int
+          zchin(n,c) int n; int *c;
+          Gets a character from file number n, return it in c (call with
+          &c). Returns:
+           -1: on failure, including EOF.
+            0: on success with character in c.
+
+   int
+          zchout(n,c) int n; char c;
+          Writes the character c to file number n. Returns:
+           -1: on error.
+            0: on success.
+
+   int
+          zclose(n) int n;
+          Closes file number n. Returns:
+           -1: on error.
+            1: on success.
+
+   int
+          zdelet(fn) char *name;
+          Attempts to delete (remove, erase) the named file. Returns:
+           -1: on error.
+            1: if file was deleted successfully.
+
+   char *
+          zgperm(char * f)
+          Returns a pointer to the system-dependent numeric
+          permissions/protection string for file f, or NULL upon failure.
+          Used if CK_PERMS is defined.
+
+   char *
+          ziperm(char * f)
+          Returns a pointer to the system-dependent symbolic
+          permissions/protection string for file f, or NULL upon failure.
+          Used if CK_PERMS is defined. Example: In UNIX zgperm(f) might
+          return "100770", but ziperm() might return "-rwxrwx---". In
+          VMS, zgperm() would return a hexadecimal string, but ziperm()
+          would return something like "(RWED,RWED,RE,)".
+
+   char *
+          zgtdir()
+          Returns a pointer to the name of the current directory, folder,
+          etc, or a NULL pointer if the current directory cannot be
+          determined. If possible, the directory specification should be
+          (a) fully specified, e.g. as a complete pathname, and (b) be
+          suitable for appending a filename. Thus, for example, Unix
+          directory names should end with '/'. VMS directory names should
+          look like DEV:[NAME] (rather than, say, NAME.DIR;1).
+
+   char *
+          zhome()
+          Returns a pointer to a string containing the user's home
+          directory, or NULL upon error. Should be formatted like
+          zgtdir() (q.v.).
+
+   int
+          zinfill()
+          Fill buffer from input file. This function is used by the macro
+          zminchar(), which is defined in ckcker.h. zminchar() manages
+          its own buffer, and calls zinfill() to fill it whenever it
+          becomes empty. It is used only for sending files, and reads
+          characters only from file number ZIFILE. zinfill() returns -1
+          upon end of file, -2 upon fatal error, and -3 upon timeout
+          (e.g. when reading from a pipe); otherwise it returns the first
+          character from the buffer it just read.
+
+   int
+          zkself()
+          Kills the current job, session, process, etc, logs out,
+          disappears. Used by the Kermit server when it receives a BYE
+          command. On failure, returns -1. On success, does not return at
+          all! This function should not be called until all other steps
+          have been taken to close files, etc.
+
+   VOID
+          zstrip(fn,&fn2) char *fn1, **fn2;
+          Strips device and directory, etc, from file specification fn,
+          leaving only the filename (including "extension" or "filetype"
+          -- the part after the dot). For example DUA0:[PROGRAMS]OOFA.C;3
+          becomes OOFA.C, or /usr/fdc/oofa.c becomes oofa.c. Returns a
+          pointer to result in fn2.
+
+   int
+          zsetperm(char * file, unsigned int code)
+          Set permissions of file to given system-dependent code.   0: On
+          failure.
+            1: on success.
+
+   int
+          zsetroot(char * dir)
+          Sets the root for the user's file access, like Unix chroot(),
+          but does not require privilege. In Unix, this must be
+          implemented entirely by Kermit's own file access routines.
+          Returns:
+            1: Success
+           -1: Invalid argument
+           -2:
+           -3: Internal error
+           -4: Access to given directory denied
+           -5: New root not within old root
+
+   int
+          zinroot(char * file)
+          If no root is set (zsetroot()), returns 1.
+          Otherwise, if given file is in the root, returns 1.
+          Otherwise, returns 0.
+
+   VOID
+          zltor(fn,fn2) char *fn1, *fn2;
+          Local-To-Remote filename translation. OBSOLETE: replaced by
+          nzltor() (q.v.). Translates the local filename fn into a format
+          suitable for transmission to an arbitrary type of computer, and
+          copies the result into the buffer pointed to by fn2.
+          Translation may involve (a) stripping the device and/or
+          directory/path name, (b) converting lowercase to uppercase, (c)
+          removing spaces and strange characters, or converting them to
+          some innocuous alphabetic character like X, (d) discarding or
+          converting extra periods (there should not be more than one).
+          Does its best. Returns no value. name2 is a pointer to a
+          buffer, furnished by the caller, into which zltor() writes the
+          resulting name. No length checking is done.
+
+   #ifdef NZLTOR
+          VOID
+          nzltor(fn,fn2,convert,pathnames,max) char *fn1,*fn2; int
+          convert,pathnames,max;
+          Replaces zltor(). This new version handles pathnames and checks
+          length. fn1 and fn2 are as in zltor(). This version is called
+          unconditionally for each file, rather than only when filename
+          conversion is enabled. Pathnames can have the following values:
+
+            PATH_OFF: Pathname, if any, is to be stripped
+            PATH_REL: The relative pathname is to be included
+            PATH_ABS: The full pathname is to be included
+
+          After handling pathnames, conversion is done to the result as
+          in the zltor() description if convert != 0; if relative or
+          absolute pathnames are included, they are converted to UNIX
+          format, i.e. with slash (/) as the directory separator. The max
+          parameter specifies the maximum size of fn2. If convert > 0,
+          the regular conversions are done; if convert < 0, minimal
+          conversions are done (we skip uppercasing the letters, we allow
+          more than one period, etc; this can be used when we know our
+          partner is UNIX or similar).
+
+   #endif /* NZLTOR */
+
+   int
+          nzxpand(fn,flags) char *fn; int flags;
+          Replaces zxpand(), which is obsolete as of C-Kermit 7.0.
+          Call with:
+            fn = Pointer to filename or pattern.
+            flags = option bits:
+              flags & ZX_FILONLY  Match regular files
+              flags & ZX_DIRONLY  Match directories
+              flags & ZX_RECURSE  Descend through directory tree
+              flags & ZX_MATCHDOT Match "dot files"
+              flags & ZX_NOBACKUP Don't match "backup files"
+              flags & ZX_NOLINKS  Don't follow symlinks.
+
+          Returns the number of files that match fn, with data structures
+          set up so the first file (if any) will be returned by the next
+          znext() call. If ZX_FILONLY and ZX_DIRONLY are both set, or
+          neither one is set, files and directories are matched. Notes:
+
+         1. It is essential that the number returned by nzxpand() reflect
+            the actual number of filenames that will be returned by
+            znext() calls. In other words:
+  for (n = nzxpand(string,flags); n > 0; n--) {
+      znext(buf);
+      printf("%s\n", buf);
+  }
+            should print all the file names; no more, no less.
+         2. In UNIX, DOS, OS-9, etc, where directories contain entries
+            for themselves (.) and the superior directory (..), these
+            should NOT be included in the list under any circumstances,
+            including when ZX_MATCHDOT is set.
+         3. Additional option bits might be added in the future, e.g. for
+            sorting (sort by date/name/size, reverse/ascending, etc).
+            Currently this is done only in higher level code (through a
+            hack in which the nzxpand() exports its filename array, which
+            is not portable because not all OS's can use this mechanism).
+
+   int
+          zmail(addr,fn) char *addr, fn;
+          Send the local, existing file fn as e-mail to the address addr.
+          Returns:
+            0: on success
+            2: if mail delivered but temp file can't be deleted
+           -2: if mail can't be delivered
+
+   int
+          zmkdir(path) char *path;
+          The path can be a file specification that might contain
+          directory information, in which the filename is expected to be
+          included, or an unambiguous directory specification (e.g. in
+          UNIX it must end with "/"). This routine attempts to create any
+          directories in the given path that don't already exist. Returns
+          0 or greater success: no directories needed creation, or else
+          all directories that needed creation were created successfully;
+          the return code is the number of directories that were created.
+          Returns -1 on failure to create any of the needed directories.
+
+   int
+          zrmdir(path) char *path;
+          Attempts to remove the given directory. Returns 0 on success,
+          -1 on failure. The detailed semantics are open -- should it
+          fail if the directory contains any files or subdirectories,
+          etc. It is probably best for this routine to behave in whatever
+          manner is customary on the underlying platform; e.g. in UNIX,
+          VMS, DOS, etc, where directories can not be removed unless they
+          are empty.
+
+   VOID
+          znewn(fn,s) char *fn, **s;
+          Transforms the name fn into a filename that is guaranteed to be
+          unique. If the file fn does not exist, then the new name is the
+          same as fn; Otherwise, it's different. this function does its
+          best, returns no value. New name is created in caller's space.
+          Call like this: znewn(old,&new);. The second parameter is a
+          pointer to the new name. This pointer is set by znewn() to
+          point to a static string in its own space, so be sure to the
+          result to a safe place before calling this function again.
+
+   int
+          znext(fn) char *fn;
+          Copies the next file name from a file list created by zxpand()
+          into the string pointed to by fn (see zxpand). If no more
+          files, then the null string is placed there. Returns 0 if there
+          are no more filenames, with 0th element the array pointed to by
+          fn set to NUL. If there is a filename, it is stored in the
+          array pointed to by fn and a positive number is returned. NOTE:
+          This is a change from earlier definitions of this function
+          (pre-1999), which returned the number of files remaining; thus
+          0 was the return value when returning the final file. However,
+          no mainline code ever depended on the return value, so this
+          change should be safe.
+
+   int
+          zopeni(n,fn) int n; char *fn;
+          Opens the file named fn for input as file number n. Returns:
+            0: on failure.
+            1: on success.
+
+   int
+          zopeno(n,fn,zz,fcb) int n; char *name; struct zattr *zz; struct
+          filinfo *fcb;
+          Attempts to open the named file for output as file number n. zz
+          is a Kermit file attribute structure as defined in ckcdeb.h,
+          containing various information about the file, including its
+          size, creation date, and so forth. This function should attempt
+          to honor as many of these as possible. fcb is a "file control
+          block" in the traditional sense, defined in ckcdeb.h,
+          containing information relevant to complicated file systems
+          like VMS (RMS), IBM MVS, etc, like blocksize, record length,
+          organization, record format, carriage control, etc. Returns:
+            0: on failure.
+            1: on success.
+
+   int
+          zoutdump()
+          Dumps a file output buffer. Used with the macro zmchout()
+          defined in ckcker.h. Used only with file number ZOFILE, i.e.
+          the file that is being received by Kermit during file transfer.
+          Returns:
+           -1: on failure.
+            0: on success.
+
+   int
+          zprint(p,fn) char *p, *f;
+          Prints the file with name fn on a local printer, with options
+          p. Returns:
+            0: on success
+            3: if file sent to printer but can't be deleted
+           -3: if file can't be printed
+
+   int
+          zrename(fn,fn2) char *fn, *fn2;
+          Changes the name of file fn to fn2. If fn2 is the name of an
+          existing directory, or a file-structured device, then file fn
+          is moved to that directory or device, keeping its original
+          name. If fn2 lacks a directory separator when passed to this
+          function, an appropriate one is supplied. Returns:
+           -1: on failure.
+            0: on success.
+
+   int
+          zcopy(source,dest) char * source, * dest;
+          Copies the source file to the destination. One file only. No
+          wildcards. The destination string may be a filename or a
+          directory name. Returns:
+            0: on success.
+           <0: on failure:
+            -2: source file is not a regular file.
+            -3: source file not found.
+            -4: permission denied.
+            -5: source and destination are the same file.
+            -6: i/o error.
+            -1: other error.
+
+   char *
+          zlocaltime(char *)
+          Call with: "yyyymmdd hh:mm:ss" GMT/UTC date-time. Returns
+          pointer to local date-time string "yyyymmdd hh:mm:ss" on
+          success, NULL on failure.
+
+   VOID
+          zrtol(fn,fn2) char *fn, *fn2;
+          Remote-To-Local filename translation. OBSOLETE: replaced by
+          nzrtol(). Translates a "standard" filename to a local filename.
+          For example, in Unix this function might convert an
+          all-uppercase name to lowercase, but leave lower- or mix-case
+          names alone. Does its best, returns no value. New name is in
+          string pointed to by fn2. No length checking is done.
+
+   #ifdef NZLTOR
+   int
+          nzrtol(fn,fn2,convert,pathnames,max) char *fn1,*fn2; int
+          convert,pathnames,max;
+          Replaces zrtol. Like zrtol but handles pathnames and checks
+          length. See nzltor for detailed description of parameters.
+
+   #endif /* NZLTOR */
+
+   int
+          zsattr(xx) struct zattr *xx;
+          Fills in a Kermit file attribute structure for the file which
+          is to be sent, namely the currently open ZIFILE. Note that this
+          is not a very good design, but we're stuck with it. Callers
+          must ensure that zsattr() is called only on real files, not on
+          pipes, internally generated file-like objects such as server
+          REMOTE command responses, etc. Returns:
+           -1: on failure.
+            0: on success with the structure filled in.
+          If any string member is null, it should be ignored by the
+          caller.
+          If any numeric member is -1, it should be ignored by the
+          caller.
+
+   int
+          zshcmd(s) char *s;
+          s contains to pointer to a command to be executed by the host
+          computer's shell, command parser, or operating system. If the
+          system allows the user to choose from a variety of command
+          processors (shells), then this function should employ the
+          user's preferred shell. If possible, the user's job
+          (environment, process, etc) should be set up to catch keyboard
+          interruption signals to allow the user to halt the system
+          command and return to Kermit. The command must run in ordinary,
+          unprivileged user mode. If possible, this function should
+          return -1 on failure to start the command, or else it should
+          return 1 if the command succeeded and 0 if it failed.
+
+   int
+          pexitstatus
+          zshcmd() and zsyscmd() should set this to the command's actual
+          exit status code if possible.
+
+   int
+          zsyscmd(s) char *s;
+          s contains to pointer to a command to be executed by the host
+          computer's shell, command parser, or operating system. If the
+          system allows the user to choose from a variety of command
+          processors (shells), then this function should employ the
+          system standard shell (e.g. /bin/sh for Unix), so that the
+          results will always be the same for everybody. If possible, the
+          user's job (environment, process, etc) should be set up to
+          catch keyboard interruption signals to allow the user to halt
+          the system command and return to Kermit. The command must run
+          in ordinary, unprivileged user mode. If possible, this function
+          should return -1 on failure to start the command, or else it
+          should return 1 if the command succeeded and 0 if it failed.
+
+   VOID
+          z_exec(s,args) char * s; char * args[];
+          This one executes the command s (which is searched for using
+          the system's normal searching mechanism, such as PATH in UNIX),
+          with the given argument vector, which follows the conventions
+          of UNIX argv[]: the name of the command pointed to by element
+          0, the first arg by element 1, and so on. A null args[] pointer
+          indicates the end of the arugment list. All open files must
+          remain open so the exec'd process can use them. Returns only if
+          unsuccessful.
+
+   int
+          zsinl(n,s,x) int n, x; char *s;
+          Reads a line from file number n. Writes the line into the
+          address s provided by the caller. Writing terminates when
+          newline is read, but with newline discarded. Writing also
+          terminates upon EOF or if length x is exhausted. Returns:
+           -1: on EOF or error.
+            0: on success.
+
+   int
+          zsout(n,s) int n; char *s;
+          Writes the string s out to file number n. Returns:
+           -1: on failure.
+            0: on success.
+
+   int
+          zsoutl(n,s) int n; char *s;
+          Writes the string s out to file number n and adds a line
+          (record) terminator (boundary) appropriate for the system and
+          the file format. Returns:
+           -1: on failure.
+            0: on success.
+
+   int
+          zsoutx(n,s,x) int n, x; char *s;
+          Writes exactly x characters from string s to file number n. If
+          s has fewer than x characters, then the entire string s is
+          written. Returns:
+           -1: on failure.
+          >= 0: on success, the number of characters actually written.
+
+   int
+          zstime(fn,yy,x) char *fn; struct zattr *yy; int x;
+          Sets the creation date (and other attributes) of an existing
+          file, or compares a file's creation date with a given date.
+          Call with:
+
+   fn: pointer to name of existing file.
+   yy: Pointer to a Kermit file attribute structure in which yy->date.val
+   is a date of the form yyyymmdd hh:mm:ss, e.g. 19900208 13:00:00, which
+   is to be used for setting or comparing the file date. Other attributes
+   in the struct can also be set, such as the protection/permission (See
+   [110]Appendix I), when it makes sense (e.g. "yy->lprotect.val" can be
+   set if the remote system ID matches the local one).
+    x: A function code: 0 means to set the file's creation date as given.
+   1 means compare the date from the yy struct with the file's date.
+
+          Returns:
+           -1: on any kind of error.
+            0: if x is 0 and the file date was set successfully.
+            0: if x is 1 and date from attribute structure > file
+          creation date.
+            1: if x is 1 and date from attribute structure <= file
+          creation date.
+
+   VOID
+          zstrip(name,name2) char *name, **name2;
+          Strips pathname from filename "name". Constructs the resulting
+          string in a static buffer in its own space and returns a
+          pointer to it in name2. Also strips device name, file version
+          numbers, and other "non-name" material.
+
+   int
+          zxcmd(n,s) char *s;
+          Runs a system command so its output can be accessed as if it
+          were file n. The command is run in ordinary, unprivileged user
+          mode.
+          If n is ZSTDIO or ZCTERM, returns -1.
+          If n is ZIFILE or ZRFILE, then Kermit reads from the command,
+          otherwise Kermit writes to the command.
+          Returns 0 on error, 1 on success.
+
+   int
+          zxpand(fn) char *fn;
+          OBSOLETE: Replaced by nzxpand(), q.v.
+
+   #ifdef ZXREWIND
+   int
+          zxrewind()
+          Returns the number of files returned by the most recent
+          nzxpand() call, and resets the list to the beginning so the
+          next znext() call returns the first file. Returns -1 if zxpand
+          has not yet been called. If this function is available,
+          ZXREWIND should be defined; otherwise it should not be
+          referenced.
+
+   #endif /* ZXREWIND */
+
+   int
+          xsystem(cmd) char *cmd;
+          Executes the system command without redirecting any of its i/o,
+          similar (well, identical) to system() in Unix. But before
+          passing the command to the system, xsystem() ensures that all
+          privileges are turned off, so that the system command executes
+          in ordinary unprivileged user mode. If possible, xsystem()
+          returns the return code of the command that was executed.
+
+    4.E.2.2. IKSD Variables and Functions
+
+   These must be implemented in any C-Kermit version that is to be
+   installed as an Internet Kermit Service Daemon (IKSD). IKSD is
+   expected to be started by the Internet Daemon (e.g. inetd) with its
+   standard i/o redirected to the incoming connection.
+
+   int ckxanon;
+          Nonzero if anonymous logins allowed.
+
+   extern int inserver;
+          Nonzero if started in IKSD mode.
+
+   extern int isguest;
+          Nonzero if IKSD and user logged in anonymously.
+
+   extern char * homdir;
+          Pointer to user's home directory.
+
+   extern char * anonroot;
+          Pointer to file-system root for anonymous users.
+
+   Existing functions must make "if (inserver && isguest)" checks for
+   actions that would not be legal for guests: zdelete(), zrmdir(),
+   zprint(), zmail(), etc.
+
+   int
+          zvuser(name) char * name;
+          Verifies that user "name" exists and is allowed to log in. If
+          the name is "ftp" or "anonymous" and ckxanon != 0, a guest
+          login is set up. Returns 0 if user not allowed to log in,
+          nonzero if user may log in.
+
+   int
+          zvpass(string) char * string;
+          Verifies password of the user from the most recent zvuser()
+          call. Returns nonzero if password is valid for user, 0 if it
+          isn't. Makes any appropriate system log entries (IKSD logins,
+          failed login attempts, etc). If password is valid, logs the
+          user in as herself (if real user), or sets up restricted
+          anonymous access if user is guest (e.g. changes file-system
+          root to anonroot and sets isguest = 1).
+
+   VOID
+          zsyslog()
+          Begins any desired system logging of an IKSD session.
+
+   VOID
+          zvlogout()
+          Terminates an IKSD session. In most cases this is simply a
+          wrapper for exit() or doexit(), with some system logging added.
+
+    4.E.2.3. Privilege Functions
+
+   These functions are used by C-Kermit to adapt itself to operating
+   systems where the program can be made to run in a "privileged" mode,
+   e.g. setuid or setgid in Unix. C-Kermit should NOT read and write
+   files or start subprocesses as a privileged program. This would
+   present a serious threat to system security. The security package has
+   been installed to prevent such security breaches by turning off the
+   program's special privileges at all times except when they are needed.
+
+   In UNIX, the only need Kermit has for privileged status is access to
+   the UUCP lockfile directory, in order to read, create, and destroy
+   lockfiles, and to open communication devices that are normally
+   protected against the user (see the [111]Unix C-Kermit Installation
+   Instructions for discussion). Therefore, privileges should only be
+   enabled for these operations and disabled at all other times. This
+   relieves the programmer of the responsibility of putting expensive and
+   unreliable access checks around every file access and subprocess
+   creation.
+
+   Strictly speaking, these functions are not required in all C-Kermit
+   implementations, because their use (so far, at least) is internal to
+   the Group E modules. However, they should be included in all C-Kermit
+   implementations for operating systems that support the notion of a
+   privileged program (UNIX, RSTS/E, what others?).
+
+   int
+          priv_ini()
+          Determine whether the program is running in privileged status.
+          If so, turn off the privileges, in such a way that they can be
+          turned on again when needed. Called from sysinit() at program
+          startup time. Returns:
+            0 on success
+            nonzero on failure, in which case the program should halt
+          immediately.
+
+   int
+          priv_on()
+          If the program is not privileged, this function does nothing.
+          If the program is privileged, this function returns it to
+          privileged status. priv_ini() must have been called first.
+          Returns:
+            0 on success
+            nonzero on failure
+
+   int
+          priv_off()
+          Turns privileges off (if they are on) in such a way that they
+          can be turned back on again. Returns:
+            0 on success
+            nonzero on failure
+
+   int
+          priv_can()
+          Turns privileges off in such a way that they cannot be turned
+          back on. Returns:
+            0 on success
+            nonzero on failure
+
+   int
+          priv_chk()
+          Attempts to turns privileges off in such a way that they can be
+          turned on again later. Then checks to make sure that they were
+          really turned off. If they were not really turned off, then
+          they are cancelled permanently. Returns:
+            0 on success
+            nonzero on failure
+
+    4.E.2.4. Console-Related Functions
+
+   These relate to the program's "console", or controlling terminal, i.e.
+   the terminal that the user is logged in on and types commands at, or
+   on a PC or workstation, the actual keyboard and screen.
+
+   int
+          conbin(esc) char esc;
+          Puts the console into "binary" mode, so that Kermit's command
+          parser can control echoing and other treatment of characters
+          that the user types. esc is the character that will be used to
+          get Kermit's attention during packet mode; puts this in a
+          global place. Sets the ckxech variable. Returns:
+           -1: on error.
+            0: on success.
+
+   int
+          concb(esc) char esc;
+          Put console in "cbreak" (single-character wakeup) mode. That
+          is, ensure that each console character is available to the
+          program immediately when the user types it. Otherwise just like
+          conbin(). Returns:
+           -1: on error.
+            0: on success.
+
+   int
+          conchk()
+          Returns a number, 0 or greater, the number of characters
+          waiting to be read from the console, i.e. the number of
+          characters that the user has typed that have not been read yet
+          by Kermit.
+
+   long
+          congspd();
+          Returns the speed ("baud rate") of the controlling terminal, if
+          known, otherwise -1L.
+
+   int
+          congks(timo) int timo;
+          Get Keyboard Scancode. Reads a keyboard scan code from the
+          physical console keyboard. If the timo parameter is greater
+          than zero, then times out and returns -2 if no character
+          appears within the given number of seconds. Upon any other kind
+          of error, returns -1. Upon success returns a scan code, which
+          may be any positive integer. For situations where scan codes
+          cannot be read (for example, when an ASCII terminal is used as
+          the job's controlling terminal), this function is identical to
+          coninc(), i.e. it returns an 8-bit character value. congks() is
+          for use with workstations whose keyboards have Alternate,
+          Command, Option, and similar modifier keys, and Function keys
+          that generate codes greater than 255.
+
+   int
+          congm()
+          Console get modes. Gets the current console terminal modes and
+          saves them so that conres() can restore them later. Returns 1
+          if it got the modes OK, 0 if it did nothing (e.g. because
+          Kermit is not connected with any terminal), -1 on error.
+
+   int
+          coninc(timo) int timo;
+          Console Input Character. Reads a character from the console. If
+          the timo parameter is greater than zero, then coninc() times
+          out and returns -2 if no character appears within the given
+          number of seconds. Upon any other kind of error, returns -1.
+          Upon success, returns the character itself, with a value in the
+          range 0-255 decimal.
+
+   VOID
+          conint(f,s) SIGTYP (*f)(), (*s)();
+          Sets the console to generate an interrupt if the user types a
+          keyboard interrupt character, and to transfer control the
+          signal-handling function f. For systems with job control, s is
+          the address of the function that suspends the job. Sets the
+          global variable "backgrd" to zero if Kermit is running in the
+          foreground, and to nonzero if Kermit is running in the
+          background. See ckcdeb.h for the definition of SIGTYP. No
+          return value.
+
+   VOID
+          connoi()
+          Console no interrupts. Disable keyboard interrupts on the
+          console. No return value.
+
+   int
+          conoc(c) char c;
+          Writes character c to the console terminal. Returns:
+          0 on failure, 1 on success.
+
+   int
+          conol(s) char *s;
+          Writes string s to the console. Returns -1 on error, 0 or
+          greater on success.
+
+   int
+          conola(s) char *s[]; {
+          Writes an array of strings to the console. Returns -1 on error,
+          0 or greater on success.
+
+   int
+          conoll(s) char *s;
+          Writes string s to the console, followed by the necessary line
+          termination characters to put the console cursor at the
+          beginning of the next line. Returns -1 on error, 0 or greater
+          on success.
+
+   int
+          conres()
+          Restores the console terminal to the modes obtained by congm().
+          Returns: -1 on error, 0 on success.
+
+   int
+          conxo(x,s) int x; char *s;
+          Write x characters from string s to the console. Returns 0 or
+          greater on success, -1 on error.
+
+   char *
+          conkbg();
+          Returns a pointer to the designator of the console keyboard
+          type. For example, on a PC, this function would return "88",
+          "101", etc. Upon failure, returns a pointer to the empty
+          string.
+
+    4.E.2.5. Communications Functions
+
+   The communication device is the device used for terminal emulation and
+   file transfer. It may or may not be the same device as the console,
+   and it may or may not be a terminal (serial-port) device; it could
+   also be a network connection. For brevity, the communication device is
+   referred to here as the "tty". When the communication device is the
+   same as the console device, Kermit is said to be in remote mode. When
+   the two devices are different, Kermit is in local mode.
+
+   int
+          ttchk()
+          Returns the number of characters that have arrived at the
+          communication device but have not yet been read by ttinc(),
+          ttinl(), and friends. If communication input is buffered (and
+          it should be), this is the sum of the number of unread
+          characters in Kermit's buffer PLUS the number of unread
+          characters in the operating system's internal buffer. The call
+          must be nondestructive and nonblocking, and as inexpensive as
+          possible. Returns:
+            0: or greater on success,
+            0: in case of internal error,
+           -1: or less when it determines the connection has been broken,
+          or there is no connection.
+
+          That is, a negative return from ttchk() should reliably
+          indicate that there is no usable connection. Furthermore,
+          ttchk() should be callable at any time to see if the connection
+          is open. When the connection is open, every effort must be made
+          to ensure that ttchk returns an accurate number of characters
+          waiting to be read, rather than just 0 (no characters) or 1 (1
+          or more characters), as would be the case when we use select().
+          This aspect of ttchk's operation is critical to successful
+          operation of sliding windows and streaming, but "nondestructive
+          buffer peeking" is an obscure operating system feature, and so
+          when it is not available, we have to do it ourselves by
+          managing our own internal buffer at a level below ttinc(),
+          ttinl(), etc, as in the UNIX version (non-FIONREAD case).
+
+          An external global variable, clsondisc, if nonzero, means that
+          if a serial connection drops (carrier on-to-off transition
+          detected by ttchk()), the device should be closed and released
+          automatically.
+
+   int
+          ttclos()
+          Closes the communication device (tty or network). If there were
+          any kind of exclusive access locks connected with the tty,
+          these are released. If the tty has a modem connection, it is
+          hung up. For true tty devices, the original tty device modes
+          are restored. Returns:
+           -1: on failure.
+            0: on success.
+
+   int
+          ttflui()
+          Flush communications input buffer. If any characters have
+          arrived but have not yet been read, discard these characters.
+          If communications input is buffered by Kermit (and it should
+          be), this function flushes Kermit's buffer as well as the
+          operating system's internal input buffer. Returns:
+           -1: on failure.
+            0: on success.
+
+   int
+          ttfluo()
+          Flush tty output buffer. If any characters have been written
+          but not actually transmitted (e.g. because the system has been
+          flow-controlled), remove them from the system's output buffer.
+          (Note, this function is not actually used, but it is
+          recommended that all C-Kermit programmers add it for future
+          use, even if it is only a dummy function that returns 0
+          always.)
+
+   int
+          ttgmdm()
+          Looks for the modem signals CTS, DSR, and CTS, and returns
+          those that are on in as its return value, in a bit mask as
+          described for ttwmdm, in which a bit is on (1) or off (0)
+          according to whether the corresponding signal is on (asserted)
+          or off (not asserted). Return values:
+           -3: Not implemented
+           -2: if the line does not have modem control
+           -1: on error
+          >=0: on success, with bit mask containing the modem signals.
+
+   long
+          ttgspd()
+          Returns the current tty speed in BITS (not CHARACTERS) per
+          second, or -1 if it is not known or if the tty is really a
+          network, or upon any kind of error. On success, the speed
+          returned is the actual number of bits per second, like 1200,
+          9600, 19200, etc.
+
+   int
+          ttgwsiz()
+          Get terminal window size. Returns -1 on error, 0 if the window
+          size can't be obtained, 1 if the window size has been
+          successfully obtained. Upon success, the external global
+          variables tt_rows and tt_cols are set to the number of screen
+          rows and number of screen columns, respectively. As this
+          function is not implemented in all ck*tio.c modules, calls to
+          it must be wrapped in #ifdef CK_TTGWSIZ..#endif. NOTE: This
+          function must be available to use the TELNET NAWS feature
+          (Negotiate About Window Size) as well as Rlogin.
+
+   int
+          tthang()
+          Hang up the current tty device. For real tty devices, turn off
+          DTR for about 1/3-1/2 second (or other length of time,
+          depending on the system). If the tty is really a network
+          connection, close it. Returns:
+           -1: on failure.
+            0: if it does not even try to hang up.
+            1: if it believes it hung up successfully.
+
+   VOID
+          ttimoff()
+          Turns off all pending timer interrupts.
+
+   int
+          ttinc(timo) int timo; (function is old, return codes are new)
+          Reads one character from the communication device. If timo is
+          greater than zero, wait the given number of seconds and then
+          time out if no character arrives, otherwise wait forever for a
+          character. Returns:
+           -3: internal error (e.g. tty modes set wrong)
+           -2: communications disconnect
+           -1: timeout or other error
+          >=0: the character that was read.
+          It is HIGHLY RECOMMENDED that ttinc() be internally buffered so
+          that calls to it are relatively inexpensive. If it is possible
+          to to implement ttinc() as a macro, all the better, for example
+          something like:
+
+  #define ttinc(t) ( (--txbufn >= 0) ? txbuf[ttbufp++] : txbufr(t) )
+
+          (see description of txbufr() below)
+
+   int
+          ttinl(dest,max,timo,eol,start,turn) int max,timo,turn; CHAR
+          *dest, eol, start;
+          ttinl() is Kermit's packet reader. Reads a packet from the
+          communications device, or up to max characters, whichever
+          occurs first. A line is a string of characters starting with
+          the start character up to and including the character given in
+          eol or until the length is exhausted, or, if turn != 0, until
+          the line turnaround character (turn) is read. If turn is 0,
+          ttinl() *should* use the packet length field to detect the end,
+          to allow for the possibility that the eol character appears
+          unprefixed in the packet data. (The turnaround character is for
+          half-duplex linemode connections.)
+
+          If timo is greater than zero, ttinl() times out if the eol
+          character is not encountered within the given number of seconds
+          and returns -1.
+
+          The characters that were input are copied into "dest" with
+          their parity bits stripped if parity is not none. The first
+          character copied into dest should be the start character, and
+          the last should be the final character of the packet (the last
+          block check character). ttinl() should also absorb and discard
+          the eol and turn characters, and any other characters that are
+          waiting to be read, up until the next start character, so that
+          subsequent calls to ttchk() will not succeed simply because
+          there are some terminators still sitting in the buffer that
+          ttinl() didn't read. This operation, if performed, MUST NOT
+          BLOCK (so if it can't be performed in a guaranteed nonblocking
+          way, don't do it).
+
+          On success, ttinl() returns the number of characters read.
+          Optionally, ttinl() can sense the parity of incoming packets.
+          If it does this, then it should set the global variable ttprty
+          accordingly. ttinl() should be coded to be as efficient as
+          possible, since it is at the "inner loop" of packet reception.
+          ttinl() returns:
+           -1: Timeout or other possibly correctable error.
+           -2: Interrupted from keyboard.
+           -3: Uncorrectable i/o error -- connection lost, configuration
+          problem, etc.
+          >=0: on success, the number of characters that were actually
+          read and placed in the dest buffer, not counting the trailing
+          null.
+
+   int
+          ttoc(c) char c;
+          Outputs the character c to the communication line. If the
+          operation fails to complete within two seconds, this function
+          returns -1. Otherwise it returns the number of characters
+          actually written to the tty (0 or 1). This function should only
+          be used for interactive, character-mode operations, like
+          terminal connection, script execution, dialer i/o, where the
+          overhead of the signals and alarms does not create a
+          bottleneck. (THIS DESCRIPTION NEEDS IMPROVEMENT -- If the
+          operation fails within a "certain amount of time"... which
+          might be dependent on the communication method, speed, etc. In
+          particular, flow-control deadlocks must be accounted for and
+          broken out of to prevent the program from hanging indefinitely,
+          etc.)
+
+   int
+          ttol(s,n) int n; char *s;
+          Kermit's packet writer. Writes the n characters of the string
+          pointed to to by s. NOTE: It is ttol's responsibility to write
+          ALL of the characters, not just some of them. Returns:
+           -1: on a possibly correctable error (so it can be retried).
+           -3: on a fatal error, e.g. connection lost.
+          >=0: on success, the actual number of characters written (the
+          specific number is not actually used for anything).
+
+   int
+          ttopen(ttname,lcl,modem,timo) char *ttname; int *lcl, modem,
+          timo;
+          Opens a tty device, if it is not already open. ttopen must
+          check to make sure the SAME device is not already open; if it
+          is, ttopen returns successfully without doing anything. If a
+          DIFFERENT device is currently open, ttopen() must call ttclos()
+          to close it before opening the new one.
+
+        Parameters:
+
+              ttname:
+                      character string - device name or network host
+                      name.
+
+              lcl:
+                      If called with lcl < 0, sets value of lcl as
+                      follows:
+                      0: the terminal named by ttname is the job's
+                      controlling terminal.
+                      1: the terminal named by ttname is not the job's
+                      controlling terminal.
+                      If the device is already open, or if the requested
+                      device can't be opened, then lcl remains (and is
+                      returned as) -1.
+
+              modem:
+                      Less than zero: this is the negative of the network
+                      type, and ttname is a network host name. Network
+                      types (from [112]ckcnet.h:
+
+  NET_TCPB 1   TCP/IP Berkeley (socket)  (implemented in [113]ckutio.c)
+  NET_TCPA 2   TCP/IP AT&T (streams)     (not yet implemented)
+  NET_DEC  3   DECnet                    (not yet implemented)
+
+                      Zero or greater: ttname is a terminal device name.
+                      Zero means a direct connection (don't use modem
+                      signals). Positive means use modem signals
+                      depending on the current setting of ttcarr (see
+                      ttscarr()).
+
+              timo:
+                      > 0: number of seconds to wait for open() to return
+                      before timing out.
+                      <=0: no timer, wait forever (e.g. for incoming
+                      call).
+                      For real tty devices, ttopen() attempts to gain
+                      exclusive access to the tty device, for example in
+                      UNIX by creating a "lockfile" (in other operating
+                      systems, like VMS, exclusive access probably
+                      requires no special action).
+
+        Side effects:
+                Copies its arguments and the tty file descriptor to
+                global variables that are available to the other
+                tty-related functions, with the lcl value altered as
+                described above. Gets all parameters and settings
+                associated with the line and puts them in a global area,
+                so that they can be restored by ttres(), e.g. when the
+                device is closed.
+
+        Returns:
+                  0: on success
+                 -5: if device is in use
+                 -4: if access to device is denied
+                 -3: if access to lock mechanism denied
+                 -2: upon timeout waiting for device to open
+                 -1: on other error
+
+   int
+          ttpkt(speed,flow,parity) long speed; int flow, parity;
+          Puts the currently open tty device into the appropriate modes
+          for transmitting and receiving Kermit packets.
+
+        Arguments:
+
+              speed:
+                      if speed > -1, and the device is a true tty device,
+                      and Kermit is in local mode, ttpkt also sets the
+                      speed.
+
+              flow:
+                      if in the range 0-3, ttpkt selects the
+                      corresponding type of flow control. Currently 0 is
+                      defined as no flow control, 1 is Xon/Xoff, and no
+                      other types are defined. If (and this is a horrible
+                      hack, but it goes back many years and will be hard
+                      to eradicate) flow is 4, then the appropriate tty
+                      modes are set for modem dialing, a special case in
+                      which we talk to a modem-controlled line without
+                      requiring carrier. If flow is 5, then we require
+                      carrier.
+
+              parity:
+                      This is simply copied into a global variable so
+                      that other functions (like ttinl, ttinc, etc) can
+                      use it.
+
+        Side effects:
+                Copies its arguments to global variables, flushes the
+                terminal device input buffer.
+
+        Returns:
+                 -1: on error.
+                  0: on success.
+
+   int
+          ttsetflow(int)
+          Enables the given type of flow control on the open serial
+          communications device immediately. Arguments are the FLO_xxx
+          values from ckcdeb.h, except FLO_DIAL, FLO_DIAX, or FLO_AUTO,
+          which are not actual flow-control types. Returns 0 on success,
+          -1 on failure.
+
+   #ifdef TTSPDLIST
+   long *
+          ttspdlist()
+          Returns a pointer to an array of longs, or NULL on failure. On
+          success, element 0 of the array contains number, n, indicating
+          how many follow. Elements 1-n are serial speeds, expressed in
+          bits per second, that are legal on this platform. The user
+          interface may use this list to construct a menu, keyword table,
+          etc.
+
+   #endif /* TTSPDLIST */
+
+   int
+          ttres()
+          Restores the tty device to the modes and settings that were in
+          effect at the time it was opened (see ttopen). Returns:
+           -1: on error.
+            0: on success.
+
+   int
+          ttruncmd(string) char * string;
+          Runs the given command on the local system, but redirects its
+          input and output to the communication (SET LINE, SET PORT, or
+          SET HOST) device. Returns:
+            0: on failure.
+            1: on success.
+
+   int
+          ttscarr(carrier) int carrier;
+          Copies its argument to a variable that is global to the other
+          tty-related functions, and then returns it. The values for
+          carrier are defined in ckcdeb.h: CAR_ON, CAR_OFF, CAR_AUTO.
+          ttopen(), ttpkt(), and ttvt() use this variable when deciding
+          how to open the tty device and what modes to select. The
+          meanings are these:
+
+   CAR_OFF: Ignore carrier at all times.
+   CAR_ON: Require carrier at all times, except when dialing. This means,
+   for example, that ttopen() could hang forever waiting for carrier if
+   it is not present.
+   CAR_AUTO: If the modem type is zero (i.e. the connection is direct),
+   this is the same as CAR_OFF. If the modem type is positive, then heed
+   carrier during CONNECT (ttvt mode), but ignore it at other times
+   (packet mode, during SET LINE, etc). Compatible with pre-5A versions
+   of C-Kermit. This should be the default carrier mode.
+
+          Kermit's DIAL command ignores the carrier setting, but
+          ttopen(), ttvt(), and ttpkt() all honor the carrier option in
+          effect at the time they are called. None of this applies to
+          remote mode (the tty device is the job's controlling terminal)
+          or to network host connections (modem type is negative).
+
+   int
+          ttsndb()
+          Sends a BREAK signal on the tty device. On a real tty device,
+          send a real BREAK lasting approximately 275 milliseconds. If
+          this is not possible, simulate a BREAK by (for example)
+          dropping down some very low baud rate, like 50, and sending a
+          bunch of null characters. On a network connection, do the
+          appropriate network protocol for BREAK. Returns:
+           -1: on error.
+            0: on success.
+
+   int
+          ttsndlb()
+          Like ttsndb(), but sends a "Long BREAK" (approx 1.5 seconds).
+          For network connections, it is identical to ttsndb().
+          Currently, this function is used only if CK_LBRK is defined (as
+          it is for UNIX and VMS).
+
+   int
+          ttsspd(cps) int cps;
+          For serial devices only, set the device transmission speed to
+          (note carefully) TEN TIMES the argument. The argument is in
+          characters per second, but transmission speeds are in bits per
+          second. cps are used rather than bps because high speeds like
+          38400 are not expressible in a 16-bit int but longs cannot be
+          used because keyword-table values are ints and not longs. If
+          the argument is 7, then the bps is 75, not 70. If the argument
+          is 888, this is a special code for 75/1200 split-speed
+          operation (75 bps out, 1200 bps in). Returns:
+           -1: on error, meaning the requested speed is not valid or
+          available.
+          >=0: on success (don't try to use this value for anything).
+
+   int
+          ttvt(speed,flow) long speed; int flow;
+          Puts the currently open tty device into the appropriate modes
+          for terminal emulation. The arguments are interpreted as in
+          ttpkt(). Side effects: ttvt() stores its arguments in global
+          variables, and sets a flag that it has been called so that
+          subsequent calls can be ignored so long as the arguments are
+          the same as in the last effective call. Other functions, such
+          as ttopen(), ttclose(), ttres(), ttvt(), etc, that change the
+          tty device in any way must unset this flag. In UNIX Kermit,
+          this flag is called tvtflg.
+
+   int
+          ttwmdm(mdmsig,timo) int mdmsig, timo;
+          Waits up to timo seconds for all of the given modem signals to
+          appear. mdmsig is a bit mask, in which a bit is on (1) or off
+          (0) according to whether the corresponding signal is to be
+          waited for. These symbols are defined in ckcdeb.h:
+            BM_CTS (bit 0) means wait for Clear To Send
+            BM_DSR (bit 1) means wait for Data Set Ready
+            BM_DCD (bit 2) means wait for Carrier Detect
+          Returns:
+           -3: Not implemented.
+           -2: This line does not have modem control.
+           -1: Timeout: time limit exceeded before all signals were
+          detected.
+            1: Success.
+
+   int
+          ttxin(n,buf) int n; CHAR *buf;
+          Reads x characters from the tty device into the specified buf,
+          stripping parity if parity is not none. This call waits
+          forever, there is no timeout. This function is designed to be
+          called only when you know that at least x characters are
+          waiting to be read (as determined, for example, by ttchk()).
+          This function should use the same buffer as ttinc().
+
+   int
+          txbufr(timo) int timo;
+          Reads characters into the internal communications input buffer.
+          timo is a timeout interval, in seconds. 0 means no timeout,
+          wait forever. Called by ttinc() (and possibly ttxin() and
+          ttinl()) when the communications input buffer is empty. The
+          buffer should be called ttxbuf[], its length is defined by the
+          symbol TXBUFL. The global variable txbufn is the number of
+          characters available to be read from ttxbuf[], and txbufp is
+          the index of the next character to be read. Should not be
+          called if txbufn > 0, in which case the buffer does not need
+          refilling. This routine returns:
+            -2: Communications disconnect
+            -1: Timeout
+          >=0: A character (0 - 255) On success, the first character that
+          was read, with the variables txbufn and txbufp set
+          appropriately for any remaining characters.
+          NOTE: Currently this routine is used internally only by the
+          UNIX and VMS versions. The aim is to make it available to all
+          versions so there is one single coherent and efficient way of
+          reading from the communications device or network.
+
+    4.E.2.6. Miscellaneous system-dependent functions
+
+   VOID
+          ztime(s) char **s;
+          Returns a pointer, s, to the current date-and-time string in s.
+          This string must be in the fixed-field format associated with
+          the C runtime asctime() function, like: "Sun Sep 16 13:23:45
+          1973\n" so that callers of this function can extract the
+          different fields. The pointer value is filled in by ztime, and
+          the data it points to is not safe, so should be copied to a
+          safe place before use. ztime() has no return value. As a side
+          effect, this routine can also fill in the following two
+          external variables (which must be defined in the
+          system-dependendent modules for each platform):
+            long ztusec: Fraction of seconds of clock time, microseconds.
+            long ztmsec: Fraction of seconds of clock time, milliseconds.
+          If these variables are not set by zstime(), they remain at
+          their initial value of -1L.
+
+   int
+          gtimer()
+          Returns the current value of the elapsed time counter in
+          seconds (see rtimer), or 0 on any kind of error.
+
+   #ifdef GFTIMER
+          CKFLOAT
+          gftimer()
+          Returns the current value of the elapsed time counter in
+          seconds, as a floating point number, capable of representing
+          not only whole seconds, but also the fractional part, to the
+          millisecond or microsecond level, whatever precision is
+          available. Requires a function to get times at subsecond
+          precision, as well as floating-point support. That's why it's
+          #ifdef'd.
+
+   #endif /* GFTIMER */
+
+   int
+          msleep(m) int m;
+          Sleeps (pauses, does nothing) for m milliseconds (a millisecond
+          is one thousandth of a second). Returns:
+           -1: on failure.
+            0: on success.
+
+   VOID
+          rtimer()
+          Sets the elapsed time counter to zero. If you want to time how
+          long an operation takes, call rtimer() when it starts and
+          gtimer when it ends. rtimer() has no return value.
+
+   #ifdef GFTIMER
+          VOID
+          rftimer()
+          Sets the elapsed time counter to zero. If you want to time how
+          long an operation takes, call rftimer() when it starts and
+          gftimer when it ends. rftimer() has no return value. Note:
+          rftimer() is to be used with gftimer() and rtimer() is to be
+          used with gtimer(). See the rftimer() description.
+
+   #endif /* GFTIMER */
+
+   int
+          sysinit()
+          Does whatever needs doing upon program start. In particular, if
+          the program is running in any kind of privileged mode, turns
+          off the privileges (see priv_ini()). Returns:
+           -1: on error.
+            0: on success.
+
+   int
+          syscleanup()
+          Does whatever needs doing upon program exit. Returns:
+           -1: on error.
+            0: on success.
+
+   int
+          psuspend()
+          Suspends the Kermit process, puts it in the background so it
+          can be continued ("foregrounded") later. Returns:
+           -1: if this function is not supported.
+            0: on success.
+
+   [ [114]Contents ] [ [115]C-Kermit ] [ [116]Kermit Home ]
+    ________________________________________________________________________
+
+  4.F. Group F: Network Support
+
+   As of version 5A, C-Kermit includes support for several networks.
+   Originally, this was just worked into the ttopen(), ttclos(), ttinc(),
+   ttinl(), and similar routines in [117]ckutio.c. But this made it
+   impossible to share this code with non-UNIX versions, like VMS,
+   AOS/VS, OS/2, etc. So as of edit 168, network code has been separated
+   out into its own module and header file, ckcnet.c and ckcnet.h:
+
+     [118]ckcnet.h: Network-related symbol definitions.
+     [119]ckcnet.c: Network i/o (TCP/IP, X.25, etc), shared by most
+   platforms.
+     [120]cklnet.c: Network i/o (TCP/IP, X.25, etc) specific to Stratus
+   VOS.
+
+   The routines and variables in these modules fall into two categories:
+
+    1. Support for specific network packages like SunLink X.25 and TGV
+       MultiNet, and:
+    2. support for specific network virtual terminal protocols like CCITT
+       X.3 and TCP/IP Telnet.
+
+   Category (1) functions are analogs to the tt*() functions, and have
+   names like netopen, netclos, nettinc, etc. Group A-D modules do not
+   (and must not) know anything about these functions -- they continue to
+   call the old Group E functions (ttopen, ttinc, etc). Category (2)
+   functions are protocol specific and have names prefixed by a protocol
+   identifier, like tn for telnet x25 for X.25.
+
+   ckcnet.h contains prototypes for all these functions, as well as
+   symbol definitions for network types, protocols, and network- and
+   protocol- specific symbols, as well as #includes for the header files
+   necessary for each network and protocol.
+
+   The following functions are to be provided for networks that do not
+   use normal system i/o (open, read, write, close):
+
+   int
+          netopen()
+          To be called from within ttopen() when a network connection is
+          requested. Calling conventions and purpose same as Group E
+          ttopen().
+
+   int
+          netclos()
+          To be called from within ttclos() when a network connection is
+          being closed. Calling conventions and purpose same as Group E
+          ttclos().
+
+   int
+          nettchk()
+          To be called from within ttchk(). Calling conventions and
+          purpose same as Group E ttchk().
+
+   int
+          netflui()
+          To be called from within ttflui(). Calling conventions and
+          purpose same as Group E ttflui().
+
+   int
+          netbreak()
+          To send a network break (attention) signal. Calling conventions
+          and purpose same as Group E ttsndbrk().
+
+   int
+          netinc()
+          To get a character from the network. Calling conventions same
+          as Group E ttsndbrk().
+
+   int
+          nettoc()
+          Send a "character" (byte) to the network. Calling conventions
+          same as Group E ttoc().
+
+   int
+          nettol()
+          Send a "line" (sequence of bytes) to the network. Calling
+          conventions same as Group E ttol().
+
+   Conceivably, some systems support network connections simply by
+   letting you open a device of a certain name and letting you do i/o to
+   it. Others (like the Berkeley sockets TCP/IP library on UNIX) require
+   you to open the connection in a special way, but then do normal i/o
+   (read, write). In such a case, you would use netopen(), but you would
+   not use nettinc, nettoc, etc.
+
+   VMS TCP/IP products have their own set of functions for all network
+   operations, so in that case the full range of netxxx() functions is
+   used.
+
+   The technique is to put a test in each corresponding ttxxx() function
+   to see if a network connection is active (or is being requested), test
+   for which kind of network it is, and if necessary route the call to
+   the corresponding netxxx() function. The netxxx() function must also
+   contain code to test for the network type, which is available via the
+   global variable ttnet.
+
+   [ [121]Contents ] [ [122]C-Kermit ] [ [123]Kermit Home ]
+      ______________________________________________________________________
+
+    4.F.1. Telnet Protocol
+
+   (This section needs a great deal of updating...)
+
+   As of edit 195, Telnet protocol is split out into its own files, since
+   it can be implemented in remote mode, which does not have a network
+   connection:
+
+      [124]ckctel.h: Telnet protocol symbol definitions.
+      [125]ckctel.c: Telnet protocol.
+
+   The Telnet protocol is supported by the following variables and
+   routines:
+
+   int tn_init
+          Nonzero if telnet protocol initialized, zero otherwise.
+
+   int
+          tn_init()
+          Initialize the telnet protocol (send initial options).
+
+   int
+          tn_sopt()
+          Send a telnet option.
+
+   int
+          tn_doop()
+          Receive and act on a telnet option from the remote.
+
+   int
+          tn_sttyp()
+          Send terminal type using telnet protocol.
+      ______________________________________________________________________
+
+    4.F.2. FTP Protocol
+
+   (To be filled in...)
+      ______________________________________________________________________
+
+    4.F.3. HTTP Protocol
+
+   (To be filled in...)
+      ______________________________________________________________________
+
+    4.F.4. X.25 Networks
+
+   These routines were written SunLink X.25 and have since been adapted
+   to at least on one other: IBM AIXLink/X.25.
+
+   int
+          x25diag()
+          Reads and prints X.25 diagnostics
+
+   int
+          x25oobh()
+          X.25 out of band signal handler
+
+   int
+          x25intr()
+          Sends X.25 interrupt packet
+
+   int
+          x25reset()
+          Resets X.25 virtual circuit
+
+   int
+          x25clear()
+          Clear X.25 virtual circuit
+
+   int
+          x25stat()
+          X.25 status
+
+   int
+          setqbit()
+          Sets X.25 Q-bit
+
+   int
+          resetqbit()
+          Resets X.25 Q-bit
+
+   int
+          x25xin()
+          Reads n characters from X.25 circuit.
+
+   int
+          x25inl()
+          Read a Kermit packet from X.25 circuit.
+
+   [ [126]Contents ] [ [127]C-Kermit ] [ [128]Kermit Home ]
+      ______________________________________________________________________
+
+    4.F.5. Adding New Network Types
+
+   Example: Adding support for IBM X.25 and Hewlett Packard X.25. First,
+   add new network type symbols for each one. There are already some
+   network types defined for other X.25 packages:
+
+  NET_SX25 is the network-type ID for SunLink X.25.
+  NET_VX25 is the network-type ID for VOS X.25.
+
+   So first you should new symbols for the new network types, giving them
+   the next numbers in the sequence, e.g.:
+
+#define NET_HX25 11                     /* Hewlett-Packard X.25 */
+#define NET_IX25 12                     /* IBM X.25 */
+
+   This is in ckcnet.h.
+
+   Then we need symbols to say that we are actually compiling in the code
+   for these platforms. These would be defined on the cc command line:
+
+  -DIBMX25  (for IBM)
+  -DHPX25   (for HP)
+
+   So we can build C-Kermit versions for AIX and HP-UX both with and
+   without X.25 support (since not all AIX and IBM systems have the
+   needed libraries, and so an executable that was linked with them might
+   no load).
+
+   Then in ckcnet.h:
+
+#ifdef IBMX25
+#define ANYX25
+#endif /* IBMX25 */
+
+#ifdef HPX25
+#define ANYX25
+#endif /* HPX25 */
+
+   And then use ANYX25 for code that is common to all of them, and IBMX25
+   or HPX25 for code specific to IBM or HP.
+
+   It might also happen that some code can be shared between two or more
+   of these, but not the others. Suppose, for example, that you write
+   code that applies to both IBM and HP, but not Sun or VOS X.25. Then
+   you add the following definition to ckcnet.h:
+
+#ifndef HPORIBMX25
+#ifdef HPX25
+#define HPORIBMX25
+#else
+#ifdef IBMX25
+#define HPORIBMX25
+#endif /* IBMX25 */
+#endif /* HPX25 */
+#endif /* HPORIBMX25 */
+
+   You can NOT use constructions like "#if defined (HPX25 || IBMX25)";
+   they are not portable.
+
+   [ [129]Contents ] [ [130]C-Kermit ] [ [131]Kermit Home ]
+    ________________________________________________________________________
+
+  4.G. Group G: Formatted Screen Support
+
+   So far, this is used only for the fullscreen local-mode file transfer
+   display. In the future, it might be extended to other uses. The
+   fullscreen display code is in and around the routine screenc() in
+   [132]ckuusx.c.
+
+   In the UNIX version, we use the curses library, plus one call from the
+   termcap library. In other versions (OS/2, VMS, etc) we insert dummy
+   routines that have the same names as curses routines. So far, there
+   are two methods for simulating curses routines:
+
+    1. In VMS, we use the Screen Management Library (SMG), and insert
+       stubs to convert curses calls into SMG calls.
+    2. In OS/2, we use the MYCURSES code, in which the stub routines
+       actually emit the appropriate escape sequences themselves.
+
+   Here are the stub routines:
+
+   int
+          tgetent(char *buf, char *term)
+          Arguments are ignored. Returns 1 if the user has a supported
+          terminal type, 0 otherwise. Sets a global variable (for
+          example, "isvt52" or "isdasher") to indicate the terminal type.
+
+   VOID
+          move(int row, int col)
+          Sends the escape sequence to position the cursor at the
+          indicated row and column. The numbers are 0-based, e.g. the
+          home position is 0,0.
+
+   int
+          clear()
+          Sends the escape sequence to clear the screen.
+
+   int
+          clrtoeol()
+          Sends the escape sequence to clear from the current cursor
+          position to the end of the line.
+
+   In the MYCURSES case, code must be added to each of the last three
+   routines to emit the appropriate escape sequences for a new terminal
+   type.
+
+   clearok(curscr), wrefresh()
+          In real curses, these two calls are required to refresh the
+          screen, for example after it was fractured by a broadcast
+          message. These are useful only if the underlying screen
+          management service keeps a copy of the entire screen, as curses
+          and SMG do. C-Kermit does not do this itself.
+
+   [ [133]Contents ] [ [134]C-Kermit ] [ [135]Kermit Home ]
+    ________________________________________________________________________
+
+  4.H. Group H: Pseudoterminal Support
+
+   (To be filled in...)
+    ________________________________________________________________________
+
+  4.I. Group I: Security
+
+   (To be filled in...)
+
+   [ [136]Contents ] [ [137]C-Kermit ] [ [138]Kermit Home ]
+    ________________________________________________________________________
+
+  APPENDIX I. FILE PERMISSIONS
+
+  I.1. Format of System-Dependent File Permissions in A-Packets
+
+   The format of this field (the "," attribute) is interpreted according
+   to the System ID ("." Attribute).
+
+   For UNIX (System ID = U1), it's the familiar 3-digit octal number, the
+   low-order 9 bits of the filemode: Owner, Group, World, e.g. 660 =
+   read/write access for owner and group, none for world, recorded as a
+   3-digit octal string. High-order UNIX permission bits are not
+   transmitted.
+
+   For VMS (System ID = D7), it's a 4-digit hex string, representing the
+   16-bit file protection WGOS fields (World,Group,Owner,System), in that
+   order (which is the reverse of how they're shown in a directory
+   listing); in each field, Bit 0 = Read, 1 = Write, 2 = Execute, 3 =
+   Delete. A bit value of 0 means permission is granted, 1 means
+   permission is denied. Sample:
+
+  r-01-00-^A/!FWERMIT.EXE'"
+  s-01-00-^AE!Y/amd/watsun/w/fdc/new/wermit.exe.DV
+  r-02-01-^A]"A."D7""B8#119980101 18:14:05!#8531&872960,$A20B-!7(#512@ #.Y
+  s-02-01-^A%"Y.5!
+
+   A VMS directory listing shows the file's protection as (E,RWED,RED,RE)
+   which really means (S=E,O=RWED,G=RED,W=RE), which is reverse order
+   from the internal storage, so (RE,RED,RWED,E). Now translate each
+   letter to its corresponding bit:
+
+  RE=0101, RED=1101, RWED=1111, E=0010
+
+   Now reverse the bits:
+
+  RE=1010, RED=0010, RWED=0000, E=1101
+
+   This gives the 16-bit quantity:
+
+  1010001000001101
+
+   This is the internal representation of the VMS file permission; in
+   hex:
+
+  A20B
+
+   as shown in the sample packet above.
+
+   The VMS format probably would also apply to RSX or any other FILES-11
+   system.
+
+  I.2. Handling of Generic Protection
+
+   To be used when the two systems are different (and/or do not recognize
+   or understand each other's local protection codes).
+
+   First of all, the book is wrong. This should not be the World
+   protection, but the Owner protection. The other fields should be set
+   according to system defaults (e.g. UNIX umask, VMS default protection,
+   etc), except that no non-Owner field should give more permissions than
+   the Owner field.
+
+   [ [139]Top ] [ [140]Contents ] [ [141]C-Kermit Home ] [ [142]Kermit
+   Home ]
+     _________________________________________________________________
+
+
+    C-Kermit Program Logic Manual / [143]The Kermit Project /
+    [144]Columbia University / [145]kermit@columbia.edu / 10 April 2004
+
+References
+
+   1. http://www.columbia.edu/kermit/
+   2. http://www.columbia.edu/
+   3. http://www.columbia.edu/kermit/ckcplm.html
+   4. http://www.columbia.edu/kermit/ckermit.html
+   5. http://www.columbia.edu/kermit/index.html
+   6. http://www.columbia.edu/kermit/ckcplm.html#x1
+   7. http://www.columbia.edu/kermit/ckcplm.html#x2
+   8. http://www.columbia.edu/kermit/ckcplm.html#x3
+   9. http://www.columbia.edu/kermit/ckcplm.html#x4
+  10. http://www.columbia.edu/kermit/ckcplm.html#x4.A
+  11. http://www.columbia.edu/kermit/ckcplm.html#x4.B
+  12. http://www.columbia.edu/kermit/ckcplm.html#x4.C
+  13. http://www.columbia.edu/kermit/ckcplm.html#x4.D
+  14. http://www.columbia.edu/kermit/ckcplm.html#x4.E
+  15. http://www.columbia.edu/kermit/ckcplm.html#x4.F
+  16. http://www.columbia.edu/kermit/ckcplm.html#x4.G
+  17. http://www.columbia.edu/kermit/ckcplm.html#x4.H
+  18. http://www.columbia.edu/kermit/ckcplm.html#x4.I
+  19. http://www.columbia.edu/kermit/ckcplm.html#xa1
+  20. http://www.columbia.edu/kermit/ckcplm.html#contents
+  21. http://www.columbia.edu/kermit/ckcplm.html#contents
+  22. http://www.columbia.edu/kermit/ckermit.html
+  23. http://www.columbia.edu/kermit/index.html
+  24. ftp://kermit.columbia.edu/kermit/c-kermit/ckcpro.w
+  25. http://www.columbia.edu/kermit/ckcplm.html#contents
+  26. http://www.columbia.edu/kermit/ckermit.html
+  27. http://www.columbia.edu/kermit/index.html
+  28. http://www.columbia.edu/kermit/ckcplm.html#x3.2
+  29. http://www.columbia.edu/kermit/ckcplm.html#contents
+  30. http://www.columbia.edu/kermit/ckermit.html
+  31. http://www.columbia.edu/kermit/index.html
+  32. http://www.columbia.edu/kermit/ckcplm.html#x4.A
+  33. http://www.columbia.edu/kermit/ckcplm.html#contents
+  34. http://www.columbia.edu/kermit/ckermit.html
+  35. http://www.columbia.edu/kermit/index.html
+  36. http://www.columbia.edu/kermit/ckcplm.html#contents
+  37. http://www.columbia.edu/kermit/ckermit.html
+  38. http://www.columbia.edu/kermit/index.html
+  39. http://www.columbia.edu/kermit/ckcplm.html#contents
+  40. http://www.columbia.edu/kermit/ckermit.html
+  41. http://www.columbia.edu/kermit/index.html
+  42. ftp://kermit.columbia.edu/kermit/c-kermit/ckclib.h
+  43. ftp://kermit.columbia.edu/kermit/c-kermit/ckclib.c
+  44. http://www.columbia.edu/kermit/ckcplm.html#x3.1
+  45. http://www.columbia.edu/kermit/ckcplm.html#contents
+  46. http://www.columbia.edu/kermit/ckermit.html
+  47. http://www.columbia.edu/kermit/index.html
+  48. ftp://kermit.columbia.edu/kermit/c-kermit/ckcsym.h
+  49. ftp://kermit.columbia.edu/kermit/c-kermit/ckcasc.h
+  50. ftp://kermit.columbia.edu/kermit/c-kermit/ckcsig.h
+  51. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h
+  52. ftp://kermit.columbia.edu/kermit/c-kermit/ckcker.h
+  53. ftp://kermit.columbia.edu/kermit/c-kermit/ckcxla.h
+  54. ftp://kermit.columbia.edu/kermit/c-kermit/ckcmai.c
+  55. ftp://kermit.columbia.edu/kermit/c-kermit/ckcpro.w
+  56. ftp://kermit.columbia.edu/kermit/c-kermit/ckcfns.c
+  57. ftp://kermit.columbia.edu/kermit/c-kermit/ckcfn2.c
+  58. ftp://kermit.columbia.edu/kermit/c-kermit/ckcfn3.c
+  59. http://www.columbia.edu/kermit/ckcplm.html#x4.B
+  60. http://www.columbia.edu/kermit/ckcplm.html#x4.E
+  61. http://www.columbia.edu/kermit/ckcplm.html#x4.D
+  62. http://www.columbia.edu/kermit/ckcplm.html#contents
+  63. http://www.columbia.edu/kermit/ckermit.html
+  64. http://www.columbia.edu/kermit/index.html
+  65. http://www.columbia.edu/kermit/ckcplm.html#x4.B
+  66. ftp://kermit.columbia.edu/kermit/c-kermit/ckuxla.c
+  67. ftp://kermit.columbia.edu/kermit/c-kermit/ckuxla.h
+  68. ftp://kermit.columbia.edu/kermit/c-kermit/ckcxla.h
+  69. ftp://kermit.columbia.edu/kermit/c-kermit/ckuxla.h
+  70. ftp://kermit.columbia.edu/kermit/c-kermit/ckmxla.h
+  71. ftp://kermit.columbia.edu/kermit/c-kermit/ck?xla
+  72. ftp://kermit.columbia.edu/kermit/c-kermit/ckcuni.h
+  73. ftp://kermit.columbia.edu/kermit/c-kermit/ckcuni.c
+  74. http://www.columbia.edu/kermit/ckcplm.html#contents
+  75. http://www.columbia.edu/kermit/ckermit.html
+  76. http://www.columbia.edu/kermit/index.html
+  77. http://www.columbia.edu/kermit/ckcplm.html#x4.B
+  78. ftp://kermit.columbia.edu/kermit/c-kermit/ckucmd.h
+  79. ftp://kermit.columbia.edu/kermit/c-kermit/ckucmd.c
+  80. http://www.columbia.edu/kermit/ckcplm.html#x4.E
+  81. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusr.h
+  82. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusr.c
+  83. ftp://kermit.columbia.edu/kermit/c-kermit/ckuus2.c
+  84. ftp://kermit.columbia.edu/kermit/c-kermit/ckuus3.c
+  85. ftp://kermit.columbia.edu/kermit/c-kermit/ckuus4.c
+  86. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusy.c
+  87. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusx.c
+  88. ftp://kermit.columbia.edu/kermit/c-kermit/ckuver.h
+  89. ftp://kermit.columbia.edu/kermit/c-kermit/ckuscr.c
+  90. ftp://kermit.columbia.edu/kermit/c-kermit/ckudia.c
+  91. ftp://kermit.columbia.edu/kermit/c-kermit/ckucon.c
+  92. ftp://kermit.columbia.edu/kermit/c-kermit/ckucns.c
+  93. http://www.columbia.edu/kermit/ckcplm.html#x4.E
+  94. ftp://kermit.columbia.edu/kermit/c-kermit/ckcmai.c
+  95. http://www.columbia.edu/kermit/ckcplm.html#contents
+  96. http://www.columbia.edu/kermit/ckermit.html
+  97. http://www.columbia.edu/kermit/index.html
+  98. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c
+  99. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 100. ftp://kermit.columbia.edu/kermit/c-kermit/ckusig.c
+ 101. ftp://kermit.columbia.edu/kermit/c-kermit/ckvfio.c
+ 102. ftp://kermit.columbia.edu/kermit/c-kermit/ckusig.c
+ 103. ftp://kermit.columbia.edu/kermit/c-kermit/ckcmai.c
+ 104. http://www.columbia.edu/kermit/ckcplm.html#contents
+ 105. http://www.columbia.edu/kermit/ckermit.html
+ 106. http://www.columbia.edu/kermit/index.html
+ 107. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 108. ftp://kermit.columbia.edu/kermit/c-kermit/ckvtio.c
+ 109. http://www.columbia.edu/kermit/ckcplm.html#x2
+ 110. http://www.columbia.edu/kermit/ckcplm.html#xa1
+ 111. http://www.columbia.edu/kermit/ckuins.html
+ 112. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.h
+ 113. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 114. http://www.columbia.edu/kermit/ckcplm.html#contents
+ 115. http://www.columbia.edu/kermit/ckermit.html
+ 116. http://www.columbia.edu/kermit/index.html
+ 117. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 118. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.h
+ 119. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.c
+ 120. ftp://kermit.columbia.edu/kermit/c-kermit/cklnet.c
+ 121. http://www.columbia.edu/kermit/ckcplm.html#contents
+ 122. http://www.columbia.edu/kermit/ckermit.html
+ 123. http://www.columbia.edu/kermit/index.html
+ 124. ftp://kermit.columbia.edu/kermit/c-kermit/ckctel.h
+ 125. ftp://kermit.columbia.edu/kermit/c-kermit/ckctel.c
+ 126. http://www.columbia.edu/kermit/ckcplm.html#contents
+ 127. http://www.columbia.edu/kermit/ckermit.html
+ 128. http://www.columbia.edu/kermit/index.html
+ 129. http://www.columbia.edu/kermit/ckcplm.html#contents
+ 130. http://www.columbia.edu/kermit/ckermit.html
+ 131. http://www.columbia.edu/kermit/index.html
+ 132. ftp://kermit.columbia.edu/kermit/c-kermit/ckuusx.c
+ 133. http://www.columbia.edu/kermit/ckcplm.html#contents
+ 134. http://www.columbia.edu/kermit/ckermit.html
+ 135. http://www.columbia.edu/kermit/index.html
+ 136. http://www.columbia.edu/kermit/ckcplm.html#contents
+ 137. http://www.columbia.edu/kermit/ckermit.html
+ 138. http://www.columbia.edu/kermit/index.html
+ 139. http://www.columbia.edu/kermit/ckcplm.html#top
+ 140. http://www.columbia.edu/kermit/ckcplm.html#contents
+ 141. http://www.columbia.edu/kermit/ckermit.html
+ 142. http://www.columbia.edu/kermit/index.html
+ 143. http://www.columbia.edu/kermit/index.html
+ 144. http://www.columbia.edu/
+ 145. mailto:kermit@columbia.edu
diff --git a/ckermit.ini b/ckermit.ini
new file mode 100644 (file)
index 0000000..f007561
--- /dev/null
@@ -0,0 +1,618 @@
+COMMENT - Standard C-Kermit initialization file
+;
+; For C-Kermit Version: 8.0
+;
+; Filename:
+;   .kermrc     (UNIX, OS-9, Aegis)
+;   CKERMIT.INI (OS/2, VMS, OpenVMS, AOS/VS, Atari ST, Commodore Amiga)
+;   ckermit.ini (Stratus VOS)
+;   K95.INI     (Kermit 95 -- but this big version is not used there)
+;   K2.INI      (Kermit/2  -- but ditto)
+;
+; Authors:
+;   Frank da Cruz, Christine M. Gianone, Jeffrey Altman
+;   Columbia University, New York, NY 10025-7799, USA
+;
+; This is the standard and recommended C-Kermit 8.0 initialization file.  To
+; override settings or definitions made in this file, to add new settings or
+; definitions, or to make any other desired customizations, create a separate,
+; personal customization file called:
+;
+;   .mykermrc     (UNIX, OS-9, Aegis, BeBox, Plan 9)
+;   CKERMOD.INI   (OS/2, VMS, OpenVMS, AOS/VS, Atari ST, Commodore Amiga)
+;   ckermod.ini   (VOS)
+;
+; You can also define the customization filename in an environment
+; variable (logical name in VMS), CKERMOD, which takes precedence over
+; the names shown above.
+;
+; WHAT THIS FILE DOES:
+;
+; . Defines your default dialing directory name:
+;     .kdd for UNIX, OS-9 and Aegis; CKERMIT.KDD for other operating systems.
+;        You can override this with the environment variable K_DIAL_DIRECTORY
+; . Defines your default network directory name:
+;     .knd for UNIX, OS-9 and Aegis; CKERMIT.KND for other operating systems.
+;        You can override this with the environment variable K_NET_DIRECTORY
+; . Defines your default services directory name:
+;     .ksd for UNIX, OS-9 and Aegis; CKERMIT.KSD for other operating systems.
+;        You can override this with environment variable K_SERVICE_DIRECTORY.
+; . Defines your customization file name (name given above)
+; . Performs system-dependent setups for UNIX, VMS, OS/2, etc.
+; . Defines VTPRINT macros for use with K95, MS-DOS Kermit, etc.
+; . If you have a services directory, all the macros needed to use it are
+;     defined.  If you don't have a services directory, the macros are not
+;     defined and Kermit starts faster.
+; . Executes your personal customization file, if you have one.
+;   NOTE: Your customization file is NOT executed by Kermit itself; it is
+;   executed by this file.
+;
+; In UNIX, with C-Kermit 7.0 and later, you can store this file with a name
+; other than .kermrc, and it will not be executed automatically, but, if you
+; give this file execute permission, you can execute directly because of the
+; "kerbang line" at the top, whenever you want all of the above actions to
+; occur.  The kerbang line must reflect the actual full path of the Kermit
+; 7.0-or-later executable.
+;
+; C-Kermit 6.0 is documented in the book "Using C-Kermit", 2nd Edition,
+; by Frank da Cruz and Christine M. Gianone, 1997, Digital Press /
+; Butterworth-Heinemann, ISBN 1-55558-164-1.  New features of subsequent
+; versions are documented at the Kermit website:
+; http://www.columbia.edu/kermit/
+;
+; Everything after this point depends on the script programming language.
+; The CHECK command terminates this command file immediately if the script
+; programming language (IF command) is not configured.
+;
+set take error on              ; This makes CHECK quit if no script language.
+check if                       ; Do we have an IF command?  If not, quit now.
+set take error off             ; Back to normal.
+
+local _sd _servicedir _xp       ; Declare local variables.
+
+COMMENT - C-Kermit version 6.0 or later required.
+;
+
+asg _xp \v(xprogram)
+if not def _xp asg _xp \v(program)
+if not equal "\m(_xp)" "C-Kermit" -
+  stop 1 \v(cmdfile): This initialization file is only for C-Kermit.
+echo Executing \v(cmdfile) for \v(system)...
+if < \v(version) 60000 -
+  stop 1 \v(cmdfile): C-Kermit 6.0 or later required.
+
+forward \v(system)             ; First do system-dependent items...
+
+:unknown                       ; Should not happen
+Stop 1 Error: System type unknown!
+
+:Aegis                         ; Apollo Aegis and
+:UNIX                          ; UNIX, all versions
+asg _myinit -
+  \v(home).mykermrc            ; Customization filename
+if remote forward COMMON        ; Skip local-mode items if "-R"
+asg _dialdir -
+  \v(home).kdd                 ; C-Kermit dialing directory
+asg _netdir -
+  \v(home).knd                 ; C-Kermit network directory
+asg _servicedir -
+  \v(home).ksd                 ; C-Kermit services directory
+forward COMMON                  ; End of UNIX section
+
+:OS9/68K                       ; OS-9
+asg _myinit -
+  \v(home).mykermrc            ; Customization filename
+if remote forward COMMON
+asg _dialdir -
+  \v(home).kdd                 ; C-Kermit dialing directory
+asg _netdir -
+  \v(home).knd                 ; C-Kermit network directory
+asg _servicedir -
+  \v(home).ksd                 ; C-Kermit services directory
+else set file display crt
+forward COMMON                 ; End of OS-9 section
+
+:VMS                           ; VMS and OpenVMS
+forward COMMON
+
+:OS/2                          ; Kermit 95
+:WIN32
+echo This initialization file is not for use with K95.
+forward COMMON                  ; End of OS/2 section
+
+:AOS/VS                                ; Data General AOS/VS
+set window 1                   ; Sliding windows don't work
+set file char dg-international ; File character-set
+set xfer char latin1           ; Transfer character-set
+set file display crt            ; File transfer fisplay
+def cli push                   ; Escape to CLI
+def reset -                    ; Macro to reset DG DASHER terminal
+ run write [!ascii 236 306 301]
+forward COMMON                  ; End of AOS/VS section
+
+:Amiga                         ; Commodore Amiga
+def cls echo \27[H\27[2J       ; CLS command to clear the screen
+set file char latin1           ; Use Latin Alphabet 1 for file transfer
+set xfer char latin1           ; ...
+forward COMMON                  ; End of Amiga section
+
+:Atari_ST                      ; Atari ST
+def cls echo \27H\27J          ; Clear screen a`la VT52
+set server display on          ; Show file xfer display in server mode too
+set server timeout 15          ; Nonzero required for ^C interruption!
+forward COMMON                  ; End of Atari ST section
+
+:Macintosh                     ; Apple Macintosh
+set server display on          ; Show file xfer display in server mode too.
+forward COMMON
+
+:Stratus_VOS                    ; Stratus VOS
+asg _myinit \v(home)ckermod.ini
+if remote forward COMMON
+asg _dialdir \v(home)ckermit.kdd
+asg _netdir \v(home)ckermit.knd
+asg _servicedir \v(home)ckermit.ksd
+forward COMMON                  ; End of Stratus VOS section
+
+:COMMON                                ; For all systems
+
+; Define macros that are useful when running C-Kermit in remote mode.
+; These macros serve no purpose on local-mode-only versions such as
+; OS/2, Macintosh, Amiga, and Atari ST Kermit, so we skip defining them
+; for those systems.
+;
+if not = 0 \findex(\v(system),WIN32:OS/2:Macintosh:Amiga:Atari_ST) -
+  forward files
+
+; VTPRINT macro.  Print a file on your PC's local printer.
+
+def VTPRINT echo \27[5i, type \%1, echo \27[4i
+; or if your printer needs a formfeed to force the page out:
+; def VTPRINT  def echo \27[5i, type \%1, echo \12\27[4i
+
+; Macros for host-initiated file transfer using APC:
+;   NOT NEEDED ANY MORE because of autodownload/autoupload.
+;   Remove the following FORWARD command to reinstate these definitions:
+
+:FILES
+
+; Get customization and directory file names.  Environment variables take
+; precedence, so you do not have to edit this file to change these filenames.
+;
+if def \$(CKERMOD) assign _myinit \$(CKERMOD)
+if not def _myinit assign _myinit \v(home)CKERMOD.INI
+
+if remote forward CUSTOM ; Skip all this if -R given on command line
+
+if def \$(K_NET_DIRECTORY) assign _netdir \$(K_NET_DIRECTORY)
+if not def _netdir assign _netdir \v(home)CKERMIT.KND
+
+if def \$(K_DIAL_DIRECTORY) assign _dialdir \$(K_DIAL_DIRECTORY)
+if not def _dialdir assign _dialdir \v(home)CKERMIT.KDD
+
+CHECK DIAL                     ; Is there a DIAL command?
+xif fail {                     ; No.
+    echo DIAL disabled
+    forward CUSTOM
+}
+
+CHECK NETWORK
+xif success {
+    xif exist \m(_netdir) {
+       set net directory \m(_netdir)
+       echo { Network directory is \m(_netdir) }
+    }
+}
+
+if eq "\v(name)" "telnet" forward CUSTOM
+
+xif exist \m(_dialdir) {
+    set dial directory \m(_dialdir)
+    echo { Dial directory is \m(_dialdir) }
+}
+
+COMMENT - Services directory
+
+if def \$(K_SERVICE_DIRECTORY) assign _servicedir \$(K_SERVICE_DIRECTORY)
+if not def _servicedir assign _servicedir \v(home)CKERMIT.KSD
+
+; If no services directory is found skip all the big macro definitions and
+; go straight to the bottom, where we execute the customization file.
+
+if not exist \m(_servicedir) forward custom
+
+echo { Services directory is \m(_servicedir)}
+
+def MAX_SVCS 200               ; Adjust this if you have more entries
+define _sd 0                   ; Assume no services directory
+open read \m(_servicedir)      ; Try to open services directory file
+xif success {
+    declare \&d[\m(MAX_SVCS)]  ; It's open, declare directory array
+    for \%i 1 \m(MAX_SVCS) 1 { ; Read the lines into the array
+       read \&d[\%i]
+       if fail break
+    }
+    close read
+    xif > \%i  \m(MAX_SVCS) {
+       echo Too many entries in services directory
+       echo { Maximum is \m(MAX_SVCS).}
+       echo { Change definition of MAX_SVCS in \v(cmdfile) to allow more. }
+       echo { Services directory disabled.}
+    } else {
+        asg \&d[0] \feval(\%i - 1)
+        define _sd 1
+    }
+}
+
+xif not \m(_sd) {
+    def access echo { Services directory not available.}
+    asg list \m(access)
+} else {
+    def FIND {
+       set case off
+       for \%i 1 \&d[0] 1 {
+           if eq {\%1} {\fsubstr(\&d[\%i],1,\flen(\%1))} break
+       }
+       if not > \%i \&d[0] return \&d[\%i]
+    }
+    def LIST {
+       xif > \v(argc) 1 {
+           do find \%1
+           if def \v(return) echo \v(return)
+           else echo \%1: Not found
+       } else {
+           echo \&d[0] items in services directory:
+           for \%i 1 \&d[0] 1 { echo \fcont(\&d[\%i]) }
+       }
+    }
+    def SPLIT { asg _word1 \%1, asg _word2 \%2 }
+    def DOACCESS {               ; (Used internally by ACCESS macro)
+       do \%5 \%6 \%7 \%8 \%9   ; Do the connection macro
+       if fail end 1
+        split \%3                ; Get words from \%3
+       asg \%3 \m(_word1)
+       asg \%2 \m(_word2)
+       do \%3 \%4 {\%1} \%2     ; Login macro, userid, password, prompt
+    }
+    def ACCESS {
+       if not defined \%1 end 1 access what?        ; Check service
+       do find \%1                                  ; Look it up
+       if success doaccess {\%2} \v(return)         ; OK, try it
+       else end 1 "\%1" not in services directory   ; Not found
+       if fail end 1                                ; DOACCESS failed?
+       xif eq \v(cmdlevel) 1 {
+           echo
+           echo ACCESS: Login succeeded - CONNECTing...
+            show escape
+            output \13
+           connect /quietly
+        }
+    }
+}
+
+:CONNECTION ; Macros for making connections
+
+COMMENT - SERIAL macro.  Arguments:
+; \%1 = device name
+; \%2 = speed
+;
+def SERIAL {
+    if < \v(argc) 3                         ; All arguments given?
+      end 1 Usage: SERIAL device speed      ; No.
+    set line \%1                            ; OK, try to SET LINE.
+    if failure -                            ; If this failed,
+      end 1 Can't open device: \%1          ; print message and quit.
+    set speed \%2                           ; Try to set the speed.
+    if fail end 1 Unsupported speed: \%2    ; Failed.
+    echo Connection successful.             ; Succeeded.
+}
+
+COMMENT - NET macro.  Arguments:
+; \%1 = network type
+; \%2 = host name or address
+;
+def NET {
+    if < \v(argc) 3 end 1 Usage: NET network host
+    set network type \%1
+    if fail end 1 unsupported network: \%1
+    set login user                ; Don't send user ID.
+    set host \%2
+    if fail end 1 Can't reach host: \%2
+    echo Connection successful.
+}
+
+COMMENT - CALL macro.  Arguments:
+;
+; \%1 = modem type
+; \%2 = device name
+; \%3 = speed
+; \%4 = phone number
+;
+def CALL {
+    if < \v(argc) 5 -         ; All arguments present?
+      end 1 Usage: CALL modem device speed number
+    xif not equal {\v(modem)} {\%1} { ; Set modem type
+        set modem \%1
+        if fail end 1 unknown modem type: \%1
+    }
+    xif not equal {\v(line)} {\%2} { ; Communication device
+        set line \%2
+        if fail end 1 can't open device: \%2
+    }
+    xif not equal {\v(speed)} {\%3} { ; Communication speed
+        set speed \%3
+        if fail end 1 unsupported speed: \%3
+    }
+    dial \%4                  ; Dial the number
+    if fail end 1 Can't place call: \%4
+    end 0 Connection successful.
+}
+
+COMMENT - TCPCALL macro.  Arguments:
+;
+; \%1 = server name:port
+; \%2 = modem type
+; \%3 = phone number
+;
+def TCPCALL {
+    if < \v(argc) 4 -         ; All arguments present?
+      end 1 Usage: TCPCALL server[:port] modem number
+    set net type tcp/ip       ; Which network to use
+    if fail end 1 unsupported network: tcp/ip
+    set host \%1              ; Access server and port
+    if fail end 1 can't access server \%1
+    set modem \%2             ; Set modem type
+    if fail end 1 unknown modem type: \%2
+    dial \%3                  ; Dial the number
+    if fail end 1 Can't place call: \%3
+    end 0 Connection successful.
+}
+
+COMMENT - SPRINT macro.  Arguments:
+; \%1 = Service name or address
+;
+def SPRINT {
+    if < \v(argc) 2 end 1 Usage: \%0 service
+    set input timeout proceed
+    output @D\13
+    input 10 TERMINAL=
+    if fail end 1 No terminal prompt
+    out D1\13
+    inp 10 @
+    if fail end 1 No atsign prompt
+    output c \%1\13
+    input 10 CONNECTED
+    if fail end 1 Can't access \%1 from SprintNet
+}
+
+COMMENT - ULOGIN macro.  For logging into systems where user ID is required
+; but there is no password.  Arguments:
+; \%1 = UNIX user ID
+;
+define ULOGIN {
+    if < \v(argc) 2 end 1 Usage: \%0 userid
+    set input timeout proceed     ; Handle timeouts ourselves
+    set case on                   ; Case is important in UNIX
+    minput 5 login: Username: {User ID:} {User Name:}
+    out \%1\13                    ; Send username, carriage return
+    end 0
+}
+
+COMMENT - VMSLOGIN macro.  Arguments:
+; \%1 = VMS user ID
+; \%2 = Password.  If password not supplied, it is prompted for.
+; \%3 = System prompt.  If omitted a default is supplied.
+;
+define VMSLOGIN {
+    if < \v(argc) 2 end 1 Usage: \%0 userid [ password [ prompt ] ]
+    while not defined \%2 {
+        askq \%2 { \%1's password: }
+    }
+    set parity none               ; Set communication parameters
+    set duplex full
+    set handshake none
+    set input timeout proceed     ; Handle timeouts ourselves
+    in 5 Username:                ; Is prompt already there?
+    xif fail {                    ; No.
+        for \%i 1 3 1 {           ; Try 3 times to get it.
+            out \13               ; Send carriage return
+            in 5 Username:        ; Look for prompt
+            if success break      ; Success, go log in
+        }
+        if > \%i 3 end 1 No Username prompt
+    }
+    out \%1\13                    ; Send username, carriage return
+    inp 5 Password:               ; Wait 5 sec for this prompt
+    if fail end 1 No password prompt
+    pause                         ; Wait a sec
+    out \%2\13                    ; Send password
+    xif not emulation {           ; No emulator built in?
+        set input echo off        ; Protect terminal from this
+        minput 10 {\27Z} {\27[c} {\27[0c} ; Get terminal ID query
+        xif success {                     ; Got one
+            output \27[\?1c               ; Send VT100 terminal ID
+            in 2 \27[6n                   ; Screen dimension query?
+            if succ out \27[\v(rows);\v(cols)R ; Send dimensions
+        }
+        set input echo on         ; Echo input again
+    }
+    if not def \%3 -              ; If we were not given a prompt
+      asg \%3 {\v(prompt)}        ; use the SET LOGIN PROMPT value
+    if not def \%3 -              ; If we still don't have a prompt
+      asg \%3 {\13$\32}           ; use this one as the default
+    reinp 0 \%3                   ; Did we INPUT the prompt already?
+    if fail inp 60 \%3            ; No, look now.
+    if fail end 1
+}
+
+COMMENT - UNIXLOGIN macro.  Arguments:
+; \%1 = UNIX user ID
+; \%2 = Password.  If password not supplied, it is prompted for.
+; \%3 = System prompt.  If omitted a default is supplied.
+;
+define UNIXLOGIN {
+    local \%m \%i
+    if < \v(argc) 2 -
+      end 1 Usage: \%0 userid [ password [ prompt ] ]
+    while not defined \%2 {
+        askq \%2 { \%1's password: }
+    }
+    set input echo on
+    set parity none               ; Set communication parameters.
+    set duplex full
+    set handshake none
+    set input timeout proceed     ; Handle timeouts ourselves
+    set case on                   ; Case is important in UNIX
+    def \%m 10                    ; Waiting time for INPUT
+    for \%i 1 5 1 {
+        minput \%m login: {ssword:} {Password for \%1:}
+       if success break
+       output \B\13
+        \%m ::= 6-\%1
+    }
+    if > \%i 5 end 1 {No response from host}
+    xif = \v(minput) 1 {         ; Have username prompt
+       output \%1\13             ; Send username
+        minput 5 {ssword:} {ssword for \%1:} ; Wait for password prompt
+       if fail end 1 {No password prompt}
+    }
+    pause                         ; Wait a sec
+    out \%2\13                    ; Send password
+    if not def \%3 -              ; If we were not given a prompt
+      asg \%3 {\v(prompt)}        ; use the SET LOGIN PROMPT value
+    if not def \%3 -              ; If we still don't have a prompt
+      asg \%3 {\10$ }             ; use this one as the default
+    reinp 0 \%3                   ; Did we INPUT the prompt already?
+    if fail inp 60 \%3            ; No, look now.
+    if fail end 1
+}
+
+COMMENT - VMLINELOGIN macro.  Arguments:
+; \%1 = User ID
+; \%2 = Password
+;
+define VMLINELOGIN {
+    if < \v(argc) 2 -
+      end 1 Usage: \%0 userid [ password ]
+    while not defined \%2 {
+        askq \%2 { \%1's password: }
+    }
+    set parity mark               ; Set communication parameters
+    set flow none
+    set handshake xon
+    set duplex half
+    set input timeout quit        ; Don't bother with IF FAILURE
+    input 10 BREAK KEY            ; Look for BREAK KEY prompt
+    pause 1                       ; Wait a second
+    output \B                     ; Send BREAK
+    input 10 .\17, output logon \%1\13    ; Now log in
+    input 10 .\17, output \%2\13          ; Send password
+    input 10 .\17, output \13             ; Send carriage return
+    input 10 .\17, output \13             ; Send another one
+    end 0
+}
+
+COMMENT - VMFULLOGIN macro.  Arguments:
+; \%1 = User ID
+; \%2 = Password
+;
+define VMFULLOGIN {
+    if < \v(argc) 2 -
+      end 1 Usage: \%0 userid [ password ]
+    while not defined \%2 {
+        askq \%2 { \%1's password: }
+    }
+    set input timeout quit      ; Quit if INPUT fails
+    set parity even             ; Set communication parameters
+    set duplex full
+    set handshake none
+    set flow xon/xoff
+    out \13                     ; Send carriage return
+    inp 5 TERMINAL TYPE:        ; Get terminal-type prompt
+    out vt-100\13               ; Just send "vt-100"
+    inp 20 RUNNING              ; Get RUNNING message
+    pau 1                       ; Wait one second
+    out \%1\9\%2\13             ; Send user ID, tab, password
+    out \13\13                  ; Two more carriage returns
+    end 0
+}
+
+COMMENT - CISLOGIN macro.  Arguments:
+; \%1 = CompuServe User ID
+; \%2 = Password
+; \%3 = Prompt
+;
+define CISLOGIN {
+    if < \v(argc) 2 -
+      end 1 Usage: \%0 userid [ password [ prompt ] ]
+    while not defined \%2 {
+        askq \%2 { \%1's password: }
+    }
+    set terminal bytesize 7     ; No 8-bit characters
+    set input timeout quit      ; Skip the IF FAILURE's
+    output \13                  ; Send initial carriage return
+    input 5 Host Name:          ; Look for Host Name prompt
+    output cis\13               ; Send "cis" and carriage return
+    input 5 User ID:            ; Look for User ID prompt
+    output \%1\13               ; Send ID and carriage return
+    input Password:             ; Look for Password prompt
+    output \%2\13               ; Send password and CR
+    if not def \%3 asg \%3 \v(prompt)
+    if not def \%3 asg \%3 {CompuServe Information Service}
+    input 30 \%3
+    end 0
+}
+
+COMMENT - DOWLOGIN macro.  Arguments:
+; \%1 = Dow Jones Password
+;
+define DOWLOGIN {
+    while not defined \%1 {              ; Get password
+        askq \%1 { Dow Jones password: }
+    }
+    set input timeout proceed
+    input 20 SERVICE PLEASE\?\?\?\?      ; Look for Dow prompt
+    if fail end 1 No service prompt
+    out djnr\13                          ; Select DJNR
+    input 10 @@@@@@@@                        ; Get password prompt
+    if fail end 1 No password prompt
+    pause 1                              ; Wait a second, then...
+    output \%1\13                        ; send password and CR
+    input 30 ENTER QUERY                 ; Get DJNR query prompt
+    if fail end 1 No main query prompt
+    pause 1
+}
+
+COMMENT - DJNRSPRINT macro: Log in to Dow Jones via SprintNet.
+;
+def djnrsprint sprint dow, if success dowlogin
+
+COMMENT - NOLOGIN macro.  Does nothing.  Use when login not required.
+;
+def nologin comment
+
+:CUSTOM ; Customization file
+
+; In VMS and OpenVMS, allow for system-wide site customizations
+
+xif equal "\v(system)" "VMS" {
+    xif exist CKERMIT_INI:CKERMIT.SYS {
+       echo Executing CKERMIT_INI:CKERMIT.SYS
+       take CKERMIT_INI:CKERMIT.SYS
+    }
+}
+
+; Execute user's personal customization file
+
+xif exist \m(_myinit)  {               ; If it exists,
+    echo Executing \m(_myinit)...      ; print message,
+    take \m(_myinit)                   ; and TAKE the file.
+}
+
+; Finish up with traditional greeting.
+
+if < \v(ntime) 43200 echo Good Morning!
+  else if < \v(ntime) 61200 echo Good Afternoon!
+  else echo Good Evening.
+
+End ; of C-Kermit 8.0 initialization file.
diff --git a/ckermit70.txt b/ckermit70.txt
new file mode 100644 (file)
index 0000000..8aca397
--- /dev/null
@@ -0,0 +1,17956 @@
+
+   [ [1]Contents ] [ [2]C-Kermit ] [ [3]Kermit Home ]
+
+                 Supplement to Using C-Kermit, Second Edition
+
+For C-Kermit 7.0
+
+As of C-Kermit version:  7.0.196
+This file last updated:  8 February 2000
+
+Authors: Frank da Cruz and Christine M. Gianone
+Address: The Kermit Project
+         Columbia University
+         612 West 115th Street
+         New York NY 10025-7799
+         USA
+Fax:     +1 (212) 662-6442
+E-Mail:  [4]kermit-support@columbia.edu
+Web:     [5]http://www.columbia.edu/kermit/
+Or:      [6]http://www.kermit-project.org/
+Or:      [7]http://www.columbia.nyc.ny.us/kermit/
+     _________________________________________________________________
+
+  NOTICES
+
+   This document:
+          Copyright Â© 1997, 2000, Frank da Cruz and Christine M. Gianone.
+          All rights reserved.
+
+   Kermit 95:
+          Copyright Â© 1995, 2000, Trustees of Columbia University in the
+          City of New York. All rights reserved.
+
+   C-Kermit:
+          Copyright Â© 1985, 2000,
+          Trustees of Columbia University in the City of New York. All
+          rights reserved. See the C-Kermit [8]COPYING.TXT file or the
+          copyright text in the [9]ckcmai.c module for disclaimer and
+          permissions.
+
+   When Kerberos(TM) and/or SRP(TM) (Secure Remote Password) and/or SSL
+          protocol are included:
+          Portions Copyright Â© 1990, Massachusetts Institute of
+          Technology.
+          Portions Copyright Â© 1991, 1993 Regents of the University of
+          California.
+          Portions Copyright Â© 1991, 1992, 1993, 1994, 1995 by AT&T.
+          Portions Copyright Â© 1997, Stanford University.
+          Portions Copyright Â© 1995-1997, Eric Young
+          <eay@cryptosoft.com>.
+
+   For the full text of the third-party copyright notices, see
+   [10]Appendix V.
+     _________________________________________________________________
+
+  WHAT IS IN THIS FILE
+
+   This file lists changes made to C-Kermit since the second edition of
+   the book [11]Using C-Kermit was published and C-Kermit 6.0 was
+   released in November 1996. Use this file as a supplement to the second
+   edition of Using C-Kermit until the third edition is published some
+   time in 2000. If the "most recent update" shown above is long ago,
+   contact Columbia University to see if there is a newer release.
+
+   For further information, also see the [12]CKCBWR.TXT ("C-Kermit
+   beware") file for hints, tips, tricks, restrictions, frequently asked
+   questions, etc, plus the system-specific "beware file", e.g.
+   [13]CKUBWR.TXT for UNIX, [14]CKVBWR.TXT for VMS, etc, and also any
+   system-specific update files such as KERMIT95.HTM for Kermit 95 (in
+   the DOCS\MANUAL\ subdirectory of your K95 directory).
+
+     This Web-based copy of the C-Kermit 7.0 update notes supersedes the
+     plain-text CKERMIT2.TXT file. All changes after 19 January 2000
+     appear only here in the Web version. If you need an up-to-date
+     plain-text copy, use your Web browser to save this page as plain
+     text. 
+     _________________________________________________________________
+
+  ABOUT FILENAMES
+
+   In this document, filenames are generally shown in uppercase, but on
+   file systems with case-sensitive names such as UNIX, OS-9, and AOS/VS,
+   lowercase names are used: [15]ckubwr.txt, [16]ckermit70.txt, etc.
+     _________________________________________________________________
+
+  ADDITIONAL FILES
+
+   Several other files accompany this new Kermit release:
+
+   SECURITY.TXT
+          Discussion of Kermit's new authentication and encryption
+          features:
+
+          + [17]Plain-text version
+          + [18]HTML (hypertext) version
+
+   IKSD.TXT
+          How to install and manage an Internet Kermit Service Daemon.
+
+          + [19]Plain-text version
+          + [20]HTML (hypertext) version
+
+          Also see [21]cuiksd.htm for instructions for use.
+
+   TELNET.TXT
+          A thorough presentation of Kermit's new advanced Telnet
+          features and controls.
+
+          + [22]Plain-text version
+          + [23]HTML (hypertext) version
+     _________________________________________________________________
+
+  THE NEW C-KERMIT LICENSE
+
+   The C-Kermit license was rewritten for version 7.0 to grant automatic
+   permission to packagers of free operating-system distributions to
+   include C-Kermit 7.0. Examples include Linux (GNU/Linux), FreeBSD,
+   NetBSD, etc. The new license is in the [24]COPYING.TXT file, and is
+   also displayed by C-Kermit itself when you give the VERSION or
+   COPYRIGHT command. The new C-Kermit license does not apply to
+   [25]Kermit 95.
+     _________________________________________________________________
+
+  ACKNOWLEDGMENTS
+
+   Thanks to Jeff Altman, who joined the Kermit Project in 1995, for much
+   of what you see in C-Kermit 7.0, especially in the networking and
+   security areas, and his key role in designing and implementing the
+   Internet Kermit Service Daemon. And special thanks to Lucas Hart for
+   lots of help with the VMS version; to Peter Eichhorn for continuous
+   testing on the full range of HP-UX versions and for a consolidated set
+   of HP-UX makefile targets; and to Colin Allen, Mark Allen, Roger
+   Allen, Ric Anderson, William Bader, Mitch Baker, Mitchell Bass, Nelson
+   Beebe, Gerry Belanger, Jeff Bernsten, Mark Berryman, John Bigg, Volker
+   Borchert, Jonathan Boswell, Tim Boyer, Frederick Bruckman, Kenneth
+   Cochran, Jared Crapo, Bill Delaney, Igor Sobrado Delgado, Clarence
+   Dold, Joe Doupnik, John Dunlap, Max Evarts, Patrick French, Carl
+   Friedberg, Carl Friend, Hirofumi Fujii, Andrew Gabriel, Gabe Garza,
+   Boyd Gerber, David Gerber, George Gilmer, Hunter Goatley, DJ Hagberg,
+   Kevin Handy, Andy Harper, Randolph Herber, Sven Holström, Michal
+   Jaegermann, Graham Jenkins, Dick Jones, Terry Kennedy, Robert D Keys,
+   Nick Kisseberth, Igor Kovalenko, David Lane, Adam Laurie, Jeff
+   Liebermann, Eric Lonvick, Hoi Wan Louis, Arthur Marsh, Gregorie
+   Martin, Peter Mauzey, Dragan Milicic, Todd Miller, Christian Mondrup,
+   Daniel Morato, Dat Nguyen, Herb Peyerl, Jean-Pierre Radley, Steve
+   Rance, Stephen Riehm, Nigel Roles, Larry Rosenman, Jay S Rouman, David
+   Sanderson, John Santos, Michael Schmitz, Steven Schultz, Bob Shair,
+   Richard Shuford, Fred Smith, Michael Sokolov, Jim Spath, Peter Szell,
+   Ted T'so, Brian Tillman, Linus Torvalds, Patrick Volkerding, Martin
+   Vorländer, Steve Walton, Ken Weaverling, John Weekley, Martin
+   Whitaker, Jim Whitby, Matt Willman, Joellen Windsor, Farrell Woods,
+   and many others for binaries, hosting, reviews, suggestions, advice,
+   bug reports, and all the rest over the 3+ year C-Kermit 7.0
+   development cycle. Thanks to Russ Nelson and the board of the Open
+   Software Initiative ([26]http://www.opensource.org) for their
+   cooperation in developing the new C-Kermit license and to the
+   proprietors of those free UNIX distributions that have incorporated
+   C-Kermit 7.0 for their cooperation and support, especially FreeBSD's
+   Jörg Wunsch.
+     _________________________________________________________________
+
+  NOTE TO KERMIT 95 USERS
+
+   Kermit 95 and C-Kermit share the same command and scripting language,
+   the same Kermit file-transfer protocol implementation, and much else
+   besides.
+
+   Like the book [27]Using C-Kermit, this file concentrates on the
+   aspects of C-Kermit that are common to all versions: UNIX, VMS,
+   Windows, OS/2, VOS, AOS/VS, etc. Please refer to your Kermit 95
+   documentation for information that is specific to Kermit 95.
+
+   C-Kermit 7.0 corresponds to Kermit 95 1.1.19.
+     _________________________________________________________________
+
+  C-KERMIT VERSIONS AND VERSION NUMBERS
+
+   "C-Kermit" refers to all the many programs that are compiled in whole
+   or in part from common C-language source code, comprising:
+
+     * A Kermit file transfer protocol module
+     * A command parser and script execution module
+     * A modem-dialing module
+     * A network support module
+     * A character-set translation module.
+
+   and several others. These "system-independent" modules are combined
+   with system-dependent modules for each platform to provide the
+   required input/output functions, and also in some cases overlaid with
+   an alternative user interface, such as Macintosh Kermit's
+   point-and-click interface, and in some cases also a terminal emulator,
+   as Kermit 95.
+
+   The C-Kermit version number started as 1.0, ... 3.0, 4.0, 4.1 and then
+   (because of confusion at the time with Berkeley UNIX 4.2), 4B, 4C, and
+   so on, with the specific edit number in parentheses, for example
+   4E(072) or 5A(188). This scheme was used through 5A(191), but now we
+   have gone back to the traditional numbering scheme with decimal
+   points: major.minor.edit; for example 7.0.196. Internal version
+   numbers (the \v(version) variable), however, are compatible in
+   C-Kermit 5A upwards.
+
+   Meanwhile, C-Kermit derivatives for some platforms (Windows,
+   Macintosh) might go through several releases while C-Kermit itself
+   remains the same. These versions have their own platform-specific
+   version numbers, such as Kermit 95 1.1.1, 1.1.2, and so on.
+
+   C-Kermit Version History:
+
+  1.0       1981-1982         Command-line only, 4.2 BSD UNIX only
+  2.0       (*)               (who remembers...)
+  3.0       May 1984          Command-line only, supports several platforms
+  4.0-4.1   Feb-Apr 1985 (*)  First interactive and modular version
+  4C(050)   May 1985
+  4D(060)   April 1986
+  4E(066)   August 1987       Long packets
+  4E(068)   January 1988
+  4E(072)   January 1989
+  4F(095)   August 1989 (*)   Attribute packets
+  5A(188)   November 1992     Scripting, TCP/IP, sliding windows (1)
+  5A(189)   September 1993    Control-char unprefixing
+  5A(190)   October 1994      Recovery
+  5A(191)   April 1995        OS/2 only
+  6.0.192   September 1996    Intelligent dialing, autodownload, lots more (2)
+  6.1.193   1997-98 (*)       Development only
+  6.1.194   June 1998         K95 only - switches, directory recursion, more
+  7.0.195   August 1999       IKSD + more (CU only as K95 1.1.18-CU)
+  7.0.196   1 January 2000    Unicode, lots more
+
+   (*) Never formally released (4.0 was a total rewrite)
+   (1) Using C-Kermit, 1st Edition
+   (2) Using C-Kermit, 2nd Edition
+     _________________________________________________________________
+
+CONTENTS
+
+ I.  [28]C-KERMIT DOCUMENTATION
+
+ II. [29]NEW FEATURES
+
+     (0) [30]INCOMPATIBILITIES WITH PREVIOUS RELEASES
+     (1) [31]PROGRAM AND FILE MANAGEMENT AND COMMANDS
+         1.0.  [32]Bug fixes
+         1.1.  [33]Command Continuation
+         1.2.  [34]Editor Interface
+         1.3.  [35]Web Browser and FTP Interface
+         1.4.  [36]Command Editing
+         1.5.  [37]Command Switches
+               1.5.1. [38]General Switch Syntax
+               1.5.2. [39]Order and Effect of Switches
+               1.5.3. [40]Distinguishing Switches from Other Fields
+               1.5.4. [41]Standard File Selection Switches
+               1.5.5. [42]Setting Preferences for Different Commands
+         1.6.  [43]Dates and Times
+         1.7.  [44]Partial Completion of Keywords
+         1.8.  [45]Command Recall
+         1.9.  [46]EXIT Messages
+         1.10. [47]Managing Keyboard Interruptions
+         1.11. [48]Taming the Wild Backslash -- Part Deux
+               1.11.1. [49]Background
+               1.11.2. [50]Kermit's Quoting Rules
+               1.11.3. [51]Passing DOS Filenames from Kermit to Shell Commands
+               1.11.4. [52]Using Variables to Hold DOS Filenames
+               1.11.5. [53]Passing DOS Filenames as Parameters to Macros
+               1.11.6. [54]Passing DOS File Names from Macro Parameters to the
+DOS Shell
+               1.11.7. [55]Passing DOS Filenames to Kermit from the Shell
+         1.12. [56]Debugging
+         1.13. [57]Logs
+         1.14. [58]Automatic File-Transfer Packet Recognition at the Command Pr
+ompt
+         1.15. [59]The TYPE Command
+         1.16. [60]The RESET Command
+         1.17. [61]The COPY and RENAME Commands
+         1.18. [62]The MANUAL Command
+         1.19. [63]String and Filename Matching Patterns
+         1.20. [64]Multiple Commands on One Line
+         1.21. [65]What Do I Have?
+         1.22. [66]Generalized File Input and Output
+               1.22.1. [67]Why Another I/O System?
+               1.22.2. [68]The FILE Command
+               1.22.3. [69]FILE Command Examples
+               1.22.4. [70]Channel Numbers
+               1.22.5. [71]FILE Command Error Codes
+               1.22.6. [72]File I/O Variables
+               1.22.7. [73]File I/O Functions
+               1.22.8. [74]File I/O Function Examples
+         1.23. [75]The EXEC Command
+         1.24. [76]Getting Keyword Lists with '?'
+     (2) [77]MAKING AND USING CONNECTIONS
+         2.0. [78]SET LINE and SET HOST Command Switches
+         2.1. [79]Dialing
+              2.1.1. [80]The Dial Result Message
+              2.1.2. [81]Long-Distance Dialing Changes
+              2.1.3. [82]Forcing Long-Distance Dialing
+              2.1.4. [83]Exchange-Specific Dialing Decisions
+              2.1.5. [84]Cautions about Cheapest-First Dialing
+              2.1.6. [85]Blind Dialing (Dialing with No Dialtone)
+              2.1.7. [86]Trimming the Dialing Dialog
+              2.1.8. [87]Controlling the Dialing Speed
+              2.1.9. [88]Pretesting Phone Number Conversions
+              2.1.10. [89]Greater Control over Partial Dialing
+              2.1.11. [90]New DIAL-related Variables and Functions
+              2.1.12. [91]Increased Flexibility of PBX Dialing
+              2.1.13. [92]The DIAL macro - Last-Minute Phone Number Conversions
+              2.1.14. [93]Automatic Tone/Pulse Dialing Selection
+              2.1.15. [94]Dial-Modifier Variables
+              2.1.16. [95]Giving Multiple Numbers to the DIAL Command
+         2.2. [96]Modems
+              2.2.1. [97]New Modem Types
+              2.2.2. [98]New Modem Controls
+         2.3. [99]TELNET and RLOGIN
+              2.3.0. [100]Bug Fixes
+              2.3.1. [101]Telnet Binary Mode Bug Adjustments
+              2.3.2. [102]VMS UCX Telnet Port Bug Adjustment
+              2.3.3. [103]Telnet New Environment Option
+              2.3.4. [104]Telnet Location Option
+              2.3.5. [105]Connecting to Raw TCP Sockets
+              2.3.6. [106]Incoming TCP Connections
+         2.4. [107]The EIGHTBIT Command
+         2.5. [108]The Services Directory
+         2.6. [109]Closing Connections
+         2.7. [110]Using C-Kermit with External Communication Programs
+              2.7.0. [111]C-Kermit over tn3270 and tn5250
+              2.7.1. [112]C-Kermit over Telnet
+              2.7.2. [113]C-Kermit over Rlogin
+              2.7.3. [114]C-Kermit over Serial Communication Programs
+              2.7.4. [115]C-Kermit over Secure Network Clients
+              2.7.4.1. [116]SSH
+              2.7.4.2. [117]SSL
+              2.7.4.3. [118]SRP
+              2.7.4.4. [119]SOCKS
+              2.7.4.5. [120]Kerberos and SRP
+         2.8. [121]Scripting Local Programs
+         2.9. [122]X.25 Networking
+              2.9.1. [123]IBM AIXLink/X.25 Network Provider Interface for AIX
+              2.9.2. [124]HP-UX X.25
+         2.10. [125]Additional Serial Port Controls
+         2.11. [126]Getting Access to the Dialout Device
+         2.12. [127]The Connection Log
+         2.13. [128]Automatic Connection-Specific Flow Control Selection
+         2.14. [129]Trapping Connection Establishment and Loss
+         2.15. [130]Contacting Web Servers with the HTTP Command
+     (3) [131]TERMINAL CONNECTION
+         3.1. [132]CONNECT Command Switches
+         3.2. [133]Triggers
+         3.3. [134]Transparent Printing
+         3.4. [135]Binary and Text Session Logs
+     (4) [136]FILE TRANSFER AND MANAGEMENT
+         4.0. [137]Bug Fixes, Minor Changes, and Clarifications
+         4.1. [138]File-Transfer Filename Templates
+         4.1.1. [139]Templates in the As-Name
+         4.1.2. [140]Templates on the Command Line
+         4.1.3. [141]Post-Transfer Renaming
+         4.2. [142]File-Transfer Pipes and Filters
+         4.2.1. [143]Introduction
+         4.2.1.1. [144]Terminology
+         4.2.1.2. [145]Notation
+         4.2.1.3. [146]Security
+         4.2.2. [147]Commands for Transferring from and to Pipes
+         4.2.2.1. [148]Sending from a Command
+         4.2.2.2. [149]Receiving to a Command
+         4.2.3. [150]Using File-Transfer Filters
+         4.2.3.1. [151]The SEND Filter
+         4.2.3.2. [152]The RECEIVE Filter
+         4.2.4. [153]Implicit Use of Pipes
+         4.2.5. [154]Success and Failure of Piped Commands
+         4.2.6. [155]Cautions about Using Pipes to Transfer Directory Trees
+         4.2.7. [156]Pipes and Encryption
+         4.2.8. [157]Commands and Functions Related to Pipes
+         4.2.8.1. [158]The OPEN !READ and OPEN !WRITE Commands
+         4.2.8.2. [159]The REDIRECT Command
+         4.2.8.3. [160]Receiving Mail and Print Jobs
+         4.2.8.4. [161]Pipe-Related Functions
+         4.3. [162]Automatic Per-File Text/Binary Mode Switching
+         4.3.1. [163]Exceptions
+         4.3.2. [164]Overview
+         4.3.3. [165]Commands
+         4.3.4. [166]Examples
+         4.4. [167]File Permissions
+         4.4.1. [168]When ATTRIBUTES PROTECTION is OFF
+         4.4.1.1. [169]Unix
+         4.4.1.2. [170]VMS
+         4.4.2. [171]When ATTRIBUTES PROTECTION is ON
+         4.4.2.1. [172]System-Specific Permissions
+         4.4.2.1.1. [173]UNIX
+         4.4.2.1.2. [174]VMS
+         4.4.2.2. [175]System-Independent Permissions
+         4.5. [176]File Management Commands
+         4.5.1. [177]The DIRECTORY Command
+         4.5.2. [178]The CD and BACK Commands
+         4.5.2.1. [179]Parsing Improvements
+         4.5.2.2. [180]The CDPATH
+         4.5.3. [181]Creating and Removing Directories
+         4.5.4. [182]The DELETE and PURGE Commands
+         4.6. [183]Starting the Remote Kermit Server Automatically
+         4.7. [184]File-Transfer Command Switches
+         4.7.1. [185]SEND Command Switches
+         4.7.2. [186]GET Command Switches
+         4.7.3. [187]RECEIVE Command Switches
+         4.8. [188]Minor Kermit Protocol Improvements
+         4.8.1. [189]Multiple Attribute Packets
+         4.8.2. [190]Very Short Packets
+         4.9. [191]Wildcard / File Group Expansion
+         4.9.1. [192]In UNIX C-Kermit
+         4.9.2. [193]In Kermit 95
+         4.9.3. [194]In VMS, AOS/VS, OS-9, VOS, etc.
+         4.10. [195]Additional Pathname Controls
+         4.11. [196]Recursive SEND and GET: Transferring Directory Trees
+         4.11.1. [197]Command-Line Options
+         4.11.2. [198]The SEND /RECURSIVE Command
+         4.11.3. [199]The GET /RECURSIVE Command
+         4.11.4. [200]New and Changed File Functions
+         4.11.5. [201]Moving Directory Trees Between Like Systems
+         4.11.6. [202]Moving Directory Trees Between Unlike Systems
+         4.12. [203]Where Did My File Go?
+         4.13. [204]File Output Buffer Control
+         4.14. [205]Improved Responsiveness
+         4.15. [206]Doubling and Ignoring Characters for Transparency
+         4.16. [207]New File-Transfer Display Formats
+         4.17. [208]New Transaction Log Formats
+         4.17.1. [209]The BRIEF Format
+         4.17.2. [210]The FTP Format
+         4.18. [211]Unprefixing NUL
+         4.19. [212]Clear-Channel Protocol
+         4.20. [213]Streaming Protocol
+         4.20.1. [214]Commands for Streaming
+         4.20.2. [215]Examples of Streaming
+         4.20.2.1. [216]Streaming on Socket-to-Socket Connections
+         4.20.2.2. [217]Streaming on Telnet Connections
+         4.20.2.3. [218]Streaming with Limited Packet Length
+         4.20.2.4. [219]Streaming on Dialup Connections
+         4.20.2.5. [220]Streaming on X.25 Connections
+         4.20.3. [221]Streaming - Preliminary Conclusions
+         4.21. [222]The TRANSMIT Command
+         4.22. [223]Coping with Faulty Kermit Implementations
+         4.22.1. [224]Failure to Accept Modern Negotiation Strings
+         4.22.2. [225]Failure to Negotiate 8th-bit Prefixing
+         4.22.3. [226]Corrupt Files
+         4.22.4. [227]Spurious Cancellations
+         4.22.5. [228]Spurious Refusals
+         4.22.6. [229]Failures during the Data Transfer Phase
+         4.22.7. [230]Fractured Filenames
+         4.22.8. [231]Bad File Dates
+         4.23. [232]File Transfer Recovery
+         4.24. [233]FILE COLLISION UPDATE Clarification
+         4.25. [234]Autodownload Improvements
+     (5) [235]CLIENT/SERVER
+         5.0. [236]Hints
+         5.1. [237]New Command-Line Options
+         5.2. [238]New Client Commands
+         5.3. [239]New Server Capabilities
+         5.3.1. [240]Creating and Removing Directories
+         5.3.2. [241]Directory Listings
+         5.4. [242]Syntax for Remote Filenames with Embedded Spaces
+         5.5. [243]Automatic Orientation Messages upon Directory Change
+         5.6. [244]New Server Controls
+         5.7. [245]Timeouts during REMOTE HOST Command Execution
+     (6) [246]INTERNATIONAL CHARACTER SETS
+         6.0. [247]ISO 8859-15 Latin Alphabet 9
+         6.1. [248]The HP-Roman8 Character Set
+         6.2. [249]Greek Character Sets
+         6.3. [250]Additional Latin-2 Character Sets
+         6.4. [251]Additional Cyrillic Character Sets
+         6.5. [252]Automatic Character-Set Switching
+         6.6. [253]Unicode
+         6.6.1. [254]Overview of Unicode
+         6.6.2. [255]UCS Byte Order
+         6.6.2. [256]UCS Transformation Formats
+         6.6.3. [257]Conformance Levels
+         6.6.4. [258]Relationship of Unicode with Kermit's Other Character Sets
+         6.6.5. [259]Kermit's Unicode Features
+         6.6.5.1. [260]File Transfer
+         6.6.5.2. [261]The TRANSLATE Command
+         6.6.5.3. [262]Terminal Connection
+         6.6.5.4. [263]The TRANSMIT Command
+         6.6.5.5. [264]Summary of Kermit Unicode Commands
+         6.7. [265]Client/Server Character-Set Switching
+     (7) [266]SCRIPT PROGRAMMING
+         7.0. [267]Bug Fixes
+         7.1. [268]The INPUT Command
+         7.1.1. [269]INPUT Timeouts
+         7.1.2. [270]New INPUT Controls
+         7.1.3. [271]INPUT with Pattern Matching
+         7.1.4. [272]The INPUT Match Result
+         7.2. [273]New or Improved Built-In Variables
+         7.3. [274]New or Improved Built-In Functions
+         7.4. [275]New IF Conditions
+         7.5. [276]Using More than Ten Macro Arguments
+         7.6. [277]Clarification of Function Call Syntax
+         7.7. [278]Autodownload during INPUT Command Execution
+         7.8. [279]Built-in Help for Functions.
+         7.9. [280]Variable Assignments
+         7.9.1. [281]Assignment Operators
+         7.9.2. [282]New Assignment Commands
+         7.10. [283]Arrays
+         7.10.1. [284]Array Initializers
+         7.10.2. [285]Turning a String into an Array of Words
+         7.10.3. [286]Arrays of Filenames
+         7.10.4. [287]Automatic Arrays
+         7.10.5. [288]Sorting Arrays
+         7.10.6. [289]Displaying Arrays
+         7.10.7. [290]Other Array Operations
+         7.10.8. [291]Hints for Using Arrays
+         7.10.9. [292]Do-It-Yourself Arrays
+         7.10.10. [293]Associative Arrays
+         7.11. [294]OUTPUT Command Improvements
+         7.12. [295]Function and Variable Diagnostics
+         7.13. [296]Return Value of Macros
+         7.14. [297]The ASSERT, FAIL, and SUCCEED Commands.
+         7.15. [298]Using Alarms
+         7.16. [299]Passing Arguments to Command Files
+         7.17. [300]Dialogs with Timed Responses
+         7.18. [301]Increased Flexibility of SWITCH Case Labels
+         7.19. "[302]Kerbang" Scripts
+         7.20. [303]IF and XIF Statement Syntax
+         7.20.1. [304]The IF/XIF Distinction
+         7.20.2. [305]Boolean Expressions (The IF/WHILE Condition)
+         7.21. [306]Screen Formatting and Cursor Control
+         7.22. [307]Evaluating Arithmetic Expressions
+         7.23. [308]Floating-Point Arithmetic
+         7.24. [309]Tracing Script Execution
+         7.25. [310]Compact Substring Notation
+         7.26. [311]New WAIT Command Options
+         7.26.1. [312]Waiting for Modem Signals
+         7.26.2. [313]Waiting for File Events
+         7.27. [314]Relaxed FOR and SWITCH Syntax
+     (8) [315]USING OTHER FILE TRANSFER PROTOCOLS
+     (9) [316]COMMAND-LINE OPTIONS
+         9.0. [317]Extended-Format Command-Line Options
+         9.1. [318]Command Line Personalities
+         9.2. [319]Built-in Help for Command Line Options
+         9.3. [320]New Command-Line Options
+    (10) [321]C-KERMIT AND G-KERMIT
+
+III. [322]APPENDICES
+
+III.1. [323]Character Set Tables
+III.1.1. [324]The Hewlett Packard Roman8 Character Set
+III.1.2. [325]Greek Character Sets
+III.1.2.1. [326]The ISO 8859-7 Latin / Greek Alphabet
+III.1.2.2. [327]The ELOT 927 Character Set
+III.1.2.3. [328]PC Code Page 869
+III.2. [329]Updated Country Codes
+
+IV. [330]ERRATA & CORRIGENDA: Corrections to "Using C-Kermit" 2nd Edition.
+V. [331]ADDITIONAL COPYRIGHT NOTICES
+     _________________________________________________________________
+
+I. C-KERMIT DOCUMENTATION
+
+   The user manual for C-Kermit is:
+
+     Frank da Cruz and Christine M. Gianone, [332]Using C-Kermit, Second
+     Edition, Digital Press / Butterworth-Heinemann, Woburn, MA, 1997,
+     622 pages, ISBN 1-55558-164-1.
+
+   [333]CLICK HERE for reviews.
+
+   The present document is a supplement to Using C-Kermit 2nd Ed, not a
+   replacement for it.
+
+   US single-copy price: $52.95; quantity discounts available. Available
+   in bookstores or directly from Columbia University:
+
+  The Kermit Project
+  Columbia University
+  612 West 115th Street
+  New York NY  10025-7799
+  USA
+  Telephone: +1 (212) 854-3703
+  Fax:       +1 (212) 662-6442
+
+   Domestic and overseas orders accepted. Price: US $44.95 (US, Canada,
+   and Mexico). Shipping: $4.00 within the USA; $15.00 to all other
+   countries. Orders may be paid by MasterCard or Visa, or prepaid by
+   check in US dollars. Add $65 bank fee for checks not drawn on a US
+   bank. Do not include sales tax. Inquire about quantity discounts.
+
+   You can also order by phone from the publisher, Digital Press /
+   [334]Butterworth-Heinemann, with MasterCard, Visa, or American
+   Express:
+
+  +1 800 366-2665   (Woburn, Massachusetts office for USA & Canada)
+  +44 1865 314627   (Oxford, England distribution centre for UK & Europe)
+  +61 03 9245 7111  (Melbourne, Vic, office for Australia & NZ)
+  +65 356-1968      (Singapore office for Asia)
+  +27 (31) 2683111  (Durban office for South Africa)
+
+   A [335]German-language edition of the First Edition is also available:
+
+     Frank da Cruz and Christine M. Gianone, C-Kermit - Einführung und
+     Referenz, Verlag Heinz Heise, Hannover, Germany (1994). ISBN
+     3-88229-023-4. Deutsch von Gisbert W. Selke. Price: DM 88,00.
+     Verlag Heinz Heise GmbH & Co. KG, Helstorfer Strasse 7, D-30625
+     Hannover. Tel. +49 (05 11) 53 52-0, Fax. +49 (05 11) 53 52-1 29.
+
+   The [336]Kermit file transfer protocol is specified in:
+
+     Frank da Cruz, Kermit, A File Transfer Protocol, Digital Press,
+     Bedford, MA, 1987, 379 pages, ISBN 0-932376-88-6. US single-copy
+     price: $39.95. Availability as above.
+
+   News and articles about Kermit software and protocol are published
+   periodically in the journal, [337]Kermit News. Subscriptions are free;
+   contact Columbia University at the address above.
+
+   Online news about Kermit is published in the
+   [338]comp.protocols.kermit.announce and
+   [339]comp.protocols.kermit.misc newsgroups.
+     _________________________________________________________________
+
+II. NEW FEATURES
+
+   Support for the Bell Labs Plan 9 operating system was added to version
+   6.0 too late to be mentioned in the book (although it does appear on
+   the cover).
+
+   Specific changes and additions are grouped together by major topic,
+   roughly corresponding to the chapters of [340]Using C-Kermit.
+     _________________________________________________________________
+
+  0. INCOMPATIBILITIES WITH PREVIOUS RELEASES
+
+    1. C-Kermit 7.0 uses FAST Kermit protocol settings by default. This
+       includes "unprefixing" of certain control characters. Because of
+       this, file transfers that worked with previous releases might not
+       work in the new release (but it is more likely that they will
+       work, and much faster). If a transfer fails, you'll get a
+       context-sensitive hint suggesting possible causes and cures.
+       Usually SET PREFIXING ALL does the trick.
+    2. C-Kermit 7.0 transfers files in BINARY mode by default. To restore
+       the previous behavior, put SET FILE TYPE TEXT in your C-Kermit
+       initialization file.
+    3. No matter whether FILE TYPE is BINARY or TEXT by default, C-Kermit
+       7.0 now switches between text and binary mode automatically on a
+       per-file basis according to various criteria, including (a) which
+       kind of platform is on the other end of the connection (if known),
+       (b) the version of Kermit on the other end, and (c) the file's
+       name (see [341]Section 4, especially [342]4.3). To disable this
+       automatic switching and restore the earlier behavior, put SET
+       TRANSFER MODE MANUAL in your C-Kermit initialization file. To
+       disable automatic switching for a particular transfer, include a
+       /TEXT or /BINARY switch with your SEND or GET command.
+    4. The RESEND and REGET commands automatically switch to binary mode;
+       previously if RESEND or REGET were attempted when FILE TYPE was
+       TEXT, these commands would fail immediately, with a message
+       telling you they work only when the FILE TYPE is BINARY. Now they
+       simply do this for you. See [343]Section 4.23 for additional
+       (important) information.
+    5. SET PREFIXING CAUTIOUS and MINIMAL now both prefix linefeed (10
+       and 138) in case rlogin, ssh, or cu are "in the middle", since
+       otherwise <LF>~ might appear in Kermit packets, and this would
+       cause rlogin, ssh, or cu to disconnect, suspend,escape back, or
+       otherwise wreck the file transfer. Xon and Xoff are now always
+       prefixed too, even when Xon/Xoff flow control is not in effect,
+       since unprefixing them has proven dangerous on TCP/IP connections.
+    6. In UNIX, VMS, Windows, and OS/2, the DIRECTORY command is built
+       into C-Kermit itself rather than implemented by running an
+       external command or program. The built-in command might not behave
+       the way the platform-specific external one did, but many options
+       are available for customization. Of course the underlying
+       platform-specific command can still be accessed with "!", "@", or
+       "RUN" wherever the installation does not forbid. In UNIX, the "ls"
+       command can be accessed directly as "ls" in C-Kermit. See
+       [344]Section 4.5.1 for details.
+    7. SEND ? prints a list of switches rather than a list of filenames.
+       If you want to see a list of filenames, use a (system-dependent)
+       construction such as SEND ./? (for UNIX, Windows, or OS/2), SEND
+       []? (VMS), etc. See [345]Sections 1.5 and [346]4.7.1.
+    8. In UNIX, OS-9, and Kermit 95, the wildcard characters in previous
+       versions were * and ?. In C-Kermit 7.0 they are *, ?, [, ], {, and
+       }, with dash used inside []'s to denote ranges and comma used
+       inside {} to separate list elements. If you need to include any of
+       these characters literally in a filename, precede each one with
+       backslash (\). See [347]Section 4.9.
+    9. SET QUIET { ON, OFF } is now on the command stack, just like SET
+       INPUT CASE, SET COUNT, SET MACRO ERROR, etc, as described on p.458
+       of [348]Using C-Kermit, 2nd Edition. This allows any macro or
+       command file to SET QUIET ON or OFF without worrying about saving
+       and restoring the global QUIET value. For example, this lets you
+       write a script that tries SET LINE on lots of devices until it
+       finds one free without spewing out loads of error messages, and
+       also without disturbing the global QUIET setting, whatever it was.
+   10. Because of the new "." operator (which introduces assignments),
+       macros whose names begin with "." can not be invoked "by name".
+       However, they still can be invoked with DO.
+   11. The syntax of the EVALUATE command has changed. See [349]Section
+       7.9.2. To restore the previous syntax, use SET EVALUATE OLD.
+   12. The \v(directory) variable now includes the trailing directory
+       separator; in previous releases it did not. This is to allow
+       constructions such as:
+  cd \v(dir)data.tmp
+       to work across platforms that might have different directory
+       notation, such as UNIX, Windows, and VMS.
+   13. Prior to C-Kermit 7.0, the FLOW-CONTROL setting was global and
+       sticky. In C-Kermit 7.0, there is an array of default flow-control
+       values for each kind of connection, that are applied automatically
+       at SET LINE/PORT/HOST time. Thus a SET FLOW command given before
+       SET LINE/PORT/HOST is likely to be undone. Therefore SET FLOW can
+       be guaranteed to have the desired effect only if given after the
+       SET LINE/PORT/HOST command.
+   14. Character-set translation works differently in the TRANSMIT
+       command when (a) the file character-set is not the same as the
+       local end of the terminal character-set, or (b) when the terminal
+       character-set is TRANSPARENT.
+     _________________________________________________________________
+
+  1. PROGRAM AND FILE MANAGEMENT AND COMMANDS
+
+  1.0. Bug Fixes
+
+   The following patches were issued to correct bugs in C-Kermit 6.0.
+   These are described in detail in the 6.0 PATCHES file. All of these
+   fixes have been incorporated in C-Kermit 6.1 (never released except as
+   K95 1.1.16-17) and 7.0.
+
+ 0001   All UNIX         C-Kermit mishandles timestamps on files before 1970
+ 0002   Solaris 2.5++    Compilation error on Solaris 2.5 with Pro C
+ 0003   All VMS          CKERMIT.INI Fix for VMS
+ 0004   VMS/VAX/UCX 2.0  C-Kermit 6.0 can't TELNET on VAX/VMS with UCX 2.0
+ 0005   All              C-Kermit Might Send Packets Outside Window
+ 0006   All              MOVE from SEND-LIST does not delete original files
+ 0007   Solaris 2.5++    Higher serial speeds on Solaris 2.5
+ 0008   All              C-Kermit application file name can't contain spaces
+ 0009   AT&T 7300 UNIXPC setuid and hardware flow-control problems
+ 0010   Linux on Alpha   Patch to make ckutio.c compile on Linux/Alpha
+ 0011   OS-9/68000 2.4   Patch to make ck9con.c compile on OS-9/68000 2.4
+ 0012   MW Coherent 4.2  Patches for successful build on Coherent 4.2
+ 0013   SINIX-Y 5.43     "delay" variable conflicts with <sys/clock.h>
+ 0014   VMS/VAX/CMU-IP   Subject: Patches for VAX/VMS 5.x + CMU-IP
+ 0015   All              XECHO doesn't flush its output
+ 0016   VMS              CD and other directory operations might not work
+ 0017   Linux 1.2.x++    Use standard POSIX interface for high serial speeds
+ 0018   UNIX             SET WILDCARD-EXPANSION SHELL dumps core
+ 0019   All              Hayes V.34 modem init string problem
+ 0020   All              READ command does not fail if file not open
+ 0021   All              Problems with long function arguments
+ 0022   All              Certain \function()s can misbehave
+ 0023   All              X MOD 0 crashes program
+ 0024   All              Internal bulletproofing for lower() function
+ 0025   OpenBSD          Real OpenBSD support for C-Kermit 6.0
+ 0026   All              Incorrect checks for macro/command-file nesting depth
+ 0027   All              ANSWER doesn't automatically CONNECT
+ 0028   All              Overzealous EXIT warning
+ 0029   All              OUTPUT doesn't echo when DUPLEX is HALF
+ 0030   All              Minor problems with REMOTE DIRECTORY/DELETE/etc
+ 0031   All              CHECK command broken
+ 0032   All              Problem with SET TRANSMIT ECHO
+ 0033   UNIX, VMS, etc   HELP SET SERVER says too much
+ 0034   All              READ and !READ too picky about line terminators
+ 0035   All              END from inside SWITCH doesn't work
+ 0036   All              Problem telnetting to multihomed hosts
+ 0037   All              Redirection failures in REMOTE xxx > file
+
+   REDIRECT was missing in many UNIX C-Kermit implementations; in version
+   7.0, it should be available in all of them.
+     _________________________________________________________________
+
+  1.1. Command Continuation
+
+   Comments that start with ";" or "#" can no longer be continued. In:
+
+  ; this is a comment -
+  echo blah
+
+   the ECHO command will execute, rather than being taken as a
+   continuation of the preceding comment line. This allows easy
+   "commenting out" of commands from macro definitions.
+
+   However, the text of the COMMENT command can still be continued onto
+   subsequent lines:
+
+  comment this is a comment -
+  echo blah
+
+   As of version 6.0, backslash is no longer a valid continuation
+   character. Only hyphen should be used for command continuation. This
+   is to make it possible to issue commands like "cd a:\" on DOS-like
+   systems.
+
+   As of version 7.0:
+
+     * You can quote a final dash to prevent it from being a continuation
+       character:
+  echo foo\-
+       This prints "foo-". The command is not continued.
+     * You can enter commands such as:
+  echo foo - ; this is a comment
+       interactively and they are properly treated as continued commands.
+       Previously this worked only in command files.
+     _________________________________________________________________
+
+  1.2. Editor Interface
+
+   SET EDITOR name [ options ]
+          Lets you specify a text-editing program. The name can be a
+          fully specified pathname like /usr/local/bin/emacs19/emacs, or
+          it can be the name of any program in your PATH, e.g. "set
+          editor emacs". In VMS, it must be a DCL command like "edit",
+          "edit/tpu", "emacs", etc. If an environment variable EDITOR is
+          defined when Kermit starts, its value is the default editor.
+          You can also specify options to be included on the editor
+          command line. Returns to Kermit when the editor exits.
+
+   EDIT [ filename ]
+          If the EDIT command is given without a filename, then if a
+          previous filename had been given to an EDIT command, it is
+          used; if not, the editor is started without a file. If a
+          filename is given, the editor is started on that file, and the
+          filename is remembered for subsequent EDIT commands.
+
+   SHOW EDITOR
+          Displays the full pathname of your text editor, if any, along
+          with any command line options, and the file most recently
+          edited (and therefore the default filename for your next EDIT
+          command).
+
+   Related variables: \v(editor), \v(editopts), \v(editfile).
+     _________________________________________________________________
+
+  1.3. Web Browser and FTP Interface
+
+   C-Kermit includes an FTP command, which simply runs the FTP program;
+   C-Kermit does not include any built-in support for Internet File
+   Transfer Protocol, nor any method for interacting directly with an FTP
+   server. In version 7.0, however, C-Kermit lets you specify your FTP
+   client:
+
+   SET FTP-CLIENT [ name [ options ] ]
+          The name is the name of the FTP executable. In UNIX, Windows,
+          or OS/2, it can be the filename of any executable program in
+          your PATH (e.g. "ftp.exe" in Windows, "ftp" in UNIX); elsewhere
+          (or if you do not have a PATH definition), it must be the fully
+          specified pathname of the FTP program. If the name contains any
+          spaces, enclose it braces. Include any options after the
+          filename; these depend the particular ftp client.
+
+   The Web browser interface is covered in the following subsections.
+     _________________________________________________________________
+
+    1.3.1. Invoking your Browser from C-Kermit
+
+   BROWSE [ url ]
+          Starts your preferred Web browser on the URL, if one is given,
+          otherwise on the most recently given URL, if any. Returns to
+          Kermit when the browser exits.
+
+   SET BROWSER [ name [ options ] ]
+          Use this command to specify the name of your Web browser
+          program, for example: "set browser lynx". The name must be in
+          your PATH, or else it must be a fully specified filename; in
+          VMS it must be a DCL command.
+
+   SHOW BROWSER
+          Displays the current browser, options, and most recent URL.
+
+   Related variables: \v(browser), \v(browsopts), \v(browsurl).
+
+   Also see [350]Section 2.15: Contacting Web Servers with the HTTP
+   Command.
+     _________________________________________________________________
+
+    1.3.2. Invoking C-Kermit from your Browser
+
+   The method for doing this depends, of course, on your browser. Here
+   are some examples:
+
+   Netscape on UNIX (X-based)
+          In the Options->Applications section, set your Telnet
+          application to:
+
+  xterm -e /usr/local/bin/kermit/kermit -J %h %p
+
+          (replace "/usr/local/bin/kermit/kermit" by C-Kermit's actual
+          pathname). -J is C-Kermit's command-line option to "be like
+          Telnet"; %h and %p are Netscape placeholders for hostname and
+          port.
+
+   Lynx on UNIX
+          As far as we know, this can be done only at compile time. Add
+          the following line to the Lynx userdefs.h file before building
+          the Lynx binary:
+
+  #define TELNET_COMMAND "/opt/bin/kermit -J"
+
+          And then add lines like the following to the Lynx.cfg file:
+
+  DOWNLOADER:Kermit binary download:/opt/bin/kermit -i -V -s %s -a %s:TRUE
+  DOWNLOADER:Kermit text download:/opt/bin/kermit -s %s -a %s:TRUE
+
+  UPLOADER:Kermit binary upload:/opt/bin/kermit -i -r -a %s:TRUE
+  UPLOADER:Kermit text upload:/opt/bin/kermit -r -a %s:TRUE
+  UPLOADER:Kermit text get:/opt/bin/kermit -g %s:TRUE
+  UPLOADER:Kermit binary get:/opt/bin/kermit -ig %s:TRUE
+
+   But none of the above is necessary if you make C-Kermit your default
+   Telnet client, which you can do by making a symlink called 'telnet' to
+   the C-Kermit 7.0 binary. See [351]Section 9.1 for details.
+     _________________________________________________________________
+
+  1.4. Command Editing
+
+   Ctrl-W ("Word delete") was changed in 7.0 to delete back to the
+   previous non-alphanumeric, rather than all the way back to the
+   previous space.
+     _________________________________________________________________
+
+  1.5. Command Switches
+
+   As of version 7.0, C-Kermit's command parser supports a new type of
+   field, called a "switch". This is an optional command modifier.
+
+    1.5.1. General Switch Syntax
+
+   A switch is a keyword beginning with a slash (/). If it takes a value,
+   then the value is appended to it (with no intervening spaces),
+   separated by a colon (:) or equal sign (=). Depending on the switch,
+   the value may be a number, a keyword, a filename, a date/time, etc.
+   Examples:
+
+  send oofa.txt                              ; No switches
+  send /binary oofa.zip                      ; A switch without a value
+  send /protocol:zmodem oofa.zip             ; A switch with a value (:)
+  send /protocol=zmodem oofa.zip             ; A switch with a value (=)
+  send /text /delete /as-name:x.x oofa.txt   ; Several switches
+
+   Like other command fields, switches are separated from other fields,
+   and from each other, by whitespace, as shown in the examples just
+   above. You can not put them together like so:
+
+  send/text/delete/as-name:x.x oofa.txt
+
+   (as you might do in VMS or DOS, or as we might once have done in
+   TOPS-10 or TOPS0-20, or PIP). This is primarily due to ambiguity
+   between "/" as switch introducer versus "/" as UNIX directory
+   separator; e.g. in:
+
+  send /delete/as-name:foo/text oofa.txt
+
+   Does "foo/text" mean the filename is "foo" and the transfer is to be
+   in text mode, or does it mean the filename is "foo/text"? Therefore we
+   require whitespace between switches to resolve the ambiguity. (That's
+   only one of several possible ambiguities -- it is also conceivable
+   that a file called "text" exists in the path "/delete/as-name:foo/").
+
+   In general, if a switch can take a value, but you omit it, then either
+   a reasonable default value is supplied, or an error message is
+   printed:
+
+  send /print:-Plaserwriter oofa.txt         ; Value included = print options
+  send /print oofa.txt                       ; Value omitted, OK
+  send /mail:kermit@columbia.edu oofa.txt    ; Value included = address
+  send /mail oofa.txt                        ; Not OK - address required
+  ?Address required
+
+   Context-sensitive help (?) and completion (Esc or Tab) are available
+   in the normal manner:
+
+  C-Kermit> send /pr? Switch, one of the following:
+    /print /protocol
+  C-Kermit> send /pro<ESC>tocol:?  File-transfer protocol,
+   one of the following:
+    kermit   xmodem   ymodem   ymodem-g   zmodem
+  C-Kermit> send /protocol:k<TAB>ermit
+
+   If a switch takes a value and you use completion on it, a colon (:) is
+   printed at the end of its name to indicate this. If it does not take a
+   value, a space is printed.
+
+   Also, if you type ? in a switch field, switches that take values are
+   shown with a trailing colon; those that don't take values are shown
+   without one.
+     _________________________________________________________________
+
+    1.5.2. Order and Effect of Switches
+
+   The order of switches should not matter, except that they are
+   evaluated from left to right, so if you give two switches with
+   opposite effects, the rightmost one is used:
+
+  send /text /binary oofa.zip                ; Sends oofa.zip in binary mode.
+
+   Like other command fields, switches have no effect whatsoever until
+   the command is entered (by pressing the Return or Enter key). Even
+   then, switches affect only the command with which they are included;
+   they do not have global effect or side effects.
+     _________________________________________________________________
+
+    1.5.3. Distinguishing Switches from Other Fields
+
+   All switches are optional. A command that uses switches lets you give
+   any number of them, including none at all. Example:
+
+  send /binary oofa.zip
+  send /bin /delete oofa.zip
+  send /bin /as-name:mupeen.zip oofa.zip
+  send oofa.zip
+
+   But how does Kermit know when the first "non-switch" is given? It has
+   been told to look for both a switch and for something else, the data
+   type of the next field (filename, number, etc). In most cases, this
+   works well. But conflicts are not impossible. Suppose, for example, in
+   UNIX there was a file named "text" in the top-level directory. The
+   command to send it would be:
+
+  send /text
+
+   But C-Kermit would think this was the "/text" switch. To resolve the
+   conflict, use braces:
+
+  send {/text}
+
+   or other circumlocutions such as "send //text", "send /./text", etc.
+
+   The opposite problem can occur if you give an illegal switch that
+   happens to match a directory name. For example:
+
+  send /f oofa.txt
+
+   There is no "/f" switch (there are several switches that begin with
+   "/f", so "/f" is ambiguous). Now suppose there is an "f" directory in
+   the root directory; then this command would be interpreted as:
+
+     Send all the files in the "/f" directory, giving each one an
+     as-name of "oofa.txt".
+
+   This could be a mistake, or it could be exactly what you intended;
+   C-Kermit has no way of telling the difference. To avoid situations
+   like this, spell switches out in full until you are comfortable enough
+   with them to know the minimum abbreviation for each one. Hint: use ?
+   and completion while typing switches to obtain the necessary feedback.
+     _________________________________________________________________
+
+    1.5.4. Standard File Selection Switches
+
+   The following switches are used on different file-oriented commands
+   (such as SEND, DIRECTORY, DELETE, PURGE) to refine the selection of
+   files that match the given specification.
+
+   /AFTER:date-time
+          Select only those files having a date-time later than the one
+          given. See [352]Section 1.6 for date-time formats. Synonym:
+          /SINCE.
+
+   /NOT-AFTER:date-time
+          Select only those files having a date-time not later than (i.e.
+          earlier or equal to) the one given. Synonym: /NOT-SINCE.
+
+   /BEFORE:date-time
+          Select only those files having a date-time earlier than the one
+          given.
+
+   /NOT-BEFORE:date-time
+          Select only those files having a date-time not earlier than
+          (i.e. later or equal to) the one given.
+
+   /DOTFILES
+          UNIX and OS-9 only: The filespec is allowed to match files
+          whose names start with (dot) period. Normally these files are
+          not shown.
+
+   /NODOTFILES
+          (UNIX and OS-9 only) Don't show files whose names start with
+          dot (period). This is the opposite of /DOTFILES, and is the
+          default. Note that when a directory name starts with a period,
+          the directory and (in recursive operations) all its
+          subdirectories are skipped.
+
+   /LARGER-THAN:number
+          Only select files larger than the given number of bytes.
+
+   /SMALLER-THAN:number
+          Only select files smaller than the given number of bytes.
+
+   /EXCEPT:pattern
+          Specifies that any files whose names match the pattern, which
+          can be a regular filename, or may contain "*" and/or "?"
+          metacharacters (wildcards), are not to be selected. Example:
+
+  send /except:*.log *.*
+
+          sends all files in the current directory except those with a
+          filetype of ".log". Another:
+
+  send /except:*.~*~ *.*
+
+          sends all files except the ones that look like Kermit or EMACS
+          backup files (such as "oofa.txt.~17~") (of course you can also
+          use the /NOBACKUP switch for this).
+
+          The pattern matcher is the same one used by IF MATCH string
+          pattern ([353]Section 7.4), so you can test your patterns using
+          IF MATCH. If you need to match a literal * or ? (etc), precede
+          it by a backslash (\). If the pattern contains any spaces, it
+          must be enclosed in braces:
+
+  send /except:{Foo bar} *.*
+
+          The pattern can also be a list of up to 8 patterns. In this
+          case, the entire pattern must be enclosed in braces, and each
+          sub-pattern must also be enclosed in braces; this eliminates
+          the need for designating a separator character, which is likely
+          to also be a legal filename character on some platform or
+          other, and therefore a source of confusion. You may include
+          spaces between the subpatterns but they are not necessary. The
+          following two commands are equivalent:
+
+  send /except:{{ck*.o} {ck*.c}} ck*.?
+  send /except:{{ck*.o}{ck*.c}} ck*.?
+
+          If a pattern is to include a literal brace character, precede
+          it with "\". Also note the apparent conflict of this list
+          format and the string-list format described in [354]Section
+          4.9.1. In case you want to include a wildcard string-list with
+          braces on its outer ends as an /EXCEPT: argument, do it like
+          this:
+
+  send /except:{{{ckuusr.c,ckuus2.c,ckuus6.c}}} ckuus*.c
+     _________________________________________________________________
+
+    1.5.5. Setting Preferences for Different Commands
+
+   Certain oft-used commands offer lots of switches because different
+   people have different requirements or preferences. For example, some
+   people want to be able to delete files without having to watch a list
+   of the deleted files scroll past, while others want to be prompted for
+   permission to delete each file. Different people prefer different
+   directory-listing styles. And so on. Such commands can be tailored
+   with the SET OPTIONS command:
+
+   SET OPTIONS command [ switch [ switch [ ... ] ] ]
+          Sets each switch as the default for the given command,
+          replacing the "factory default". Of course you can also
+          override any defaults established by the SET OPTIONS command by
+          including the relevant switches in the affected command any
+          time you issue it.
+
+   SHOW OPTIONS
+          Lists the commands that allows option-setting, and the options
+          currently in effect, if any, for each. Switches that have
+          synonyms are shown under their primary name; for example. /LOG
+          and /VERBOSE are shown as /LIST.
+
+   Commands for which options may be set include DIRECTORY, DELETE,
+   PURGE, and TYPE. Examples:
+
+  SET OPTIONS DIRECTORY /PAGE /NOBACKUP /HEADING /SORT:DATE /REVERSE
+  SET OPTIONS DELETE /LIST /NOHEADING /NOPAGE /NOASK /NODOTFILES
+  SET OPTIONS TYPE /PAGE
+
+   Not necessarily all of a command's switches can be set as options. For
+   example, file selection switches, since these would normally be
+   different for each command.
+
+   Put the desired SET OPTIONS commands in your C-Kermit customization
+   file for each command whose default switches you want to change every
+   time you run C-Kermit.
+     _________________________________________________________________
+
+  1.6. Dates and Times
+
+   Some commands and switches take date-time values, such as:
+
+  send /after:{8-Feb-2000 10:28:01}
+
+   Various date-time formats are acceptable. The rules for the date are:
+
+     * The year must have 4 digits.
+     * If the year comes first, the second field is the month.
+     * The day, month, and year may be separated by spaces, /, -, or
+       underscore.
+     * The month may be numeric (1 = January) or spelled out or
+       abbreviated in English.
+
+   If the date-time string contains any spaces, it must be enclosed in
+   braces. Examples of legal dates:
+
+                           Interpretation:
+  2000-Feb-8                8 February 2000
+  {2000 Feb 8}              8 February 2000
+  2000/Feb/8                8 February 2000
+  2000_Feb_8                8 February 2000
+  2000-2-8                  8 February 2000
+  2000-02-08                8 February 2000
+  8-Feb-2000                8 February 2000
+  08-Feb-2000               8 February 2000
+  12/25/2000                25 December 2000
+  25/12/2000                25 December 2000
+
+   The last two examples show that when the year comes last, and the
+   month is given numerically, the order of the day and month doesn't
+   matter as long as the day is 13 or greater (mm/dd/yyyy is commonly
+   used in the USA, whereas dd/mm/yyyy is the norm in Europe). However:
+
+  08/02/2000                Is ambiguous and therefore not accepted.
+
+   If a date is given, the time is optional and defaults to 00:00:00. If
+   the time is given with a date, it must follow the date, separated by
+   space, /, -, or underscore, and with hours, minutes, and seconds
+   separated by colon (:). Example:
+
+  2000-Feb-8 10:28:01       Represents 8 February 2000, 10:28:01am
+
+   If a date is not given, the current date is used and a time is
+   required.
+
+   Time format is hh:mm:ss or hh:mm or hh in 24-hour format, or followed
+   by "am" or "pm" (or "AM" or "PM") to indicate morning or afternoon.
+   Examples of times that are acceptable:
+
+                           Interpretation:
+  3:23:56                    3:23:56am
+  3:23:56am                  3:23:56am
+  3:23:56pm                  3:23:56pm = 15:23:56
+ 15:23:56                    3:23:56pm = 15:23:56
+  3:23pm                     3:23:00pm = 15:23:00
+  3:23PM                     3:23:00pm = 15:23:00
+  3pm                        3:00:00pm = 15:00:00
+
+   Examples of legal date-times:
+
+  send /after:{8 Feb 2000 10:28:01}
+  send /after:8_Feb_2000_10:28:01
+  send /after:8-Feb-2000/10:28:01
+  send /after:2000/02/08/10:28:01
+  send /after:2000/02/08_10:28:01
+  send /after:2000/02/08_10:28:01am
+  send /after:2000/02/08_10:28:01pm
+  send /after:2000/02/08_10:28pm
+  send /after:2000/02/08_10pm
+  send /after:10:00:00pm
+  send /after:10:00pm
+  send /after:10pm
+  send /after:22
+
+   Finally, there is a special all-numeric format you can use:
+
+  yyyymmdd hh:mm:ss
+
+   For example:
+
+  20000208 10:28:01
+
+   This is Kermit's standard date-time format (based on ISO 8601), and is
+   accepted (among other formats) by any command or switch that requires
+   a date-time, and is output by any function whose result is a calendar
+   date-time.
+
+   There are no optional parts to this format and it must be exactly 17
+   characters long, punctuated as shown (except you can substitute
+   underscore for space in contexts where a single "word" is required).
+   The time is in 24-hour format (23:00:00 is 11:00pm). This is the
+   format returned by \fdate(filename), so you can also use constructions
+   like this:
+
+  send /after:\fdate(oofa.txt)
+
+   which means "all files newer than oofa.txt".
+
+   Besides explicit dates, you can also use the any of the following
+   shortcuts:
+
+   TODAY
+          Stands for the current date at 00:00:00.
+
+   TODAY 12:34:56
+          Stands for the current date at the given time.
+
+   YESTERDAY
+          Stands for yesterday's date at 00:00:00. A time may also be
+          given.
+
+   TOMORROW
+          Stands for tomorrow's date at 00:00:00. A time may also be
+          given.
+
+   + number { DAYS, WEEKS, MONTHS, YEARS } [ time ]
+          Is replaced by the future date indicated, relative to the
+          current date. If the time is omitted, 00:00:00 is used.
+          Examples: +3days, +2weeks, +1year, +37months.
+
+   - number { DAYS, WEEKS, MONTHS, YEARS } [ time ]
+
+          Is replaced by the past date indicated, relative to the current
+          date. If the time is omitted, 00:00:00 is used.
+
+   The time can be separated from the date shortcut by any of the same
+   separators that are allowed for explicit date-times: space, hyphen,
+   slash, period, or underscore. In switches and other space-delimited
+   fields, use non-spaces to separate date/time fields, or enclose the
+   date-time in braces, e.g.:
+
+  purge /before:-4days_12:00:00
+  purge /before:{- 4 days 12:00:00}
+
+   Of course you can also use variables:
+
+  define \%n 43
+  purge /before:-\%ndays_12:00:00
+
+   Shortcut names can be abbreviated to any length that still
+   distinguishes them from any other name that can appear in the same
+   context, e.g. "TOD" for today, "Y" for yesterday. Also, the special
+   abbreviation "wks" is accepted for WEEKS, and "yrs" for "YEARS".
+
+   (To see how to specify dates relative to a specific date, rather than
+   the current one, see the [355]\fmjd() function description below.)
+
+   You can check date formats with the DATE command. DATE by itself
+   prints the current date and time in standard format: yyyymmdd
+   hh:mm:ss. DATE followed by a date and/or time (including shortcuts)
+   converts it to standard format if it can understand it, otherwise it
+   prints an error message.
+
+   The following variables and functions deal with dates and times; any
+   function argument designated as "date-time" can be in any of the
+   formats described above.
+
+   \v(day)
+          The first three letters of the English word for the current day
+          of the week, e.g. "Wed".
+
+   \fday(date-time)
+          The first three letters of the English word for day of the week
+          of the given date. If a time is included, it is ignored.
+          Example: \fday(8 Feb 1988) = "Mon".
+
+   \v(nday)
+          The numeric day of the week: 0 = Sunday, 1 = Monday, ..., 6 =
+          Saturday.
+
+   \fnday(date-time)
+          The numeric day of the week for the given date. If a time is
+          included, it is ignored. Example: \fnday(8 Feb 1988) = "1".
+
+   \v(date)
+          The current date as dd mmm yyyy, e.g. "08 Feb 2000" (as in this
+          example, a leading zero is supplied for day-of-month less than
+          10).
+
+   \v(ndate)
+          The current date in numeric format: yyyymmdd, e.g. "20000208".
+
+   \v(time)
+          The current time as hh:mm:ss, e.g. "15:27:14".
+
+   \ftime(time)
+          The given free-format date and/or time (e.g. "3pm") returns the
+          time (without the date) converted to hh:mm:ss 24-hour format,
+          e.g. "15:00:00" (the date, if given, is ignored).
+
+   \v(ntime)
+          The current time as seconds since midnight, e.g. "55634".
+
+   \v(tftime)
+          The elapsed time of the most recent file-transfer operation in
+          seconds.
+
+   \v(intime)
+          The elapsed time for the most recent INPUT command to complete,
+          in milliseconds.
+
+   \fntime(time)
+          The given free-format date and/or time is converted to seconds
+          since midnight (the date, if given, is ignored). This function
+          replaces \ftod2secs(), which is now a synonym for \fntime().
+          Unlike \ftod2secs(), \fntime() allows a date to be included,
+          and it allows the time to be in free format (like 3pm), and it
+          allows the amount of time to be more than 24 hours. E.g.
+          \fntime(48:00:00) = 172800. Example of use:
+
+  set alarm \fntime(48:00:00) ; set alarm 48 hours from now.
+
+   \fn2time(seconds)
+          The given number of seconds is converted to hh:mm:ss format.
+
+   \fdate(filename)
+          Returns the modification date-time of the given file in
+          standard format: yyyymmdd hh:mm:ss.
+
+   \fcvtdate(date-time)
+          Converts a free-format date and/or time to Kermit standard
+          format: yyyymmdd hh:mm:ss. If no argument is given, returns the
+          current date-time in standard format. If a date is given but no
+          time, the converted date is returned without a time. If a time
+          is given with no date, the current date is supplied. Examples:
+
+  \fcvtdate(4 Jul 2000 2:21:17pm) = 20000704 14:21:17
+  \fcvtdate() = 20000704 14:21:17 (on 4 Jul 2000 at 2:21:17pm).
+  \fcvtd(4 Jul 2000) = 20000704
+  \fcvtd(6pm) = 20000704 18:00:00 (on 4 Jul 2000 at 6:00pm).
+
+   \fdayofyear(date-time)
+   \fdoy(date-time)
+          Converts a free-format date and/or time to yyyyddd, where ddd
+          is the 3-digit day of the year, and 1 January is Day 1. If a
+          time is included with the date, it is returned in standard
+          format. If a date is included but no time, the date is returned
+          without a time. If a time is given with no date, the time is
+          converted and the current date is supplied. If no argument is
+          given, the current date-time is returned. Synonym: \fdoy().
+          Examples:
+
+  \fddayofyear(4 Jul 2000 2:21:17pm) = 2000185 14:21:17
+  \fdoy() = 2000185 14:21:17 (on 4 Jul 2000 at 2:21:17pm).
+  \fdoy(4 Jul 2000) = 2000185
+  \fdoy(6pm) = 2000185 18:00:00 (on 4 Jul 2000 at 6:00pm).
+
+   Note: The yyyyddd day-of-year format is often erroneously referred to
+   as a Julian date. However, a true Julian date is a simple counting
+   number, the number of days since a certain fixed day in the past.
+   [356]See \fmjd() below.
+
+   \fdoy2date(date-time)
+          Converts a date or date-time in day-of-year format to a
+          standard format date. A yyyyddd-format date must be supplied;
+          time is optional. The given date is converted to yyyymmdd
+          format. If a time is given, it is converted to 24-hour format.
+          Examples:
+
+  \fdoy2date(2000185) = 20000704
+  \fdoy2(2000185 3pm) = 20000704 15:00:00
+
+   \fmjd(date-time)
+          Converts free-format date and/or time to a Modified Julian Date
+          (MJD), the number of days since 17 Nov 1858 00:00:00. If a time
+          is given, it is ignored. Examples:
+
+  \fmjd(4 Jul 2000) = 50998
+  \fmjd(17 Nov 1858) = 0
+  \fmjd(16 Nov 1858) = -1
+
+   \fmjd2date(mjd)
+          Converts an MJD (integer) to standard date format, yyyymmdd:
+
+  \fmjd2(50998) = 4 Jul 1998
+  \fmjd2(0) = 17 Nov 1858
+  \fmjd2(-1) = 16 Nov 1858
+  \fmjd2(-365) = 17 Nov 1857
+
+   MJDs are normal integers and, unlike DOYs, may be added, subtracted,
+   etc, with each other or with other integers, to obtain meaningful
+   results. For example, to find out the date 212 days ago:
+
+  echo \fmjd2date(\fmjd()-212)
+
+   Constructions such as this can be used in any command where a
+   date-time is required, e.g.:
+
+  send /after:\fmjd2date(\fmjd()-212)
+
+   to send all files that are not older than 212 days (this is equivalent
+   to "send /after:-212days").
+
+   MJDs also have other regularities not exhibited by other date formats.
+   For example, \fmodulus(\fmjd(any-date),7) gives the day of the week
+   for any date (where 4=Sun, 5=Mon, ..., 3=Sat). (However, it is easier
+   to use \fnday() for this purpose, and it gives the more conventional
+   result of 0=Sun, 1=Mon, ..., 6=Sat).
+
+   Note that if MJDs are to be compared, they must be compared
+   numerically (IF <, =, >) and not lexically (IF LLT, EQUAL, LGT),
+   whereas DOYs must be compared lexically if they include a time (which
+   contains ":" characters); however, if DOYs do not include a time, they
+   may also be compared numerically.
+
+   In any case, lexical comparison of DOYs always produces the
+   appropriate result, as does numeric comparison of MJDs.
+
+   The same comments apply to sorting. Also note that DOYs are fixed
+   length, but MJDs can vary in length. However, all MJDs between 3 April
+   1886 and 30 Aug 2132 are 5 decimal digits long. (MJDs become 6 digits
+   long on 31 Aug 2132, and 7 digits long on 13 Oct 4596).
+     _________________________________________________________________
+
+  1.7. Partial Completion of Keywords
+
+   Partial completion of keywords was added in C-Kermit 7.0. In prior
+   versions, if completion was attempted (by pressing the Esc or Tab key)
+   on a string that matched different keywords, you'd just get a beep.
+   Now Kermit completes up to the first character where the possibly
+   matching keywords differ and then beeps. For example:
+
+  C-Kermit> send /n<Tab>
+
+   which matches /NOT-BEFORE and /NOT-AFTER, now completes up to the
+   dash:
+
+  C-Kermit> send /n<Tab>ot-<Beep>
+
+   Partial completion works for filenames too (as it has for some years).
+     _________________________________________________________________
+
+  1.8. Command Recall
+
+   C-Kermit has had a command history buffer for some time, which could
+   be scrolled interactively using control characters or (in Kermit 95
+   only) arrow keys. Version 7.0 adds a REDO command that allows the most
+   recent command matching a given pattern to be re-executed:
+
+   { REDO, RR, ^ } [ pattern ]
+          Search the command history list for the most recent command
+          that matches the given pattern, and if one is found, execute it
+          again.
+
+   The pattern can be a simple string (like "send"), in which case the
+   last SEND command is re-executed. Or it can contain wildcard
+   characters "*" and/or "?", which match any string and any single
+   character, respectively (note that "?" must be preceded by backslash
+   to override its normal function of giving help), and in most C-Kermit
+   versions may also include [] character lists and {} string lists (see
+   [357]Section 4.9).
+
+   The match works by appending "*" to the end of the given pattern (if
+   you didn't put one there yourself). Thus "redo *oofa" becomes "redo
+   *oofa*" and therefore matches the most recent command that contains
+   "oofa" anywhere within the command. If you want to inhibit the
+   application of the trailing "*", e.g. to force matching a string at
+   the end of a command, enclose the pattern in braces:
+
+  redo {*oofa}
+
+   matches the most recent command that ends with "oofa".
+
+   REDO commands themselves are not entered into the command history
+   list. If no pattern is given, the previous (non-REDO) command is
+   re-executed. The REDOne command is reinserted at the end of the
+   command history buffer, so the command scrollback character (Ctrl-P,
+   Ctrl-B, or Uparrow) can retrieve it.
+
+   Examples:
+
+  C-Kermit> echo foo
+  foo
+  C-Kermit> show alarm
+  (no alarm set)
+  C-Kermit> echo blah
+  blah
+  C-Kermit> redo          ; Most recent command
+  blah
+  C-Kermit> redo s        ; Most recent command starting with "s"
+  (no alarm set)
+  C-Kermit> redo echo f   ; Most recent command starting with "echo f"
+  foo
+  C-Kermit> redo *foo     ; Most recent command that has "foo" in it
+  foo
+  C-Kermit> <Ctrl-P>      ; Scroll back
+  C-Kermit> echo foo      ; The REDOne command is there
+  C-Kermit> redo {*foo}   ; Most recent command that ends with "foo"
+  foo
+  C-Kermit>
+
+   Since REDO, REDIAL, and REDIRECT all start the same way, and RED is
+   the designated non-unique abbreviation for REDIAL, REDO must be
+   spelled out in full. For convenience, RR is included as an invisible
+   easy-to-type synonym for REDO. You can also use the "^" character for
+   this:
+
+  C-Kermit> ^             ; Most recent command
+  C-Kermit> ^ s           ; Most recent command starting with "s"
+  C-Kermit> ^s            ; Ditto (space not required after "^").
+  C-Kermit> ^*foo         ; Most recent command that has "foo" in it.
+  C-Kermit> ^{*foo}       ; Most recent command ends with "foo".
+
+   Unlike the manual command-history-scrolling keys, the REDO command can
+   be used in a script, but it's not recommended (since the command to be
+   REDOne might not be found, so if the REDO command fails, you can't
+   tell whether it was because REDO failed to find the requested command,
+   or because the command was found but it failed).
+     _________________________________________________________________
+
+  1.9. EXIT Messages
+
+   The EXIT and QUIT commands now accept an optional message to be
+   printed. This makes the syntax of EXIT and QUIT just like END and
+   STOP:
+
+   { EXIT, QUIT, END, STOP } [ status-code [ message ] ]
+
+   where status-code is a number (0 indicating success, nonzero
+   indicating failure). This is handy in scripts that are never supposed
+   to enter interactive mode:
+
+  dial 7654321
+  if fail exit 1 Can't make connection - try again later.
+
+   Previously this could only be done in two steps:
+
+  dial 7654321
+  xif fail { echo Can't make connection - try again later, exit 1 }
+
+   A status code must be included in order to specify a message. In the
+   case of EXIT and QUIT, the default status code is contained in the
+   variable \v(exitstatus), and is set automatically by various events
+   (file transfer failures, etc; it can also be set explicitly with the
+   SET EXIT STATUS command). If you want to give an EXIT or QUIT command
+   with a message, but without changing the exit status from what it
+   normally would have been, use the \v(exitstatus) variable, e.g.:
+
+   exit \v(existatus) Goodbye from \v(cmdfile).
+
+   The EXIT status is returned to the system shell or whatever other
+   process invoked C-Kermit, e.g. in UNIX:
+
+  C-Kermit> exit 97 bye bye
+  bye bye
+  $ echo $?
+  97
+  $
+     _________________________________________________________________
+
+  1.10. Managing Keyboard Interruptions
+
+   When C-Kermit is in command or file-transfer mode (as opposed to
+   CONNECT mode), it can be interrupted with Ctrl-C. Version 7.0 adds the
+   ability to disarm the Ctrl-C interrupt:
+
+   SET COMMAND INTERRUPT { ON, OFF }
+          COMMAND INTERRUPT is ON by default, meaning the Ctrl-C can be
+          used to interrupt a command or a file transfer in progress. Use
+          OFF to disable these interruptions, and use it with great
+          caution for obvious reasons.
+
+   SET TRANSFER INTERRUPT { ON, OFF }
+          This can be used to disable keyboard interruption of file
+          transfer when C-Kermit is in local mode, or to re-enable it
+          after it has been disabled. This applies to the X, Z, E, and
+          similar keys as well as to the system interrupt character,
+          usually Ctrl-C. This is distinct from SET TRANSFER
+          CANCELLATION, which tells whether packet mode can be exited by
+          sending a special sequence of characters.
+
+   Several other commands can be interrupted by pressing any key while
+   they are active. Version 7.0 adds the ability to disable this form of
+   interruption also:
+
+   SET INPUT CANCELLATION { ON, OFF }
+          Whether an INPUT command in progress can be interrupted by
+          pressing a key. Normally ON. Setting INPUT CANCELLATION OFF
+          makes INPUT commands uninterruptible except by Ctrl-C (unless
+          COMMAND INTERRUPTION is also OFF).
+
+   SET SLEEP CANCELLATION { ON, OFF }
+          Whether a SLEEP, PAUSE, or WAIT command in progress can be
+          interrupted by pressing a key. Normally ON. Setting SLEEP
+          CANCELLATION OFF makes these commands uninterruptible except by
+          Ctrl-C (unless COMMAND INTERRUPTION is also OFF). Synonyms: SET
+          PAUSE CANCELLATION, SET WAIT CANCELLATION.
+
+   So to make certain a script is not interruptible by the user, include
+   these commands:
+
+  SET TRANSFER INTERRUPT OFF
+  SET SLEEP CANCELLATION OFF
+  SET INPUT CANCELLATION OFF
+  SET COMMAND INTERRUPTION OFF
+
+   Make sure to turn them back on afterwards if interruption is to be
+   re-enabled.
+
+   When a PAUSE, SLEEP, WAIT, or INPUT command is interrupted from the
+   keyboard, the new variable \v(kbchar) contains a copy of the (first)
+   character that was typed and caused the interruption, provided it was
+   not the command interrupt character (usually Ctrl-C). If these
+   commands complete successfully or time out without a keyboard
+   interruption, the \v(kbchar) variable is empty.
+
+   The \v(kbchar) variable (like any other variable) can be tested with:
+
+  if defined \v(kbchar) command
+
+   The command is executed if the variable is not empty.
+
+   The \v(kbchar) variable can be reset with WAIT 0 (PAUSE 0, SLEEP 0,
+   etc).
+     _________________________________________________________________
+
+  1.11. Taming The Wild Backslash -- Part Deux
+
+   [358]Using C-Kermit, 2nd Edition, contains a brief section, "Taming
+   the Wild Backslash", on page 48, which subsequent experience has shown
+   to be inadequate for Kermit users intent on writing scripts that deal
+   with Windows, DOS, and OS/2 filenames, in which backslash (\) is used
+   as the directory separator. This section fills in the blanks.
+
+    1.11.1. Background
+
+   The Kermit command language shares a certain unavoidable but annoying
+   characteristic with most other command languages that are capable of
+   string replacement, namely the necessity to "quote" certain characters
+   when you want them to be taken literally. This is a consequence of the
+   facts that:
+
+    1. One or more characters must be set aside to denote replacement,
+       rather than acting as literal text.
+    2. We have only 96 printable characters to work with in ASCII, which
+       is still the only universally portable character set.
+    3. There is no single printable character that is unused everywhere.
+    4. Variables are not restricted to certain contexts, as they are in
+       formal programming languages like C and Fortran, but can appear
+       anywhere at all within a command, and therefore require special
+       syntax.
+
+   Thus there can be conflicts. To illustrate, the standard UNIX shell
+   uses dollar sign ($) to introduce variables. So the shell command:
+
+  echo $TERM
+
+   displays the value of the TERM variable, e.g. vt320. But suppose you
+   want to display a real dollar sign:
+
+  echo The price is $10.20
+
+   This causes the shell to evaluate the variable "$1", which might or
+   might not exist, and substitute its value, e.g.:
+
+  The price is 0.20
+
+   (in this case the $1 variable had no value.) This is probably not what
+   you wanted. To force the dollar sign to be taken literally, you must
+   apply a "quoting rule", such as "precede a character by backslash (\)
+   to force the shell to take the character literally":
+
+  echo The price is \$10.20
+  The price is $10.20
+
+   But now suppose you want the backslash AND the dollar sign to be taken
+   literally:
+
+  echo The price is \\$10.20
+
+   This doesn't work, since the first backslash quotes the second one,
+   thereby leaving the dollar sign unquoted again:
+
+  The price is \0.20
+
+   Quoting the dollar sign requires addition of a third backslash:
+
+  echo The price is \\\$10.20
+  The price is \$10.20
+
+   The first backslash quotes the second one, and the third backslash
+   quotes the dollar sign.
+
+   Every command language -- all UNIX shells, VMS DCL, DOS Batch, AOS/VS
+   CLI, etc etc -- has similar rules. UNIX shell rules are probably the
+   most complicated, since many printable characters -- not just one --
+   are special there: dollar sign, single quote, double quote, backslash,
+   asterisk, accent grave, number sign, ampersand, question mark,
+   parentheses, brackets, braces, etc -- practically every
+   non-alphanumeric character needs some form of quoting if it is to be
+   taken literally. And to add to the confusion, the UNIX shell offers
+   many forms of quoting, and many alternative UNIX shells are available,
+   each using slightly different syntax.
+     _________________________________________________________________
+
+    1.11.2. Kermit's Quoting Rules
+
+   Kermit's basic quoting rules are simple by comparison (there are, of
+   course, additional syntax requirements for macro definitions, command
+   blocks, function calls, etc, but they are not relevant here).
+
+   The following characters are special in Kermit commands:
+
+   Backslash (\)
+          Introduces a variable, or the numeric representation of a
+          special character, or a function, or other item for
+          substitution. If the backslash is followed by a digit or by any
+          of the following characters:
+
+  x, o, d, m, s, f, v, $, %, &, :, {
+
+          this indicates a special substitution item; otherwise the
+          following character is to be taken literally (exceptions: \ at
+          end of line is taken literally; \n, \b, and \n are special
+          items in the OUTPUT command only).
+
+   Semicolon (;)
+          (Only when at the beginning of a line or preceded by at least
+          one space or tab) Introduces a comment.
+
+   Number sign (#)
+          (Only when at the beginning of a line or preceded by at least
+          one space or tab) Just like semicolon; introduces a comment.
+
+   Question mark (?)
+          (Only at the command prompt - not in command files or macros)
+          Requests context-sensitive help.
+
+   To force Kermit to take any of these characters literally, simply
+   precede it by a backslash (\).
+
+   Sounds easy! And it is, except when backslash also has a special
+   meaning to the underlying operating system, as it does in DOS,
+   Windows, and OS/2, where it serves as the directory separator in
+   filenames such as:
+
+  D:\K95\KEYMAPS\READ.ME
+
+   Using our rule, we would need to refer to this file in Kermit commands
+   as follows:
+
+  D:\\K95\\KEYMAPS\\READ.ME
+
+   But this would not be obvious to new users of Kermit software on DOS,
+   Windows, or OS/2, and it would be annoying to seasoned ones. Thus
+   MS-DOS Kermit and Kermit 95 go to rather extreme lengths to allow the
+   more natural notation, as in:
+
+  send d:\k95\keymaps\read.me
+
+   The reason this is tricky is that we also need to allow for variables
+   and other expressions introduced by backslash in the same command. For
+   example, suppose \%a is a variable whose value is "oofa" (without the
+   quotes). What does the following command do?
+
+  send d:\%a
+
+   Does it send the file named "oofa" in the current directory of the D:
+   disk, or does it send a file named "%a" in the root directory of the
+   D: disk? This is the kind of trouble we get into when we attempt to
+   bend the rules in the interest of user friendliness. (The answer is:
+   if the variable \%a has definition that is the name of an existing
+   file, that file is sent; if a file d:\%a exists, it is sent; otherwise
+   if both conditions are true, the variable takes precedence, and the
+   literal filename can be forced by quoting: \\%a.)
+
+   In Kermit 95 (but not MS-DOS Kermit), we also bend the rules another
+   way by allowing you to use forward slash (/) rather than backslash (\)
+   as the directory separator:
+
+  send d:/k95/keymaps/read.me
+
+   This looks more natural to UNIX users, and in fact is perfectly
+   acceptable to the Windows 95/98/NT and OS/2 operating systems on the
+   API level. BUT (there is always a "but") the Microsoft shell,
+   COMMAND.COM, for Windows 95/98 and NT does not allow this notation,
+   and therefore it can not be used in any Kermit command -- such as RUN
+   -- that invokes the Windows command shell AND your command shell is
+   COMMAND.COM or any other shell that does not allow forward slash as
+   directory separator (some alternative shells do allow this).
+
+     NOTE: There exists a wide variety of alternative shells from third
+     parties that do not have this restriction. If you are using a shell
+     that accepts forward slash as a directory separator, you can stop
+     reading right now -- UNLESS (there is always an "unless") you want
+     your scripts to be portable to systems that have other shells. Also
+     note that some Windows shells might actually REQUIRE forward
+     slashes (instead of backslashes) as directory separators; we do not
+     treat this situation below, but the treatment is obvious -- use
+     slash rather backslash as the directory separator.
+     _________________________________________________________________
+
+    1.11.3. Passing DOS Filenames from Kermit to Shell Commands
+
+   The following Kermit commands invoke the system command shell:
+
+  RUN (and its synonyms ! and @)
+  REDIRECT
+  PIPE
+
+   Each of these commands takes a shell command as an operand. These
+   shell commands are not, and can not be, parsed by Kermit since Kermit
+   does not know the syntax of shell commands, and so can't tell the
+   difference between a keyword, a filename, a variable, a switch, or
+   other item. Therefore the rules can not be bent since Kermit doesn't
+   know where or how to bend them. To illustrate (using the regular
+   Windows shell):
+
+  run c:\\windows\\command\\chkdsk.exe
+
+   works OK, but:
+
+  run c:/windows/command/chkdsk.exe
+
+   is not accepted by COMMAND.COM. But:
+
+  run c:\windows\command\chkdsk.exe
+
+   results in Kermit applying its quoting rules before sending the text
+   to the shell. Since "w" and "c" are not in the list of backslash-item
+   codes, the backslash means "take the following character literally".
+   Thus, by the time this filename gets to the Windows shell, it has
+   become:
+
+  c:windowscommandchkdsk.exe
+
+   which is probably not what you wanted. (If "w" and "c" were in the
+   list, the results could be even stranger.) Even more confusing is the
+   case where a directory or filename starts with one or more digits:
+
+  run c:\123\lotus.exe
+
+   in which "\123" is the Kermit notation for ASCII character 123, which
+   happens to be left brace ({), resulting in "c:{lotus.exe".
+
+   So when passing filenames to a Windows shell, always use double
+   backslashes as directory separators, to ensure that the shell gets
+   single backslashes:
+
+  run c:\\windows\\command\\chkdsk.exe
+  run c:\\123\\lotus.exe
+
+   Similar problems might occur with the built-in EDIT, BROWSE, and FTP
+   commands. These commands result in Kermit building a shell command
+   internally to invoke the associated helper program; the form of this
+   command might conflict with the form demanded by certain alternative
+   shells.
+     _________________________________________________________________
+
+    1.11.4. Using Variables to Hold DOS Filenames
+
+   Now to the next level. Suppose you want to write a script in which
+   filenames are parameters, and therefore are stored in variables.
+   Example:
+
+  define \%f c:\windows\command\chkdsk.exe
+  ...
+  run \%f
+
+   Obviously this won't work for the reasons just noted; the RUN command
+   requires directory separators be coded as double backslashes:
+
+  define \%f c:\\windows\\command\\chkdsk.exe
+  ...
+  run \%f
+
+   This will work; no surprises here. However, if you had used ASSIGN
+   rather than DEFINE, you might have been surprised after all; review
+   pages 348-349 of [359]Using C-Kermit (2nd Ed) for the difference
+   between DEFINE and ASSIGN.
+
+   We have said that any Kermit 95 or MS-DOS Kermit command that parses
+   filenames itself -- SEND, for example -- does not require double
+   backslashes since it knows it is parsing a filename. So since the
+   following works:
+
+  send c:\windows\command\chkdsk.exe
+
+   Should the following also work?
+
+  define \%f c:\windows\command\chkdsk.exe
+  ...
+  send \%f
+
+   Answer: No. Why? Because \%f is evaluated "recursively", to allow for
+   the possibility that its definition contains further variable
+   references. This is true of all "backslash-percent-letter" (or -digit)
+   variables, and also for array references. So \%f becomes
+   c:\windows\command\chkdsk.exe, which becomes
+   c:windowscommandchkdsk.exe.
+
+   The trick here is to use the "other" kind of variable, that is
+   evaluated only "one level deep" rather than recursively:
+
+  define filename c:\windows\command\chkdsk.exe
+  ...
+  send \m(filename)
+
+   Similarly if you want to prompt the user for a filename:
+
+  ask filename { Please type a filename: }
+   Please type a filename: c:\windows\command\chkdsk.exe
+  send \m(filename)
+     _________________________________________________________________
+
+    1.11.5. Passing DOS Filenames as Parameters to Macros
+
+   Suppose you want to pass a DOS filename containing backslashes as a
+   parameter to a Kermit macro. This raises two issues:
+
+    1. Parameters to macros are "just text" and so are fully evaluated
+       before they are passed to the macro.
+    2. Once inside the macro, the formal parameters \%1, \%2, ... \%9 are
+       the type of variable that is evaluated recursively.
+
+   Thus a DOS filename is ruined once in the act of parsing the macro
+   invocation, and again when referring to it from within the macro. To
+   illustrate, suppose "test" is a macro. Then in the invocation:
+
+  test c:\mydir\blah.txt
+
+   "c:mydirblah.txt" is assigned to \%1. However, if we double the
+   backslashes:
+
+  test c:\\mydir\\blah.txt
+
+   "c:\mydir\blah.txt" is assigned to \%1. But then when you refer to \%1
+   in the macro, it is evaluated recursively, resulting in
+   "c:mydirblah.txt". To illustrate:
+
+  define test echo \%1
+  test c:\mydir\blah.txt
+  c:mydirblah.txt
+  test c:\\mydir\\blah.txt
+  c:mydirblah.txt
+  test c:\\\\mydir\\\\blah.txt
+  c:\mydir\blah.txt
+
+   Let's address each part of the problem separately. First, inside the
+   macro. You can use the \fcontents() function to force a
+   backslash-percent variable (such as a macro argument) to be evaluated
+   one level deep instead of recursively, for example:
+
+  define test echo { The filename is "\fcontents(\%1)"}
+
+  test c:\mydir\blah.txt               ; We don't expect this to work
+   The filename is "c:mydirblah.txt"   ; and it doesn't.
+  test c:\\mydir\\blah.txt             ; But this does...
+   The filename is "c:\mydir\blah.txt"
+
+   Thus if the filename arrives inside the macro with single backslashes,
+   the backslashes are preserved if you always refer to the parameter
+   through the \fcontents() function.
+
+   Now how to ensure that backslashes are not stripped or misinterpreted
+   when passing a filename to a macro? This brings us back to what we
+   learned in earlier sections:
+
+    1. If it is a literal filename, either double the backslashes, or (if
+       the filename is to be used only within Kermit itself and not
+       passed to a DOS shell, or it is to be passed to an alternative
+       shell that accepts forward slash as a directory separator), use
+       forward slash instead of backslash as the directory separator.
+    2. If it is a variable that contains a filename, make sure you use a
+       macro-style variable name, rather than a
+       backslash-percent-character name.
+
+   Examples:
+
+  define test echo \fcontents(\%1)
+  define filename c:\mydir\blah.txt
+
+  test c:\\mydir\\blah.txt  ; Literal filename with double backslashes
+  c:\mydir\blah.txt
+
+  test c:/mydir/blah.txt    ; Literal filename with forward slashes
+  c:/mydir/blah.txt
+
+  test \m(filename)         ; Variable
+  c:\mydir\blah.txt
+
+   But what if you don't like these rules and you still want to pass a
+   literal filename containing single backslashes to a macro? This is
+   possible too, but a bit tricky: turn command quoting off before
+   invoking the macro, and then turn it back on inside the macro.
+   Example:
+
+  define test set command quoting on, echo \fcontents(\%1)
+
+  set command quoting off
+  test c:\mydir\blah.txt
+  c:\mydir\blah.txt
+
+   Upon return from the macro, command quoting is back on (since the
+   macro turned it on).
+
+   Obviously this trick can not be used if the filename is stored in a
+   variable, since it prevents the variable from being evaluated.
+     _________________________________________________________________
+
+    1.11.6. Passing DOS File Names from Macro Parameters to the DOS Shell
+
+   Now suppose you need to pass a DOS filename to a macro, and the macro
+   needs to pass it, in turn, to the Windows shell via (say) Kermit's RUN
+   command. This works too:
+
+  define xrun run \fcontents(\%1)
+  xrun c:\\windows\\command\\chkdsk.exe
+
+   (or you can use the SET COMMAND QUOTING OFF / ON technique described
+   above to avoid the double backslashes.) But..
+
+  xrun c:/windows/command/chkdsk.exe
+
+   does not work if the Windows shell does not recognize "/" as a
+   directory separator. If there is a chance that a filename might be
+   passed to the macro in this form, the macro will need to convert it to
+   a form acceptable to the shell:
+
+  define xrun run \freplace(\fcontents(\%1),/,\\)
+
+   Here we replace all occurrences (if any) of "/" in the argument with
+   "\" prior to issuing the RUN command. Of course, in order to specify
+   "\" as a literal character in the \freplace() argument list, we have
+   to double it.
+     _________________________________________________________________
+
+    1.11.7. Passing DOS Filenames to Kermit from the Shell
+
+   As noted in the manual, the \&@[] array contains Kermit's command-line
+   arguments. Suppose one of these arguments, say \&@[3], is a DOS
+   filename such as C:\FOO\BAR\BAZ\OOFA.TXT. (Note: In C-Kermit 7.0 and
+   K95 1.1.18 and later, command-line arguments after "=" or "--" are
+   also available in the top-level \%1..9 variables; see [360]Section
+   7.5.)
+
+   Of course you can eliminate any problems by using forward slashes
+   rather than backslashes in the filename, but sometimes this is not
+   possible, as when the Kermit command line is being generated by
+   another program than can only generate "native" format DOS filenames.
+
+   As noted in the manual, "\%x" variables and \&x[] arrays are always
+   evaluated "all the way" (recursively). If the contents of one of these
+   variables contains backslashes, this causes another level of
+   evaluation.
+
+   There is another kind of variable, which is evaluated only "one level
+   deep". You can use this to prevent interpretation of the backslashes
+   in the filenames. Example:
+
+  assign filename \fcontents(\&@[3])  ; Transfer contents
+  ...
+  send \m(filename)
+
+   Or, more simply:
+
+  send \fcontents(\&@[3])
+     _________________________________________________________________
+
+  1.12. Debugging
+
+   The debug log is produced when you give a "log debug" command. This is
+   normally done at the request of the Kermit help desk, for forwarding
+   to the Kermit developers for analysis as a last resort in
+   troubleshooting problems. (Last resort because it can grow quite huge
+   in a very short time.) In cases where timing information is critical
+   to understanding a problem, you can tell C-Kermit to put a timestamp
+   on each debug log line by giving the command:
+
+  SET DEBUG TIMESTAMP ON
+
+   At any time before or after activating the debug log (SET DEBUG
+   TIMESTAMP OFF turns off timestamping). Timestamps can be turned off
+   and on as desired while logging. Obviously, they increase the size and
+   growth rate of the log significantly, and so should be used sparingly.
+   Timestamps are of the form hh:mm:ss.xxx, where .xxx is thousands of a
+   second (but is included only on platforms that include this feature).
+     _________________________________________________________________
+
+  1.13. Logs
+
+   In UNIX C-Kermit and in K-95, you can now direct any log to a pipe.
+   This not only lets you send your logs to places other than disk files,
+   but also lets you customize them to any desired degree.
+
+   LOG { DEBUG, PACKETS, SESSION, TRANSACTION, CONNECTION } { file, pipe
+          } ...
+          A "pipe" is the name of a command, preceded by a vertical bar.
+          If the pipe contains any spaces, it must be enclosed in braces.
+
+   Here are some examples for UNIX (always remember the importance of
+   getting the UNIX shell quoting rules right):
+
+   LOG TRANSACTIONS |lpr
+          This sends the transaction log to the default UNIX printer,
+          rather than to a file (use "lp" rather than "lpr" if
+          necessary).
+
+   LOG TRANSACTIONS {| myfilter > t.log}
+          For those who don't like the format of the transaction log, or
+          want to extract certain information from it; write your own
+          output filter.
+
+   LOG SESSION {| lpr -Plaserwriter}
+          This sends the session log to a specific UNIX printer, rather
+          than to a file. Note the braces around the pipeline. These are
+          required because it contains spaces.
+
+   LOG DEBUG {| tail -100 > debug.log}
+          This causes the debug log file to contain only the final 100
+          lines. Suppose C-Kermit crashes under some unpredictable
+          circumstances, and you need a debug log to catch it in the act.
+          But the debug log can grow to huge proportions very quickly,
+          possibly filling up the disk. Piping the debug log through
+          "tail" results in keeping only the last 100 lines (or other
+          number of your choice).
+
+   LOG DEBUG {| grep "^TELNET" > debug.log}
+          This one shows how to log only Telnet negotiations. Piping the
+          debug log through grep or egrep lets you log only specific
+          information, rather than everything. "man grep" for further
+          info.
+
+   LOG DEBUG {| gzip -c > debug.log.gz}
+          Creates a full debug log, but compressed by gzip to save space.
+
+   LOG PACKETS {| tr "\\01" "X" | cut -c9- > packet.log}
+          This one writes the regular packet log, but translates the
+          Ctrl-A that starts each packet to the letter "X" and removes
+          the s-nn-nn- notation from the beginning of each line. Note the
+          double backslash (normal Kermit quoting rules). "man tr" and
+          "man cut" for further info.
+
+   See [361]Section 2.12 for information about the new connection log.
+     _________________________________________________________________
+
+  1.14. Automatic File-Transfer Packet Recognition at the Command Prompt
+
+   Beginning in version 7.0, C-Kermit can recognize Kermit (and in some
+   cases also Zmodem) file-transfer packets while at its command prompt.
+   This is convenient (for example), if you escaped back from a remote
+   Kermit program and told the local Kermit program to send a file, but
+   forgot to tell the remote Kermit program to receive it (and the local
+   Kermit did not have the "send a Kermit receive command" feature
+   available). This feature is controlled by the following command:
+
+   SET COMMAND AUTODOWNLOAD { ON, OFF }
+          When ON, which is the default, the command parser recognizes
+          Kermit packets when Kermit is in remote mode. An S packet makes
+          it go into receive mode, an I packet makes it go into server
+          mode. When OFF, packet recognition is disabled and the behavior
+          when a packet is received at the command prompt is as it was in
+          C-Kermit 6.1 and earlier (namely to print an error message).
+
+   COMMAND AUTODOWNLOAD is the command-mode equivalent of TERMINAL
+   AUTODOWNLOAD, which is effective during CONNECT mode.
+     _________________________________________________________________
+
+  1.15. The TYPE Command
+
+   The TYPE command now accepts a selection of optional switches
+   ([362]Section 1.5), and also sets several variables.
+
+   Syntax: TYPE [ switches... ] filename
+
+   Variables:
+
+   \v(ty_ln)
+          Line number of current line (during TYPE command; see /PREFIX)
+
+   \v(ty_lc)
+          Line count of file most recently TYPEd.
+
+   \v(ty_mc)
+          Match count of file most recently TYPEd (see /MATCH).
+
+   Switches:
+
+   /PAGE
+          If /PAGE is included, Kermit pauses at the end of each
+          screenful and issues a "more?" prompt. You may press the space
+          bar to view the next page (screenful), or press "q" or "n" to
+          return to the C-Kermit prompt. If this switch is given, it
+          overrides the COMMAND MORE-PROMPTING setting for this command
+          only. If it is not given, paging is according to COMMAND
+          MORE-PROMPTING.
+
+   /NOPAGE
+          Do not pause at the end of each screenful; show the whole file
+          (or all selected lines) at once. If this switch is given, it
+          overrides the COMMAND MORE-PROMPTING setting for this command
+          only. If it is not given, paging is according to COMMAND
+          MORE-PROMPTING.
+
+   /HEAD[:n]
+          Only show the first n lines of the file (where n is a number).
+          If n is omitted, 10 is used.
+
+   /TAIL[:n]
+          Only show the last n lines of the file (where n is a number).
+          If nis omitted, 10 is used. Note: /HEAD and /TAIL can't be
+          combined; if you give both switches, only the most recent one
+          is used.
+
+   /MATCH:pattern
+          Only type lines from the file that match the given pattern (see
+          [363]Section 4.9.1 for pattern notation). UNIX users familiar
+          with grep should note a significant difference: there is no
+          implied "*" at the beginning and end of the pattern. Thus:
+
+  TYPE /MATCH:foo    Lists lines whose entire contents are "foo".
+  TYPE /MATCH:foo*   Lists lines that start with "foo".
+  TYPE /MATCH:*foo   Lists lines that end with "foo".
+  TYPE /MATCH:*foo*  Lists lines that have "foo" anywhere in them.
+
+          /HEAD and /TAIL apply after /MATCH, so "type /tail:20
+          /match:x*" shows the last 20 lines in the file that start with
+          "x".
+
+   /PREFIX:string
+          Print the given string at the beginning of each line. The
+          string may be a constant, a variable, or a quoted variable. If
+          it's an unquoted variable, its value at the time the TYPE
+          command was given is used as a constant. If it is a quoted
+          variable, it is re-evaluated for each line; a useful variable
+          for this context is \v(ty_ln) (the line number of the current
+          line being typed). If the prefix is to include spaces, it must
+          be enclosed in braces. Examples:
+
+        type /prefix:{oofa.txt: } /match:*thing* oofa.txt
+                Prints all lines in oofa.txt that contain "thing" with
+                the filename itself as the prefix (similar to UNIX grep).
+
+        type /prefix:{\v(time). } oofa.txt
+                Prefixes each line of oofa.txt with the time at which the
+                TYPE command was given (one backslash)
+
+        type /prefix:{\\v(time). } oofa.txt
+                Prefixes each line of oofa.txt with the time at which
+                that line is being typed (two backslashes).
+
+        type /prefix:{\\v(ty_ln). } oofa.txt
+                Prefixes each line of oofa.txt with its line number.
+
+        type /prefix:{\\flpad(\\v(ty_ln),4). } oofa.txt
+                Same as the previous example, except the line number is
+                right-adjusted in a 4-column field.
+
+   /WIDTH[:n]
+          Truncates each line at column n (which must be a number) prior
+          to printing it. This option can be used for long lines when you
+          don't want them to wrap. If nis omitted, your current screen
+          width is used.
+
+   /COUNT
+          Counts lines and -- if /MATCH was included, matches -- but does
+          not print any lines from the file. The line and match count is
+          shown at the end, and the variables \v(ty_lc) and \v(ty_lm) are
+          set accordingly.
+
+   SET OPTIONS TYPE { /PAGE, /NOPAGE, /WIDTH:n }
+          Sets the paging default for TYPE commands, which can be
+          overridden in any particular TYPE command by including the
+          desired switch.
+
+   If a TYPE command is given with no switch, and no SET OPTIONS TYPE
+   selection is in effect, paging is according to your COMMAND
+   MORE-PROMPTING setting (SHOW COMMAND).
+     _________________________________________________________________
+
+  1.16. The RESET Command
+
+   The RESET command, added in 7.0, closes all open files and logs, but
+   does not affect the open connection (if any).
+     _________________________________________________________________
+
+  1.17. The COPY and RENAME Commands
+
+   As of C-Kermit 7.0, in the UNIX version only, the COPY and RENAME
+   commands are built in and do not call the underlying platform's COPY
+   or RENAME command. This allows them to work in "NOPUSH" versions and
+   other circumstances where it can't access system commands, and it
+   allows file copying and renaming to be done portably in scripts. The
+   characteristics of the built-in COPY or RENAME include:
+     * It fails if the source file is a directory or is wild or lacks
+       read access.
+     * It fails if the source file is the destination file.
+     * It allows the destination file to be a directory, in which case
+       the source file is copied (or renamed) into it with the same name.
+     * It overwrites an existing destination file if its permission
+       allows.
+     * It sets the new file's permission according to umask but also
+       carries forward the source file's execute permission bits if the
+       destination file did not already exist.
+     * It fails if interrupted by Ctrl-C.
+     * Upon error, it prints an appropriate message.
+     * It returns standardized error codes that can be tested by IF
+       SUCCESS / FAIL.
+
+   These commands now also accept the following switches:
+
+  /LIST (/LOG, /VERBOSE)    = Print "file1 => file2 (OK)" (or error message).
+  /NOLIST (/NOLOG, /QUIET)  = Don't print anything (except error messages).
+
+   /NOLIST is the default.
+
+   The same built-in code is used by the UNIX C-Kermit server to execute
+   REMOTE COPY commands (except in this case no switches are available).
+
+   The COPY command also accepts the following additional switches. When
+   any of these are given (and they can be used in any combination except
+   /SWAP and /APPEND), some of the checks listed above are relaxed, and
+   thus it might be possible to get into trouble in certain cases, e.g.
+   when the source and target files are the same file:
+
+  /APPEND                   = Append source file to destination file.
+  /SWAP-BYTES               = Swap bytes (see [364]Section 6.6.5).
+  /FROMB64                  = Decode the source file from Base64 encoding.
+  /TOB64                    = Encode the target file in Base64.
+
+   Base64 is the encoding commonly used for enclosures in Internet email.
+     _________________________________________________________________
+
+  1.18. The MANUAL Command
+
+   The MANUAL command can be used to access the appropriate Kermit manual
+   or other manual. The general syntax is:
+
+   MANUAL [ string ]
+          If the string is omitted, C-Kermit asks the underlying system
+          to access the C-Kermit manual using whatever method is
+          appropriate for the system.
+
+   The specific action depends on the system. In UNIX, a "man" command is
+   issued; "kermit" is the default argument but other manual topics may
+   be specified. If the "man" command allows index or string searching,
+   the appropriate syntax may be included.
+
+   In Kermit 95, the MANUAL command brings up the HTML online K95 manual.
+
+   In VMS and elsewhere, "man" is simply translated to "help", with a
+   default argument of "kermit"; other and/or additional arguments may be
+   included according to the definition of the system's "help" command.
+
+   Correct operation of the "man" command in C-Kermit depends on the
+   appropriate man page or help topic having been installed in the right
+   place with the right permissions and format.
+     _________________________________________________________________
+
+  1.19. String and Filename Matching Patterns
+
+   A pattern is a string that includes special notation for matching
+   classes or sequences of characters. C-Kermit 7.0 / K95 1.1.19 supports
+   patterns in several places:
+
+     * Filenames ([365]Section 4.9)
+     * SWITCH case labels ([366]Section 7.18)
+     * The new IF MATCH statement ([367]Section 7.4)
+     * TYPE /MATCH ([368]Section 1.15)
+     * SET FILE TEXT-PATTERNS and BINARY-PATTERNS ([369]Section 4.3)
+     * The \fsearch() and \farraylook() functions ([370]Sections 7.3 and
+       [371]7.10.7)
+     * The \fpattern() function used with [M,RE]INPUT ([372]Section 7.1)
+
+   Patterns are also called wildcards, especially when used for filename
+   matching. C-Kermit's pattern syntax is explained in [373]Section
+   4.9.1, and also by the HELP WILDCARDS command.
+     _________________________________________________________________
+
+  1.20. Multiple Commands on One Line
+
+   As of C-Kermit 7.0, commands can be grouped together on one line by
+   separating the commands with commas and enclosing the list in braces.
+   For example:
+
+  C-Kermit> { echo One, echo Two, echo Three }
+  C-Kermit> do { echo One, echo Two, echo Three }
+
+   Command lists can be nested:
+
+  [ do ] { echo One, echo Two, if true { echo A, echo B}, echo Three }
+
+   and the END command works as it does in macros:
+
+  [ do ] { echo One, echo Two, if true end, echo Three }
+
+   The "one line" stricture is, of course, pliant to line-continuation
+   conventions, namely that lines ending in hyphen (-) or left brace ({)
+   are to be continued. Thus the first example can also be rendered:
+
+  [ do ] {
+      echo One
+      echo Two
+      echo Three
+  }
+
+   (the "do" is optional).
+     _________________________________________________________________
+
+  1.21. What Do I Have?
+
+   C-Kermit can be built for hundreds of different platforms with
+   practically countless configuration options. Certain commands might
+   not be available in certain configurations, etc. Even on the same
+   platform, different builds are possible: "maximum functionality",
+   "minimum size", "maximum performance", and so on. You can find out a
+   lot about the configuration of your C-Kermit program with the SHOW
+   FEATURES command. Of course, a lot of what it says, especially in the
+   bottom part, might seem like gibberish, but can be deciphered with a
+   Rosetta Stone (such as the C-Kermit source or the [374]ckccfg.txt
+   file). In any case, the output from SHOW FEATURES might easily explain
+   why some expected feature is missing, or some buffer is smaller than
+   expected. Here's a sample of the bottom section for the SunOS version:
+
+C-Kermit 7.0.196, 1 Jan 2000
+
+Major optional features included:
+ Network support (type SHOW NET for further info)
+ Telnet Kermit Option
+ Hardware flow control
+ External XYZMODEM protocol support
+ Latin-1 (West European) character-set translation
+ Latin-2 (East European) character-set translation
+ Cyrillic (Russian, Ukrainian, etc) character-set translation
+ Greek character-set translation
+ Hebrew character-set translation
+ Japanese character-set translation
+ Unicode character-set translation
+ Pseudoterminal control
+ REDIRECT command
+ RESEND command
+ Fullscreen file transfer display
+ Control-character unprefixing
+ Streaming
+ Autodownload
+
+Major optional features not included:
+ No Kerberos(TM) authentication
+ No SRP(TM) (Secure Remote Password) protocol
+ No Secure Sockets Layer (SSL) protocol
+ No Transport Layer Security (TLS) protocol
+ No encryption
+ No X Windows forwarding
+
+Host info:
+ Machine:    sun4m
+ Model:      (unknown)
+ OS:         SunOS
+ OS Release: 4.1.3_U1
+ OS Version: 4
+
+Target: sunos41gsc
+GCC version: 2.7.2
+Compiled Dec 31 1999 10:38:54, options:
+ __GNUC__ __STDC__ _POSIX_JOB_CONTROL _SC_JOB_CONTROL ARRAYREFLEN=1024 BIGBUFOK
+ BROWSER BSD4 CK_ANSIC CK_APC CK_AUTODL CK_CURSES CK_DNS_SRV CK_ENVIRONMENT
+ CK_FAST CK_LOGIN CK_MKDIR CK_NAWS CK_PCT_BAR CK_PERMS CK_RECALL CK_RTSCTS
+ CK_SPEED CK_TIMERS CK_TMPDIR CK_TTGWSIZ CK_TTYFD CK_WREFRESH CKEXEC
+ CKFLOAT=double CKGHNLHOST ckmaxfiles=64 CKMAXOPEN=64 CKMAXPATH=1023 CKREALPATH
+ CKREGEX CKSYSLOG CKTUNING CMDBL=32763 CMDDEP=64 CONGSPD DCMDBUF DIRENT DYNAMIC
+ FNFLOAT FORDEPTH=32 GFTIMER HADDRLIST HDBUUCP IFDEBUG IKS_OPTION IKSDB
+ IKSDCONF INBUFSIZE=32768 INPBUFSIZ=4096 MAC_MAX=16384 MACLEVEL=128 MAXDDIR=32
+ MAXDNUMS=4095 MAXGETPATH=128 MAXTAKE=54 MAXWLD=102400 MSENDMAX=1024 NETCMD
+ NETCONN NETPTY NOKVERBS NOSETBUF OBUFSIZE=32768 PARSENSE PATTERNS PIPESEND
+ RENAME RLOGCODE SAVEDUID SELECT SIG_V SOL_SOCKET sparc STREAMING sun SUNOS4
+ SYSTIMEH TCPSOCKET TIMEH TLOG TNCODE TTLEBUF TTSPDLIST UIDBUFLEN=256 UNIX
+ UNPREFIXZERO USE_LSTAT USE_MEMCPY VNAML=4096 WHATAMI XFRCAN Z_MAXCHAN=46
+ z_maxchan=46 ZXREWIND
+
+ byte order: big endian
+
+ sizeofs: int=4 long=4 short=2 char=1 char*=4 float=4 double=8
+
+ floating-point: precision=16 rounding=1
+
+   Without going into detail about what all the notation means, notice a
+   couple things:
+
+     * The Options section shows symbols ("macros") in effect during
+       compilation, together with their values (for those that have
+       values). The options are listed in alphabetical order to make any
+       particular option easier to find.
+     * MAXWLD is the maximum number of files that a wildcard can expand
+       to.
+     * Anything starting with "NO" is a feature (or something other than
+       a feature) that has been deliberately "compiled out", or omitted.
+     * Important items for script writers include: CMDBL=32763 (the size
+       of the command buffer and therefore the maximum length for a macro
+       or variable definition; CMDDEP=64 (the limit on recursion depth);
+       FORDEPTH=32 (the nesting limit on FOR loops); INBUFSIZE=32768 (the
+       size of the INPUT command circular buffer); MAC_MAX=16384 (the
+       maximum number of macros), etc.
+
+   See the [375]ckccfg.txt file for details.
+     _________________________________________________________________
+
+  1.22. Generalized File Input and Output
+
+   C-Kermit 7.0 adds a new generalized I/O system for stream files,
+   augmenting (and to some extent, overlapping with) the older OPEN,
+   READ, WRITE, and CLOSE commands. In the new file i/o system, which can
+   be used simultaneously with the old one, all commands are grouped
+   together under the new FILE keyword, and some related functions and
+   variables are added.
+
+    1.22.1. Why Another I/O System?
+
+   The well-known LOG, OPEN, READ, WRITE, and CLOSE commands have the
+   following restrictions:
+
+    1. Only one READ file and one WRITE file can be open at a time.
+    2. The READ and WRITE commands are strictly line oriented.
+    3. These commands can not be used with binary files.
+    4. They do not support read/write access or random access.
+    5. The syntax is a bit counterintuitive for programmers.
+
+   The new file i/o system allows multiple files to be open at once, in
+   any desired combination of modes (read/write/append) supported by the
+   operating system, for line, block (record), or character i/o, for
+   sequential or random access, using consistent syntax and conventions.
+
+   The new system, however, does not replace the old one, since the old
+   system still must be used for:
+
+    1. The session, packet, debug, transaction, and connection logs.
+    2. Reading and writing commands rather than files.
+    3. Existing scripts.
+
+   The new system works only with regular files, not with commands or
+   pipes or mailboxes or pseudoterminals. No special provisions are made
+   in the FILE commands for handling devices or network connections, nor
+   for preventing you from trying to open them; if the underlying
+   operating system treats them like regular stream disk files, the FILE
+   commands (except, of course SEEK, REWIND, and COUNT) might work with
+   them. (In C programming terms, the FILE commands are, at present,
+   nothing more than a front end to fopen() / fread() / fwrite() /
+   fclose() and friends, which are a portable API to sequential files,
+   but this might change in the future for platforms like VMS and VOS
+   that have more complicated file systems.)
+
+   Definitions:
+
+   Channel
+          A number assigned to a file when it is opened, by which it must
+          be referred to in all input/output operations.
+
+   Read/Write Pointer
+          The current position in an open file, expressed as the 0-based
+          byte count from the beginning.
+     _________________________________________________________________
+
+    1.22.2. The FILE Command
+
+   FILE keyword [ switches ] channel [ data ]
+          The keyword specifies the function: FILE OPEN, FILE READ, FILE
+          WRITE, FILE CLOSE, etc. For convenience (and for familiarity to
+          C programmers), the two-word FILE commands can be shortened to
+          the single words FOPEN, FREAD, FWRITE, FCLOSE, and so on.
+          Switches are optional, and modify or amplify the requested file
+          function.
+
+   As in C, Fortran, and other programming languages, open files are
+   referred to by "channels", integers such as 0, 1, 2, 3, and so on. A
+   channel number is assigned when you open a file. The number of
+   available channels depends on the underlying operating system, and can
+   be seen in the variable:
+
+  \v(f_max)
+
+   or by giving the FILE LIST (FLIST) command. Channels are discussed in
+   greater detail in [376]Section 1.22.4.
+
+   FILE command errors can be caught with IF FAIL after the FILE command.
+   In addition, the \v(f_error) variable is set to the completion code of
+   the command: 0 if no error, or a negative number if there was an
+   error. The error codes are listed in [377]Section 1.22.5.
+
+   The command to open a file is:
+
+   FILE OPEN [ switches ] variable filename
+          Opens a file for the type of access specified by the switches,
+          or for read-only access if no switches are given. Upon success,
+          a channel number is assigned to this file and stored in the
+          given variable so you can refer to the open file in subsequent
+          i/o commands. If the file can not be opened, the FILE OPEN
+          command fails. Synonym: FOPEN.
+
+   The FILE OPEN switches are:
+
+   /READ
+          Open the file for read access. If no switches are given, /READ
+          is assumed. If the file does not exist or can't be opened for
+          read access, the FILE OPEN command fails.
+
+   /WRITE
+          Allow writing. If a file of the same name already exists, it is
+          overwritten unless /READ or /APPEND is also included. If a file
+          of the given name does not exist, it is created.
+
+   /APPEND
+          Equivalent to /WRITE, except that if the file exists, it is not
+          destroyed. The read/write pointer is set to the end of the
+          file, so unless you change it with FILE SEEK or REWIND (see
+          below), the first FILE WRITE command adds to the end of the
+          file, preserving what was there already. If /WRITE is also
+          given, it is ignored.
+
+   /BINARY
+          Open the file in "binary" mode, rather than text mode. This
+          switch is meaningless (but still can be used) in UNIX. In VMS,
+          Windows, and OS/2, it inhibits end-of-line processing and
+          conversion, and so should be used for binary files and/or files
+          that are to be accessed in record or character mode rather than
+          line by line.
+
+   The variable for the channel number can be any kind of variable: the
+   \%x kind, a macro name, or an array element. But it must be a
+   variable, not a number -- C-Kermit assigns the channel number; you
+   can't tell it what number to use.
+
+   Example:
+
+  FILE OPEN \%c oofa.txt                  ; Open oofa.txt for reading.
+  IF FAIL exit 1 Can't open oofa.txt      ; Always check to see if it worked.
+  ECHO oofa.txt: channel = \%c
+
+   If the file oofa.txt is opened successfully, a channel number is
+   assigned to the variable \%c. Here's another example using a macro
+   name for the channel number:
+
+  FILE OPEN channel oofa.txt              ; Open oofa.txt for reading.
+  IF SUCCESS ECHO oofa.txt: channel = \m(channel)
+
+   Switches can be combined when it makes sense and the underlying
+   operating system allows it. For example, to open a file in binary mode
+   for reading and writing (sometimes called "update"):
+
+  FILE OPEN /READ /WRITE /BINARY \%c budget.db
+
+   Some combinations might be allowed, others not. For example /READ
+   /APPEND will usually not be allowed. /WRITE /APPEND is treated as
+   /APPEND.
+
+   A major advantage of the new system over the older one is that you can
+   have multiple files open at once. Suppose, for example, that you want
+   to open all the files in a certain directory at once:
+
+  .\%n := \ffiles(/usr/olga*,&f)          ; Get file list into array.
+  if ( > \%n \v(f_max) ) {                ; Make sure there aren't too many.
+      exit 1 {\v(dir): \%n = Too many files}
+  }
+  declare \&c[\%n]                        ; Make array for channel numbers.
+  for \%i 1 \%n 1 {                       ; Loop to open every file...
+      file open \&c[\%i] \&f[\%i]         ; Try to open this one
+      if fail exit 1 Open error: \&f[\%i] ; Check for failure
+  }
+
+   If this loop completes successfully, the \&c[] array will contain \%n
+   channel numbers of open files in elements 1 through \%n.
+
+   Any file that you open with FILE OPEN stays open until Kermit exits,
+   or you close it explicitly. The command to close a file is:
+
+   FILE CLOSE { ALL, channel }
+          If a channel number is given and the channel refers to an open
+          file, the file is closed and the channel is freed for reuse; if
+          the channel does not refer to an open file, an error message is
+          printed and the command fails. If ALL is specified instead of a
+          specific channel, all files opened with FILE OPEN are closed
+          and if all open files were closed successfully (even if no
+          files were open), the command succeeds; if any open file could
+          not be closed, the command fails; however, all open files that
+          could be closed are still closed. Synonym: FCLOSE.
+
+   FILE CLOSE might fail because, for example, the disk filled up or a
+   quota was exceeded. Example:
+
+  fopen /write \%c new.txt                ; Open new.txt for writing.
+  if fail exit 1                          ; Check for error.
+  fclose \%c                              ; Close the file we just opened.
+
+   This creates a 0-length file called new.txt.
+
+   Note that FILE OPEN /WRITE (without /READ or /APPEND) always creates a
+   new file, and therefore destroys any file with the same name that
+   might already exist (assuming you have permission to delete it). To
+   avoid overwriting existing files, simply check first:
+
+  if exist new.txt exit 1 {Fatal - new.txt already exists}
+  fopen /write \%c new.txt
+  if fail ...
+
+   The next two commands give information about open files:
+
+   FILE STATUS channel
+          Tells the name of the file, if any, open on the given channel
+          and the switches it was opened with. The read/write pointer is
+          also shown; this is where the next read or write will occur;
+          "[EOF]" is shown if the current position in the open file is
+          the end -- i.e. the next read will fail if the file was opened
+          in /READ mode; the next write will add material to the end. The
+          current line number (0-based) is also shown if known. The FILE
+          STATUS command succeeds if the channel is open, and fails if
+          there is no open file on the given channel, or if the channel
+          number is invalid or out of range. Synonym: FSTATUS.
+
+   FILE LIST
+          Lists the channel number and name of each open file, along with
+          its OPEN modes (R, W, A, B, RW, etc) and its current read/write
+          pointer or "[EOF]" if it is at the end. Also tells the number
+          of files currently opened with FILE OPEN, plus the maximum
+          number of open files allowed by the system and the maximum
+          number allowed for FILE OPEN. Synonym: FLIST.
+
+   Next come the commands for reading and writing files:
+
+   FILE READ [ switches ] channel [ variable ]
+          Reads data from the file on the given channel number into the
+          variable, if one was given; if no variable was given, the
+          result is printed on the screen. IMPORTANT: The variable should
+          normally be a macro name rather than a \%x or \&x[] variable if
+          you want backslash characters in the file to be taken literally
+          (see pp.408-412 of [378]Using C-Kermit for an explanation; you
+          can also read into a \%x or \&x[] variable, but then you must
+          remember to protect future references to by \fcontents() if you
+          don't want C-Kermit to process any backslashes it might
+          contain). The desired amount of data (according to the
+          switches) is read from the file at the current read/write
+          pointer, and upon completion the read/write position is updated
+          to first byte after the data that was read, no matter what
+          switches were given. Synonym: FREAD.
+
+   FILE WRITE [ switches ] channel text
+          Writes the given text to the file on the given channel number.
+          The text, of course, can be literal text or a variable, or any
+          combination. If the text might contain leading or trailing
+          spaces, it must be enclosed in braces if you want to preserve
+          them. Synonym: FWRITE.
+
+   Before proceeding, a caution about the NUL character. C-Kermit is so
+   named because it is a Kermit program written in the C language. In C,
+   character strings are represented as a sequence of non-NUL bytes
+   terminated by a NUL byte (a byte in which all bits are 0). Thus a C
+   string can not contain NUL bytes; it always ends with the first NUL
+   byte. C-Kermit variables are implemented as C strings and therefore
+   can't contain NUL bytes either, so the FILE READ and FILE WRITE
+   commands do not handle files or strings that contain NUL bytes, except
+   when the /CHARACTER switch is included with the FILE READ or WRITE
+   command, or when /LPAD:0 or /RPAD:0 is given with the FILE WRITE
+   command; these switches are explained below.
+
+   Also note that Kermit can not be used read or write binary numbers in
+   the machine's internal format (integer or floating-point); in general,
+   numbers can be processed only when represented as numeric or
+   floating-point strings.
+
+   FILE READ switches are:
+
+   /LINE
+          Specifies that a line of text is to be read. A line is defined
+          according to the underlying operating system's text-file
+          format. For example, in UNIX a line is a sequence of characters
+          up to and including a linefeed, or the end of the file, which
+          ever comes first. The line terminator (if any) is removed
+          before assigning the text to the variable. If no switches are
+          included with the FILE READ command, /LINE is assumed. Normally
+          this switch should not be used with files opened in /BINARY
+          mode (but nothing prevents it either).
+
+   /SIZE:number
+          Specifies that the given number of bytes (characters) is to be
+          read. The actual number of bytes returned will be less if the
+          end of file is reached (or a NUL byte is encountered). For
+          example, if a file is 514 bytes long, FILE READ /SIZE:512
+          returns 512 bytes the first time and 2 bytes the second time.
+          FILE READ /SIZE provides a kind of "record i/o" for files that
+          do not necessarily contain lines. The resulting block of
+          characters is assigned to the variable without any editing.
+          Synonym: /BLOCK.
+
+   /CHARACTER
+          Equivalent to /SIZE:1. If FILE READ /CHAR succeeds but the
+          variable is empty, this indicates a NUL byte was read. Synonym:
+          BYTE.
+
+   FILE WRITE switches are:
+
+   /LINE
+          Specifies that an appropriate line terminator is to be added to
+          the end of the text. If no switches are included, /LINE is
+          assumed.
+
+   /SIZE:number
+          Specifies that the given number of bytes (characters) is to be
+          written. If the given text is longer than the requested size,
+          it is truncated; if is shorter, it is padded according /LPAD
+          and /RPAD switches. Synonym: /BLOCK.
+
+   /LPAD[:value]
+          If /SIZE was given, but the text is shorter than the requested
+          size, the text is padded on the left with sufficient copies of
+          the character whose ASCII value is given to write the given
+          length. If no value is specified, 32 (the code for Space) is
+          used. The value can also be 0 to write the indicated number of
+          NUL bytes. If /SIZE was not given, this switch is ignored.
+
+   /RPAD[:value]
+          Like LPAD, but pads on the right.
+
+   /CHARACTER
+          Specifies that one character should be written. If the text is
+          empty or not given, a NUL character is written; otherwise the
+          first character of text is given. Synonym: /BYTE.
+
+   /STRING
+          Specifies that the text is to be written as-is, with no
+          terminator added.
+
+   Here's an example in which we copy a text file line by line:
+
+  file open /read \%c oofa.txt            ; Open input file
+  if fail exit 1 Can't open input file    ; Check that it's open
+  file open /write \%d new.txt            ; Open output file
+  if fail exit 1 Can't open output file   ; Check
+  while true {                            ; Loop to copy lines
+      file read /line \%c line            ; Read a line
+      if fail break                       ; Assume failure = end of file
+      file write /line \%d {\m(line)}     ; Write the line to output file
+      if fail exit 1 Write failure        ; Failure here is fatal
+  }
+  file close \%c                          ; Close the two files
+  file close \%d
+
+   Note that since /LINE is the default for both FILE READ and FILE
+   WRITE, it can be omitted as in the following example, where we also
+   use the short names for the FILE commands.
+
+  fopen /read \%c oofa.txt                ; Open input file
+  if fail exit 1 Can't open input file    ; Check that it's open
+  fopen /write \%d new.txt                ; Open output file
+  if fail exit 1 Can't open output file   ; Check
+  while true {                            ; Loop to copy lines
+      fread \%c line                      ; Read a line
+      if fail break                       ; Assume failure = end of file
+      fwrite \%d {\m(line)}               ; Write the line to output file
+      if fail exit 1 Write failure        ; Failure here is fatal
+  }
+  fclose \%c                              ; Close the two files
+  fclose \%d
+
+   Here's the same example using "record i/o" (the open and close
+   sequences are are omitted since they are the same as above). The
+   result is the same, but execution is much faster:
+
+  while true {                            ; Loop to copy blocks
+      fread /size:512 \%c block           ; Read a block into \%a
+      if fail break                       ; Assume failure = end of file
+      fwrite /string \%d {\m(block)}      ; Write the block to output file
+      if fail exit 1 Write failure        ; Failure here is fatal
+  }
+
+   Although record i/o is faster, it should not be used in line-oriented
+   applications, since it returns arbitrary chunks of the file to your
+   script, rather than lines. In this example, FWRITE /STRING is used
+   rather than FWRITE /SIZE:512 to avoid the last output block being
+   padded beyond the original file's length.
+
+   A file can also be copied character by character, but this is much
+   slower than line i/o and VERY much slower than block i/o:
+
+  while true {                            ; Loop to copy blocks
+      fread /char \%c c                   ; Read a character into c
+      if fail break                       ; Assume failure = end of file
+      fwrite /char \%d {\m(c)}            ; Write character to output file
+      if fail exit 1 Write failure        ; Failure is fatal
+  }
+
+   Although character i/o is slow, it is the only way to process files
+   that contain NUL characters (i.e. bytes composed of only zero bits).
+   In the example above, when "fread /char \%c c" returns a NUL, the c
+   variable is empty. But since the FREAD /CHAR command did not fail, we
+   know the result was really a NUL. FWRITE /CHAR, when given an empty
+   variable (or no variable at all) writes a NUL. Thus the loop above
+   will copy any file at all (very slowly). In non-copying applications,
+   NULs are detected like this:
+
+  fread /char \%c c
+  if fail (do something)
+  if not def c (a NUL byte was read)
+
+   Finally some advanced file operations:
+
+   FILE FLUSH channel
+          For output files only: commits all previous writes to disk, in
+          case the computer was buffering them. Synonym: FFLUSH.
+
+   FILE COUNT [ { /BYTES, /LINES, /LIST, /NOLIST } ] channel
+          By default, or if the /BYTES switch is given, counts the bytes
+          in the file, if any, open on the given channel. If the /LINES
+          switch is given, counts lines in the file. If the /LIST switch
+          is given, the result is printed. If the /NOLIST switch is
+          given, the result is not printed. /QUIET is a synonym for
+          /NOLIST. If neither /LIST nor /NOLIST is given, the result is
+          printed if the command is given at top level, i.e. not from a
+          command file or macro. In all cases, the result of the most
+          recent FILE COUNT command is stored in the variable
+          \v(f_count). Note that FILE COUNT /LINE works (and can only
+          work) by reading the entire file; expect it to take some time
+          if the file is large. Synonym: FCOUNT.
+
+   FILE REWIND channel
+          Moves the read/write pointer to the beginning of the file.
+          Equivalent to FILE SEEK channel 0. Synonym: FREWIND.
+
+   FILE SEEK [ switches ] channel { [{+,-}]number, LAST, EOF }
+          Moves the read/write pointer for the file on this channel to
+          the given position, which may be a byte (character) number or a
+          line number, expressed in either absolute or relative terms.
+          Switches:
+
+        /BYTE
+                The number given is a byte number. Synonym: /CHARACTER.
+
+        /LINE
+                The number given is a line number.
+
+        /ABSOLUTE
+                The number given is absolute.
+
+        /RELATIVE
+                The number given is relative to the current position.
+
+          By default, or if the /BYTE switch is given, the number is a
+          byte number (0 = first byte). If /LINE is given, the number is
+          a line number (0 = first line). EOF means to move to the end of
+          the file. LAST means to move to the last line or character of
+          the file, depending on whether it's a line or character seek.
+
+          If neither the /RELATIVE nor the /ABSOLUTE switch is given,
+          then if a signed number is given, the motion is relative to the
+          current position. An expression that evaluates to a negative
+          number is not considered signed for this purpose; that is, a
+          sign (+ or -) must be included as the first character of the
+          number in the command itself to force a relative seek (in the
+          absence of /RELATIVE or /ABSOLUTE).
+
+          If the number has no sign, or if the /ABSOLUTE switch is given,
+          the number represents an absolute position (relative to the
+          beginning of the file). Subsequent FILE READs or WRITEs will
+          take place at the new position.
+
+          If the read/write pointer is placed after the end of the file,
+          a subsequent FILE READ will fail, but a FILE WRITE will succeed
+          (possibly creating a file with "holes"). If a FILE SEEK /BYTE
+          command is given, the current line becomes unknown (unless the
+          position is 0) and subsequent FILE SEEK /RELATIVE /LINE
+          commands will fail until the next non-relative FILE SEEK /LINE
+          command is given. Synonym: FSEEK.
+
+   An absolute FILE SEEK to a negative position fails silently, as does a
+   relative seek to a position before the beginning of the file.
+
+   A caution about relative SEEKs: remember that the number is relative
+   to the current position. Whenever you read or write, this changes the
+   position. In each of the following examples, assume the file open on
+   channel \%c is positioned at line n (the FREAD target variable is
+   omitted for lack of space):
+
+  { FREAD \%c, FSEEK /LINE \%c -1, FREAD \%c }  <-- Reads line n twice
+  { FREAD \%c, FSEEK /LINE \%c +0, FREAD \%c }  <-- Reads lines n and n+1
+  { FREAD \%c, FSEEK /LINE \%c +1, FREAD \%c }  <-- Reads lines n and n+2
+  { FREAD \%c, FSEEK /LINE \%c -2, FREAD \%c }  <-- Reads lines n and n-1
+  { FREAD \%c, FSEEK /LINE \%c -3, FREAD \%c }  <-- Reads lines n and n-2
+
+   Another caution: Using FSEEK and FREAD /SIZE to repeatedly read the
+   same disk block (e.g. when sampling a database record that is
+   frequently updated) might not give you updated disk blocks due to the
+   internal buffering and caching of the C library (this probably varies
+   from one platform/compiler combination to another). If necessary you
+   can force a fresh disk read with a close/open sequence:
+
+  FCLOS \%c
+  FOPEN \%c samefilename
+  FSEEK \%c samespot
+  FREAD /SIZE:howmanybytes \%c variable
+     _________________________________________________________________
+
+    1.22.3. FILE Command Examples
+
+   To read the last 10 lines of a text file into an array:
+
+  fopen /read \%c oofa.txt                ; Open the file
+  if fail exit 1 Can't open oofa.txt      ; Always check for failure
+  dcl \&a[10]                             ; Declare a 10-element array
+  fcount /line \%c                        ; Count lines in the file
+  fseek /line \%c \v(f_count)-10          ; Seek to 10 lines from the end
+  if fail exit 1 Can't seek               ; Check for failure
+  for \%i 1 10 1 { fread \%c \&a[\%i] }   ; Read the last 10 lines
+  fclose \%c                              ; Close the file
+
+   Note that blank lines show up as empty (undefined) array elements, for
+   example if you give a "show array a" command at this point. This is
+   normal. You can still use these elements; e.g.:
+
+  for \%i 1 10 1 { echo \%i. \&a[\%i] }   ; Display the 10 lines
+
+   Here is how to read the last line of a file (already open on channel
+   \%c):
+
+  fseek /line \%c last                    ; Seek directly to last line
+
+   Alternatively:
+
+  fseek /line \%c eof                     ; Seek to end of file
+  fseek /line \%c -1                      ; Seek to beginning of last line
+
+   Alternatively:
+
+  fcount /line \%c                        ; Count the file's lines
+  fseek /line \%c \v(f_count)-1           ; Seek to last line
+  fread \%c                               ; Read it
+
+   To read every other line from the file (using relative SEEK), skipping
+   the first line:
+
+  fopen /read \%c oofa.txt                ; Open the file
+  while ( success ) {                     ; Loop through lines
+      fseek /line \%c +1                  ; Skip a line
+      if success fread \%c                ; Read & display a line
+  }
+  fclose \%c                              ; Close the file
+
+   Here is how to read the lines of a file in reverse order:
+
+  fopen /read \%c oofa.txt                ; Open
+  if fail exit 1                          ; Check
+  fseek /line \%c last                    ; Seek to last line
+  while success {                         ; Loop
+      fread \%c                           ; Read line
+      fseek /line \%c -2                  ; Seek backwards two lines
+  }
+  fclose \%c                              ; Close the file
+
+   The loop works because a relative SEEK outside the file fails.
+
+   It is also possible to use block i/o to manage random-access files
+   with fixed-length records (as long as they don't contain NUL
+   characters). Suppose, for example, you have a file of "card image"
+   records with fixed-field information about customers, such as:
+
+  Name:     Columns  1-32  (column numbers are 1-based)
+  Address:  Columns 33-72
+  Balance:  Columns 73-80
+
+   The records are indexed by customer number, starting with 0. There are
+   no line terminators separating them. Therefore the record for customer
+   number n starts at position nx 80 (\%n*80).
+
+   Now suppose we received a payment from customer number 173 and want to
+   update the balance:
+
+  .\%n = 173                               ; Customer (record) number
+  .\%a = 12.72                             ; Amount
+  fopen /read /write \%c customer.db       ; Open the file
+  if fail stop 1 OPEN FAILED: \f_errmsg()  ; Check
+  fseek /byte \%c 80*\%n                   ; Seek to record
+  fread /size:80 \%c r                     ; Read the record
+  if fail stop 1 READ FAILED: \f_errmsg()  ; Check (IMPORTANT)
+  .\%b := \fright(\m(r),8)                 ; Extract the balance
+  .\%b := \ffpadd(\%b,\%a,2)               ; Add the new payment
+  if fail stop 1 ARITHMETIC ERROR: \%b/\%a ; Catch bad records
+  .r := {\fleft(\m(r),72)\flpad(\%b,8)}    ; Update the record
+  fseek /byte \%c 80*\%n                   ; Reposition to same spot
+  fwrite /size:80 \%c {\m(r)}              ; Replace the record
+  if fail stop 1 WRITE FAILED: \f_errmsg() ; Check
+  fclose \%c                               ; Close the file
+
+   REMEMBER: Using FILE SEEK to move beyond the end of file can result in
+   a file with holes when writing; when reading, an end-of-file error
+   will occur -- be sure to check for it.
+     _________________________________________________________________
+
+    1.22.4. Channel Numbers
+
+   C-Kermit's channel numbers are integers from 0 to some
+   platform-dependent limit, such as 46 or 1985 (the value of \v(f_max)).
+   This is the limit placed by the operating system on the number of
+   files that may be opened by one process or user or job, minus the
+   standard input, output, and error files, and minus the number of files
+   reserved by C-Kermit for logs, OPEN READ and WRITE, and file transfer
+   (and maybe some command files -- the \v(f_max) number can't be exact).
+
+   Although you must include a variable in the FILE OPEN command, to
+   which the channel number is assigned, you don't have to use a variable
+   in the other FILE commands if you know what the number is -- you can
+   just put the number. This saves you a few keystrokes when typing
+   commands at the prompt:
+
+  fopen \%c oofa.txt
+  flist
+  0. /usr/olga.oofa.txt (R) 0
+
+   This tells the channel number is 0 (the number on the left is the
+   channel file's channel number). Of course you can also find it by
+   echoing the variable:
+
+  echo \%c
+  0
+
+   Or with "fstatus \%c". Now you can type commands like:
+
+  fread 0
+
+   to read a line from the file. Obviously, however, using digits rather
+   than a variable for the channel number would be poor practice in a
+   script.
+
+   If in commands like:
+
+  fread \%c \%a
+
+   you have trouble remembering which variable is which, note that the
+   channel number is, indeed, a number. Anywhere C-Kermit accepts a
+   number it can also accept an expression, so you can put parentheses
+   around the channel number to remind you it's the channel number and
+   not the variable into which data is to be read:
+
+  fread (\%c) \%a
+
+   Normally channel numbers are assigned sequentially as 0, 1, 2, ... up
+   to the limit. However, once you start closing files, there can be
+   holes in the sequence. New channels are assigned to fill in the holes.
+   Thus you can't depend on channel numbers being in any particular
+   sequence.
+     _________________________________________________________________
+
+    1.22.5. FILE Command Errors
+
+   Each FILE command sets the variable \v(f_error) to one of the
+   following values:
+
+    0 = No error
+   -1 = System error
+   -2 = Attempt to read after end of file
+   -3 = Channel not open
+   -4 = Channel number out of range (negative or too large)
+   -5 = Numeric argument (size, ...) out of range
+   -6 = File not found
+   -7 = Bad or missing filename
+   -8 = Too many files are already open (FILE OPEN only)
+   -9 = Forbidden operation (e.g. write to a read-only file)
+  -10 = Access denied
+  -11 = Illegal combination of OPEN modes (FILE OPEN only)
+  -12 = Buffer overflow
+  -13 = Current line number unknown (for relative line seeks)
+  -14 through -98: Reserved.
+  -99 = Requested operation not implemented in this version of C-Kermit
+ -999 = Unknown error
+
+   When \v(f_error) is -1, this means the FILE command failed because
+   because of a system error, in which case you can examine the following
+   variables:
+
+  \v(errno)     = System error number.
+  \v(errstring) = Error message corresponding to \v(errno).
+
+   A special function is available for translating the \v(f_error) code
+   to an error message string:
+
+\f_errmsg([code])
+  If the code is -1, returns error message of the most recent system
+  error; otherwise if the code is a valid \v(f_error) value, the associated
+  message is returned.  If the code is omitted, the status message
+  corresponding to the current \v(f_error) value is returned.
+
+   A FILE command that fails prints the appropriate error message
+   automatically, except when the command is READ or SEEK and the error
+   is -2 (end of file); in that case, the command still fails, but does
+   not print a message. This allows constructions such as:
+
+  fopen \%c oofa.txt
+  while success { fread \%c }
+  fclose \%c
+
+   to work as expected, i.e. without an annoying message when the end of
+   file is reached.
+     _________________________________________________________________
+
+    1.22.6. File I/O Variables
+
+   The variables associated with the file i/o package are:
+
+   \v(f_count)
+          Result of the most recent FILE COUNT (FCOUNT) command.
+
+   \v(f_error)
+          Numeric error code of most recent FILE command (0 = no error).
+
+   \v(f_max)
+          Maximum number of files open simultaneously.
+     _________________________________________________________________
+
+    1.22.7. File I/O Functions
+
+   Some of the FILE commands can also be issued as function calls, which
+   makes script writing a bit more convenient, especially for C
+   programmers. Also, several functions are provided that do not have
+   command equivalents. Each of these functions takes a channel number as
+   the first argument. These functions do not work for OPEN { READ,
+   !READ, WRITE, !WRITE, and APPEND } files.
+
+   \f_status(channel)
+          Returns 0 if the channel is not open, otherwise a number
+          between 1 and 15 which is the sum of the OPEN modes:
+
+  1 = /READ
+  2 = /WRITE
+  4 = /APPEND
+  8 = /BINARY
+
+   The remaining functions work only for open channels. Each of these
+   functions can fail for the applicable reasons listed in [379]Section
+   1.22.5. For instructions on handling function errors, see [380]Section
+   7.12.
+
+   \f_pos(channel)
+          Returns the file's current read/write pointer (0-based). There
+          is no FILE command equivalent.
+
+   \f_line(channel)
+          Returns the file's current line number (0-based), if known,
+          otherwise -1. There is no FILE command equivalent. The line
+          number is known as long as no character or block i/o has been
+          done on the channel.
+
+   \f_handle(channel)
+          Returns the "file handle" of the file. That is, it translates
+          the portable C-Kermit channel number into a system-specific
+          file handle or number that can be passed to other programs on
+          the same platform. In UNIX this is a file descriptor. There is
+          no FILE command equivalent.
+
+   \f_eof(channel)
+          Returns 1 if the read/write pointer of the file on the given
+          channel is at the end of the file, 0 otherwise. Convenient in
+          WHILE statements, e.g.:
+
+    while not \f_eof(\%c) { fread \%c }
+
+   \f_getchar(channel)
+          Equivalent to FREAD /CHAR. Returns the character actually read.
+          If \f_getchar() does not fail but the return value is empty,
+          this means a NULL character was read.
+
+   \f_getline(channel)
+          Equivalent to FREAD /LINE. Returns the line actually read, but
+          with the line terminator stripped. If \f_getline() does not
+          fail but the return value is empty, this normally means an
+          empty line was read.
+
+   \f_getblock(channel,n)
+          Equivalent to FREAD /SIZE:n. Returns the block of characters
+          actually read. If the returned block is smaller than n, it
+          indicates either that the end of file was reached or a NUL
+          character is in the block.
+
+   \f_putchar(channel,c)
+          Equivalent to FWRITE /CHARACTER. Writes the character c. If c
+          contains more than one character, only the first is written. If
+          c is empty a NUL is written. Returns the number of characters
+          written on success, or a negative error code upon failure.
+
+   \f_putline(channel,string)
+          Equivalent to FWRITE /LINE. Writes the string and adds the
+          appropriate line termination character or sequence. If the
+          string is empty or omitted, an empty line is written. Returns
+          the number of characters written on success, or a negative
+          error code upon failure.
+
+   \f_putblock(channel,string)
+          Equivalent to FWRITE /STRING. Writes the string as given. If
+          the string is empty or omitted, nothing is written. Returns the
+          number of characters written on success, or a negative error
+          code upon failure.
+     _________________________________________________________________
+
+    1.22.8. File I/O Function Examples
+
+  fopen /read \%c oofa.txt            ; Open our favorite file for reading
+  if failure exit 1                   ; Check that it's open
+  while not \f_eof(\%c) {             ; Loop until EOF
+      .line := \f_getline(\%c)        ; Get a line
+      if success echo {\m(line)}      ; Echo it
+  }
+  if not \f_eof(\%c) {                ; Check reason for loop exit
+      exit 1 File Error: \f_errmsg()  ; If not EOF say so.
+  }
+
+  frewind \%c                         ; Rewind the file
+  while not \f_eof(\%c) {             ; Same thing but with block i/o
+      .block := \f_getblock(\%c,256)  ; (much faster than line i/o)
+      if success xecho {\m(block)}
+  }
+
+  frewind \%c                         ; Rewind again
+  while not \f_eof(\%c) {             ; Same deal but with character i/o
+      .c := \f_getchar(\%c)           ; (much slower than line i/o)
+      if success xecho {\m(c)}
+  }
+  close \%c
+
+   To close all open files (equivalent to FCLOSE ALL):
+
+  for \%i 0 \v(f_max)-1 1 {
+      if \f_status(\%i) fclose \%i
+  }
+     _________________________________________________________________
+
+  1.23. The EXEC Command
+
+   The EXEC command is available only in UNIX.
+
+   EXEC [ /REDIRECT ] command [ arg1 [ arg2 [ ... ] ]
+          Runs the given command with the arguments in such a way that
+          the command replaces C-Kermit in memory, and C-Kermit ceases to
+          execute. EXEC is like RUN, except instead of returning to
+          C-Kermit when finished, the command returns to whatever process
+          invoked Kermit.
+
+   In the normal case, no files are closed, so the EXEC'd command
+   inherits the open files, read/write pointers, working directory,
+   process ID, user ID (unless command is SUID), group ID (unless command
+   is SGID), groups, etc. (In UNIX, the EXEC command is simply a front
+   end for execvp().)
+
+   If the /REDIRECT switch is included, then if a connection is open (SET
+   LINE or SET HOST), it becomes the standard input and output of the
+   EXEC'd program. If no connection is open, the /REDIRECT switch has no
+   effect. For example to use C-Kermit for PPP dialing in Linux:
+
+  set modem type usr          ; Specify the kind of modem you have
+  set line /dev/ttyS1         ; Specify the device it's connected to
+  set speed 57600             ; and the speed
+  set flow rts/cts            ; and flow control.
+  set dial retries 100        ; Try the dial sequence up to 100 times.
+  dial {{9-212-555-1212}{9-212-555-1213}{9-212-555-1214}{9-212-555-1215}}
+  if fail exit 1
+  for \%i 1 16 1 {            ; Try up to 16 times to get login prompt
+      input 10 Login:         ; Wait 10 sec for it to appear
+      if success break        ; Got it - proceed...
+      output \13              ; Send a carriage return and try again
+  }
+  if ( > \%i 16 ) stop 1 NO LOGIN PROMPT
+  lineout \(myuserid)         ; Send user ID
+  input 30 assword:           ; Wait for Password prompt
+  if fail stop 1 NO PASSWORD PROMPT
+  lineout \m(mypassword)      ; Send the password.
+  exec /redirect pppd         ; Replace ourselves with pppd.
+
+   In this example we assume that the script has already set up the
+   myuserid and mypassword variables -- normally the password should be
+   prompted for, rather than stored on disk. Notice the advantages over
+   the well-known "chat script":
+     * You don't have to control the modem itself with AT commands;
+       Kermit's DIAL command does this for you.
+     * You can have Kermit automatically redial as many times as you want
+       until it gets a connection (if this is legal in your country).
+     * You can have Kermit fetch the number or numbers from a dialing
+       directory.
+     * You can have Kermit cycle through a list of phone numbers (this is
+       new in C-Kermit 7.0; see [381]Section 2.1.16) without having to
+       enter the numbers in a dialing directory.
+     * Dialing is location-independent; you can use the same script to
+       dial from different areas or countries.
+     * Once the connection is made, the full power of Kermit's script
+       language is available to manage the dialog with the terminal
+       server or other device that answers the phone call.
+
+   NOTE: PPP and SLIP dialing are not available in Windows 95/98/NT/2000,
+   whose APIs do not provide a method for an application to hand over a
+   connection to the PPP or SLIP driver.
+     _________________________________________________________________
+
+  1.24. Getting Keyword Lists with '?'
+
+   Suppose you type "te" at the C-Kermit> 6.0 prompt and then Esc or Tab
+   to request keyword completion. Kermit beeps, indicating that more than
+   one command starts with "te". But if you type '?' to see what they
+   are, Kermit shows only "telnet". So why the beep? Because of invisible
+   keywords like "telopt", "terminal", and "text". Lots of keywords are
+   invisible because they are either synonyms for other keywords or else
+   esoteric options to be used only in special circumstances, so we don't
+   want them cluttering up the menus.
+
+   But then there is no way for you to discover them. So in C-Kermit 7.0,
+   if you type '?' AFTER the beginning of a keyword field, then invisible
+   keywords are shown too:
+
+  C-Kermit> te<Esc><BEEP>
+  C-Kermit> te? Command, one of the following:
+   telnet    telopt    terminal  text
+  C-Kermit>te
+
+   But if '?' is typed at the beginning of a field, only visible keywords
+   are shown, as before (so, in this example, if '?' is typed at the
+   C-Kermit> prompt, "telnet" is the only command shown that starts with
+   "te").
+     _________________________________________________________________
+
+  2. MAKING AND USING CONNECTIONS The SET LINE, SET HOST, and SET PORT (a
+  synonym for SET LINE) commands have new synonyms, in which the word SET is
+  replaced by the word OPEN: OPEN LINE, etc. There is no new functionality
+  here, but OPEN is a better verb, since SET generally takes no action, whereas
+  these commands actually try to open a connection. Furthermore, there is the
+  symmetry with CLOSE.
+    ________________________________________________________________________
+
+  2.0. SET LINE and SET HOST Command SwitchesThe SET LINE (SET PORT) and SET
+  HOST commands now allow switches before the device or host name, in most
+  cases, and under certain circumstances, also at the end. The new syntax is
+  backwards compatible with the previous syntax; thus SET LINE, SET PORT, and
+  SET HOST commands in command files written for C-Kermit 6.0 or earlier still
+  work. The expanded syntax is:
+
+  { OPEN, SET } { LINE, PORT, HOST } [ switches ] device-or-address [ switches
+  ]
+
+  The first group of switches is:
+
+   /NETWORK-TYPE:{TCP/IP,X.25,PIPE,PTY...}
+          When more than one network type is available, this lets you
+          specify the type of network to use for this connection without
+          affecting your global SET NETWORK TYPE. See [382]Section 2.7
+          about pipes and ptys.
+
+   /USERID:[string]
+          This switch is equivalent to SET LOGIN USERID. If a string is
+          given, it sent to host during Telnet negotiations; if this
+          switch is given but the string is omitted, no user ID is sent
+          to the host. If this switch is not given, your current LOGIN
+          USERID (\v(userid) value), if any, is sent. Unlike most other
+          switches, this one is "sticky", since the value must persist
+          throughout the session in case the server requests the ID
+          string at a later time.
+
+   /CONNECT
+          Enter CONNECT mode immediately and automatically after the
+          device or connection is open. On serial devices, however, when
+          CARRIER-WATCH is not OFF, wait up to 1 second for the Carrier
+          Detect signal to appear before trying to connect, to give the
+          device time to react DTR, which might have been off prior to
+          opening the device.
+
+   /SERVER
+          Enter server mode immediately and automatically after the
+          device or connection is open. Treatment of carrier is the same
+          as for /CONNECT.
+
+   /WAIT
+   /NOWAIT
+          For Telnet connections only: Like SET TELNET WAIT { ON, OFF },
+          but applies only to this connection, and in fact applies only
+          when OPENing this connection (which is usually the only place
+          it matters). Typically you would use TELNET /NOWAIT to make a
+          connection to a misbehaving Telnet server that does not reply
+          to negotiations as required by the Telnet protocol definition.
+
+   Note: /CONNECT and /SERVER switches are not available in the RLOGIN
+   and TELNET commands, since these commands already include an implicit
+   /CONNECT and preclude automatic entry into server mode.
+
+   The /CONNECT and /SERVER switches are especially useful with "set host
+   *" connections. For example, suppose you want to start a Kermit server
+   on socket 3000 of your TCP host. Normally you would have to give the
+   command:
+
+  set host * 3000
+
+   and then wait for a connection to come in, and only then could you
+   give the SERVER command (or else define a macro to do this, and then
+   execute the macro). Now you can do it in one step:
+
+  set host /server * 3000
+
+   This tells C-Kermit to wait for the connection and then enter server
+   mode once it comes in, no matter how long it takes. Similarly, "set
+   host /conn *" can be used to wait for a "chat" connection to come in.
+
+   Another set of switches is available in VMS only, for use only with
+   SET LINE:
+
+   /SHARE
+          Allows the SET LINE device to be opened in shared mode.
+          Normally it makes no sense to open a serial device in shared
+          mode, but it's necessary when C-Kermit is running in an
+          environment such as DECIntact, that opens your job's
+          controlling terminal in such a way that C-Kermit can't open it
+          too, unless it enables SHARE privilege. Note: SHARE privilege
+          is required.
+
+   /NOSHARE
+          Requires that the SET LINE device not be in use by any other
+          process in order for it to be successfully opened by C-Kermit.
+          If neither /SHARE nor /NOSHARE is specified, /NOSHARE is used.
+
+   The second group of switches is:
+
+   /NO-TELNET-INIT
+          Do not send initial Telnet negotiations even if this is a
+          Telnet port.
+
+   /RAW-SOCKET
+          This is a connection to a raw TCP socket ([383]Section 2.3.5).
+
+   /RLOGIN
+          Use Rlogin protocol even if this is not an Rlogin port.
+
+   /TELNET
+          Send initial Telnet negotiations even if this is not a Telnet
+          port.
+
+   As of C-Kermit 7.0 and K95 1.1.19, the TELNET command includes an
+   implicit /TELNET switch. So if you TELNET to a non-TELNET port, Kermit
+   sends initial Telnet negotiations. This makes sense, since that's what
+   "telnet" means.
+
+   If you want to make a connection to a non-Telnet port without sending
+   initial Telnet negotiations, use:
+
+  set host [ /connect ] name-or-address port
+
+   or:
+
+  telnet name-or-address port /no-telnet-init
+
+   Additional switches might be added in the future; type "set host ?" or
+   "set line ?" to see a current list.
+     _________________________________________________________________
+
+  2.1. Dialing
+
+   Automatic redialing is illegal or restricted in many countries, so
+   until C-Kermit 7.0, it was disabled by default, i.e. until a SET DIAL
+   RETRIES command was given. In C-Kermit 7.0, if no SET DIAL RETRIES
+   command has been given, a default is picked dynamically at DIAL time
+   based on the calling country code, if known. At this writing, the only
+   country code known to have no restrictions on automatic redialing is
+   1. So in this case a limit of 10 is chosen; otherwise 1. If you have
+   not given an explicit SET DIAL RETRIES command, SHOW DIAL shows the
+   value as "(auto)", and then the value actually used is shown when you
+   give the DIAL command.
+
+   As of C-Kermit 7.0, automatic redialing is automatically canceled if
+   the call could not be placed because no dialtone was detected.
+     _________________________________________________________________
+
+    2.1.1. The Dial Result Message
+
+   If DIAL DISPLAY is not ON, the "Call complete" message now shows the
+   modem's call result message, for example:
+
+  Dialing: ...
+  Call complete: "CONNECT 31200/ARQ/V32/LAPM/V42BIS"
+
+   The exact format and contents of this message, of course, depends on
+   the make, model, and configuration of your modem, so use your modem
+   manual to interpret it. The call result message is also available in
+   C-Kermit's \v(dialresult) variable.
+
+  C-Kermit> echo \v(dialresult)
+  CONNECT 31200/ARQ/V32/LAPM/V42BIS
+  C-Kermit> echo Speed = \fword(\v(dialresult),2)
+  Speed = 31200
+  C-Kermit>
+
+   Suppose your modem reports the modulation speed as shown above and you
+   want to ensure your call is completed at (say) 24000 bps or more. You
+   can use a little macro to do the job:
+
+define HSDIAL {                ; High Speed DIAL
+    local \%s
+    if < \v(argc) 1 if not def \v(dialnumber) end 1 Usage: \%0 number
+    set dial retries 100
+    set dial interval 1
+    while true {
+        dial \%*
+        if fail end 1 DIAL failed.
+        asg \%s \fword(\v(dialresult),2)
+        if def \%s if numeric \%s if not < \%s 24000 break
+    }
+}
+
+   (See [384]Section 7.5 about the \%* variable.)
+     _________________________________________________________________
+
+    2.1.2. Long-Distance Dialing Changes
+
+   Due to the glut of cell phones, pagers, fax machines, ISPs, etc, area
+   codes and dialing rules are changing all the time. In the North
+   American Numbering Plan (NANP) countries (USA, Canada, etc), area
+   codes are split or overlayed with increasing frequency, and 10- and
+   11-digit dialing is gradually becoming the norm for local calls.
+   Changes are occurring In Europe, too, partly for these reasons and
+   partly because of some new EC rules.
+
+   In France, effective 18 October 1996, all calls, even local ones, must
+   be dialed with an area code. French area codes are presently 1-digit
+   numbers, 1-6, and the long-distance dialing prefix is 0. All calls
+   within France are considered long distance and begin with 01, 02, ...,
+   06.
+
+   Effective 1 May 1997, all calls within the US state of Maryland, even
+   local ones, must be dialed with an area code but without the
+   long-distance prefix -- this is the now widely-known North American
+   phenomenon of "ten digit dialing". The same is happening elsewhere --
+   many cities in Florida adopted 10-digit dialing in 1998.
+
+   In Italy beginning 19 June 1998, all calls to fixed (as opposed to
+   mobile) numbers must be prefixed by 0. When calling into Italy from
+   outside, the 0 must follow the country code (39). Calls to cell
+   phones, however, must be placed without the 0. Then on 29 December
+   2000, the 0 will become a 4 (for calling fixed numbers) and a prefix
+   of 3 must used for calling mobile phones. More info at:
+   http://www.telecomitalia.it/npnn/.
+
+   In Spain, effective 4 April 1998, with hard cutover on 18 July 1998,
+   all calls within the country must be dialed with 9 digits, and all
+   calls from outside Spain must also be dialed with 9 digits (after the
+   country code, 34). The new 9-digit numbers all begin with "9". More
+   info at: [385]http://www.telefonica.es/cambiodenumeracion/
+
+   Several new dialing features and commands have been added in version
+   6.1 and 7.0 to address these changes.
+
+   C-Kermit 6.0 and Kermit 95 1.1.11 and earlier handle the French
+   situation via a reasonable subterfuge (setting the local area code to
+   a nonexistent one), but did not handle "ten-digit dialing" well at
+   all; the recommended technique was to change the long-distance dialing
+   prefix to nothing, but this defeated Kermit's "list numbers for one
+   name" feature when the numbers were in different locations. For
+   example:
+
+  set dial ld-prefix
+  dial onlineservice
+
+   where "onlineservice" is a dialing directory entry name corresponding
+   to entries that are in (say) Maryland as well as other states, would
+   not correctly dial the numbers not in Maryland.
+
+   A new command lets you specify a list of area codes to be considered
+   local, except that the area code must be dialed:
+
+   SET DIAL LC-AREA-CODES [ areacode [ areacode [ areacode [ ... ] ] ] ]
+          The list may include up to 32 area codes. If a number is called
+          whose area code is in this list, it is dialed WITHOUT the
+          long-distance prefix, but WITH the area code.
+
+   So in Maryland, which (last time we looked) has two area codes, 410
+   and 301, the setup would be:
+
+  SET DIAL LC-AREA-CODES 410 301
+
+   Example:
+
+  SET DIAL LD-PREFIX 1
+  SET DIAL AREA-CODE 301
+  SET DIAL LC-AREA-CODES 410 301 <-- Area codes in 10-digit dialing region
+  DIAL +1 (301) 765-4321         <-- Dials 3017654321  (local with area code)
+  DIAL +1 (410) 765-4321         <-- Dials 4107654321  (local with area code)
+  DIAL +1 (212) 765-4321         <-- Dials 12127654321 (long distance)
+
+   The SET DIAL LC-AREA-CODES command does not replace the SET DIAL
+   AREA-CODE command. The latter specifies the area code you are dialing
+   from. If the called number is in the same area code, then the area
+   code is dialed if it is also in the LC-AREA-CODES list, and it is not
+   dialed otherwise. So if "301" had not appeared in the LC-AREA-CODES
+   list in the previous example:
+
+  SET DIAL LD-PREFIX 1
+  SET DIAL AREA-CODE 301
+  SET DIAL LC-AREA-CODES 410     <-- Area codes in 10-digit dialing region
+  DIAL +1 (301) 765-4321         <-- Dials 7654321     (local)
+  DIAL +1 (410) 765-4321         <-- Dials 4107654321  (local with area code)
+  DIAL +1 (212) 765-4321         <-- Dials 12127654321 (long distance)
+
+   The new Kermit versions also add a Local Call Prefix and Local Call
+   Suffix, in case you have any need for it. These are added to the
+   beginning and of local phone numbers (i.e. numbers that are not
+   long-distance or international). Examples:
+
+  SET DIAL LD-PREFIX 1
+  SET DIAL LC-PREFIX 9
+  SET DIAL LC-SUFFIX *
+  SET DIAL LC-AREA-CODES 410     <-- Area codes in 10-digit dialing region
+  SET DIAL AREA-CODE 301
+  DIAL +1 (301) 765-4321         <-- Dials 97654321*     (local)
+  DIAL +1 (410) 765-4321         <-- Dials 94107654321*  (local with area code)
+  DIAL +1 (212) 765-4321         <-- Dials 12127654321   (long distance)
+     _________________________________________________________________
+
+    2.1.3. Forcing Long-Distance Dialing
+
+   Suppose a number is in your country and area, but for some reason you
+   need to dial it long-distance anyway (as is always the case in
+   France). There have always been various ways to handle this:
+
+    1. Temporarily set your area code to a different (or nonexistent or
+       impossible) one (but this required knowledge of which area codes
+       were nonexistent or impossible in each country).
+    2. Dial the number literally instead of using the portable format,
+       but this defeats the purpose of the portable dialing directory.
+
+   Now there is also a new command that, very simply, can force
+   long-distance dialing:
+
+   SET DIAL FORCE-LONG-DISTANCE { ON, OFF }
+          If a call is placed to a portable phone number within the same
+          country code as the calling number, it is dialed with the
+          long-distance prefix and the area code if FORCE-LONG-DISTANCE
+          is ON. If OFF, the regular rules and procedures apply.
+
+   Example (France):
+
+  SET DIAL COUNTRY-CODE 33
+  SET DIAL AREA-CODE 6
+  SET DIAL FORCE-LONG-DISTANCE ON
+
+   (In fact, SET DIAL COUNTRY-CODE 33 automatically sets DIAL
+   FORCE-LONG-DISTANCE ON...)
+
+   Example (USA, for a certain type of reverse-charge calling in which
+   the called number must always be fully specified):
+
+  SET DIAL PREFIX 18002666328$     ; 1-800-COLLECT
+  SET DIAL COUNTRY-CODE 1
+  SET DIAL AREA-CODE 212
+  SET DIAL FORCE-LONG-DISTANCE ON
+
+   Example (Toronto, where calls to exchange 976 within area code 416
+   must be dialed as long distance, even when you are dialing from area
+   code 416):
+
+  SET DIAL COUNTRY-CODE 1
+  SET DIAL AREA-CODE 416
+  SET DIAL FORCE-LONG-DISTANCE ON
+  DIAL +1 (416) 976-xxxx
+
+   If dialing methods were consistent and sensible, of course it would be
+   possible to always dial every domestic call as if it were long
+   distance. But in many locations this doesn't work or if it does, it
+   costs extra. The following macro can be used for dialing any given
+   number with forced long-distance format:
+
+  define LDIAL {
+      local \%x
+      set dial force-long-distance on
+      dial \%*
+      asg \%x \v(success)
+      set dial force-long-distance off
+      end \%x
+  }
+
+   (See [386]Section 7.5 about the \%* variable.)
+     _________________________________________________________________
+
+    2.1.4. Exchange-Specific Dialing Decisions
+
+   This applies mainly to the North American Numbering Plan (NANP). Refer
+   to the section "Alternative notations" in [387]Using C-Kermit 2nd
+   Edition, pages 106-107, and the story about Toronto on page 110. Using
+   the new LC-AREA-CODES list, we can address the problem by treating the
+   exchange as part of the area code:
+
+  SET DIAL LD-PREFIX 1
+  SET DIAL AREA-CODE 416
+  SET DIAL LC-AREA-CODES 905276
+  DIAL +1 416 765 4321               <-- 7654321      (local)
+  DIAL +1 905 276 4321               <-- 9052764321   (local with area code)
+  DIAL +1 905 528 4321               <-- 19055284321  (long distance)
+
+   The same technique can be used in Massachusetts (story at top of page
+   111) and in any other place where dialing to some exchanges within a
+   particular area code is local, but to others in the same area code is
+   long distance.
+     _________________________________________________________________
+
+    2.1.5. Cautions about Cheapest-First Dialing
+
+   Kermit does not maintain a knowledge base of telephony information; it
+   only provides the tools to let you enter a phone number in a standard
+   format and dial it correctly from any location in most cases.
+
+   In particular, Kermit does not differentiate the charging method from
+   the dialing method. If a call that is DIALED as long-distance (e.g.
+   from 212 to 718 in country code 1) is not CHARGED as long distance, we
+   have no way of knowing that without keeping a matrix of charging
+   information for every area-code combination within every country, and
+   any such matrix would be obsolete five minutes after it was
+   constructed. Thus, "cheapest-first" sorting is only as reliable as our
+   assumption that the charging method follows the dialing method. A good
+   illustration would be certain online services that have toll-free
+   dialup numbers which they charge you a premium (in your online service
+   bill) for using.
+     _________________________________________________________________
+
+    2.1.6. Blind Dialing (Dialing with No Dialtone)
+
+   C-Kermit's init string for Hayes-like modems generally includes an X4
+   command to enable as many result codes as possible, so that Kermit can
+   react appropriately to different failure reasons. One of the result
+   codes that X4 enables is "NO DIALTONE". A perhaps not obvious side
+   effect of enabling this result code that the modem must hear dialtone
+   before it will dial.
+
+   It is becoming increasingly necessary to force a modem to dial even
+   though it does not hear a dialtone on the phone line; for example,
+   with PBXs that have strange dialtones, or with phone systems in
+   different countries, or with ISDN phones, etc. This is called "blind
+   dialing".
+
+   C-Kermit 7.0 has two new commands to cope with this situation:
+
+   SET DIAL IGNORE-DIALTONE { ON, OFF }
+          OFF (the default) means to tell the modem to wait for dialtone
+          before dialing. ON means to enable "blind dialing", i.e. tell
+          the modem NOT to wait for dialtone before dialing. Generally
+          this is accomplished by sending ATX3 to the modem just prior to
+          dialing. SET MODEM TYPE xxx and then SHOW MODEM displays
+          Kermit's built-in "ignore dialtone" command.
+
+   SET DIAL COMMAND IGNORE-DIALTONE text
+          This lets you change the built-in ignore-dialtone command (such
+          as ATX3) to whatever you choose, in case the built-in one does
+          not work, or another command works better.
+
+   Notes:
+    1. The ignore-dialtone command is not sent unless SET DIAL
+       IGNORE-DIALTONE is ON.
+    2. The ATX3 command generally disables not only NO DIALTONE, but also
+       BUSY. So this will prevent Kermit from detecting when the line is
+       busy. This is a property of the modem, not of Kermit.
+     _________________________________________________________________
+
+    2.1.7. Trimming the Dialing Dialog
+
+   The command:
+
+  SET MODEM COMMAND action [ command ]
+
+   is used to override Kermit's built-in modem commands for each action,
+   for each kind of modem in its internal database. If you include a
+   command, this is used instead of the built-in one. If you omit the
+   command, this restores the original built-in command.
+
+   If you want to omit the command altogether, so Kermit doesn't send the
+   command at all, or wait for a response, use:
+
+  SET MODEM COMMAND action {}
+
+   That is, specify a pair of empty braces as the command, for example:
+
+  SET MODEM COMMAND ERROR-CORRECTION ON {}
+     _________________________________________________________________
+
+    2.1.8. Controlling the Dialing Speed
+
+   The rate at which characters are sent to the modem during dialing is
+   normally controlled by the built-in modem database. You might want to
+   override this if Kermit seems to be dialing too slowly, or it is
+   sending characters to the modem faster than the modem handle them. A
+   new command was added for this in C-Kermit 7.0:
+
+   SET DIAL PACING number
+          Specifies the number of milliseconds (thousandths of seconds)
+          to pause between each character when sending commands to the
+          modem during DIAL or ANSWER command execution. 0 means no pause
+          at all, -1 (the default) or any other negative number means to
+          use the value from the database. Any number greater than 0 is
+          the number of milliseconds to pause.
+
+   HINT: You might also need to control the rate at which the modem
+   generates Touch Tones during dialing, for example when sending a
+   numeric page. There are two ways to do this. One way is to insert
+   pause characters into the dialing string. For modems that use the AT
+   command set, the pause character is comma (,) and causes a 2-second
+   pause. On most modems, you can use the S8 register to change the pause
+   interval caused by comma in the dialing string. The other way is to
+   set your modem's tone generation interval, if it has a command for
+   that. Most AT-command-set modems use S11 for this; the value is in
+   milliseconds. For example on USR modems:
+
+  ATS11=200
+
+   selects an interval of 200 milliseconds to separate each dialing tone.
+
+   Hint: To add S-Register settings or other commands to your dialing
+   procedure, use the new SET MODEM COMMAND PREDIAL-INIT command
+   ([388]Section 2.2.2).
+     _________________________________________________________________
+
+    2.1.9. Pretesting Phone Number Conversions
+
+   The LOOKUP command now accepts telephone numbers as well as
+   directory-entry names, for example:
+
+  LOOKUP +1 (212) 7654321
+
+   When given a phone number, LOOKUP prints the result of converting the
+   phone number for dialing under the current dialing rules. For example,
+   if my country code is 1 and my area code is 212, and I am dialing out
+   from a PBX whose outside-line prefix is "93,":
+
+  C-Kermit> lookup +1 (212) 7654321
+  +1 (212) 7654321 => 93,7654321
+  C-Kermit>
+
+   You can also use the \fdialconvert(phone-number) function
+   ([389]Section 2.1.11) to do this programmatically:
+
+  C-Kermit> echo "\fdialconvert(+1 (212) 7654321)"
+  "93,7654321"
+  C-Kermit>
+
+   So the new LOOKUP behaves as follows:
+
+   LOOKUP portable-format-phone-number
+          Displays how the number would actually be dialed Sets FAILURE
+          if there was a conversion error, otherwise SUCCESS.
+
+   LOOKUP literal-format-phone-number
+          Displays the same literal-format-phone-number Always sets
+          SUCCESS.
+
+   LOOKUP dialing-directory-name
+          Displays all matching entries and converts portable phone
+          numbers. Sets SUCCESS if at least one entry was found,
+          otherwise FAILURE.
+
+   LOOKUP =anything
+          Displays "=anything" and sets SUCCESS.
+
+   There is, at present, no programmatic way to fetch numbers from the
+   dialing directory. This will be considered for a future release.
+     _________________________________________________________________
+
+    2.1.10. Greater Control over Partial Dialing
+
+   The following rules now apply to partial dialing:
+
+     * Phone number transformations based on country and area code,
+       application of prefixes, etc, are performed only on the first
+       PDIAL.
+     * Each PDIAL argument is looked up in the dialing directory, so it
+       is possible have directory entries for pieces of phone numbers or
+       other information.
+     * Suffixes are not applied automatically, since there is no way for
+       C-Kermit to know in which PDIAL segment you want them to be
+       applied.
+
+   However, the suffix that *would* have been applied, based on the
+   dialing rules that were invoked when processing the first PDIAL
+   command, is stored in the variable:
+
+  \v(dialsuffix)
+
+   which you can include in any subsequent PDIAL or DIAL commands.
+
+   Example:
+
+  pdial {\m(my_long_distance_pager_number_part_1)}
+  pdial {\m(my_long_distance_pager_number_part_2)}
+  pdial {\v(dialsuffix)}
+  pdial {\m(my_long_distance_pager_number_part_3)}
+  pdial {@\m(numeric_pager_code)#}
+     _________________________________________________________________
+
+    2.1.11. New DIAL-related Variables and Functions
+
+   \fdialconvert(s)
+          s is a phone number in either literal or portable format (not a
+          dialing directory entry name). The function returns the dial
+          string that would actually be used by the DIAL command when
+          dialing from the current location, after processing country
+          code, area code, and other SET DIAL values, and should be the
+          same as the result of LOOKUP when given a telephone number.
+
+   \v(dialsuffix)
+          Contains the suffix, if any, that was applied in the most
+          recent DIAL command, or the suffix that would have been applied
+          in the most recent PDIAL command. Use this variable to send the
+          dial suffix at any desired point in a PDIAL sequence.
+
+   \v(dialtype)
+          A number indicating the type of call that was most recently
+          placed. Can be used after a normal DIAL command, or after the
+          first PDIAL command in a PDIAL sequence. Values are:
+
+  -2: Unknown because TAPI handled the phone number translation.
+  -1: Unknown because some kind of error occured.
+   0: Internal within PBX.
+   1: Toll-free.
+   2: Local within calling area.
+   3: Unknown (e.g. because a literal-format phone number was given).
+   4: Long distance within country.
+   5: International
+
+   \v(dialcount)
+          The current value of the DIAL retry counter, for use in a DIAL
+          macro ([390]Section 2.1.13).
+
+   \v(d$px)
+          PBX Exchange (see [391]Section 2.1.12).
+
+   Other dial-related variables, already documented in [392]Using
+   C-Kermit (or other sections of this document, e.g. [393]Section
+   2.1.1), include \v(dialnumber), \v(dialstatus), etc. A convenient way
+   to display all of them is:
+
+  show variable dial  ; hint: abbreviate "sho var dial"
+
+   This shows the values of all the variables whose names start with
+   "dial". Also "show variable d$" (to show the \v(d$...) variables).
+     _________________________________________________________________
+
+    2.1.12. Increased Flexibility of PBX Dialing
+
+   Refer to [394]Using C-Kermit, 2nd Edition, pages 107-108. Recall that
+   three commands are needed to configure C-Kermit for dialing from a
+   PBX:
+
+  SET DIAL PBX-EXCHANGE number
+  SET DIAL PBX-INSIDE-PREFIX number
+  SET DIAL PBX-OUTSIDE-PREFIX number
+
+   Unfortunately, this model does not accommodate PBXs that have more
+   than one exchange. For example our PBX at Columbia University (which
+   must handle more than 10,000 phones) has 853-xxxx and 854-xxxx
+   exchanges.
+
+   Beginning in C-Kermit 7.0, the SET DIAL PBX-EXCHANGE command accepts a
+   list of exchanges, e.g.:
+
+  SET DIAL PBX-EXCHANGE 853 854
+
+   (multiple exchanges are separated by spaces, not commas).
+
+   So now when dialing a portable-format number that has the same country
+   and area codes as those of your dialing location, C-Kermit compares
+   the exchange of the dialed number with each number in the PBX Exchange
+   list (rather than with a single PBX Exchange number, as it did
+   formerly) to determine whether this is an internal PBX number or an
+   external call. If it is an external call, then the PBX Outside Prefix
+   is applied, and then the normal dialing rules for local or
+   long-distance calls.
+
+   If it is an inside call, the exchange is replaced by the PBX Inside
+   Prefix. But if the PBX has more than one exchange, a single fixed PBX
+   Inside Prefix is probably not sufficient. For example, at Columbia
+   University, we must dial 3-xxxx for an internal call to 853-xxxx, but
+   4-xxxx for a call to 854-xxxx. That is, the inside prefix is the final
+   digit of the exchange we are dialing. For this reason, C-Kermit 7.0
+   provides a method to determine the inside prefix dynamically at
+   dialing time, consisting of a new variable and new syntax for the SET
+   DIAL PBX-INSIDE-PREFIX command:
+
+   \v(d$px)
+          This variable contains the exchange that was matched when a PBX
+          internal call was detected. For example, if the PBX exchange
+          list is "853 854" and a call is placed to +1 (212) 854-9999,
+          \v(d$px) is set to 854.
+
+   SET DIAL PBX-INSIDE-PREFIX \fxxx(...)
+          If the PBX Inside Prefix is defined to be a function, its
+          evaluation is deferred until dialing time. Normally, this would
+          be a string function having \v(d$px) as an operand. Of course,
+          you can still specify a constant string, as before.
+
+   So given the following setup:
+
+  SET DIAL COUNTRY-CODE 1
+  SET DIAL AREA-CODE 212
+  SET DIAL PBX-OUTSIDE-PREFIX 93,
+  SET DIAL PBX-EXCHANGE 853 854
+  SET DIAL PBX-INSIDE-PREFIX \fright(\v(d$px),1)
+
+   The following numbers give the results indicated:
+
+ Number                   Result
+  +1 (212) 854-9876        4-9876
+  +1 (212) 853-1234        3-1234
+  +1 (212) 765-4321        93,765-4321
+  +1 (333) 765-4321        93,1333765-4321
+
+   Furthermore, the K_PBX_XCH environment variable may now be set to a
+   list of exchanges to automatically initialize C-Kermit's PBX exchange
+   list, for example (in UNIX ksh or bash):
+
+  export K_PBX_XCH="853 854"
+
+   (Quotes required because of the space.) Of course, this variable can
+   also be set to a single exchange, as before:
+
+  export K_PBX_XCH=853
+     _________________________________________________________________
+
+    2.1.13. The DIAL macro - Last-Minute Phone Number Conversions
+
+   After a DIAL or LOOKUP command is given, a list of phone numbers is
+   assembled from the dialing directory (if any), with all
+   location-dependent conversion rules applied as described in Chapter 5
+   of [395]Using C-Kermit.
+
+   However, additional conversions might still be required at the last
+   minute based on local or ephemeral conditions. So that you can have
+   the final word on the exact format of the dial string, C-Kermit 7.0
+   lets you pass the converted string through a macro of your own design
+   for final processing before dialing. The relevant command is:
+
+   SET DIAL MACRO [ name ]
+          Specifies the name of a macro to be run on each phone number
+          after all built-in conversions have been applied, just before
+          the number is dialed. If no name is given, no macro is run. The
+          phone number, as it would have been dialed if there were no
+          dial macro, is passed to the macro.
+
+   The dial macro can do anything at all (except start a file transfer).
+   However, the normal use for the macro would be to modify the phone
+   number. For this reason the phone number is passed to the macro as
+   argument number 1 (\%1). To cause a modified number to be dialed, the
+   macro should terminate with a RETURN statement specifying a return
+   value. To leave the number alone, the macro should simply end.
+   Example:
+
+  define xxx return 10108889999$\%1
+  set dial macro xxx
+  dial xyzcorp
+
+   This defines a DIAL MACRO called xxx, which puts an access code on the
+   front of the number. Another example might be:
+
+  def xxx if equal "\v(modem)" "hayes-1200" return \freplace(\%1,$,{,,,,,})
+  set dial macro xxx
+  dial xyzcorp
+
+   which replaces any dollar-sign in the dial string by a series of five
+   commas, e.g. because this particular modem does not support the "wait
+   for bong" feature (remember that commas that are to be included
+   literally in function arguments must be enclosed in braces to
+   distinguish them from the commas that separate the arguments) and when
+   the IF condition is not satisfied, the macro does not return a value,
+   and so the number is not modified. Then when a DIAL command is given
+   referencing a dialing directory entry, "xyzcorp". The macro is
+   automatically applied to each matching number.
+
+   Numerous dial-, modem-, communications-, and time-related variables
+   are available for decision making your dial macro. Type SHOW VARIABLES
+   for a list. Of particular interest is the \v(dialcount) variable,
+   which tells how many times the DIAL command gone through its retry
+   loop: 1 on the first try, 2 on the second, 3 on the third, and so on,
+   and the \v(dialresult) and \v(dialstatus) variables.
+
+   Here are some other applications for the DIAL MACRO (from users):
+
+     * Phone numbers in the dialing directory are formatted with '-' for
+       readability, but some modems don't like the hyphens, so the DIAL
+       macro is used to remove them before dialing; e.g
+       0090-123-456-78-99 becomes 00901234567899: "def xxx return
+       \freplace(\%1,-)".
+     * To set some specific modem (or other) options depending on the
+       called customer or telephone number.
+     * Choosing the most appropriate provider based on (e.g.) time of
+       day, or cycling through a list of providers in case some providers
+       might be busy.
+
+   To illustrate the final item, suppose you have a choice among many
+   phone service providers; the provider is chosen by dialing an access
+   code before the number. Different providers might be better (e.g.
+   cheaper) for certain times of day or days of the week, or for dialing
+   certain locations; you can use the DIAL macro to add the access for
+   the most desirable provider.
+
+   Similarly, when the same number might be reached through multiple
+   providers, it's possible that one provider might not be able to
+   complete the call, but another one can. In that case, you can use the
+   DIAL macro to switch providers each time through the DIAL loop --
+   that's where the \v(dialcount) variable comes in handy.
+
+   The following command can be used to debug the DIAL macro:
+
+   SET DIAL TEST { ON, OFF }
+          Normally OFF, so the DIAL command actually dials. When ON, the
+          DIAL command performs all lookups and number conversions, and
+          then goes through the number list and retry loop, but instead
+          of actually dialing, lists the numbers it would have called if
+          none of the DIAL attempts succeeded (or more precisely, every
+          number was always busy).
+     _________________________________________________________________
+
+    2.1.14. Automatic Tone/Pulse Dialing Selection
+
+   SET DIAL METHOD { AUTO, DEFAULT, PULSE, TONE }
+          Chooses the dialing method for subsequent calls.
+
+   Prior to version 7.0, C-Kermit's DIAL METHOD was DEFAULT by default,
+   meaning it does not specify a dialing method to the modem, but relies
+   on the modem to have an appropriate default dialing method set. So,
+   for example, when using Hayes compatible modems, the dial string would
+   be something like ATD7654321, rather than ATDT7654321 or ATDP7654321.
+
+   In C-Kermit 7.0 and K95 1.1.19, the dial method can be set from the
+   environment variable:
+
+  K_DIAL_METHOD
+
+   when Kermit starts. The values can be TONE, PULSE, or DEFAULT, e.g.
+   (UNIX):
+
+  set K_DIAL_METHOD=TONE; export K_DIAL_METHOD
+
+   In the absence of a K_DIAL_METHOD definition, the new default SET DIAL
+   METHOD is AUTO rather than DEFAULT. When DIAL METHOD is AUTO and the
+   local country code is known, then if tone dialing is universally
+   available in the corresponding area, tone dialing is used; if dialing
+   from a location where pulse dialing is mandatory, pulse dialing is
+   used.
+
+   The "tone country" and "pulse country" lists are preloaded according
+   to our knowledge at the time of release. You can see their contents in
+   the SHOW DIAL listing. You can change the lists with:
+
+   SET DIAL TONE-COUNTRIES [ cc [ cc [ ... ] ] ]
+          Replaces the current TONE-COUNTRIES list with the one given.
+          Each cc is a country code; separate them with spaces (not
+          commas). Example:
+
+  set dial tone-countries 1 358 44 46 49
+
+          If no country codes are given, the current list, if any, is
+          removed, in which case SET DIAL METHOD AUTO is equivalent to
+          SET DIAL METHOD DEFAULT.
+
+   SET DIAL PULSE-COUNTRIES [ cc [ cc [ ... ] ] ]
+          Replaces the current PULSE-COUNTRIES list with the one give.
+          Syntax and operation is like SET DIAL TONE-COUNTRIES.
+
+   If the same country code appears in both lists, Pulse takes
+   precedence.
+
+   The SET DIAL TONE- and PULSE-COUNTRIES commands perform no
+   verification whatsoever on the cc's, since almost any syntax might be
+   legal in some settings. Furthermore, there is no facility to edit the
+   lists; you can only replace the whole list. However, since the only
+   purpose of these lists is to establish a basis for picking tone or
+   pulse dialing automatically, all you need to override the effect of
+   the list is to set a specific dialing method with SET DIAL METHOD TONE
+   or SET DIAL METHOD PULSE.
+     _________________________________________________________________
+
+    2.1.15. Dial-Modifier Variables
+
+   As of C-Kermit 7.0, dial modifiers are available in the following
+   variables:
+
+ \v(dm_lp) Long pause
+ \v(dm_sp) Short pause
+ \v(dm_pd) Pulse dial
+ \v(dm_td) Tone dial
+ \v(dm_wa) Wait for answer
+ \v(dm_wd) Wait for dialtone
+ \v(dm_rc) Return to command mode
+
+   You can use these in your dial strings in place of hardwired modifiers
+   like "@", ",", etc, for increased portability of scripts. Example:
+
+  C-Kermit>set modem type usrobotics
+  C-Kermit>sho variables dm
+   \v(dm_lp) = ,
+   \v(dm_sp) = /
+   \v(dm_pd) = P
+   \v(dm_td) = T
+   \v(dm_wa) = @
+   \v(dm_wd) = W
+   \v(dm_rc) = ;
+  C-Kermit>exit
+     _________________________________________________________________
+
+    2.1.16. Giving Multiple Numbers to the DIAL Command
+
+   Prior to C-Kermit 7.0, the only way to give a DIAL command a list of
+   phone numbers to try until one answers was to create a dialing
+   directory that had multiple entries under the same name, and then use
+   that entry name in the DIAL command. Now a list of numbers can be
+   given to the DIAL command directly in the following format:
+
+  dial {{number1}{number2}{number3}...}
+
+   This is the same list format used by SEND /EXCEPT: and other commands
+   that allow a list where normally a single item is given. Restrictions
+   on this form of the DIAL command are:
+
+     * The first two braces must be adjacent; spacing is optional
+       thereafter.
+     * Each number must be an actual number to dial, not a dialing
+       directory entry.
+     * Dialing directory entries may not contain number lists in this
+       format.
+
+   In all other respects, the numbers are treated as if they had been
+   fetched from the dialing directory; they can be in literal or portable
+   format, etc. Example:
+
+  dial {{7654321} {+1 (212) 5551212} { 1-212-5556789 }}
+
+   The list can be any length at all, within reason.
+
+   This feature is especially handy for use with the K95 Dialer, allowing
+   a list of phone numbers to be specified in the Telephone Number box
+   without having to set up or reference a separate dialing directory.
+
+   You can also use it to add commonly-dialed sequences as variables in
+   your C-Kermit customization file, e.g.:
+
+  define work {{7654321}{7654322}{7654323}}
+
+   and then:
+
+  dial {\m(work)}
+
+   (the variable name must be enclosed in braces).
+
+   Or more simply:
+
+  define work dial {{7654321}{7654322}{7654323}}
+
+   and then:
+
+  work
+     _________________________________________________________________
+
+  2.2. Modems
+
+    2.2.1. New Modem Types
+
+   Since C-Kermit 6.0:
+
+  atlas-newcom-33600ifxC Atlas/Newcom 33600
+  att-keepintouch        AT&T KeepinTouch PCMCIA V.32bis Card Modem
+  att-1900-stu-iii       AT&T Secure Data STU-III Model 1900
+  att-1910-stu-iii       AT&T Secure Data STU-III Model 1910
+  bestdata               Best Data
+  cardinal               Cardinal V.34 MVP288X series.
+  compaq                 Compaq Data+Fax (e.g. in Presario)
+  fujitsu                Fujitsu Fax/Modem Adapter
+  generic-high-speed     Any modern error-correcting data-compressing modem
+  itu-t-v25ter/v250      ITU-T (CCITT) V.25ter (V.250) standard command set
+  megahertz-att-v34      Megahertz AT&T V.34
+  megahertz-xjack        Megahertz X-Jack
+  motorola-codex         Motorola Codex 326X Series
+  motorola-montana       Motorola Montana
+  mt5634zpx              Multitech MT5634ZPX
+  rockwell-v90           Rockwell V.90 56K
+  rolm-244pc             Siemens/Rolm 244PC (AT command set)
+  rolm-600-series        Siemens/Rolm 600 Series (AT command set)
+  spirit-ii              QuickComm Spirit II
+  suprasonic             SupraSonic V288+
+  supra-express-v90      Supra Express V.90
+
+   One of the new types, "generic-high-speed" needs a bit of explanation.
+   This type was added to easily handle other types that are not
+   explicitly covered, without going through the bother of adding a
+   complete user-defined modem type. This one works for modern modems
+   that use the AT command set, on the assumption that all the default
+   ("factory") settings of the modem (a) are appropriate for Kermit, (b)
+   include error correction, data compression, and speed buffering; and
+   (c) are recallable with the command AT&F.
+
+   If the command to recall your modem's profile is not AT&F, use the SET
+   MODEM COMMAND INIT-STRING command to specify the appropriate modem
+   command. The default init-string is AT&F\13 (that is, AT, ampersand,
+   F, and then carriage return); a survey of about 20 modern modem types
+   shows they all support this, but they might mean different things by
+   it. For example, the USR Sportster or Courier needs AT&F1 (not AT&F,
+   which is equivalent to AT&F0, which recalls an inappropriate profile),
+   so for USR modems:
+
+  set modem type generic-high-speed
+  set modem command init AT&F1\13
+
+   Of course, USR modems already have their own built-in modem type. But
+   if you use this one instead, it will dial faster because it has fewer
+   commands to give to the modem; in that sense "&F1" is like a macro
+   that bundles numerous commands into a single one. See your modem
+   manual for details about factory profiles and commands to recall them.
+
+   WARNING: Do not use the generic-high-speed modem type in operating
+   systems like VMS where hardware flow control is not available, at
+   least not unless you change the init string from AT&F\13 to something
+   else that enables local Xon/Xoff or other appropriate type of flow
+   control.
+
+   Also see [396]Section 2.1.7 for additional hints about making dialing
+   go faster.
+     _________________________________________________________________
+
+    2.2.2. New Modem Controls
+
+   SET MODEM CAPABILITIES list
+          In C-Kermit 7.0, this command automatically turns MODEM
+          SPEED-MATCHING OFF if SB (Speed Buffering) is in the list, and
+          turns it ON if SB is absent.
+
+   SET MODEM COMMAND PREDIAL-INIT [ text ]
+          Commands to be sent to the modem just prior to dialing.
+          Normally none.
+
+   SET MODEM SPEAKER { ON, OFF }
+          Determines whether modem speaker is on or off while call is
+          being placed. ON by default. Note: This command does not
+          provide fine-grained control over when the speaker is on or
+          off. Normally, ON means while the call is being placed, until
+          the point at which carrier is successfully established. If your
+          modem has a different speaker option that you want to choose,
+          then use the SET MODEM COMMAND SPEAKER ON text command to
+          specify this option.
+
+   SET MODEM COMMAND SPEAKER { ON, OFF } [ text ]
+          Specify or override the commands to turn your modem's speaker
+          on and off.
+
+   SET MODEM VOLUME { LOW, MEDIUM, HIGH }
+          When MODEM SPEAKER is on, select volume. Note: In some modems,
+          especially internal ones, these commands have no effect; this
+          is a limitation of the particular modem, not of Kermit.
+
+   SET MODEM COMMAND VOLUME { LOW, MEDIUM, HIGH } [ text ]
+          Specify or override the commands to set your modem's speaker
+          volume.
+
+   SET MODEM COMMAND IGNORE-DIALTONE [ text ]
+          The command to enable blind dialing ([397]Section 2.1.6).
+
+   SET MODEM ESCAPE-CHARACTER code
+          Has been augmented to allow codes of 0 or less: < 0 means the
+          escape mechanism is disabled. = 0 means to use (restore) the
+          default value from the modem database. > 0 and < 128 is a
+          literal value to be used instead of the default one. > 127
+          means the escape mechanism is disabled. This affects "modem
+          hangup". When the escape mechanism is disabled, but SET MODEM
+          HANGUP-METHOD is MODEM-COMMAND, it sends the hangup command
+          immediately, without the <pause>+++<pause> business first. This
+          is useful (for example) when sending lots of numeric pages, a
+          process in which never we go online, and so never need to
+          escape back. Eliminating the unnecessary pauses and escape
+          sequence allows a lot more pages to be sent per unit time.
+
+   Recall that C-Kermit can dial modems to which it is connected via
+   TCP/IP (Telnet or Rlogin) as described on page 126 of [398]Using
+   C-Kermit, 2nd Ed. In this case the MODEM HANGUP-METHOD should be
+   MODEM-COMMAND, since RS-232 signals don't work over TCP/IP
+   connections. As noted in the manual, such connections are set up by
+   the following sequence:
+
+  set host host [ port ]
+  set modem type name
+  dial number
+
+   But this can cause complications when you use Kermit to switch between
+   serial and TCP/IP connections. In the following sequence:
+
+  set host name
+  set modem type name
+  set port name
+
+   the first two commands obey the rules for dialing out over Telnet.
+   However, the SET PORT command requires that Kermit close its current
+   (Telnet) connection before it can open the serial port (since Kermit
+   can only have one connection open at a time). But since a modem type
+   was set after the "set host" command was given, Kermit assumes it is a
+   Telnet dialout connection and so sends the modem's hangup sequence is
+   sent to the Telnet host. To avoid this, close the network connection
+   explicitly before opening the serial one:
+
+  set host name
+  close
+  set modem type name
+  set port name
+     _________________________________________________________________
+
+  2.3. TELNET and RLOGIN
+
+   For additional background, please also read the [399]TELNET.TXT file,
+   also available on the Web in [400]HTML format.
+
+   Cautions:
+
+     * If making a Telnet connection with C-Kermit takes a very long
+       time, like over a minute, whereas the system Telnet program makes
+       the same connection immediately, try including the /NOWAIT switch:
+  C-Kermit> telnet /nowait hostname
+       See [401]TELNET.TXT or [402]TELNET.HTM for details. If it also
+       takes a very long time to make a Telnet connection with system
+       Telnet, then the delay is most likely caused by reverse DNS
+       lookups when your host is not properly registered in DNS.
+     * When supplying numeric IP addresses to C-Kermit or to any other
+       application (regular Telnet, Rlogin, etc), do not include leading
+       0's in any fields unless you intend for those fields to be
+       interpreted as octal (or hex) numbers. The description of the
+       Internet address interpreter (the sockets library inet_addr()
+       routine) includes these words:
+
+     All numbers supplied as "parts" in a "." notation may be decimal,
+     octal, or hexadecimal, as specified in the C language (that is, a
+     leading 0x or 0X implies hexadecimal; otherwise, a leading 0
+     implies octal; otherwise, the number is interpreted as decimal).
+       To illustrate, 128.59.39.2 and 128.059.039.002 are not the same
+       host! Even though most of the fields contain non-octal digits.
+       Using system Telnet (not Kermit):
+  $ telnet 128.059.039.002
+  Trying 128.49.33.2 ...
+       Of course the same thing happens with Kermit because it uses (as
+       it must) the same system service for resolving network addresses
+       that Telnet, FTP, and all other TCP/IP applications use.
+     * The RLOGIN section on page 123 does not make it clear that you can
+       use the SET TELNET TERMINAL-TYPE command to govern the terminal
+       type that is reported by C-Kermit to the RLOGIN server.
+     * Note that the SET TCP commands described on pages 122-123 might be
+       absent; some platforms that support TCP/IP do not support these
+       particular controls.
+
+   New commands:
+
+   TELOPT { AO, AYT, BREAK, CANCEL, EC, EL, EOF, EOR, GA, IP, DMARK,
+          DO, DONT, NOP, SB, SE, SUSP, WILL, WONT }
+          This command was available previously, but supported only DO,
+          DONT, WILL, and WONT. Now it lets you send all the Telnet
+          protocol commands. Note that certain commands do not require a
+          response, and therefore can be used as nondestructive "probes"
+          to see if the Telnet session is still open; e.g.:
+
+  set host xyzcorp.com
+  ...
+  telopt nop
+  if fail stop 1 Connection lost
+
+   SET TCP ADDRESS [ ip-address ]
+          Specifies the IP address of the computer that C-Kermit is
+          running on. Normally this is not necessary. The exception would
+          be if your machine has multiple network adapters (physical or
+          virtual) with a different address for each adapter AND you want
+          C-Kermit to use a specific address when making outgoing
+          connections or accepting incoming connections.
+
+   SET TCP DNS-SERVICE-RECORDS { ON, OFF }
+          Tells C-Kermit whether to try to use DNS SRV records to
+          determine the host and port number upon which to find an
+          advertised service. For example, if a host wants regular Telnet
+          connections redirected to some port other than 23, this feature
+          allows C-Kermit to ask the host which port it should use. Since
+          not all domain servers are set up to answer such requests, this
+          feature is OFF by default.
+
+   SET TCP REVERSE-DNS-LOOKUP { ON, OFF, AUTO }
+          Tells Kermit whether to perform a reverse DNS lookup on TCP/IP
+          connections. This allows Kermit to determine the actual
+          hostname of the host it is connected to, which is useful for
+          connections to host pools, and is required for Kerberos
+          connections to host pools and for incoming connections. If the
+          other host does not have a DNS entry, the reverse lookup could
+          take a long time (minutes) to fail, but the connection will
+          still be made. Turn this option OFF for speedier connections if
+          you do not need to know exactly which host you are connected to
+          and you are not using Kerberos. AUTO, the default, means the
+          lookup is done on hostnames, but not on numeric IP addresses.
+
+   SET TELNET WAIT-FOR-NEGOTIATIONS { ON, OFF }
+          Each Telnet option must be fully negotiated either On or Off
+          before the session can continue. This is especially true with
+          options that require sub-negotiations such as Authentication,
+          Encryption, and Kermit; for proper support of these options
+          Kermit must wait for the negotiations to complete. Of course,
+          Kermit has no way of knowing whether a reply is delayed or not
+          coming at all, and so will wait a minute or more for required
+          replies before continuing the session. If you know that
+          Kermit's Telnet partner will not be sending the required
+          replies, you can set this option of OFF to avoid the long
+          timeouts. Or you can instruct Kermit to REFUSE specific options
+          with the SET TELOPT command.
+
+   SET TELOPT [ { /CLIENT, /SERVER } ] option
+          { ACCEPTED, REFUSED, REQUESTED, REQUIRED }
+          [ { ACCEPTED, REFUSED, REQUESTED, REQUIRED } ]
+          SET TELOPT lets you specify policy requirements for Kermit's
+          handling of Telnet option negotiations. Setting an option is
+          REQUIRED causes Kermit to offer the option to the peer and
+          disconnect if the option is refused. REQUESTED causes Kermit to
+          offer an option to the peer. ACCEPTED results in no offer but
+          Kermit will attempt to negotiate the option if it is requested.
+          REFUSED instructs Kermit to refuse the option if it is
+          requested by the peer.
+
+          Some options are negotiated in two directions and accept
+          separate policies for each direction; the first keyword applies
+          to Kermit itself, the second applies to Kermit's Telnet
+          partner; if the second keyword is omitted, an appropriate
+          (option-specific) default is applied. You can also include a
+          /CLIENT or /SERVER switch to indicate whether the given
+          policies apply when Kermit is the Telnet client or the Telnet
+          server; if no switch is given, the command applies to the
+          client.
+
+          Note that some of Kermit's Telnet partners fail to refuse
+          options that they do not recognize and instead do not respond
+          at all. In this case it is possible to use SET TELOPT to
+          instruct Kermit to REFUSE the option before connecting to the
+          problem host, thus skipping the problematic negotiation.
+
+          Use SHOW TELOPT to view current Telnet Option negotiation
+          settings. SHOW TELNET displays current Telnet settings.
+     _________________________________________________________________
+
+    2.3.0. Bug Fixes
+
+   If "set host nonexistent-host" was given (and it properly failed),
+   followed by certain commands like SEND, the original line and modem
+   type were not restored and C-Kermit thought that it still had a
+   network hostname; fixed in 7.0.
+
+    2.3.1. Telnet Binary Mode Bug Adjustments
+
+   SET TELNET BUG BINARY-ME-MEANS-U-TOO { ON, OFF } was added to edit 192
+   after the book was printed. Also SET TELNET BUG BINARY-U-MEANS-ME-TOO.
+   The default for both is OFF. ON should be used when communicating with
+   a Telnet partner (client or server) that mistakenly believes that
+   telling C-Kermit to enter Telnet binary mode also means that it, too,
+   is in binary mode, contrary to the Telnet specification, which says
+   that binary mode must be negotiated in each direction separately.
+
+    2.3.2. VMS UCX Telnet Port Bug Adjustment
+
+   A new command, SET TCP UCX-PORT-BUG, was added for VMS versions with
+   UCX (DEC TCP/IP), applying only to early versions of UCX, like 2.2 or
+   earlier. If you try to use VMS C-Kermit to make a Telnet connection
+   using a port name (like "telnet", which is used by default), the
+   underlying UCX getservbyname() function might return the service
+   number with its bytes swapped and the connection will fail. If "telnet
+   hostname 23" works, then your version of UCX has this bug and you can
+   put "set tcp ucx-port-bug on" in your CKERMIT.INI file to get around
+   it.
+
+    2.3.3. Telnet New Environment Option
+
+   The TELNET NEW-ENVIRONMENT option ([403]RFC 1572) is supported as 7.0.
+   This option allows the C-Kermit Telnet client to send certain
+   well-known variables to the Telnet server, including USER, PRINTER,
+   DISPLAY, and several others. This feature is enabled by default in
+   Windows and OS/2, disabled by default elsewhere. The command to enable
+   and disable it is:
+
+  SET TELNET ENVIRONMENT { ON, OFF }
+
+   When ON, and you Telnet to another computer, you might (or might not)
+   notice that the "login:" or "Username:" prompt does not appear --
+   that's because your username was sent ahead, in which case the remote
+   system might prompt you only for your password (similar to Rlogin).
+   Use "set telnet environment off" to defeat this feature, particularly
+   in scripts where the dialog must be predictable. You can also use this
+   command to specify or override specific well-known environment
+   variable values:
+
+ SET TELNET ENVIRONMENT { ACCT,DISPLAY,JOB,PRINTER,SYSTEMTYPE,USER } [ text ]
+
+    2.3.4. Telnet Location Option
+
+   The TELNET LOCATION option ([404]RFC 779) is supported in 7.0. This
+   option allows the C-Kermit Telnet client to send a location string to
+   the server if the server indicates its willingness to accept one. If
+   an environment variable named LOCATION exists at the time C-Kermit
+   starts, its value is used as the location string. If you want to
+   change it, use:
+
+  SET TELNET LOCATION text
+
+   If you omit the text from this command, the Telnet location feature is
+   disabled.
+
+   SET TELNET ENVIRONMENT DISPLAY is used to set the DISPLAY variable
+   that is sent to the host, as well as the the XDISPLAY location.
+
+    2.3.5. Connecting to Raw TCP Sockets
+
+   The SET HOST and TELNET commands now accept an optional switch,
+   /RAW-SOCKET, at the end, only if you first give a host and a port.
+   Example:
+
+  set host xyzcorp.com 23 /raw-socket
+  set host 128.49.39.2:2000 /raw-socket
+  telnet xyzcorp.com 3000 /raw
+
+   Without this switch, C-Kermit behaves as a Telnet client when (a) the
+   port is 23 or 1649, or (b) the port is not 513 and the server sent
+   what appeared to be Telnet negotiations -- that is, messages starting
+   with 0xFF (IAC). With this switch, Kermit should treat all incoming
+   bytes as raw data, and will not engage in any Telnet negotiations or
+   NVT CRLF manipulations. This allows transparent operation through
+   (e.g.) raw TCP ports on Cisco terminal servers, through the 'modemd'
+   modem server, etc.
+
+    2.3.6. Incoming TCP Connections
+
+   Accomplished via SET HOST * port, were introduced in C-Kermit 6.0, but
+   for UNIX only. In Version 7.0, they are also available for VMS.
+     _________________________________________________________________
+
+  2.4. The EIGHTBIT Command
+
+   EIGHTBIT is simply a shorthand for: SET PARITY NONE, SET TERMINAL
+   BYTESIZE 8, SET COMMAND BYTESIZE 8; that is, a way to set up an 8-bit
+   clean connection in a single command.
+     _________________________________________________________________
+
+  2.5. The Services Directory
+
+   Chapter 7 of [405]Using C-Kermit does not mention the ULOGIN macro,
+   which is used by our sample services directory, CKERMIT.KND. Unlike
+   UNIXLOGIN, VMSLOGIN, etc, this one is for use with systems that
+   require a user ID but no password. Therefore it doesn't prompt for a
+   password or wait for a password prompt from the remote service.
+
+   In version 7.0, the CALL macro was changed to not execute a SET MODEM
+   TYPE command if the given modem type was the same as the current one;
+   otherwise the new SET MODEM TYPE command would overwrite any
+   customizations that the user had made to the modem settings. Ditto for
+   SET LINE / SET PORT and SET SPEED.
+     _________________________________________________________________
+
+  2.6. Closing Connections
+
+   Until version 7.0, there was never an obvious and general way to close
+   a connection. If a serial connection was open, it could be closed by
+   "set line" or "set port" (giving no device name); if a network
+   connection was open, it could be closed by "set host" (no host name).
+
+   In version 7.0, a new command closes the connection in an obvious and
+   straightforward way, no matter what the connection type:
+
+  CLOSE [ CONNECTION ]
+
+   The CLOSE command was already present, and required an operand such as
+   DEBUG-LOG, WRITE-FILE, etc, and so could never be given by itself. The
+   new CONNECTION operand is now the default operand for CLOSE, so CLOSE
+   by itself closes the connection, if one is open, just as you would
+   expect, especially if you are a Telnet or Ftp user.
+
+   Also see the description of the new SET CLOSE-ON-DISCONNECT command in
+   [406]Section 2.10.
+     _________________________________________________________________
+
+  2.7. Using C-Kermit with External Communication Programs
+
+   C-Kermit 7.0 includes a new ability to create and conduct sessions
+   through other communications programs. Two methods are available:
+
+    1. Pty (pseudoterminal): The external program is run on a
+       "pseudoterminal", which is controlled by Kermit. This method works
+       with practically any external program, but it is not portable. At
+       this writing, it works only on some (not all) UNIX versions, and
+       not on any non-UNIX platforms.
+    2. Pipe: The external program's standard input and output are
+       redirected through a "pipe" controlled by Kermit. This method is
+       relatively portable -- it should work across all UNIX versions,
+       and it also works in Windows and OS/2 -- but it is effective only
+       when the external program actually uses standard i/o (and many
+       don't).
+
+   The two methods are started differently but are used the same way
+   thereafter.
+
+   The purpose of this feature is to let you use C-Kermit services like
+   file transfer, character-set translation, scripting, automatic
+   dialing, etc, on connections that Kermit can't otherwise make itself.
+
+   This feature is the opposite of the REDIRECT feature, in which
+   C-Kermit makes the connection, and redirects an external (local)
+   command or program over this connection. In a pty or pipe connection,
+   C-Kermit runs and controls a local command or program, which makes the
+   connection. (The same method can be used to simply to control a local
+   program without making a connection; see [407]Section 2.8.)
+
+   To find out if your version of Kermit includes PTY support, type "show
+   features" and look for NETPTY in the alphabetical list of options. For
+   pipes, look for NETCMD.
+
+   The commands are:
+
+   SET NETWORK TYPE PTY or SET NETWORK TYPE PIPE
+   SET HOST command
+          where command is any interactive command. If the command does
+          not use standard i/o, you must use SET NETWORK TYPE PTY.
+
+   Notes:
+
+     * COMMAND is an invisible synonym for PIPE.
+     * The command and its arguments are case-sensitive in UNIX.
+
+   The SET NETWORK TYPE, SET HOST sequence sets the given network type
+   for all subsequent SET HOST commands until another SET NETWORK TYPE
+   command is given to change it.
+
+   You can also use the new /NETWORK-TYPE:PTY or /NETWORK-TYPE:PIPE (or
+   simply /PIPE or /PTY) switches on the SET HOST command itself:
+
+  SET HOST /NETWORK-TYPE:PIPE command  ; These two are the same
+  SET HOST /PIPE command
+
+  SET HOST /NETWORK-TYPE:PTY command   ; Ditto
+  SET HOST /PTY command
+
+   These are like SET NETWORK TYPE followed by SET HOST, except they
+   apply only to the connection being made and do not change the global
+   network type setting (see [408]Section 1.5 about the difference
+   between switches and SET commands).
+
+   Include any command-line options with the command that might be
+   needed, as in this example where C-Kermit uses another copy of itself
+   as the communications program:
+
+  SET HOST /PIPE /CONNECT kermit -YQJ xyzcorp.com
+
+   As usual, if you include the /CONNECT switch, SET HOST enters CONNECT
+   mode immediately upon successful execution of the given command.
+   Therefore new commands are available as a shorthand for SET HOST
+   /CONNECT /PTY and /PIPE:
+
+   PTY [ command ]
+   PIPE [ command ]
+          The PTY and PIPE commands work like the TELNET and RLOGIN
+          commands: they set up the connection (in this case, using the
+          given command) and then enter CONNECT mode automatically (if
+          the PIPE or PTY command is given without a command, it
+          continues the current session if one is active; otherwise it
+          gives an error message).
+
+   The PIPE command is named after the mechanism by which C-Kermit
+   communicates with the command: UNIX pipes. C-Kermit's i/o is "piped"
+   through the given command. Here is a typical example:
+
+  PIPE rlogin -8 xyzcorp.com
+
+   This is equivalent to:
+
+  SET HOST /PIPE rlogin -8 xyzcorp.com
+  CONNECT
+
+   and to:
+
+  SET HOST /PIPE /CONNECT rlogin -8 xyzcorp.com
+
+   IMPORTANT:
+          If you are writing a script, do not use the PIPE, PTY, TELNET,
+          or RLOGIN command unless you really want C-Kermit to enter
+          CONNECT mode at that point. Normally SET HOST is used in
+          scripts to allow the login and other dialogs to be controlled
+          by the script itself, rather than by an actively participating
+          human at the keyboard.
+
+   Throughput of pty and pipe connections is limited by the performance
+   of the chosen command or program and by the interprocess communication
+   (IPC) method used and/or buffering capacity of the pipe or pty, which
+   in turn depends on the underlying operating system.
+
+   In one trial (on SunOS 4.1.3), we observed file transfer rates over an
+   rlogin connection proceeding at 200Kcps for downloads, but only 10Kcps
+   for uploads on the same connection with the same settings (similar
+   disparities were noted in HP-UX). Examination of the logs revealed
+   that a write to the pipe could take as long as 5 seconds, whereas
+   reads were practically instantaneous. On the other hand, using Telnet
+   as the external program rather than rlogin, downloads and uploads were
+   better matched at about 177K each.
+
+   Most external communication programs, like C-Kermit itself, have
+   escape characters or sequences. Normally these begin with (or consist
+   entirely of) a control character. You must be sure that this control
+   character is not "unprefixed" when uploading files, otherwise the
+   external program will "escape back" to its prompt, or close the
+   connection, or take some other unwanted action. When in CONNECT mode,
+   observe the program's normal interaction rules. Of course C-Kermit's
+   own escape character (normally Ctrl-\) is active too, unless you have
+   taken some action to disable it.
+
+   On PTY connections, the underlying PTY driver is not guaranteed to be
+   transparent to control characters -- for example, it might expand
+   tabs, translate carriage returns, generate signals if it sees an
+   interrupt character, and so on. Similar things might happen on a PIPE
+   connection. For this reason, if you plan to transfer files over a PTY
+   or PIPE connection, tell the file sender to:
+
+   SET PREFIXING ALL
+          This causes all control characters to be prefixed and
+          transmitted as printable ASCII characters.
+
+   If the external connection program is not 8-bit clean, you should
+   also:
+
+   SET PARITY SPACE
+          This causes 8-bit data to be encoded in 7 bits using single
+          and/or locking shifts.
+
+   And if it does not make a reliable connection (such as those made by
+   Telnet, Rlogin, Ssh, etc), you should:
+
+   SET STREAMING OFF
+          This forces C-Kermit to treat the connection as unreliable and
+          to engage in its normal ACK/NAK protocol for error detection
+          and correction, rather than "streaming" its packets, as it
+          normally does on a network connection ([409]Section 4.20).
+
+   In some cases, buffer sizes might be restricted, so you might also
+   need to reduce the Kermit packet length to fit; this is a
+   trial-and-error affair. For example, if transfers always fail with
+   4000-byte packets, try 2000. If that fails too, try 1000, and so on.
+   The commands are:
+
+   SET RECEIVE PACKET-LENGTH number
+          This tells the file receiver to tell the file sender the
+          longest packet length it can accept.
+
+   SET SEND PACKET-LENGTH number
+          This tells the file sender not to send packets longer than the
+          given length, even if the receiver says longer ones are OK. Of
+          course, if the receiver's length is shorter, the shorter length
+          is used.
+
+   If none of this seems to help, try falling back to the bare minimum,
+   lowest-common-denominator protocol settings:
+
+   ROBUST
+          No sliding windows, no streaming, no control-character
+          unprefixing, packet length 90.
+
+   And then work your way back up by trial and error to get greater
+   throughput.
+
+   Note that when starting a PIPE connection, and the connection program
+   (such as telnet or rlogin) prints some greeting or information
+   messages before starting the connection, these are quite likely to be
+   printed with a stairstep effect (linefeed without carriage return).
+   This is because the program is not connected with the UNIX terminal
+   driver; there's not much Kermit can do about it. Once the connection
+   is made, everything should go back to normal. This shouldn't happen on
+   a PTY connection because a PTY is, indeed, a terminal.
+
+   On a similar note, some connection programs (like Solaris 2.5 rlogin)
+   might print lots of error messages like "ioctl TIOCGETP: invalid
+   argument" when used through a pipe. They are annoying but usually
+   harmless. If you want to avoid these messages, and your shell allows
+   redirection of stderr, you can redirect stderr in your pipe command,
+   as in this example where the user's shell is bash:
+
+  PIPE rlogin xyzcorp.com 2> /dev/null
+
+   Or use PTY rather than PIPE, since PTY is available on Solaris.
+     _________________________________________________________________
+
+    2.7.0. C-Kermit over tn3270 and tn5250
+
+   Now you can make a connection from C-Kermit "directly" to an IBM
+   mainframe and transfer files with it, assuming it has Kermit-370
+   installed. Because tn3270 is neither 8-bit clean nor transparent to
+   control characters, you must give these commands:
+
+  SET PREFIXING ALL   ; Prefix all control characters
+  SET PARITY SPACE    ; Telnet connections are usually not 8-bit clean
+
+   and then:
+
+  SET HOST /PTY /CONNECT tn3270 abccorp.com
+
+   or simply:
+
+  pty tn3270 abccorp.com
+
+   SET HOST /PIPE does not work in this case, at least not for file
+   transfer. File transfer does work, however, with SET HOST /PTY,
+   provided you use the default packet length of 90 bytes; anything
+   longer seems to kill the session.
+
+   You can also make connections to IBM AS/400 computers if you have a
+   tn5250 program installed:
+
+  pty tn5250 hostname
+
+   In this case, however, file transfer is probably not in the cards
+   since nobody has ever succeeded in writing a Kermit program for the
+   AS/400. Hint:
+
+  define tn3270 {
+      check pty
+      if fail end 1 Sorry - no PTY support...
+      pty tn3270 \%*
+  }
+
+   Similarly for tn5250. Note that CHECK PTY and CHECK PIPE can be used
+   in macros and scripts to test whether PTY or PIPE support is
+   available.
+     _________________________________________________________________
+
+    2.7.1. C-Kermit over Telnet
+
+   Although C-Kermit includes its own Telnet implementation, you might
+   need to use an external Telnet program to make certain connections;
+   perhaps because it has access or security features not available in
+   C-Kermit itself. As noted above, the only precautions necessary are
+   usually:
+
+  SET PREFIXING ALL   ; Prefix all control characters
+  SET PARITY SPACE    ; Telnet connections might not be 8-bit clean
+
+   and then:
+
+  SET HOST /PTY (or /PIPE) /CONNECT telnet abccorp.com
+
+   or, equivalently:
+
+  PTY (or PIPE) telnet abccorp.com
+     _________________________________________________________________
+
+    2.7.2. C-Kermit over Rlogin
+
+   C-Kermit includes its own Rlogin client, but this can normally be used
+   only if you are root, since the rlogin TCP port is privileged. But
+   ptys and pipes let you make rlogin connections with C-Kermit through
+   your computer's external rlogin program, which is normally installed
+   as a privileged program:
+
+  SET PREFIXING ALL
+
+   and then:
+
+  SET HOST /PTY (or /PIPE) /CONNECT rlogin -8 abccorp.com
+
+   or, equivalently:
+
+  PTY (or PIPE) rlogin -8 abccorp.com
+
+   The "-8" option to rlogin enables transmission of 8-bit data. If this
+   is not available, then include SET PARITY SPACE if you intend to
+   transfer files.
+
+   Note that the normal escape sequence for rlogin is Carriage Return
+   followed by Tilde (~), but only when the tilde is followed by certain
+   other characters; the exact behavior depends on your rlogin client, so
+   read its documentation.
+     _________________________________________________________________
+
+    2.7.3. C-Kermit over Serial Communication Programs
+
+   Ptys and pipes also let you use programs that make serial connections,
+   such as cu or tip. For example, C-Kermit can be used through cu to
+   make connections that otherwise might not be allowed, e.g. because
+   C-Kermit is not installed with the required write permissions to the
+   dialout device and the UUCP lockfile directory.
+
+   Suppose your UUCP Devices file contains an entry for a serial device
+   tty04 to be used for direct connections, but this device is protected
+   against you (and Kermit when you run it). In this case you can:
+
+  SET CONTROL PREFIX ALL
+  PTY (or PIPE) cu -l tty04
+
+   (Similarly for dialout devices, except then you also need to include
+   the phone number in the "cu" command.)
+
+   As with other communication programs, watch out for cu's escape
+   sequence, which is the same as the rlogin program's: Carriage Return
+   followed by Tilde (followed by another character to specify an action,
+   like "." for closing the connection and exiting from cu).
+     _________________________________________________________________
+
+    2.7.4. C-Kermit over Secure Network Clients
+
+     DISCLAIMER: There are laws in the USA and other countries regarding
+     use, import, and/or export of encryption and/or decryption or other
+     forms of security software, algorithms, technology, and
+     intellectual property. The Kermit Project attempts to follow all
+     known statutes, and neither intends nor suggests that Kermit
+     software can or should be used in any way, in any location, that
+     circumvents any regulations, laws, treaties, covenants, or other
+     legitimate canons or instruments of law, international relations,
+     trade, ethics, or propriety.
+
+   For secure connections or connections through firewalls, C-Kermit 7.0
+   can be a Kerberos, SRP, and/or SOCKS client when built with the
+   appropriate options and libraries. But other application-level
+   security acronyms and methods -- SSH, SSL, SRP, TLS -- pop up at an
+   alarming rate and are (a) impossible to keep up with, (b) usually
+   mutually incompatible, and (c) have restrictions on export or
+   redistribution and so cannot be included in C-Kermit itself.
+
+   However, if you have a secure text-based Telnet (or other) client that
+   employs one of these security methods, you can use C-Kermit "through"
+   it via a pty or pipe.
+     _________________________________________________________________
+
+    2.7.4.1. SSH
+
+   C-Kermit does not and can not incorporate SSH due to licensing,
+   patent, and USA export law restrictions.
+
+   The UNIX SSH client does not use standard input/output, and therefore
+   can be used only by Kermit's PTY interface, if one is present. The
+   cautions about file transfer, etc, are the same as for Rlogin.
+   Example:
+
+  SET PREFIXING ALL
+  PTY ssh XYZCORP.COM
+
+   Or, for a scripted session:
+
+  SET PREFIXING ALL
+  SET HOST /PTY ssh XYZCORP.COM
+
+   Hint:
+
+  define ssh {
+      check pty
+      if fail end 1 Sorry - no PTY support...
+      pty ssh \%*
+  }
+     _________________________________________________________________
+
+    2.7.4.2. SSL
+
+   Secure Sockets Layer (SSL) is another TCP/IP security overlay, this
+   one designed by and for Netscape. An SSL Telnet client is available
+   for UNIX from the University of Queensland. More info at:
+
+  [410]http://www.psy.uq.oz.au/~ftp/Crypto/
+
+   Interoperability with C-Kermit is unknown. C-Kermit also includes its
+   own built-in SSL/TLS support, but it is not exportable; [411]CLICK
+   HERE file for details.
+     _________________________________________________________________
+
+    2.7.4.3. SRP
+
+   SRP(TM) is Stanford University's Secure Remote Password protocol. An
+   SRP Telnet client is available from Stanford:
+
+  [412]http://srp.stanford.edu/srp/
+
+   Stanford's SRP Telnet client for UNIX has been tested on SunOS and
+   works fine with C-Kermit, as described in [413]Section 2.7.1, e.g.
+
+  SET PREFIX ALL
+  PTY (or PIPE) srp-telnet xenon.stanford.edu
+
+   C-Kermit itself can be built as an SRP Telnet client on systems that
+   have libsrp.a installed; the C-Kermit support code, however, may not
+   be exported outside the USA or Canada.
+     _________________________________________________________________
+
+    2.7.4.4. SOCKS
+
+   C-Kermit can be built as a SOCKS-aware client on systems that have a
+   SOCKS library. See section 8.1.1 of the [414]ckccfg.txt file.
+
+   C-Kermit 7.0 can also be run over SOCKSified Telnet or rlogin clients
+   with SET NETWORK TYPE COMMAND. Suppose the Telnet program on your
+   system is SOCKS enabled but C-Kermit is not. Make Kermit connections
+   like this:
+
+  SET PREFIX ALL
+  PTY (or PIPE) telnet zzz.com
+     _________________________________________________________________
+
+    2.7.4.5. Kerberos
+
+   UNIX C-Kermit can be built with MIT Kerberos IV or V authentication
+   and encryption. Instructions are available in a [415]separate
+   document. Additional modules are required that can not be exported
+   from the USA to any country except Canada, by US law.
+
+   If you have Kerberos installed but you don't have a Kerberized version
+   of C-Kermit, you can use ktelnet as C-Kermit's external communications
+   program to make secure connections without giving up C-Kermit's
+   services:
+
+  SET PREFIX ALL
+  PTY (or PIPE) ktelnet cia.gov
+     _________________________________________________________________
+
+  2.8. Scripting Local Programs
+
+   If your version of Kermit has PTY support built in, then any
+   text-based program can be invoked with SET HOST /PTY or equivalent
+   command and controlled using the normal sequence of OUTPUT, INPUT, IF
+   SUCCESS commands (this is the same service that is provided by the
+   'expect' program, but controlled by the Kermit script language rather
+   than Tcl).
+
+   When PTY service is not available, then any program that uses standard
+   input and output can be invoked with SET HOST /PIPE.
+
+   Here's an example in which we start an external Kermit program, wait
+   for its prompt, give it a VERSION command, and then extract the
+   numeric version number from its response:
+
+  set host /pty kermit -Y
+  if fail stop 1 {Can't start external command}
+  input 10 C-Kermit>
+  if fail stop 1 {No C-Kermit> prompt}
+  output version\13
+  input 10 {Numeric: }
+  if fail stop 1 {No match for "Numeric:"}
+  clear input
+  input 10 \10
+  echo VERSION = "\fsubstr(\v(input),1,6)"
+  output exit\13
+
+   This technique could be used to control any other interactive program,
+   even those that do screen formatting (like Emacs or Vi), if you can
+   figure out the sequence of events. If your Kermit program doesn't have
+   PTY support, then the commands are restricted to those using standard
+   i/o, including certain shells, interactive text-mode "hardcopy"
+   editors like ex, and so on.
+
+   If you are using the PTY interface, you should be aware that it runs
+   the given program or command directly on the pty, without any
+   intervening shell to interpret metacharacters, redirectors, etc. If
+   you need this sort of thing, include the appropriate shell invocation
+   as part of your command; for example:
+
+  pty echo *
+
+   just echoes "*"; whereas:
+
+  pty ksh -c "echo *"
+
+   echoes all the filenames that ksh finds matching "*".
+
+   Similarly for redirection:
+
+  set host /pty ksh -c "cat > foo"  ; Note: use shell quoting rules here
+  set transmit eof \4
+  transmit bar
+
+   And for that matter, for built-in shell commands:
+
+  set host /pty ksh -c "for i in *; do echo $i; done"
+
+   The PIPE interface, on the other hand, invokes the shell
+   automatically, so:
+
+  pipe echo *
+
+   prints filenames, not "*".
+     _________________________________________________________________
+
+  2.9. X.25 Networking
+
+   X.25 networking is documented in [416]Using C-Kermit, 2nd Edition.
+   When the book was published, X.25 was available only in SunOS,
+   Solaris, and Stratus VOS. Unlike TCP/IP, X.25 APIs are not
+   standardized; each vendor's X.25 libraries and services (if they have
+   them at all) are unique.
+
+   This section describes new additions.
+     _________________________________________________________________
+
+    2.9.1. IBM AIXLink/X.25 Network Provider Interface for AIX
+
+   Support for X.25 was added via IBM's Network Provider Interface (NPI),
+   AIXLink/X.25 1.1, to the AIX 4.x version of C-Kermit 7.0.
+   Unfortunately, AIXLink/X.25 is a rather bare-bones facility, lacking
+   in particular any form of PAD support (X.3, X.28, X.29). Thus, the AIX
+   version of C-Kermit, when built to include X.25 networking, has
+   neither a PAD command, nor a SET PAD command. The same is true for the
+   underlying AIX system: no PAD support. Thus it is not possible to have
+   an interactive shell session over an X.25 connection into an AIX
+   system (as far as we know), even from X.25-capable Kermit versions
+   (such as Solaris or VOS) that do include PAD support.
+
+   Thus the X.25 capabilities in AIX C-Kermit are limited to peer-to-peer
+   connections, e.g. from a C-Kermit client to a C-Kermit server. Unlike
+   the Solaris, SunOS, and VOS versions, the AIX version can accept
+   incoming X.25 connections:
+
+  set network type x.25
+  if fail stop 1 Sorry - no X.25 support
+  ; Put any desired DISABLE or ENABLE or SET commands here.
+  set host /server *
+  if fail stop 1 X.25 "set host *" failed
+
+   And then access it from the client as follows:
+
+  set network type x.25
+  if fail stop 1 Sorry - no X.25 support
+  set host xxxxxxx ; Specify the X.25/X.121 address
+  if fail stop 1 Can't open connection
+
+   And at this point the client can use the full range of client
+   commands: SEND, GET, REMOTE xxx, FINISH, BYE.
+
+   The AIX version also adds two new variables:
+
+   \v(x25local_nua)
+          The local X.25 address.
+
+   \v(x25remote_nua)
+          The X.25 address of the host on the other end of the
+          connection.
+
+   C-Kermit's AIX X.25 client has not been tested against anything other
+   than a C-Kermit X.25 server on AIX. It is not known if it will
+   interoperate with C-Kermit servers on Solaris, SunOS, or VOS.
+
+   To make an X.25 connection from AIX C-Kermit, you must:
+
+  set x25 call-user-data xxxx
+
+   where xxxx can be any even-length string of hexadecimal digits, e.g.
+   123ABC.
+     _________________________________________________________________
+
+    2.9.2. HP-UX X.25
+
+   Although C-Kermit presently does not include built-in support for
+   HP-UX X.25, it can still be used to make X.25 connections as follows:
+   start Kermit and tell it to:
+
+  set prefixing all
+  set parity space
+  pty padem address
+
+   This should work in HP-UX 9.00 and later (see [417]Section 2.7). If
+   you have an earlier HP-UX version, or the PTY interface doesn't work
+   or isn't available, try:
+
+  set prefixing all
+  set parity space
+  pipe padem address
+
+   Failing that, use Kermit to telnet to localhost and then after logging
+   back in, start padem as you would normally do to connect over X.25.
+     _________________________________________________________________
+
+  2.10. Additional Serial Port Controls
+
+   C-Kermit 7.0 adds the following commands for greater control over
+   serial ports. These commands are available only in C-Kermit versions
+   whose underlying operating systems provide the corresponding services
+   (such as POSIX and UNIX System V), and even then their successful
+   operation depends on the capabilities of the specific device and
+   driver.
+
+   SET DISCONNECT { ON, OFF }
+          On a SET LINE or SET PORT connection with SET CARRIER ON or
+          AUTO, if the carrier signal drops during the connection,
+          indicating that the connection has been lost, and C-Kermit
+          notices it, this setting governs what happens next. With SET
+          DISCONNECT OFF, which is consistent with previous behavior, and
+          therefore the default, C-Kermit continues to keep the device
+          open and allocated. With SET DISCONNECT ON, C-Kermit
+          automatically closes and releases the device when it senses a
+          carrier on-to-off transition, thus allowing others to use it.
+          However, it remains the default device for i/o (DIAL, REDIAL,
+          INPUT, SEND, CONNECT, etc), so if a subsequent i/o command is
+          given, the device is reopened if it is still available. When it
+          has been automatically closed in this manner, SHOW
+          COMMUNICATIONS puts "(closed)" after its name, and in UNIX, the
+          lockfile disappears -- both from SHOW COMM and from the
+          lockfile directory itself. Synonym: SET CLOSE-ON-DISCONNECT.
+
+   SET EXIT ON-DISCONNECT { ON, OFF }
+          Like DISCONNECT, but makes the program exit if a connection
+          drops.
+
+   Note that SET CLOSE-ON-DISCONNECT and SET EXIT ON-DISCONNECT apply
+   only to connections that drop; they do not apply to connections that
+   can't be made in the first place. For example, they have no effect
+   when a SET LINE, SET HOST, TELNET, or DIAL command fails.
+
+   HANGUP
+          If [CLOSE-ON-]DISCONNECT is ON, and the HANGUP command is given
+          on a serial device, and the carrier signal is no longer present
+          after the HANGUP command, the device is closed and released.
+
+   SET PARITY HARDWARE { EVEN, ODD }
+          Unlike SET PARITY { EVEN, ODD, MARK, SPACE }, which selects 7
+          data bits plus the indicated kind of parity (to be done in
+          software by Kermit itself), SET PARITY HARDWARE selects 8 data
+          bits plus even or odd parity, to be done by the underlying
+          hardware, operating system, or device driver. This command is
+          effective only with a SET LINE or SET PORT device. That is, it
+          has no effect in remote mode, nor on network connections. There
+          is presently no method for selecting 8 data bits plus mark or
+          space parity. If hardware parity is in effect, the variable
+          \v(hwparity) is set to "even" or "odd". Note: some platforms
+          might also support settings of SPACE, MARK, or NONE.
+
+   SET STOP-BITS { 1, 2 }
+          This tells the number of 1-bits to insert after an outbound
+          character's data and parity bits, to separate it from the next
+          character. Normally 1. Choosing 2 stop bits should do no harm,
+          but will slow down serial transmission by approximately 10
+          percent. Historically, 2 stop bits were used with Teletypes (at
+          110 bps or below) for print-head recovery time. There is
+          presently no method for choosing any number of stop bits
+          besides 1 and 2.
+
+   SET SERIAL [ dps ]
+          dps stands for Data-bits, Parity, Stop-bits. This is the
+          notation familiar to many people for serial port configuration:
+          7E1, 8N1, 7O2, etc. The data bits number also becomes the
+          TERMINAL BYTESIZE setting. The second character is E for Even,
+          O for Odd, M for Mark, S for Space, or N for None. The list of
+          available options depends on the capabilities of the specific
+          platform. If dps is omitted, 8N1 is used. Type "set serial ?"
+          for a list of available choices. Examples:
+
+        SET SERIAL 7E1
+                Equivalent to SET PARITY EVEN, SET STOP-BITS 1, SET TERM
+                BYTE 7.
+
+        SET SERIAL 8N1
+                Equivalent to SET PARITY NONE, SET STOP-BITS 1, SET TERM
+                BYTE 8.
+
+        SET SERIAL 7E2
+                Equivalent to SET PARITY EVEN and SET STOP-BITS 2, SET
+                TERM BYTE 7.
+
+        SET SERIAL 8E2
+                Same as SET PARITY HARDWARE EVEN, SET STOP-BITS 2, SET
+                TERM BYTE 8.
+
+        SET SERIAL
+                Same as SET PARITY NONE and SET STOP-BITS 1, SET TERM
+                BYTE 8.
+
+   Notes:
+
+     * The SET SERIAL xx2 options are available only in Kermit versions
+       where the SET PARITY HARDWARE command is also available. (SHOW
+       FEATURES includes "HWPARITY" in its options list.)
+     * The SET SERIAL 7xx and 8N1 options affect the software parity
+       setting, even for network connections.
+     * As noted in the manual, selecting 8 data bits does not give you
+       8-bit terminal sessions in CONNECT mode unless you also SET
+       TERMINAL BYTESIZE 8. The default terminal bytesize remains 7, to
+       protect against the situation where the remote host is generating
+       parity but you don't know about it. If the terminal bytesize was 8
+       by default and you CONNECTed to such a host, you would see only
+       garbage on your screen.
+     * If you do not give a SET STOP-BITS or SET SET SERIAL command,
+       C-Kermit does not attempt to set the device's stop bits; instead,
+       it uses whatever setting the device uses when not given explicit
+       instructions about stop bits.
+
+   SHOW COMMUNICATIONS displays the current settings. Stop bits and
+   hardware parity are shown only for SET PORT / SET LINE (serial)
+   devices, since they do not apply to network connections or to remote
+   mode. STOP-BITS is shown as "(default)" if you have not given an
+   explicit SET STOP-BITS or SET SERIAL command.
+
+   The \v(serial) variable shows the SET SERIAL setting (8N1, 7E1, etc).
+     _________________________________________________________________
+
+  2.11. Getting Access to the Dialout Device
+
+     This section is for UNIX only; note the special words about QNX at
+     the end. Also see [418]Section 2.0 for SET LINE switches,
+     particularly the /SHARE switch for VMS only.
+
+   C-Kermit does its best to obey the UUCP lockfile conventions of each
+   platform (machine, operating system, OS version) where it runs, if
+   that platform uses UUCP.
+
+   But simply obeying the conventions is often not good enough, due to
+   the increasing likelihood that a particular serial device might have
+   more than one name (e.g. /dev/tty00 and /dev/term/00 are the same
+   device in Unixware 7; /dev/cua and /dev/cufa are the same device in
+   NeXTSTEP), plus the increasingly widespread use of symlinks for device
+   names, such as /dev/modem.
+
+   C-Kermit 7.0 goes to greater lengths than previous versions to
+   successfully interlock with other communications program (and other
+   instances of Kermit itself); for example, by:
+
+     * Creation of dual lockfiles whenever a symlink is used; one for the
+       link name and one for the real name.
+     * Creation of dual lockfiles in HP-UX according to HP rules.
+     * Creation of dual uppercase/lowercase lockfile names in SCO
+       UNIX/ODT/OSR5.
+     * The use of ttylock() in versions of AIX where it works.
+     * The use, wherever possible, of lockfile names based on
+       inode/major/minor device number rather than device name.
+
+   See the [419]ckuins.txt and [420]ckubwr.txt files for details.
+
+   QNX is almost unique among UNIX varieties in having no UUCP programs
+   nor UUCP-oriented dialout-device locking conventions. QNX does,
+   however, allow a program to get the device open count. This can not be
+   a reliable form of locking unless all applications do it (and they
+   don't), so by default, Kermit uses this information only for printing
+   a warning message such as:
+
+  C-Kermit>set line /dev/ser1
+  WARNING - "/dev/ser1" looks busy...
+
+   However, if you want to use it as a lock, you can do so with:
+
+  SET QNX-PORT-LOCK { ON, OFF }
+
+   QNX-PORT-LOCK is OFF by default; if you set in ON, C-Kermit fails to
+   open any dialout device when its open count indicates that another
+   process has it open. SHOW COMM (in QNX only) displays the setting, and
+   if you have a port open, it also shows the current open count (with
+   C-Kermit's own access always counting as 1).
+     _________________________________________________________________
+
+  2.12. The Connection Log
+
+   C-Kermit 7.0 adds the ability to log connections, so you can see where
+   you've been and have a record of calls you've made. A connection is
+   defined as any communications session that is begun by SET LINE, SET
+   PORT, DIAL, SET HOST, TELNET, or RLOGIN. Connections are not logged
+   unless you request it; the command is:
+
+   LOG CX [ filename [ { NEW, APPEND } ] ]
+          Enables logging of connections in the given file. If the
+          trailing { NEW, APPEND } keyword is omitted, the file is opened
+          for appending; i.e. new records are written to the end. If NEW
+          is specified, a new file is created; if a file of the same name
+          already existed, it is overwritten. If the filename is omitted,
+          CX.LOG in your home (login) directory is used (note:
+          uppercase). To accept all defaults, just use "log connections"
+          (or "l c" for short). Synonym: LOG CONNECTIONS.
+
+   CLOSE CX-LOG
+          This closes the connection log if it was open. (Note, the CLOSE
+          CONNECTION command closes the connection itself).
+
+   SHOW CX
+          This shows your current connection, if any, including the
+          elapsed time (since you opened it). Synonym: SHOW CONNECTION.
+
+   \v(cx_time)
+          This variable shows the elapsed time of your current
+          connection, or if there is no current connection, of your most
+          recent connection, of if there have been no connections, 0.
+
+   The connection contains one line per connection, of the form:
+
+  yyyymmdd hh:mm:ss username pid p=v [ p=v [ ... ] ]
+
+   where the timestamp (in columns 1-18) shows when the connection was
+   made; username is the login identity of the person who made the
+   connection; pid is Kermit's process ID when it made the connection.
+   The p's are parameters that depend on the type of connection, and the
+   v's are their values:
+
+  T = Connection Type (TCP, SERIAL, DIAL, DECNET, etc).
+  H = The name of the Host from which the connection was made.
+  N = Destination phone Number or Network host name or address.
+  D = Serial connections only: Device name.
+  O = Dialed calls only: Originating country code & area code if known.
+  E = Elapsed time in hh:mm:ss format (or hhh:mm:ss, etc).
+
+   If you always want to keep a connection log, simply add:
+
+  log connections
+
+   to your C-Kermit customization file. Note, however, that if you make a
+   lot of connections, your CX.LOG will grow and grow. You can handle
+   this by adding a "logrotate" procedure like the following to your
+   customization file, before the "log connections" command:
+
+  define LOGROTATE {                    ; Define LOGROTATE macro
+      local \%i \%m \%d \%n \%f MAX
+      def MAX 4                         ; How many months to keep
+      if not def \%1 -                  ; No argument given
+        end 1 \%0: No filename given
+      if not = 1 \ffiles(\%1) -         ; Exactly 1 file must match
+        end 1 \%0: \%1 - File not found
+      .\%d := \fsubstr(\fdate(\%1),1,6) ; Arg OK - get file year & month
+      if = \%d -                        ; Compare file year & month
+        \fsubstr(\v(ndate),1,6) -       ; with current year & month
+          end 0                         ; Same year & month - done
+      rename \%1 \%1.\%d                ; Different - rename file
+      .\%n := \ffiles(\%1.*)            ; How many old files
+      if < \%n \m(MAX) end 0            ; Not enough to rotate
+      .\%m := \%1.999999                ; Initial compare string
+      for \%i 1 \%n 1 {                 ; Loop thru old logs
+         .\%f := \fnextfile()           ; Get next file name
+         if llt \%f \%m .\%m := \%f     ; If this one older remember it
+      }
+      delete \%m                        ; Delete the oldest one
+  }
+  log connections                       ; Now open the (possibly new) log
+  logrotate \v(home)CX.LOG              ; Run the LOGROTATE macro
+
+   As you can see, this compares the yyyymm portion of the modification
+   date (\fdate()) of the given file (\%1) with the current yyyymm. If
+   they differ, the current file has the yyyymm suffix (from its most
+   recent modification date) appended to its name. Then we search through
+   all other such files, find the oldest one, and delete it. Thus the
+   current log, plus the logs from the most recent four months, are kept.
+   This is all done automatically every time you start C-Kermit.
+
+   On multiuser systems, it is possible to keep a single, shared,
+   system-wide connection log, but this is not recommended since (a) it
+   requires you keep a publicly write-accessible logfile (a glaring
+   target for mischief), and (b) it would require each user to log to
+   that file and not disable logging. A better method for logging
+   connections, in UNIX at least, is syslogging (see [421]ckuins.txt
+   Section 15 and [422]Section 4.2 of the [423]IKSD Administration Guide
+   for details).
+     _________________________________________________________________
+
+  2.13. Automatic Connection-Specific Flow Control Selection
+
+   Beginning in C-Kermit 7.0, the appropriate flow-control method for
+   each connection type is kept in a table, for example:
+
+  Remote:           NONE
+  Modem:            RTS/CTS
+  Direct-Serial:    NONE
+  TCPIP:            NONE
+
+   The size of the table and values for each connection type can vary
+   from platform to platform. Type "set flow ?" for a list of available
+   flow-control types.
+
+   The table is used to automatically select the appropriate kind of flow
+   control whenever you make a connection. You can display the table
+   with:
+
+  SHOW FLOW-CONTROL
+
+   The defaults are as follows:
+
+   Remote:
+          NONE or XON/XOFF. This is because C-Kermit is not allowed to
+          find out what type of connection the incoming user has (*). No
+          kind of flow control will work on every kind of connection,
+          including (unexpectedly) KEEP, which we would have liked to
+          use, but not turning off flow control at the remote end during
+          file transfer on TCP/IP connections is fatal to the transfer
+          (except in VMS and HP-UX, where it must be set to Xon/Xoff!)
+          Therefore if you are dialing in to a serial port on a server
+          (UNIX or VMS) where C-Kermit is running, you will need to tell
+          C-Kermit to "set flow keep" before transferring files (assuming
+          the modem and port are configured correctly by the system
+          administrator; otherwise you'll need to give a specific kind of
+          flow control, e.g. "set flow xon/xoff"), so in this case
+          C-Kermit will not disable flow control, as it must do when you
+          are coming via Telnet (directly or through a terminal server,
+          except on VMS and HP-UX).
+
+   Modem:
+          This applies when you dial out with a modem. In this case, the
+          MODEM FLOW-CONTROL setting takes affect after the SET FLOW
+          setting, so it can pick the most appropriate flow control for
+          the combination of the particular modem and the
+          computer/port/driver that is dialing.
+
+   Direct-Serial:
+          The default here is NONE because C-Kermit has no way of knowing
+          what kind of flow control, if any, is or can be done by the
+          device at the other end of the connection. RTS/CTS would be a
+          bad choice here, because if the CTS signal is not asserted, the
+          connection will hang. And since direct connections are often
+          made with 3-wire cables, there is a good chance the CTS signal
+          will not be received.
+
+   TCPIP:
+          NONE, since TCP and IP provide their own flow control
+          transparently to the application, except in VMS, where Xon/Xoff
+          is the default due to the requirements of the VMS TCP/IP
+          products.
+
+   Other networks:
+          NONE, since networks should provide their flow control
+          transparently to the application.
+
+   (*) This is possibly the worst feature of UNIX, VMS, and other
+   platforms where C-Kermit runs. If C-Kermit was able to ask the
+   operating system what kind of connection it had to the user, it could
+   set up many things for you automatically.
+
+   You can modify the default-flow-control table with:
+
+  SET FLOW-CONTROL /xxx { NONE, KEEP, RTS/CTS, XON/XOFF, ... }
+
+   where "xxx" is the connection type, e.g.
+
+  SET FLOW /REMOTE NONE
+  SET FLOW /DIRECT RTS/CTS
+
+   If you leave out the switch, SET FLOW works as before, choosing the
+   flow control method to be used on the current connection:
+
+  SET FLOW XON/XOFF
+
+   Thus, whenever you make a connection with SET PORT, SET LINE, DIAL,
+   SET HOST, TELNET, RLOGIN, etc, an appropriate form of flow control is
+   selected automatically. You can override the automatic selection with
+   a subsequent SET FLOW command, such as SET FLOW NONE (no switch
+   included).
+
+   The flow control is changed automatically too when you give a SET
+   MODEM TYPE command. For example, suppose your operating system (say
+   Linux) supports hardware flow control (RTS/CTS). Now suppose you give
+   the following commands:
+
+  set line /dev/ttyS2    ; Automatically sets flow to NONE
+  set modem type usr     ; Automatically sets flow to RTS/CTS
+  set modem type rolm    ; Doesn't support RTS/CTS so now flow is XON/XOFF
+
+   IMPORTANT: This new feature tends to make the order of SET LINE/HOST
+   and SET FLOW commands matter, where it didn't before. For example, in
+   VMS:
+
+  SET FLOW KEEP
+  SET LINE TTA0:
+
+   the SET LINE undoes the SET FLOW KEEP command; the sequence now must
+   be:
+
+  SET FLOW /DIRECT KEEP
+  SET LINE TTA0:
+
+   or:
+
+  SET LINE TTA0:
+  SET FLOW KEEP
+     _________________________________________________________________
+
+  2.14. Trapping Connection Establishment and Loss
+
+   If you define a macro called ON_OPEN, it is executed any time that a
+   SET LINE, SET PORT, SET HOST, TELNET, RLOGIN or similar command
+   succeeds in opening a connection. The argument is the host or device
+   name (as shown by SHOW COMMUNICATIONS, and the same as \v(line)). This
+   macro can be used for all sorts of things, like automatically setting
+   connection- or host-specific parameters when the connection is opened.
+   Example:
+
+  def ON_OPEN {
+      switch \%1 {
+        :abccorp.com, set reliable off, break
+        :xyzcorp.com, set receive packet-length 1000, break
+        etc etc...
+      }
+  }
+
+   If you define a macro called ON_CLOSE, it will be executed any time
+   that a SET LINE, SET PORT, SET HOST, TELNET, RLOGIN or any other kind
+   of connection that C-Kermit has made is closed, either by the remote
+   or by a local CLOSE, HANGUP, or EXIT command or other local action,
+   such as when a new connection is opened before an old one was
+   explicitly closed.
+
+   As soon as C-Kermit notices the connection has been closed, the
+   ON_CLOSE macro is invoked at (a) the top of the command parsing loop,
+   or (b) when a connection is closed implicitly by a command such as SET
+   LINE that closes any open connection prior to making a new connection,
+   or (c) when C-Kermit closes an open connection in the act of exiting.
+
+   The ON_CLOSE macro was inspired by the neverending quest to unite
+   Kermit and SSH. In this case using the "tunnel" mechanism:
+
+  def TUNNEL {                                ; \%1 = host to tunnel to
+      local \%p
+      if not def \%1 stop 1
+      assign tunnelhost \%1                   ; Make global copy
+      undef on_close
+      set macro error off
+      close connection                        ; Ignore any error
+      open !read tunnel start \%1
+      read \%p                                ; Get port number
+      if fail stop 1 Tunnel failure: \%1
+      close read
+      if fail stop 1 Tunnel failure: \%1      ; See [424]Section 4.2.8.1
+      assign on_close {                       ; Set up close handler
+          echo Closing tunnel: \m(tunnelhost)
+          !tunnel stop \m(tunnelhost)
+          undef on_close
+      }
+      set host localhost:\%p /telnet
+      if success end 0
+      undef on_close
+      stop 1 Connection failure: \%1
+  }
+
+   In this case, when the connection stops, we also need to shut down the
+   tunnel, even if it is at a later time after TUNNEL has finished
+   executing. This way we can escape back, reconnect, transfer files, and
+   so on until the connection is broken by logging out from the remote,
+   or by explicitly closing it, or by EXITing from C-Kermit, at which
+   time the tunnel is shut down.
+
+   When the connection is closed, no matter how, the ON_CLOSE macro
+   executes and then undefines (destroys) itself, since we don't want to
+   be closing tunnels in the future when we close subsequent connections.
+
+   Other such tricks can be imagined, including ending ON_CLOSE with a
+   STOP command to force the command stack to be peeled all the way back
+   to the top, for example in a deeply nested script that depends on the
+   connection being open:
+
+  def on_close { stop 1 CONNECTION LOST }
+
+   When C-Kermit invokes the ON_CLOSE macro, it supplies one argument
+   (\%1): the reason the connection was closed as a number, one of the
+   following:
+
+  2 - Fatal failure to negotiate a required item on a network connection.
+  1 - Closed by C-Kermit command.
+  0 - All others (normally closed by remote).
+
+   which may be used for any purpose; for example, to add a comment to
+   the connection log:
+
+  def on_close {
+      local \%m
+      if not open cx end 0
+      switch \%1 {
+        :0, .\%m = Closed by remote, break
+        :1, .\%m = Closed by me, break
+        :2, .\%m = Network protocol negotiation failure, break
+      }
+      if def \%m writeln cx {# \%m}
+  }
+     _________________________________________________________________
+
+  2.15. Contacting Web Servers with the HTTP Command
+
+   C-Kermit 7.0 (at this writing, the UNIX version only) supports direct
+   contact and interaction with Web servers via HTTP 1.0 protocol. To
+   make a connection, use Kermit's normal method for making a TCP/IP
+   connection, but specify the HTTP port:
+
+  SET HOST host http [ switches ]
+
+   where host is the IP hostname or address, and http is the name of the
+   TCP port for the Web server. Relevant switches include:
+
+   /RAW
+          Treat the connection as a transparent binary pipe. This switch
+          may be required if a port other than 'http' is used.
+
+   /SSL
+          Make an secure private connection with SSL (only if SSL support
+          is included in your version of Kermit). In this case the port
+          name might need to be https rather than http, e.g. "set host
+          secureserver.xyxcorp.com https /ssl".
+
+   /TLS
+          Make an secure private connection with TLS (only if TLS support
+          is included in your version of Kermit). In this case the port
+          name would be https rather than http.
+
+   Then you can issue an HTTP command. In most cases, the server closes
+   the connection when the command is complete. Example:
+
+  SET HOST www.columbia.edu http
+  IF FAIL EXIT 1 Can't contact server
+  HTTP GET kermit/index.html
+
+   At this point the connection is closed, since that's how HTTP 1.0
+   works. If you want to perform additional operations, you must
+   establish a new connection with another SET HOST command.
+
+   The HTTP command acts as a client to the Web server, except instead of
+   displaying the results like a Web browser would, it stores them. Any
+   HTTP command can (but need not) include any or all of the following
+   switches:
+
+   /AGENT:user-agent
+          Identifies the client to the server; "C-Kermit" or "Kermit-95"
+          by default.
+
+   /HEADER:header-line
+          Used for specifying any optional headers. A list of headers is
+          provided using braces for grouping:
+
+  /HEADER:{{tag:value}{tag:value}...}
+
+          For a listing of valid tag value and value formats see [425]RFC
+          1945: Hypertext Transfer Protocol -- HTTP/1.0. A maximum of
+          eight headers may be specified.
+
+   /USER:name
+          In case a page requires a username for access.
+
+   /PASSWORD:password
+          In case a page requires a password for access.
+
+   /ARRAY:arrayname
+          Tells Kermit to store the response headers in the given array,
+          one line per element. The array need not be declared in
+          advance. Example:
+
+  C-Kermit? http /array:c get kermit/index.html
+  C-Kermit? show array c
+  Dimension = 9
+  1. Date: Fri, 26 Nov 1999 23:12:22 GMT
+  2. Server: Apache/1.3.4 (Unix)
+  3. Last-Modified: Mon, 06 Sep 1999 22:35:58 GMT
+  4. ETag: "bc049-f72-37d441ce"
+  5. Accept-Ranges: bytes
+  6. Content-Length: 3954
+  7. Connection: close
+  8. Content-Type: text/html
+
+   As you can see, the header lines are like MIME e-mail header lines:
+   identifier, colon, value. The /ARRAY switch is the only method
+   available to a script to process the server responses for a POST or
+   PUT command.
+
+   The HTTP commands are:
+
+   HTTP [ switches ] GET remote-filename [ local-filename ]
+          Retrieves the named file. If a local-filename is given, the
+          file is stored locally under that name; otherwise it is stored
+          with its own name.
+
+   HTTP [ switches ] HEAD remote-filename local-filename
+          Like GET except without actually getting the file; instead it
+          gets only the headers, storing them into the given file, whose
+          name must be given, one line per header item, as shown above in
+          the /ARRAY: switch description.
+
+   HTTP [ switches ] INDEX remote-directory [ local-filename ]
+          Retrieves the file listing for the given server directory.
+          NOTE: This command is not supported by most Web servers.
+
+   HTTP [ switches ] POST [ /MIME-TYPE:type ] local-file remote-file
+          Used to send a response as if it were sent from a form. The
+          data to be posted must be read from a file.
+
+   HTTP [ switches ] PUT [ /MIME-TYPE:type ] local-file remote-file
+          Uploads a local file to a server file.
+
+   HTTP [ switches ] DELETE remote-filename
+          Instructs the server to delete the specified filename.
+     _________________________________________________________________
+
+  3. TERMINAL CONNECTION
+
+  3.1. CONNECT Command Switches
+
+   The following switches (see [426]Section 1.5) were added to the
+   CONNECT command in 7.0:
+
+   /QUIETLY
+          Don't print the "Connecting to..." or "Back at..." messages. CQ
+          is an invisible command synonym for CONNECT /QUIETLY.
+
+   /TRIGGER:string
+          Specify a trigger or triggers ([427]Section 3.2) effective for
+          this CONNECT command only, temporarily overriding any current
+          SET TERMINAL TRIGGER values ([428]Section 3.2).
+
+   Note: Other switches might also be available; type "connect ?" for a
+   list, "help connect" for a description of each.
+     _________________________________________________________________
+
+  3.2. Triggers
+
+   Triggers were added for UNIX, VMS, AOS/VS, and K95 in C-Kermit 7.0.
+
+   SET TERMINAL TRIGGER string
+          Tells C-Kermit to look for the given string during all
+          subsequent CONNECT sessions, and if seen, to return to command
+          mode automatically, as if you had escaped back manually. If the
+          string includes any spaces, you must enclose it in braces.
+          Example:
+
+  set terminal trigger {NO CARRIER}
+
+   Comparisons are made after character-set translation.
+
+   If a string is to include a literal brace character, precede it with a
+   backslash:
+
+  ; My modem always makes this noise when the connection is lost:
+  set terminal trigger |||ppp\{\{\{\{UUUUUUU
+
+   If you want Kermit to look for more than one string simultaneously,
+   use the following syntax:
+
+  set terminal trigger {{string1}{string2}...{stringn}}
+
+   In this case, C-Kermit will return to command mode automatically if
+   any of the given strings is encountered. Up to 8 strings may be
+   specified.
+
+   If the most recent return to command mode was caused by a trigger, the
+   new variable, \v(trigger), shows the trigger value; otherwise
+   \v(trigger) is empty.
+
+   The SHOW TRIGGER command displays the SET TERMINAL TRIGGER values as
+   well as the \v(trigger) value.
+     _________________________________________________________________
+
+  3.3. Transparent Printing
+
+   As noted in the manual, C-Kermit's CONNECT command on UNIX is not a
+   terminal emulator, but rather a "semitransparent pipe" between the
+   terminal or emulator you are using to access C-Kermit, and the remote
+   host to which C-Kermit is connected. The "semitransparent" qualifier
+   is because of character-set translation as well as several actions
+   taken by the emulator in response to the characters or strings that
+   pass through it, such as APCs, Kermit packets (autodownload),
+   triggers, etc.
+
+   The UNIX version of C-Kermit 7.0 adds another such action: Transparent
+   printing, also called Controller printing (as distinct from Autoprint
+   or line or screen print). It is intended mainly for use on UNIX
+   workstation consoles (as opposed to remote logins), but with some care
+   can also be used when accessing C-Kermit remotely.
+
+   Transparent printing is related to APC by sharing C-Kermit's built-in
+   ANSI escape-sequence parser to detect "printer on" and "printer off"
+   sequences from the host. When the printer-on sequence is received, all
+   subsequent arriving characters -- including NUL, control characters,
+   and escape sequences -- are sent to the SET PRINTER device instead of
+   to your screen until the printer-off sequence is received, or you
+   escape back, whichever happens first. These bytes are not translated
+   or modified or filtered in any way by Kermit (except for possibly
+   stripping of the 8th bit, as noted below), but if filtering or
+   translation is desired, this can be accomplished by your SET PRINTER
+   selection (e.g. by choosing a pipeline of filters).
+
+   By default, your SET PRINTER device is your default UNIX printer, but
+   it can also be a file, a command, or the null device (which causes all
+   printer material to be discarded). See [429]Using C-Kermit, 2nd Ed.,
+   p.41 for details.
+
+   Transparent printing is controlled by the command:
+
+   SET TERMINAL PRINT { ON, OFF }
+          When ON, transparent-print sequences are obeyed, and printing
+          occurs on the system where C-Kermit is running. When OFF,
+          transparent print sequences are ignored and passed through to
+          your actual terminal or emulator, along with the data they
+          enclose. OFF is the default, for compatibility with earlier
+          C-Kermit releases. As noted in the manual, when the current SET
+          PRINTER device is a file, transparent-print material is
+          appended to it; the file is not overwritten.
+
+   SET TERMINAL BYTESIZE { 7, 8 }
+   SET PARITY { EVEN, ODD, MARK, SPACE, NONE }
+          If the terminal bytesize is 7, or PARITY is not NONE, the 8th
+          bit of each byte is stripped prior to printing.
+
+   The transparent-print escape sequences are:
+
+   <ESC>[5i
+          Printer On. Send all subsequent incoming bytes to the printer
+          without any kind of filtering, translation, or alteration.
+          Note: <ESC> stands for ASCII character number 27 (decimal),
+          Escape.
+
+   <ESC>[4i
+          Printer Off. Resume displaying incoming bytes on the screen.
+
+   These are the same sequences used by DEC VT100 and higher terminals
+   and other ANSI X3.64 and ISO 6429 compatible terminals. There is no
+   provision for selecting other printer-control sequences.
+
+   Restrictions:
+
+    1. You must SET TERM TRANSPARENT-PRINT ON before you can use this
+       feature.
+    2. Only the 7-bit forms of the escape sequences are supported. The
+       8-bit CSI C1 control is not recognized.
+    3. Autoprint is not supported, since this requires a full-fledged
+       terminal emulator with direct access to the screen.
+    4. The start-print and stop-print sequences pass through to the
+       screen (there is no way to avoid this without causing unacceptable
+       delays or deadlocks in CONNECT mode). Thus if your terminal or
+       emulator also supports transparent printing via these same
+       sequences, an empty file will be sent to its printer. Normally
+       this has no effect.
+
+   Point (4) is similar to the situation with autodownload and APC --
+   when you have several Kermit clients in a chain, you should take care
+   that these features are enabled in only one of them.
+
+   Example 1:
+
+  set printer {|lpr -Plaser}  ; Specify the printer (if not default).
+  set term print on           ; Enable transparent printing.
+  set term byte 8             ; Enable 8-bit characters.
+  connect                     ; Enter CONNECT mode.
+
+   Example 2:
+
+  set printer /home/users/olga/printer.log  ; Send printer material to a file.
+
+   Example 3:
+
+  set printer {| grep -v ^Received | lpr}   ; Filter out some lines
+
+   Then use "pcprint" or "vtprint" commands on the host to initiate
+   transparent print operations. See [430]Using C-Kermit, 2nd Ed., p.406
+   for details.
+
+   Here is a sample "pcprint" shell script for UNIX:
+
+  #!/bin/sh
+  echo -n '<ESC>[5i'
+  if [ $# -eq 0 ]; then
+    cat
+  else
+    cat $*
+  fi
+  echo -n '<FF><ESC>[4i'
+  # (end)
+
+   (Replace "<ESC>" by the actual ASCII Escape character and "<FF>" by
+   the ASCII Formfeed character).
+
+   If you always want transparent printing enabled, put "set term print
+   on" in your C-Kermit customization file (~/.mykermrc in UNIX). The
+   "set term bytesize" selection, however, is a property of each separate
+   connection.
+     _________________________________________________________________
+
+  3.4. Binary and Text Session Logs
+
+   C-Kermit 7.0 corrects an oversight in earlier releases, in which
+   binary session logs (SET SESSION-LOG BINARY) translated character sets
+   and performed various formatting transformations (e.g. "newline mode")
+   before writing characters to the session log. In C-Kermit 7.0,
+   binary-mode session logging writes characters as they come in, before
+   anything (other that parity-bit stripping) is done to them. Text-mode
+   session logging records the characters after processing.
+     _________________________________________________________________
+
+  4. FILE TRANSFER
+
+   Every file is transferred either in text mode (which implies
+   record-format and character-set translation) or binary mode (in which
+   each byte is sent literally without any kind of conversion). The mode
+   in which a file is transferred is controlled by (a) the default mode,
+   in the absence of any other indications; (b) the SET FILE TYPE
+   command; (c) various automatic mechanisms based on client/server
+   negotiations, directory information or filename patterns, etc.
+
+   The default FILE TYPE was changed from TEXT to BINARY in C-Kermit 7.0
+   because:
+
+     * Transferring a text file in binary mode does less damage than
+       transferring a binary file in text mode.
+     * Only binary-mode transfers can be recovered from the point of
+       failure.
+     * The automatic transfer-mode mechanisms switch to text mode on a
+       per-file basis anyway, so only those files that are not covered by
+       the automatic mechanisms are affected.
+     * All file transfers on the Web are done in binary mode, so people
+       are accustomed to it and expect it.
+     _________________________________________________________________
+
+  4.0. BUG FIXES, MINOR CHANGES, AND CLARIFICATIONS
+
+    4.0.0. Filenames with Spaces
+
+   Filenames that contain spaces are a major nuisance to a program like
+   Kermit, whose command language is line- and word-oriented, in which
+   words are separated by spaces and a filename is assumed to be a
+   "word". In general (unless noted otherwise in the description of a
+   particular command), there is only one way to refer to such files in
+   Kermit commands, and that is to enclose the name in braces:
+
+  send {this file}
+
+   Tells Kermit to send the file whose name is "this file" (two words, no
+   quotes). Of course, various circumlocutions are also possible, such
+   as:
+
+  define \%a this file
+  send \%a
+
+   BUT, perhaps contrary to expectation, you can't use "\32" to represent
+   the space:
+
+  send this\32file
+
+   does not work. Why? Because the Kermit parser, which must work on many
+   operating systems including Windows, has no way of knowing what you
+   mean by "this\32file". Do you mean a file whose name is "this file" in
+   the current directory? Or do you mean a file whose name is "32file" in
+   the "this" subdirectory of the current directory? Guessing won't do
+   here; Kermit must behave consistently and deterministically in all
+   cases on all platforms.
+
+   Note that you can't use Esc or Tab within {...} for filename
+   completion, or question mark to get a filename list. However, you can
+   include wildcards; for example:
+
+  send {* *}
+
+   sends all files whose name contains a space.
+
+   All things considered, it is best to avoid spaces in file and
+   directory names if you can. Also see [431]Section 5.4 on this topic.
+     _________________________________________________________________
+
+    4.0.1. Packet out of Window
+
+   C-Kermit 6.0 could send packets "out of window" if the window size was
+   greater than 1 and ACKs had arrived out of order. Fixed in 6.1.
+     _________________________________________________________________
+
+    4.0.2. MOVE after ADD SEND-LIST
+
+   ADD SEND-LIST followed by MOVE did not delete original files; fixed in
+   6.1. Carrier loss was not detected during transfer; in 7.0 C-Kermit
+   checks for this (but results can not be guaranteed). In any case, the
+   protocol will eventually time out if the connection is lost.
+     _________________________________________________________________
+
+    4.0.3. GET and RECEIVE As-Names
+
+   In 5A(190) through 6.0.192, the GET and RECEIVE as-name did not
+   properly override the RECEIVE PATHNAMES setting. In 7.0 it does.
+     _________________________________________________________________
+
+    4.0.4. New Brief Statistics Listing
+
+   Version 7.0 adds a /BRIEF switch to the STATISTICS command, to display
+   a short file-transfer statistics report. /BRIEF is now the default.
+   Use /VERBOSE to see the full display, which is about 25 lines long.
+     _________________________________________________________________
+
+    4.0.5. Improved FAST Command
+
+   The preinstalled definition of the FAST macro did not take enough
+   factors into account. Now it sets packet lengths and window sizes
+   appropriate to the configuration. Furthermore, in IRIX only, it might
+   restrict the SEND packet length to 4000, to work around a bug in the
+   IRIX Telnet server, depending on the IRIX version (see
+   [432]ckubwr.txt, IRIX section). To see the built-in definition of the
+   FAST macro, type "show macro fast". To change it, simply define it to
+   be whatever you want -- it's just a macro, like any other.
+     _________________________________________________________________
+
+    4.0.6. The SET SEND BACKUP Command
+
+   Version 7.0 adds SET SEND BACKUP { ON, OFF }. This tells whether
+   backup files should be sent. Backup files are the ones created by
+   Kermit (and EMACS, and possibly other applications) to preserve old
+   copies of files when creating new ones with the same name. Kermit does
+   this when receiving a file and its FILE COLLISION setting is BACKUP
+   (or RENAME, in which case it the new file gets the backup name). On
+   most platforms, the backup name is formed by adding:
+
+  .~n~
+
+   to the end of the filename, where "n" is a number. For example, if the
+   original file is oofa.txt, a backup file might be called:
+
+  oofa.txt.~1~
+
+   (or oofa.txt.~2~, etc). If you SET SEND BACKUP OFF, this tells Kermit
+   not to send files that have backup names. Normally, SET SEND BACKUP is
+   ON (as shown by SHOW PROTOCOL), and backup files are sent if their
+   names match the SEND file specification.
+
+   Also see PURGE, SET FILE COLLISION, SEND /NOBACKUP, DIRECTORY
+   /[NO]BACKUP.
+     _________________________________________________________________
+
+    4.0.7. The SET { SEND, RECEIVE } VERSION-NUMBERS Command
+
+   VMS Only. Normally when sending files, VMS C-Kermit strips the version
+   number. For example, if the file is FOO.BAR;34, the name is sent as
+   FOO.BAR (without the ";34"). If you want to keep version numbers on
+   when sending files, use SET SEND VERSION-NUMBERS ON. The effect
+   depends on the receiver.
+
+   Normally when receiving files, and an incoming filename includes a
+   VMS-style version number (such as FOO.BAR;34) VMS C-Kermit strips it
+   before trying to create the new file; this way the new file receives
+   the next highest version number in the customary manner for VMS. If
+   you want version numbers on incoming filenames to be used in creating
+   the new files, use SET RECEIVE VERSION-NUMBERS ON.
+
+   Normally these commands would be effective only when VMS C-Kermit is
+   exchanging files with a non-VMS Kermit program, since VMS-to-VMS
+   transfers use labeled mode unless you have gone out of your way to
+   defeat it.
+
+   Example: You want to send all versions of all files in the current
+   directory from a VMS C-Kermit client to a UNIX C-Kermit server. Use:
+
+  set send version-numbers on
+  send *.*;*
+
+   The resulting Unix files will have VMS-style version numbers as part
+   of their name, for example "foo.bar;1", "foo.bar;2", etc.
+
+   Now suppose you want to send these files from Unix to another VMS
+   system and preserve the version numbers. Again we have a Unix C-Kermit
+   server and VMS C-Kermit client. Give these commands to the client:
+
+  set receive version-numbers on
+  get *
+     _________________________________________________________________
+
+    4.0.8. The SET { SEND, RECEIVE } { MOVE-TO, RENAME-TO } Commands
+
+   These commands are persistent global versions of the /MOVE-TO: and
+   /RENAME-TO: switches of the SEND, GET, and RECEIVE commands. They
+   should normally be used only when setting up a dedicated
+   transaction-processing application, in which each file is to be moved
+   or renamed immediately after, and only if, it is transferred
+   successfully, so that (for example) an independent, concurrent process
+   can notice when new files appear and process them immediately without
+   having to guess whether they are complete.
+     _________________________________________________________________
+
+    4.0.9. SET FILE INCOMPLETE AUTO
+
+   SET FILE INCOMPLETE { KEEP, DISCARD }, which tells whether to keep or
+   discard incompletely received files, has a new option, AUTO, which is
+   also the default. It means KEEP the incomplete file if the transfer is
+   in binary mode, otherwise DISCARD it. This reduces the chances that a
+   subsequent recovery operation (RESEND, REGET, etc) could produce a
+   corrupt file, since recovery works only for binary-mode transfers.
+     _________________________________________________________________
+
+  4.1. FILE-TRANSFER FILENAME TEMPLATES
+
+   File-transfer filename templates allow files to be renamed
+   automatically by the file sender, the receiver, or both, during
+   transfer of groups of files.
+
+    4.1.1. Templates in the As-Name
+
+   Prior to C-Kermit 6.1 and Kermit 95 1.1.12 the only options that could
+   be used to affect the names of files being transferred were SET
+   FILENAMES { LITERAL, CONVERTED } and SET { SEND, RECEIVE } PATHNAMES {
+   ON, OFF }, plus the "as-name" feature of the SEND (MOVE, etc) and
+   RECEIVE commands.
+
+   Previously, the as-name could be used only for a single file. For
+   example:
+
+  SEND FOO BAR
+
+   would send the file FOO under the name BAR, but:
+
+  SEND *.TXT anything
+
+   was not allowed, since it would give the same name to each file that
+   was sent. When receiving:
+
+  RECEIVE FOO
+
+   would rename the first incoming file to FOO before storing it on the
+   disk, but subsequent files would not be renamed to FOO, since this
+   would result in overwriting the same file repeatedly. Instead, they
+   were stored under the names they arrived with.
+
+   Beginning in C-Kermit 6.1 and Kermit 95 1.1.12, it is possible to
+   specify as-names in SEND, RECEIVE, and related commands even for file
+   groups. This is accomplished by using replacement variables in the
+   as-name, along with optional material such character-string functions
+   and/or constant strings. An as-name containing replacement variables
+   is called a filename template.
+
+   The key to filename templates is the new variable:
+
+  \v(filename)
+
+   During file transfer it is replaced by the name of each file currently
+   being transferred (after transfer, it is the name of the last file
+   transferred).
+
+   So, for example:
+
+  send *.txt \v(filename).new
+
+   sends each file with its own name, but with ".new" appended to it. Of
+   course if the name already contains periods, this could confuse the
+   file receiver, so you can also achieve fancier effects with
+   constructions like:
+
+  send *.txt \freplace(\v(filename),.,_).new
+
+   which replaces all periods in the original filename by underscores,
+   and then appends ".new" to the result. So, for example, oofa.txt would
+   be sent as oofa_txt.new.
+
+   Another new variable that is useful in this regard is \v(filenumber),
+   which is the ordinal number of the current file in the file group, so
+   you can also:
+
+  send *.txt FILE\flpad(\v(filenum),2,0)
+
+   resulting in a series of files called FILE00, FILE01, FILE02, etc. (At
+   the end of the transfer, \v(filenum) tells the number of files that
+   were transferred).
+
+   If you specify a constant as-name when sending a file group:
+
+  send *.txt thisnameonly
+
+   Kermit complains and asks you to include replacement variables in the
+   as-name. You should generally use \v(filename) or \v(filenumber) for
+   this purpose, since other variables (with the possible exception of
+   date/time related variables) do not change from one file to the next.
+   But Kermit accepts any as-name at all that contains any kind of
+   variables for file group, even if the variable will not change. So:
+
+  send *.txt \%a
+
+   is accepted, but all files are sent with the same name (the value of
+   \%a, if it has one and it is constant). If the variable has no value
+   at all, the files are sent under their own names.
+
+   Of course, the value of \%a in the previous example need not be
+   constant:
+
+  define \%a FILE\flpad(\v(filenum),2,0)_at_\v(time)
+  send *.txt \%a
+
+   The RECEIVE command, when given without an as-name, behaves as always,
+   storing all incoming files under the names they arrive with, subject
+   to SET FILE NAME and SET RECEIVE PATHNAMES modifications ([433]Section
+   4.10).
+
+   However, when an as-name is given in the RECEIVE command, it is
+   applied to all incoming files rather than to just the first. If it
+   does not contain replacement variables, then the current FILE
+   COLLISION setting governs the result. For example:
+
+  receive foo
+
+   will result in incoming files named foo, foo.~1~, foo.~2~, and so on,
+   with the default FILE COLLISION setting of BACKUP. If it does contain
+   replacement variables, of course they are used.
+
+   When receiving files, the \v(filename) variable refers to the name
+   that was received in the incoming file-header packet, BEFORE any
+   processing by SET FILE NAMES or SET RECEIVE PATHNAMES. Since the
+   filenames in file-header packets are usually in uppercase, you would
+   need to convert them explicitly if you want them in lowercase, e.g.:
+
+  receive \flower(\v(filename)).new
+     _________________________________________________________________
+
+    4.1.2. Templates on the Command Line
+
+   On the command-line, use templates as shown above as the -a option
+   argument, bearing in mind the propensity of UNIX and perhaps other
+   shells to treat backslash as a shell escape character. So in UNIX (for
+   example):
+
+  kermit -s oofa.* -a x.\\v(filenum)
+
+   By the way, this represents a change from 6.0 and earlier releases in
+   which the as-name (-a argument or otherwise) was not evaluated by the
+   command parser. Thus, for example, in VMS (where the shell does not
+   care about backslashes), it was possible to:
+
+  kermit -s oofa.txt -a c:\tmp\oofa.txt
+
+   Now backslashes in the as-name must be quoted not only for the shell
+   (if necessary) but also for Kermit itself:
+
+  kermit -s oofa.txt -a c:\\tmp\\oofa.txt      ; Kermit only
+  kermit -s oofa.txt -a c:\\\\tmp\\\\oofa.txt  ; Shell and Kermit
+
+   You can also use the \fliteral() function for this:
+
+  kermit -s oofa.txt -a \fliteral(c:\tmp\oofa.txt)      ; Kermit only
+  kermit -s oofa.txt -a \\fliteral(c:\\tmp\\oofa.txt)   ; Shell and Kermit
+     _________________________________________________________________
+
+    4.1.3. Post-Transfer Renaming
+
+   Filename templates are now also useful in SET { SEND, RECEIVE }
+   RENAME-TO and in the /RENAME-TO: switch, that can be given to the
+   SEND, GET, or RECEIVE commands; this is similar to an as-name, but is
+   effective on a per-file basis if and only if the file was transferred
+   successfully.
+
+   MOVE-TO and RENAME-TO address a requirement commonly stated for
+   transaction processing and similar systems. Suppose, for example, a
+   central system "X" accepts connections from multiple clients
+   simultaneously; a process on X waits for a file to appear and then
+   processes the file. This process must have a way of knowing when the
+   file has been completely and successfully transferred before it starts
+   to process it. This can be accomplished easily using C-Kermit's SET {
+   SEND, RECEIVE } { MOVE-TO, RENAME-TO } command or /MOVE-TO: or
+   /RENAME-TO: switches, described in [434]Sections 4.7.1 through
+   [435]4.7.3.
+
+   Here's an example for the client side, in which files to be sent are
+   placed in a certain directory (/usr/olga/tosend in this example) by
+   another process when they are ready to go. This might be in a hospital
+   or big doctor's office, where medical insurance claims are entered at
+   a number of workstations, and then deposited in the "tosend"
+   directory, from which they are sent to a claims clearinghouse. We
+   assume the connection is already made and a Kermit server is on the
+   other end.
+
+  local srcdir findir              ; Declare local (automatic) variables
+  assign srcdir /usr/olga/tosend   ; Local source directory (files to send)
+  assign findir /usr/olga/sent     ; Where to move files after they are sent
+  log transactions                 ; Keep a log of transfers
+  cd \m(srcdir)                    ; Change to the source directory
+  while true {                     ; Loop forever...
+      send /move-to:\m(findir) *   ; Send all files
+      sleep 60                     ; Sleep a minute
+  }                                ; Go back and do it again
+
+   Note how simple this is. Once each file is sent, it is moved so it
+   won't be sent again (you could also use SEND /RENAME-TO: or even SEND
+   /DELETE). If a transfer fails, the file is not moved and so we try
+   again to send it next time around. If there are no files to send, the
+   SEND command does nothing but a message is printed; you can avoid the
+   message by checking first to see if any files are in the directory:
+
+  while true {                     ; Loop forever...
+      if > \ffiles(*) 0 -          ; If there are any files
+        send /move-to:\m(findir) * ; send them.
+      sleep 60                     ; Sleep a minute.
+  }                                ; Go back and do it again.
+
+   It's even simpler on the server side (here again we assume the
+   connection is already in place):
+
+  local rcvdir findir              ; Declare local (automatic) variables
+  assign rcvdir /usr/ivan/tmp      ; Temporary receiving directory
+  assign findir /usr/ivan/new      ; Where to move files after reception
+  log transactions                 ; Keep a log of transfers
+  cd \m(rcvdir)                    ; Change to the source directory
+  set receive move-to \m(findir)   ; Declare move-to directory.
+  server                           ; Enter server mode.
+
+   A separate process (e.g. the medical claim-form decoder) can look for
+   files appearing in the /usr/ivan/new directory and process them with
+   every confidence that they have been completely received.
+
+   Note that the use of MOVE-TO can result in moved files overwriting one
+   another (the application would normally avoid this by assigning each
+   transaction a unique, e.g. based on customer number and claim number).
+   But if filename collisions are a possibility in your application,
+   RENAME-TO might be a better choice; you can use any variables you like
+   in the template to ensure uniqueness of the RENAME-TO filename; for
+   example:
+
+  SET RECEIVE RENAME-TO \v(filename)_\v(ndate)_\v(ntime)_\v(userid)_\v(pid)
+     _________________________________________________________________
+
+  4.2. FILE-TRANSFER PIPES AND FILTERS
+
+    4.2.1. INTRODUCTION
+
+   Beginning in C-Kermit 6.1 and Kermit 95 1.1.12, it is possible to send
+   from a command, or "pipe", as well as from a file, and to receive to a
+   pipe or command. In a typical example, we might want to transfer an
+   entire directory tree from one UNIX system to another (but without
+   using the methods described in [436]Sections 4.3 , [437]4.10,
+   [438]4.11, and [439]4.15). We could do this in multiple steps as
+   follows:
+
+  1. Create a tar archive of the desired directory tree
+  2. Compress the tar archive
+  3. Transfer it in binary mode to the other computer
+  4. Decompress it
+  5. Extract the directory tree from the tar archive
+
+   But this is inconvenient and it requires a temporary file, which might
+   be larger than we have room for.
+
+   The new pipe-transfer feature lets you do such things in a single
+   step, and without intermediate files.
+
+   Additional new features, also discussed here, let you specify pre- and
+   post- processing filters for outbound and incoming files, and give you
+   a way to insert the output from shell or system commands into C-Kermit
+   commands.
+
+   The file-transfer related features are available only with Kermit
+   protocol, not with any external protocols, nor with K95's built-in
+   XYZMODEM protocols (because XYZMODEM recovers from transmission errors
+   by rewinding the source file, and you can't rewind a pipe).
+
+   This section begins by discussing the simple and straightforward use
+   of these features in UNIX, in which pipes and input/output redirection
+   are a fundamental component and therefore "just work", and then goes
+   on to discuss their operation in Windows and OS/2, where matters are
+   much more complicated.
+     _________________________________________________________________
+
+    4.2.1.1. TERMINOLOGY
+
+   Standard Input
+          This is a precise technical term denoting the normal source of
+          input for a command or program, which is the keyboard of your
+          terminal by default, but which can be redirected to a file or
+          pipe.
+
+   Stdin
+          Abbreviation for Standard Input.
+
+   Standard Output
+          A precise technical term denoting the normal destination for
+          output from a command or program, which is your terminal screen
+          by default, but which can be redirected to a file.
+
+   Stdout
+          Abbreviation for Standard Output.
+
+   Stdio
+          Abbreviation for Standard Input / Standard Output.
+
+   I/O
+          Abbreviation for Input / Output.
+
+   Shell
+          Text-based system command processor, such as the UNIX shell,
+          DOS COMMAND.COM, etc.
+
+   Pipe
+          A mechanism by which the standard output of one program is sent
+          to the standard input of another.
+
+   Pipeline
+          A series of programs connected by pipes.
+     _________________________________________________________________
+
+    4.2.1.2. NOTATION
+
+   In command descriptions, "command" is replaced by a shell or system
+   command or pipeline. The command names specified in these commands are
+   interpreted by your shell, just as if you were typing them at the
+   shell prompt, and so if they are in your PATH, they will be found in
+   the expected manner. Therefore you don't have to specify complete
+   pathnames for commands that are programs (but it shouldn't hurt if you
+   do).
+
+   The normal notation for I/O redirection is as follows:
+
+  <  Read Stdin from the given file.
+  >  Send Stdout to the given file.
+  |  Send Stdout from the command on the left to the command on the right.
+
+   Examples:
+
+   sort < foo > bar
+          Sorts the lines in file "foo" and writes the results to file
+          "bar"
+
+   grep -c "some text" *.txt | grep -v ":0" | sort | pr -3 | lpr
+          This is a command pipeline composed of 5 commands:
+
+   grep -c "some text" *.txt
+          Looks in all files whose names end with ".txt" for the string
+          "some text" and writes to Stdout the names of each file
+          followed by a colon and the number of occurrences in each.
+
+   grep -v ":0"
+          Prints to Stdout the lines from Stdin that do NOT contain the
+          string ":0", in this case, it removes the names of files that
+          do not contain "some text".
+
+   sort
+          Sorts the lines from Stdin alphabetically to Stdout.
+
+   pr -3
+          Arranges the lines from Stdin in three columns.
+
+   lpr
+          Prints its Stdin on the default printer.
+
+   Note that the Kermit features described here work only with commands
+   that use Stdio. If you attempt to use them with commands whose input
+   and output can not be redirected, Kermit will most likely get stuck.
+   Kermit has no way of telling how an external command works, nor what
+   the syntax of the shell is, so it's up to you to make sure you use
+   these features only with redirectable commands.
+
+   The quoting rules of your shell apply to the command. Thus in UNIX,
+   where C-Kermit tries to use your preferred shell for running commands,
+   shell "metacharacters" within commands must be escaped if they are to
+   be taken literally, using the methods normal for your shell. For
+   example, the UNIX tr (translate) command must have its arguments in
+   quotes:
+
+  tr "[a-z]" "[A-Z]"
+
+   otherwise the shell is likely to replace them by all filenames that
+   match, which is probably not what you want. This is also true when
+   using your shell directly, and has nothing to do with Kermit.
+     _________________________________________________________________
+
+    4.2.1.3. SECURITY
+
+   Some sites might not wish to allow access to system commands or
+   external programs from within Kermit. Such access, including all the
+   features described here, can be disabled in various ways:
+
+    1. When building from source code, include -DNOPUSH among the CFLAGS.
+    2. At runtime, give the NOPUSH command.
+    3. For server mode, give the DISABLE HOST command.
+    4. Implicit use of pipes can be disabled as described in [440]Section
+       4.2.4.
+
+   Note: 3 and 4 are not necessary if you have done 1 or 2.
+     _________________________________________________________________
+
+    4.2.2. Commands for Transferring from and to Pipes
+
+   SEND /COMMAND sends data from a command or command pipeline, and
+   RECEIVE /COMMENT writes data to a command or pipeline. The GET
+   /COMMAND command asks a server to send material, and then writes the
+   incoming material to a command or pipeline. These features, along with
+   switches (like "/COMMAND", described in [441]Section 4.7) are new to
+   C-Kermit 6.1. The following synonyms are also provided:
+
+  CSEND    = SEND /COMMAND
+  CRECEIVE = RECEIVE /COMMAND
+  CGET     = GET /COMMAND
+
+   None of these commands can be used if a SEND or RECEIVE FILTER
+   (respectively, [442]Section 4.2.3) is in effect, or if a NOPUSH
+   command ([443]Section 4.2.1.3) has been given, or if the current
+   protocol is not Kermit.
+     _________________________________________________________________
+
+    4.2.2.1. Sending from a Command
+
+   SEND /COMMAND command [ as-name ]
+   SEND /AS-NAME:as-name /COMMAND command
+   CSEND command [ as-name ]
+          These three forms are the same. They work like the SEND
+          command, but instead of sending a file, it sends the standard
+          output of the given command, either under the command's own
+          name, or else with the given as-name. If the command contains
+          spaces, it must be enclosed in braces. Braces should also be
+          used for the as-name if it contains spaces. If braces are
+          included around either the command or the as-name, they are
+          removed after parsing but before use. As with SEND, the
+          transfer is in text or binary mode according the current FILE
+          TYPE setting, unless you override the global transfer mode by
+          including a /TEXT or /BINARY switch. The command must require
+          no input.
+
+   When sending from a command or pipeline, C-Kermit has no way of
+   knowing in advance how much data will be sent, and so it can not send
+   the size to the other Kermit in the Attribute packet, and so the
+   receiving Kermit has no way of displaying "percent done" or a progress
+   bar (thermometer).
+
+   Examples that make sense in text mode (illustrated by common UNIX
+   commands):
+
+   SEND /COMMAND finger
+   CSEND finger
+          sends the current "finger" listing (who's logged in) under the
+          name "finger". The two forms "send /command" and "csend" are
+          equivalent; we won't bother showing them both in the rest of
+          the examples.
+
+   SEND /COMMAND:{finger}
+   CSEND {finger}
+          Same as previous example (braces are removed from "{finger}").
+
+   SEND /COMMAND:{ finger }
+   CSEND { finger }
+          Same as previous example, but note that the spaces are kept.
+          This does not prevent the shell from running the "finger"
+          program, but its output is sent under the name " finger " (with
+          a leading and trailing space).
+
+   SEND /COMMAND:finger /AS-NAME:userlist
+   CSEND finger userlist
+          sends the current finger listing under the name "userlist".
+
+   SEND /COMMAND:{finger | sort -r} /AS-NAME:userlist
+   CSEND {finger | sort -r} userlist
+          sends the current finger listing, sorted in reverse order,
+          under the name "userlist". The braces are needed to distinguish
+          the command from the as-name.
+
+   SEND /COMMAND:{finger | sort -r} /AS-NAME:{userlist}
+   CSEND {finger | sort -r} {userlist}
+          Same as previous example (braces are removed from
+          "{userlist}").
+
+   SEND /COMMAND:{finger | sort -r}
+          /AS-NAME:{\freplace(\v(filename),\32,_)}
+
+   CSEND {finger | sort -r} {\freplace(\v(filename),\32,_)}
+          Like the previous example, but sends the output of the command
+          under the name of the command, but with all spaces (\32)
+          replaced by underscores, so the as-name is "finger_|_sort_-r".
+
+   Examples that make sense in binary mode (three equivalent forms are
+   shown):
+
+   SEND /COMMAND /BINARY {tar cf - . | gzip -c} mydir.tar.gz
+   SEND /COMMAND /BINARY /AS-NAME:mydir.tar.gz {tar cf - . | gzip -c}
+   CSEND /BINARY {tar cf - . | gzip -c} mydir.tar.gz
+          Makes a tar archive of the current directory, compresses it
+          with the GNU gzip program, and sends it as "mydir.tar.gz". The
+          other Kermit can, of course, just store it as a file, or it can
+          use CRECEIVE to uncompress and dearchive it as part of the
+          transfer process.
+
+   When using a "pipeline" of commands in the command field, obviously,
+   the first command must not require any input, and the last command
+   should produce some output, and all intermediate commands should get
+   some input and produce some output.
+     _________________________________________________________________
+
+    4.2.2.2. Receiving to a Command
+
+   RECEIVE /COMMAND command
+   CRECEIVE command
+          This is like RECEIVE, except incoming material is written to
+          the standard input of the given command, in text or binary mode
+          according to the normal rules for file reception. Be sure to
+          include a redirector to a file (if the command normally writes
+          to standard output), or the output of the command won't go
+          anywhere. The command may contain spaces; braces are not
+          needed, but they are removed if used.
+
+   WARNING: C-Kermit has no way of knowing anything about the command, or
+   even whether it is a command. Thus this command will always cause
+   C-Kermit to enter protocol mode, as long as some text is specified in
+   the command field. However, if the text does not correspond to a
+   command, the transfer will eventually fail with a message such as
+   "Error writing data" or "Failure to close file".
+
+   Examples for text mode (in UNIX):
+
+   RECEIVE /COMMAND sort -r > reverse.txt
+   CRECEIVE sort -r > reverse.txt
+          The text that is received is sorted in reverse order and stored
+          in the file "reverse.txt". The two forms shown are equivalent.
+
+   RECEIVE /COMMAND {sort -r > reverse.txt}
+   CRECEIVE {sort -r > reverse.txt}
+          The same as the previous example; if braces are included, they
+          are simply removed.
+
+   RECEIVE /COMMAND {sort -r > \flower(\v(filename)).reverse}
+   CRECEIVE {sort -r > \flower(\v(filename)).reverse}
+          Same but stores result under the incoming filename, lowercased,
+          and with ".reverse" appended to it.
+
+   RECEIVE /COMMAND sort
+   CRECEIVE sort
+          Does nothing useful, since the output of sort has nowhere to
+          go.
+
+   RECEIVE /COMMAND sort -r | pr -3 | lpr -Plaserjet
+   CRECEIVE sort -r | pr -3 | lpr -Plaserjet
+          The text that is received is sorted in reverse order, arranged
+          into three columns, and sent to the "laserjet" printer.
+
+   Examples for binary mode:
+
+   RECEIVE /COMMAND:{gunzip -c | tar xf -}
+   CRECEIVE {gunzip -c | tar xf -}
+          Assuming the data that is received is a compressed tar archive,
+          uncompresses the archive and passes it to tar for extraction.
+          In this case the braces are needed because otherwise the final
+          "-" would be taken as a command continuation character (see
+          [444]Using C-Kermit, 2nd Edition, p.33).
+
+   GET /COMMAND remote-file command
+   GET /COMMAND /AS-NAME:command remote-file
+   CGET remote-file command
+          This command tells the Kermit client to send a GET request for
+          the given remote file to a Kermit server. Unlike GET, however,
+          the incoming material is written to a command, rather than to a
+          file. If the remote-file or the command contain spaces, they
+          must be enclosed in braces. The same cautions about the command
+          apply as for CRECEIVE.
+
+   Examples (for UNIX):
+
+   GET /COMMAND oofa.txt sort -r > oofa.new
+   GET /COMMAND {oofa.txt} {sort -r > oofa.new}
+   CGET oofa.txt sort -r > oofa.new
+   CGET {oofa.txt} {sort -r > oofa.new}
+          These four are equivalent. Each of them requests the server to
+          send its "oofa.txt" file, and as it arrives, it is sorted in
+          reverse order and written to "oofa.new".
+
+   GET /COMMAND {profile exec a} lpr
+   GET /COMMAND {profile exec a} {lpr}
+   GET /COMMAND /AS-NAME:lpr {profile exec a}
+   GET /COMMAND /AS-NAME:{lpr} {profile exec a}
+   GET /COMMAND /AS:lpr {profile exec a}
+   CGET {profile exec a} lpr
+   CGET {profile exec a} {lpr}
+          Here the remote filename contains spaces so it MUST be enclosed
+          in braces. As it arrives it is sent to the lpr program for
+          printing. Braces are optional around "lpr" since it contains no
+          spaces.
+
+   GET /COMMAND *.txt {cat >> new.txt}
+   GET /AS-NAME:{cat >> new.txt} /COMMAND *.txt
+   CGET *.txt {cat >> new.txt}
+          This gets all the ".txt" files from the server and concatenates
+          them all into a single "new.txt" file on the client.
+
+   GET /COMMAND *.txt {echo \v(filename)>>new.txt;cat>>new.txt}
+   CGET *.txt {echo \v(filename)>>new.txt;cat>>new.txt}
+          As above, but inserts each file's name before its contents.
+     _________________________________________________________________
+
+    4.2.3. Using File-Transfer Filters
+
+   The commands described in [445]Section 4.2.2 let you send the output
+   of a command, or receive data into a command. But what if you want to
+   specify preprocessing for files that you send, or postprocessing of
+   files that you receive, even when multiple files are involved? For
+   this you need a way to specify send and receive filters. The commands
+   are SET SEND FILTER and SET RECEIVE FILTER; SHOW PROTOCOL displays the
+   current settings.
+
+    4.2.3.1. The SEND Filter
+
+   SET SEND FILTER [ command ]
+          This command specifies a command to be run on any file that you
+          SEND (or MOVE, MSEND, etc). It also applies to files sent when
+          in server mode, in response to GET commands, but not to the
+          results of REMOTE commands like REMOTE DIRECTORY, REMOTE TYPE,
+          REMOTE HOST, etc. The command may be, but need not be, enclosed
+          in braces; if it is, the braces are stripped before use. The
+          output of this command is sent, rather than the file itself.
+          The current FILE TYPE setting (TEXT or BINARY) applies to the
+          output of the command. The command must contain at least one
+          instance of \v(filename), for which the name of the actual file
+          is substituted. If the command is omitted, the send filter is
+          removed and files are sent in the normal manner.
+
+   The SET SEND FILTER sets up a "global" filter -- that is, one that
+   applies to all subsequent file-sending commands until you change or
+   remove it. You can also specify a "local" filter to be used in a
+   specific file-sending command by using the /FILTER switch (see
+   [446]Section 1.5); for example:
+
+  SEND /FILTER:command [ other-switches ] filename
+
+   Besides \v(filename), you can include any other script programming
+   notation in the send filter: variable names, array references, calls
+   to built-in string or other functions, and so on. These are evaluated
+   during file transfer, NOT during parsing, and they are evaluated
+   separately for each file.
+
+   When the SEND or MOVE (SEND /DELETE) command is used with a send
+   filter, the output from the filter is sent under the file's original
+   name unless you specify an "as-name" or template. The Attribute packet
+   (if any) contains the original file's attributes (size, creation date,
+   etc). So (for example) if the filter changes the file's size, the
+   progress thermometer might be wrong. (We can't send the size of the
+   output from the filter, because it is not known until the transfer is
+   finished.) If you prefer that the size not be sent, use "set
+   attributes size off".
+
+   You can not use send filters with RESEND (SEND /RECOVER) or PSEND
+   (SEND /START).
+
+   Examples for text mode:
+
+   SET SEND FILTER sort -r \v(filename) ; Braces may be omitted
+   SET SEND FILTER {sort -r \v(filename)} ; Braces may be included
+   SEND *.txt
+          This sends every file in the current directory whose name ends
+          with ".txt" under its own name, but with its lines sorted in
+          reverse order.
+
+   SEND /FILTER:{sort -r \v(filename)} *.txt
+          Same as above, but the filter applies only to this SEND
+          command. Braces are required in this case.
+
+   SET SEND FILTER {sort -r \v(filename)}
+   SEND oofa.txt reverse.txt
+          Sends the oofa.txt file with its lines sorted in reverse order
+          under the name "reverse.txt".
+
+   SET SEND FILTER {sort -r \v(filename)}
+   SEND oofa.* \v(filename).reverse
+          Sends all the oofa.* files with their lines sorted in reverse
+          order; each file is sent under its own name but with ".reverse"
+          appended to it.
+
+   SET SEND FILTER {tr "[a-z]" "[A-Z]" < \v(filename)}
+   SEND *.txt
+          Sends all ".txt" files under their own names, but uppercasing
+          their contents.
+
+   Note that the SEND FILTER applies not only to files that are sent with
+   SEND, MOVE, MSEND, etc, but also to files sent by the C-Kermit server
+   in response to GET requests.
+
+   Examples for binary mode:
+
+   SET SEND FILTER {gzip -c \v(filename)}
+   SEND /BINARY oofa.txt oofa.txt.gz
+          Sends the oofa.txt file, compressed by gzip, as oofa.txt.gz.
+
+   SEND /BINARY /FILTER:{gzip -c \v(filename)} oofa.txt oofa.txt.gz
+          As above, but the filter applies only to this SEND command.
+
+   SET SEND FILTER {gzip -c \v(filename)}
+   SEND /BINARY oofa.* \fupper(\replace(\v(filename),.,_)).GZ
+          Sends all the oofa.* files, compressed by gzip, each under its
+          own name, but with the name uppercased, all periods within the
+          name converted to underscores, and ".GZ" appended to it. So,
+          for example, "oofa.txt" is sent as "OOFA_TXT.GZ".
+
+   In the gzip examples, note that the amount of data that is sent is
+   normally less than the original file size because gzip compresses the
+   file. But Kermit sends the original file size ahead in the attribute
+   packet anyway (unless you tell it not too). Thus the transfer will
+   probably appear to terminate early, e.g. when the receiver's
+   file-transfer display thermometer is only at 40%. If this annoys you,
+   tell Kermit to "set attribute length off". On the other hand, you can
+   use the final position of the thermometer as a measure of the
+   effectiveness of compression.
+     _________________________________________________________________
+
+    4.2.3.2. The RECEIVE Filter
+
+   SET RECEIVE FILTER [ command ]
+          This command specifies that the given command will be run on
+          any file that is received before it is written to disk. The
+          command may be, but need not be, enclosed in braces; if it is
+          the braces are stripped before use. The following two commands
+          are equivalent:
+
+  SET RECEIVE FILTER sort -r > \v(filename)
+  SET RECEIVE FILTER {sort -r > \v(filename)}
+
+   The RECEIVE filter command may contain a "\v(filename)" sequence to be
+   replaced by the incoming filename from the file header packet, but it
+   is not required. However you must use it whenever your filter would
+   normally write to Stdout, otherwise its output will be lost.
+
+   The RECEIVE filter command may contain one or more "\v(filename)"
+   sequence to be replaced by the incoming filename from the file header
+   packet, but it is not required. However you must use it whenever your
+   filter would normally write to Stdout, otherwise its output will be
+   lost.
+
+   RECEIVE /FILTER:command and GET /FILTER:command can also be used to
+   specify a filter to be used for only one file-transfer operation.
+
+   UNIX examples for text mode:
+
+   SET RECEIVE FILTER lpr
+   RECEIVE
+          All the files that are received are sent to the default UNIX
+          print spooler.
+
+   RECEIVE /FILTER:lpr
+          Same as above, except the lpr filter is used only with this
+          RECEIVE command.
+
+   RECEIVE lpr
+          This is probably not what you want; it creates a file called
+          lpr.
+
+   SET RECEIVE FILTER {sort -r > \v(filename)}
+   RECEIVE
+          Stores each incoming file with its lines sorted in reverse
+          order, under its own name.
+
+   RECEIVE /FILTER:{sort -r > \v(filename)}
+          As above, but the filter is used only for this RECEIVE command.
+
+   SET RECEIVE FILTER sort -r > \v(filename)
+   RECEIVE reverse.txt
+          Stores each incoming file with its lines sorted in reverse
+          order, under the name "reverse.txt". The actual result depends
+          on the FILE COLLISION setting. If it is OVERWRITE and multiple
+          files arrive, then each incoming file destroys the previous
+          one. If it is BACKUP (the default), filename conflicts are
+          resolve by adding "version numbers" to the filenames:
+          reverse.txt, reverse.txt.~1~, reverse.txt.~2~, etc.
+
+   SET RECEIVE FILTER sort -r > \v(filename)
+   RECEIVE \v(filename).reverse
+          Stores each incoming file with its lines sorted in reverse
+          order, under the name it arrived with, but with ".reverse"
+          appended to it.
+
+   SET RECEIVE FILTER sort -r > \v(filename)
+   RECEIVE \flower(\v(filename)).reverse
+          Like the previous example, but ensures that the filename is
+          lowercase.
+
+          Examples for binary mode:
+
+   SET RECEIVE FILTER gunzip -c > \v(filename)
+   RECEIVE
+          This receives one or more presumably compressed file and
+          uncompresses each one into a file having the same name it was
+          sent with. For example, if the file is sent with the name
+          OOFA.TXT.GZ, it is stored with that name, even after
+          decompression.
+
+   SET RECEIVE FILTER gunzip -c > \v(filename)
+   RECEIVE \flower(\fsubstring(\v(filename),1,\flength(\v(filename))-3))
+          Like the previous example, but the resulting filename has its
+          rightmost three characters removed from it and the remainder is
+          lowercased. So if the incoming filename is OOFA.TXT.GZ, it is
+          stored as oofa.txt after decompression.
+
+   Of course you don't want to type such long hideous commands, so we
+   have also introduced several new functions:
+
+   \fstripx(string[,character])
+          This function removes the rightmost segment of the string that
+          starts with the given character. If no character is given,
+          period (.) is used. Thus it is most conveniently used for
+          stripping the extension from a filename (or the decimal portion
+          from a floating-point number written in US/UK style). Examples:
+
+   \fstripx(OOFA.TXT.GZ)             => OOFA.TXT
+   \fstripx(OOFA.TXT.GZ,.)           => OOFA.TXT
+   \fstripx(OOFA.TXT.GZ,X)           => OOFA.T
+   \fstripx(\fstripx(OOFA.TXT.GZ))   => OOFA
+   \fstripx($100.00)                 => $100
+
+   \fstripn(string,number)
+          Removes the rightmost number characters from the string.
+          Examples:
+
+   \fstripn(OOFA.TXT.GZ)             => OOFA.TXT.GZ
+   \fstripn(OOFA.TXT.GZ,3)           => OOFA.TXT
+   \fstripn(OOFA.TXT.GZ,7)           => OOFA
+
+   \fstripb(string[,c1[,c2]])
+          Strips enclosing matching braces, brackets, parentheses, or
+          quotes from the string. The second argument, c1, specifies
+          which kind of enclosure to look for; if not specified, any
+          enclosing (), [], <>, {}, "", '', or `' are removed. If c1 is
+          specified and c2 is not, then if c1 is an opening brace,
+          bracket, or parenthesis, the matching closing one is supplied
+          automatically as c2. If both c1 and c2 are specified, then to
+          be stripped the string must begin with c1 and end with c2. If
+          the string is not enclosed in the indicated manner, the result
+          is the original string. Examples:
+
+   \fstripb("abc")                   => abc
+   \fstripb([abc])                   => abc
+   \fstripb([abc)                    => [abc
+   \fstripb(<abc>)                   => abc
+   \fstripb(<abc>,[)                 => <abc>
+   \fstripb((abc))                   => abc
+   \fstripb((abc),[)                 => (abc)
+   \fstripb((abc),{(})               => abc
+   \fstripb(+abc+)                   => +abc+
+   \fstripb(+abc+,+)                 => abc
+   \fstripb(+abc+,+,^)               => +abc+
+   \fstripb(+abc^,+,^)               => abc
+   \fstripb('abc')                   => abc
+   \fstripb(`abc')                   => abc
+   \fstripb(``abc'')                 => `abc'
+   \fstripb(\fstripb(``abc''))       => abc
+
+          Notice the special syntax required for including a literal
+          parenthesis in the argument list. As the last two examples
+          illustrate, \fstripb() strips only one level at at a time;
+          nesting can be used to strip a small fixed number of levels;
+          loops can be used to strip larger or indeterminate numbers of
+          levels.
+
+   \flop(string[,char])
+          Removes the leftmost segment of the string that ends with the
+          given character. If no character is given, period (.) is used.
+          Examples:
+
+  \flop(OOFA.TXT.GZ)               => TXT.GZ
+  \flop(OOFA.TXT.GZ,.)             => TXT.GZ
+  \flop(OOFA.TXT.GZ,X)             => T.GZ
+
+          To remove the leftmost number characters, just use
+          \fsubstring(s,number+1). To return the rightmost number
+          characters, use \fright(s,number).
+
+   So the hideous example:
+
+  receive \flower(\fsubstring(\v(filename),1,\flength(\v(filename))-3))
+
+   can now be written as:
+
+  receive \flower(\fstripx(\v(filename)))
+
+   That is, the filename stripped of its extension and then lowercased.
+   This is not only shorter and less hideous, but also does not depend on
+   the length of the extension being 3.
+
+   Note that when a receive filter is in effect, this overrides your FILE
+   COLLISION setting, since Kermit has no way of knowing what the final
+   destination filename will be (because it does not know, and can not be
+   expected to know, the syntax of every version of every command shell
+   on every platform on the planet).
+     _________________________________________________________________
+
+    4.2.4. Implicit Use of Pipes
+
+   If you wish, C-Kermit can also examine incoming filenames to see if
+   they start with "!", and if so, the subsequent text is treated as a
+   command to read from or write to. For example, if a Kermit client is
+   given the following command:
+
+  get {!finger | sort}
+
+   the server on the other end, if it supports this feature, will run the
+   "finger" program, pipe its standard output to the "sort" program, and
+   send sort's standard output back to you. Similarly, if you:
+
+  send oofa.txt !sort -r > oofa.new
+
+   or, equivalently:
+
+  send oofa.txt {!sort -r > oofa.new}
+
+   or:
+
+  send /as-name:{!sort -r > oofa.new} oofa.txt
+
+   this has the receiver send the contents of the incoming oofa.txt file
+   to the sort program, which sorts the text in reverse order and stores
+   the result in oofa.new.
+
+   This use of the exclamation mark should be familiar to UNIX users as
+   the "bang" feature that lets you run an external application or
+   command from within another application.
+
+   Kermit's "bang" feature is disabled by default, since it is not
+   unheard for filenames to actually begin with "!". So if you want to
+   use this feature, you must enable it with the following command:
+
+   SET TRANSFER PIPES { ON, OFF }
+          ON enables the recognition of "!" notation in incoming
+          filenames during file transfer as an indicator that the
+          remaining text is the name of a command. OFF, the default,
+          disables this feature and uses the text as a filename in the
+          normal fashion. This command does NOT affect SEND /COMMAND, GET
+          /COMMAND, CSEND, etc.
+
+   So using a combination of CSEND (SEND /COMMAND) and the "bang"
+   feature, you can transfer a directory tree all in one command
+   (assuming the remote Kermit supports pipe transfers and has them
+   enabled):
+
+  CSEND {tar cf - . | gzip -c} {!gunzip -c | tar xf -}
+
+   or:
+
+  SEND /COMMAND:{tar cf - . | gzip -c} /as:{!gunzip -c | tar xf -}
+
+   Pay close attention to the syntax. Braces are needed around the
+   command because it contains spaces; braces are needed around the
+   as-name because it ends with "-". The as-name must begin with "!" or
+   receiving Kermit will not recognize it as a command. The CSEND command
+   must NOT begin with "!" unless you are running a command whose name
+   really does start that character.
+
+   Similarly, you have a Kermit server send a directory tree to be
+   unpacked on the client end:
+
+  CGET {!tar cf - . | gzip -c} {gunzip -c | tar xf -}
+
+   or:
+
+  GET /COMMAND {!tar cf - . | gzip -c} /as:{gunzip -c | tar xf -}
+
+   Notice how, in this case, the bang is required in the remote command,
+   to distinguish it from a filename, but not in the local command, since
+   by definition of CGET (or GET /COMMAND), it is known to be a command.
+
+   SEND and RECEIVE FILTERs supersede the bang feature. For example, if a
+   file arrives under the name "!gunzip -c | tar xf -", but the receiving
+   Kermit also has been given a command like:
+
+  set receive filter sort -r > \v(filename)
+
+   then the incoming data will be sorted rather than gunzipped.
+
+   Finally, if SET TRANSFER PIPES is ON (and in this case, this must be
+   done in your C-Kermit initialization file), you can send from a pipe
+   on the C-Kermit command line:
+
+  kermit -s "!finger | sort -r" -a userlist
+
+   In this case the "filename" contains spaces and so must be quoting
+   using your shell's quoting rules.
+     _________________________________________________________________
+
+    4.2.5. Success and Failure of Piped Commands
+
+   Commands or programs started by Kermit as a result of CSEND or
+   CRECEIVE commands, CGET, SEND /COMMAND, REDIRECT commands (see
+   [447]Section 4.2.8.2), implicit use of pipes, RUN commands, and so
+   forth, should return their exit status codes to the Kermit command
+   that caused them to be run, and therefore IF SUCCESS and IF FAILURE
+   tests after these commands should work as expected. For example:
+
+  CSEND blah < filename
+
+   should fail if there is no command called "blah" or if there is no
+   file called "filename". However, this is not foolproof and sometimes
+   C-Kermit might think a command succeeded when it failed, or vice
+   versa. This is most likely to happen when the highly system-dependent
+   methods that Kermit must use to determine a command's exit status code
+   do not supply the right information.
+
+   It can also happen because some commands might define success and
+   failure differently from what you expect, or because you are using a
+   pipeline composed of many commands, and one of them fails to pass
+   failing exit status codes up the chain. The most likely culprit is the
+   shell itself, which in most cases must be interposed between Kermit
+   and any external program to be run.
+
+   In any case, you can examine the following variable to find out the
+   exit status code returned to Kermit by the process most recently run
+   by any command that runs external commands or programs, including
+   CSEND, CRECEIVE, REDIRECT, RUN, etc:
+
+  \v(pexitstat)
+
+   In UNIX, Windows and OS/2, the value should be -2 if no command has
+   been run yet, 0 if the most recent command succeeded, -1, -3, or -4 if
+   there was an internal error, and a positive number returned by the
+   command itself if the command failed. If the number is in the range
+   1-127, this is the program's exit status code. If it is 128 or
+   greater, this is supposed to indicate that the command or program was
+   interrupted or terminated from outside itself.
+
+   In Windows 95 and 98, the return values of the default shell are
+   unreliable; various third-party shells can be used to work around this
+   deficiency.
+
+   In VMS, it is the actual exit status code of the command that was run.
+   This is an odd number if the command succeeded, and an even number if
+   it failed. You can see the associated message as follows:
+
+  run write sys$output f$message(\v(pexitstat))
+
+   Or, more conveniently, use the new Kermit function:
+
+  echo \ferrstring(\v(pexitstat))
+
+   which converts a system error code (number) to the corresponding
+   message.
+     _________________________________________________________________
+
+    4.2.6. Cautions about Using Pipes to Transfer Directory Trees
+
+   Although utilities such as tar and zip/unzip might be available on
+   different platforms (such as UNIX and Windows), this does not
+   necessarily mean you can use them successfully to transfer directory
+   trees between unlike platforms. For example:
+
+  CSEND {tar cf - . | gzip -c} {!gunzip -c | tar xf -}
+
+   when used from UNIX to Windows will have satisfactory results for
+   binary files, but not for text files. UNIX text files have lines
+   ending with Linefeed (LF) only, whereas Windows text files have lines
+   ending in Carriage Return and Linefeed (CRLF). Thus any text files
+   that were in the archive formed by the first tar command will be
+   unpacked by the second tar command in their original form, and will
+   display and print incorrectly in Windows (except in applications that
+   have been explicitly coded to handle UNIX-format text files). On the
+   other hand if you told gzip to use "text mode" to do record format
+   conversion (assuming there was a way to tell it, as there is with most
+   "zip" programs), this would destroy any binary files in the archive.
+
+   Furthermore, if the archive contains text files that are written in
+   languages other than English, the "special" (accented and/or
+   non-Roman) characters are NOT translated, and are therefore likely
+   show up as gibberish on the target system. For example, West European
+   languages are usually encoded in ISO Latin Alphabet 1 in UNIX, but in
+   PC code page 850 on the PC. Capital A with acute accent is code point
+   193 (decimal) Latin-1, but 181 in CP850. So A-acute in the UNIX file
+   becomes Middle Box Bottom on the PC, and similarly for all the other
+   special characters, and for all other languages -- Greek, Russian,
+   Hebrew, Japanese, etc.
+
+   So when transferring text files between unlike platforms, you should
+   use direct Kermit file transfers so Kermit can apply the needed
+   record-format and character-set transformations. Use pipelines
+   containing archivers like tar or zip only if all the files are binary
+   or the two systems use the same record format and character set for
+   text files.
+
+   Also see [448]Sections 4.3, [449]4.10, [450]4.11, and [451]4.15 for
+   how to transfer directory trees between both like and unlike systems
+   directly with Kermit.
+     _________________________________________________________________
+
+    4.2.7. Pipes and Encryption
+
+   Of course pipelines could be used for encrypted file transfers,
+   assuming proper precautions could be taken concerning the transmission
+   of the key. But there is rarely a good way to do this. To illustrate
+   using UNIX crypt:
+
+  csend {crypt key < filename} {!crypt key > filename}
+
+   Or, more ambitiously:
+
+  csend {tar cf - . | gzip -c | crypt key} {!crypt key | gunzip -c | tar xf -}
+
+   transmits the key in the file header packet as part of the
+   (clear-text) remote command, defeating the entire purpose of
+   encrypting the file data.
+
+   But if you are connected in terminal mode to the remote computer and
+   type:
+
+  creceive {crypt key > filename}
+
+   at the remote Kermit prompt, you have also transmitted the key in
+   clear text over the communications link.
+
+   At present, the only secure way to use CSEND and CRECEIVE with an
+   encryption filter is to have a human operator at both ends, so the key
+   does not have to be transmitted.
+
+   Theoretically it would be possible to use PGP software (Pretty Good
+   Privacy, by Phil Zimmerman, Phil's Pretty Good Software) to avoid key
+   transmission (since PGP uses separate public and private key and "lets
+   you communicate securely with people you've never met, with no secure
+   channels needed for prior exchange of keys"), but the specific method
+   has yet to be worked out.
+
+     HINT: See the PGP User's Guide, e.g. at:
+     [452]http://www.telstra.com.au/docs/PGP/
+     Especially the topic "Using PGP as a UNIX-Style Filter":
+     [453]http://www.telstra.com.au/docs/PGP/pgpdoc2/pgpdoc2_17.html
+
+   In any case, better and more convenient security options are now
+   available: Kerberos authentication and encryption ([454]CLICK HERE for
+   details) and the new ability to run C-Kermit "though" other
+   communication programs, described in [455]Section 2.7.
+     _________________________________________________________________
+
+    4.2.8. Commands and Functions Related to Pipes
+
+    4.2.8.1. The OPEN !READ and OPEN !WRITE Commands
+
+   These are described in [456]Using C-Kermit, and are generally useful
+   with reading output from commands that produce more than one line on
+   their standard output, or writing multiple lines into commands that
+   accept them on their standard input.
+
+   In C-Kermit 7.0 CLOSE !READ is accepted as a synonym for CLOSE READ,
+   and CLOSE !WRITE for CLOSE WRITE.
+
+   Testing the success and failure of these commands, however, can be a
+   bit tricky. Consider:
+
+  open !read lalaskjfsldkfjsldkfj
+
+   (where "lalaskjfsldkfjsldkfj" is neither a valid command nor the name
+   of a program or script that can be run). OPEN !READ, in UNIX at least,
+   translates this into execl(shellpath,shellname,"-c",command). This
+   means it starts your preferred shell (e.g. from the SHELL environment
+   variable) and asks it to execute the given command. It must be this
+   way, because your command can be a either an internal shell command
+   (which only your shell can execute) or an external command, which only
+   your shell knows how to find (it knows your PATH and interprets, etc).
+   Therefore unless OPEN !READ can't start your shell, it always
+   succeeds.
+
+   Continuing with the nonexistent-command example:
+
+  C-Kermit> open !read lalaskjfsldkfjsldkfj
+  C-Kermit> status
+   SUCCESS
+  C-Kermit> read line
+  C-Kermit> status
+   SUCCESS
+  C-Kermit> echo "\m(line)"
+  "bash: lalaskjfsldkfjsldkfj: command not found"
+  C-Kermit> close read
+  C-Kermit> status
+   FAILURE
+  C-Kermit>
+
+   In other words, the failure can not be detected on OPEN, since the
+   OPEN command succeeds if it can start your shell. It can't be detected
+   on READ, since all this does is read output from the shell, which in
+   this case happens to be an error message. However, failure IS detected
+   upon close, since this is the occasion upon which the shell gives
+   Kermit its exit status code.
+
+   For an illustration of this situation, see [457]Section 2.14.
+     _________________________________________________________________
+
+    4.2.8.2. The REDIRECT Command
+
+   A second method of I/O redirection is offered by the REDIRECT command.
+   This is a rather advanced and tricky feature that is presently
+   supported only in UNIX C-Kermit, in OS-9 C-Kermit, and in Kermit 95.
+   Syntax:
+
+   REDIRECT command
+          Runs the given command, sending its standard output to the
+          current communications channel (SET LINE, SET PORT, or SET HOST
+          connection), and reading its standard input from the same
+          connection. Works only in local mode -- i.e. a connection is
+          required -- and then only if the given command uses Standard
+          I/O.
+
+   Example:
+
+  redirect finger
+
+   runs the local "finger" command and sends its output over the
+   connection as plain text, where presumably there is a process set up
+   to read it. Another example:
+
+  redirect finger | sort -r
+
+   shows the use of a pipeline.
+
+   Note: REDIRECT differs from CSEND/CRECEIVE in two important ways: (1)
+   it does not use the Kermit protocol, and (2) it uses a bidirectional
+   pipe rather than a one-way pipe.
+
+   The primary use of the REDIRECT command is to run external protocols,
+   such as sz/rz in UNIX for ZMODEM, when they work over Standard I/O(*).
+   Example:
+
+  set host xyzcorp.com
+  (login, etc)
+  redirect sz oofa.zip
+
+   lets you make a Telnet connection with C-Kermit and then do a ZMODEM
+   transfer over it. ZMODEM protocol messages go both ways over the same
+   connection simultaneously.
+
+   It is possible to use C-Kermit on UNIX as your PPP dialer and then to
+   REDIRECT the connection to the PPP software, but C-Kermit 7.0 offers a
+   better approach to PPP dialing in its new EXEC command ([458]Section
+   1.23).
+
+   In theory, you can also redirect an interactive process. For example,
+   suppose you tell Kermit 95 to wait for an incoming TCP/IP connection:
+
+  set host * 3000
+
+   and then tell C-Kermit on UNIX to:
+
+  set host kermit95hostname 3000
+  redirect ksh
+
+   and then tell Kermit 95 to CONNECT: now you are talking to the UNIX
+   K-shell; you can give commands (pwd, ls, etc) and see the results. In
+   practice, the K-shell's terminal modes are messed up because (a) it is
+   not going through the Unix terminal driver, and (b) it is "smart" and
+   knows it is being redirected, and so acts in a decidedly inhospitable
+   manner (other applications like EMACS, vi, etc, simply refuse to run
+   if their standard i/o has been redirected).
+
+     (*) The publicly-distributed sz/rz programs do not work as clients.
+     However, Omen Technology does offer an up-to-date redirectable
+     client XYZMODEM program called crzsz.
+     _________________________________________________________________
+
+    4.2.8.3. Receiving Mail and Print Jobs
+
+   As of 7.0, and in UNIX only, files that are sent to C-Kermit as mail
+   (when the other Kermit uses a MAIL or SEND /MAIL command) or to be
+   printed (via REMOTE PRINT or SEND /PRINT) are now piped directly to
+   the mail or print program, rather than written to temporary files and
+   then mailed or printed and then deleted. This has the advantages of
+   (a) not requiring a temporary file, and (b) allowing mail to have a
+   proper subject in place of the filename. Temporary files were bad not
+   only because they required (a) space, and (b) writeability of the
+   current directory, but also because using them could result in wiping
+   out an existing file. See [459]Section 4.7 for more about SEND /MAIL
+   and SEND /PRINT.
+     _________________________________________________________________
+
+    4.2.8.4. Pipe-Related Functions
+
+   The \fcommand(command) function runs the given shell or system command
+   and returns the command's standard output as its value (with any
+   newline characters stripped from the end), unless the result is too
+   long, in which case it returns the empty string. The maximum length
+   for the result is at least 1022 bytes, and it might be longer on some
+   platforms. Examples (UNIX):
+
+  C-Kermit> echo "\fcommand(date)"
+  "Fri Apr 18 13:31:42 1997"
+  C-Kermit> echo "\fcommand(finger | wc -l)" ; how many users logged in?
+  "      83"
+  C-Kermit> evaluate \fcommand(finger | wc -l) * 2
+  166
+  C-Kermit> echo Welcome to \fcommand(tty) on \fcommand(date)
+  Welcome to /dev/ttyre on Fri Apr 18 13:31:42 1997
+  C-Kermit> echo "\fcommand(ls oofa.*)"
+  "oofa.c
+  oofa.h
+  oofa.o"
+  C-Kermit> cd /directory-with-thousands-of-files
+  C-Kermit> echo "\fcommand(ls -l)" ; This would be too long
+  ""
+  C-Kermit>
+
+   If a command's output would be too long, you can use the other, more
+   laborious method of reading from a command: OPEN !READ command, READ
+   each line, CLOSE !READ.
+
+   The \frawcommand(command) function is identical to \fcommand(command),
+   except it does not remove trailing newline characters:
+
+  C-Kermit> echo "\frawcommand(date)"
+  "Fri Apr 18 13:31:42 1997
+  "
+  C-Kermit> echo "\frawcommand(ls oofa.*)"
+  "oofa.c
+  oofa.h
+  oofa.o
+  "
+  C-Kermit>
+
+   Use \frawcommand() if you want to retain the final line terminators,
+   or if the command's output is "binary". But remember that if the
+   result of this (or any other) function contains any NUL (ASCII code 0)
+   characters, the first NUL will terminate the result string because
+   this is how C strings work (it's "C-Kermit", remember?).
+
+   These functions are useful not only locally, but also in the
+   client/server arena. If you need to get the results from a system
+   command on the server end into a variable on the client end, just do:
+
+  [ remote ] query kermit command(date)
+
+   The result is in the local \v(query) variable; see [460]Using
+   C-Kermit, 2nd Ed., pp.359-360 for details.
+     _________________________________________________________________
+
+  4.3. Automatic Per-File Text/Binary Mode Switching
+
+   When transferring files between like systems (e.g. UNIX-to-UNIX),
+   binary mode can be used for all files unless character-set translation
+   is needed, and in fact Kermit programs of recent vintage recognize
+   each others' platforms and switch to binary mode automatically when it
+   is appropriate (e.g. DOS to OS/2, or UNIX to UNIX). (Exception:
+   LABELED mode is chosen for VMS-to-VMS and OS/2-to-OS/2 transfers so
+   complex file formats can be preserved.)
+
+   On a client/server connection between like systems, the transfer mode
+   is currently determined by the file sender, rather than always by the
+   client. If the client is sending, it controls the transfer mode. If a
+   GET command is sent to the server, the server sends all files in
+   binary mode if its TRANSFER CHARACTER-SET is TRANSPARENT; otherwise it
+   uses text mode for text files (according to its text-pattern list) and
+   binary mode for binary files. Of course, the client can control the
+   server's transfer character-set with the REMOTE SET TRANSFER
+   CHARACTER-SET command.
+
+   When transferring files between unlike systems, however, (e.g.
+   UNIX-to-DOS), some files (such as executable program images) must be
+   transferred in binary mode but others (such as plain-text files) must
+   be transferred in text mode so their record format and character sets
+   can be appropriately converted. If a binary file is transferred in
+   text mode, it is ruined. If a text file is transferred in binary mode,
+   then at the very least, its format can be incorrect; at worst it is
+   also corrupted because its character set was not converted (in extreme
+   cases the corruption is total, e.g. because one system is ASCII-based
+   and the other EBCDIC).
+     _________________________________________________________________
+
+    4.3.1. Exceptions
+
+   VMS C-Kermit, when sending files to a non-VMS system, switches to text
+   or binary mode automatically for each file, based on the record format
+   in the file's directory entry; thus the mechanisms described in this
+   section do not apply to VMS C-Kermit, yet the effect is the same:
+   automatic text/binary mode switching when VMS C-Kermit is sending
+   files. See the VMS Appendix of [461]Using C-Kermit for details.
+
+   Kermit versions that support LABELED or IMAGE transfer mode are
+   likewise not affected by this feature when one of those modes is
+   selected (normally used only when transferring between like systems).
+
+   Kermit versions that support file-transfer pipes and filters are not
+   affected by this feature when pipes or filters are used, since the
+   output of a pipe or filter (such as gzip) is likely to require
+   transfer in a different mode than the original file.
+
+   Finally, SEND /TEXT or SEND /BINARY will force files to be sent in the
+   indicated mode, overriding all automatic transfer-mode-choosing
+   mechanisms.
+     _________________________________________________________________
+
+    4.3.2. Overview
+
+   Suppose you give C-Kermit a command like:
+
+  SEND *.*
+
+   And suppose the pattern *.* matches a mixture of text files (such as
+   program source code) and binary files (such os object modules or
+   executable programs).
+
+   C-Kermit 6.0 and earlier (except on VMS) send all files in the same
+   mode: whatever you said in your most recent SET FILE TYPE command, or
+   else whatever mode was chosen automatically according to the rules on
+   page 236 of Using C-Kermit, 2nd Ed.
+
+   But when text and binary files are mixed in the same group, and the
+   files are being transferred to an unlike system (e.g. UNIX to IBM
+   Mainframe), this results in corruption of either all the text files or
+   all the binary files.
+
+   Stream-oriented file systems such as in UNIX and DOS do not record any
+   information about the file to tell us whether the file should be
+   transferred in binary or text mode, making it impossible to select the
+   transfer mode for each file in a group automatically with any
+   certainty.
+
+   However, we can use some fairly-well established file naming
+   conventions for this purpose. C-Kermit 7.0 lets you provide lists of
+   filename patterns that are used to separately determine the file type
+   for each individual file being transfered. A pattern is a string,
+   possibly containing the special characters "*" (asterisk, which
+   matches any string of zero of more characters) and/or "?" (question
+   mark, which matches any single character). For example "a*b" matches
+   all files whose names start with "a" and end with "b", such as "ab",
+   "arb", "ababababab", etc, but not "abba". And "a?b" matches any file
+   whose name starts with "a", ends with "b", and is exactly 3 characters
+   long.
+
+     NOTE: When typing commands at the C-Kermit prompt, you must prefix
+     "?" with \ to override its normal function of giving help.
+
+   (Also see [462]Section 4.9 for additional pattern-matching notations
+   that might be available in your version of C-Kermit.)
+
+   When you have specified filename recognition patterns, C-Kermit can
+   transfer the ones whose names match any of the binary-mode patterns in
+   binary mode, and those with names that match any of the text-mode
+   patterns in text mode, and those whose names match neither in the
+   prevailing mode you have chosen, or that was chosen automatically via
+   peer recognition.
+     _________________________________________________________________
+
+    4.3.3. Commands
+
+   SET FILE PATTERNS { ON, OFF, AUTO }
+          This tells Kermit whether to do per-file filename
+          pattern-matching to determine text or binary mode. The normal
+          and default setting is AUTO, which means to use pattern lists
+          to switch transfer mode only when it is certain that the other
+          Kermit program supports automatic notification of transfer mode
+          (via Attribute packets) on a per-file basis (this information
+          is obtained automatically during protocol startup negotiation).
+          ON means to always determine the transfer mode from the
+          filename and pattern list when sending files. Use OFF to
+          disable this feature (without resetting your pattern lists).
+          Also note that if you have selected LABELED file transfer (SET
+          FILE TYPE LABELED), this takes precedence over
+          filename-matching patterns and all files are sent in labeled
+          mode.
+
+   SET TRANSFER MODE MANUAL
+          Disables the use of filename patterns, no matter what the FILE
+          PATTERNS setting.
+
+   REMOTE SET TRANSFER MODE MANUAL
+          Client command to disable automatic transfer mode, and
+          therefore also filename patterns, in the server. Synonym:
+          REMOTE SET XFER MODE MANUAL.
+
+   { GET, SEND, etc } { /BINARY, /TEXT }
+          Including a /BINARY or /TEXT (or, where supported, /IMAGE or
+          /LABELED) switch with a file-transfer command changes the
+          transfer mode to manual for that command only, and therefore
+          disables patterns that that command.
+
+   SET FILE BINARY-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
+          A list of zero or more patterns, separated by spaces (not
+          commas). Letters in a pattern are case-sensitive if the
+          underlying filenames are case sensitive (as in UNIX), and
+          case-insensitive otherwise (as in Windows). If a file's name is
+          matched by any pattern in the list and SET FILE PATTERNS is ON,
+          the file is sent in binary mode. Examples:
+
+  SET FILE BINARY-PATTERNS *.gz *.Z *.tar *.zip *.o *.so *.a *.out ; UNIX
+  SET FILE BINARY-PATTERNS *.EXE *.ZIP *.OBJ *.COM ; DOS or OS/2 or Windows
+
+          If a pattern contains spaces, enclose it in braces.
+
+   SET FILE TEXT-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
+          Like SET FILE BINARY-PATTERNS, but the patterns choose text
+          files rather than binary ones. Examples:
+
+  SET FILE TEXT-PATTERNS *.TXT *.KSC *.HTM* *.BAT ; DOS, Windows, OS/2
+
+   ADD BINARY-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
+          Adds one or more patterns to the BINARY-PATTERN list.
+
+   ADD TEXT-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
+          Adds one or more patterns to the TEXT-PATTERN list.
+
+   REMOVE BINARY-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
+          Removes one or more patterns from the BINARY-PATTERN list. The
+          given patterns are matched with the ones in the BINARY-PATTERNS
+          list with case sensitivity if the underlying file system has
+          case-sensitive names (as do UNIX and OS-9), otherwise with case
+          independence.
+
+   REMOVE TEXT-PATTERNS [ pattern [ pattern [ pattern ... ] ] ]
+          Removes one or more patterns from the TEXT-PATTERN list.
+
+   SHOW PATTERNS
+          Displays the current pattern selections.
+
+   Whenever you give a SET FILE BINARY-PATTERNS or SET FILE TEXT-PATTERNS
+   command, the previous list is replaced. If you give one of these
+   commands without a pattern list, the previous list is removed.
+
+   When patterns are active and files are being sent, text patterns (if
+   any) are applied first (but only if not RESENDing and not sending in
+   LABELED mode), then binary patterns, so if the same pattern appears in
+   both lists, binary mode is chosen.
+     _________________________________________________________________
+
+    4.3.4. Examples
+
+   Here's an example that might be used when sending files from UNIX:
+
+  set file type binary
+  set file text-patterns *.c *.h *.w *.txt makefile
+  set file binary-patterns *.o
+  msend makefile wermit wart ck*.[cwho] ck*.txt
+
+   Note that "wermit" and "wart" do not match any patterns so they are
+   sent in the prevailing mode, which is binary. Also note the use of
+   "makefile" as a pattern that does not contain any wildcard characters
+   (there is no other convention to distinguish among "wermit" and
+   "wart", which are binary executables, and "makefile", which is a text
+   file, purely by their names).
+
+   Most C-Kermit implementations have a default pattern list built in,
+   which includes patterns that are almost certain to succeed in picking
+   the right transfer mode. Others are omitted due to ambiguity. For
+   example ".hlp", and ".ini" are generally binary types in Windows but
+   text types everywhere else.
+
+     NOTE: ".doc", used for decades to denote plain-text documentation
+     files, now more often than not denotes a Microsoft Word Document,
+     so ".doc" is now considered a binary type since it does less harm
+     to transfer a plain-text document in binary mode than it does to
+     transfer an MS Word file in text mode (except when IBM mainframes
+     are involved!)
+
+     ANOTHER NOTE: ".com" files are binary in DOS-like operating
+     systems, but they are text (DCL command procedures) in VMS. VMS
+     C-Kermit sends .COM files in text mode; K95 sends them in binary
+     mode. If you download a .COM file from VMS to DOS or Windows, and
+     then upload it to another VMS system, be sure to use SEND /TEXT to
+     preserve its textness.
+
+   You can see the default pattern list by starting C-Kermit without its
+   initialization file (e.g. "kermit -Y") and using the SHOW PATTERNS
+   command. If you will be depending on this feature, be sure to examine
+   the list carefully in conjunction with the applications that you use.
+
+   The default pattern list does not take "backup files" into account
+   because (a) people usually don't want to transfer them; and (b) it
+   would make the pattern lists more than twice as long. For example, we
+   would need to include both *.txt and *.txt.~[0-9]*~ for ".txt" files,
+   and similarly for all the others. Instead, you can use SEND /NOBACKUP
+   (or SET SEND BACKUP OFF) to skip over all backup files.
+
+   Put your most commonly-used safe pattern declarations in your C-Kermit
+   customization file (ckermod.ini, .mykermrc, k95custom.ini, etc).
+
+   As noted, SET FILE PATTERNS is ON by default. Sometimes, however, it
+   is desirable, or necessary, to force files to be sent in a particular
+   mode, and often this must be done from the command line (e.g. when
+   using Kermit as a download helper in a Web browser like Lynx). The -V
+   command-line options is equivalent to SET FILE PATTERNS OFF and SET
+   TRANSFER MODE MANUAL. Example:
+
+  kermit -Vis oofa.txt
+
+   forces oofa.txt to be sent in binary mode, even though ".txt" might
+   match a text pattern.
+     _________________________________________________________________
+
+  4.4. File Permissions
+
+   "Permissions" refers to a code associated with a file that specifies
+   who is allowed to access it, and in what manner. For example, the
+   owner, the members of one or more groups, the system administrator,
+   and everybody else, might be allowed various combinations of Read,
+   Write, Append, Execute, or Listing access.
+
+   The permission code goes by different names on different platforms. In
+   UNIX, it might be called the filemode. In VMS, it is called the file
+   protection (or protection mask).
+
+   The comments in this section presently apply only to the UNIX and VMS
+   versions of C-Kermit, to which these features were added in version
+   7.0; the DOS, Windows, and OS/2 file systems embody no notions of
+   protection, and so MS-DOS Kermit and Kermit 95 do not send file
+   permissions, and ignore them when received.
+
+   The permissions for a received file are determined by a combination of
+   the file transfer mode (VMS-to-VMS transfers only), whether a file of
+   the same name exists already, whether permissions of the file are
+   received in the file attribute packet, and the setting of ATTRIBUTES
+   PROTECTION.
+
+   The default for ATTRIBUTES PROTECTION is ON. If no attributes are
+   received, the effect is the same as if attributes PROTECTION were OFF.
+
+   For VMS-to-VMS transfers, the default LABELED mode simply copies the
+   protection code from source to destination.
+     _________________________________________________________________
+
+    4.4.1. When ATTRIBUTES PROTECTION is OFF
+
+   If no file of the same name exists, system defaults determine the
+   permissions of the new file. Otherwise, the actions taken depend on
+   the current FILE COLLISION setting: BACKUP, OVERWRITE, RENAME, etc, as
+   documented in [463]Using C-Kermit. But now the new file (if it is
+   created at all) automatically inherits the permissions (mode bits) of
+   the existing file in a way that is appropriate for the platform.
+
+    4.4.1.1. Unix
+
+   All mode bits are inherited except the directory bit, since the
+   incoming file can not possibly be a directory. (In any case, it is not
+   possible to receive a file that has the same name as an existing
+   directory unless FILE COLLISION is set to RENAME).
+
+    4.4.1.2. VMS
+
+   Files with the same name as an existing file, transferred in modes
+   other than LABELED between VMS systems, inherit the protection of the
+   prior version.
+     _________________________________________________________________
+
+    4.4.2 When ATTRIBUTES PROTECTION is ON
+
+   File permissions can be conveyed as part of the file transfer process,
+   in accordance with the Kermit protocol definition. If the file sender
+   puts system-dependent and/or system-independent versions of the file
+   protection (permissions) into the Attribute (A) packet, the file
+   receiver can set the new file's permissions from them. Otherwise, the
+   permissions are set the same as for ATTRIBUTES PROTECTION OFF.
+
+   When the incoming A packet contains system-dependent permissions, the
+   file receiver checks to see if the sender has the same system ID (e.g.
+   both the sending and receiving systems are UNIX, or both are VMS); if
+   so, it decodes and uses the system-dependent permissions; otherwise it
+   uses the generic ones (if any) and applies them to the owner field,
+   setting the other fields appropriately as described in the following
+   sections.
+
+   Setting the incoming file's protection from the A packet is controlled
+   by SET ATTRIBUTES PROTECTION (or PERMISSION), which is ON by default,
+   and its status is displayed by SHOW ATTRIBUTES.
+
+   The main benefit of this feature is to not have to "chmod +x" an
+   executable file after transfer from UNIX to UNIX. Its cross-platform
+   benefits are less evident, perhaps to retain the status of the Unix
+   'x' bit on a VMS system, for subsequent transfer back to a Unix
+   system.
+     _________________________________________________________________
+
+    4.4.2.1. System-Specific Permissions
+
+   System-specific file permissions are used when the two Kermit programs
+   recognize each other as running on the same type of system. For
+   example, both are running under some form of UNIX (it doesn't matter
+   which UNIX variation -- HP-UX, Solaris, AIX, etc -- all use the same
+   scheme for file permissions); or both are running under VMS (even if
+   one is on an Alpha and the other on a VAX, and/or one is old and the
+   other is new).
+
+    4.4.2.1.1. UNIX
+
+   UNIX supports three categories of users, File Owner, Group, and World,
+   and three types of file access permission: Read, Write, and Execute.
+   Thus, a UNIX file's permissions are expressed in 9 bits.
+
+   The system-dependent permission string for UNIX is a 3-digit octal
+   string, the low-order 9 bits of the st_mode member of the stat struct;
+   we deliberately chop off the "file format" bits because they are not
+   permissions, nor do we convey the setuid/setgid bits, lock bit, sticky
+   bit, etc.
+
+    4.4.2.1.2. VMS
+
+   VMS supports four categories of users, System, File Owner, Group, and
+   World, and four types of file access permission: Read, Write, Execute,
+   and Delete. Thus, a VMS file's permissions are expressed in 16 bits.
+
+   The system-dependent protection string for VMS is a 4-digit
+   hexadecimal string, corresponding to the internal-format protection
+   word of the file (RWED for each of World,Group,Owner,System). A new
+   file normally gets all 16 protection bits from the original file of
+   the same name.
+
+   Note: VMS-to-VMS transfers take place in LABELED mode when the two
+   C-Kermits recognize each other's platform as VMS (unless you have
+   disabled LABELED-mode transfers). In this case, all of a file's
+   attributes are preserved in the transfer and the protection mask (and
+   other information) is taken from the file's internal information, and
+   this takes precedence over any information in the Attribute packets.
+   You can defeat the automatic switching into LABELED mode (if you want
+   to) with SET TRANSFER MODE MANUAL.
+     _________________________________________________________________
+
+    4.4.2.2. System-Independent Permissions
+
+   The system-independent ("generic") protection is used when the system
+   IDs of the two Kermit programs do not agree (e.g. one is UNIX, the
+   other is VMS). The generic protection attribute includes the following
+   permissions (not all are applicable to every file system): Read,
+   Write, Append, Execute, Delete, Search. The generic permissions are
+   derived from the owner permissions of the source file, thus, a Unix
+   'w' permission becomes VMS Write,Delete.
+
+   The Owner field of the new file's permissions is set from the incoming
+   generic protection attribute.
+
+   In UNIX, the Group and World permissions are set according to your
+   umask, except that execute permission is NOT set in these fields if it
+   was not also set in the generic protection (and consequently, is set
+   in the Owner field).
+
+   In VMS, the System, Group, and World permissions are set according to
+   the process default file permission (as shown in VMS by SHOW
+   PROTECTION), except that no permissions are allowed in these fields
+   that are not included in the generic permissions.
+
+   Note that the VMS and UNIX interpretations of Execute permission are
+   not identical. In UNIX, a file (binary executable, shell script, etc)
+   may not be executed unless it has Execute permission, and normally
+   files that are not intended for execution do not have Execute
+   permission. In VMS, Read permission implicitly supplies Execute
+   capability. Generally files that have Read permission also have
+   explicit Execute permission, but files (binary executables, DCL
+   command procedures) that have Read permission and not Execute
+   permission can still be executed.
+     _________________________________________________________________
+
+  4.5. File Management Commands
+
+    4.5.1. The DIRECTORY Command
+
+   Prior to C-Kermit 7.0, the DIRECTORY command always ran an external
+   system command (such as "ls" on UNIX) or program to product the
+   directory listing. This had certain advantages, mostly that you could
+   include system-dependent options for customized listings, e.g. on
+   UNIX:
+
+  dir -lt c* | more
+
+   or in VMS:
+
+  directory /size/date/protection/except=*.obj oofa.*;0
+
+   This approach, however, carries some disadvantages: C-Kermit can't
+   return SUCCESS or FAILURE status for (e.g.) "dir foo" according to
+   whether the file "foo" exists; and it runs an inferior process, which
+   might be a problem in some environments for resource and/or security
+   reasons, and won't work at all in a "nopush" environment (e.g. one in
+   which C-Kermit is configured to forbid access to exterior commands and
+   programs, e.g. in a VMS "captive account").
+
+   In C-Kermit 7.0 on VMS and UNIX, and in K95 1.1.19 and later, the
+   DIRECTORY command is internal to Kermit. It can be run in a "nopush"
+   environment and returns SUCCESS or FAILURE status appropriately. In
+   UNIX it prints all dates and times in a consistent way (unlike ls). In
+   VMS it prints precise file sizes, rather than "blocks". It offers
+   several formatting and other options, but it is not necessarily more
+   flexible than the corresponding external commands or programs (the
+   UNIX "ls" program, the VMS "directory" command). The syntax is:
+
+   DIRECTORY [ switch [ switch [ ... ] ] ] [ filespec ]
+
+   If no filespec is given, all files in the current directory are
+   listed.
+
+   Optional switches include all the standard file-selection switches
+   presented in [464]Section 1.5.4, plus:
+
+   /ALL
+          Show both regular files and directories; this is the default.
+
+   /ARRAY:x
+          Instead of displaying a directory listing, put the files that
+          would have been shown (based on the filespec and other
+          selection switches) in the given array. The array need not (and
+          should not) be predeclared; if the array already exists, it is
+          destroyed and reused. The array name can be a single letter,
+          like "a", or any fuller form, such as "&a", "\&a", "\&a[]",
+          etc. If the /ARRAY switch is included, the following other
+          switches are ignored: /BRIEF, /VERBOSE, /HEADING, /PAGE,
+          /ENGLISHDATE, /ISODATE, /XFERMODE, /MESSAGE, /SORT, /REVERSE,
+          /ASCENDING. In other words, only file selection switches are
+          meaningful with /ARRAY: /FILES, /DIRECTORIES, /ALL, /DOTFILES,
+          /NOBACKUP, /RECURSIVE, /SMALLER, /LARGER, /AFTER, /BEFORE,
+          /EXCEPT, etc. The resulting array has the number of files (n)
+          as its 0th element, and the filenames in elements 1 through n
+          Example:
+
+  dir /array:&a /files /nobackup /after:19990101 /larger:10000 [ab]*
+  show array &a
+
+   /FILES
+          Only show regular files.
+
+   /DIRECTORIES
+          Only show directories.
+
+   /BACKUP
+          In UNIX, OS-9, K-95, and other versions that support SET FILE
+          COLLISION BACKUP and create backup files by appending .~n~ to
+          the filename (where "n" is a number), /BACKUP means to include
+          these files in directory listings. This is the default.
+
+   /NOBACKUP
+          This is the opposite of /BACKUP: that is, do not include backup
+          files in the listing.
+
+   /BRIEF
+          List filenames only; use a compact format, as many filenames as
+          will fit across the screen (based on the longest name). A brief
+          listing is always sorted alphabetically.
+
+   /VERBOSE
+          List one file per line, and include date, size, and (in UNIX
+          only) permissions of each file. This is the opposite of /BRIEF,
+          and is the default.
+
+   /PAGE
+          Pause at the end of each screenful and give a "more?" prompt,
+          even if SET COMMAND MORE-PROMPTING is OFF.
+
+   /NOPAGE
+          Don't pause at the end of each screenful and give a "more?"
+          prompt, even if SET COMMAND MORE-PROMPTING is ON. If neither
+          /PAGE or /NOPAGE is given, paging is according to the
+          prevailing COMMAND MORE-PROMPTING setting (which can be
+          displayed with SHOW COMMAND).
+
+   /ENGLISHDATE
+          Show dates in dd-mmm-yyyy format; mmm is the first three
+          letters of the English month name.
+
+   /ISODATE
+          Show dates in yyyy-mm-dd format; mm is the month number, 1-12.
+          This is the opposite of /ENGLISHDATE, and is the default.
+
+   /HEADINGS
+          Print a heading before the listing and a summary at the end.
+
+   /NOHEADINGS
+          Don't print a heading before the listing or a summary at the
+          end. This is the opposite of /HEADINGS, and is the default.
+
+   /XFERMODE
+          Only in Kermit programs that support SET FILE PATTERNS. If this
+          switch is included, and the filename matches any FILE
+          BINARY-PATTERN ([465]Section 4.3), "(B)" is printed after the
+          filename; otherwise, if it matches a FILE TEXT-PATTERN, "(T)"
+          is printed.
+
+   /NOXFERMODE
+          Don't display transfer-mode indicators. This is the opposite of
+          /XFERMODE and is the default.
+
+   /RECURSIVE
+          Show files not only in the given directory, but also in its
+          subdirectories (if any), their subdirectories, etc.
+
+   /NORECURSIVE
+          Don't show files in subdirectories. This is the opposite of
+          /RECURSIVE, and is the default.
+
+   /MESSAGE:text
+          This lets you specify a short text string to be appended to the
+          end of each directory listing line (a space is supplied
+          automatically). If the text contains any spaces, enclose it in
+          braces, e.g. /MESSAGE:{two words}.
+
+   /NOMESSAGE
+          Don't append any message to the end of each directory listing
+          line (default).
+
+   /SORT:[{NAME,SIZE,DATE}]
+          Sort the listing by name, size, or date. If the /SORT switch is
+          given but the "sort-by" keyword is omitted, the listing is
+          sorted by name. /SORT:NAME /ASCENDING (alphabetic sort by name)
+          is the default.
+
+   /NOSORT
+          Don't sort the listing. Files are listed in whatever order they
+          are supplied by the operating system, e.g. inode order in UNIX.
+
+   /REVERSE
+          If the /SORT switch is given, reverse the order of the sort.
+          Synonym: /DESCENDING.
+
+   /ASCENDING
+          If the /SORT switch is given, sort the listing in normal order.
+          This is the opposite of /REVERSE and is the default.
+
+   Note that most of the DIRECTORY-specific switches come in pairs, in
+   which one member of a pair (e.g. /NOHEADINGS) is the opposite of the
+   other (e.g. /HEADINGS).
+
+   If you always want to use certain options, you can set them with the
+   SET OPTIONS DIRECTORY command ([466]Section 1.5.5). Use SHOW OPTIONS
+   to list the options currently in effect. To make the desired options
+   apply every time you run C-Kermit, put a SET OPTIONS DIRECTORY command
+   in your C-Kermit customization file, specifying the desired options.
+   Options set in this manner apply to every subsequent DIRECTORY
+   command. Of course, if you include switches in a DIRECTORY command,
+   these override any defaults, built-in or custom. Example:
+
+  DIRECTORY            ; Use "factory defaults"
+  SET OPTIONS DIRECTORY /SORT:SIZE /REVERSE /HEADINGS  ; Customize defaults
+  DIRECTORY            ; Use customized defaults
+  DIR /SORT:NAME       ; Override customized default SORT key
+  SET OPT DIR /RECURS  ; Add /RECURSIVE to customized defaults
+  DIR /ASCEND          ; Override customized default SORT order
+
+   Notes:
+
+     * Only a single sort key is supported; there is presently no way to
+       have multiple sort keys.
+     * If the /BRIEF switch is given, all other switches (except
+       /[NO]RECURSIVE, /[NO]DOTFILES, /DIRECTORIES, /FILES, and /ALL) are
+       ignored.
+     * /SORT:anything gives incorrect results if any files have lengths
+       greater than 10 digits (i.e. that are more than 9999999999 bytes
+       long, i.e. if they are 10GB or more in size) because the overlong
+       length field causes the date and name fields to be misaligned.
+     * /SORT:NAME is redundant in VMS since VMS returns filenames in
+       alphabetic order anyway.
+     * /SORT:NAME ignores alphabetic case on platforms where case does
+       not matter in filenames, but this works only for unaccented Roman
+       letters A-Z.
+     * /SORT:NAME is currently based on code values, and so works fine
+       for ASCII, but will probably produce unexpected results for files
+       with non-ASCII or 8-bit characters in their names. (Locale-based
+       sorting raises rather significant issues of portability, size,
+       performance, etc.)
+     * /SORT:DATE works right only for ISO-format dates, not English
+       ones.
+     * /SORT:SIZE sorts the size field lexically. On some platforms (e.g.
+       Windows), the size of a directory file is listed as "<DIR>" rather
+       than as a number; in this case, the "<DIR>" files are gathered at
+       the end (or beginning, depending on the sort order) of the
+       listing.
+     * /RECURSIVE is accepted but ignored in AOS/VS. Use the normal
+       system-specific filespec notation, e.g. "dir #.txt".
+     * /RECURSIVE has no affect when a full, absolute pathname is given;
+       e.g. "dir /recursive /tmp/foo" (where "foo" is a regular file)
+       only shows the "/tmp/foo" file. If you want to see all "foo" files
+       in the /tmp tree, do "cd /tmp" and then "dir /recursive foo".
+     * If a file size of -1 is shown, or date-time of 0000-00-00
+       00:00:00, this means the file was located, but access to
+       information about the file was denied to C-Kermit.
+     * In VMS, if FOO.DIR;1 is a directory within your current directory,
+       "directory foo" and "directory [.foo]" list the files in the
+       [.FOO] subdirectory, but "directory foo.dir" lists the directory
+       file itself; similarly for "*.dir" versus "[.*]", etc.
+     * In UNIX, if "foo" is a directory within your current directory,
+       "directory foo" lists the files in the foo directory. If you want
+       to list the foo directory file itself, put an asterisk at the end:
+       "dir foo*".
+
+   Hint: How to find the biggest files in a directory tree:
+
+  cd xxx ; (root of tree)
+  directory /sort:size /recursive /reverse /dotfiles /page
+
+   Another hint: If you often use several different directory-listing
+   formats, define macro shortcuts for them:
+
+  DEFINE WD DIRECTORY /SORT:DATE /REVERSE \%*  ; Reverse chronological order
+  DEFINE SD DIRECTORY /SORT:SIZE /REVERSE \%*  ; Reverse order of size
+  DEFINE ND DIRECTORY /SORT:NAME /ASCEND \%*   ; Alphabetical by name
+  DEFINE DL DIR /DIR /SORT:NAME /ASCEND \%*    ; Alphabetical directory list
+
+   Put these definitions in your C-Kermit customization file. Note that
+   "\%*" ([467]Section 7.5) in these definitions lets you include other
+   switches in your macro invocations, e.g.:
+
+  wd /headings *.txt
+
+   Of course you can still access your external directory listing program
+   by using RUN or "!", e.g. in VMS:
+
+  run directory /size/date/protection/except=*.obj oofa.*;0
+
+   or:
+
+  !dir /size/date/prot/exc=*.obj oofa.*;0
+
+   In UNIX, use "!ls" or just "ls" (which is a special synonym for
+   "!ls").
+     _________________________________________________________________
+
+    4.5.2. The CD and BACK Commands
+
+   In C-Kermit 7.0, the CD command has a new friend, the BACK command.
+   BACK means "CD to my previous current directory". A second BACK brings
+   you back to where you were before the first one; thus successive BACK
+   commands switch back and forth between two directories.
+
+    4.5.2.1. Parsing Improvements
+
+   The CD command, as well as other commands that parse a directory name,
+   were changed in 7.0 to provide all the expected functions: completion
+   on Tab or Esc, directory-name lists on ?, etc. Other affected commands
+   include SET SERVER GET-PATH, SET TEMP-DIRECTORY, SET FILE
+   DOWNLOAD-DIRECTORY, and SPACE. CD and REMOTE CD also now work with
+   logical names.
+
+   In VMS, the situation is a bit complicated since a directory name can
+   look like "DEV:", "[FOO.BAR]", "DEV:[FOO.BAR]", "[FOO]BAR.DIR;1", etc.
+   Completion and ?-help might not always work, but they do in many
+   cases. Examples:
+
+  cd ?           Lists all subdirectories of the current directory
+  cd []?         Ditto
+  cd k?          Ditto, but only those starting with K
+  cd [foo]?      Lists all subdirectories of the [FOO] directory
+  cd [-]?        Lists all subdirectories of the superior directory
+  cd [--]?       Lists all subdirectories of the directory 2 levels up
+  cd [...]?      Lists all directories below the current one
+  cd [foo.?      Does not work.
+
+   C-Kermit allows all of the following in VMS:
+
+  cd bar         CD to subdirectory BAR of the current directory
+  cd .bar        Ditto
+  cd [.bar]      Ditto
+  cd bar.dir     etc...
+  cd bar.dir;
+  cd bar.dir;1
+  cd [foo.bar]
+  cd bar.baz     This can go more than 1 level deep...
+  cd dir:        (where logical name DIR is defined as [FOO.BAR])
+
+   As well as the following:
+
+  cd ..          Go up one level as in UNIX
+  cd .           The current directory
+  cd             My login directory
+
+   Note that "cd -" (go up one level) does not work as expected, because
+   "-" is Kermit's command continuation character. However, "cd [-]", and
+   "
+   cd {-}" have the desired effect (and so does "cd ..", which is easier
+   to type).
+     _________________________________________________________________
+
+    4.5.2.2. The CDPATH
+
+   The CD command in the UNIX, Windows, OS/2, and VMS versions of
+   C-Kermit, as of version 6.1 / 1.1.12, searches the CDPATH for the
+   given directory, if it is not absolute and if a CDPATH environment
+   variable is defined. Example (in UNIX ksh or bash):
+
+  $ export CDPATH=$HOME:$HOME/kermit:/tmp
+
+   Now if you give a "cd xxx" command, no matter what your current
+   directory is, if the "xxx" directory is not a subdirectory of your
+   current directory, then the xxx subdirectory of your home directory is
+   used or if that does not exist, then the xxx subdirectory of the
+   kermit subdirectory of your home directory is used or if that does not
+   exist, then /tmp/xxx is used. This is how the ksh "cd" command works,
+   and now the C-Kermit CD command works the same way.
+
+   In VMS, you can define CDPATH to be a list of directories that contain
+   actual directory delimiters, and/or logical names representing
+   directories, using commas to separate them, e.g.:
+
+  $ define cdpath [HOME],[SOMEOTHERDIR],[HOME.MISC]
+  $ define cdpath SYS$LOGIN:,DISK1:[HOME],DISK2:[SCRATCH.IVAN]
+
+   Example:
+
+  $ define cdpath SYS$LOGIN:,[IVAN],[OLAF],[OLGA.MISC]
+  $ kermit
+  DISK1:[OLGA] C-Kermit> cd blah
+
+   tries the BLAH subdirectory of the user's login directory, then
+   [OLGA.BLAH], [IVAN.BLAH], [OLAF.BLAH], and [OLGA.MISC.BLAH], in that
+   order, using the first one it finds, failing if it finds none.
+
+   In C-Kermit 7.0, you may also set the CDPATH from the Kermit prompt:
+
+   SET CD PATH path
+          Allows the CD PATH to be set from within C-Kermit.
+
+   SHOW CD shows the CD path and all other information relevant to the CD
+   command.
+     _________________________________________________________________
+
+    4.5.2.3. CD Messages
+
+   Whenever you change directory, you can have C-Kermit display a "Read
+   Me" file from the new directory automatically. The commands are:
+
+   SET CD MESSAGE { ON, OFF, FILE list }
+          ON enables this feature; OFF (the default) disables it. File
+          lets you specify the name of the "Read Me" file. A list of
+          names to look for can be given in the following format:
+
+  {{name1}{name2}{name3}{...}}
+
+          e.g.:
+
+  SET SERVER CD-MESSAGE FILE {{./.readme}{README.TXT}{READ.ME}}
+
+          The default list of CD-message files is system dependent.
+
+   SHOW CD shows your current directory, previous directory, CD path, and
+   CD message info.
+     _________________________________________________________________
+
+    4.5.3. Creating and Removing Directories
+
+   The MKDIR command now allows you to create multiple directories at
+   once:
+
+  C-Kermit> mkdir a/b/c/d
+
+   creates the directory a in the current directory (if it doesn't exist
+   already), and then creates subdirectory b in the a directory (if it
+   didn't exist already), and so on.
+
+   If you use MKDIR to try to create a directory that already exists,
+   C-Kermit will print a warning ("?Directory already exists"), but the
+   MKDIR command will still succeed. If you want to avoid the warning
+   message, use IF DIRECTORY first to check if the directory already
+   exists.
+
+   The RMDIR command, however, will not remove more than one directory,
+   nor will it remove a directory that contains any files. (There is, as
+   yet, no RMDIR /RECURSIVE command, although one might be added later.)
+
+   In VMS, these commands (like CD) are more forgiving of your syntax
+   than is the DCL command shell; "mkdir oofa" is equivalent to "mkdir
+   [.oofa]" and so on. Also in VMS, you'll find that C-Kermit's RMDIR
+   command is easier than deleting a directory in DCL, since it
+   automatically first gives it owner delete permission if you are the
+   owner.
+     _________________________________________________________________
+
+    4.5.4. The DELETE and PURGE Commands
+
+   The DELETE command now offers a selection of switches, and has a new
+   companion, the PURGE command. First, DELETE:
+
+   DELETE [ switches... ] filespec
+          Deletes the file or files that match the filespec, which may
+          contain wildcards ([468]Section 4.9).
+
+   Optional switches include the standard file-selection switches
+   presented in [469]Section 1.5.4, plus:
+
+   /ASK
+          Before deleting each file, ask permission interactively.
+          Answers are Yes or OK (delete the file), No (don't delete it),
+          or Quit (stop executing the DELETE command).
+
+   /NOASK
+          Don't ask permission to delete each file.
+
+   /LIST
+          List each file and show whether it was deleted. Synonyms: /LOG,
+          /VERBOSE.
+
+   /NOLIST
+          Don't list files while deleting them. Synonyms: /NOLOG, /QUIET.
+
+   /HEADING
+          Print a heading and summary line.
+
+   /NOHEADING
+          Don't print a heading and summary line.
+
+   /PAGE
+          When listing, pause at the end of each screenful and give the
+          "More?" prompt. If you reply "n" (no), the DELETE command
+          terminates.
+
+   /SIMULATE
+          Do everything implied by the given switches and filespec,
+          except do not actually delete any files. This lets you preview
+          which files would be deleted; implies /LIST.
+
+   Now the PURGE command:
+
+   PURGE [ switches... ] [ filespec ]
+          (VMS only) Runs the DCL PURGE command. Switches and filespec,
+          if any, are passed directly to DCL without parsing or
+          verification. Deletes excess versions of the given (or all)
+          files. The rest of this section does not apply to VMS.
+
+   PURGE [ switches... ] [ filespec ]
+          (UNIX only) Deletes "backup files" that match the filespec,
+          which may contain wildcards ([470]Section 4.9). If no filespec
+          is given, all backup files in the current directory are
+          selected (subject to modification by any switches). Do not
+          include backup notation in the filespec.
+
+   Explanation:
+
+   To avoid destroying preexisting files when a new file arrives that has
+   the same name, C-Kermit backs up the old file by appending a "backup
+   number" to its name. In UNIX, the backup suffix consists of a period,
+   a tilde, a number, and another tilde. For example, if a file called
+   oofa.txt exists and a new oofa.txt file arrives, the original is
+   renamed to oofa.txt.~1~. If another oofa.txt file arrives, the
+   existing one is renamed to oofa.txt.~2~. And so on. This system is
+   compatible with the one used by EMACS. Thus over time, if you receive
+   a lot of files with C-Kermit or edit them with EMACS, backup files can
+   build up. The new PURGE command lets you clean out accumulated backup
+   files:
+
+   Optional switches include the standard file-selection switches
+   presented in [471]Section 1.5.4, plus all the switches listed above
+   for the DELETE command, plus:
+
+   /KEEP:n
+          Retains the n most recent (highest-numbered) backup files for
+          each file. For example, if oofa.txt, oofa.txt.~1~,
+          oofa.txt.~2~, oofa.txt.~10~, oofa.txt.~12~, and oofa.txt.~100~
+          exist, "purge /keep:2 oofa.txt" deletes oofa.txt.~1~,
+          oofa.txt.~2~, and oofa.txt.~10~, and keeps oofa.txt,
+          oofa.txt.~12~, and oofa.txt.~100~. If /KEEP is given without a
+          number, one (the highest numbered) backup file is kept.
+
+   CAUTION: The PURGE command should be used only when *.~*~ files truly
+   are backup files. This is the case for EMACS, and it is the DEFAULT
+   for C-Kermit. However, if C-Kermit's FILE COLLISION has been set to
+   RENAME, newly received files will look like backup files. In that
+   case, don't use the PURGE command or you'll be removing new files
+   rather than old ones. (Use SHOW FILE to find the FILE COLLISION
+   setting.)
+
+   The PURGE command is presently available only in UNIX. The command
+   succeeds if it deleted any files, or if it deleted no files but there
+   were no errors. It fails if it deleted no files and there were errors
+   (i.e. deletion was attempted but failed). In VMS, backup file versions
+   are handled automatically by the OS, and a PURGE command can be used
+   at the VMS prompt to clean them up.
+
+   If you want certain switches to be supplied automatically with each
+   DELETE or PURGE command, you can set them with SET OPTIONS
+   ([472]Section 1.5.5) and you can display any such settings with SHOW
+   OPTIONS. Of course you can override them on a per-command basis by
+   including switches in your PURGE or DELETE command.
+
+   Also see SET FILE COLLISION, SHOW FILE, SEND /NOBACKUP, SET SEND
+   BACKUP, and DIRECTORY /[NO]BACKUP.
+     _________________________________________________________________
+
+  4.6. Starting the Remote Kermit Server Automatically
+
+   As noted on pages 275-276 of [473]Using C-Kermit 2nd edition, you can
+   have Kermit send "kermit receive" commands automatically when it is in
+   local mode and you give a SEND or similar command, to start the remote
+   Kermit receiver in case it is not already started. The "kermit
+   receive" commands are specified by:
+
+  SET PROTOCOL KERMIT binary-receive-command text-receive-command
+
+   As of version 7.0, a Kermit protocol option has been added to send a
+   string to the host in advance of any Kermit packets when you give a
+   GET-class or REMOTE command. This will switch the remote C-Kermit into
+   the appropriate mode or, if the remote system is at a system command
+   (shell) prompt, execute the string on the remote system. The new
+   syntax of the SET PROTOCOL KERMIT command is:
+
+  SET PROTOCOL KERMIT [ s1 [ s2 [ s3 ] ] ]
+
+   where:
+
+       Default         Meaning
+  s1  {kermit -ir}     Remote "kermit receive in binary mode" command.
+  s2  {kermit -r}      Remote "kermit receive in text mode" command.
+  s3  {kermit -x}      Remote "start kermit server" command.
+
+   NOTE: If the remote Kermit is 6.0, the following are recommended for
+   fast startup and high-performance file transfer (see Appendix I in
+   [474]Using C-Kermit, second Edition, for command-line options):
+
+  s1   kermit -YQir   (Kermit receive binary, skip init file, fast.)
+  s2   kermit -YQTr   (Kermit receive text, skip init file, fast.)
+  s3   kermit -YQx    (Kermit server, skip init file, fast.)
+
+   If the remote is C-Kermit 7.0 or later, change the -x option (enter
+   server mode) to -O (uppercase letter O), which means "enter server
+   mode for One transaction only); this way, it is not stuck in server
+   after the transfer. Also note that the Q is redundant in version 7.0,
+   since fast Kermit protocol settings are now the default.
+
+   Note that in case the C-Kermit executable is called "wermit" or
+   "ckermit" you can change "kermit" in the strings above to "wermit" or
+   "ckermit" and C-Kermit 7.0 or later will recognize these as synonyms
+   for "kermit", in case it is at its command prompt when one of these
+   strings is sent to it.
+     _________________________________________________________________
+
+  4.7. File-Transfer Command Switches
+
+   Over the years, various new methods of transferring a file have
+   accumulated, until we had, in addition to the SEND command, also MOVE
+   (send and then delete), MAIL (send as email), REMOTE PRINT (send to be
+   printed), CSEND (send the output of a command), PSEND (send a part of
+   a file), BSEND (send in binary mode), RESEND (resume an interrupted
+   SEND), etc etc. Similarly: GET, REGET, CGET, RETRIEVE, and so on.
+
+   Not only is it confusing to have different names for these commands,
+   many of which are not real words, but this also does not allow all
+   combinations, like "send a file as mail, then delete it".
+
+   In C-Kermit 7.0, the SEND, GET, and RECEIVE commands were restructured
+   to accept modifier switches (switches are explained in [475]Section
+   1.5).
+     _________________________________________________________________
+
+    4.7.1. SEND Command Switches
+
+   Without switches, the SEND command still works exactly as before:
+
+  send oofa.txt      ; send a single file
+  send oofa.*        ; send multiple files
+  send oofa.txt x.x  ; send oofa.txt as x.x (tell receiver its name is x.x)
+  send               ; send from SEND-LIST
+
+   But now the following modifier switches may be included between "send"
+   and the filename. Zero, one, two, or more switches may be included in
+   any combination that makes sense. Switch names (such as /BINARY) can
+   be abbreviated, just like any other keywords. Most of these switches
+   work only when using Kermit protocol (/TEXT and /BINARY are the
+   exceptions).
+
+   /AFTER:date-time
+          Specifies that only those files modified (or, in VMS, created)
+          after the given date-time (see [476]Section 1.6) are to be
+          sent. Examples:
+
+  send /text /after:{2-Feb-1997 10:28:30} *.txt
+  send /text /after:\fdate(oofa.txt) *.txt
+
+          Synonym: /SINCE.
+
+   /ARRAY:arrayname
+          Specifies that instead of sending a file, C-Kermit is to send
+          the contents of the given array. Since an array does not have a
+          filename, you should include an /AS-NAME switch to specify the
+          name under which the array is to be sent (if you do not, the
+          name "_array_x_" is used, where 'x' is replaced by the array
+          designator). See [477]section 7.10 for array-name syntax. As
+          noted in that section, you can also include a range to have a
+          segment of the array sent, rather than the whole thing; for
+          example: "send /array:&a[100:199]". It is strongly recommended
+          that you accompany the /ARRAY switch with a /TEXT or /BINARY
+          switch to force the desired transfer mode, since otherwise the
+          various automatic mechanisms might switch to binary mode when
+          you really wanted text, or vice versa. In text mode a line
+          terminator is added to the end of each array element, but not
+          in binary mode. For details and examples see [478]Section
+          7.10.11.
+
+   /AS-NAME:text
+          Specifies "text" as the name to send the file under. You can
+          also still specify the as-name as the second filename on the
+          SEND command line. The following two commands are equivalent:
+
+  send oofa.txt oofa.new
+  send /as:oofa.new oofa.txt
+
+   /BEFORE:date-time
+          Specifies that only those files modified (or, in VMS, created)
+          before the given date-time ([479]Section 1.6) are to be sent.
+
+   /BINARY
+          Performs this transfer in binary mode without affecting the
+          global transfer mode, overriding not only the FILE TYPE and
+          TRANSFER MODE settings, but also the FILE PATTERN setting, but
+          for this SEND command only. In other words, SEND /BINARY means
+          what it says: send the file in binary mode, regardless of any
+          other settings. Example:
+
+  set file type text      ; Set global transfer mode to text
+  send /binary oofa.zip   ; Send a file in binary
+  send oofa.txt           ; This one is sent in text mode
+
+   /COMMAND
+          SEND /COMMAND is equivalent to CSEND ([480]Section 4.2.2) -- it
+          says to send the output from a command, rather than the
+          contents of a file. The first "filename" on the SEND command
+          line is interpreted as the name of a command; the second (if
+          any) is the as-name. Examples:
+
+  send /command {grep Sunday oofa.txt} sunday.txt
+  send /as-name:sunday.txt /command {grep Sunday oofa.txt}
+  send /bin /command {tar cf - . | gzip -c} {!gunzip -c | tar xf -}
+
+   /DELETE
+          Deletes the file (or each file in the group) after it has been
+          sent successfully (but does not delete it if it was not sent
+          successfully). SEND /DELETE is equivalent to MOVE. Has no
+          effect when used with /COMMAND. Example:
+
+  send /delete *.log
+
+   /DOTFILES
+          (UNIX and OS-9 only) Normally files whose names begin with "."
+          are skipped when matching wildcards that do not also beging
+          with ".". Include /DOTFILES to force these files to be included
+          too.
+
+   /RECURSIVE
+          Descend the through the directory tree when locating files to
+          send. Automatically sets /PATHNAMES:RELATIVE. Explained in
+          [481]Section 4.11 .
+
+   /EXCEPT:pattern
+          See [482]Section 1.5.4.
+
+   /NOBACKUP
+          This means to skip backup files when sending, even if they
+          match the SEND file specification. This is equivalent to using
+          SEND /EXCEPT and including *.~[0-9]*~ in the exception list (or
+          *.~*~ if Kermit was built without pattern-matching support; see
+          [483]Section 4.9.1). Including this switch is equivalent to
+          giving SET SEND BACKUP OFF ([484]Section 4.0.6) prior to SEND,
+          except its effect is local to the SEND command with which it
+          was given.
+
+   /NODOTFILES
+          The opposite of /DOTFILES (q.v.)
+
+   /FILENAMES:{CONVERTED,LITERAL}
+          Use this switch to override the current global SET FILE NAMES
+          setting for this transfer only.
+
+   /FILTER:command
+          This specifies a filter to pass the file through before sending
+          it. See the [485]section on file-transfer pipes and filters.
+          The /FILTER switch applies only to the file-transfer command it
+          is given with; it does not affect the global SEND FILTER
+          setting, if any.
+
+   /IMAGE
+          VMS: Sends in image mode. Non-VMS: same as /BINARY.
+
+   /LABELED
+          VMS and OS/2 only: Sends in labeled mode.
+
+   /LARGER-THAN:number
+          Specifies that only those files that are longer than the given
+          number of bytes are to be sent.
+
+   /LISTFILE:filename
+          Specifies that the files to be sent are listed in a file with
+          the given filename. The file contains one filename per line.
+          These filenames are not checked in any way; each filename is
+          taken and does not use or depend on any Kermit-specific syntax.
+          In particular, backslashes are not treated specially, leading
+          and trailing spaces are not stripped, etc. However, if a
+          filename contains wildcards, they are expanded. Example: If a
+          file named files.txt contains the following lines:
+
+  blah.txt
+  oofa*
+  x.x
+
+          (but without leading or trailing spaces), then the C-Kermit
+          command "send /listfile:files.txt" will send the files
+          blah.txt, x.x, and all files whose names start with "oofa",
+          assuming the files exist and are readable. The /LISTFILE
+          switch, can, of course, be used with other switches when it
+          makes sense, for example, /EXCEPT, /BINARY, /AFTER, /SMALLER,
+          /MOVE-TO, /DELETE, /AS-NAME with a template, etc.
+
+   /MAIL:address
+          Sends the file as e-mail to the given address or addresses.
+          "send /mail:address filename" is equivalent to "mail filename
+          address". You can include multiple addresses separated by
+          commas. Examples:
+
+  send /mail:kermit-support@columbia.edu packet.log
+  send /mail:cmg,fdc,jrd oofa.txt
+
+          As with any switch argument, if the address or address list
+          contains any spaces, you must enclose it in braces. The format
+          of the addresses must agree with that understood by the
+          mail-sending program on the receiver's computer.
+
+   /MOVE-TO:directory-name
+          Specifies that after each (or the only) source file is sent
+          successfully, and ONLY if it is sent successfully, it should be
+          moved to the named directory. If the directory name contains
+          spaces, enclose it in braces. If the directory does not exist,
+          it is created if possible; if it can't be created, the command
+          fails and an error message is printed. Example:
+
+  send /text /move-to:/users/olga/backup/ *.txt
+
+   /NOT-AFTER:date-time
+          Specifies that only those files modified at or before the given
+          date and time are to be sent.
+
+   /NOT-BEFORE:date-time
+          Specifies that only those files modified at or after the given
+          date and time are to be sent.
+
+   /PATHNAMES:{OFF,ABSOLUTE,RELATIVE}
+          Use this switch to override the current global SET SEND
+          PATHNAMES setting for this transfer only. /PATHNAMES:ABSOLUTE
+          or RELATIVE also sets /FILENAMES:LITERAL (also for this
+          transfer only) since pathnames are not sent otherwise.
+
+   /RENAME-TO:text
+          Specifies that after the (or each) source file is sent
+          successfully, and ONLY if it is sent successfully, it should be
+          renamed to the name given. If the name contains spaces, enclose
+          it in braces. If a file group is being sent, then the "text"
+          must contain a variable reference such as \v(filename) (see
+          [486]Section 4.1). Example:
+
+  send /rename-to:ok_\v(filename) *.*
+
+          This sends each file in the current directory and if it was
+          sent successfully, changes its name to begin with "ok_".
+
+   /SMALLER-THAN:number
+          Specifies that only those files that are smaller than the given
+          number of bytes are to be sent.
+
+   /SUBJECT:text
+          Subject for email. Actually, this is just a synonym for
+          /AS-NAME. If the text includes spaces, you must enclose it in
+          braces. If you don't specify a subject (or as-name), the name
+          of the file is used as the subject. Example:
+
+  send /mail:kermit-support@columbia.edu /subj:{As requested} packet.log
+
+   /PRINT:options
+          Sends the file to be printed, optionally specifying options for
+          the printer. Equivalent to REMOTE PRINT filename options.
+          Examples:
+
+  send /print oofa.txt              ; No options.
+  send /print:/copies=3 oofa.txt    ; "/copies=3" is a VMS PRINT switch.
+  send /print:-#3 oofa.txt          ; "-#3" is a UNIX lpr switch.
+
+   /PROTOCOL:name
+          Uses the given protocol to send the file (Kermit, Zmodem, etc)
+          for this transfer without changing global protocol. Only
+          available in Kermit 95, UNIX, and OS-9. Example:
+
+  set protocol kermit               ; Set global protocol
+  send /proto:zmodem /bin oofa.zip  ; Send just this file with Zmodem
+  send oofa.txt                     ; This file is sent with Kermit
+
+   /QUIET
+          When sending in local mode, this suppresses the file-transfer
+          display.
+
+   /RECOVER
+          Used to recover from a previously interrupted transfer; SEND
+          /RECOVER is equivalent to RESEND. Recovery only works in binary
+          mode; SEND /RECOVER and RESEND include an implied /BINARY
+          switch. Even then, recovery will successful only if (a) the
+          original (interrupted) transfer was also in binary mode, or (b)
+          if it was in text mode, the two Kermit programs run on
+          platforms where text-mode transfers are not length-changing.
+
+   /STARTING:number
+          Starts sending the file from the given byte position. SEND
+          /STARTING:n filename is equivalent to PSEND filename n.
+
+   /TEXT
+          Performs this transfer in text mode without affecting the
+          global transfer mode, overriding not only the FILE TYPE and
+          TRANSFER MODE settings, but also the FILE PATTERN setting, for
+          this SEND command only. In other words, SEND /TEXT really send
+          the file in text mode, regardless of any other settings or
+          negotiations.
+
+   About mail... Refer to [487]Section 4.7.1. The same rules apply as for
+   file transfer. If you are mailing multiple files, you can't use an
+   as-name (in this case, a subject) unless it contains replacement
+   variables like \v(filenum). For example, if you:
+
+  send /mail:somebody@xyz.com *.txt
+
+   Then each file will arrive as a separate email message with its name
+   as the subject. But if you:
+
+  send /mail:somebody@xyz.com /subject:{Here is a file} *.txt
+
+   Then each file message will have the same subject, which is probably
+   not what you want. You can get around this with constructions like:
+
+  send /mail:somebody@xyz.com /subject:{Here is \v(filename)} *.txt
+
+   which embed the filename in the subject.
+
+   The MOVE, CSEND, MAIL, and RESEND commands now also accept the same
+   switches. And the switches are also operative when sending from a
+   SEND-LIST (see [488]Using C-Kermit, 2nd Ed, pp.191-192), so, for
+   example, it is now possible to SEND /PRINT or SEND /MAIL from a
+   SEND-LIST.
+
+   The MSEND and MMOVE commands also take switches, but not all of them.
+   With these commands, which take an arbitrary list of filespecs, you
+   can use /BINARY, /DELETE, /MAIL, /PRINT, /PROTOCOL, /QUIET, /RECOVER,
+   and /TEXT (and /IMAGE or /LABELED, depending on the platform). MMOVE
+   is equivalent to MSEND /DELETE. (If you want to send a group of files,
+   but in mixed transfer modes with per-file as-names, use ADD SEND-LIST
+   and then SEND.)
+
+   The MSEND/MMOVE switches come before the filenames, and apply to all
+   of them:
+
+  msend /print /text *.log oofa.txt /etc/motd
+
+   If you type any of these commands (SEND, CSEND, MSEND, etc) followed
+   by a question mark (?), you will see a list of the switches you can
+   use. If you want to see a list of filenames, you'll need to type
+   something like "send ./?" (UNIX, OS/2, Windows, etc), or "send []?"
+   (VMS), etc. Of course, you can also type pieces of a filename
+   (anything that does not start with "/") and then "?" to get a list of
+   filenames that start that way; e.g. "send x.?" still works as before.
+
+   In UNIX, where "/" is also the directory separator, there is usually
+   no ambiguity between a fully-specified pathname and a switch, except
+   when a file in the root directory has the same name as a switch (as
+   noted in [489]Section 1.5):
+
+  send /etc/motd                        ; Works as expected
+  send /command                         ; ???
+
+   The second example interprets "/command" as a switch, not a filename.
+   To send a file actually called "command" in the root directory, use:
+
+  send {/command}
+
+   or other system-dependent forms such as //command, /./command,
+   c:/command, etc, or cd to / and then "send command".
+     _________________________________________________________________
+
+    4.7.2. GET Command Switches
+
+   Without switches, the GET command still works about the same as
+   before:
+
+  get oofa.txt                          ; GET a single file
+  get oofa.*                            ; GET multiple files
+
+   However, the mechanism for including an "as-name" has changed.
+   Previously, in order to include an as-name, you were required to use
+   the "multiline" form of GET:
+
+  get
+  remote-filespec
+  local-name
+
+   This was because the remote filespec might contain spaces, and so
+   there would be no good way of telling where it ended and where the
+   local name began, e.g:
+
+  get profile exec a foo
+
+   But now since we can use {braces} for grouping, we don't need the
+   multiline GET form any more, and in fact, support for it has been
+   removed. If you give a GET command by itself on a line, it fails and
+   an error message is printed. The new form is:
+
+   GET [ switches... ] remote-name [ local-name ]
+          Ask the server to send the file whose name is remote-name. If
+          the optional local-name is given, store it locally under this
+          name. If the remote-name or local-name contains spaces, they
+          must be enclosed in braces:
+
+  get {profile exec a} foo
+  get oofa.txt {~/My Files/Oofa text}
+
+   If you want to give a list of remote file specifications, use the MGET
+   command:
+
+   MGET [ switches... ] remote-name [ remote-name [ remote-name ... ] ]
+          Ask the server to send the files whose names are given.
+
+   Now you can also include modifier switches between GET or MGET and the
+   remote-name; most of the same switches as SEND:
+
+   /AS-NAME:text
+          Specifies "text" as the name to store the incoming file under.
+          (This switch is not available for MGET.) You can also still
+          specify the as-name as the second filename on the GET command
+          line. The following two commands are equivalent:
+
+  get oofa.txt oofa.new
+  get /as:oofa.new oofa.txt
+
+   /BINARY
+          Tells the server to send the given file(s) in binary mode
+          without affecting the global transfer mode. Example:
+
+  set file type text      ; Set global transfer mode to text
+  get /binary oofa.zip    ; get a file in binary mode
+  get oofa.txt            ; This one is transferred in text mode
+
+          Or, perhaps more to the point:
+
+  get /binary foo.txt     ; where "*.txt" is a text-pattern
+
+          This has the expected effect only if the server is C-Kermit 7.0
+          or later or K95 1.1.19 or later.
+
+   /COMMAND
+          GET /COMMAND is equivalent to CGET ([490]Section 4.2.2) -- it
+          says to receive the file into the standard input of a command,
+          rather than saving it on disk. The /AS-NAME or the second
+          "filename" on the GET command line is interpreted as the name
+          of a command. Examples:
+
+  get /command sunday.txt {grep Sunday oofa.txt}
+  get /command /as-name:{grep Sunday oofa.txt} sunday.txt
+  get /bin /command {!gunzip -c | tar xf -} {tar cf - . | gzip -c}
+
+   /DELETE
+          Asks the Kermit server to delete the file (or each file in the
+          group) after it has been transferred successfully (but not to
+          delete it if it was not sent successfully). GET /DELETE is
+          equivalent to RETRIEVE. Example:
+
+  get /delete *.log
+
+   /EXCEPT:pattern
+          Specifies that any files whose names match the pattern, which
+          can be a regular filename, or may contain "*" and/or "?"
+          metacharacters, are to be refused upon arrival. To specify
+          multiple patterns (up to 8), use outer braces around the group,
+          and inner braces around each pattern:
+
+  /EXCEPT:{{pattern1}{pattern2}...}
+
+          See the description of SEND /EXCEPT in [491]Section 4.7.1 for
+          examples, etc. Refusal is accomplished using the Attribute
+          Rejection mechanism (reason "name"), which works only when
+          Attribute packets have been successfully negotiated.
+
+   /FILENAMES:{CONVERTED,LITERAL}
+          Use this switch to override the current global SET FILE NAMES
+          setting for this transfer only.
+
+   /FILTER:command
+          This specifies a filter to pass the incoming file through
+          before writing to disk. See the [492]section on file-transfer
+          pipes and filters. The /FILTER switch applies only to the
+          file-transfer command it is given with; it does not affect the
+          global RECEIVE FILTER setting, if any.
+
+   /IMAGE
+          VMS: Transfer in image mode. Non-VMS: same as /BINARY.
+
+   /LABELED
+          VMS and OS/2 only: Specifies labeled transfer mode.
+
+   /MOVE-TO:directory
+          This tells C-Kermit to move each file that is successfully
+          received to the given directory. Files that are not
+          successfully received are not moved. By default, files are not
+          moved.
+
+   /PATHNAMES:{OFF,ABSOLUTE,RELATIVE,AUTO}
+          Use this switch to override the current global SET RECEIVE
+          PATHNAMES setting for this transfer only. /PATHNAMES:ABSOLUTE
+          or RELATIVE also sets /FILENAMES:LITERAL (also for this
+          transfer only) since incoming pathnames would not be treated as
+          pathnames otherwise. See [493]Section 4.10.
+
+   /QUIET
+          When sending in local mode, this suppresses the file-transfer
+          display.
+
+   /RECOVER
+          Used to recover from a previously interrupted transfer; GET
+          /RECOVER is equivalent to REGET. Recovery only works in binary
+          mode; SEND /RECOVER and RESEND include an implied /BINARY
+          switch. Even then, recovery will successful only if (a) the
+          original (interrupted) transfer was also in binary mode, or (b)
+          if it was in text mode, the two Kermit programs run on
+          platforms where text-mode transfers are not length-changing.
+
+   /RECURSIVE
+          Tells the server that the GET file specification applies
+          recursively. This switch also automatically sets
+          /PATHNAMES:RELATIVE in both the server AND the client. When
+          used in conjunction with /DELETE, this "moves" a directory tree
+          from the server's computer to the client's computer (except
+          that only regular files are deleted from the server's computer,
+          not directories; thus the original directories will be left,
+          but will contain no files). Note that all servers that support
+          /RECURSIVE do not necessarily do so in combination with other
+          switches, such as /RECOVER. (Servers that do include C-Kermit
+          7.0 and later, K95 1.1.19 and later.)
+
+   /RENAME-TO:string
+          This tells C-Kermit to rename each file that is successfully
+          received to the given string. Files that are not successfully
+          received are not renamed. By default, files are not renamed.
+          The string can be a literal string, which is appropriate when
+          only one file is being received, or it can contain one or more
+          variables that are to be evaluated at the time each file is
+          received, such as \v(filename), \v(filenumber), \v(ntime),
+          \v(pid), \v(user), etc. WARNING: if you give a literal string
+          and more than one file arrives, each incoming file will be
+          given the same name (but SET FILE COLLISION BACKUP or RENAME
+          can be used to keep the incoming files from overwriting each
+          other).
+
+   /TEXT
+          Tells the server to perform this transfer in text mode without
+          affecting its global transfer mode. See /BINARY for additional
+          info.
+
+   The /MAIL and /PRINT options are not available (as they are for SEND),
+   but you can use /COMMAND to achieve the same effect, as in these UNIX
+   examples:
+
+  get /command oofa.txt {mail kermit@columbia.edu}
+  get /command oofa.txt lpr
+
+   In OS/2 or Windows, you can GET and print like this:
+
+  get oofa.txt prn
+
+   The CGET, REGET, RETRIEVE commands also accept the same switches as
+   GET. CGET automatically sets /COMMAND; REGET automatically sets
+   /RECOVER and /BINARY, and RETRIEVE automatically sets /DELETE.
+     _________________________________________________________________
+
+    4.7.3. RECEIVE Command Switches
+
+   Without switches, the RECEIVE command still works as before:
+
+  receive            ; Receives files under their own names
+  receive /tmp       ; Ditto, but into the /tmp directory
+  r                  ; Same as "receive"
+  receive foo.txt    ; Receives a file and renames to foo.txt
+
+   Now you can also include modifier switches may be included between
+   "receive" and the as-name; most of the same switches as GET:
+
+   /AS-NAME:text
+          Specifies "text" as the name to store the incoming file under.
+          You can also still specify the as-name as a filename on the
+          command line. The following two commands are equivalent:
+
+  r oofa.new
+  r /as:oofa.new
+
+   /BINARY
+          Performs this transfer in binary mode without affecting the
+          global transfer mode. NOTE: This does not override the incoming
+          filetype (as it does with GET), so this switch is useful only
+          if ATTRIBUTE TYPE is OFF, or if the other Kermit does not send
+          a TYPE (text or binary) attribute. In any case, it has no
+          affect whatsoever on the file sender.
+
+   /COMMAND
+          RECEIVE /COMMAND is equivalent to CRECEIVE ([494]Section 4.2.2)
+          -- it says to receive the file into the standard input of a
+          command, rather than saving it on disk. The /AS-NAME or the
+          "filename" on the RECEIVE command line is interpreted as the
+          name of a command.
+
+  r /command {grep Sunday oofa.txt}
+  r /command /as-name:{grep Sunday oofa.txt}
+  r /bin /command {tar cf - . | gzip -c}
+
+   /EXCEPT:pattern
+          Specifies that any files whose names match the pattern, which
+          can be a regular filename, or may contain "*" and/or "?"
+          metacharacters, are to be refused upon arrival. To specify
+          multiple patterns (up to 8), use outer braces around the group,
+          and inner braces around each pattern:
+
+  /EXCEPT:{{pattern1}{pattern2}...}
+
+          See the description of SEND /EXCEPT in [495]Section 4.7.1 for
+          examples, etc. Refusal is accomplished using the Attribute
+          Rejection mechanism (reason "name"), which works only when
+          Attribute packets have been successfully negotiated.
+
+   /FILENAMES:{CONVERTED,LITERAL}
+          Use this switch to override the current global SET FILE NAMES
+          setting for this transfer only.
+
+   /FILTER:command
+          This specifies a filter to pass the incoming file through
+          before writing to disk. See the [496]section on file-transfer
+          pipes and filters. The /FILTER switch applies only to the
+          file-transfer command it is given with; it does not affect the
+          global RECEIVE FILTER setting, if any.
+
+   /IMAGE
+          VMS: Transfer in image mode. Non-VMS: same as /BINARY. See
+          comments under RECEIVE /BINARY.
+
+   /LABELED
+          VMS and OS/2 only: Specifies labeled transfer mode. See
+          comments under RECEIVE /BINARY.
+
+   /MOVE-TO:directory
+          This tells C-Kermit to move each file that is successfully
+          received to the given directory. Files that are not
+          successfully received are not moved. By default, files are not
+          moved.
+
+   /PATHNAMES:{ABSOLUTE,RELATIVE,OFF,AUTO}
+          Use this switch to override the current global SET RECEIVE
+          PATHNAMES setting for this transfer only. See [497]Section
+          4.10.
+
+   /RECURSIVE
+          When used with the RECEIVE command, /RECURSIVE is simply a
+          synonym for /PATHNAMES:RELATIVE.
+
+   /RENAME-TO:string
+          This tells C-Kermit to rename each file that is successfully
+          received to the given string. Files that are not successfully
+          received are not renamed. By default, files are not renamed.
+          The string can be a literal string, which is appropriate when
+          only one file is being received, or it can contain one or more
+          variables that are to be evaluated at the time each file is
+          received, such as \v(filename), \v(filenumber), \v(ntime),
+          \v(pid), \v(user), etc. WARNING: if you give a literal string
+          and more than one file arrives, each incoming file will be
+          given the same name (but SET FILE COLLISION BACKUP or RENAME
+          can be used to keep the incoming files from overwriting each
+          other).
+
+   /QUIET
+          When receiving in local mode, this suppresses the file-transfer
+          display.
+
+   /TEXT
+          Receives in text mode without affecting the global transfer
+          mode. See comments under RECEIVE /BINARY.
+
+   The /MAIL and /PRINT options are not available, but you can use
+   /COMMAND to achieve the same effect, as in these UNIX examples:
+
+  r /command {mail kermit@columbia.edu}
+  r /command lpr
+
+   In OS/2 or Windows, you can RECEIVE and print like this:
+
+  receive prn
+
+   The CRECEIVE command now also accepts the same switches.
+     _________________________________________________________________
+
+  4.8. Minor Kermit Protocol Improvements
+
+    4.8.1. Multiple Attribute Packets
+
+   C-Kermit 7.0 now sends more than one Attribute packet if a file's
+   attributes do not fit into a single packet of the negotiated length.
+   If a particular attribute (such as file creation date-time) does not
+   fit within the negotiated length (which will only happen when the
+   negotiated length is around 20 or less), that attribute is not sent at
+   all.
+
+    4.8.2. Very Short Packets
+
+   There are certain situations where extremely short packets must be
+   used; 20 or 30 bytes at most. This can happen when one or more devices
+   along the communication path have very small buffers and lack an
+   effective means of flow control. Examples are sometimes cited
+   involving radio modems.
+
+   When the maximum packet length is shorter than certain packets that
+   would be sent, those packets are either truncated or else broken up
+   into multiple packets. Specifically:
+
+    1. Parameter negotiation packets (I, S, and their ACKs) are truncated
+       to the negotiated length. Any parameters that do not fit are reset
+       to their default values. There is no provision in the Kermit
+       protocol for fragmentation and reassembly of parameter strings.
+    2. File header packets (containing the filename) are simply
+       truncated. There is no provision in the Kermit protocol for
+       fragmentation and reassembly of filenames.
+    3. Attribute packets are fragmented and reassembled as described in
+       4.8.1 without loss of data, except in case a field will not fit at
+       all in the negotiated length (the longest attribute is usually the
+       date and time of file creation/modification) because of the rule
+       that attributes may not be broken across packets.
+    4. Data packets and other packets are unaffected -- they can be as
+       short as they need to be, within reason.
+     _________________________________________________________________
+
+  4.9. Wildcard / File Group Expansion
+
+   "Wildcard" refers to the notation used in filenames to specify a group
+   of files by pattern matching.
+
+    4.9.1. In UNIX C-Kermit
+
+   Prior to C-Kermit 7.0, C-Kermit was capable of expanding wildcard
+   strings containing only the "metacharacters" '*' and '?':
+
+   *
+          Matches any sequence of zero or more characters. For example:
+          "ck*.c" matches all files whose names start with "ck" and end
+          with ".c", including "ck.c".
+
+   ?
+          Matches any single character. For example, "ck?.c" matches all
+          files whose names are exactly 5 characters long and start with
+          "ck" and end with ".c". When typing commands at the prompt, you
+          must precede any question mark to be used for matching by a
+          backslash (\) to override the normal function of question mark,
+          which is providing menus and file lists.
+
+   C-Kermit 7.0 adds the additional features that users of ksh, csh, and
+   bash are accustomed to:
+
+   [abc]
+          Square brackets enclosing a list of characters matches any
+          single character in the list. Example: ckuusr.[ch] matches
+          ckuusr.c and ckuusr.h.
+
+   [a-z]
+          Square brackets enclosing a range of characters; the hyphen
+          separates the low and high elements of the range. For example,
+          [a-z] matches any character from a to z.
+
+   [acdm-z]
+          Lists and ranges may be combined. This example matches a, c, d,
+          or m through z.
+
+   {string1,string2,...}
+          Braces enclose a list of strings to be matched. For example:
+          ck{ufio,vcon,cmai}.c matches ckufio.c, ckvcon.c, or ckcmai.c.
+          The strings may themselves contain metacharacters, bracket
+          lists, or indeed, other lists of strings, but (when matching
+          filenames) they may not contain directory separators.
+
+          Thus, the metacharacters in filenames (and in any other field
+          that can be a pattern, such as the IF MATCH pattern, SEND or
+          GET exception lists, etc) are:
+
+ * ? [ {
+
+          And within braces only, comma (,) is a metacharacter.
+
+   To include a metacharacter in a pattern literally, precede it with a
+   backslash '\' (or two if you are passing the pattern to a macro).
+   Examples:
+
+  send a*b      ; Send all files whose names start with 'a' and end with 'b'.
+  send a?b      ; Ditto, but the name must be exactly three characters long.
+  send a[a-z]b  ; Ditto, but the second character must be a lowercase letter.
+  send a[x\-z]b ; Ditto, except the second character must be 'x', '-', or 'y'.
+  send a[ghi]b  ; Ditto, except the second character must be 'g', 'h', or 'i'.
+  send a[?*]b   ; Ditto, except the second character must be '?' or '*'.
+  send a[\?\*]b ; Same as previous.
+  send *?[a-z]* ; All files with names containing at least one character
+                ; that is followed by a lowercase letter.
+
+   Or, more practically:
+
+  send ck[cuw]*.[cwh]  ; Send the UNIX C-Kermit source files.
+
+   To refer to the C-Kermit sources files and makefile all in one
+   filespec:
+
+  {{makefile,ck[cuw]*.[cwh]}}
+
+   (NOTE: if the entire pattern is a {stringlist}, you must enclose it it
+   TWO pairs of braces, since the SEND command strips the outer brace
+   pair, because of the "enclose in braces if the filename contains
+   spaces" rule).
+
+   If the makefile is called ckuker.mak:
+
+  ck[cuw]*.{[cwh],mak}
+
+   (NOTE: double braces are not needed here since the pattern does not
+   both begin and end with a brace.)
+
+   To add in all the C-Kermit text files:
+
+  ck[cuw]*.{[cwh],mak,txt}
+
+   All of these features can be used anywhere you would type a filename
+   that is allowed to contain wildcards.
+
+   When you are typing at the command prompt, an extra level of quoting
+   is required for the '?' character to defeat its regular function of
+   producing a list of files that match what you have typed so far, for
+   example:
+
+  send ck[cu]?
+
+   lists all the files whose names start with ckc and cku. If you quote
+   the question mark, it is used as a pattern-matching character, for
+   example:
+
+  send ck\?[ft]io.c
+
+   sends all the file and communications i/o modules for all the
+   platforms: ckufio.c, ckutio.c, ckvfio.c, ckvtio.c, etc.
+
+   If, however, a filename actually contains a question mark and you need
+   to refer to it on the command line, you must use three (3)
+   backslashes. For example, if the file is actually called ck?fio.c, you
+   would use:
+
+  send ck\\\?fio.c
+
+   Further notes on quoting:
+
+     * A single backslash is sufficient for quoting a special character
+       at the command prompt or in a command file. However, when passing
+       patterns to macros you'll need double backslashes, and when
+       referring to these patterns within the macro, you'll need to use
+       \fcontents(\%1) (see [498]Section 1.11.5). You should enclose
+       macro argument references in braces in case grouped arguments were
+       passed. Example:
+ define ismatch {
+     if match {\fcont(\%1)} {\fcont(\%2)} {
+         end 0 MATCH
+     } else {
+         end 1 NO MATCH
+     }
+ }
+ ismatch ab*yz a*\\**z           ; Backslash must be doubled
+ ismatch {abc def xyz} *b*e*y*   ; Braces must be used for grouping
+     * Watch out for possible conflicts between {} in filename patterns
+       and {} used for grouping multiple words into a single field, when
+       the pattern has outer braces. For example, in:
+     if match {abc xyz} {a* *z} echo THEY MATCH
+       braces must be used to group "abc xyz" into a single string.
+       Kermit strips off the braces before comparing the string with the
+       pattern. Therefore:
+ if match makefile {makefile,Makefile} echo THEY MATCH
+       does not work, but:
+ if match makefile {{makefile,Makefile}} echo THEY MATCH
+       does.
+     * If you use a pattern that has outer braces, like {*.txt,*.doc}, in
+       a field that accepts a pattern list (like SEND /EXCEPT:xxx),
+       you'll need to add two extra sets of outer braces:
+ send /except:{{{*.txt,*.doc}}} *.*
+
+   C-Kermit's new pattern matching capabilities are also used when
+   C-Kermit is in server mode, so now you can send requests such as:
+
+  get ck[cuw]*.[cwh]
+
+   to a C-Kermit server without having to tell it to SET WILD SHELL
+   first. Previously this would have required:
+
+  mget ckc*.c ckc*.w ckc*.h cku*.c cku*.w cku*.h ckw*.c ckw*.w ckw*.h
+
+   The new pattern matching features make SET WILD SHELL redundant, and
+   barring any objections, it will eventually be phased out. (One
+   possible reason for retaining it would be as an escape mechanism when
+   Kermit does not understand the underlying file system.)
+
+   By the way, patterns such as these are sometimes referred to as
+   "regular expressions", but they are not quite the same. In a true
+   regular expression (for example), "*" means "zero or more repetitions
+   of the previous item", so (for example), "([0-9]*)" would match zero
+   or more digits in parentheses. In Kermit (and in most shells), this
+   matches one digit followed by zero or more characters, within
+   parentheses. Here are some hints:
+
+     * Although you can't match any sequence of digits (or letters, etc),
+       you can match (say) 1, 2, or 3 of them in row. For example, the
+       following pattern matches Kermit backup files (with backup numbers
+       from 1 to 999):
+ *.~{[1-9],[1-9][0-9],[1-9][0-9][0-9]}~
+     * There is presently no NOT operator, so no way to match any
+       character or string EXCEPT the one(s) shown.
+
+   In other wildcarding news...
+
+     * You may now "send xxx" where "xxx" is a directory name, and this
+       will send all the files from the directory xxx, as if you had
+       typed "send xxx/*". You can also use the special shorthand "send
+       ." to send all the files from the current directory.
+     * To easily skip over backup files (the ones whose names end like
+       .~22~) when sending, you can use SEND /NOBACKUP (see [499]Section
+       4.0.6 for details).
+     * When choosing Kermit to expand wildcards, rather than the shell,
+       you can choose whether "dot files" -- files whose names begin with
+       ".", which are normally "invisible" -- should be matched:
+ SET WILD KERMIT /NO-MATCH-DOT-FILES (this is the default)
+ SET WILD KERMIT /MATCH-DOT-FILES    (this allows matching of "." files)
+       or include the /DOTFILES or /NODOTFILES switch on the command you
+       are using, such as SEND or DIRECTORY.
+     * Commands such as DIRECTORY and SEND allow recursive directory
+       traversal. There are also new functions for this to use in
+       scripts. See [500]Section 4.11 for details.
+
+   When building file lists in UNIX, C-Kermit follows symbolic links.
+   Because of this, you might encounter any or all of the following
+   phenomena:
+
+     * Multiple copies of the same file; e.g. one from its real directory
+       and others from links to its real directory, if both the real
+       directory and the links to it are in the wildcard expansion list.
+     * A command might unexpectedly "hang" for a long time because an NFS
+       link might not be responding, or the directory you are looking at
+       contains a link to a huge directory tree (example: "directory
+       /recursive /etc" when /etc/spool is a symlink to /var/spool, which
+       is a large organization's incoming email directory, containing
+       tens of thousands of subdirectories).
+
+   The size of the file list that Kermit can build is limited in most
+   C-Kermit implementations. The limit, if any, depends on the
+   implementation. Use the SHOW FEATURES command and look in the
+   alphabetized options list for MAXWLD to see the value.
+
+    4.9.2. In Kermit 95
+
+   Kermit 95 1.1.19 and later uses the same pattern matching syntax as in
+   UNIX, but (as always) you will encounter numerous difficulties if you
+   use backslash (\) as the directory separator. In any command where K95
+   parses filenames itself (that is, practically any file-oriented
+   command except RUN), you can use forward slash (/) as the directory
+   separator to avoid all the nasty conflicts.
+
+    4.9.3. In VMS, AOS/VS, OS-9, VOS, etc.
+
+   Platforms other than UNIX, Windows 95/98/NT, and OS/2 have their own
+   filename matching capabilities that are, in general, different from
+   Kermit's built-in ones and in any case might conflict with them. For
+   example, [] encloses directory names in VMS.
+
+   Nevertheless you can still use all the pattern-matching capabilities
+   described in [501]Section 4.9.1 by loading a file list into an array
+   (e.g. with \ffiles(*,&a), see [502]Section 4.11.3) and then using IF
+   MATCH on the members.
+     _________________________________________________________________
+
+  4.10. Additional Pathname Controls
+
+   In version 6.0 and earlier, C-Kermit's SET { SEND, RECEIVE } PATHNAMES
+   command had only ON and OFF as options. In version 7.0, there are more
+   choices:
+
+   SET SEND PATHNAMES OFF
+          When sending a file, strip all disk/directory information from
+          the name. Example: "send /usr/olga/letters/oofa.txt" sends the
+          file as "oofa.txt". This applies to actual filenames, not to
+          any as-name you might specify.
+
+   SET SEND PATHNAMES RELATIVE
+          When sending a file, leave the pathname on as given. For
+          example, if your current directory is /usr/olga, "send
+          letters/oofa.txt" sends the file as "letters/oofa.txt", not
+          "/usr/olga/letters/oofa.txt" or "letters.txt".
+
+   SET SEND PATHNAMES ABSOLUTE
+          When sending a file, convert its name to the full, absolute
+          local pathname. For example, if your current directory is
+          /usr/olga, "send letters/oofa.txt" sends the file as
+          "/usr/olga/letters/oofa.txt". NOTE: Even with this setting,
+          device and/or node names are not included. For example, in VMS,
+          any node or device name is stripped; in Windows or OS/2, any
+          disk letter is stripped.
+
+   SET RECEIVE PATHNAMES OFF
+          When receiving a file, strip all disk/directory information
+          from the name before attempting to store it. This applies to
+          incoming filename, not to any as-name you might specify.
+          Example: If a file arrives under the name
+          "/usr/olga/letters/oofa.txt" it is stored simply as "oofa.txt"
+          in your download directory or, if no download directory has
+          been specified, in your current directory.
+
+   SET RECEIVE PATHNAMES RELATIVE
+          When receiving a file, leave the pathname on as it appears in
+          the incoming name, but if the incoming name appears to be
+          absolute, make it relative to your current or download
+          directory. Examples:
+
+          + "oofa.txt" is stored as "oofa.txt".
+          + "letters/oofa.txt" is stored as "letters/oofa.txt"; the
+            "letters" subdirectory is created if it does not already
+            exist.
+          + "/usr/olga/letters/oofa.txt" is stored as
+            "usr/olga/letters/oofa.txt" in your current or download
+            directory, and the "usr", "usr/olga", etc, directories are
+            created if they do not exist.
+
+   SET RECEIVE PATHNAMES ABSOLUTE
+          The incoming filename is used as given. Thus it cannot be
+          stored unless the given path (if any) already exists or can be
+          created. In this case, node, device, or disk designations are
+          NOT stripped, since they most likely were given explicitly by
+          the user as an as-name, meant to be used as given.
+
+   SET RECEIVE PATHNAMES AUTO
+          This is the default, and means RELATIVE if the sender tells me
+          it is a recursive transfer, OFF otherwise.
+
+   Set FILE NAMES CONVERTED now also affects pathnames too. When
+   PATHNAMES are RELATIVE or ABSOLUTE and FILE NAMES are CONVERTED, the
+   file sender converts its native directory-name format to UNIX format,
+   and the file receiver converts from UNIX format to its native one;
+   thus UNIX format is the common intermediate representation for
+   directory hierarchies, as it is in the ZIP/UNZIP programs (which is
+   why ZIP archives are transportable among, UNIX, DOS, and VMS).
+
+   Here's an example in which a file is sent from Windows to UNIX with
+   relative pathnames and FILE NAMES CONVERTED:
+
+  Source name                Intermediate name      Destination Name
+  C:\K95\TMP\OOFA.TXT        K95/TMP/OOFA.TXT       k95/tmp/oofa.txt
+
+   In a more complicated example, we send the same file from Windows to
+   VMS:
+
+  Source name                Intermediate name      Destination Name
+  C:\K95\TMP\OOFA.TXT        K95/TMP/OOFA.TXT       [.K95.TMP]OOFA.TXT
+
+   (Note that disk letters and device designations are always stripped
+   when pathnames are relative).
+
+   As you can imagine, as more and more directory formats are considered,
+   this approach keeps matters simple: on each platform, Kermit must know
+   only its own local format and the common intermediate one. In most
+   cases, the receiver can detect which format is used automatically.
+     _________________________________________________________________
+
+  4.11. Recursive SEND and GET: Transferring Directory Trees
+
+   C-Kermit 7.0 in selected versions (UNIX, VMS, VOS, AOS/VS, Windows,
+   and OS/2 at this writing) now permits the SEND command to traverse
+   directories "recursively" if you ask it to; that is, to send files
+   from the current or specified directory and all of its subdirectories
+   too, and their subdirectories, etc. (Some other commands can do this
+   too, including DIRECTORY.)
+
+   This feature is new to UNIX, Windows, VOS, and OS/2. VMS and AOS/VS
+   have always included "wildcard" or "template" characters that allow
+   this, and in this case, recursive directory traversal could happen
+   behind Kermit's back, i.e. Kermit does not have to do it itself (in
+   VMS, the notation is "[...]" or "[directory...]"; in AOS/VS is "#").
+   In C-Kermit 7.0, however, SEND /RECURSIVE is supported by C-Kermit
+   itself for VMS.
+     _________________________________________________________________
+
+    4.11.1. Command-Line Options
+
+   To descend a directory tree when sending files, use the -L
+   command-line option to indicate that the send operation is to be
+   recursive, and include a name or pattern to be sent. When giving a
+   pattern, you should enclose it in quotes to prevent the shell from
+   expanding it. Examples:
+
+  $ kermit -Ls "/usr/olga/*" # send all of Olga's files in all her directories
+  $ kermit -Ls foo.txt       # send all foo.txt files in this directory tree
+  $ kermit -Ls "*.txt"       # send all .txt files in this directory tree
+  $ kermit -Ls "letters/*"   # send all files in the letters directory tree
+  $ kermit -Ls letters       # send all files in the letters directory tree
+  $ kermit -Ls "*"           # send all files in this directory tree
+  $ kermit -Ls .             # UNIX only: send all files in this directory tree
+  $ kermit -s .              # UNIX only: a filename of . implies -L
+
+   If you let the shell expand wildcards, Kermit only sends files whose
+   names match files in the current or given directory, because the shell
+   replaces an unquoted wildcard expression with the list of matching
+   files -- and the shell does not build recursive lists. Note that the
+   "." notation for the tree rooted at the current directory is allowed
+   only in UNIX, since in Windows and OS/2, it means "*.*"
+   (nonrecursive).
+     _________________________________________________________________
+
+    4.11.2. The SEND /RECURSIVE Command
+
+   If you include the /RECURSIVE switch in a SEND (or MOVE, or similar)
+   command, it means to descend the current or specified directory tree
+   searching for files whose names match the given name or pattern. Since
+   this is not terribly useful unless you also include pathnames with the
+   outbound files, the /RECURSIVE switch also includes an implicit
+   /PATHNAMES:RELATIVE switch (which you can undo by including an
+   explicit /PATHNAMES switch after the /RECURSIVE switch).
+
+   Examples:
+
+   SEND /RECURSIVE *
+          Sends all of the files in the current directory and all the
+          files in all of its subdirectories, and all of their
+          subdirectories, etc, including their relative pathnames. Empty
+          directories are not sent.
+
+   SEND /RECURSIVE /PATHNAMES:ABSOLUTE *
+          Sends all of the files in the current directory and all the
+          files in all of its subdirectories, and all of their
+          subdirectories, etc, including their absolute pathnames.
+
+   SEND /RECURSIVE /PATHNAMES:OFF *
+          Sends all of the files in the current directory and all the
+          files in all of its subdirectories, and all of their
+          subdirectories, etc, without pathnames.
+
+   SEND /RECURSIVE /usr/olga/*
+          Sends all of the files in the /usr/olga directory and all the
+          files in all of its subdirectories, and all of their
+          subdirectories, etc.
+
+   SEND /RECURSIVE /usr/olga (or /usr/olga/)
+          Same as above. If the name is a directory name (with or without
+          a trailing slash), its files are sent, and those of its
+          subdirectories, and their subdirectories, etc (see [503]Section
+          4.9).
+
+   SEND /RECURSIVE /TEXT /usr/olga/*.txt
+          As above, but only files whose names end with ".txt" are sent,
+          and they are sent in text mode (as they would be by default
+          anyway if SET FILE PATTERNS is ON or AUTO).
+
+   SEND .
+          UNIX only: Send all the files in the current directory.
+
+   SEND /RECURSIVE .
+          UNIX only: Sends all of the files in the current directory and
+          all of its subdirectories, etc ([504]Section 4.9).
+
+   The /RECURSIVE switch is different from most other switches in that
+   its effect is immediate (but still local to the command in which it is
+   given), because it determines how filenames are to be parsed. For
+   example, "send *.txt" fails with a parse error ("No files match") if
+   there are no *.txt files in the current directory, but "send
+   /recursive *.txt" succeeds if there are ".txt" files anywhere in the
+   tree rooted at the current directory.
+
+   The /RECURSIVE switch also affects the file lists displayed if you
+   type "?" in a filename field. "send ./?" lists the regular files in
+   the current directory, but "send /recursive ./?" lists the entire
+   directory tree rooted at the current directory.
+     _________________________________________________________________
+
+    4.11.3. The GET /RECURSIVE Command
+
+   In a client/server setting, the client can also request a recursive
+   transfer with:
+
+   GET /RECURSIVE [ other switches ] remote-filespec [ local-spec ]
+
+   In which remote file specification can be a directory name, a
+   filename, a wildcard, or any combination. If the local-spec is not
+   given (and PATHNAMES are RELATIVE), incoming files and directories go
+   into the current local directory. If local-spec is given and is a
+   directory, it becomes the root of the tree into which the incoming
+   files and directories are placed. If local-spec has the syntax of a
+   directory name (e.g. in UNIX it ends with /), C-Kermit creates the
+   directory and then places the incoming files into it. If local-spec is
+   a filename (not recommended), then all incoming files are stored with
+   that name with collisions handled according to the FILE COLLISION
+   setting.
+
+   Again, the normal method for transferring directory trees uses
+   relative pathnames, and this is the default when the sender has been
+   given the /RECURSIVE switch. The action at the receiver depends on its
+   RECEIVE PATHNAMES setting. The default is AUTO, meaning that if the
+   sender tells it to expect a recursive transfer, then it should
+   automatically switch to relative pathnames for this transfer only;
+   otherwise it obeys the RECEIVE PATHNAMES setting of OFF, ABSOLUTE, or
+   RELATIVE.
+
+   What happens if a file arrives that has an absolute pathname, when the
+   receiver has been told to use only relative pathnames? As a security
+   precaution, in this case the receiver treats the name as if it was
+   relative. For example, if a file arrives as:
+
+  /usr/olga/oofa.txt
+
+   The receiver creates a "usr" subdirectory in its current directory,
+   and then an "olga" subdirectory under the "usr" subdirectory in which
+   to store the incoming file.
+
+   Suppose, however there is a sequence of directories:
+
+  /usr/olga/a/b/c/d/
+
+   in which "a" contains nothing but a subdirectory "b", which in turn
+   contains nothing but a subdirectory "c", which in turn contains
+   nothing but a subdirectory "d", which contains nothing at all. Thus
+   there are no files in the "/usr/olga/a/" tree, and so it is not sent,
+   and therefore it is not reproduced on the target computer.
+     _________________________________________________________________
+
+    4.11.4. New and Changed File Functions
+
+   C-Kermit 7.0 adds the following functions:
+
+   \ffiles(pattern[,&a])
+          This function has been changed to match only regular files in
+          the current or given directory, and to take an optional array
+          name as a second argument (explained below).
+
+   \fdirectories(pattern[,&a])
+          Returns the number of directories that match the given pattern.
+          If the pattern does not include a directory, then the search is
+          performed in the current directory.
+
+   \frfiles(pattern[,&a])
+          Returns the number of files in the current or given directory
+          and all of its subdirectories, and their subdirectories, etc,
+          that match the given pattern. Warning -- this one can take
+          quite some time if performed at the root of a large directory
+          tree.
+
+   \frdirectories(pattern[,&a])
+          Returns the number of directories in the current or given
+          directory and all of its subdirectories, and their
+          subdirectories, etc, that match the given pattern.
+
+   Each of these functions builds up a list of files to be returned by
+   the \fnextfile() function, just as \ffiles() always has done. (This
+   can also be done with the /ARRAY switch of the DIRECTORY command; see
+   [505]Sections 4.5.1 and [506]7.10).
+
+   Each of these functions can be given an array name as an optional
+   second argument. If an array name is supplied, the array will contain
+   the number of files as its 0th element, and the filenames in elements
+   1 through last. If the array already existed, its previous contents
+   are lost. For example, if the current directory contains two files,
+   oofa.txt and foo.bar, then "\ffiles(*,&a)" creates an array \&a[] with
+   a dimension of 2, containing the following elements:
+
+ \&a[0] = 2
+ \&a[1] = oofa.txt
+ \&a[2] = foo.bar
+
+   If no files match the specification given in the first argument, the
+   array gets a dimension of 0, which is the same as undeclaring the
+   array.
+
+   Note that the order in which the array is filled (and in which
+   \fnextfile() returns filenames) is indeterminate (but see [507]Section
+   7.10.5).
+
+   Here's an example that builds and prints a list of all the file whose
+   names end in .txt in the current directory and all its descendents:
+
+  asg \%n \frfiles(*.txt)
+  declare \&a[\%n]
+  for \%i 1 \%n 1 {
+      asg \&a[\%i] \fnextfile()
+      echo \flpad(\%i,4). "\&a[\%i]"
+  }
+
+   Alternatively, using the array method, and then printing the filenames
+   in alphabetic order (see [508]Section 7.10.3 and [509]7.10.5):
+
+  asg \%n \frfiles(*.txt,&a)
+  sort &a
+  for \%i 1 \%n 1 {
+      echo \flpad(\%i,4). "\&a[\%i]"
+  }
+
+   Or even more simply:
+
+  asg \%n \frfiles(*.txt,&a)
+  sort &a
+  show array &a
+
+   As noted elsewhere, the file lists built by \ffiles(), \frfiles(),
+   etc, are now "safe" in the sense that SEND and other file-related
+   commands can reference \fnextfile() without resetting the list:
+
+  set send pathnames relative
+  for \%i 1 \frfiles(*.txt) 1 {
+      asg \%a \fnextfile()
+      echo Sending \%a...
+      send \%a
+      if fail break
+  }
+
+   Copying to an array (as shown on p.398 of [510]Using C-Kermit 2nd Ed)
+   is no longer necessary.
+     _________________________________________________________________
+
+    4.11.5. Moving Directory Trees Between Like Systems
+
+    4.11.5.1. UNIX to UNIX
+
+   Transferring a directory tree from one computer to another replicates
+   the file sender's arrangement of files and directories on the file
+   receiver's computer. Normally this is done using relative pathnames,
+   since the user IDs might not be identical on the two computers. Let's
+   say both computers are UNIX based, running C-Kermit 7.0 or later. On
+   the sending computer (leaving out the connection details, etc):
+
+  C-Kermit> cd /usr/olga
+  C-Kermit> send /recursive .
+
+   The /RECURSIVE switch tells C-Kermit to descend through the directory
+   tree and to include relative pathnames on outbound filenames.
+
+   On the receiving computer:
+
+  C-Kermit> mkdir olgas-files           ; Make a new directory.
+  C-Kermit> cd olgas-files              ; CD to it.
+  C-Kermit> receive /recursive          ; = /PATHNAMES:RELATIVE
+
+   Each Kermit program recognizes that the other is running under UNIX
+   and switches to binary mode and literal filenames automatically.
+   Directories are automatically created on the receiving system as
+   needed. File dates and permissions are automatically reproduced from
+   source to destination.
+
+    4.11.5.2. VMS to VMS
+
+   To send recursively from VMS, simply include the /RECURSIVE switch,
+   for example at the sender:
+
+  $ kermit
+  C-Kermit> cd [olga]
+  C-Kermit> send /recursive *.*;0
+
+   And at the receiver:
+
+  C-Kermit> cd [.olga]
+  C-Kermit> receive /recursive
+
+   The notation "..." within directory brackets in VMS means "this
+   directory and all directories below it"; the /RECURSIVE switch, when
+   given to the sender, implies the use of "..." in the file
+   specification so you don't have to include "..."; but it makes no
+   difference if you do:
+
+  $ kermit
+  C-Kermit> send /recursive [olga...]*.*;0
+
+   And at the receiver:
+
+  C-Kermit> cd [.olga]
+  C-Kermit> receive /recursive
+
+   In either case, since both systems recognize each other as VMS, they
+   switch into LABELED transfer mode automatically.
+     _________________________________________________________________
+
+    4.11.6. Moving Directory Trees Between Unlike Systems
+
+   There are several difficulties with recursive transfers between unlike
+   systems:
+
+     * File formats can be different, especially text files character
+       sets and record formats. This can now be handled by using SET FILE
+       PATTERN, SET FILE TEXT-PATTERNS, and SET FILE BINARY-PATTERNS
+       ([511]Section 4.3).
+     * File naming conventions are different. For example, one system
+       might allow (and use) longer filenames than the other. You can
+       tell Kermit how to handle file names with the normal "set file
+       names" and "set file collision" mechanisms. Most modern Kermits
+       are fairly tolerant of illegal filenames and should not fail
+       simply because of an incoming filename; rather, it will do its
+       best to convert it to a recognizable and unique legal filename.
+     * Directory notations can be different, e.g. backslashes instead of
+       slashes, brackets, parentheses, spaces, etc. But this is now
+       handled by converting pathnames to a standard format during
+       transfer ([512]Section 4.10).
+
+   So now, for the first time, it is possible to send directory trees
+   among any combination of UNIX, DOS, Windows, OS/2, VMS, AOS/VS, etc.
+   Here's an example sending files from an HP-UX system (where text files
+   are encoded in the HP Roman8 character set) to a PC with K95 (where
+   text files are encoded in CP850):
+
+ Sender:
+  cd xxx                           ; CD to root of source tree
+  set file type binary             ; Default transfer mode
+  set file character-set hp-roman8 ; Local character set for text files
+  set xfer character-set latin1    ; Transfer character set
+  set file patterns on             ; Enable automatic file-type switching...
+  set file binary-patterns *.Z *.gz *.o  ; based on these patterns...
+  set file text-patterns *.txt *.c *.h   ; for binary and text files.
+  send /recursive *                ; Send all the file in this directory tree
+
+ Receiver:
+  cd yyy                           ; CD to root of destination tree
+  set file character-set cp850     ; Local character set for text files
+  receive /pathnames:relative      ; Receive with pathnames
+
+   Notes:
+     * Replace "xxx" and "yyy" with the desired directories.
+     * Replace the file character sets appropriately.
+     * Change the patterns as needed (or just use the built-in default
+       lists).
+     * SEND /RECURSIVE also implies /PATHNAMES:RELATIVE.
+     * The file sender tells the file receiver the transfer mode of each
+       file.
+     * The file sender tells the file receiver the transfer character
+       set.
+     * By default, destination file dates will be the same as on the
+       source.
+     * Many of the settings shown might already be set by default.
+     * See [513]Sections 4.3, [514]4.10, and [515]4.15 for additional
+       explanation.
+
+   If you are refreshing an existing directory on the destination
+   computer, use "set file collision update" or other appropriate file
+   collision option to handle filename collisions.
+     _________________________________________________________________
+
+  4.12. Where Did My File Go?
+
+   Now that Kermit can be started by clicking on desktop icons (thus
+   obscuring the concept of "current directory"), and can have a download
+   directory, and can create directories for incoming files on the fly,
+   etc, sometimes it is easy to lose a file after transfer. Of course, if
+   you keep a transaction log:
+
+  LOG TRANSACTIONS
+
+   it will record the fate and final resting place of each file. But in
+   case you did not keep a log, the new command:
+
+  WHERE
+
+   added in C-Kermit 7.0, gives you as much information as it has about
+   the location of the last files transferred, including the pathname
+   reported by the receiving Kermit, if any, when C-Kermit is the sender.
+   This information was also added to SHOW FILE in somewhat less detail.
+     _________________________________________________________________
+
+  4.13. File Output Buffer Control
+
+   (UNIX only). The new command SET FILE OUTPUT lets you control how
+   incoming files are written to disk:
+
+   SET FILE OUTPUT BUFFERED [ size ]
+          Chooses buffered file output; this is the default. UNIX does
+          its normal sort of disk buffering. The optional size specifies
+          Kermit's own file output buffer size, and therefore the
+          frequency of disk accesses (write() system calls) -- the bigger
+          the size, the fewer the disk accesses.
+
+   SET FILE OUTPUT UNBUFFERED [ size ]
+          This forces each file output write() call to actually commit
+          the data to disk immediately. Choosing this option will usually
+          slow file reception down.
+
+   SET FILE OUTPUT BLOCKING
+          Write() calls should not return until they are complete. This
+          is the normal setting, and it lets Kermit detect disk-write
+          errors immediately.
+
+   SET FILE OUTPUT NONBLOCKING
+          Write() calls should return immediately. This can speed up file
+          reception, but also delay the detection of disk-write errors.
+
+   Experimentation with these parameters should be harmless, and might
+   (or might not) have a perceptible, even dramatic, effect on
+   performance.
+     _________________________________________________________________
+
+  4.14. Improved Responsiveness
+
+   In version 7.0, C-Kermit's file-transfer protocol engine has been
+   tuned for additional speed and responsiveness.
+
+     * Binary-mode transfers over 8-bit connections, a very common case,
+       are now handled in a special way that minimizes overhead.
+     * SET TRANSFER CRC-CALCULATION is now OFF by default, rather than
+       ON. (This affects only the overall per-transfer CRC, \v(crc16),
+       not the per-packet CRCs)
+     * Connection loss during file transfer is now detected immediately
+       in most cases on Internet connections and on serial connections
+       when CARRIER-WATCH is not set to OFF.
+     _________________________________________________________________
+
+  4.15. Doubling and Ignoring Characters for Transparency
+
+   The following commands were added in 7.0, primarily to allow
+   successful file transfer through ARPAnet TACs and with Honeywell DPS6
+   systems, but can be used in any setting where they might be needed:
+
+   SET SEND DOUBLE-CHAR { [ char [ char [ ... ] ] ], NONE }
+          Tells C-Kermit to double the specified characters (use decimal
+          notation) in packets that it sends. For example, if you are
+          sending files through a device that uses @ as an escape
+          character, but allows you to send a single copy of @ through by
+          doubling it, use "set send double 64".
+
+   SET RECEIVE IGNORE-CHAR [ char [ char [ ... ] ] ]
+          Tells C-Kermit to ignore the specified character(s) in incoming
+          packets. Use this, for example, when something between the
+          sender and receiver is inserting linefeeds for wrapping, NULs
+          for padding, etc.
+     _________________________________________________________________
+
+  4.16. New File-Transfer Display Formats
+
+   SET TRANSFER DISPLAY { BRIEF, CRT, FULLSCREEN, NONE, SERIAL }
+          Selects the file-transfer display format.
+
+   BRIEF is the new one. This writes one line to the screen per file,
+   showing the file's name, transfer mode, size, the status of the
+   transfer, and when the transfer is successful, the effective data rate
+   in characters per second (CPS). Example:
+
+  SEND ckcfn3.o (binary) (59216 bytes): OK (0.104 sec, 570206 cps)
+  SEND ckcfns.o (binary) (114436 bytes): OK (0.148 sec, 772006 cps)
+  SEND ckcmai.c (text) (79147 bytes): OK (0.180 sec, 438543 cps)
+  SEND ckcmai.o (binary) (35396 bytes): OK (0.060 sec, 587494 cps)
+  SEND ckcnet.o (binary) (62772 bytes): REFUSED
+  SEND ckcpro.o (binary) (121448 bytes): OK (0.173 sec, 703928 cps)
+  SEND ckcpro.w (text) (63687 bytes): OK (0.141 sec, 453059 cps)
+  SEND makefile (text) (186636 bytes): OK (0.444 sec, 420471 cps)
+  SEND wermit (binary) (1064960 bytes): OK (2.207 sec, 482477 cps)
+
+   Note that transfer times are now obtained in fractional seconds,
+   rather than whole seconds, so the CPS figures are more accurate (the
+   display shows 3 decimal places, but internally the figure is generally
+   precise to the microsecond).
+     _________________________________________________________________
+
+  4.17. New Transaction Log Formats
+
+   The new command:
+
+  SET TRANSACTION-LOG { VERBOSE, FTP, BRIEF [ separator ] }
+
+   lets you choose the format of the transaction log. VERBOSE (the
+   default) indicates the traditional format described in the book. BRIEF
+   and FTP are new. This command must be given prior to the LOG
+   TRANSACTION command if a non-VERBOSE type is desired.
+
+    4.17.1. The BRIEF Format
+
+   BRIEF chooses a one-line per file format suitable for direct
+   importation into databases like Informix, Oracle, or Sybase, in which:
+
+     * Each record has 8 fields.
+     * Fields are separated by a non-alphanumeric separator character.
+     * The default separator character is comma (,).
+     * Any field containing the separator character is enclosed in
+       doublequotes.
+     * The final field is enclosed in doublequotes.
+
+   The fields are:
+
+    1. Date in yyyymmdd format
+    2. Time in hh:mm:ss format
+    3. Action: SEND or RECV
+    4. The local filename
+    5. The size of the file
+    6. The transfer mode (text, binary, image, labeled)
+    7. The status of the transfer: OK or FAILED
+    8. Additional status-dependent info, in doublequotes.
+
+   Examples:
+
+  20000208,12:08:52,RECV,/u/olga/oofa.txt,5246,text,OK,"0.284sec 18443cps"
+  20000208,12:09:31,SEND,/u/olga/oofa.exe,32768,binary,OK,"1.243sec 26362cps"
+  20000208,12:10:02,SEND,"/u/olga/a,b",10130,text,FAILED,"Refused: date"
+
+   Note how the filename is enclosed in doublequotes in the final
+   example, because it contains a comma.
+
+   To obtain BRIEF format, you must give the SET TRANSACTION-LOG BRIEF
+   command before the LOG TRANSACTIONS command. (If you give them in the
+   opposite order, a heading is written to the log by the LOG command.)
+     _________________________________________________________________
+
+    4.17.2. The FTP Format
+
+   SET TRANSACTION-LOG FTP (available only in UNIX) chooses a format that
+   is compatible with the WU-FTPD (Washington University FTP daemon) log,
+   and so can be processed by any software that processes the WU-FTPD
+   log. It logs only transfers in and out, both successful and failed
+   (but success or failure is not indicated, due to lack of a field in
+   the WU-FTPD log format for this purpose). Non-transfer events are not
+   recorded.
+
+   Unlike other logs, the FTP-format transaction log is opened in append
+   mode by default. This allows you to easily keep a record of all your
+   kermit transfers, and it also allows the same log to be shared by
+   multiple simultaneous Kermit processes or (permissions permitting)
+   users. You can, of course, force creation of a new logfile by
+   specifying the NEW keyword after the filename, e.g.
+
+  log transactions oofa.log new
+
+   All records in the FTP-style log are in a consistent format. The first
+   field is fixed-length and contains spaces; subsequent fields are
+   variable length, contain no spaces, and are separated by one or more
+   spaces. The fields are:
+
+   Timestamp
+          This is an asctime-style timestamp, example: "Wed Sep 16
+          20:19:05 1999" It is always exactly 24 characters long, and the
+          subfields are always in fixed positions.
+
+   Elapsed time
+          The whole number of seconds required to transfer the file, as a
+          string of decimal digits, e.g. "24".
+
+   Connection
+          The name of the network host to which C-Kermit is connected, or
+          the name of the serial device through which it has dialed (or
+          has a direct connection), or "/dev/tty" for transfers in remote
+          mode.
+
+   Bytes transferred
+          The number of bytes transferred, decimal digits, e.g.
+          "1537904".
+
+   Filename
+          The name of the file that was transferred, e.g.
+          "/pub/ftp/kermit/a/README.TXT". If the filename contains any
+          spaces or control characters, each such character is replaced
+          by an underscore ('_') character.
+
+   Mode
+          The letter 'b' if the file was transferred in binary mode, or
+          'a' if it was transferred in text (ASCII) mode.
+
+   Options
+          This field always contains an underscore ('_') character.
+
+   Direction
+          The letter 'o' if the file was transferred Out, and 'i' if the
+          file was transferred In.
+
+   User class
+          The letter 'r' indicates the file was transferred by a Real
+          user.
+
+   User identification
+          The ID of the user who transferred the file.
+
+   Server identification
+          The string "kermit". This distinguishes a Kermit transfer log
+          record from a WU-FTPD record, which contains "ftp" in this
+          field.
+
+   Authentication class
+          The digit '1' if we know the user's ID on the client system,
+          otherwise '0'. Currently, always '0'.
+
+   Authenticated user
+          If the authentication class is '1', this is the user's ID on
+          the client system. Otherwise it is an asterisk ('*'). Currently
+          it is always an asterisk.
+
+   Examples:
+
+  Thu Oct 22 17:42:48 1998 0 * 94 /usr/olga/new.x a _ i r olga kermit 0 *
+  Thu Oct 22 17:51:29 1998 1 * 147899 /usr/olga/test.c a _ o r olga kermit 0 *
+  Thu Oct 22 17:51:44 1998 1 * 235 /usr/olga/test.o b _ i r olga kermit 0 *
+  Fri Oct 23 12:10:25 1998 0 * 235 /usr/olga/x.ksc a _ o r olga kermit 0 *
+
+   Note that an ftp-format transaction log can also be selected on the
+   Kermit command line as follows:
+
+  kermit --xferfile:filespec
+
+   This is equivalent to:
+
+  SET TRANSACTION-LOG FTP
+  LOG TRANSACTIONS filespec APPEND
+
+   Conceivably it could be possible to have a system-wide shared Kermit
+   log, except that UNIX lacks any notion of an append-only file; thus
+   any user who could append to the log could also delete it (or alter
+   it). This problem could be worked around using setuid/setgid tricks,
+   but these would most likely interfere with the other setuid/setgid
+   tricks C-Kermit must use for getting at dialout devices and UUCP
+   logfiles.
+     _________________________________________________________________
+
+  4.18. Unprefixing NUL
+
+   As of 6.1.193 Alpha.10, C-Kermit can finally send and receive
+   file-transfer packets in which NUL (ASCII 0) is unprefixed (no more
+   NUL-terminated packets!). NUL is, of course, extremely prevalent in
+   binary files such as executables, and this has been a significant
+   source of packet overhead. For example, when transferring itself (the
+   SunOS C-Kermit executable) with minimal prefixing and 9000-byte
+   packets, we see:
+
+  File size:                       1064960
+  Packet chars with 0 prefixed:    1199629  overhead = 12.65%
+  Packet chars with 0 unprefixed:  1062393  overhead = -0.03%
+
+   Transfer rates go up accordingly, not only because of the reduced
+   amount of i/o, but also because less computation is required on each
+   end.
+     _________________________________________________________________
+
+  4.19. Clear-Channel Protocol
+
+   Now that C-Kermit itself is capable of sending and receiving any byte
+   at all on a clear channel ([516]Section 4.18), it is, for the first
+   time, in a position to negotiate a clear channel with the other
+   Kermit, giving it permission (but not requiring it) to unprefix any
+   and all characters that it knows are safe. In general this means all
+   but the Kermit start-of-packet character (normally Ctrl-A), Carriage
+   Return (not only Kermit's end-of-packet character, but also treated
+   specially on Telnet NVT links), and IAC (255, also special to Telnet).
+
+   By default, C-Kermit will say it has a clear channel only if it has
+   opened a TCP socket. Since the Kermit program on the far end of a
+   TCP/IP connection generally does not know it has a TCP/IP connection,
+   it will not announce a clear channel unless it has been told to do so.
+   The command is:
+
+   SET CLEAR-CHANNEL { ON, OFF, AUTO }
+
+   AUTO is the default, meaning that the clear-channel status is
+   determined automatically from the type of connection. ON means to
+   announce a clear channel, OFF means not to announce it. Use SHOW
+   STREAMING ([517]Section 4.20) to see the current CLEAR-CHANNEL status.
+   Synonym: SET CLEARCHANNEL.
+
+   CLEAR-CHANNEL is also set if you start C-Kermit with the -I switch
+   (see [518]Section 4.20).
+
+   Whenever a clear channel is negotiated, the resulting
+   control-character unprefixing is "sticky"; that is, it remains in
+   effect after the transfer so you can use SHOW CONTROL to see what was
+   negotiated.
+
+   You can also see whether a clear channel was negotiated in the
+   STATISTICS /VERBOSE Display.
+
+   The advantage of the clear channel feature is that it can make file
+   transfers go faster automatically. The disadvantage would be
+   file-transfer failures if the channel is not truly clear, for example
+   if C-Kermit made a Telnet connection to a terminal server, and then
+   dialed out from there; or if C-Kermit made an Rlogin connection to
+   host and then made a Telnet connection from there to another host. If
+   a file transfer fails on a TCP/IP connection, use SHOW CONTROL to
+   check whether control characters became unprefixed as a result of
+   protocol negotiations, and/or SHOW STREAMING ([519]Section 4.20) to
+   see if "clear-channel" was negotiated. If this happened, use SET
+   CLEAR-CHANNEL OFF and SET PREFIXING CAUTIOUS (or whatever) to prevent
+   it from happening again.
+     _________________________________________________________________
+
+  4.20. Streaming Protocol
+
+   A new Kermit protocol option called "streaming" was added in C-Kermit
+   7.0. The idea is that if the two Kermit partners have a reliable
+   transport (such as TCP/IP or X.25) between them, then there is no need
+   to send ACKs for Data packets, or NAKs, since a reliable transport
+   will, by definition, deliver all packets in order and undamaged. On
+   such a connection, streaming cuts down not only on Kermit program
+   overhead (switching back and forth between reading and sending
+   packets), but also tends to make the underlying transport use itself
+   more efficiently (e.g. by defeating the Nagle algorithm and/or Delayed
+   ACK stratagem of the TCP layer). Furthermore, it allows transfers to
+   work smoothly on extremely slow network congestions that would
+   otherwise cause timeouts and retransmissions, and even failure when
+   the retry limit was exceeded.
+
+   The trick is knowing when we can stream:
+
+    1. If C-Kermit has opened a TCP socket or X.25 connection, it offers
+       stream.
+    2. If C-Kermit has been started with the -I (uppercase) option, or if
+       it has been told to SET RELIABLE ON, it offers to stream.
+    3. If C-Kermit is in remote mode, and has been told to SET RELIABLE
+       AUTO (or ON), it always offers to stream, and also always agrees
+       to stream, if the other Kermit offers. Unless you take explicit
+       actions to override the defaults, this allows the local Kermit
+       (the one that made the connection, and so knows whether it's
+       reliable) to control streaming.
+
+   (Note that an offer to stream also results in a Clear-Channel
+   announcement if CLEAR-CHANNEL is set to AUTO; see [520]Section 4.19.)
+
+   When BOTH Kermits offer to stream, then they stream; otherwise they
+   don't. Thus streaming-capable Kermit programs interoperate
+   automatically and transparently with nonstreaming ones. If the two
+   Kermits do agree to stream, you'll see the word "STREAMING" on the
+   fullscreen file-transfer display in the Window Slots field. You can
+   also find out afterwards with the STATISTICS or SHOW STREAMING
+   commands.
+
+     WARNING: Automatic choice of streaming is based on the assumption
+     of a "direct" end-to-end network connection; for example, a Telnet
+     or Rlogin connection from host A to host B, and transferring files
+     between A and B. However, if your connection has additional
+     components -- something "in the middle" (B) that you have made a
+     network connection to, which makes a separate connection to the
+     destination host (C), then you don't really have a reliable
+     connection, but C-Kermit has no way of knowing this; transferring
+     files between A and C will probably fail. In such cases, you'll
+     need to tell the *local* C-Kermit to "set reliable off" before
+     transferring files (it does no good to give this command to the
+     remote Kermit since the local one controls the RELIABLE setting).
+
+   Streaming is like using an infinite window size, with no timeouts and
+   no tolerance for transmission errors (since there shouldn't be any).
+   It relies on the underlying transport for flow control, error
+   correction, timeouts, and retransmission. Thus it is very suitable for
+   use on TCP/IP connections, especially slow or bursty ones, since
+   Kermit's packet timeouts won't interfere with the transfer -- each
+   packet takes as long to reach its destination as it takes TCP to
+   deliver it. If TCP can't deliver the packet within its own timeout
+   period (over which Kermit has no control), it signals a fatal error.
+   Just like FTP.
+
+   Streaming goes much faster than non-streaming when a relatively small
+   packet length is used, and it tends to go faster than non-streaming
+   with even the longest packet lengths. The Kermit window size is
+   irrelevant to streaming protocol, but still might affect performance
+   in small ways since it can result in different paths through the code.
+
+   The definition of "reliable transport" does not necessarily demand
+   8-bit and control-character transparency. Streaming can work with
+   parity and/or control-character prefixing just as well (but not as
+   fast) as without them; in such cases you can leave RELIABLE set to ON,
+   but set CLEARCHANNEL and/or PARITY appropriately.
+
+   Maximum performance -- comparable to and often exceeding FTP -- is
+   achieved on socket-to-socket connections (in which the considerable
+   overhead of the terminal driver and Telnet or Rlogin server is
+   eliminated) with long packets and the new "brief" file-transfer
+   display ([521]Section 4.16).
+     _________________________________________________________________
+
+    4.20.1. Commands for Streaming
+
+   SET RELIABLE { ON, OFF, AUTO }
+          SET RELIABLE ON tells Kermit that it has a reliable transport.
+          SET RELIABLE OFF tells Kermit the transport is not reliable.
+          SET RELIABLE AUTO tells Kermit that it should SET RELIABLE ON
+          whenever it makes a reliable connection (e.g. TELNET or SET
+          HOST on a TCP/IP or X.25 network), and when in remote mode it
+          should believe the transport is reliable if the other Kermit
+          says it is during Kermit protocol negotiation.
+
+   AUTO is the default; the Kermit program that makes the connection
+   knows whether it is reliable, and tells the remote Kermit.
+
+   The RELIABLE setting has several effects, including:
+
+     * It can affect the timeouts used during normal ACK/NAK protocol.
+     * It can affect the clear-channel announcement.
+     * It can affect streaming.
+
+   If you TELNET or SET HOST somewhere, this includes an implicit SET
+   RELIABLE ON command. The -I command-line option is equivalent to SET
+   RELIABLE ON.
+
+   Since SET RELIABLE ON (and -I) also implies SET CLEAR CHANNEL ON, you
+   might find that in certain cases you need to tell Kermit that even
+   though the connection is reliable, it doesn't have a clear channel
+   after all:
+
+  SET CLEAR-CHANNEL OFF
+  SET PREFIXING CAUTIOUS ; or whatever...
+
+   You can control streaming without affecting the other items with:
+
+  SET STREAMING { ON, OFF, AUTO }
+
+   AUTO is the default, meaning streaming will occur if Kermit has made a
+   TCP/IP connection or if RELIABLE is ON (or it was started with the -I
+   command line option). OFF means don't stream; ON means offer to stream
+   no matter what.
+     _________________________________________________________________
+
+    4.20.2. Examples of Streaming
+
+   Here we look at the use and behavior of streaming on several different
+   kinds of connections, and compare its performance with non-streaming
+   transfers.
+
+    4.20.2.1. Streaming on Socket-to-Socket Connections
+
+   Here we get streaming automatically when both Kermit programs are
+   capable of it, since they both make socket connections. For example,
+   on the far end:
+
+  C-Kermit> set host * 3000
+  C-Kermit> server
+
+   and on the near end:
+
+  C-Kermit> set host foo.bar.xyz.com 3000
+  (now give SEND and GET command)
+
+   All subsequent file transfers use streaming automatically.
+
+   Here are the results from 84 trials, run on a production network,
+   disk-to-disk, in which a 1-MB binary file (the SunOS C-Kermit Sparc
+   executable) was sent from a Sun Sparc-10 with SunOS 4.1.3 to an IBM
+   Power Server 850 with AIX 4.1, socket-to-socket, over a 10Mbps 10BaseT
+   Ethernet, using minimal control-character unprefixing, window sizes
+   from 10 to 32, and packet sizes from 1450 to 9010:
+
+                Streaming    Nonstreaming
+  Max CPS         748955        683354
+  Min CPS         221522        172491
+  Mean CPS        646134        558680
+  Median CPS      678043        595874
+  Std Dev         101424        111493
+
+   Correlations:
+
+  CPS and window size:   -0.036
+  CPS and packet length:  0.254
+  CPS and streaming:      0.382
+
+   Note that the relationship between streaming and throughput is
+   significantly stronger than that between CPS and window size or packet
+   length.
+
+   Also note that this and all other performance measurements in this
+   section are snapshots in time; the results could be much different at
+   other times when the load on the systems and/or the network is higher
+   or lower.
+
+   In a similar socket-to-socket trial, but this time over a wide-area
+   TCP/IP connection (from New York City to Logan, Utah, about 2000
+   miles), the following results were obtained:
+
+                Streaming    Nonstreaming
+  Max CPS         338226        318203
+  Min CPS         191659        132314
+  Mean CPS        293744        259240
+  Median CPS      300845        273271
+  Std Dev          41914         52351
+
+   Correlations:
+
+  CPS and window size:    0.164
+  CPS and packet length:  0.123
+  CPS and streaming:      0.346
+     _________________________________________________________________
+
+    4.20.2.2. Streaming on Telnet Connections
+
+   In this case the local copy of Kermit is told to TELNET or SET HOST,
+   and so it knows it has a reliable connection and -- unless it has been
+   told not to -- will offer to stream, and the other Kermit program,
+   since it has STREAMING set to AUTO, agrees.
+
+   Since we have a reliable connection, we'll also get control-character
+   unprefixing automatically because of the new clear-channel protocol
+   ([522]Section 4.19).
+
+   Any errors that occur during streaming are fatal to the transfer. The
+   message is "Transmission error on reliable link". Should this happen:
+
+    1. Check the remote Kermit's flow control setting (SHOW
+       COMMUNICATIONS). If it is NONE, change it to XON/XOFF, or vice
+       versa. If it is XON/XOFF (or you just changed it to XOFF/XOFF),
+       make sure the file sender is prefixing the XON and XOFF
+       characters. In the most drastic case, use "set prefix all" to
+       force prefixing of all control characters.
+    2. The remote Telnet server might chop off the 8th bit. In that case,
+       tell C-Kermit to "set parity space". Or, you might be able to
+       force the Telnet to allow eight-bit data by telling C-Kermit to
+       "set telopt binary request accept" -- that is, request the Telnet
+       server to enter binary mode, and accept binary-mode bids from the
+       server.
+    3. The remote Telnet server might have a buffering limitation. If a
+       and b don't cure the problem, tell the file receiver to "set
+       receive packet-length 1000" (or other number -- use the largest
+       one that works). This too, is no different from the non-streaming
+       case (more about this in [523]Section 4.20.2.3).
+
+   And remember you can continue interrupted binary-mode transfers where
+   they left off with the RESEND (= SEND /RECOVER) command.
+
+   Here are the figures for the same 84 trials between the same Sun and
+   IBM hosts as in 4.20.2.1, on the same network, but over a Telnet
+   connection rather than socket-to-socket:
+
+                  Streaming    Nonstreaming
+  Max CPS         350088        322523
+  Min CPS          95547        173152
+  Mean CPS        321372        281830
+  Median CPS      342604        291469
+  Std Dev          40503         29948
+
+   Correlations:
+
+  CPS and window size:    0.001
+  CPS and packet length:  0.152
+  CPS and streaming:      0.128
+
+   Here the effect is not as emphatic as in the socket-to-socket case,
+   yet on the whole streaming tends to be beneficial.
+
+   Additional measurements on HP-UX using C-Kermit 7.0 Beta.06:
+
+                  Windowing     Streaming
+  HP-UX 8->8      not tested       14Kcps
+  HP-UX 8->9      not tested       76Kcps
+  HP-UX 8->10      36Kcps          66Kcps
+  HP-UX 9->9      not tested      190Kcps
+  HP-UX 9->10     160Kcps         378Kcps
+     _________________________________________________________________
+
+    4.20.2.3. Streaming with Limited Packet Length
+
+   The IRIX telnet server (at least the ones observed in IRIX 5.3 and
+   6.2) does not allow Kermit to send packets longer than 4096 bytes.
+   Thus when sending from IRIX C-Kermit when it is on the remote end of a
+   Telnet connection, the packet length must be 4K or less. Trials in
+   this case (in which packet lengths range from 1450 to 4000) show a
+   strong advantage for streaming, which would be evident in any other
+   case where the packet length is restricted, and stronger the shorter
+   the maximum packet length.
+
+                  Streaming    Nonstreaming
+  Max CPS         426187        366870
+  Min CPS         407500        276517
+  Mean CPS        415226        339168
+  Median CPS      414139        343803
+  Std Dev           6094         25851
+
+   Correlations:
+
+  CPS and window size:    0.116
+  CPS and packet length:  0.241
+  CPS and streaming:      0.901
+     _________________________________________________________________
+
+    4.20.2.4. Streaming on Dialup Connections
+
+   Here "dialup" refers to a "direct" dialup connection, not a SLIP or
+   PPP connection, which is only a particular kind of TCP/IP connection.
+
+   Attempt this at your own risk, and then only if (a) you have
+   error-correcting modems, and (b) the connections between the modems
+   and computers are also error-free, perfectly flow-controlled, and free
+   of interrupt conflicts. Streaming can be used effectively and to
+   fairly good advantage on such connections, but remember that the
+   transfer is fatal if even one error is detected (also remember that
+   should a binary-mode transfer fail, it can be recovered from the point
+   of failure with RESEND).
+
+   To use streaming on an unreliable connection, you must tell both
+   Kermits that the connection is reliable:
+
+  kermit -I
+
+   or:
+
+  C-Kermit> set reliable on
+
+   In this case, it will probably be necessary to prefix some control
+   characters, for example if your connection is through a terminal
+   server that has an escape character. Most Cisco terminal servers, for
+   example, require Ctrl-^ (30, as well as its high-bit equivalent, 158)
+   to be prefixed. To unprefix these, you'll need to defeat the "clear
+   channel" feature:
+
+  C-Kermit> set reliable on
+  C-Kermit> set clear-channel off
+  C-Kermit> set prefixing none
+  C-Kermit> set control prefix 1 13 30 158 ; and whatever else is necessary
+
+   Dialup trials were done using fixed large window and packet sizes.
+   They compare uploading and downloading of two common types of files,
+   with and without streaming. Configuration:
+
+     HP-9000/715/33 -- 57600bps, RTS/CTS -- USR Courier V.34 --
+     V.34+V.42, 31200bps -- USR V.34+ Rackmount -- 57600bps, RTS/CTS --
+     Cisco terminal server -- Solaris 2.5.1. Packet size = 8000, Window
+     Size = 30, Control Character Unprefixing Minimal (but including the
+     Cisco escape character).
+
+   Since this is not a truly reliable connection, a few trials failed
+   when a bad packet was received (most likely due to UART overruns); the
+   failure was graceful and immediate, and the message was informative.
+   The results of ten successful trials uploading and downloading the two
+   files with and without streaming are:
+
+            Streaming..
+            Off    On
+   Upload   5194   5565   txt (= C source code, 78K)
+            3135   3406   gz  (= gzip file, compressed, 85K)
+ Download   5194   5565   txt
+            3041   3406   gz
+
+   Each CPS figure is the mean of 10 results.
+
+   A brief test was also performed on a LAT-based dialout connection from
+   a VAX 3100 with VMS 5.5 to a USR Courier V.34 connected to a DECserver
+   700 at 19200 bps. The 1-MB Sparc executable downloaded from a Sun to
+   the VAX at 1100cps without streaming and 1900cps with streaming, using
+   8000-byte packets, 30 window slots, and minimal prefixing in both
+   cases.
+     _________________________________________________________________
+
+    4.20.2.5. Streaming on X.25 Connections
+
+   We have only limited access to X.25 networks. One trial was performed
+   in which the 1MB Solaris 2.4 Sparc executable was transferred over a
+   SunLink X.25 connection; nothing is known about the actual physical
+   connection. With a packet length of 8000 and a window size of 30, the
+   file transferred at 6400 cps (using a maximum of 6 window slots). With
+   the same packet length, but with streaming, it transferred without
+   mishap at 6710 cps, about 5% faster.
+     _________________________________________________________________
+
+    4.20.3. Streaming - Preliminary Conclusions
+
+   The results vary with the particular connection, but are good overall.
+   Although numerous lower-level tricks can be used to improve
+   performance on specific platforms or connection methods, streaming
+   occurs at a high, system-independent level of the Kermit protocol and
+   therefore can apply to all types of platforms and (reliable)
+   connections transparently.
+     _________________________________________________________________
+
+  4.21. The TRANSMIT Command
+
+   Prior to C-Kermit 7.0, the TRANSMIT command transmitted in text or
+   binary mode according to SET FILE TYPE { TEXT, BINARY }. But now that
+   binary mode is likely to be the default for protocol transfers, it is
+   evident that this not also an appropriate default for TRANSMIT, since
+   binary-mode TRANSMIT is a rather specialized and tricky operation.
+   Therefore, TRANSMIT defaults to text mode always, regardless of the
+   FILE TYPE setting.
+
+   C-Kermit 7.0 expands the capabilities of the TRANSMIT command by
+   adding the following switches (see [524]Section 1.5). The new syntax
+   is:
+
+  TRANSMIT [ switches... ] filename
+
+   Zero or more switches may be included:
+
+   /PIPE
+          When /PIPE is included, "filename" is interpreted as a system
+          command or program whose output is to be sent. Synonym:
+          /COMMAND. Example:
+
+  transmit /pipe finger
+
+          You may enclose the command in braces, but you don't have to:
+
+  xmit /pipe {ls -l | sort -r +0.22 -0.32 | head}
+
+   /BINARY
+          Transmits the file (or pipe output) in binary mode.
+
+   /TEXT
+          Transmits the file (or pipe output) in line-oriented text mode.
+          Current FILE CHARACTER-SET and TERMINAL CHARACTER-SET
+          selections govern translation. Default.
+
+   /TRANSPARENT
+          Specifies text mode without character-set translation, no
+          matter what the FILE and TERMINAL CHARACTER-SET selections are.
+
+   /NOWAIT
+          This is equivalent to SET TRANSMIT PROMPT 0, but for this
+          TRANSMIT command only. Applies only to text mode; it means to
+          not wait for any kind of echo or turnaround character after
+          sending a line before sending the next line. (Normally Kermit
+          waits for a linefeed.)
+
+   When TRANSMIT ECHO is ON, C-Kermit tries to read back the echo of each
+   character that is sent. Prior to C-Kermit 7.0, 1 second was allowed
+   for each echo to appear; if it didn't show up in a second, the
+   TRANSMIT command would fail. Similarly for the TRANSMIT PROMPT
+   character. However, with today's congested Internet connections, etc,
+   more time is often needed:
+
+   SET TRANSMIT TIMEOUT number
+   Specifies the number of seconds to wait for an echo or the prompt
+   character when TRANSMIT PROMPT is nonzero; the default wait is 1
+   second. If you specify 0, the wait is indefinite. When a timeout
+   interval of 0 is specified, and a desired echo or prompt does not show
+   up, the TRANSMIT command will not terminate until or unless you
+   interrupt it with Ctrl-C; use SET TRANSMIT TIMEOUT 0 with caution.
+
+   Note: to blast a file out the communications connection without any
+   kind of synchronization or timeouts or other manner of checking, use:
+
+  SET TRANSMIT ECHO OFF
+  SET TRANSMIT PROMPT 0 (or include the /NOWAIT switch)
+  SET TRANSMIT PAUSE 0
+  TRANSMIT [ switches ] filename
+
+   In this case, text-file transmission is not-line oriented and large
+   blocks can be sent, resulting in a significant performance improvement
+   over line-at-at-time transmission. Successful operation depends (even
+   more than usual for the TRANSMIT command!) on a clean connection with
+   effective flow control.
+
+   For details on TRANSMIT and character sets, see [525]Section 6.6.5.4.
+     _________________________________________________________________
+
+  4.22. Coping with Faulty Kermit Implementations
+
+   Kermit protocol has been implemented in quite a few third-party
+   commercial, shareware, and freeware software packages, with varying
+   degrees of success. In most cases operation is satisfactory but slow
+   -- only the bare minimum subset of the protocol is available -- short
+   packets, no sliding windows, no attributes, etc. In other cases, the
+   implementation is incorrect, resulting in failures at the initial
+   negotiation stage or corrupted files.
+
+   C-Kermit 7.0 and Kermit 95 1.1.19 include some new defense mechanisms
+   to help cope with the most common situations. However, bear in mind
+   there is only so much we can do in such cases -- the responsibility
+   for fixing the problem lies with the maker of the faulty software.
+     _________________________________________________________________
+
+    4.22.1. Failure to Accept Modern Negotiation Strings
+
+   The published Kermit protocol specification states that new fields can
+   be added to the parameter negotiation string. These are to be ignored
+   by any Kermit implementation that does not understand them; this is
+   what makes the Kermit protocol extensible. Unfortunately, some Kermit
+   implementations become confused (or worse) when receiving a
+   negotiation string longer than the one they expect. You can try
+   working around such problems by telling Kermit to shorten its
+   negotiation string (and thus disable the corresponding new features):
+
+  SET SEND NEGOTIATION-STRING-MAX-LENGTH number
+
+   Try a number like 10. If that doesn't work, try 9, 8, 7, 6, and so on.
+     _________________________________________________________________
+
+    4.22.2. Failure to Negotiate 8th-bit Prefixing
+
+   The published Kermit protocol specification states that 8th-bit
+   prefixing (which allows transfer of 8-bit data over a 7-bit
+   connection) occurs if the file sender puts a valid prefix character
+   (normally "&") in the 8th-bit-prefix field of the negotiation string,
+   and the receiver puts either a letter "Y" or the same prefix
+   character. At least one faulty Kermit implementation exists that does
+   not accept the letter "Y". To force C-Kermit / K-95 to reply with the
+   other Kermit's prefix character rather than a "Y", give the following
+   (invisible) command:
+
+  SET Q8FLAG ON
+
+   Use SET Q8FLAG OFF to restore the normal behavior.
+     _________________________________________________________________
+
+    4.22.3. Corrupt Files
+
+   Refer to [526]Section 4.22.2. Some Kermit implementations mistakenly
+   interpret the "Y" as a prefix character. Then, whenever a letter Y
+   appears in the data, the Y and the character that follows it are
+   replaced by a garbage character. At this writing, we are not sure if
+   there is any solution, but try "set send negotiation-string-max-length
+   6" and/or "set q8flag on".
+
+   File corruption can also occur when control characters within the file
+   data are sent without prefixing, as at least some are by default in
+   C-Kermit 7.0 and K-95. Some Kermit implementations do not handle
+   incoming "bare" control characters. To work around, "set prefixing
+   all".
+     _________________________________________________________________
+
+    4.22.4. Spurious Cancellations
+
+   The Kermit protocol specification states that if an ACK to a Data
+   packet contains X in its data field, the transfer of the current file
+   is canceled, and if it contains a Z, the entire transfer is canceled.
+   At least one overzealous Kermit implementation applies this rule to
+   non-Data packets as well, the typical symptom being that any attempt
+   to transfer a file whose name begins with X or Z results in
+   cancellation. This is because the file receiver typically sends back
+   the name under which it stored the file (which might not be the same
+   as the name it was sent with) in the ACK to the File Header packet.
+   This is information only and should not cause cancellation. To work
+   around the problem, use:
+
+  SET F-ACK-BUG { ON, OFF }
+
+   ON tells Kermit not to send back the filename in the ACK to the file
+   header packet as it normally would do (OFF puts Kermit back to normal
+   after using ON).
+
+   A variation on the this bug occurs in an obscure Kermit program for
+   MUMPS: When this Kermit program sends a file called (say) FOO.BAR, it
+   requires that the ACK to its F packet contain exactly the same name,
+   FOO.BAR. However, C-Kermit likes to send back the full pathname,
+   causing the MUMPS Kermit to fail. SET F-ACK-BUG ON doesn't help here.
+   So a separate command has been added to handle this situation:
+
+  SET F-ACK-PATH { ON, OFF }
+
+   Normally it is ON (regardless of the SET SEND PATHNAMES setting). Use
+   SET F-ACK-PATH OFF to instruct Kermit to send back only the filename
+   without the path in the ACK to the F packet.
+     _________________________________________________________________
+
+    4.22.5. Spurious Refusals
+
+   Some Kermit implementations, notably PDP-11 Kermit 3.60 and earlier,
+   have bugs in their handling of Attribute packets that can cause
+   unwarranted refusal of incoming files, e.g. based on date or size.
+   This can be worked around by telling one or both of the Kermit
+   partners to:
+
+  SET ATTRIBUTES OFF
+     _________________________________________________________________
+
+    4.22.6. Failures during the Data Transfer Phase
+
+   This can be caused by control-character unprefixing ([527]Section
+   4.22.3 ), and fixed by:
+
+  SET PREFIXING ALL
+
+   It can also have numerous other causes, explained in Chapter 10 of
+   [528]Using C-Kermit: the connection is not 8-bit transparent (so use
+   "set parity space" or somesuch), inadequate flow control, etc. Consult
+   the manual.
+     _________________________________________________________________
+
+    4.22.7. Fractured Filenames
+
+   At least one well-known PC-based communications package negotiates
+   data compression, which (according to the protocol specification)
+   applies to both the filename and the file data, but then fails to
+   decompress the filename. Example: C-Kermit sends a file called
+   R000101.DAT (where 000101 might be non-Y2K-wise YYMMDD notation), and
+   the package in question stores the files as R~#0101.DAT. Workaround:
+   Tell C-Kermit to SET REPEAT COUNTS OFF.
+     _________________________________________________________________
+
+    4.22.8. Bad File Dates
+
+   At least one well-known PC-based communications package negotiates the
+   passing of file timestamps from sender to receiver, but when it is
+   sending files, it always gives them a timestamp of 1 February 1970.
+   Workaround: tell C-Kermit to SET ATTRIBUTE DATE OFF. You don't get the
+   file's real date, but you also don't get 1 Feb 1970; instead the file
+   gets the current date and time.
+     _________________________________________________________________
+
+  4.23. File Transfer Recovery
+
+   Prior to C-Kermit 7.0, RESEND (SEND /RECOVER) and REGET (GET /RECOVER)
+   refused to work if FILE TYPE was not BINARY or the /BINARY switch was
+   not included. Now these commands include an implied /BINARY switch,
+   meaning they set the file type to binary for the duration of the
+   command automatically.
+
+   In the client/server arrangement, this also forces the server into
+   binary mode (if it is C-Kermit 7.0 or greater, or K95 1.1.19 or
+   greater) so the recovery operation proceeds, just as you asked and
+   expected.
+
+   BUT... Just as before, the results are correct only under the
+   following conditions:
+
+     * If the prior interrupted transfer was also in binary mode; or:
+     * If the prior transfer was in text mode and the other computer was
+       a "like platform" (e.g. UNIX-to-UNIX, Windows-to-Windows,
+       DOS-to-Windows) AND there was no character-set translation (i.e.
+       TRANSFER CHARACTER-SET was TRANSPARENT).
+
+   Note that these circumstances are more likely to obtain in C-Kermit
+   7.0, in which:
+
+     * The default FILE TYPE in C-Kermit 7.0 is BINARY.
+     * The default FILE INCOMPLETE setting is AUTO, which means KEEP if
+       the transfer is in binary mode, DISCARD otherwise.
+     * C-Kermit 7.0, Kermit 95 1.1.17, and MS-DOS Kermit 3.15 and later
+       can recognize "like platforms" and switch into binary mode
+       automatically. Transfers between like platforms are always binary
+       unless character-set translation has been requested, and then is
+       still binary for all files whose names match a binary pattern,
+       unless the automatic mechanisms have been disabled (with a /TEXT
+       switch, or with SET TRANSFER MODE MANUAL).
+     * SEND /BINARY and GET /BINARY always force binary-mode transfers,
+       even when FILE TYPE is TEXT, even when TRANSFER MODE is AUTOMATIC,
+       even when PATTERNS are ON and the file's name matches a text
+       pattern.
+
+   But also note that the automatic client/server transfer-mode
+   adjustments do not work with versions of C-Kermit prior to 7.0 or K95
+   prior to 1.1.16.
+
+   If the prior transfer was in text mode:
+
+     * If text-mode transfers between the two platforms are
+       "length-changing" (as they are between UNIX -- which terminates
+       text lines with LF -- and DOS or Windows -- which terminates text
+       lines with CRLF), the recovered file will be corrupt.
+     * If text-mode transfers between the two platforms are not
+       length-changing, but character-set translation was active in the
+       prior transfer, the result will be a file in which the first part
+       has translated characters and the second part does not.
+
+   But in C-Kermit 7.0 and K95 1.1.19 and later, incompletely transferred
+   text files are not kept unless you change the default. But if you have
+   done this, and you have an incompletely transferred text file, you'll
+   need to:
+
+     * Transfer the whole file again in text mode, or:
+     * Use SEND /STARTING-AT: to recover the transfer at the correct
+       point; but you have to find out what that point is, as described
+       in the manual.
+
+   Kermit has no way of knowing whether the previous transfer was in text
+   or binary mode so it is your responsibility to choose the appropriate
+   recovery method.
+
+   If you use C-Kermit to maintain parallel directories on different
+   computers, using SET FILE COLLISION to transfer only those files that
+   changed since last time, and the files are big enough (or the
+   connection slow enough) to require SEND /RECOVER to resume interrupted
+   transfers, you should remember that SEND /RECOVER (RESEND) overrides
+   all FILE COLLISION settings. Therefore you should use SEND /RECOVER
+   (RESEND) only on the file that was interrupted, not the file group.
+   For example, if the original transfer was initiated with:
+
+  SEND *
+
+   and was interrupted, then after reestablishing your connection and
+   starting the Kermit receiver with SET FILE COLLISION UPDATE on the
+   remote end, use the following sequence at the sender to resume the
+   transfer:
+
+  SEND /RECOVER name-of-interrupted-file
+
+   and then:
+
+  SEND *
+
+   (In C-Kermit 7.0 and later, \v(filename) contains the name of the file
+   most recently transferred, as long you have not EXITed from Kermit or
+   changed directory, etc.
+     _________________________________________________________________
+
+  4.24. FILE COLLISION UPDATE Clarification
+
+   In UNIX, file modification dates are used when comparing the file date
+   with the date in the attribute packet. In VMS, however, the file
+   creation date is used. These two policies reflect the preferences of
+   the two user communities.
+
+   Also, remember that the file date/time given in the attribute packet
+   is the local time at the file sender. At present, no timezone
+   conversions are defined in or performed by the Kermit protocol. This
+   is primarily because this feature was designed at a time when many of
+   the systems where Kermit runs had no concept of timezone, and
+   therefore would be unable to convert (say, to/from GMT or UTC or Zulu
+   time).
+
+   As a consequence, some unexpected results might occur when
+   transferring files across timezones; e.g. commands on the target
+   system that are sensitive to file dates might work (UNIX "make",
+   backups, etc).
+
+   Timezone handling is deferred for a future release.
+     _________________________________________________________________
+
+  4.25. Autodownload Improvements
+
+   Refer to pages 164-165 of [529]Using C-Kermit about the hazards of
+   autodownload when C-Kermit is "in the middle". As of C-Kermit 7.0, no
+   more hazards. If C-Kermit has TERMINAL AUTODOWNLOAD ON and it detects
+   a packet of the current protocol type (Kermit or Zmodem), it "erases"
+   the visual aspect of the packet that would be seen by the terminal
+   (or, more to the point, the emulator, such as K95). This way, only
+   C-Kermit goes into RECEIVE mode, and not also the terminal emulator
+   through which C-Kermit is accessed. And therefore, it is no longer
+   necessary to SET TERMINAL AUTODOWNLOAD OFF to prevent multiple Kermits
+   from going into receive mode at once, but of course it is still
+   necessary to ensure that, when you have multiple Kermits in a chain,
+   that the desired one receives the autodownload.
+
+   The defaults have not been changed; Kermit 95 still has autodownload
+   ON by default, and C-Kermit has it OFF by default.
+     _________________________________________________________________
+
+  5. CLIENT/SERVER
+
+  5.0. Hints
+
+   If you use SET SERVER GET-PATH to set up your server, and the GET-PATH
+   does not include the server's current directory, clients can become
+   quite confused. For example, "remote dir oofa.txt" shows a file named
+   oofa.txt, but "get oofa.txt" fails. In this situation, you should
+   either DISABLE DIR or make your GET-PATH include the current
+   directory.
+     _________________________________________________________________
+
+  5.1. New Command-Line Options
+
+   The -G command-line option is like -g (GET), except the incoming file
+   is sent to standard output rather than written to disk.
+
+   The -I option ("Internet") is used to tell a remote C-Kermit program
+   that you are coming in via Internet Telnet or Rlogin and therefore
+   have a reliable connection. The -I option is equivalent to SET
+   RELIABLE ON and SET FLOW NONE.
+
+   The -O option ("Only One") tells C-Kermit to enter server mode but
+   then exit after the first client operation.
+
+   See [530]Section 9.3 for details.
+     _________________________________________________________________
+
+  5.2. New Client Commands
+
+   BYE and FINISH no longer try to do anything if a connection is not
+   active. Thus a sequence like "hangup" followed by "bye" or "finish"
+   will no longer get stuck in a long timeout-and-retransmission cycle,
+   nor will it try to open a new connection.
+
+   REMOTE EXIT
+          Similar to FINISH, except it ensures that the Kermit server
+          program exits back to the operating system or shell prompt.
+          (FINISH would return it to its interactive prompt if it was
+          started in interactive mode, and would cause it to exit if it
+          entered server mode via command-line option.) When C-Kermit is
+          to be the server, you can use { ENABLE, DISABLE } EXIT to
+          control the client's access to this feature.
+
+   REMOTE MKDIR directory-name
+          Tells the client to ask the server to create a directory with
+          the given name, which can be absolute or relative. The syntax
+          of the directory name depends on the Kermit server (see
+          [531]next section); in all cases, it can be in the syntax of
+          the system where the server is running (UNIX, VMS, DOS, etc)
+          but newer servers also accept UNIX syntax, no matter what the
+          underlying platform. The server will not execute this command
+          if (a) it does not understand it, (b) a DISABLE MKDIR command
+          has been given, or (c) a DISABLE CWD command has been given;
+          otherwise, the command is executed, but will fail if the
+          directory can not be created, in which cases most servers will
+          attempt to return a message giving the reason for failure. The
+          REMOTE MKDIR command succeeds if the remote directory is
+          created, or if it already exists and therefore does not need to
+          be created, and fails otherwise.
+
+   REMOTE RMDIR directory-name
+          Tells the client to ask the server to remove (delete) a
+          directory with the given name. The same considerations apply as
+          for REMOTE MKDIR.
+
+   REMOTE SET FILE INCOMPLETE { DISCARD, KEEP, AUTO }
+          Previously this was only available in its earlier form, REMOTE
+          SET INCOMPLETE (no FILE). The earlier form is still available,
+          but invisible. Also, AUTO was added, meaning KEEP if in binary
+          mode, DISCARD otherwise.
+
+   REMOTE SET TRANSFER MODE { AUTOMATIC, MANUAL }
+          Tells the client to ask the server to set the given
+          file-transfer mode. Automatic means (roughly): if the client
+          and the server are running on the same kind of computer (e.g.
+          both are on UNIX), then use binary mode automatically; if the
+          system types are different, use some other method to
+          automatically determine text or binary mode, such as filename
+          pattern matching. MANUAL means, in this context, obey the
+          client's FILE TYPE setting (TEXT or BINARY). Synonym: REMOTE
+          SET XFER MODE.
+
+   [ REMOTE ] QUERY KERMIT function(args...)
+          Prior to C-Kermit 7.0, the arguments were not evaluated
+          locally. Thus it was not possible to have the server run the
+          function with client-side variables as arguments. Now:
+
+  define \%a oofa.*
+  remote query kermit files(\%a)    ; Client's \%a
+  remote query kermit files(\\%a)   ; Server's \%a
+
+   [ REMOTE ] LOGIN [ user [ password ] ]
+          LOGIN is now a synonym for REMOTE LOGIN.
+
+   LOGOUT
+          This command, when given in local mode, is equivalent to REMOTE
+          LOGOUT. When given at the IKSD prompt, it logs out the IKSD.
+          When given at the C-Kermit prompt when it has no connection, it
+          does nothing.
+
+   Note that in C-Kermit 7.0, the REMOTE (or R) prefix is not required
+   for QUERY, since there is no local QUERY command. The new top-level
+   QUERY command does exactly what REMOTE QUERY (RQUERY) does.
+
+   All REMOTE commands now have single-word shortcuts:
+
+ Shortcut   Full Form
+  RASG       REMOTE ASSIGN
+  RCD        REMOTE CD
+  RCOPY      REMOTE COPY
+  RDEL       REMOTE DELETE
+  RDIR       REMOTE DIRECTORY
+  REXIT      REMOTE EXIT
+  RHELP      REMOTE HELP
+  RHOST      REMOTE HOST
+  RPWD       REMOTE PWD
+  RSET       REMOTE SET
+  etc.
+
+   The R prefix is not applied to LOGIN because there is already an
+   RLOGIN command with a different meaning. It is not applied to LOGOUT
+   either, since LOGOUT knows what to do in each case, and for symmetry
+   with LOGIN.
+     _________________________________________________________________
+
+    5.2.1. Remote Procedure Definitions and Calls
+
+   This is nothing new, but it might not be obvious... REMOTE ASSIGN and
+   REMOTE QUERY may be used to achieve remote procedure execution. The
+   remote procedure can be defined locally or remotely.
+
+   A remote procedure call is accomplished as noted in the previous
+   section:
+
+  [ remote ] query kermit function-name(args...)
+
+   This invokes any function that is built in to the Kermit server, e.g.:
+
+  [ remote ] query kermit size(foo.bar)
+
+   returns the size of the remote file, foo.bar.
+
+   Now note that C-Kermit includes an \fexecute() function, allowing it
+   to execute any macro as if it were a built-in function. So suppose
+   MYMACRO is the name of a macro defined in the server. You can execute
+   it from the client as follows (the redundant "remote" prefix is
+   omitted in the remaining examples):
+
+  query kermit execute(mymacro arg1 arg2...)
+
+   The return value, if any, is the value of the RETURN command that
+   terminated execution of the macro, for example:
+
+  define addtwonumbers return \feval(\%1+\%2)
+
+   The client invocation would be:
+
+  query kermit execute(addtwonumbers 3 4)
+  7
+
+   The result ("7" in this case) is also assigned to the client's
+   \v(query) variable.
+
+   To execute a remote system command or command procedure (shell script,
+   etc) use:
+
+  query kermit command(name args...)
+
+   Finally, suppose you want the client to send a macro to the server to
+   be executed on the server end. This is done as follows:
+
+  remote assign macroname definition
+  query kermit execute(macroname arg1 arg2...)
+
+   Quoting is required if the definition contains formal parameters.
+     _________________________________________________________________
+
+  5.3. New Server Capabilities
+
+    5.3.1. Creating and Removing Directories
+
+   The C-Kermit 7.0 server responds to REMOTE MKDIR and REMOTE RMDIR
+   commands. The directory name may be in either the native format of the
+   server's computer, or in UNIX format. For example, a server running on
+   VMS with a current directory of [IVAN] can accept commands from the
+   client like:
+
+  remote mkdir olga         ; Makes [IVAN.OLGA] (nonspecific format)
+  remote mkdir .olga        ; Makes [IVAN.OLGA] (VMS format without brackets)
+  remote mkdir olga/        ; Makes [IVAN.OLGA] (UNIX relative format)
+  remote mkdir /ivan/olga   ; Makes [IVAN.OLGA] (UNIX absolute format)
+  remote mkdir [ivan.olga]  ; Makes [IVAN.OLGA] (VMS absolute format)
+  remote mkdir [.olga]      ; Makes [IVAN.OLGA] (VMS relative format)
+
+    5.3.1.1. Creating Directories
+
+   If a directory name is given that contains more than one segment that
+   does not exist, the server attempts to create all the segments. For
+   example, if the client says:
+
+  REMOTE MKDIR letters/angry
+
+   a "letters" subdirectory is created in the server's current directory
+   if it does not already exist, and then an "angry" subdirectory is
+   created beneath it, if it does not already have one. This can repeated
+   to any reasonable depth:
+
+  REMOTE MKDIR a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/z/y/z
+
+    5.3.1.2. Removing Directories
+
+   When attempting to execute a REMOTE RMDIR, the server can remove only
+   a single directory, not an entire sequence or tree. The system service
+   that is called to remove the directory generally requires not only
+   that the server process has write delete access, but also that the
+   directory contain no files.
+
+   In the future, a REMOTE RMDIR /RECURSIVE command (and the accompanying
+   protocol) might be added. For now, use the equivalent REMOTE HOST
+   command(s), if any.
+     _________________________________________________________________
+
+    5.3.2. Directory Listings
+
+   Directory listings are generated by C-Kermit itself, rather than by
+   running the underlying system's directory command. Some control over
+   the listing format can be obtained with the SET OPTIONS DIRECTORY
+   command ([532]Section 4.5.1). The following options affect listings
+   sent by the server: /[NO]HEADING, /[NO]DOTFILES, and /[NO]BACKUP. In
+   UNIX and VMS, the listing is always sorted by filename. There is, at
+   present, no protocol defined for the client to request listing options
+   of the server; this might be added in the future.
+
+   The server's directory listings are in the following format:
+
+   Protection or permissions:
+          In UNIX and OS-9, this is a 10-character field, left adjusted.
+          In VMS it is a 22-character field, left-adjusted. In each case,
+          the protection / permission codes are shown in the server
+          platform's native format. In other operating systems, this
+          field is not shown.
+
+   Size in bytes:
+          This is always a 10-character field. The file's size is shown
+          as a decimal number, right adjusted in the field. If the file
+          is a directory and its size can not be obtained, the size is
+          shown as "<DIR>". Two blanks follow this field.
+
+   Date:
+          Always in yyyy-mm-dd hh:mm:ss numeric format, and therefore 19
+          characters long. If the file's date/time can't be obtained,
+          zeros (0) are shown for all the digits. This field is followed
+          by two blanks.
+
+   Filename:
+          This field extends to the end of the line. Filenames are shown
+          relative to the server's current directory. In UNIX, symbolic
+          links are shown as they are in an "ls -l" listing as "linkname
+          -> filename".
+
+   In UNIX and VMS, listings are returned by the server in alphabetical
+   order of filename. There are presently no other sort or selection
+   options.
+
+   However, since these are fixed-field listings, all fields can be used
+   as sort keys by external sort programs. Note, in particular, that the
+   format used for the date allows a normal lexical on that field to
+   achieve the date ordering. For example, let's assume we have a UNIX
+   client and a UNIX server. In this case, the server's listing has the
+   date in columns 22-40, and thus could be sorted by the UNIX sort
+   program using "sort +0.22 -0.40" or in reverse order by "sort +0.22
+   -0.40r".
+
+   Since the UNIX client can pipe responses to REMOTE commands through
+   filters, any desired sorting can be accomplished this way, for
+   example:
+
+C-Kermit> remote directory | sort +0.22 -0.40
+
+   You can also sort by size:
+
+  C-Kermit> remote directory | sort +0.11 -0.19
+
+   You can use sort options to select reverse or ascending order. "man
+   sort" (in UNIX) for more information. And of course, you can pipe
+   these listings through any other filter of your choice, such as grep
+   to skip unwanted lines.
+     _________________________________________________________________
+
+  5.4. Syntax for Remote Filenames with Embedded Spaces
+
+   C-Kermit and K95, when in server mode, assume that any spaces in the
+   file specification in an incoming GET command are filename separators.
+   Thus if the client gives a command like:
+
+  get {oofa.txt oofa.bin}
+
+   or, equivalently:
+
+  mget oofa.txt oofa.bin
+
+   the server tries to send the two files, oofa.txt and oofa.bin. But
+   what if you want the server to send you a file named, say:
+
+  D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL
+
+   How does the server know this is supposed to be one file and not
+   seven? In this case, you need to the send file name to the server
+   enclosed in either curly braces:
+
+  {D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL}
+
+   or ASCII doublequotes:
+
+  "D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL"
+
+   The method for doing this depends on your client. If your client is
+   C-Kermit 7.0, any recent version of Kermit 95, or MS-DOS Kermit 3.16,
+   then you have to enclose the name in braces just so the client can
+   parse it, so to send braces or doublequotes to the server, you must
+   put them inside the first, outside pair of braces. And you also need
+   to double the backslashes to prevent them from being interpreted:
+
+  get {{D:\\HP OfficeJet 500\\Images\\My Pretty Picture Dot PCL}}
+  get {"D:\\HP OfficeJet 500\\Images\\My Pretty Picture Dot PCL"}
+
+   To get around the requirement to double backslashes in literal
+   filenames, of course you can also use:
+
+  set command quoting off
+  get {{D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL}}
+  get {"D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL"}
+  set command quoting on
+
+   If you are giving a "kermit" command to the UNIX shell, you have to
+   observe the shell's quoting rules, something like this:
+
+  kermit -ig "{D:\HP OfficeJet 500\Images\My Pretty Picture Dot PCL}"
+
+   Here, the quotes go on the outside so UNIX will pass the entire
+   filename, spaces, braces, and all, as a single argument to Kermit, and
+   the backslashes are not doubled because (a) the UNIX shell ignores
+   them since they are in a quoted string, and (b) Kermit ignores them
+   since the interactive command parser is not activated in this case.
+     _________________________________________________________________
+
+  5.5. Automatic Orientation Messages upon Directory Change
+
+   C-Kermit 7.0, when acting as a server, can send an orientation message
+   to the client whenever the server directory changes. For example, when
+   the client gives a REMOTE CD command, the server sends the contents of
+   the new directory's "Read Me" file to the client's screen. The
+   following commands govern this feature:
+
+   SET SERVER CD-MESSAGE FILE name
+          Given to the servr, allows the message-file name to be
+          specified at runtime. A list of names to look for can be given
+          in the following format:
+
+  {{name1}{name2}{name3}{...}}
+
+          e.g. SET SERVER CD-MESSAGE FILE
+          {{./.readme}{README.TXT}{READ.ME}}
+
+   REMOTE SET SERVER CD-MESSAGE { ON, OFF }
+          Given to the client, lets the client control whether the server
+          sends automatic CD messages.
+
+   SHOW SERVER
+          Given to server, includes CD-Message status.
+
+   The default CD message file name is system dependent. SHOW CD or SHOW
+   SERVER displays the list. Also see [533]Section 4.5.2.
+     _________________________________________________________________
+
+  5.6. New Server Controls
+
+   DISABLE ENABLE
+          Allows the server to configured such that DISABLEd features can
+          not be re-enabled by any means -- e.g. if the client is somehow
+          able to get the server into command mode. Once DISABLEd, ENABLE
+          can not be re-ENABLEd.
+
+   SET SERVER IDLE-TIMEOUT seconds
+          This was available previously in Kermit 95 only. Now it can be
+          used in C-Kermit also to specify a maximum number of seconds
+          the server is allowed to be idle before exiting server mode. 0
+          seconds means no idle timeout. In C-Kermit (but not K-95), SET
+          SERVER TIMEOUT and SET SERVER IDLE-TIMEOUT are mutually
+          exclusive -- you can have one or the other (or neither), but
+          not both. (Server timeouts are for the benefit of primitive
+          Kermit clients that are not capable of timing out on their own;
+          to our knowledge, no such clients are still in circulation.)
+
+   SET SERVER KEEPALIVE { ON, OFF }
+          (See next section).
+     _________________________________________________________________
+
+  5.7. Timeouts during REMOTE HOST Command Execution
+
+   Prior to C-Kermit 7.0, the C-Kermit server would block waiting for
+   output from a system command invoked via REMOTE HOST from the client.
+   If the system command took a long time to execute, the client would
+   time out and send NAK packets. If the command took too long, the
+   client would reach its retry limit and give up. Even if it didn't, the
+   NAKs would cause unnecessary retransmissions.
+
+   In version 7.0, the C-Kermit server (VMS and select()-capable UNIX
+   versions only), sends "keepalive packets" (empty data packets) once
+   per second while waiting for the system command to complete. This
+   procedure should be entirely transparent to the Kermit client, and
+   should prevent the unwanted timeouts and NAKs. When C-Kermit 7.0
+   itself (or K95 1.1.19) is the client, it prints dots to show the
+   keepalive packets.
+
+   The keepalive feature can be turned off and on with:
+
+  SET SERVER KEEPALIVE { ON, OFF }
+
+   Normally it should be on. Turn it off it if causes trouble with the
+   client, or if it seems to slow down the server (as it might on some
+   platforms under certain circumstances).
+     _________________________________________________________________
+
+  6. INTERNATIONAL CHARACTER SETS
+
+   Support for several new single-byte character sets was added in
+   C-Kermit 7.0. Unicode / ISO 10646 is not yet supported, but is a high
+   priority for forthcoming releases.
+
+  6.0. ISO 8859-15 Latin Alphabet 9
+
+   To accommodate the Euro currency symbol, and to correct several other
+   longstanding problems with ISO Latin Alphabet 1, ISO 8859-15 Latin
+   Alphabet 9 was issued in May 1998. It is supported by C-Kermit 7.0 as
+   a transfer character set, a file character set, and a terminal
+   character set. Translations that preserve the new characters are
+   available between Latin-9 and several other sets including:
+
+  PC Code Page 858         (Western European languages, similar to CP850)
+  Windows Code Page 1252   (Western European languages, similar to Latin-1)
+  Windows Code Page 1250   (Eastern European languages, similar to Latin-2)
+
+   The Latin-9 transfer character set also allows for the OE digraph
+   character, used primarily in French, to be preserved in transfers
+   involving the DEC MCS or NeXT character sets.
+
+   The Euro character is also present in the Universal Character Set,
+   described in [534]Section 6.6.
+
+  6.1. The HP-Roman8 Character Set
+
+   The HP-Roman8 character set is supported in C-Kermit 6.0 and later but
+   was omitted from Table VII-4 in the 2nd Edition of Using C-Kermit due
+   to lack of space. It is listed in [535]Appendix III.
+
+  6.2. Greek Character Sets
+
+   Greek character sets were added in 6.1:
+
+  SET FILE CHARACTER-SET { CP869, ELOT927, GREEK-ISO }
+  SET TRANSFER CHARACTER-SET { GREEK-ISO }
+
+   GREEK-ISO is ISO 8859-7, which the same as ELOT 928.
+
+   The new Greek character sets are listed in [536]Appendix III.
+
+  6.3. Additional Latin-2 Character Sets
+
+   The following have been added as FILE and TERMINAL CHARACTER-SETs:
+
+   MAZOVIA-PC
+          A PC code page used in Poland, equivalent to CP437, but with 18
+          substitutions needed for Polish.
+
+   CP1250
+          The Windows Latin 2 Code Page. Equivalent to ISO 8859-2, but
+          with different encoding.
+
+  6.4. Additional Cyrillic Character Sets
+
+   The following have been added as FILE and TERMINAL CHARACTER-SETs:
+
+   BULGARIA-PC
+          This is the Cyrillic PC code page used in Bulgaria, where it is
+          called Code Page 856. It is attributed to a company called
+          DATEC, Inc, but CP856 is not a proper designation, since it
+          refers to a Hebrew Code Page (see the IBM Registry).
+
+   CP855
+          This PC Code Page contains all the Cyrillic letters that are
+          also in ISO 8859-5, and is therefore useful for non-Russian
+          Cyrillic text (Ukrainian, Belorussian, etc), unlike CP866,
+          which has a smaller repertoire of Cyrillic letters.
+
+   CP1251
+          The Windows Cyrillic Code Page. Equivalent to CP855, but with
+          different encoding.
+
+   KOI8R
+          An extension to "Old KOI-8" that adds upper and lower case
+          Cyrillic letter Io (looks like Roman E with diaeresis) plus a
+          selection of box-drawing characters to columns 8 through 11,
+          which are vacant in original Old KOI-8. KOI8-R is used for the
+          Russian language. It is specified in [537]RFC 1489.
+
+   KOI8U
+          A similar extension of Old KOI-8, but for Ukrainian. It is
+          specified in [538]RFC 2319.
+     _________________________________________________________________
+
+  6.5. Automatic Character-Set Switching
+
+   Prior to version 7.0, C-Kermit's file character-set always had to be
+   set explicitly. In 7.0 and later, it is set automatically when:
+
+    1. This feature is enabled (as it is unless you disable it).
+    2. An incoming text-mode transfer includes a transfer-character-set
+       announcer and you have not previously given a SET FILE
+       CHARACTER-SET command. In this case, C-Kermit switches to an
+       appropriate file character set. For example, on an HP-UX
+       workstation, an incoming Latin-1 file automatically selects
+       HP-Roman8 for the local copy of the file; in Data General AOS/VS,
+       it would select DG International.
+    3. You give a SET TRANSFER CHARACTER-SET command without having
+       previously specified a FILE CHARACTER-SET. An appropriate file
+       character-set is chosen automatically.
+
+   In addition, when you give a SET FILE CHARACTER-SET command, the
+   appropriate transfer character-set is automatically chosen, to be used
+   when you are sending files (but this does not override the one
+   announced by the sender when you are receiving files).
+
+   You might not agree about what is "appropriate", so of course you can
+   disable or change all of the above actions.
+
+   You can disable (or re-enable) the new automatic character-set
+   switching feature in each direction separately:
+
+   SET RECEIVE CHARACTER-SET-SELECTION { AUTOMATIC, MANUAL }
+          AUTOMATIC is the default, causing the behavior described above
+          when an incoming file arrives. Choose MANUAL to defeat this
+          behavior and force your current FILE CHARACTER-SET setting to
+          be used, no matter what it is. Note that SET RECEIVE
+          CHARACTER-SET MANUAL does not disable recognition of the
+          incoming transfer character-set announcer, and translation from
+          the corresponding character-set to your current file
+          character-set. To disable that, use SET ATTRIBUTE CHARACTER-SET
+          OFF.
+
+   SET SEND CHARACTER-SET-SELECTION { AUTOMATIC, MANUAL }
+          Again AUTOMATIC is the default, causing the behavior described
+          above when you give a SET { FILE, TRANSFER } CHARACTER-SET
+          command. Use MANUAL to allow you to specify the transfer and
+          file character-sets independently.
+
+   SHOW CHARACTER-SETS
+          Tells settings of { SEND, RECEIVE } CHARACTER-SET-SELECTION.
+
+   Normally, however, it is more convenient to leave automatic switching
+   active, and change any associations that are not appropriate for your
+   application, area, or country. The commands are:
+
+   SHOW ASSOCIATIONS
+          This command lists all the associations in each direction: for
+          each possible transfer character-set, it lists the associated
+          file character-set, and vice versa. These are two separate and
+          independent lists.
+
+   ASSOCIATE TRANSFER-CHARACTER-SET name1 [ name2 ]
+          Changes the association for the transfer character-set name1 to
+          be the file character-set name2. If name2 is omitted, automatic
+          switching is disabled for this transfer character-set only.
+
+   ASSOCIATE FILE-CHARACTER-SET name1 [ name2 ]
+          Changes the association for the file character-set name1 to be
+          the transfer character-set name2. If name2 is omitted,
+          automatic switching is disabled for this file character-set
+          only.
+     _________________________________________________________________
+
+  6.6. UNICODE
+
+   C-Kermit 7.0 adds support for Unicode, the Universal Character Set,
+   for:
+
+     * File Transfer (SEND, RECEIVE, GET, etc)
+     * Terminal connection (CONNECT)
+     * Unguarded file capture (LOG SESSION)
+     * Unguarded file transmission (TRANSMIT)
+     * Local file character-set conversion (TRANSLATE)
+
+   C-Kermit is not, however, a "Unicode application" in the sense that
+   its commands, messages, or user interface are Unicode. Rather, it is
+   "Unicode aware" in its ability to handle and convert Unicode text in
+   the course of file transfer and terminal connection, and you can also
+   use Kermit to convert local files between Unicode and other character
+   sets. TLA's:
+
+  BMP - Base Multilingual Plane
+  BOM - Byte Order Mark
+  CJK - Chinese, Japanese, and Korean
+  ISO - International Standards Organization
+  TLA - Three-Letter Acronym
+  UCS - Universal Character Set
+  UTF - UCS Transformation Format
+
+   Unicode and ISO 10646 are the coordinated and compatible corporate and
+   international standards for the Universal Character Set (UCS). Unlike
+   single-byte and even most multibyte character sets, the UCS can
+   represent all characters in every existing writing system. A flat
+   plain-text file encoded in some form of UCS can contain any mixture of
+   English, Spanish, Italian, German, Hebrew, Arabic, Greek, Russian,
+   Armenian, Georgian, Japanese, Chinese, Korean, Vietnamese, Tibetan,
+   Hindi, Bengali, Tamil, Thai, Ethiopic, and so on, plus scientific and
+   mathematical notation, as well as texts in Runes, Ogham, Glagolitic,
+   and other historic scripts.
+
+   The UCS already covers these scripts and many more, but it's an
+   evolving standard with efforts underway to accommodate even more
+   languages and writing systems. Support is growing for native UCS use
+   on many platforms and in many applications. The goal of the framers of
+   the UCS is for it to replace ASCII, the ISO Latin Alphabets, ISCII,
+   VISCII, the Chinese, Japanese, and Korean (CJK) multibyte sets, etc,
+   as well as the many private character sets in use today, in other
+   words to become *the* Universal Character Set.
+
+   Until that time, however, conversions between existing sets and the
+   UCS will be necessary when moving text between platforms and
+   applications. Now Kermit can help.
+     _________________________________________________________________
+
+    6.6.1. Overview of Unicode
+
+   For a more complete picture, please visit:
+
+  [539]http://www.unicode.org/
+
+   and access the various online introductions, FAQs, technical reports,
+   and other information. For greater depth, order the latest version of
+   the published Unicode Standard. The following overview contains a
+   great many oversimplifications and perhaps an opinion or two.
+
+   At present, the UCS is a 16-bit (2-byte) character set, but with
+   provisions to grow to a 4-byte set. UCS-2 refers to the two-byte set,
+   also called the Base Multilingual Plane (BMP), in which each character
+   has 16 bits, and therefore there are 2^16 = 65536 possible characters.
+   The first 128 characters are the same as US ASCII (C0 control
+   characters and DEL included), the next 32 are the C1 control
+   characters of ISO 6429, and the next 96 are the Right Half of ISO
+   8859-1 Latin Alphabet 1. The remaining tens of thousands of characters
+   are arranged newly for the UCS, usually (but not always) in sections
+   corresponding to existing standards, such as ISO Latin/Cyrillic, often
+   plus additional characters not appearing in the existing standards due
+   to lack of space (or other reasons).
+
+   ISO 10646 allows for additional planes, e.g. for Egyptian
+   hieroglyphics or ancient (or other esoteric) CJK characters, but these
+   planes are not yet defined and so we will say nothing more about them
+   here, except that their use will require the 4-byte form of UCS,
+   called UCS-4, in some form (more about "forms" in [540]Section 6.6.2).
+
+   Unicode and ISO 10646 are constantly under revision, mainly to add new
+   characters. The Unicode revision is denoted by a version number, such
+   as 1.0, 1.1, 2.0, 3.0. The ISO 10646 standard revision is identified
+   by Edition (such as ISO 10646-1 1993), plus reference to any
+   amendments. The first versions of these standards included encodings
+   for Korean Hangul syllables (Jamos); these encodings were changed in
+   version 1.1 of Unicode and by Amendment 5 to ISO 10646-1. The Unicode
+   Technical Committee and the ISO acknowledge that this was a bad thing
+   to do, and promise never change encodings or character names again,
+   since this poses serious problems for conformance and data
+   interchange.
+
+   A UCS-2 value is customarily written like this:
+
+  U+xxxx
+
+   where "xxxx" represents four hexadecimal digits, 0-9 and A-F. For
+   example, U+0041 is "A", U+00C1 is A-acute, U+042F is uppercase
+   Cyrillic "Ya", U+FB4F is Hebrew Ligature Alef Lamed, and U+FFFD is the
+   special character that means "not a character".
+
+   Most characters from widely-used alphabetic writing systems such as
+   the West European ones, Cyrillic, Greek, Hebrew, Vietnamese, etc, are
+   available in "precomposed" form; for example Uppercase Latin Letter A
+   with Acute Accent is a single character (as it is in Latin-1).
+   However, the UCS also permits composition of a base character with one
+   or more nonspacing diacritics. This means the same character can be
+   represented in more than one way, which can present problems in many
+   application areas, including transfer and character-set conversion of
+   text.
+
+   Conversion from ASCII or Latin-1 to UCS-2 text is "trivial": simply
+   insert a NUL (0) byte before each ASCII or Latin-1 byte. Converting in
+   the reverse direction (provided the UCS-2 file contains only U+0000 to
+   U+00FF) is equally simple (if we ignore the issue of composition):
+   remove every second (NUL) byte. Conversion of other character sets to
+   and from UCS, however, requires tables or algorithms specific to each
+   set. Nevertheless, the relatively transparent upwards compatibility
+   from ASCII and Latin-1, in which a very large share of the world's
+   textual data is encoded, gives the UCS an entree onto existing
+   platforms.
+
+   But the 2-byte format and the preponderance of NUL and other control
+   bytes in UCS-2 text pose problems for current applications and
+   transmission methods. And to make matters worse, different hardware
+   platforms store UCS-2 characters in different byte order. Thus a UCS-2
+   file transferred by FTP (or accessed via NFS, etc) between two
+   computers with different architecture might have its bytes in the
+   wrong order (or worse; see [541]Section 6.6.5.1 ).
+     _________________________________________________________________
+
+    6.6.2. UCS Byte Order
+
+   Consider the number 1. In an 8-bit byte, this would be represented by
+   the following series of 0- and 1-bits:
+
+  +-----------------+
+  | 0 0 0 0 0 0 0 1 |
+  +-----------------+
+
+   Therefore in a 16-bit "word" the representation might be:
+
+  +-----------------+-----------------+
+  | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 |
+  +-----------------+-----------------+
+
+   Now consider the number 256, which is 2 to the 8th power. The binary
+   representation is 100000000 (1 followed by 8 zeros). 256 would go into
+   a 16-bit word like this:
+
+  +-----------------+-----------------+
+  | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0 |
+  +-----------------+-----------------+
+
+   When a computer works this way, it is said to be Big Endian, meaning
+   it puts the most significant (biggest) byte first (on the "left") in a
+   16-bit word, and the least significant byte second (on the right).
+
+   However, some other computers have the opposite arrangement, called
+   Little Endian, in which 1 is:
+
+  +-----------------+-----------------+
+  | 0 0 0 0 0 0 0 1 | 0 0 0 0 0 0 0 0 |
+  +-----------------+-----------------+
+
+   and 256 is:
+
+  +-----------------+-----------------+
+  | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 1 |
+  +-----------------+-----------------+
+
+   Computers such as Sparc, MIPS, PA-RISC, and PowerPC are Big Endian,
+   whereas the PC and the Alpha are Little Endian. Endianness has never
+   been an issue with 7- or 8-bit characters, but it is with UCS
+   characters. It can be a tricky business to share or transfer a UCS-2
+   file between two different kinds of computers.
+
+   To alleviate (but not entirely solve) the problem, UCS-2 files are
+   supposed to begin with the Unicode character U+FEFF, Zero-Width
+   No-Break Space (ZWNBS). This is a kind of "no-op" (note: any such
+   assertion must normally be qualified with many "but ifs" and "excepts"
+   which are omitted here in the interest of brevity). If the bytes are
+   reversed the ZWNBS becomes U+FFFE, which is not (and never will be) a
+   defined UCS character. U+FEFF at the beginning of a UCS file is
+   therefore called a Byte Order Mark, or BOM.
+
+   Any application that creates a UCS-2 (or UTF-16, or UCS-4) file should
+   include a BOM, and any application that reads one should test for a
+   BOM, and if one is found, infer the byte order from it. This is a
+   convention, however -- not a standard or a requirement -- and
+   applications vary in their ability to handle BOMs and "backwards"
+   UCS-2 files.
+
+   Note that a BOM is useful only at the beginning of a file. If you
+   append one UCS-2 file to another, and both have BOMs, the internal BOM
+   is no longer a BOM. And if the byte orders of the two files differ,
+   then either the first part or the second will be backwards. (Various
+   other undesirable effects might also occur, not discussed here.)
+     _________________________________________________________________
+
+    6.6.2. UCS Transformation Formats
+
+   UCS textual data can be modified in various ways for transmission or
+   storage. Any officially sanctioned method of doing this is called a
+   UCS Transformation Format, or UTF. One such method, called UTF-16, is
+   essentially identical with UCS-2 except that it designates certain
+   code values as "escape sequences" (called surrogate pairs) to access
+   characters in other planes without having to use full UCS-4. We won't
+   discuss UTF-16 further here, since at the moment there are no other
+   planes. Several other UTF's (such as UTF-1, UTF-2, and UTF-7) have
+   fallen into disuse and are not discussed here. The most important
+   transformation format today is UTF-8.
+
+   UTF-8, so called because it "serializes" UCS-2 data into a stream of
+   8-bit bytes, is designed to allow the UCS to work with present-day
+   communications gear, computers, and software. The most important
+   properties of UTF-8 are that byte order is constant (no byte swapping)
+   and all (7-bit) ASCII characters represent themselves. Therefore
+   conversion between ASCII and UTF-8 is no conversion at all, and
+   applications or platforms (such as Plan 9 from Bell Labs) that use
+   UTF-8 "for everything" can still run traditional ASCII-only
+   applications and be accessed from them. In particular, unlike UCS-2,
+   ASCII characters are not padded with NUL bytes. But also unlike UCS-2,
+   there is no transparency for Latin-1 or any other non-ASCII character
+   set. Every non-ASCII UCS-2 character is represented by a sequence of 2
+   or 3 UTF-8 bytes. Thus UTF-8 is more compact than UCS-2 for text
+   containing a preponderance of ABC's (or other ASCII characters), about
+   the same as UCS-2 for other alphabetic scripts (Cyrillic, Roman,
+   Greek, etc), and larger than UCS-2 for Chinese, Japanese, and Korean.
+
+   The UTF-8 uncoding of the UCS has been adopted by the Internet as the
+   preferred character set for new applications, and is gradually being
+   retrofitted into traditional applications like FTP ([542]RFC 2640).
+     _________________________________________________________________
+
+    6.6.3. Conformance Levels
+
+   Although the Unicode and ISO 10646 standards both describe the same
+   character set, these standards differ in many ways, including their
+   stated requirements for conformance and their classification of
+   conformance levels.
+
+   Kermit has always abided by ISO character-set standards, including ISO
+   character-set designation and invocation methods. In adapting Unicode,
+   therefore, we had to choose from among the available ISO designations
+   which, in turn, correspond with ISO 10646 conformance levels. At
+   present, Kermit claims the lowest conformance level, 1, meaning
+   (roughly) that it does not handle combining forms and it does not
+   handle Korean Hangul Jamos (just as, at present, it does not handle
+   Korean in general). Note that ISO 10646 Conformance Levels 1 and 2
+   sidestep the issue of the code changes for Korean Hangul by announcing
+   non-support for Hangul regardless of encoding.
+
+   ISO 10646 Conformance Level 1 is approximately equivalent to Unicode
+   Normalization Form C (described in Unicode Technical Report 15,
+   incorporated into Unicode 3.0).
+
+   As noted in [543]Section 6.6.2, Kermit does not claim to support
+   UTF-16 at the present time, hence the UCS-2 nomenclature. Kermit
+   treats surrogates just as if they were any other UCS-2 characters,
+   rather than as escapes to other planes, which means that (except when
+   converting between UCS-2 and UTF-8) they are translated to "error"
+   characters, since (a) no other planes are defined yet (and if they
+   were, no other character sets supported by Kermit would encode their
+   characters), and (b) no valid surrogate character corresponds to any
+   other UCS-2 character.
+
+   A minor yet significant aspect of Unicode 3.0 and some recent
+   perturbation of ISO 10646-1 (probably Amendment 18, "Symbols and Other
+   Characters") is the addition of the Euro Sign at U+20AC. As noted in
+   [544]Section 6.0, Kermit's "Euro compliance" includes conversion
+   between Latin Alphabet 9 and various PC code pages. Text can also be
+   converted between UCS-2 or UTF-8 and any other Euro-compliant
+   character set (Latin-9, CP858, CP1250, CP1252) without loss of the
+   Euro Sign.
+     _________________________________________________________________
+
+    6.6.4. Relationship of Unicode with Kermit's Other Character Sets
+
+   Kermit's character sets are divided into two groups: single-byte sets
+   (such as Roman, Hebrew, Cyrillic, Greek) and multibyte (various
+   Japanese sets). The two groups are distinct since one normally would
+   not expect to convert Kanji ideograms to Roman (or other) letters, or
+   vice versa.
+
+   Unicode character-set conversion works with both groups, but obviously
+   the result depends on the repertoires of the source and destination
+   character-sets both including the characters in the file. For example,
+   you can translate a Hungarian text file between Latin-2 and Unicode,
+   but not between (say) Unicode and Latin/Greek. By the same token you
+   can convert Japanese text from Shift-JIS or EUC or JIS-7 to Unicode
+   and back, but you can't convert the same file to (say) Latin-1 if it
+   contains Japanese characters.
+
+     JIS-7 is equivalent to DEC Kanji and ISO-2022-JP except that the
+     latter two do not support halfwidth Katakana. Kermit treats all
+     three of these sets the same way, i.e. as JIS-7.
+
+   As noted, Kermit presently does not handle combining diacritics, and
+   so will not correctly convert UCS files that use them into a
+   single-byte character set. For example, if a UCS file contains Latin
+   Capital Letter A (U+0041) followed by Combining Acute Accent (U+0301),
+   the result will be a two-character sequence, A followed by another
+   character. This is what is meant by Conformance Level 1. (The
+   situation grows worse with multiple diacritics, since they can occur
+   in any order.)
+
+   A higher level of conformance is possible, in which "canonical
+   equivalences" are handled via algorithms and databases, at some
+   (perhaps considerable) cost in performance, since a fair amount of
+   additional code must be executed for every character during data
+   transfer (database lookup, sorting of combining sequences into
+   canonical order, etc). This can be added in future releases if there
+   is a need (but in many cases, pre- and postpostprocessing might be a
+   better option).
+
+   Within these constraints, Kermit converts between the UCS and its
+   other character sets. For example, a mixture of Russian and English
+   (and/or Dutch, or Latin) text can bet converted between the UCS and
+   ISO Latin/Cyrillic or KOI-8. But since Kermit does not presently
+   support Arabic character-set conversion, the new availability of UCS
+   conversion does not mean that Kermit can convert from Arabic UCS text
+   to some other character set, because Kermit does not support any other
+   character set that includes Arabic. Ditto for Thai, Armenian,
+   Georgian, Tibetan, Chinese, Korean, etc. However, Kermit CAN convert
+   Arabic (or any other script) between UCS-2 and UTF-8.
+
+   Considering Cyrillic more carefully, note that the UCS also contains
+   numerous Cyrillic characters not found in any of the Cyrillic sets
+   (ISO Latin/Cyrillic, KOI8, CP866, etc) that Kermit supports;
+   characters needed for Abkhasian, Yakut, Tatar, Bashkir, Altaic, Old
+   Church Slavonic, etc; UCS text containing any of these historic or
+   "extended" Cyrillic characters can not be converted to any of Kermit's
+   current single-byte Cyrillic sets without loss. The situation is
+   similar for Greek, Hebrew, etc, and even worse for Japanese since
+   Unicode contains thousands of Kanjis that are lacking from the
+   Japanese character sets based on JIS X 0208, such as EUC-JP, JIS-7,
+   and Shift-JIS.
+
+   In general, when converting from UCS to a single-byte set, there is
+   always the possibility of data loss, just as there is when converting
+   from any larger set to a smaller one. For example, if a UCS file
+   contains Devanagari characters, these characters will be lost when
+   converting to (say) Latin-1, just as Roman vowels with acute accents
+   are lost when converting from Latin-1 (an 8-bit set) to German ISO 646
+   (a 7-bit set).
+     _________________________________________________________________
+
+    6.6.5. Kermit's Unicode Features
+
+   C-Kermit can convert between UCS-2 or UTF-8 and any of its other
+   character sets, and also between UCS-2 and UTF-8. When converting
+   between UCS-2 or UTF-8 and a non-Unicode character set (such as
+   Latin-1), the UCS Line Separator (LS, U+2028) and Paragraph Separator
+   (PS, U+2029) characters are converted to the appropriate line
+   terminator (CR, LF, or CRLF). When converting from a non-Unicode set
+   to UCS-2 or UTF-8, however, line terminators are not converted to LS
+   or PS. This is in accordance with the recommendations of Unicode
+   Technical Report #13.
+
+   When C-Kermit starts, it tests the native byte order of the computer.
+   You can see the result in the SHOW FEATURES or SHOW FILE display. It's
+   also available in the variable \v(byteorder): 0 means Big Endian, 1
+   means Little Endian.
+
+   When UCS-2 is involved in file transfer or translation, the following
+   commands tell C-Kermit what to do about byte order:
+
+   SET FILE UCS BYTE-ORDER { BIG-ENDIAN, LITTLE-ENDIAN }
+          This is for reading UCS-2 files that don't have a BOM, and also
+          for writing UCS-2 files. If this command is not given, the
+          machine's native byte order is used when writing UCS-2 files,
+          and also when reading UCS-2 files that don't have a BOM.
+
+   SET FILE UCS BOM { ON, OFF }
+          This setting is used when creating UCS-2 files. A BOM is added
+          at the beginning by default. Use OFF to not add the BOM. This
+          command has no affect when writing files.
+
+   COPY /SWAP-BYTES sourcefile destinationfile
+          Use this for fixing a UCS-2 file whose bytes are in the wrong
+          order.
+
+   Use SHOW FILE to display the FILE UCS settings.
+
+   Please note, again, that C-Kermit's user interface, including its
+   script language, is not internationalized in any way. String
+   comparisons, case conversion, and so on, work only for US ASCII
+   (comparisons for equality work with other sets, but not
+   lexically-greater-or-less-than or caseless comparisons; even
+   comparisons for equality can fail when composed characters or byte
+   order are involved). String functions such as \findex() and
+   \fsubstring() that reference byte positions do just that; they won't
+   work with UTF-8 text that contains any non-ASCII characters, and they
+   will not work with UCS-2 text at all since they use C strings
+   internally, which are NUL-terminated. These are just a few examples to
+   illustrate that neither Unicode nor any other character-set beyond
+   ASCII is supported at the user-interface, command, or scripting level
+   in this version of C-Kermit.
+     _________________________________________________________________
+
+    6.6.5.1. File Transfer
+
+   Kermit supports both UCS-2 and UTF-8 as file and transfer character
+   sets in text-mode file transfer.
+
+   To select UCS-2 or UTF-8 as a file character-set, use:
+
+  SET FILE CHARACTER-SET { UCS2, UTF8 }
+
+   If you want to send a UCS-2 text file (or save an incoming file in
+   UCS-2 format), tell Kermit to:
+
+  SET FILE CHARACTER-SET UCS2
+
+   and if you want to send a UTF-8 text file (or store an incoming file
+   in UTF-8 format), tell Kermit to:
+
+  SET FILE CHARACTER-SET UTF8
+
+   When sending UCS-2 files, Kermit determines the byte order from the
+   BOM, if there is one (and if there is a BOM, it is stripped, i.e. not
+   sent). If there is no BOM, the byte order is the one specified in the
+   most recent SET FILE UCS BYTE-ORDER command, if any, otherwise the
+   computer's native byte order is assumed. When storing incoming files
+   as UCS-2, the byte order is according SET FILE UCS BYTE-ORDER, if
+   given, otherwise the native one; a BOM is written according to SET
+   FILE UCS BOM.
+
+   A transfer character-set should be chosen that includes all of the
+   characters in the source file. So, for example, if you are sending a
+   UCS-2 file containing only German-language text, your transfer
+   character-set can be Latin-1, Latin-2, Latin-9, UCS-2, or UTF-8. But
+   if you are sending a file that contains a combination of Hebrew and
+   Greek, your transfer character-set must be UCS-2 or UTF-8 if you don't
+   want to lose one script or the other. Furthermore, the transfer
+   character-set must be one that is supported by the receiving Kermit
+   program. Since UCS support is new, it is possible that the other
+   Kermit program (if it supports character sets at all) does not support
+   it, but does support single-byte sets such as Latin-1, Latin/Cyrillic,
+   etc.
+
+   To select UCS-2 or UTF-8 as a transfer character-set, use:
+
+  SET TRANSFER CHARACTER-SET { UCS2, UTF8 }
+
+   It is up to the receiving Kermit program to convert the transfer
+   format to its own local format, if necessary. If it does not
+   understand the UTF-8 or UCS-2 transfer character-set, and your file
+   can not be adequately represented by any single-byte transfer
+   character-set (such as Latin-1 or Latin/Cyrillic) then, if UTF-8
+   format is acceptable on the receiving computer, use UTF-8 as the
+   transfer character-set, with the receiver told to "set unknown-char
+   keep", or with the sender told to "set attribute char off". If you
+   want the file to be stored in UCS-2 format at the receiver, send it it
+   binary mode if the source file is also UCS-2, or else use the
+   TRANSLATE command (next section) to convert it to UCS-2 first, then
+   send it in binary mode. You should not use UCS-2 as a transfer
+   character-set in text-mode transfers to Kermit programs that don't
+   support it, because they are likely to corrupt the result the same way
+   FTP would (see the final paragraph of this section).
+
+   When UCS-2 is the transfer character set, it always goes into Kermit
+   packets in Big Endian format, with no BOM. As always, the transfer
+   character-set is announced by the sender to the receiver. The
+   announcement for UCS-2 is "I162" (ISO Registration 162 = UCS-2 Level
+   1) and by definition it is Big Endian (the standards say that when
+   UCS-2 is serialized into bytes, the order must be Big Endian). The
+   announcement for UTF-8 is "I190" (UTF-8 Level 1).
+
+   When receiving a file whose transfer character-set is UCS-2 or UTF-8,
+   you must choose the appropriate file character set for the result.
+   There is no way Kermit can do this for you automatically, since UCS
+   data can be in any script at all, or any combination.
+
+   In general, UTF-8 or UCS-2 should be chosen as a transfer
+   character-set if the source file is also encoded in some form of UCS
+   and it contains more than one script. But there are other situations
+   where where UTF-8 or UCS-2 offer advantages. For example, suppose the
+   source file is on a NeXTstation and the destination file is on VMS.
+   Both the NeXT and the DEC Multinational character sets include the
+   French OE digraph, but Latin-1 does not. Therefore French words
+   containing this character might not arrive intact when Latin-1 is the
+   transfer character-set, but will with UTF-8 or UCS-2, since the UCS
+   includes the OE digraph (but so does Latin-9).
+
+   UCS-2 should be chosen as a transfer character-set only for Japanese
+   text files that contain a large preponderance of Kanji, since in this
+   case (and only this case) UCS-2 (two bytes per Kanji) is more
+   efficient than UTF-8 (three bytes per Kanji). The same will be true
+   for Chinese and Korean when they are supported by Kermit. UCS-2 should
+   never be used as a transfer character-set with a transfer partner that
+   does not support UCS-2 since this can cause file corruption (see last
+   paragraph in this section).
+
+   Note that Kermit's repeat-count compression is 100% ineffective for
+   UCS-2, and is also ineffective for multibyte characters in UTF-8 and
+   EUC-JP; this is because repeat-compression is a transport-level
+   mechanism that operates on a per-byte basis; it has no knowledge of
+   the distinction between a byte and a character.
+
+   When C-Kermit starts, it sets up associations ([545]Section 6.5) for
+   incoming files whose transfer character sets are UCS-2 or UTF-8
+   appropriately for the platform so that the file character-set for the
+   incoming file is UCS-2 in Windows and UTF-8 elsewhere. Otherwise,
+   C-Kermit does not make any default associations for UCS-2 or UTF-8,
+   but of course you may add or change associations to suit your needs
+   and preferences by including the appropriate ASSOCIATE commands in
+   your Kermit startup file. For example, if you are a PC user and deal
+   only with text written in Greek and English, you can:
+
+  ASSOCIATE TRANSFER-CHARACTER-SET UTF8 CP869
+  ASSOCIATE TRANSFER-CHARACTER-SET UCS2 CP869
+  ASSOCIATE FILE-CHARACTER-SET CP869 UTF8
+
+   Note that when file transfer involves conversion between a single-byte
+   character set and UCS-2 or UTF-8, the file-transfer thermometer and
+   estimated time left might be inaccurate, since they are based on the
+   source file size, not the transfer encoding. This is purely a cosmetic
+   issue and does not effect the final result. (And is not, strictly
+   speaking, a bug; Kermit protocol presently includes no method for the
+   sender to furnish an "estimated transfer size" to the receiver, and in
+   any case any such guess could be as far off as the file size, given
+   the many other factors that come into play, such as compression and
+   prefixing).
+
+   A caution about FTP and UCS-2. As noted previously, if you transfer a
+   UCS-2 file with FTP in binary mode between two computers with opposite
+   Endianness, the result will have its bytes in the wrong order.
+   However, if you use FTP to transfer a UCS-2 file in "ascii" (text)
+   mode to ANY computer, even if it is identical to yours, the result
+   will be corrupted because FTP's line-terminator conversions do not
+   account for UCS-2. The same holds when sending from a UCS-aware Kermit
+   program to an older Kermit program in text mode with a transfer
+   character-set of UCS-2. So use UCS-2 as a transfer character-set ONLY
+   with a UCS-2-aware Kermit partner.
+     _________________________________________________________________
+
+    6.6.5.2. The TRANSLATE Command
+
+   In Kermit versions that have Unicode support included, TRANSLATE now
+   always goes through Unicode; that is, the source set is converted to
+   UCS-2 and thence to the target set. This is a major improvement, since
+   in prior releases, C-Kermit had to pick the "most appropriate"
+   transfer character-set as the intermediate set, and this would result
+   in the loss of any characters that the source and target sets had in
+   common but were lacking from the intermediate set (for example the OE
+   digraph when translating from NeXT to DEC MCS through Latin-1). This
+   never happens when Unicode is the intermediate set because Unicode is
+   a superset of all other character sets supported by Kermit. A more
+   dramatic example would be translation between Cyrillic PC code page
+   866 and KOI8-R ([546]Section 6.4); formerly all the line- and
+   box-drawing characters would be lost (since ISO 8859-5 does not have
+   any); now the ones that these two sets have in common are preserved.
+
+   UCS-2 and UTF-8 are now both supported as source-file and
+   destination-file character sets by C-Kermit's TRANSLATE command, for
+   example:
+
+  translate oofa.txt ucs2 latin1 oofa-l1.txt
+
+   translates oofa.txt from UCS-2 to Latin-1, storing the result as
+   oofa-l1.txt. Similarly:
+
+  translate oofa.txt utf8 latin1 oofa-l1.txt
+  translate oofa.txt latin1 ucs2 oofa-ucs2.txt
+  translate oofa.txt latin1 utf8 oofa-utf8.txt
+  translate oofa.txt ucs2 utf8 oofa-utf8.txt
+  translate oofa.txt utf8 ucs2 oofa-ucs2.txt
+
+   Treatment of the UCS-2 BOM is exactly the same as for file transfer.
+   Note that if a UCS-2 source file is in the "wrong" byte order and
+   lacks a BOM, and you don't tell Kermit about it with SET FILE UCS
+   BYTE-ORDER, the result of the translation is total gibberish. Recall
+   that you can use COPY /SWAP-BYTES to switch the byte order of an
+   errant UCS-2 file (or any other file for that matter, if you can think
+   of a reason to). Also note that:
+
+  translate oofa.txt ucs2 ucs2 new.txt
+
+   Produces a result in the native (or SET FILE UCS) byte-order as long
+   as oofa.txt has a BOM.
+
+   As a side benefit of the Unicode work, the TRANSLATE command now works
+   for the first time also for all Japanese character sets that Kermit
+   supports. In other words, if you have a Japanese text file in any of
+   the following encodings:
+
+  EUC-JP
+  Shift-JIS
+  JIS-7
+  UCS-2
+  UTF-8
+
+   You can use the TRANSLATE command to convert to any other encoding
+   from the same list.
+     _________________________________________________________________
+
+    6.6.5.3. Terminal Connection
+
+   The CONNECT command now allows UTF-8 as a local or remote terminal
+   character-set:
+
+  SET TERMINAL CHARACTER-SET { ..., UTF8 } { ..., UTF8 }
+  SET TERMINAL REMOTE-CHARACTER-SET { ..., UTF8 }
+  SET TERMINAL LOCAL-CHARACTER-SET { ..., UTF8 }
+
+   (Recall that Kermit's terminal character-set has two "ends" -- the set
+   used on the host to which Kermit is connected, and the set used on the
+   local keyboard and screen.)
+
+   UCS-2 is not supported as a terminal character-set (either end) since
+   (a) it is not used that way anywhere to our knowledge, and (b) the
+   problems of Endianness and the high likelihood of loss of
+   synchronization make it impractical. (Telecommunications is
+   byte-oriented; if one byte, or any odd number of bytes, is lost
+   because of buffer overruns, circuit resets, etc (or likewise if a
+   burst of noise appears that takes the guise of an odd number of
+   bytes), the byte order of the subsequent data stream will be
+   backwards; unlike UTF-8 and traditional byte-based character sets,
+   UCS-2 is not "self synchronizing".)
+
+   UTF-8 does not have byte-order or synchronization problems and is
+   growing in popularity as a terminal character set as well as in other
+   application areas. It allows a single terminal session to use multiple
+   scripts (Roman, Cyrillic, Greek, etc) without ISO 2022 character-set
+   switching (which terminal emulators like Kermit 95 can handle but few
+   host applications understand or use), and meshes nicely with the
+   Unicode screen fonts that are beginning to appear.
+
+   UTF-8 was first used in Plan 9 and soon will be available in Linux. It
+   will probably spread from there (Unicode in some form is, of course,
+   also used in Windows NT, but only internally -- not for access from
+   outside).
+
+   To use UTF-8 or any other character set that uses 8-bit bytes in your
+   terminal session, be sure to tell C-Kermit to:
+
+  SET TERMINAL BYTESIZE 8
+  SET COMMAND BYTESIZE 8
+  SET PARITY NONE
+
+   (or use the shortcut command, EIGHTBIT, which does all three at once).
+
+   In a setup where your local Kermit program uses a single-byte
+   character set such as PC Code Page 850 and the remote host uses UTF-8:
+
+  SET TERM CHAR UTF8 CP850
+
+   or:
+
+  SET TERM REMOTE CHAR UTF8
+  SET TERM LOCAL CHAR CP850
+
+   all works as expected. UTF-8 text on the remote displays correctly on
+   your screen, and when you type CP850 characters, they are translated
+   to UTF-8 sequences for transmission, and the echo from the host is
+   translated from UTF-8 back to CP850. Telnet negotiations and
+   autodownload take place before any character-set translation and work
+   as before. The session log (if text mode was selected for it) contains
+   only the local terminal character-set. And so on.
+
+   Kermit merely supplies translations from UTF-8 to your local terminal
+   character-set (this includes treating UTF-8 Line Separator and
+   Paragraph separator as CRLF). However, Kermit does does not, at
+   present, perform "canonicalization" of composed sequences, nor does it
+   automatically execute bidirectionality algorithms for display of
+   mixed-direction text (e.g. Hebrew and English). Such presentation
+   issues, like all others in the terminal-host regime, are left to the
+   host.
+
+   By the way, C-Kermit also allows UTF-8 to be the local end of the
+   terminal character-set, but so far this code is not tested, since we
+   don't have a UTF-8 console or terminal to work with. However, it can
+   be stated without doubt that C-Kermit's key mapping will not work for
+   UTF-8 values, since (a) the key map is indexed by 8-bit byte values
+   and (b) C-Kermit reads keystrokes a byte at a time (these comments do
+   not apply to K95, which has direct access to the keyboard and can read
+   "wide" keycodes and uses them to index a "wide" keymap).
+
+   Restrictions: As noted, the CONNECT command does not support UCS-2 as
+   a REMOTE TERMINAL character-set. Neither does it support the Japanese
+   sets EUC-JP, JIS-7, and Shift-JIS. Support for the Japanese sets (and
+   possibly Chinese and Korean too) might be added in a future release.
+   Since the TRANSMIT command (next section) uses the same REMOTE
+   TERMINAL character-sets as the CONNECT command, it has the same
+   restrictions.
+     _________________________________________________________________
+
+    6.6.5.4. The TRANSMIT Command
+
+   As described in Chapter 15 of [547]Using C-Kermit and [548]Section
+   4.21 of this document, the TRANSMIT command can be used to upload a
+   file without protocol, more or less as if you were typing it on your
+   keyboard while connected to the host. When TRANSMITting in text mode,
+   the file's character set is converted to the host's unless you have
+   SET TERMINAL CHARACTER-SET TRANSPARENT, or you include the new
+   TRANSMIT switch, /TRANSPARENT.
+
+   Before C-Kermit 7.0, the file character-set was assumed to be the same
+   as the local end of the terminal character-set, and the TRANSMIT
+   command used the same translations as the CONNECT command, ignoring
+   the file character-set.
+
+   In C-Kermit 7.0, that assumption (a poor one to begin with) can no
+   longer be made, since UCS-2 can be a file character-set but not a
+   terminal character-set. So now the file's character-set is given by
+   your most recent SET FILE CHARACTER-SET command. The host's character
+   set is the remote end of your most recent SET TERMINAL CHARACTER-SET
+   command:
+
+  SET TERMINAL CHARACTER-SET remote-set [ local-set ]
+
+   or:
+
+  SET TERMINAL REMOTE-CHARACTER-SET remote-set
+
+   The TRANSMIT command converts each source-file character from the FILE
+   character-set to the REMOTE TERMINAL character-set, and then transmits
+   the translated characters according to your SET TRANSMIT preferences
+   (Chapter 15).
+
+   If you have SET TRANSMIT ECHO ON, and the host is echoing the
+   transmitted characters, the echos are converted from the remote
+   terminal character-set to the local terminal character-set.
+
+  [ A picture would help... ]
+
+   Confused? Let's work through an example. Suppose your local computer
+   is a NeXTstation, on which text files are encoded in the NeXT
+   character set, and that the remote computer is a Data General AViiON,
+   which uses the Data General International character set. Further
+   suppose that you are logged in to the NeXT from a VT220 terminal which
+   uses the DEC Multinational character set.
+
+   You need to convert the file from NeXT encoding to DG encoding and
+   convert the echoes from DG encoding to DEC encoding. So on the NeXT,
+   tell C-Kermit to:
+
+  eightbit
+  set file character-set next
+  set term character-set dg-international dec-mcs
+  transmit /text nextdata.txt
+
+   (This assumes you have some sort of collection process already set up
+   on the Data General, such as a text editor or the venerable "cat >
+   foo". The EIGHTBIT command is equivalent to SET TERMINAL BYTESIZE 8,
+   SET COMMAND BYTESIZE 8, SET PARITY NONE.)
+
+   To further complicate matters, suppose your local terminal character
+   set is the same as the remote one, so you don't need terminal
+   character-set translation, but you need to TRANSMIT a file that is in
+   a different character set and you want it translated to the host set.
+   In this case, use SET TERM CHARACTER-SET to actually specify the
+   character set used on each end, rather than specifying TRANSPARENT:
+
+  eightbit
+  set file character-set ucs2
+  set term character-set latin1 latin1
+  transmit /text ucs2data.txt
+
+   The distinction between:
+
+  SET TERMINAL CHARACTER-SET xxx yyy
+
+   (where xxx and yyy are the same set) and:
+
+  SET TERMINAL CHARACTER-SET TRANSPARENT
+
+   is new to C-Kermit 7.0, but affects only the TRANSMIT command.
+
+   The TRANSMIT command currently does nothing special with UCS-2/UTF-8
+   Line and Paragraph Separator characters; more experience is required
+   to find out how these behave in a genuine Unicode terminal-host
+   setting.
+
+   Restrictions: As noted, the TRANSMIT command translates from the FILE
+   character-set to the REMOTE TERMINAL character-set. This rules out
+   translations to any character set that is not supported as a REMOTE
+   TERMINAL character-set, such as UCS-2, EUC-JP, JIS-7, and Shift-JIS.
+     _________________________________________________________________
+
+    6.6.5.5. Summary of Kermit Unicode Commands
+
+   Specifying file character-set and byte order:
+          SET FILE CHARACTER-SET { ..., UCS2, UTF8 }
+          REMOTE SET FILE CHARACTER-SET { ..., UCS2, UTF8 } (See next
+          section)
+          SET FILE UCS BOM { ON, OFF }
+          SET FILE UCS BYTE-ORDER { BIG-ENDIAN, LITTLE-ENDIAN }
+
+   Specifying the transfer character-set:
+          SET TRANSFER CHARACTER-SET { ..., UCS-2, UTF-8 }
+          REMOTE SET TRANSFER CHARACTER-SET { ..., UCS-2, UTF-8 }
+
+   Specifying the terminal character-set:
+          SET TERMINAL CHARACTER-SET { ..., UTF8 } { ..., UTF8 }
+          SET TERMINAL REMOTE-CHARACTER-SET { ..., UTF8 }
+          SET TERMINAL LOCAL-CHARACTER-SET { ..., UTF8 }
+
+   Displaying settings:
+          SHOW FILE
+          SHOW TRANSFER
+          SHOW TERMINAL
+          SHOW CHARACTER-SETS
+
+   Commands that use these settings include:
+          SEND, RECEIVE, GET, etc.
+          CONNECT
+          TRANSMIT
+          LOG SESSION
+
+   Converting files:
+          TRANSLATE infile { ..., UCS-2, UTF-8 } { ..., UCS-2, UTF-8 }
+          outfile
+          COPY /SWAP-BYTES infile outfile
+     _________________________________________________________________
+
+  6.7. Client/Server Character-Set Switching
+
+   A simple mechanism has been added to allow the client to change the
+   server's FILE CHARACTER-SET:
+
+   REMOTE SET FILE CHARACTER-SET name
+          The client asks the server to change its file character-set to
+          the one given. The name must match one of the server's file
+          character-set names. For convenience, C-Kermit uses its own
+          file character-set keyword list for parsing this command so you
+          can use ? for help and Tab or Esc for completion. However,
+          since the server might have a different repertoire (or even use
+          different names for the same sets), C-Kermit accepts any string
+          you supply and sends it to the server. The server, if it
+          supports this command (C-Kermit 7.0 and K95 1.1.19 do), sets
+          its file character-set as requested, and also disables
+          automatic character-set switching ([549]Section 6.5). If the
+          server does not support this command or if it does not support
+          the given character set, the REMOTE SET FILE CHARACTER-SET
+          command fails.
+
+   Here's an example that sends a Japanese text file encoded in Shift-JIS
+   to a server using every combination of Kermit's Japanese-capable file
+   and transfer character sets:
+
+  dcl \&x[] = euc ucs2 utf8             ; transfer character-sets
+  dcl \&y[] = eu uc ut                  ; 2-letter abbreviations for them
+  dcl \&f[] = shift euc jis7 ucs2 utf8  ; file character-sets
+  dcl \&g[] = sj eu j7 uc ut            ; 2-letter abbreviations
+
+  set file char shift-jis               ; local file character-set is Shift-JIS
+  for \%i 1 \fdim(&x) 1 {               ; for each transfer character-set...
+      set xfer char \&x[\%i]            ; set it
+      for \%j 1 \fdim(&f) 1 {           ; for each remote file character-set...
+          remote set file char \&f[\%j] ; set it
+          if fail exit 1 SERVER REJECTED CHARSET
+          send /text meibo-sj.html meibo-sj-\&y[\%i]-\&g[\%j].txt ; send the fi
+le
+          if fail exit 1 TRANSFER FAILED
+      }
+  }
+
+   The Kermit-370 server does not support REMOTE SET FILE CHARACTER-SET,
+   but since it supports REMOTE KERMIT commands, you can get the same
+   effect with REMOTE KERMIT SET FILE CHARACTER-SET name.
+     _________________________________________________________________
+
+  7. SCRIPT PROGRAMMING
+
+   (Also see [550]Section 2.8, Scripting Local Programs.)
+
+  7.0. Bug Fixes
+
+   The following script programming bugs were fixed in C-Kermit 7.0:
+
+     * IF EXIST and IF DIRECTORY were fixed to properly strip braces from
+       around their arguments, so "if directory {C:\Program Files}", etc,
+       would work as expected. However, this means that if the file or
+       directory name is actually enclosed in braces, the braces must be
+       doubled.
+     * The READ command did not fail if the READ file wasn't open; now it
+       does.
+     * The READ command refused to read the last or only line of a file
+       if it did not end with a proper line terminator; now it does.
+     * The END command, when given from within a SWITCH statement, did
+       not exit from the current macro or command file; instead it just
+       terminated the SWITCH.
+     _________________________________________________________________
+
+  7.1. The INPUT Command
+
+   7.1.1. INPUT Timeouts
+
+   The description of the INPUT command on page 422 fails to mention the
+   following two points about the timeout (which apply to C-Kermit 6.0
+   and later):
+
+    1. "INPUT -1 text" (or "INPUT \%x text", where \%x is any variable
+       whose value is -1 or less) means "wait forever". This form of the
+       INPUT command fails only if it is interrupted, since it will never
+       time out.
+    2. INPUT 0 performs a nonblocking read of material that has already
+       arrived but has not yet been read, and succeeds immediately if the
+       target string is found, or fails immediately if it is not found.
+
+   The same points apply to MINPUT. REINPUT ignores its timeout
+   parameter.
+     _________________________________________________________________
+
+    7.1.2. New INPUT Controls
+
+   The following new INPUT controls were added in version 7.0:
+
+   SET INPUT AUTODOWNLOAD { ON, OFF }
+          Explained in [551]Section 7.7.
+
+   SET INPUT CANCELLATION { ON, OFF }
+          This governs whether an INPUT command can be canceled by
+          "pressing any key" on the keyboard. Normally it can be, in
+          which case the INPUT command fails immediately and \v(instatus)
+          is set to 2, indicating interruption. SET INPUT CANCELLATION
+          OFF disables keyboard cancellations; thus if the search text is
+          not encountered, the INPUT command will run for its entire
+          timeout interval. SET INPUT CANCELLATION OFF does not disable
+          interruption by Ctrl-C, however; every command needs an
+          emergency exit. (If you really want to disable interruption by
+          Ctrl-C, use SET COMMAND INTERRUPTION OFF.)
+
+   Also see [552]Section 7.2 for any new variables related to INPUT.
+     _________________________________________________________________
+
+    7.1.3. INPUT with Pattern Matching
+
+   C-Kermit 7.0 allows INPUT, MINPUT, and REINPUT targets to be a pattern
+   (explained in [553]Sections 1.19 and [554]4.9). This solves a
+   long-standing problem illustrated by the following scenario: a certain
+   company has a bank of TCP/IP modem servers, with hostnames server1,
+   server2, server3, and so on. Each server's prompt is its name,
+   followed by a colon (:), for example "Server72:". Without INPUT
+   patterns, it would be rather difficult to wait for the prompt. The
+   brute force approach:
+
+  minput 20 Server1: Server2: Server3: ... (enumerating each one)
+
+   is subject to failure whenever a new server is added. A more subtle
+   approach:
+
+  input 20 Server
+  if fail ...
+  input 2 :
+
+   is liable to false positives, e.g. "Welcome to the XYZ Corp Modem
+   Server. Please read the following message:"...
+
+   With patterns, you can match the prompt with "Server*:" (which doesn't
+   solve the "false positives" problem, but certainly is more compact
+   than the brute force method), or with more specific patterns such as
+   "Server[1-9]:" and "Server[1-9][0-9]:", or equivalently:
+
+  Server{[1-9],[1-9][0-9]}:
+
+   meaning the word "Server" followed by a single digit (1-9) or by two
+   digits representing a number from 1 to 99, followed by a colon.
+
+   INPUT pattern matching has been added in a way that does not interfere
+   with existing scripts. No new commands or switches are used. The
+   simple rule is: if an INPUT search target is the argument of the (new)
+   \fpattern() function, it is a pattern. Otherwise it is taken
+   literally, as before. For example:
+
+  input 5 a*b
+
+   searches for an 'a' followed by an asterisk ('*'), followed by a 'b'.
+   But:
+
+  input 5 \fpattern(a*b)
+
+   searches for an 'a' followed by anything at all up to and including
+   the first 'b'. This means that any search target to INPUT, MINPUT, or
+   REINPUT can be a pattern or a literal string, and in particular that
+   MINPUT can accommodate any mixture of patterns and literal strings.
+
+   In selecting patterns, note that:
+
+     * A leading '*' is always implied so there is no need to include
+       one.
+     * A trailing '*' is meaningless and ignored.
+     * A '*' by itself matches the first character that arrives.
+
+   A syntax note: If your pattern is a selection list, meaning a list of
+   alternatives separated by commas and enclosed in braces, then the
+   outer braces will be stripped by various levels of parsers, so you
+   must include three of each:
+
+  input 10 \fpattern({{{abc,mno,xyz}}})
+
+   Note that this is equivalent to:
+
+  minput 10 abc mno xyz
+
+   except for the setting of the \v(minput) variable.
+
+   And a caution: INPUT pattern matching has a limitation that you
+   probably never noticed with literal-string matching, namely that there
+   is a limit on the size of the match. For example, if the pattern is
+   "a*b", the match will succeed if the 'a' and 'b' are not separated by
+   more than (say) 8K bytes, but will fail if they are farther apart than
+   that. In such cases, it better to use two INPUTs (e.g. "input 10 a"
+   and then "input 100 b").
+     _________________________________________________________________
+
+    7.1.4. The INPUT Match Result
+
+   The result of any INPUT, MINPUT, or REINPUT command, no matter whether
+   the search targets are patterns or literal strings, is available in
+   the new \v(inmatch) variable. For example:
+
+  minput 10 cat \fpattern([dh]og)
+  if success echo MINPUT matched "\v(inmatch)"
+
+   This is especially useful when a pattern was matched, since it makes
+   the string that matched the pattern available to Kermit; there would
+   be no way to get it otherwise.
+
+   After an INPUT command, you can view all the INPUT-related variables
+   by typing "show variables in" (abbreviate as "sho var in"), which
+   shows the values of all built-in variables whose names start with
+   "in".
+     _________________________________________________________________
+
+  7.2. New or Improved Built-In Variables
+
+   \v(blockcheck)
+          Current BLOCK-CHECK setting, 1, 2, 3, or 4. 4 is the code for
+          BLANK-FREE-2.
+
+   \v(byteorder)
+          The machine's byte order: 0 = Big Endian, 1 = Little Endian.
+
+   \v(cmdbufsize)
+          The length of the command buffer, which is the maximum size for
+          a macro, a command, a variable, or anything else in C-Kermit's
+          script language.
+
+   \v(ctty)
+          The device name of C-Kermit's controlling (login) terminal.
+
+   \v(filename)
+          Described in [555]Sections 4.1 and [556]4.2.
+
+   \v(filenumber)
+          Described in [557]Sections 4.1 and [558]4.2.
+
+   \v(filespec)
+          As of C-Kermit 7.0, contains fully qualified filenames rather
+          than (usually) relative ones.
+
+   \v(return)
+          Now holds the END n value of the macro that most recently
+          returned, in case END was used rather than RETURN.
+
+   \v(editor)
+          Pathname of preferred text editor
+
+   \v(editopts)
+          Command-line options for editor
+
+   \v(editfile)
+          File most recently edited
+
+   \v(browser)
+          Pathname of preferred Web browser
+
+   \v(browsopts)
+          Command-line options for Web browser
+
+   \v(browsurl)
+          URL most recently given to Web browser
+
+   \v(dialtype)
+          Type of call most recently placed (see [559]Section 2.1.11).
+
+   \v(kbchar)
+          The character, if any, that was typed at the keyboard to to
+          interrupt the most recent PAUSE, SLEEP, WAIT, MSLEEP, or INPUT
+          command; empty if the most recent such command was not
+          interrupted from the keyboard.
+
+   \v(lockdir)
+          UNIX only - The name of the UUCP lockfile directory, if known,
+          otherwise "(unknown)".
+
+   \v(lockpid)
+          UNIX only - PID of process that owns the communication port
+          that you tried to open with a SET LINE command that failed
+          because the port was in use, otherwise empty. This variable is
+          set with every SET LINE command.
+
+   \v(cx_time)
+          If no connection (SET HOST, SET LINE, DIAL, TELNET, etc) is
+          active, this is 0. If a connection is active, this is the
+          number of seconds since the connection was made.
+
+   \v(hwparity)
+          If hardware parity is in effect, this variable gives its value,
+          such as "even" or "odd" (in which case, the \v(parity) variable
+          will be "none"). Otherwise this variable is empty.
+
+   \v(serial)
+          Current serial port settings in 8N1 format ([560]Section 2.10).
+
+   \v(errno)
+          In UNIX, the current value of the C runtime errno variable,
+          which is quite volatile (meaning that often an "interesting"
+          error code can be overwritten by some other library call or
+          system service that sets errno before you have a chance to look
+          at it). In VMS, the error code returned by the system or
+          library call that most recently failed (success codes are not
+          saved). Not available in other operating systems.
+
+   \v(errstring)
+          The UNIX or VMS system error message that corresponds to
+          \v(errno). Not available in all OS's. Also see
+          [561]\ferrstring().
+
+   \v(setlinemsg)
+          The error message, if any, from the most recent SET LINE, SET
+          PORT, SET HOST, TELNET, or other connection-making command.
+          This is not necessarily the same as \v(errstring) since these
+          commands might fail without generating a system error code, for
+          example (in UNIX) because a lockfile existed indicating the
+          device was assigned by another user.
+
+   \v(exitstatus)
+          The exit status C-Kermit would return if it exited now.
+
+   \v(pexitstat)
+          The exit status of the inferior process most recently invoked
+          by C-Kermit (by RUN, !, REDIRECT, SEND /COMMAND, etc). In VMS,
+          this code can be given to \ferrstring() to get the
+          corresponding error message (in UNIX, program/command return
+          codes are not the same as system error codes). Not available in
+          operating systems other than UNIX and VMS. See [562]Section
+          4.2.5 for details.
+
+   \v(inmatch)
+          The incoming string of characters, if any, that matched the
+          most recent INPUT, REINPUT, or MINPUT command.
+
+   \v(intime)
+          The number of milliseconds (thousandths of seconds) it took for
+          the most recent INPUT command to find its match, or -1 if no
+          INPUT command has been given yet. If the INPUT command timed
+          out, the value is approximately equal to 1000 times the INPUT
+          timeout. If INPUT failed for some other reason, the value is
+          undefined (\v(instatus) gives INPUT completion status). If your
+          version of C-Kermit is built without high-precision
+          floating-point timers, this number will always be a multiple of
+          1000.
+
+   \v(inwait)
+          The number of seconds specified as the timeout in the most
+          recent INPUT command.
+
+   \v(dialsuffix)
+          Dialing suffix for use during PDIAL sequence; see [563]Section
+          2.1.10.
+
+   \v(pid)
+          UNIX, VMS, and K95 only. C-Kermit's primary process ID,
+          numeric, decimal. If you want to show it in hex, use
+          \fn2hex(\v(pid)) If you want to show it in octal, use
+          \fn2octal(\v(pid)).
+
+   \v(printer)
+          Current printer name or SET PRINTER value.
+
+   \v(p_ctl)
+          Control prefix char \v(p_8bit) 8-bit prefix char (if parity not
+          none)
+
+   \v(p_rpt)
+          Repeat prefix char (if repeat compression enabled)
+
+   \v(herald)
+          Kermit's version herald
+
+   \v(test)
+          Kermit's test version, if any, or 0 if this is not a test
+          version. Typical values for test versions are "Alpha.03" or
+          "Beta.14".
+
+   \v(sendlist)
+          The number of entries in the SEND-LIST, 0 if none. Note:
+          entries do not necessarily correspond to files, since an entry
+          might contain wildcards. Also note that the value does not go
+          back to 0 after the files in the list are sent. To reset this
+          variable, use CLEAR SEND-LIST. The purpose of this variable is
+          to determine if a SEND command, when given without any
+          filenames, will be legal. Example:
+
+  xif \v(sendlist) { send } else { send oofa.txt }
+
+   \v(trigger)
+          If the most recent CONNECT session was terminated automatically
+          by a trigger, this variable contains the trigger value.
+
+   \v(ty_ln)
+          TYPE line number (during TYPE)
+
+   \v(ty_lc)
+          TYPE line count (after TYPE)
+
+   \v(ty_mc)
+          TYPE match count (after TYPE)
+
+   \v(xferstat)
+          Status of most recent file transfer:
+
+-1: No transfer yet
+ 0: Succeeded
+ 1: Failed
+
+   \v(xfermsg)
+          If the most recent file transfer failed, this is the reason. If
+          it succeeded, \v(xfermsg) is an empty string.
+
+   \v(tftime)
+          Total elapsed time of most recent file transfer operation, in
+          seconds.
+
+   \v(textdir)
+          Directory that holds (or is supposed to hold) Kermit text files
+          such as installation instructions, release notes, update notes,
+          read-me files, "beware" files, etc.
+
+   \v(name)
+          The name with which the Kermit program was invoked, e.g.
+          "kermit", "wermit", "k95", "k2", etc (see [564]Section 9.1).
+
+   \v(osname)
+          Name of operating system on computer where C-Kermit is running,
+          obtained at runtime (from uname or equivalent).
+
+   \v(osversion)
+          Version of operating system on computer where C-Kermit is
+          running, obtained at runtime (from uname or equivalent).
+
+   \v(osrelease)
+          Release of operating system on computer where C-Kermit is
+          running, obtained at runtime (from uname or equivalent).
+
+   \v(model)
+          The specific hardware model of the computer where C-Kermit is
+          running, if known.
+
+   \v(math_pi)
+          The value of Pi (see [565]Section 7.23)
+
+   \v(math_e)
+          The value of e (see [566]Section 7.23)
+
+   \v(math_precision)
+          How many significant digits in a floating-point number.
+
+   \v(f_count)
+          Result of the most recent FILE COUNT (FCOUNT) command.
+
+   \v(f_error)
+          Numeric error code of most recent FILE command.
+
+   \v(f_max)
+          Maximum number of files open simultaneously.
+
+   The math constants are given in the precision of underlying computer's
+   floating-point arithmetic.
+
+   Note the distinction between \v(osname), \v(osversion), and
+   \v(platform); the latter refers to the platform for which and/or upon
+   which C-Kermit was built, as opposed to the one on which it is
+   actually running. Also note that each operating system can, and
+   probably will, interpret and fill in the os* variables differently, or
+   not at all.
+
+   The SHOW VARIABLES command now accepts a variable name, prefix, or
+   pattern:
+
+  show variables         Shows all variables.
+  show variables t       Shows all variables that start with "t".
+  show variables *ver*   Shows all variables whose names contain "ver".
+  show variables *ver    Ditto (an implied "*" is appended).
+     _________________________________________________________________
+
+  7.3. New or Improved Built-In Functions
+
+   The following new file-i/o functions are explained in [567]Section
+   1.22.
+
+  \f_status(channel)           Status of file open on channel
+  \f_pos(channel)              Read/write (byte) pointer of given file
+  \f_line(channel)             Current line of file
+  \f_handle(channel)           Handle of file
+  \f_eof(channel)              Whether given file is at EOF
+  \f_getchar(channel)          Read a char from given file
+  \f_getline(channel)          Read a line from given file
+  \f_getblock(channel,n)       Read a block from given file
+  \f_putchar(channel,c)        Write a char to given file
+  \f_putline(channel,string)   Write a line to given file
+  \f_putblock(channel,string)  Write a block to given file
+
+   The following new date-time-related functions are explained in
+   [568]Section 1.6:
+
+  \fday()                Returns day of week of given date
+  \fnday()               Returns numeric day of week of given date
+  \ftime()               Returns time portion of given date-time
+  \fntime()              Converts time to seconds since midnight
+  \fn2time()             Converts seconds since midnight to hh:mm:ss
+  \fcvtdate(date-time)   Converts free-format date to yyyymmdd hh:mm:ss
+  \fdayofyear(date-time) Converts date to yyyyddd (day-of-year) format
+  \fdoy(date-time)       Synonym for \fdayofyear()
+  \fdoy2date(dayofyear)  Converts yyyyddd to yyyymmdd
+  \fmjd(date-time)       Converts free-format date to Modified Julian Date
+  \fmjd2date(mjd)        Converts modified Julian date to yyyymmdd
+
+   The new floating-point arithmetic functions are explained in
+   [569]Section 7.23. f1 and f2 are floating-point (real) numbers; d is
+   the number of decimal places to show:
+
+  \ffpabsolute(f1,d)     Absolute value of f1
+  \ffpadd(f1,f2,d)       f1 + f1
+  \ffpcosine(f1,d)       Cosine of f1
+  \ffpdivide(f1,f2,d)    f1 divided by f2
+  \ffpexp(f1,d)          e to the f1 power
+  \ffpint(f1)            Integer part of f1
+  \ffplog10(f1,d)        Log base 10 of f1
+  \ffplogn(f1,d)         Natural log of f1
+  \ffpmaximum(f1,f2,d)   Maximum of f1 and f2
+  \ffpminimum(f1,f2,d)   Minimum of f1 and f2
+  \ffpmodulus(f1,f2,d)   Modulus of f1 and f2
+  \ffpmultiply(f1,f2,d)  Product of f1 and f2
+  \ffpraise(f1,f2,d)     Raise f1 to power f2
+  \ffpround(f1,d)        Round f1 to d places
+  \ffpsine(f1,d)         Sine of f1
+  \ffpsqrt(f1,d)         Square root of f1
+  \ffpsubtract(f1,f2,d)  f2 - f1
+  \ffptangent(f1,d)      Tangent of f1
+
+   Integer number functions:
+
+   \fabsolute(n)
+          Absolute value of integer n.
+
+   \frandom(n)
+          Returns a random integer between 0 and n-1.
+
+   \fradix(s,n1,n2)
+          If the string s is an integer in radix n1, the result is the
+          same number expressed in radix n2, where n1 and n2 may be any
+          number from 2 through 36, expressed as decimal numbers, or
+          variables (etc) that evaluate to decimal numbers. For the
+          source and result, the digits of any radix, r, are the first r
+          characters in the sequence 0-9,a-z (case doesn't matter for the
+          letters). The string s may have a sign, + or -; if it starts
+          with a minus (-) sign, the result also has a minus sign.
+
+   The \fradix() function does not work with floating-point numbers. It
+   does not reveal the internal storage format of a number; for example,
+   \fradix(-1,10,16) is -1, not something like FFFFFFFFFF. If all three
+   arguments are not given, or if n1 or n2 are not numbers between 2 and
+   36 inclusive, or s is not a number in radix n1, an error occurs and
+   the empty string is returned. \fradix() also does not offer
+   extended-precision arithmetic; number values are limited to those
+   expressed as a long integer in the architecture of the underlying
+   computer, usually 32 or 64 bits. If you give it an argument whose
+   absolute value is larger than can be held in an unsigned long, the
+   result is -1.
+
+   The next four are shorthand functions for decimal/hexadecimal and
+   decimal/octal number conversion:
+
+   \fn2hex(n)
+          Returns the hexadecimal (base 16) representation of the integer
+          n. This is different from \fhexify(s), which treats its
+          argument as a string rather than a number. The result is always
+          left-padded with 0's to make its length even. Examples:
+
+  \n2hex(0)   = "00"                    \fhexify(0)   = "30"
+  \n2hex(255) = "ff"                    \fhexify(255) = "323535"
+  \n2hex(256) = "0100"                  \fhexify(256) = "323536"
+
+   \fhex2n(x)
+          Converts hexadecimal number x to decimal equivalent decimal
+          number. This is the inverse of \fn2hex(). Equivalent to
+          \fradix(s,16,10).
+
+   \fn2octal(n)
+          Returns the octal (base 8) representation of the number n.
+          Examples:
+
+  \n2octal(0) = "0"
+  \n2oct(255) = "377"
+  \n2oct(256) = "400"
+  Equivalent to \fradix(n,10,8).
+
+   \foct2n(n)
+          Returns the decimal representation of the given octal number,
+          n. The inverse of \fn2octal(). Equivalent to \fradix(n,8,10).
+
+   String functions:
+
+   \s(name[n:m])
+          Equivalent to \fsubstring(\m(name),n,m) ([570]Section 7.24).
+
+   \:(name[n:m])
+          Equivalent to \fsubstring(name,n,m) (where "name" is any
+          \-quantity) ([571]Section 7.24).
+
+   \fleft(s,n)
+          The leftmost ncharacters of string s; equivalent to
+          \fsubstring(s,1,n).
+
+   \fstripx(string,char)
+          Returns the part of the string up to the rightmost occurrence,
+          if any, of the given character. The default character is period
+          (.) Examples:
+
+  \fstripx(foo/bar,/)                 = "foo"
+  \fstripx(foo/bar/baz,/)             = "foo/bar"
+  \fstripx(autoexec.bat,.)            = "autoexec"
+  \fstripx(autoexec.bat)              = "autoexec"
+  \fstripx(fstripx(foo/bar/baz,/),/)  = "foo"
+
+   \flop(string,character)
+          Returns the portion of the string starting after the first
+          occurrence of the given character. The default character is
+          period (.) Examples:
+
+  \flop(autoexec.bat)                 = "bat"
+  \flop(baz.foo/bar)                  = "foo/bar"
+  \flop(baz.foo/bar,/)                = "bar
+
+   \fstripn(string,n)
+          Returns the string with ncharacters removed from the end.
+          Example:
+
+  \fstripn(12345678,3)                = "12345"
+
+          (For more discussion of \fstripx(), \fstripn(), and \flop() see
+          [572]Section 4.2.3).
+
+   \fb64encode(s)
+          Returns the Base-64 encoding of the string s.
+
+   \fb64decode(s)
+          Returns the decoding of the Base-64 string s. Fails if s is not
+          a Base-64 string, or if its length is not a multiple of 4. Note
+          that if any of the result bytes are null (0), the result string
+          stops there. There is no way to represent strings that contain
+          null bytes in C-Kermit (the same is true for \funhexify()).
+
+   \fword(s1,n,s2,s3)
+          Extracts word number nfrom string s1. By default, a "word" is
+          any sequence of ASCII letters or digits; nis 1-based. If nis
+          omitted, "1" is used. Examples:
+
+  \fword(one two three)    = "one"
+  \fword(one two three,1)  = "one"
+  \fword(one two three,2)  = "two"
+  \fword(one two three,3)  = "three"
+
+          and:
+
+    \fword(\v(dialresult),2) = "31200"
+
+          is "31200" if \v(dialresult) is (e.g.) "CONNECT
+          31200/ARQ/V32/LAPM/V42BIS".
+
+          If you include s2, this replaces the default break set. For
+          example, suppose you have a string \%a whose value is:
+
+  $150.00 $300.00 $39.95
+
+          and you want each dollar amount to be a word; use:
+
+  \fword(\%a,\%n,{ })
+
+          This returns dollar amount number \%n, e.g. "$300.00" for \%n =
+          2. "{ }" denotes a space (you must enclose it in braces,
+          otherwise it is squeezed out). Note that ASCII control
+          characters are always included in the break set; you don't have
+          to specify them (and you can't not specify them).
+
+          The optional s3 argument lists characters (even control
+          characters) that normally would be considered separators that
+          you want included in words. So the dollars-and-cents example
+          could also be handled this way:
+
+  \fword(\%a,\%n,,$.)
+
+          in other words, use the default separator list, but remove "$"
+          and "." from it so they will be considered part of a word.
+
+   \fsplit(s1,&a,s2,s3)
+          This is like \fword(), except instead of extracting and
+          returning a particular word from string s1, it counts the words
+          and optionally assigns them to the array whose identifying
+          letter, a-z, is given after the "&" in the second argument,
+          with the first word going into element 1, the second into
+          element 2, and so on. The rules regarding break and include
+          lists (s2 and s3) are exactly the same as for \fword().
+          \fsplit() returns the number of words that were assigned, which
+          is either the number of words in the string, or the dimension
+          of the array, whichever is less. If the array is not declared,
+          \fsplit() creates it and returns a number which is both the
+          number of words in s1 and the dimension of the new array.
+          Examples:
+
+  declare \&w[20]        ; (Optional.)
+  ...
+  read \%s               ; \%s is "This is a sentence with seven words."
+  ...
+  echo "\fsplit(\%s)"    ; This would print "7".
+  echo "\fsplit(\%s,&w)" ; Ditto, and also assigns them to array \&w[].
+
+  echo "\&w[7]"          ; This would print "words".
+
+          If the line contained fields that were delimited by colon (:),
+          you would use \fsplit(\%s,&w,:). If the fields were delimited
+          by comma, then you would use \fsplit(\%s,&w,{,}); in this case
+          the literal comma must be enclosed in braces to distinguish it
+          from the comma that separates function arguments. To get a word
+          count without loading an array, but still specify break and/or
+          include lists, leave the array argument empty:
+
+   echo "\fsplit(\%s,,:)" ; Use colon as the separator.
+
+          WARNINGS:
+
+         1. If you use the same array repeatedly, \fsplit() leaves any
+            trailing members undisturbed. For example:
+  dcl \&w[10]
+  \fsplit(1 2 3 4 5,&w) ; Sets \&w[1] thru \&w[5].
+  \fsplit(a b c,&w)     ; Sets \&w[1]-[3] leaving [4]-[5] as they were.
+         2. If you allow \fsplit to create the array (by not declaring it
+            first), it is dimensioned to the number of elements it was
+            created with:
+  \fsplit(1 2 3,&x)     ; Creates an array \&x[] with 3 elements.
+  \fsplit(a b c d e,&x) ; This overflows the array.
+
+          Thus if you want to use \fsplit() repeatedly on the same array,
+          either dimension it in advance to the maximum expected size
+          (and then some -- more efficient), or else destroy it after
+          each use (to allow for unexpectedly large arguments). Example
+          using a dynamic array:
+
+  fopen /read \%c some-file
+  if fail ...
+  set function error on    ; See [573]Section 7.12
+  while true {
+      dcl \&w[]            ; Destroy \&[w] each time thru the loop
+      fread /line \%c \%a
+      if fail break
+      asg \%x \fsplit(\%a,&w)
+      if fail ...
+      ; (do what you want with \&w[] here...)
+  }
+  fclose \%c
+
+   \frindex(s1,s2,n)
+          The "n" argument to \frindex() now works consistently (in
+          mirror image) with the corresponding \findex() argument. In
+          each case, the (n-1)-most characters of s2 are ignored in the
+          search; for findex, this means the starting position of the
+          search is n (the default nis 1, and 0 is treated like 1). For
+          \frindex() it means the default starting point is:
+
+  length(s2) - length(s1) - n (with the same defaults for n).
+
+   \fsearch(pattern,string[,position])
+          Exactly like \findex(), except with a pattern (see [574]Section
+          7.9) rather than a literal string.
+
+   \frsearch(pattern,string[,position])
+          Exactly like \frindex(), except with a pattern rather than a
+          literal string.
+
+          File Functions:
+
+   \ffiles(), \fnextfile()
+          It is no longer necessary to copy the file list to an array
+          before use, as shown on p.398 of [575]Using C-Kermit 2nd
+          Edition. \ffiles() and friends now make their own safe copies
+          of the file list. Thus constructions like the following are now
+          possible:
+
+  for \%i 1 \ffiles(*.txt) 1 { send \fnextfile() }
+
+          The same is true for the new function \frfiles(),
+          \fdirectories(), and \frdirectories(), described in
+          [576]Section 4.11.3.
+
+          But note that each reference to \fnextfile() still gets you the
+          next file. So "if newer \fnextfile() foo.txt send \fnextfile()"
+          compares one file's age with that of foo.txt, and then sends an
+          entirely different file. If you're going to refer to the same
+          file more than once, assign it to a variable:
+
+  asg \%f \fnextfile()
+  if newer \%f foo.txt send \%f
+
+          (note: assign, not define).
+
+          Also note that \ffiles(), \frfiles(), \fdirectories(), and
+          \frdirectories() all now accept on optional 2nd argument: the
+          name of an array to load with the resulting file or directory
+          list, explained in [577]Section 4.11.3. So you can also load an
+          array with the filelist when you need to refer to the same file
+          more than once:
+
+  for \%i 1 \ffiles(*,&a) 1 { if newer \&a[\%i] foo.txt send \&a[\%i] }
+
+   \fpermissions(file)
+          Returns the platform-specific permissions string for the file,
+          such as "-rw-rw-r--" in UNIX or "(RWE,RWE,RE,E)" in VMS.
+
+   \fdirname(f)
+          Given a file specification f, this function returns the
+          complete pathname of directory the file is in.
+
+   Array Functions:
+
+   \fdimension(&a)
+          Returns the dimension declared for the array whose identifying
+          letter, a-z, or special character "_" or "@", is given after
+          the "&" in the argument. If the array is not declared, 0 is
+          returned. Note that when used with the macro argument vector
+          array, \&_[] (see [578]Section 7.5), the value of this function
+          is one less than \v(argc), and when used with the C-Kermit
+          command-line argument vector array, \&@[], it is equal to the
+          \v(args) variable. Examples:
+
+  echo \fdimension(&a)       ; Not declared.
+  0
+  declare \&a[12]            ; Now it's declared.
+  echo \fdim(&a)
+  12
+
+   \farraylook(pattern,arrayname)
+          Looks in the given array for the pattern and returns the index
+          of the first element that matches, if any, or -1 if none match.
+          The arrayname can include a range specifier to restrict to
+          search to a segment of the array, e.g.
+          \farraylook(*xyz*,&a[32:63]). For greater detail see
+          [579]Section 7.10.7.
+
+   \ftablelook(keyword,arrayname[,delimiter])
+          Looks in the given "table", which must be sorted, for the given
+          keyword. Returns the index of the table element that uniquely
+          matches the given keyword, or -1 if none match, or -2 if more
+          than 1 match. For greater detail see [580]Section 7.10.7.
+
+   Other new functions:
+
+   \fip2hex(s)
+          Converts a dotted decimal IP address to an 8-digit hexadecimal
+          number. \fip2hex(128.59.39.2) = 803b2702.
+
+   \fhex2ip(x)
+          Converts an 8-digit hexadecimal IP address to dotted decimal
+          form, e.g. \fhex2ip(803b2702) = 128.59.39.2. The inverse of
+          \fip2hex().
+
+   \fcommand()
+   \frawcommand()
+          These run an external command and return its output; see
+          [581]Section 4.2.8.4.
+
+   \fdialconvert(s)
+          s is a phone number in either literal or portable format (not a
+          dialing directory entry name). The function returns the dial
+          string that would actually be used when dialing from the
+          current location (after processing country code, area code, and
+          other SET DIAL values).
+
+   \ferrstring(n)
+          Returns the system error message associated with the (numeric)
+          error code n. UNIX and VMS only. Use in conjunction with
+          \v(errno) or \v(pexitstat). See [582]Section 4.2.5 for a usage
+          example. Note: This function doesn't work in Windows because
+          there is not a consistent error-code-to-message mapping; error
+          code "x" means something completely different depending on
+          whether it comes from the C runtime library, Winsock, a
+          Windows-32 API, TAPI, etc,
+
+   \fpattern(s)
+          Used in INPUT, REINPUT, and MINPUT commands to denote search
+          strings that are to be treated as patterns rather than
+          literally.
+
+   Also see [583]Section 7.8 on built-in help for functions.
+     _________________________________________________________________
+
+  7.4. New IF Conditions
+
+   IF AVAILABLE feature command
+          Executes the command if the given feature is available.
+          Presently used only to determine if specific authentication and
+          encryption options are available. Type "if available ?" to see
+          which features may be tested.
+
+   IF FLOAT f1 command
+          Executes command if f1 is a legal floating point number (which
+          includes integers). Use this to preverify arguments for the
+          \ffp...() floating-point arithmetic functions, e.g. "if float
+          \%1 echo \ffpint(\%1)".
+
+   IF == n1 n2 command
+          Synonym for "if =" (numeric equality). Note that as of C-Kermit
+          7.0, this and all other numeric comparison operators also work
+          for floating-point numbers.
+
+   IF != n1 n2 command
+          Executes the command if n1 and n2 are both numbers or variables
+          containing numbers and the value of n1 is not equal to the
+          value of n2. This is equivalent to "if not = n1 n2".
+
+   IF <= n1 n2 command
+          Executes the command if n1 and n2 are both numbers or variables
+          containing numbers and the value of n1 is less than or equal to
+          the value of n2. This is equivalent to "if not > n1 n2".
+
+   IF >= n1 n2 command
+          Executes the command if n1 and n2 are both numbers or variables
+          containing numbers and the value of n1 is greater than or equal
+          to the value of n2. Equivalent to "if not < n1 n2".
+
+   IF COMMAND word command
+          Executes the command if word is a built-in C-Kermit command.
+          Example:
+
+  if not command copy define { copy run copy \%1 \%2 }".
+
+          This defines a COPY macro that runs an external COPY command if
+          COPY is not already a built-in command.
+
+   IF LOCAL command
+          Executes the command if Kermit is in local mode, i.e. if it has
+          a SET LINE, SET PORT, or SET HOST (TELNET, RLOGIN, etc) device
+          or connection open. Does not execute the command if in remote
+          mode.
+
+   IF MATCH string pattern command
+          Executes the command if the string matches the pattern. For a
+          description of the syntax for the pattern, see [584]Section
+          4.9.1. If you want to test if the string contains pattern, use
+          IF \fsearch(pattern,string).
+
+   IF OPEN { DEBUG-LOG, SESSION-LOG, TRANSACTION-LOG, ... } command
+          Executes the command if the given file is open, fails if it is
+          not open. Type IF OPEN ? for a complete list of files that can
+          be checked (all the files that can be opened with the OPEN or
+          LOG commands).
+
+   IF QUIET command
+          Executes the command if SET QUIET is ON, and does not execute
+          it if SET QUIET is OFF. Example: IF NOT QUIET ECHO { This is a
+          message.}.
+
+   IF READABLE name
+          Succeeds if name is the name of an existing file or directory
+          that is readable.
+
+   IF WRITEABLE name
+          Succeeds if name is the name of an existing file or directory
+          that is writeable, e.g.:
+
+  if not writeable \v(lockdir) echo Please read installation instructions!
+
+   IF FLAG command
+          This tests a user-settable condition, which can mean anything
+          you like. SET FLAG ON causes subsequent IF FLAG commands to
+          succeed; SET FLAG OFF causes them to fail. One way to use it
+          would be for debugging your scripts; precede any debugging
+          statements with IF FLAG. Then SET FLAG on to debug your script,
+          SET FLAG OFF to run it without debugging. Another common use is
+          for causing an inner loop to cause an outer loop to exit.
+
+   IF C-KERMIT command
+          C-Kermit, but not Kermit 95 or MS-DOS Kermit, executes the
+          command.
+
+   IF K-95 command
+          Kermit 95, but not C-Kermit or MS-DOS Kermit, executes the
+          command.
+
+   IF MS-KERMIT command
+          MS-DOS Kermit, but not C-Kermit or Kermit 95, executes the
+          command.
+     _________________________________________________________________
+
+  7.5. Using More than Ten Macro Arguments
+
+   The \v(argc) variable now gives the actual number of arguments, even
+   if the number is greater than 9:
+
+  C-Kermit> define xx echo \v(argc)
+  C-Kermit> xx a b c d e f g h i j k l m n o p q r s t u v w x y z
+  27
+
+   Remember that \v(argc) includes the name of the macro itself, so it is
+   always at least 1, and is always 1 greater than the actual number of
+   arguments. As in versions 6.0 and earlier, if more than 9 arguments
+   are given, only the first nine are assigned to the variables \%1..\%9.
+
+   The \&_[] array, discussed on page 353 of [585]Using C-Kermit, 2nd ed,
+   now holds all the arguments, up to some implementation-dependent limit
+   (64 or greater), rather than only the first 9. To illustrate: the
+   following macro tells the number of arguments it was called with and
+   then prints them:
+
+  define show_all_args {
+      local \%i
+      echo \&_[0] - Number of arguments: \feval(\v(argc)-1)
+      for \%i 1 \v(argc)-1 1 { echo \flpad(\%i,3). "\&_[\%i]" }
+  }
+
+   Within a macro \&_[0], like \%0, contains the name of the macro.
+
+   At top level, the \&_[] array is filled as follows:
+
+     * If the first argument on the C-Kermit command line was a filename,
+       or C-Kermit was invoked from a "Kerbang" script ([586]Section
+       7.19), element 0 contains the filename, and elements 1 through
+       \v(argc)-1 hold the remaining command-line arguments.
+     * Otherwise the program name goes in element 0, and elements 1
+       through \v(argc)-1 hold any arguments that were included after
+       "--" or "="
+
+   The new \%* variable, when used within a macro, is replaced by the
+   text that followed the macro name in the macro invocation. If no
+   arguments were given, \%* is replaced by the empty string. Examples:
+
+  C-Kermit> define xx echo [\%*]
+  C-Kermit> define \%a oofa
+  C-Kermit> xx
+  []
+  C-Kermit> xx \%a
+  [oofa]
+  C-Kermit> xx a
+  [a]
+  C-Kermit> xx a b
+  [a b]
+  C-Kermit> xx a b c
+  [a b c]
+  C-Kermit> xx a b c d e f g h i j k l m n o p q r s t u v w x y z
+  [a b c d e f g h i j k l m n o p q r s t u v w x y z]
+
+   Note that \%* can not be used at top level, since Kermit does not have
+   access to the raw command line (only to its elements separately, after
+   they have been processed by the shell and the C library).
+
+   C-Kermit 7.0 also adds a SHIFT command:
+
+   SHIFT [ number ]
+          Shifts the macro arguments (except argument 0) the given number
+          of places to the left and adjusts \v(argc) accordingly. The
+          default number is 1.
+
+   To illustrate, suppose macro XXX is invoked as follows:
+
+  xxx arg1 arg2 arg3
+
+   Then inside XXX, \%1 is "arg1", \%2 is "arg2", and \%3 is "arg3".
+   After a SHIFT command is given inside XXX, then \%1 is "arg2", \%2 is
+   "arg3", and \%3 is empty. \%0 (the name of the macro) remains
+   unchanged.
+
+   If more than 9 arguments were given, then arguments are shifted into
+   the \%1..9 variables from the argument vector array.
+
+   At top level, the SHIFT command operates on the \&_[] array and \%1..9
+   variables; the \&@[] array is not affected. See [587]Section 7.16 for
+   details.
+
+   The \%* variable is not affected by the SHIFT command.
+     _________________________________________________________________
+
+  7.6. Clarification of Function Call Syntax
+
+   Spaces are normally stripped from the front and back of each function
+   argument; to prevent this enclose the argument in braces:
+
+  \fsplit(\%a,&a,{ })
+
+   However, function calls that contain spaces can make trouble when the
+   function is to be used in a "word" field, since space separates words.
+   For example:
+
+  for \%i 1 \fsplit(\%a,&a,{ }) 1 {
+    echo \%i. "\&a[\%i]"
+  }
+
+   In most cases, the trouble can be averted by enclosing the function
+   reference in braces:
+
+  for \%i 1 {\fsplit(\%a,&a,{ })} 1 {
+    echo \%i. "\&a[\%i]"
+  }
+
+   or by replacing spaces with \32 (the ASCII code for space):
+
+  for \%i 1 \fsplit(\%a,&a,\32) 1 {
+    echo \%i. "\&a[\%i]"
+  }
+
+   Braces are also used in function calls to indicate grouping. For
+   example:
+
+  \fsubstring(abcd,2,2) = "bc"
+
+   But suppose "abcd" needed to contain a comma:
+
+  \fsubstring(ab,cd,2,2)
+
+   This would cause an error, since "cd" appears to be the second
+   argument, when really you want the first "2" to be the second
+   argument. Braces to the rescue:
+
+  \fsubstring({ab,cd},2,2) = "b,"
+
+   Similarly, leading and trailing spaces are stripped from each
+   argument, so:
+
+  \fsubstring( abcd ,2,2) = "bc"
+
+   but braces preserve them:
+
+  \fsubstring({ abcd },2,2) = "ab"
+
+   Given these special uses for braces, there is no way to pass literal
+   braces to the function itself. For example:
+
+  \fsubstring(ab{cd,2,2)
+
+   causes an error.
+
+   So if you need a function to include braces, define a variable
+   containing the string that has braces. Example:
+
+  define \%a ab{cd
+  \fsubstring(\%a,2,2) = "b{"
+
+   If the string is to start with a leading brace and end with a closing
+   brace, then double braces must appear around the string (which itself
+   is enclosed in braces):
+
+  define \%a {{{foo}}}
+  \fsubstring(\%a) = "{foo}"
+
+   This also works for any other kind of string:
+
+  define \%a {{ab{cd}}
+  echo \fsubstring(\%a) = "ab{cd"
+     _________________________________________________________________
+
+  7.7. Autodownload during INPUT Command Execution
+
+   As of 6.1 / 1.1.12, C-Kermit can be told to look for incoming Kermit
+   (or Zmodem) packets during execution of an INPUT command. By default
+   (for consistency with earlier releases), this is not done. You can
+   enable this feature with:
+
+  SET INPUT AUTODOWNLOAD ON
+
+   (and disable it again with OFF.)
+
+   One possible use for this feature is as a server mode with a time
+   limit:
+
+  INPUT 3600 secret-string-to-end-the-INPUT-command
+
+   In this example, any GET, SEND, or REMOTE commands received within one
+   hour (3600 seconds) of when the INPUT command was issued will be
+   executed. Here's another example, in which we want to stay open until
+   11:30pm, or until interrupted by seven consecutive Ctrl-C (\3)
+   characters:
+
+  INPUT 23:30:00 \3\3\3\3\3\3\3
+
+   The INPUT AUTODOWNLOAD setting is displayed by SHOW SCRIPTS or SHOW
+   INPUT.
+     _________________________________________________________________
+
+  7.8. Built-in Help for Functions.
+
+   Beginning in C-Kermit 7.0, you may obtain a description of the calling
+   conventions and return values of any built-in function, such as
+   \fsubstring(), with the new HELP FUNCTION command; give the function's
+   name without the leading "\f", e.g. "help func substring". You can use
+   ?, completion, and abbreviation in the normal manner.
+     _________________________________________________________________
+
+  7.9. Variable Assignments
+
+    7.9.1. Assignment Operators
+
+   Programmers accustomed to languages such as C or Fortran might find
+   Kermit's method of assigning values to variables unnatural or awkward.
+   Beginning in C-Kermit 7.0, you can use the following alternative
+   notation:
+
+ .name = value    is equivalent to   DEFINE name value
+ .name := value   is equivalent to   ASSIGN name value
+ .name ::= value  is equivalent to   ASSIGN name \feval(value)
+
+   When the command begins with a period (.), this indicates an
+   assignment. The name can be a macro name, a \%{digit,letter} variable,
+   or an array element. There can be space(s) between "." and the name.
+   Examples:
+
+  .\%a = This is a string  ; Same as "define \%a This is a string"
+  echo \%a
+  This is a string
+
+  .xxx = \%a               ; Same as "define xxx \%a"
+  echo \m(xxx)
+  \%a
+
+  .xxx := \%a              ; Same as "assign xxx \%a"
+  echo \m(xxx)
+  This is a string
+
+  declare \&a[2]           ; Use with arrays...
+  define \%i 2
+  .\&a[1] = first
+  .\&a[\%i] = second
+
+   The following sequence illustrates the differences among three levels
+   of evaluation:
+
+  .\%x = 2          ; Define a variable to have a numeric value
+  .\%y = (3 + \%x)  ; Define another variable as an arithmetic expression
+
+  .xxx = 4 * \%y    ; "=" simply copies the right-hand side.
+  echo \m(xxx)
+  4 * \%y
+
+  .xxx := 4 * \%y   ; ":=" evaluates the variables first, then copies.
+  echo \m(xxx)
+  4 * (3 + 2)
+
+  .xxx ::= 4 * \%y  ; "::=" evaluates the expression, then copies.
+  echo \m(xxx)
+  20
+
+   You can also use this syntax to clear (undefine) a variable:
+
+  .\%a = oofa       ; Define the variable
+  echo "\%a"
+  "oofa"
+  .\%a              ; Clear the variable
+  echo "\%a"
+  ""
+
+   Extra credit: Can you guess what happens below when the file "abc"
+   does not exist?
+
+  fopen /read \%c abc
+  if fail ...
+     _________________________________________________________________
+
+    7.9.2. New Assignment Commands
+
+   Recall the DEFINE and ASSIGN commands, and their hidden counterparts,
+   _DEFINE and _ASSIGN. The former take the variable name literally, the
+   latter evaluate the variable-name field to form the variable name
+   dynamically. Examples:
+
+  DEFINE \%x foo    ; Sets the value of the variable \%x to "foo".
+  DEFINE \%a \%x    ; Sets the value of the variable \%a to "\%x".
+  _DEFINE x_\%a \%x ; Sets the value of the variable x_foo to "\%x".
+  ASSIGN \%a \%x    ; Sets the value of the variable \%a to the "foo".
+  _ASSIGN x_\%a \%x ; Sets the value of the variable x_foo to "foo".
+
+   This concept has been carried over to the remaining
+   variable-assignment commands: EVALUATE, INCREMENT, and DECREMENT:
+
+   EVALUATE variablename expression
+          Evaluates the arithmetic expression and assigns its value to
+          the variable whose name is given. Example: "eval \%a 1+1"
+          assigns "2" to \%a.
+
+   _EVALUATE metaname expression
+          Evaluates the arithmetic expression and assigns its value to
+          the variable whose name is computed from the given metaname.
+          Example: "eval foo<\%a>::\%1 \%2 * (\%3 + \%4)" assigns the
+          value of "\%2 * (\%3 + \%4)" to the variable whose name is
+          computed from "foo<\%a>::\%1".
+
+   INCREMENT variablename [ expression ]
+          Evaluates the arithmetic expression and adds its value to the
+          value of the variable whose name is given. Example: "increment
+          \%a".
+
+   _INCREMENT metaname [ expression ]
+          Evaluates the arithmetic expression and adds its value to the
+          value of the variable whose name is computed from the given
+          metaname. Example: "_increment Words::\%1.count[\%2]".
+
+   DECREMENT variablename [ expression ]
+          Evaluates the arithmetic expression and subtracts its value
+          from the value of the variable whose name is given.
+
+   _DECREMENT metaname [ expression ]
+          Evaluates the arithmetic expression and subtracts its value
+          from the value of the variable whose name is computed from the
+          given metaname.
+
+   WARNING: The syntax of the EVALUATE command has changed since C-Kermit
+   6.0 and K95 1.1.17. Previously, it did not include a variable name,
+   only an expression. To restore the old behavior, use SET EVALUATE OLD.
+   To return to the new behavior after restoring the old behavior, use
+   SET EVALUATE NEW.
+
+   NOTE: There are no analogs to the "_" commands for the operators
+   described in [588]Section 7.9.1; those operators can not be used to
+   assign values to variables whose names must be computed.
+     _________________________________________________________________
+
+  7.10. Arrays
+
+   C-Kermit 7.0 adds lots of new array-related features, and groups them
+   together under the NEW ARRAY command:
+
+   ARRAY { CLEAR, COPY, DECLARE, DESTROY, RESIZE, SHOW, SORT }
+
+   In each of the ARRAY commands, wherever an array name is expected,
+   "short forms" may be used. For example, all of the following are
+   acceptable:
+
+  array show \&a[]  (or SHOW ARRAY...)
+  array show &a[]
+  array show a[]
+  array show &a
+  array show a
+
+   In addition, ranges are accepted in the ARRAY COPY, ARRAY CLEAR, ARRAY
+   SET, ARRAY SHOW, and ARRAY SORT commands:
+
+  array clear \&a[16]     ; Clears 16 thru end
+  array clear &a[16]      ; Ditto
+  array clear a[16]       ; Ditto
+
+  array clear \&a[16:32]  ; Clears 16 thru 32
+  array clear &a[16:32]   ; Ditto
+  array clear a[16:32]    ; Ditto
+
+   When using array names as function arguments, you must omit the "\"
+   and you must include the "&". You may optionally include empty
+   brackets. Examples:
+
+  \fsplit(\%a,a)          ; Bad
+  \fsplit(\%a,\&a)        ; Bad
+  \fsplit(\%a,&a[3])      ; Bad
+
+  \fsplit(\%a,&a)         ; Good
+  \fsplit(\%a,&a[])       ; Good
+     _________________________________________________________________
+
+    7.10.1. Array Initializers
+
+   Beginning in C-Kermit 7.0, you may initialize an array -- in whole or
+   in part -- in its declaration:
+
+   [ ARRAY ] DECLARE array-name[size] [ = ] [ value1 [ value2 [...] ] ]
+
+   For compatibility with versions 5A and 6.0, the ARRAY keyword is
+   optional. DECLARE can also be spelled DCL.
+
+   Initializers are (a) optional, (b) start with element 1, (c) must be
+   enclosed in braces if they contain spaces, and (d) are evaluated
+   according to normal rules by the DECLARE command prior to assignment.
+   Thus the assignments made here are the same as those made by the
+   ASSIGN command. This allows you to initialize array elements from the
+   values of other variables. If you actually want to initialize an array
+   element to variable's name, as opposed to its value, use double
+   backslashes (as in "\\&a", "\\v(time)", etc).
+
+   The size (dimension) of the array is optional. If the size is omitted,
+   as in "\&a[]", then the array sizes itself to the number of
+   initializers; if there are no initializers the array is not declared
+   or, if it was declared previously, it is destroyed. If a size is
+   given, any extra elements in the initialization list are discarded and
+   ignored.
+
+   NOTE: Unlike in C, the list of initializers is NOT enclosed in braces.
+   Instead, braces are used to group multiple words together. So:
+
+  ARRAY DECLARE \&a[] = { one two three }
+
+   would create an array with two elements (0 and 1), with element 1
+   having the value " one two three ".
+
+   Examples:
+
+   ARRAY DECLARE \&a[16]
+          Declares the array \&a with 17 elements (0 through 16), in
+          which all elements are initially empty. If the array \&a[]
+          existed before, the earlier copy is destroyed.
+
+   ARRAY DECLARE &a[16]
+   ARRAY DECLARE a[16]
+   ARRAY DCL \&a[16]
+   ARRAY DCL &a[16]
+   ARRAY DCL a[16]
+   DECLARE \&a[16]
+   DECLARE &a[16]
+   DECLARE a[16]
+   DCL \&a[16]
+   DCL &a[16]
+   DCL a[16]
+          All of the above are the same as the first example.
+
+   ARRAY DECLARE \&a[16] = alpha beta {gamma delta}
+          Declares the array \&a with 17 elements (0 through 16),
+          initializing \&a[1] to "alpha", \&a[2] to "beta", and \&a[3] to
+          "gamma delta". The remaining elements are empty.
+
+   ARRAY DECLARE \&a[] = alpha beta {gamma delta}
+          Same as the previous example, but the array is automatically
+          dimensioned to 3.
+
+   ARRAY DECLARE \&a[3] = alpha beta {gamma delta} epsilon zeta
+          Too many initializers; only the first three are kept.
+
+   ARRAY DECLARE \&a[0]
+   ARRAY DECLARE \&a[]
+   ARRAY DECLARE &a[]
+   ARRAY DECLARE &a
+   ARRAY DECLARE a
+   DECLARE \&[0]
+   DECLARE a
+   DCL a
+          All of these are equivalent. Each destroys \&a[] if it exists.
+          Declaring an array with a dimension of 0 is the same as ARRAY
+          DESTROY arrayname.
+
+   ARRAY DECLARE \&a[] = \%1 \%2 \%3
+          Declares the array \&a with 3 elements (0 through 3),
+          initializing \&a[1] to the value of \%1, \&a[2] to the value of
+          \%2, and \&a[3] to the value of \%3. In this case, any
+          reference to one of these array elements is replaced by the
+          value of the corresponding \%n variable at the time the
+          declaration was executed (immediate evaluation; the array
+          element's value does not change if the initializer variable's
+          value changes).
+
+   ARRAY DECLARE \&a[] = \\%1 \\%2 \\%3
+          Declares the array \&a with 3 elements (0 through 3),
+          initializing \&a[1] to the string "\%1", \&a[2] to "\%2", and
+          \&a[3] to "\%3". In this case any reference to one of these
+          array elements is replaced by the CURRENT value of the
+          corresponding \%n variable (deferred evaluation -- the array
+          element's value follows the value of the initializer variable).
+
+   The equal sign (=) preceding the initializer list is optional, but is
+   recommended for clarity. If you need to initialize element 1 to a
+   literal equal sign, use two of them, separated by a space, as in this
+   example:
+
+  ARRAY DECLARE \&a[] = = + - * /
+
+   Remember, element 0 is not initialized by the DECLARE command. To
+   initialize element 0, use a regular DEFINE or ASSIGN command:
+
+  ARRAY DECLARE \&a[] one two three four five six seven eight nine
+  DEFINE \&a[0] zero
+
+   Finally, remember that every command level has its own local array,
+   \&_[], containing all the macro arguments (\%0, \%1, ...) for that
+   level. See [589]Section 7.5 for details.
+     _________________________________________________________________
+
+    7.10.2. Turning a String into an Array of Words
+
+   The \fsplit(s1,&a,s2,s3) function assigns the words of string s1 to
+   successive elements of the array (beginning with element 1) whose
+   identifying letter, a-z, is given after the "&" in the second
+   argument, using break and include characters given in s2 and s3. See
+   [590]Section 7.3 for details.
+     _________________________________________________________________
+
+    7.10.3. Arrays of Filenames
+
+   See [591]Section 4.11.3 for news about how \ffiles() and related
+   functions can assign a list of filenames to an array. To recapitulate
+   briefly here:
+
+  \ffiles(*,&a)
+
+   assigns all files that match the first argument to the array denoted
+   by the second argument. If the array has not been declared, it is
+   declared automatically, with exactly the number of elements needed to
+   hold the file list; if it was previously declared, it is destroyed and
+   reused. The filenames are assigned starting at array element 1.
+   Element 0 holds the number of files in the list.
+
+   The DIRECTORY command ([592]Section 4.5.1) can also create filename
+   arrays if you give it the /ARRAY: switch; this allows selection
+   criteria beyond whether the filename matches the given pattern.
+
+   All functions and commands that create filename arrays store the
+   number of filenames, n, as element 0 of the array, and the filenames
+   as elements 1 through n.
+     _________________________________________________________________
+
+    7.10.4. Automatic Arrays
+
+   In a command file or macro, you can now have local (automatic) arrays.
+   Just give the name followed by empty subscript brackets (no spaces
+   inside the brackets please) in a LOCAL command, and then declare the
+   array:
+
+  LOCAL \%a \&a[] oofa
+  ARRAY DECLARE \&a[32] = value1 value2 value3 ...
+
+   This declares the scalar variable \%a, the array \&a[], and the macro
+   name "oofa" to be local, and then declares the new local copy of \&a[]
+   with 32 elements, perhaps assigning some initial values. When C-Kermit
+   exits from the command file or macro containing these command, the
+   previous \&a[] array is restored (and if there was no \&a[] at any
+   higher level, this will still be true). The process can be repeated to
+   any level. Thus it is now safe to write scripts or macros containing
+   arrays without danger of interfering with global arrays of the same
+   name.
+
+   Just as scalars are inherited by lower command levels, so are arrays.
+   So, for example, if \&a[] is declared at top level, all lower levels
+   will see it unless they include a "local \&a[]" statement, in which
+   case all levels at and beneath the level where the LOCAL statement was
+   executed will see the local copy. This too can be repeated to any
+   level.
+
+   On the other hand, if you DECLARE an array at a lower command level
+   without also making it LOCAL, this replaces the copy that was declared
+   at the lowest command level above this one.
+     _________________________________________________________________
+
+    7.10.5. Sorting Arrays
+
+   Although arrays can be sorted using FOR loops as shown on page 383 of
+   Using C-Kermit, 2nd Ed., this involves quite a bit of repetitive
+   interpretation by the command parser, and so can be slow for large
+   arrays. For this reason, C-Kermit 7.0 adds a built-in SORT command:
+
+   ARRAY SORT [ switches ] array [ array2 ]
+          Sorts the given array in place. Sorting is strictly lexical
+          (string based). The array name can be given fully, e.g.
+          "\&a[]", or the "\" and/or "&" and/or brackets can be omitted,
+          e.g. "array sort \&a[]", "sort &a", "sort a". Also, a range can
+          be indicated in the brackets as noted in [593]Section 7.10, to
+          restrict the sort to a range of elements (equivalent to the
+          /RANGE switch, described just below), e.g. "array sort
+          &a[20:30]".
+
+   A second array may be specified. If it is, and if it is at least as
+   big as the first array, it is sorted according to the first array. For
+   a sample application, see [594]Section 7.10.10.
+
+   See [595]Section 1.5 for an explanation of switches. The optional
+   switches are:
+
+   /CASE:{ON,OFF}
+          /CASE:ON means that alphabetic case is significant in
+          comparisons; uppercase letters are sorted before lowercase
+          ones. /CASE:OFF means case is ignored, e.g. "A" is the same as
+          "a". If this switch is not given, sorting is according the
+          current SET CASE setting.
+
+   /KEY:n
+          Comparison begins at position n(1-based) in each string. If no
+          key is given, the entire strings are compared. Only one key can
+          be given. If an array element is shorter than the key value, n,
+          that element is considered empty for comparison purposes, and
+          therefore lexically less than any element at least ncharacters
+          long.
+
+   /NUMERIC
+          If this switch is included, it means sorting should be numeric,
+          rather than lexical. The sort key is the string starting at the
+          key position, skipping any leading blanks or tabs, and then as
+          much of the string from that point on that fits the definition
+          of "numeric", terminating at the first character that does not
+          qualify. A numeric string has an optional sign (+ or -)
+          followed by one or more digits, and (if your version of Kermit
+          was built with floating-point support; see [596]Section 7.23 )
+          zero or one decimal point (period). If both /CASE and /NUMERIC
+          are given, /NUMERIC takes precedence.
+
+   /RANGE:n[:m]
+          Sort elements nthrough m of the array. By default, the entire
+          array from element 1 to its dimensioned size is sorted, which
+          might produce surprising results if the array is not full; see
+          example in [597]Section 7.10.7. If ":m" is omitted from the
+          range, the dimensioned size is used. Thus, to sort an entire
+          array, \&a[], including its 0th element, use "sort /range:0
+          &a". You can also sort any desired section of an array, e.g.
+          "sort /range:10:20 &a" or "sort /range:\%i:\%j-1 &b". As noted
+          above, you can also specify a range in the array-name brackets.
+          If you specify a range in the array-name brackets AND with a
+          /RANGE switch, the ones in the brackets take precedence.
+
+   /REVERSE
+          Sort in reverse order. If this switch is not given, the array
+          is sorted in ascending order.
+
+   Remember that numeric switch arguments can be numbers, arithmetic
+   expressions, or variables whose values are numbers or expressions, as
+   illustrated in the /RANGE examples above.
+
+   A typical sorting application might be to list students' test scores
+   in descending order. Suppose you had the following records:
+
+  olaf      65
+  olga      98
+  ivan      83
+  xena     100
+
+   (and so on) stored in array \&s[] (e.g. by reading them from a file as
+   illustrated in [598]section 7.10.7). In these records, the student's
+   name is in columns 1-9 and the score in 10-12. So to rearrange the
+   list in descending order of score:
+
+  sort /key:10 /reverse &s
+
+   Then to list your top five students:
+
+  for \%i 1 5 1 { echo \&s[\%i] }
+
+   Or more simply (see next section):
+
+  show array a[1:5]
+
+   To illustrate the difference between a lexical and a numeric sort,
+   suppose you have the following records (the lines that are numbered,
+   starting at column 1) in array \&a[]:
+
+    Column   1         2
+    12345678901234567890
+
+   1. Ivan 10.0 2. Olaf 9.95 3. Olga 101.5
+
+   ARRAY SORT /KEY:10 &a[] would order them 3,1,2, but ARRAY SORT /KEY:10
+   /NUMERIC &a[] would order them 2,1,3.
+     _________________________________________________________________
+
+    7.10.6. Displaying Arrays
+
+   The SHOW ARRAY command (or ARRAY SHOW) now accepts an optional
+   array-name argument:
+
+  SHOW ARRAY \&a[]
+
+   (you can leave off the \, the \&, and/or the []'s if you like; "show
+   array a" is equivalent to "show array \&a[]"). When an array is
+   specified, its dimension is shown and all defined (non-empty) elements
+   are listed.
+
+   Example:
+
+  assign \%n \ffiles(*,&a)  ; Fill an array with filenames ([599]Section 4.11.3
+)
+  show array \&a[]          ; Show the array we just read
+  array show \&a[]          ; Same as previous
+  array sort \&a[]          ; Sort the array
+  array show \&a[]          ; Show it after sorting
+  array show \&a            ; Show it again
+  array show &a             ; Show it again
+  array show a              ; Show it again
+
+   (The final four commands demonstrate the alternative forms that are
+   accepted for the array name.)
+
+   If you SHOW ARRAY without giving an array name, all defined arrays are
+   listed by name and dimension, but their contents are not shown.
+
+   You can also show a piece of an array by including a subscript or
+   range within the array brackets:
+
+  array show \&a[5]         ; Shows \&a[5]
+  array show &a[3:8]        ; Shows \&a[3] through \&a[8]
+  array show a[:\%n-1]      ; Shows \&a[0] through \&a[\%n-1]
+     _________________________________________________________________
+
+    7.10.7. Other Array Operations
+
+   ARRAY DESTROY arrayname
+          Destroys and undeclares the named array. Subscripts or ranges
+          are not accepted in this command.
+
+   ARRAY COPY array1 array2
+          Copies the first array to the second array. If the target array
+          has not been declared, it is created automatically with the
+          same size as the first. If it has been declared, it will be
+          used as declared; if the source array is larger, only as much
+          of it as will fit is copied to the target array. Syntax for
+          array1 and array2 is as in ARRAY SHOW (SHOW ARRAY). Example:
+
+  .\%n := \ffiles(*,&a)  ; Create and load array A with a file list.
+  array copy &a &b       ; Copy array A to array B.
+
+          The ARRAY COPY command also lets you copy pieces of arrays by
+          including range specifiers, as in these examples:
+
+        ARRAY COPY \&a[4:27] \&b
+                This copies \&a[] elements 4-27 to \&b[] elements 1-23,
+                creating \&b[] if necessary or, if \&b[] is already
+                declared, stopping early if its size is less than 23.
+
+        ARRAY COPY \&a[4:27] \&b[12]
+                This copies \&a[] elements 4-27 to \&b[] elements 12-35,
+                creating \&b[] if necessary or, if \&b[] is already
+                declared, stopping early if its size is less than 35.
+
+        ARRAY COPY \&a[4:27] \&b[12:14]
+                This copies \&a[] elements 4-6 to \&b[] elements 12-14,
+                creating \&b[] if necessary or, if \&b[] is already
+                declared, stopping early if its size is less than 14.
+
+        ARRAY COPY \&a[17] \&b
+                This copies all the elements of \&a[] starting with 17
+                until the last to \&b[], creating \&b[] if necessary or,
+                if \&b[] is already declared, stopping early if \&b[] is
+                not big enough.
+
+   ARRAY CLEAR arrayname
+          Sets all the elements of the array to the empty value. You may
+          also include a range specifier to clear only a selected portion
+          of the array; for example "array clear \&a[37:214]". If the
+          range is out of bounds, only the part of the array that is in
+          bounds is cleared.
+
+   ARRAY SET arrayname [ value ]
+          Sets all the elements of the array to the given value. If no
+          value is given, the array is cleared. You may also include a
+          range specifier to set only a selected portion of the array;
+          for example "array set \&a[1:9] -1". If the range is out of
+          bounds, only the part of the array that is in bounds is set.
+
+   ARRAY RESIZE arrayname size
+          Resizes the given array. If the size is greater than the
+          array's current dimension, new empty elements are added to the
+          end. If the size is less than the current dimension, the extra
+          elements are discarded. Note: If you have stored the array size
+          in element 0, ARRAY RESIZE does not change this value.
+          Alternative notation: ARRAY RESIZE arrayname[size]. For a
+          practical example, see [600]Section 7.10.11.
+
+   \farraylook(pattern,arrayname)
+          This function returns the index of the first element of the
+          given array that matches the given pattern (for details about
+          pattern syntax, see [601]section 4.9). The array name can
+          include a range specification to restrict the search to a given
+          segment of the array. If no elements match the pattern, -1 is
+          returned.
+
+   \ftablelook(keyword,arrayname[,delimiter])
+          Looks in the given "table", which must be sorted, for the given
+          keyword. The keyword need not be spelled out in full.
+          Pattern-matching characters should not be included as part of
+          the keyword. The function returns the index of the table
+          element that uniquely matches the given keyword, or -1 if none
+          match, or -2 if more than 1 match.
+
+   A "table" is an array that is sorted in lexical order; each of its
+   elements may contain multiple fields, delimited by the given delimiter
+   character or, if no delimiter is specified, a colon (:).
+
+   The \farraylook() function does exactly what you tell it. If you give
+   it a pattern that does not include wildcard characters (such as *, ?,
+   etc), it requires an exact match. For example:
+
+  \farraylook(oofa,&a)
+
+   searches for the first element of \&a[] whose value is "oofa". But:
+
+  \farraylook(oofa*,&a)
+
+   finds the first element whose value starts with "oofa", and;
+
+  \farraylook(*oofa,&a)
+
+   finds the first element whose value ends with "oofa", and;
+
+  \farraylook(*oofa*,&a)
+
+   finds the first element whose value contains "oofa".
+
+   Here's a simple demonstration of looking up patterns in arrays:
+
+  local \&a[] \%x \%n
+  declare \&a[] = zero one two three four five six seven eight nine ten
+  while true {
+      .\%x = 1
+      .\%n = 0
+      ask \%a { Pattern? }
+      if not def \%a exit 0 Done.
+      while <= \%x \fdim(&a) {
+          .\%x := \farraylook(\%a,&a[\%x])
+          if ( < \%x 0 ) break
+          echo \flpad(\%x,3). \&a[\%x]
+          increment \%x
+          increment \%n
+      }
+      if ( < \%n 1 ) echo Pattern not found - "\%a"
+  }
+
+   The array need not be sorted. When a pattern is given, a search is
+   performed; if there is a match, the matching element's index and the
+   element itself are printed, and the search begins again at the next
+   element. Thus each matching element is printed. If none match, the
+   "Pattern not found" message is printed. The process repeats for as
+   many patterns as the user wants to type, and terminates when the user
+   types an empty pattern.
+
+   Now let's build a little command parser, consisting of a keyword
+   table, and a loop to look up the user's commands in it with
+   \ftablelook(). In this case the array elements have "fields" separated
+   by colon (:) -- a keyword and a value. Keyword tables must be sorted
+   if \tablelook() is to work right, so after declaring and initializing
+   the table array, we sort it.
+
+  local \&k[] \%a \%i \%n
+
+  array declare \&k[] = drive:9 do:8 discuss:7 live:6 spend:5 help:4 quit:0
+
+  array sort &k                             ; Make sure array is sorted
+  echo Type "help" for help.                ; Print greeting & instructions
+
+  while true {                              ; Loop to get commands
+      undefine \%a
+      while not defined \%a {               ; Get a command
+          ask \%a { Command? }
+      }
+      .\%n := \ftablelook(\%a,&k)           ; Look up the command
+      switch \%n {                          ; Handle errors
+        :-1, echo Not found - "\%a"         ; Doesn't match
+             continue
+        :-2, echo Ambiguous - "\%a"         ; Matches too many
+             continue
+      }
+      switch \fword(\&k[\%n],2) {           ; Dispatch according to value
+         :9, echo Driving..., break
+         :8, echo Doing..., break
+         :7, echo Discussing..., break
+         :6, echo Living..., break
+         :5, echo Spending..., break
+         :4, echo { Commands (may be abbreviated):}
+             for \%i 1 \fdim(&k) 1 {
+                echo {  \%i. \fword(\&k[\%i],1) }
+             }
+             break
+         :0, exit 0 Bye!
+         :default, stop 1 Internal error
+      }
+  }
+
+   In this example, keywords are "drive", "do", "discuss", etc, and their
+   values are unique numbers (values need not be numbers, and there need
+   not be only one value -- there can be 0, 1, 2, or more of them). The
+   user types a command, which can be the whole word (like "help") or any
+   abbreviation (like "hel", "he", or just "h"). If this does not match
+   any keywords, \ftablelook() returns -1; if it matches more than one
+   (as would "d"), it returns -2. Otherwise the array index is returned,
+   1 or higher.
+
+   Given the array index \%n, we can get the table values as follows:
+
+  \fword(\&k[\%n],1) is the keyword (first field)
+  \fword(\&k[\%n],2) is the value (second field, in this case a number)
+
+   In our example, we use the value (number) as the SWITCH variable. As
+   noted, \fablelook() expects the array elements to contain multiple
+   fields separated by colon (:) (or other character that you specify,
+   e.g. \ftablelook(\%a,&a,^)) and when matching the keyword, ignores the
+   first delimiter and everything after it.
+     _________________________________________________________________
+
+    7.10.8. Hints for Using Arrays
+
+   C programmers are accustomed to out-of-bounds array references causing
+   core dumps or worse. In C-Kermit:
+
+     * A reference to an an out-of-bounds array element returns the empty
+       string.
+     * An attempt to set the value of an array element that is out of
+       bounds or that has not been declared simply fails.
+
+   C programmers expect an array of size nto have elements 0 through n-1.
+   Fortran programmers expect the same array to have elements 1 through
+   n. C-Kermit accommodates both styles; when you declare an array of
+   size n, it has n=1 elements, 0 through n, and you can use the array in
+   your accustomed manner, 0-based or 1-based.
+
+   However, note that C-Kermit has certain biases towards 1-based arrays:
+
+     * Assignment of file lists starts with element 1 ([602]Section
+       7.10.3).
+     * Assignment by \fsplit() starts with element 1 ([603]Section 7.3).
+     * Array initialization skips the 0th element. To initialize a
+       0-based array, use something like this:
+  declare \&a[3] = one two three
+  .\&a[0] = zero
+     * The ARRAY SORT command skips the 0th element unless you include
+       /RANGE:0
+     * The SHIFT command ignores element 0 of the \&_[] array.
+
+   The distinction between an array's dimensioned size and the number of
+   elements in the array is important when sorting. To illustrate:
+
+  declare \&a[100]                  ; Declare array &a with 100 elements
+  fopen /read \%c oofa.txt          ; Open a file
+  if fail...
+  for \%i 1 \fdim(&a) 1 {           ; Read the file into the array
+      fread \%c \&a[\%i]
+      if fail break
+  }
+  fclose \%c
+  if > \%i \fdim(&a) end 1 File has too many lines for array.
+  .\%n ::= \%i - 1
+  echo File has \%n line(s).
+
+   Let's say the file had 95 lines. This leaves elements 96-100 of the
+   array empty. Now suppose you sort the array and write out the result:
+
+  sort &a                           ; Sort the whole array
+  fopen /write \%o oofa.txt.sorted  ; Open an output file
+  if fail ...
+  for \%i 1 \%n 1 {                 ; Write out 95 records
+      fwrite /line \%o \&a[\%i]
+      if fail end 1 Write error
+  }
+  close write
+
+   You might be surprised at the contents of "oofa.txt.sorted" -- five
+   empty elements, 96-100, floated to the top of the array in the sort,
+   and since your write loop only had 95 iterations, the final 5 lines of
+   the sorted file are lost.
+
+   Therefore, when dealing with partially filled arrays -- especially
+   when sorting them -- remember to specify the number of elements. A
+   handy way of recording an array's "true" size is to put it in the 0th
+   element. That way, it "travels with the array". To illustrate
+   (continuing the previous example at the "close read" statement):
+
+  close read
+  if > \%i \fdim(&a) end 1 File has too many lines for array.
+  .\&a[0] ::= \%i - 1     ; Assign number of lines to \&a[0].
+  echo File has \&a[0] line(s).
+  sort /range:1:\&a[0] &a
+  open write oofa.txt.sorted
+  if fail ...
+  for \%i 1 \&a[0] 1 {
+      writeln file \&a[\%j]
+      if fail end 1 Write error
+  }
+  close write
+
+   Note the SORT switch, /RANGE:1:\&a[0]. This keeps the sort 1-based,
+   and uses element 0 of the array as its size indicator.
+
+   Finally, note that even though some commands or functions might put a
+   size in array element 0, no built-in functions or commands depend on a
+   size actually being there. Thus you are perfectly free to replace the
+   size with something else and treat the array as 0-based.
+     _________________________________________________________________
+
+    7.10.9. Do-It-Yourself Arrays
+
+   Kermit's \&x[] arrays are nice because of the accompanying built-in
+   functionality -- ARRAY commands, built-in functions that load and
+   search arrays, automatic evaluation of arithmetic expressions within
+   the subscript brackets, and so on. Yet they also have certain
+   limitations:
+
+    1. Except when created by dynamic loading (e.g. by \ffiles()) they
+       must be declared and dimensioned in advance.
+    2. Indices must be numeric, positive, and in range.
+    3. There can be only one dimension. Matrices or other
+       higher-dimensioned arrays are not available.
+
+   But none of this is to say you can't invent any kind of data structure
+   you like. In [604]Section 7.9.2 you can see some examples. Here's
+   another (courtesy of Dat Thuc Nguyen), in which a pair of matrices is
+   created and then added: no dimensioning necessary.
+
+  .row = 4
+  .col = 9
+
+  ; MACRO TO PRINT A MATRIX
+  define PMATRIX {
+      echo Matrix \%1:
+      for \%r 1 \m(row) 1 {
+          for \%c 1 \m(col) 1 {
+              xecho \flpad(\m(\%1[\%r][\%c]),4)
+          }
+          echo
+      }
+      echo
+  }
+  ; CREATE MATRICES A AND B
+  for \%r 1 \m(row) 1 {
+      for \%c 1 \m(col) 1 {
+          _eval A[\%r][\%c] \%r + \%c
+          _eval B[\%r][\%c] \%r * \%c
+      }
+  }
+  ; CREATE MATRIX C = SUM OF MATRIX A AND MATRIX B
+  for \%r 1 \m(row) 1 {
+      for \%c 1 \m(col) 1 {
+          _eval C[\%r][\%c] \m(A[\%r][\%c]) + \m(B[\%r][\%c])
+      }
+  }
+  pmatrix A  ; Print Matrix A
+  pmatrix B  ; Print Matrix B
+  pmatrix C  ; Print Matrix C
+
+   In the example, we use matrix-like notation to create macros with
+   names like "A[1][1]", "B[3][7]", and so on.
+     _________________________________________________________________
+
+    7.10.10. Associative Arrays
+
+   An associative array is a special kind of Do-It-Yourself array. It
+   differs from a regular array in that its indices need not be numbers
+   -- they can be anything at all -- words, filenames, names of months,
+   any character string at all, and that it doesn't have to be (and in
+   fact can't be) declared. An associative array element is simply a
+   macro whose name ends with an index enclosed in angle brackets, for
+   example:
+
+  file<oofa.txt>
+
+   More formally:
+
+  basename<index>
+
+   An associative array is a collection of all associative array elements
+   that have the same basename. Any number of associative arrays, each
+   with any number of elements, can exist at the same time.
+
+   An associative array element can be assigned a value, such as "1",
+   just like any other macro:
+
+  define file<oofa.txt> 1     ; Give "file<oofa.txt>" the value "1".
+
+   or:
+
+  assign file<oofa.txt> \%a   ; Give it the value of the variable \%a.
+
+   However, since an associative array element is a macro, it may not
+   have an empty (null) value, since assigning an empty value to a macro
+   undefines the macro.
+
+   You can refer to the value of an associative array element using the
+   familiar notation for macro values:
+
+  echo \m(file<oofa.txt>)     ; Echo the value of "file<oofa.txt>".
+
+   Associative arrays are most useful, however, when the value of the
+   index is a variable. In that case, you must use the "hidden" forms of
+   the DEFINE or ASSIGN commands that evaluate the macro name before
+   making the assignment (see [605]Using C-Kermit, page 457). Example:
+
+  define \%f oofa.txt
+  _define file<\%f> 1
+  echo file<\%f> = \m(file<\%f>)
+
+   prints:
+
+  file<oofa.txt> = 1
+
+   and then:
+
+  _increment file<\%f>
+  echo file<\%f> = \m(file<\%f>)
+
+   prints:
+
+  file<oofa.txt> = 2
+
+   What are associative arrays good for? The classic example is "word
+   counts": finding the number of times each word is used in a text
+   without knowing in advance what the words are. Without associative
+   arrays, your program would have to build a table of some kind, and
+   every time a word was encountered, look it up in the table to find its
+   position and counter, or add it to the table if it wasn't found -- a
+   time-consuming and laborious process. Associative arrays, however, let
+   you use the word itself as the table index and therefore sidestep all
+   the table building and lookups.
+
+   Let's work through a practical example. Suppose you have a
+   file-transfer log in which each line is composed of a number of
+   blank-separated fields, and the 9th field is a filename (which happens
+   to be the format of certain FTP server logs, as well as of C-Kermit's
+   new FTP-format transaction log, described in [606]Section 4.17.2), for
+   example:
+
+  Wed Jul 14 09:35:31 1999 22 xx.mit.edu 13412 /pub/ftp/mm/intro.txt ....
+
+   and you want to find out how many times each file was transferred. The
+   following code builds an associative array, file<>, containing the
+   counts for each file:
+
+  local name line max \%c \%n          ; Declare local variables
+  fopen /read \%c /var/log/ftpd.log    ; Open the log file ([607]Section 1.22)
+  if fail exit 1 Can't open log        ; Check
+  while true {                         ; Loop for each record
+      fread /line \%c line             ; Read a line
+      if fail break                    ; Check for end of file
+      .name := \fword(\m(line),9,{ })  ; Get 9th field = filename (Sec 7.3)
+      _increment file<\m(name)>        ; Increment its counter (Sec 7.9.2)
+  }
+  fclose \%c                           ; Close file when done.
+
+   Note that _INCREMENT (and INCREMENT, and [_]DECREMENT) treat an empty
+   (i.e. nonexistent) variable as having a value of 0, and therefore
+   creates the variable with a value of 1.
+
+   At this point, if you told Kermit to "show macro file<", it would list
+   the associative array. But since you don't necessarily know the names
+   of the files in the array, or even how many elements are in the array,
+   how can you use it in a script program?
+
+   The idea of creating macro names that include character-string indices
+   enclosed in angle brackets is perfectly arbitrary and doesn't depend
+   on any Kermit features that weren't already there -- we could just as
+   easily have used some other notation, such as "file[index]",
+   "file:index", or "file.index", and the code above would have worked
+   just as well (with the corresponding syntax adjustments). But to be
+   able to use an associative array in a program after the array is
+   built, we need a method of accessing all its elements without knowing
+   in advance what they are. That's where the chosen notation comes in.
+
+   First of all, any macro name that ends with "<xxx>" (where "xxx" is
+   any string) is case sensitive, unlike all other macro names, which are
+   case independent. To illustrate, "file<oofa.txt>" and "file<OOFA.TXT>"
+   are two distinct macros, whereas "OOFA", "Oofa", and "oofa", when used
+   as macro names, are all the same.
+
+   Second, the new \faaconvert() function converts an associative array
+   (that is, all macros with names of the form "base<index>" that have
+   the same "base" part) into a pair of regular arrays and returns the
+   number of elements:
+
+  \faaconvert(name,&a[,&b])
+
+   "name" is the name of the associative array, without the angle
+   brackets or index ("file" in our example).
+
+   The second argument is the name of a regular array in which to store
+   the indices of the associative array (filenames in our example); if an
+   array of this name already exists, it is destroyed unless the array is
+   LOCAL. The third argument is the name of another regular array in
+   which to store the values (the counts in our example), with the same
+   rules about array name collisions. If you care only about the indices
+   and not the values, you can omit the third argument to \faaconvert().
+   In any case, the associative array is converted, not copied: its
+   elements are moved to the specified regular arrays, so after
+   conversion the original associative array is gone.
+
+   As with other array-loading functions, \faaconvert() sets element 0 of
+   each array to the number of elements in the array.
+
+   To continue our example:
+
+  .max := 0                                   ; Maximum count
+  .\%n := \faaconvert(file,&a,&b)             ; Convert
+  for \%i 1 \%n 1 {                           ; Loop through values
+      echo \flpad(\%i,3). \&a[\%i]: \&b[\%i]  ; Echo this pair
+      if ( > \&b[\%i] \m(max) ) {             ; Check for new maximum
+          .name := \&a[\%i]
+          .max  := \&b[\%i]
+      }
+  }
+  echo Most popular file: \m(name), accesses: \m(max)
+
+   This lists the files and counts and then announces which file has the
+   highest count.
+
+   Now suppose you want to sort the array pair created from an
+   associative array. In our example, \&a[] contains filenames, and \&b[]
+   contains the associated counts. Here we take advantage of the ARRAY
+   SORT command's ability to sort a second array according to the first
+   one:
+
+  array sort /reverse /numeric &b &a          ; Descending sort by count
+
+   Now to see the top five files and their counts:
+
+  echo The top 5 files are:
+  for \%i 1 5 1 {                             ; Loop through top 5 values
+      echo \flpad(\%i,3). \&a[\%i]: \&b[\%i]  ; Echo this pair
+  }
+     _________________________________________________________________
+
+    7.10.11. Transferring Array Contents to Other Computers
+
+   The SEND /ARRAY:arrayname command ([608]Section 4.7.1) allows you to
+   send the contents of any array, or any contiguous segment of it, in
+   either text or binary mode to another computer, using Kermit protocol.
+   When used in conjunction with C-Kermit's other features (the array
+   features described in this section; the file i/o package from
+   [609]Section 1.22; its decision-making, pattern-matching, and string
+   manipulation capabilities, and so on) the possibilities are endless:
+   extracts of large files, remote database queries, ..., all without
+   recourse to system-dependent mechanisms such UNIX pipes and filters,
+   thus ensuring cross-platform portability of scripts that use these
+   features.
+
+   When sending an array in text mode, Kermit appends a line terminator
+   to each array element, even empty ones, and it also converts the
+   character set from your current FILE character-set to your current
+   TRANSFER character-set, if any. No conversions are made or line
+   terminations added in binary mode. For example, the following array:
+
+  dcl \&a[] = One Two Three Four Five Six
+
+   is sent as six lines, one word per line, in text mode, and as the bare
+   unterminated string "OneTwoThreeFourFiveSix" in binary mode.
+
+   You should always include a /TEXT or /BINARY switch in any SEND /ARRAY
+   command to force the desired transfer mode, otherwise you're likely to
+   be surprised by the effects described in [610]Section 4.3.
+
+   Here are some examples:
+
+   send /text /array:\&a[]
+          Sends the entire contents of the array \&a[] in text mode.
+          Since an as-name is not included, the receiver is told the
+          filename is _array_a_.
+
+   send /text /array:&a[]
+   send /text /array:a[]
+   send /text /array:&a
+   send /text /array:a
+          These are all equivalent to the previous example.
+
+   send /text /array:&a /as-name:foo.bar
+          As above, but the array is sent under the name foo.bar.
+
+   send /text /array:&a[100:199] /as:foo.bar
+          As above, but only the elements from 100 through 199 are sent.
+
+   In text-mode transfers, character sets are translated according to
+   your current settings, just as for text files. In binary mode, of
+   course, there is no character-set translation or other conversion of
+   any kind. But remember that array elements can not contain the NUL
+   (ASCII 0) character, since they are implemented as NUL-terminated
+   strings.
+
+   Here's an example that shows how to send all the lines (up to 1000 of
+   them) from a file animals.txt that contain the words "cat", "dog", or
+   "hog" (see [611]Section 4.9 about pattern matching):
+
+  declare \&a[1000]
+  fopen /read \%c animals.txt
+  if fail exit 1
+  .\%i = 0
+  while true {
+      fread \%c line
+      if fail break
+      if match {\m(line)} {*{cat,[dh]og}*} {
+          increment \%i
+          if ( > \%i \fdim(&a) ) break
+          .\&a[\%i] := \m(line)
+      }
+  }
+  fclose \%c
+  send /array:a[1:\%i] /text
+
+   Note that we are careful to send only the part of the array that was
+   filled, not the entire array, because there are likely to be lots of
+   unused elements at the end, and these would be sent as blank lines
+   otherwise.
+
+   This example raises an interesting question: what if we want to send
+   ALL the matching lines, even if there are more than 1000 of them, but
+   we don't know the number in advance? Clearly the problem is limited by
+   Kermit's (and the computer's) memory. If there are a thousand trillion
+   matching lines, they most likely will not fit in memory, and in this
+   case the only solution is to write them first to a temporary file on
+   mass storage and then send the temporary file and delete it
+   afterwards.
+
+   However, when the selection is likely to fit in memory, the
+   once-familiar technique of initial allocation with extents can be
+   used:
+
+  if match {\m(line)} {*{cat,[dh]og}*} {
+      increment \%i
+      if ( > \%i \fdim(&a) ) {
+          array resize a \fdim(&a)+100
+          if fail stop 1 MEMORY FULL
+          echo NEW DIMENSION: \fdim(&a)
+      }
+      .\&a[\%i] := \m(line)
+  }
+
+   This grows the array in chunks of 100 as needed.
+     _________________________________________________________________
+
+  7.11. OUTPUT Command Improvements
+
+   LINEOUT [ text ]
+          This command is exactly like OUTPUT, except it supplies a
+          carriage return at the end of the text. "lineout exit" is
+          exactly the same as "output exit\13".
+
+   SET OUTPUT SPECIAL-ESCAPES { ON, OFF }
+          This command lets you tell C-Kermit whether to process \N, \L,
+          and \B specially in an OUTPUT command, as distinct from other \
+          sequences (such as \%a, \13, \v(time), etc). Normally the
+          special escapes are handled. Use SET OUTPUT SPECIAL-ESCAPES OFF
+          to disable them.
+
+   Disabling special escapes is necessary in situations when you need to
+   transmit lines of data and you have no control over what is in the
+   lines. For example, a file oofa.txt that contains:
+
+  This is a file
+  It has \%a variables in it
+  And it has \B in it.
+  And it has \L in it.
+  And it has \N in it.
+  And this is the last line.
+
+   can be sent like this:
+
+  local line
+  set output special-escapes off
+  fopen /read \%c oofa.txt
+  if fail stop 1 Can't open oofa.txt
+  while success {
+      fread \%c line
+      if fail break
+      ; Add filtering or processing commands here...
+      output \m(line)\13
+  }
+     _________________________________________________________________
+
+  7.12. Function and Variable Diagnostics
+
+   In C-Kermit 6.0 and earlier, the only diagnostic returned by a failing
+   function call was an empty value, which (a) could not be distinguished
+   from an empty value returned by a successful function call; (b) did
+   not give any indication of the cause of failure; and (c) did not cause
+   the enclosing statement to fail. C-Kermit 7.0 corrects these
+   deficiencies.
+
+   SET FUNCTION DIAGNOSTICS { ON, OFF }
+          when ON, allows built-in functions to return diagnostic
+          messages when improperly referenced, instead of an empty
+          string. FUNCTION DIAGNOSTICS are ON by default. When OFF,
+          improperly referenced functions continue to return an empty
+          string. This command also affects built-in variables; in this
+          case, an error message is returned only if the variable does
+          not exist. When FUNCTION DIAGNOSTICS are ON, the error message
+          is also printed.
+
+   For variables, the only message is:
+
+  <ERROR:NO_SUCH_VARIABLE:\v(name)>
+
+   where "name" is the name of the nonexistent variable.
+
+   For functions, the diagnostic message is:
+
+  <ERROR:message:\fname()>
+
+   where "message" is replaced by a message, and "name" is replaced by
+   the function name, e.g. <ERROR:ARG_NOT_NUMERIC:\fmod()>. Messages
+   include:
+
+  ARG_BAD_ARRAY       An argument contains a malformed array reference.
+  ARG_BAD_DATE        An argument contains a malformed date and/or time.
+  ARG_BAD_PHONENUM    An argument contains a malformed telephone number.
+  ARG_BAD_VARIABLE    An argument contains a malformed \%x variable.
+  ARG_INCOMPLETE      An argument is incomplete (e.g. a broken Base64 string).
+  ARG_EVAL_FAILURE    An argument could not be evaluated (internal error).
+  ARG_NOT_ARRAY       An argument references an array that is not declared.
+  ARG_NOT_NUMERIC     An argument that must be integer contains non-digits.
+  ARG_NOT_FLOAT       An argument has bad floating-point number format.
+  ARG_NOT_VARIABLE    An argument that must be a variable is not a variable.
+  ARG_OUT_OF_RANGE    An argument's numeric value is too big or too small,
+                      or an argument contains illegal characters (e.g. a hex
+                      or Base-64 string).
+  ARG_TOO_LONG        An argument's value is too long.
+  ARRAY_FAILURE       Failure to create an array.
+  DIVIDE_BY_ZERO      Execution of the function would cause division by zero.
+  FLOATING_POINT_OP   Execution error in a floating-point operation.
+  FILE_NOT_FOUND      Filename argument names a file that can't be found.
+  FILE_NOT_READABLE   Filename argument is not a regular file.
+  FILE_NOT_ACCESSIBLE Filename argument names a file that is read-protected.
+  FILE_ERROR          Other error with filename argument.
+  FILE_NOT_OPEN       A file function was given a channel that is not open.
+  FILE_ERROR_-n       A file function got error -n ([612]Section 1.22).
+  LOOKUP_FAILURE      Error looking up function (shouldn't happen).
+  MALLOC_FAILURE      Failure to allocate needed memory (shouldn't happen).
+  NAME_AMBIGUOUS      The function is not uniquely identified.
+  MISSING_ARG         A required argument is missing.
+  NO_SUCH_FUNCTION    An argument references a function that is not defined.
+  NO_SUCH_MACRO       An argument references a macro that is not defined.
+  RESULT_TOO_LONG     The result of a function is too long.
+  UNKNOWN_FUNCTION    Internal error locating function (shouldn't happen).
+
+   Examples:
+
+  assign \%m \fmod()
+  ?<ERROR:MISSING_ARG:\fmod()>
+  echo "\fcontents(\%m)"
+  "<ERROR:MISSING_ARG:\fmod()>"
+  echo \fmod(3,x)
+  ?<ERROR:ARG_NOT_NUMERIC:\fmod()>
+  echo \fmod(3,4-2*2)
+  ?<ERROR:DIVIDE_BY_ZERO:\fmod()>
+
+   Notice the use of \fcontents() in echoing the value of a variable that
+   contains a returned error message. That's because the error message
+   includes the name of the variable or function that failed, so you must
+   use \fcontents() to prevent it from being evaluated again -- otherwise
+   the same error will occur.
+
+   The handling of function and variable errors is controlled by:
+
+   SET FUNCTION ERROR { ON, OFF }
+          Tells whether invalid function calls or variable references
+          should cause command errors. FUNCTION ERROR is ON by default.
+          When ON, and an error is diagnosed in a built-in function or
+          variable, the command that includes the function call or
+          variable reference fails. The failing command can be handled in
+          the normal way with IF FAILURE / IF SUCCESS, SET TAKE ERROR, or
+          SET MACRO ERROR.
+
+   When FUNCTION DIAGNOSTICS is OFF, there is no error message.
+
+   SHOW SCRIPTS displays the current FUNCTION DIAGNOSTICS and ERROR
+   settings.
+     _________________________________________________________________
+
+  7.13. Return Value of Macros
+
+   In C-Kermit 5A and 6.0, there are two ways to return one level from a
+   macro: RETURN value and END number text. When RETURN is used, the
+   value, which can be a number or a text string, is assigned to
+   \v(return). When END was used, however, \v(return) was not set.
+   SUCCESS/FAILURE was set according to whether the number was zero, and
+   the text was printed, but the actual value of the number was lost.
+
+   In C-Kermit 7.0, the END number is available in the \v(return)
+   variable.
+     _________________________________________________________________
+
+  7.14. The ASSERT, FAIL, and SUCCEED Commands.
+
+   The ASSERT command is just like the IF command, but without a command
+   to execute. It simply succeeds or fails, and this can be tested by a
+   subsequent IF SUCCESS or IF FAILURE command. Example:
+
+  ASSERT = 1 1
+  IF SUCCESS echo 1 = 1.
+
+   The FAIL command does nothing, but always fails. The SUCCEED command
+   does nothing, but always succeeds.
+
+   These commands are handy in debugging scripts when you want to induce
+   a failure (or success) that normally would not occur, e.g. for testing
+   blocks of code that normally are not executed.
+     _________________________________________________________________
+
+  7.15. Using Alarms
+
+   Alarms may be set in two ways:
+
+   SET ALARM number
+          Sets an alarm for the given number of seconds "from now", i.e.
+          in the future, relative to when the SET ALARM command was
+          given. Examples:
+
+  set alarm 60        ; 60 seconds from now
+  set alarm +60       ; The same as "60"
+  set alarm -60       ; Not legal - you can't set an alarm in the past.
+  set alarm 60*60     ; 60 minutes from now.
+  set alarm \%a+10    ; You can use variables, etc.
+
+   SET ALARM hh:mm:ss
+          Sets an alarm for the specified time. If the given time is
+          earlier than the current time, the alarm is set for the given
+          time in the next day. You may give the time in various formats:
+
+  set alarm 15:00:00  ; 3:00:00pm
+  set alarm 3:00:00pm ; 3:00:00pm
+  set alarm 3:00pm    ; 3:00:00pm
+  set alarm 3pm       ; 3:00:00pm
+
+   SHOW ALARM
+          Displays the current alarm, if any, in standard date-time
+          format (see [613]Section 1.6): yyyymmdd hh:mm:ss.
+
+   IF ALARM command
+          Executes the command if an alarm has been set and the alarm
+          time has passed.
+
+   IF ALARM { command-list } [ ELSE { command-list } ]
+          Executes the command-list if an alarm has been set and the
+          alarm time has passed. Otherwise, if an ELSE part is given, its
+          command-list is executed.
+
+   CLEAR ALARM
+          Clears the alarm.
+
+   Only one alarm may be set at a time.
+
+   Example: Suppose you have a script that is always running, and that
+   transfers files periodically, and that keeps a transaction log.
+   Suppose you want to start a new transaction log each day:
+
+  log transactions \v(date).log
+  set alarm 00:00:00                     ; Set an alarm for midnight
+  while true {                           ; Main script loop
+      xif alarm {                        ; If the alarm time is past...
+          close transactions             ; Close current log
+          log transactions \v(date).log  ; Start new one
+          pause 1                        ; To make sure 00:00:00 is past
+          set alarm 00:00:00             ; Set a new alarm
+      }
+      ; put the rest of the script here...
+  }
+
+   Note that IF ALARM -- no matter whether it succeeds or fails -- does
+   NOT clear an expired alarm. Thus, once an alarm has expired, every IF
+   ALARM will succeed until the alarm is cleared (with the CLEAR ALARM
+   command) or reset with a new SET ALARM command.
+     _________________________________________________________________
+
+  7.16. Passing Arguments to Command Files
+
+   Beginning in version 7.0, C-Kermit accepts arguments on the TAKE
+   command line, for example:
+
+  C-Kermit> take oofa.ksc one two {this is three} four
+
+   This automatically sets the variables \%1 through \%9 to the
+   arguments, and \%0 to the name of the file, in this case:
+
+  \%0 = /usr/olga/oofa.ksc
+  \%1 = one
+  \%2 = two
+  \%3 = this is three
+  \%4 = four
+
+   and \%5..\%9 are undefined (empty). Arguments past the ninth are
+   available in the \&_[] argument-vector array ( [614]Section 7.5).
+
+   The variables are those at the current macro level. Thus, if the TAKE
+   command is executed from within a macro, the macro's arguments are
+   replaced by those given on the TAKE command line (but only if at least
+   one argument is given). The command shown above is exactly equivalent
+   to:
+
+  assign \%0 /usr/olga/oofa.ksc
+  assign \%1 one
+  assign \%2 two
+  assign \%3 this is three
+  assign \%4 four
+  assign \%5
+  assign \%6
+  assign \%7
+  assign \%8
+  assign \%9
+  take oofa.ksc
+
+   Remember, the variables \%0..\%9 are on the macro call stack, and
+   command files are independent of the macro stack. Thus, if a command
+   file TAKEs another command file and passes arguments to it, the
+   variables are changed from that point on for both files, and so forth
+   for all levels of nested command files without intervening macro
+   invocations.
+
+   It would have been possible to change C-Kermit to use the overall
+   command stack, rather than the macro stack, for arguments -- this
+   would have made TAKE work exactly like DO, which is "nicer", but it
+   would also have broken countless existing scripts. However, the new
+   SHIFT command ([615]Section 7.5) makes it possible to create an
+   alternative TAKE command that does indeed save and restore the
+   argument variables at its own level around execution of a command
+   file:
+
+  define mtake {
+     local \%f
+     assign \%f \fcontents(\%1)
+     shift
+     take \%f
+  }
+
+   C-Kermit 7.0 also supports a new, easier way to pass arguments to
+   scripts from the system command line:
+
+  kermit filename arg1 arg2 arg3 ...
+
+   in which arg1, arg2, arg3 (etc) are arguments for the script (whose
+   filename is given), and are assigned to \%1, \%2, ... \%9. The
+   filename is assigned to \%0. This applies equally to "Kerbang" scripts
+   in UNIX ([616]Section 7.19). For example, suppose you have a file
+   called "showargs" containing the following lines:
+
+  #!/usr/local/bin/kermit +
+  echo Hello from \%0
+  show args
+  exit
+
+   (except not indented, since the "#!" line must be on the left margin).
+   If you give this file execute permission:
+
+  chmod +x showargs
+
+   then you can run it exactly as you would run a UNIX shell script,
+   e.g.:
+
+  $ showargs one two three
+  Hello from /usr/olga/showargs
+  Top-level arguments (\v(argc) = 4):
+   \&_[0] = /usr/olga/showargs
+   \&_[1] = one
+   \&_[2] = two
+   \&_[3] = three
+
+   Furthermore, the \&_[] array now contains the filename, if one was
+   given as the first command line argument, or it is a "Kerbang" script,
+   in element 0.
+
+   Otherwise element 0 is program name, and elements 1 through \v(argc)-1
+   contain the command-line arguments, if any, that appear after "--" or
+   "=", if any. This array is saved and restored around macro calls;
+   recall that inside macros it contains the macro argument vector
+   (allowing you to access arguments programmatically, and to have more
+   than 9 of them).
+
+   At top level, notice the difference between the \&@[] and \&_[]
+   arrays. The former includes C-Kermit options; the latter omits them.
+     _________________________________________________________________
+
+  7.17. Dialogs with Timed Responses
+
+   The ASK, ASKQ, GETOK, and GETC commands (let's call them the
+   "ASK-class commands") let you write scripts that carry on dialogs with
+   the user, asking them for text, a Yes/No answer, or a character,
+   respectively. Prior to C-Kermit 7.0, these questions would always wait
+   forever for an answer. In C-Kermit 7.0, you may specify a time limit
+   for them with the new command:
+
+   SET ASK-TIMER number
+          Sets a time-limit on ASK-CLASS commands to the given number of
+          seconds. If the number is 0 or less, there is no time limit and
+          these commands wait forever for a response. Any timer that is
+          established by this command remains in effect for all future
+          ASK-class commands until another SET ASK-TIMER command is given
+          (e.g. with a value of 0 to disable ASK timeouts).
+
+   IF ASKTIMEOUT command
+          An ASK-class command that times out returns a failure status.
+          You can test explicitly for a timeout with:
+     _________________________________________________________________
+
+  7.18. Increased Flexibility of SWITCH Case Labels
+
+   Prior to C-Kermit 7.0 / K95 1.1.19, the case labels in SWITCH
+   statements were string constants.
+
+   Now case labels can be variables, function calls, or any mixture of
+   these with each other and/or with regular characters.
+
+   Furthermore, after the case label is evaluated, it is treated not as a
+   string constant, but as a pattern against which the SWITCH variable is
+   matched ([617]Section 4.9.1).
+
+   This introduces a possible incompatibility with previous releases,
+   since the following characters in case labels are no longer taken
+   literally:
+
+  \ * ? [ {
+
+   Any scripts that previously included any of these characters in case
+   labels must now quote them with backslash (\).
+     _________________________________________________________________
+
+  7.19. "Kerbang" Scripts
+
+   In UNIX only, Kermit scripts can be stored in files and run
+   "directly", without starting Kermit first (as noted on page 467 of the
+   manual), just as a shell script can be "run" as if it were a program.
+   This section amplifies on that idea a bit, and presents some new
+   aspects of version 7.0 that make it easier to write and run Kermit
+   scripts directly.
+
+     NOTE: On non-UNIX platforms, such as VMS or Windows, Kerbang
+     scripts can be run as "kermit + scriptfilename arg1 arg2 arg3 ...".
+     Windows 95/98/NT file associations do not allow for the passing of
+     parameters. In VMS, however, you can achieve the Kerbang effect by
+     defining a symbol, as in this example:
+
+  $ autotelnet :== "$SYS$TOOLS:KERMIT.EXE + AUTOTELNET.KSC"
+
+     and then running the script like any other command:
+
+  $ autotelnet xyzcorp.com myuserid
+
+     See [618]Section 9.3 for an explanation of the "+" symbol.
+
+   UNIX shell scripts can specify which shell should run them by
+   including a "shebang" line at the top, e.g.:
+
+  #!/bin/sh
+
+   (but not indented; the shebang line must be on the left margin). The
+   term "shebang" is a contraction of "shell" and "bang". "Bang" is a
+   slang word for the exclamation mark ("!"); "shebang" itself is an
+   American slang word used in in the phrase "the whole shebang".
+
+   We can run Kermit scripts directly too, by including a "shebang" line
+   that names Kermit as the "shell"; thus we call these "Kerbang"
+   scripts. This mechanism has been considerably simplified in C-Kermit
+   7.0 to facilitate C-Kermit's use a scripting tool just like any of the
+   UNIX shells or scripting languages. The rules are the same as for
+   shell scripts:
+
+    1. The first line of the Kermit script must begin with "#!"
+       immediately followed by the full pathname of the program that will
+       execute the script (in this case, C-Kermit rather than a UNIX
+       shell), followed by any Kermit command-line options. To suppress
+       execution of the C-Kermit initialization file and to make command
+       line arguments available to the script, the final option should be
+       "+":
+  #!/usr/local/bin/kermit +
+       Some users have reported that in some circumstances a space might
+       be necessary after the plus sign; this depends on your shell -- it
+       has nothing to do with Kermit. In most cases, no space is needed.
+    2. The file must have execute permission (granted via "chmod +x
+       filename").
+
+   When C-Kermit is invoked from a Kerbang script (or from the system
+   prompt with a "+" command-line argument, which amounts to the same
+   thing), the following special rules apply:
+
+    1. The C-Kermit initialization file is NOT executed automatically. If
+       you want it to be executed, include a TAKE command for it in the
+       script, e.g. "take \v(home).kermrc". (In previous releases, the
+       initialization file was always executed, with no way to prevent it
+       except for the user to include Kermit-specific command line
+       options which had nothing to do with the script). Many scripts
+       have no need for the standard Kermit initialization file, which is
+       quite lengthy and not only delays startup of the script, but also
+       spews forth numerous messages that are most likely unrelated to
+       the script.
+    2. If the initialization file is not executed, neither is your
+       customization file, since the initialization file is the command
+       file from which the customization file is TAKEn. Again, you can
+       include a TAKE command for the initialization file if desired, or
+       for the customization file by itself, or for any other file.
+    3. C-Kermit does not process command-line arguments at all. Instead,
+       it passes all words on the command line after the "+" to the
+       script as \%0 (the script name), \%1..\%9 (the first nine
+       arguments), as well as in the argument vector array \&_[]. The
+       variable \v(argc) is set to the total number of "words" (as passed
+       by the shell to Kermit) including the script name. Quoting and
+       grouping rules are those of the shell.
+    4. At any point where the script terminates, it must include an EXIT
+       command if you want it to exit back to the shell; otherwise
+       C-Kermit enters interactive prompting mode when the script
+       terminates. The EXIT command can include a numeric status to be
+       returned to the shell (0, 1, etc), plus an optional message.
+
+   Here is a simple Kerbang script that prints its arguments:
+
+  #/usr/local/bin/kermit +
+  echo Hello from \%0
+  for \%i 0 \v(argc)-1 1 {
+      echo \%i. "\&_[\%i]"
+  }
+  exit 0
+
+   Save this file as (say) "showargs", then give it execute permission
+   and run it (the \&_[] array is the same as \%0..\%9, but allows you to
+   refer to argument variables programmatically; see [619]Section 7.5).
+   (Yes, you could substitute SHOW ARGUMENTS for the loop.)
+
+  $ chmod +x showargs
+  $ ./showargs one "this is two" three
+
+   The script displays its arguments:
+
+  Hello from /usr/olga/showargs
+  0. "/usr/olga/showargs"
+  1. "one"
+  2. "this is two"
+  3. "three"
+  $
+
+   Notice that no banners or greetings are printed and that startup is
+   instantaneous, just like a shell script. Also notice that grouping of
+   arguments is determined by *shell* quoting rules, not Kermit ones,
+   since the command line is parsed by the shell before Kermit ever sees
+   it.
+
+   Of course you can put any commands at all into a Kerbang script. It
+   can read and write files, make connections, transfer files, anything
+   that Kermit can do -- because it *is* Kermit. And of course, Kerbang
+   scripts can also be executed from the Kermit prompt (or from another
+   script) with a TAKE command; the Kerbang line is ignored since it
+   starts with "#", which is a comment introducer to Kermit just as it is
+   to the UNIX shell. In VMS and other non-UNIX platforms, the Kerbang
+   line has no effect and can be omitted.
+
+   It might be desireable for a script to know whether it has been
+   invoked directly from the shell (as a Kerbang script) or by a TAKE
+   command given to the Kermit prompt or in a Kermit command file or
+   macro. This can be done as in this example:
+
+  #!/usr/local/bin/kermit +
+  assign \%m \fbasename(\%0)
+  define usage { exit 1 {usage: \%m phonenumber message} }
+  define apage { (definition of APAGE...) } ; (See [620]book pp.454-456)
+  xif equal "\%0" "\v(cmdfil)" {
+      if not def \%1 usage
+      if not def \%2 usage
+      apage {\%1} {\%2}
+      exit \v(status)
+  }
+
+   In a Kerbang script, \%0 and \v(cmdfile) are the same; both of them
+   are the name of the script. When a script is invoked by a Kermit TAKE
+   command, \%0 is the name of the Kermit program, but \v(cmdfile) is the
+   name of the script. In the example above, a macro called APAGE is
+   defined. If the script was invoked directly, the APAGE macro is also
+   executed. Otherwise, it is available for subsequent and perhaps
+   repeated use later in the Kermit session.
+
+   An especially handy use for Kerbang scripts is to have the
+   initialization file itself be one. Since the standard initialization
+   file is rather long and time-consuming to execute, it is often
+   overkill if you want to start Kermit just to transfer a file. Of
+   course there are command-line switches to suppress initialization-file
+   execution, etc, but another approach is to "run" the initialization
+   file when you want its features (notably the services directory), and
+   run C-Kermit directly when you don't. A setup like this requires that
+   (a) the C-Kermit initialization file is configured as a Kerbang script
+   (has #!/path.../kermit as first line), has execute permission, and is
+   in your PATH; and (b) that you don't have a .kermrc file in your login
+   directory.
+     _________________________________________________________________
+
+  7.20. IF and XIF Statement Syntax
+
+   The IF command has been improved in two significant ways in C-Kermit
+   7.0, described in the following subsections. All changes are backwards
+   compatible.
+
+    7.20.1. The IF/XIF Distinction
+
+   The distinction between IF and XIF is no longer important as of
+   C-Kermit 7.0. You should be able to use IF in all cases (and of
+   course, also XIF for backwards compatibility). In the past, IF was
+   used for single-command THEN parts, followed optionally by a separate
+   ELSE command:
+
+  IF condition command1    ; THEN part
+  ELSE command2            ; ELSE part
+
+   whereas XIF was required if either part had multiple commands:
+
+  XIF condition { command, command, ... } ELSE { command, command, ... }
+
+   The syntactic differences were primarily that IF / ELSE was two
+   commands on two separate lines, whereas XIF was one command on one
+   line, and that XIF allowed (and in fact required) braces around its
+   command lists, whereas IF did not allow them.
+
+   Furthermore, the chaining or nesting of parts and conditions was
+   inconsistent. For example, the IF command could be used like this:
+
+  IF condition command
+  ELSE IF condition command
+  ELSE IF condition command
+  ELSE IF condition command
+  ...
+
+   but XIF could not. C-Kermit 7.0 accepts the old syntax and executes it
+   the same as previous versions, but also accepts a new unified and more
+   convenient syntax:
+
+   IF condition command-list [ ELSE command-list ]
+
+   or:
+
+IF condition command-list
+ELSE command-list
+
+   in which the ELSE part is optional, and where command-list can be a
+   single command (with or without braces around it) or a list of
+   commands enclosed in braces. Examples:
+
+   Example 1:
+
+  IF condition { command1, command2 } ELSE { command3, command4 }
+
+   Example 2 (same as Example 1):
+
+  IF condition {
+     command1
+     command2
+  } ELSE {
+     command3
+     command4
+  }
+
+   Example 3 (same as 1 and 2):
+
+  IF condition {
+     command1
+     command2
+  }
+  ELSE { command3, command4 }
+
+   Example 4 (same as 1-3):
+
+  IF condition {
+     command1
+     command2
+  }
+  ELSE {
+     command3
+     command4
+  }
+
+   Example 5 (ELSE can be followed by another command):
+
+  IF condition {
+     command1
+     command2
+  } ELSE IF condition {
+     command3
+     command4
+  } ELSE {
+     command5
+     command6
+  }
+
+   Example 5 suggests other possibilities:
+
+  IF condition {
+     command1
+     command2
+  } ELSE FOR variable initial final increment {
+     command3
+     command4
+  }
+
+   And this too is possible, except for some non-obvious quoting
+   considerations:
+
+  dcl \&a[6] = one two three four five six
+
+  IF < \%n 3 {
+      echo \\%n is too small: \%n
+  } ELSE FOR \\%i 1 \\%n 1 {
+      echo \\%i. \\&a[\\%i]
+  }
+
+   (The loop variable must be quoted in this context to prevent premature
+   evaluation.)
+     _________________________________________________________________
+
+    7.20.2. Boolean Expressions (The IF/WHILE Condition)
+
+   Prior to C-Kermit 7.0, the IF and WHILE commands accepted only a
+   single Boolean ("true or false") assertion, e.g. "if > \%m 0 command"
+   or "if exist filename command". There was no way to form Boolean
+   expressions and, in particular, nothing that approached a Boolean OR
+   function (AND could be simulated by concatenating IF statements: "if
+   condition1 if condition2..").
+
+   C-Kermit 7.0 (and K95 1.1.19) allow grouping of Boolean assertions
+   using parentheses and combining them using AND (or &&) and OR (or ||).
+   Each of these operators -- including the parentheses -- is a field and
+   must be set off by spaces. AND has higher precedence than OR, NOT has
+   higher precedence than AND, but parentheses can be used to force any
+   desired order of evaluation. The old syntax is still accepted.
+
+   Here are some examples:
+
+  define \%z 0                          ; Define some variables
+  define \%n 1                          ; for use in the examples.
+
+  if > \%n \%z echo \%n is greater.     ; Original format - still accepted.
+  if ( > \%n \%z ) echo \%n is greater. ; Parentheses may be used in 7.0.
+  if ( > \%n \%z && not = \%z 0 ) ...   ; Two assertions combined with AND.
+  if ( > \%n \%z and not = \%z 0 ) ...  ; Same as previous ("and" = "&&").
+  if ( > \%n \%z || not = \%z 0 ) ...   ; Two assertions combined with OR.
+  if ( > \%n \%z or not = \%z 0 ) ...   ; Same as previous ("or" = "||").
+  if ( > \%n \%z || != \%z 0 ) ...      ; Ditto ("!=" = "not =").
+  while ( 1 ) { ... }                   ; Just like C.
+
+   Notice the spaces around all operators including the parentheses --
+   these are required. The following examples show how parentheses can be
+   used to alter the precedence of the AND and OR operators:
+
+  if ( false || false && false || true ) ,..         ; True
+  if ( false || ( false && false ) || true ) ...     ; Same as previous
+  if ( ( false || false ) && ( false || true ) ) ... ; False
+
+   Similarly for NOT:
+
+  if ( not true && false ) ...          ; False (NOT binds to TRUE only)
+  if ( ( not true ) && false ) ...      ; Same as previous
+  if ( not ( true && false ) ) ...      ; True (NOT binds to (TRUE && FALSE))
+
+   Notes:
+
+    1. The syntax of the Boolean expression itself has not changed; each
+       expression begins with a keyword or token such as "EXIST", ">", or
+       "=", etc; operators such as "<", "=", and ">" do not go between
+       their operands but precede them as before; this might be called
+       "reverse reverse Polish notation"; it allows deterministic
+       on-the-fly parsing of these expressions at the C-Kermit> prompt as
+       well as in scripts, and allows ?-help to be given for each item
+       when IF or WHILE commands are typed at the prompt.
+    2. Parentheses are required when there is more than one Boolean
+       assertion.
+    3. Parentheses are not required, but are allowed, when there is only
+       one Boolean assertion.
+    4. Evaluation of Boolean assertions occurs left to right, but the
+       resulting Boolean expression is evaluated afterwards according to
+       the rules of precedence. All Boolean assertions are always
+       evaluated; there is no "early stopping" property and therefore no
+       question about when or if side effects will occur -- if any
+       Boolean assertion has side effects, they will always occur.
+
+   Constructions of arbitrary complexity are possible, within reason.
+
+   Also see [621]Section 7.4 for new IF / WHILE conditions.
+     _________________________________________________________________
+
+  7.21. Screen Formatting and Cursor Control
+
+   C-Kermit 7.0 adds a simple way to create formatted screens, the SCREEN
+   command:
+
+   SCREEN { CLEAR, CLEOL, MOVE-TO row [ column ] }
+          Performs screen-formatting actions. Correct operation of these
+          commands depends on proper terminal setup on both ends of the
+          connection -- mainly that the host terminal type is set to
+          agree with the kind of terminal or the emulation you are
+          viewing C-Kermit through. The UNIX version uses terminfo or
+          termcap (not curses); the VMS version uses SMG; K-95 uses its
+          built in screen manager.
+
+   SCREEN CLEAR
+          Moves the cursor to home position and clears the entire screen.
+          Synonyms: CLEAR COMMAND-SCREEN ALL (K-95 only), CLS, CLEAR
+          SCREEN.
+
+   SCREEN CLEOL
+          Clears from the current cursor position to the end of the line.
+          Synonym: CLEAR COMMAND-SCREEN EOL (K-95 only)
+
+   SCREEN MOVE-TO row column
+          Moves the cursor to the indicated row and column. The row and
+          column numbers are 1-based, so on a 24x80 screen the home
+          position is 1 1 and the lower right corner is 24 80. If a row
+          or column number is given that too large for what Kermit or the
+          operating system thinks is your screen size, the appropriate
+          number is substituted.
+
+   These escape sequences used by these commands depends on the platform.
+   In UNIX, your TERM environment variable is used to query the
+   terminfo/termcap database; if the query fails, ANSI/VT100 sequences
+   are used. In VMS, the SMG library is used, which sends sequences based
+   on your VMS terminal type. K95 does its own screen control. On other
+   platforms (such as AOS/VS, VOS, etc), screen formatting is not
+   supported, and the SCREEN command does nothing.
+
+   The three SCREEN actions can be used in scripts to produce menus,
+   formatted screens, dynamic displays, etc. Related variables include:
+
+  \v(terminal)     The type terminal C-Kermit thinks you have.
+  \v(rows)         The number of rows C-Kermit thinks your terminal has.
+  \v(columns)      The number of columns C-Kermit thinks your terminal has.
+
+   And functions:
+
+  \fscrncurx()     The current X coordinate of the cursor (K-95 only).
+  \fscrncury()     The current Y coordinate of the cursor (K-95 only).
+  \fscrnstr(x,y,n) The string of length nat position (x,y) (K-95 only).
+
+   And commands:
+
+  ECHO string      Writes string + CRLF at the current cursor position.
+  XECHO string     Writes string at current cursor position; CRLF not supplied.
+  GETC v prompt    Issues prompt, reads one character into variable v, no echo.
+
+   And special characters:
+
+  Ctrl-L           At the C-Kermit> command prompt, or in a C-Kermit command,
+                   works like Return or Enter, but also clears the screen
+
+   Example 1: A macro that prints a message \%1 at cursor position
+   (\%2,\%3):
+
+  define MSG {
+      if not def \%3 def \%3 0             ; Default column to 0
+      if > \v(argc) 2 screen move \%2 \%3  ; Move to given row/col (if any)
+      screen cleol                         ; Clear to end of line
+      if def \%1 xecho \fcontents(\%1)     ; Print message (if any)
+  }
+
+   Example 2: A macro put the cursor on the bottom screen line, left
+   margin:
+
+  define BOT {
+      screen move \v(rows) 0
+  }
+
+   Example 3: A macro to center message \%1 on line \%2.
+
+  define CENTER {
+      if not def \%2 def \%2 1
+      .\%x ::= (\v(cols)-\flen(\%1))/2
+      msg {\%1} {\%2} {\%x}
+  }
+
+   Example 4: A simple menu (building on Examples 1-3):
+
+  def \%c 0                             ; Menu choice variable
+  screen clear                          ; Clear the screen
+  center {Welcome to This Menu} 2       ; Display the menu
+  msg {Choices:} 4
+  msg { 1. File} 6
+  msg { 2. Edit} 7
+  msg { 3. Exit} 8
+  while ( != \%c 3 ) {                  ; Read and verify choice
+      while true {                      ; Keep trying till we get a good one
+          screen move 10                ; Move to line 10
+          screen cleol                  ; Clear this line
+          getc \%c {Your choice: }      ; Prompt and get and echo 1 character
+          xecho \%c
+          if ( not numeric \%c ) { msg {Not numeric - "\%c"} 12, continue }
+          if ( >= \%c 1 && <= \%c 3 ) break
+          msg {Out of range - "\%c"} 12
+      }
+      switch \%c {                      ; Valid choice - execute it.
+        :1, msg {Filing... } 12, break
+        :2, msg {Editing...} 12, break
+        :3, msg {Exiting...} 12, break
+      }
+  }
+  echo Bye                              ; Exit chosen - say goodbye.
+  bot                                   ; Leave cursor at screen bottom.
+  exit                                  ; And exit.
+
+   Similar scripts can work over the communication connection; substitute
+   INPUT and OUTPUT for GETC and ECHO/XECHO.
+     _________________________________________________________________
+
+  7.22. Evaluating Arithmetic Expressions
+
+   A new arithmetic operator was added to the list recognized by the
+   EVALUATE command, the \feval() function, and which can also be used
+   anywhere else arithmetic expressions are accepted (numeric command
+   fields, array subscripts, etc):
+
+   Prefix "!"
+          This operator inverts the "truth value" of the number or
+          arithmetic expression that follows. If the value of the operand
+          is 0, the result is 1. If the value is nonzero, the result is
+          0.
+
+   Examples:
+
+  set eval old
+  evaluate 0
+  0
+
+  evaluate !0
+  1
+
+  evaluate !3
+  0
+
+  evaluate !(-3)
+  0
+
+  .\%a = 1
+  .\%b = 0
+  evaluate !(\%a|\%b)
+  0
+
+  evaluate !(\%a&\%b)
+  1
+
+  evaluate !(!(\%a&\%b))
+  0
+
+   Note the distinction between Prefix ! (invert truth value) and Suffix
+   ! (factorial). Also the distinction between Prefix ! and Prefix ~
+   (which inverts all the bits in its operand). Also note that prefix
+   operators (!, -, and ~) can not be adjacent unless you use parentheses
+   to separate them, as shown in the final example above.
+     _________________________________________________________________
+
+  7.23. Floating-Point Arithmetic
+
+   C-Kermit 7.0 adds limited support for floating-point numbers (numbers
+   that have fractional parts, like 3.141592653). This support is
+   provided through a small repertoire of functions and in Boolean
+   expressions that compare numbers, but does not apply to number parsing
+   in general, or to expression evaluation, array subscripts, the
+   INCREMENT and DECREMENT commands, or in any context other than those
+   listed in this section.
+
+   A floating point number has an optional sign (+ or -), followed by a
+   series of decimal digits containing either zero or one period (.)
+   character, which is the decimal point. The use of comma or any other
+   character besides period as a decimal point is not supported.
+   Scientific notation is not supported either. Examples of legal
+   floating-point numbers:
+
+  0                Integers can be used
+  1                Ditto
+  2.               A decimal point without decimal digits
+  3.0              A decimal point with decimal digits
+  3.141592653      Ditto
+ -4.0              A negative sign can be included
+ +5.0              A positive sign can be included
+
+   Examples of notations that are not accepted:
+
+  1,000,000        Separators can not be used
+  1.000.000        Ditto (or multiple decimal points)
+  6.022137E23      No scientific notation
+  6.62606868e-34   Ditto
+  12.5+6.25        No "bare" expressions
+
+   You can use IF FLOAT test a string or variable to see if it's in
+   acceptable floating-point format. Example:
+
+  ask \%f { Type a number: }
+  if not def \%f .\%f = 0.0
+  if not float \%f stop 1 Invalid floating-point number: "\%f"
+
+   C-Kermit's floating-point support, like its support for whole numbers
+   (integers), relies on the capabilities of the underlying computer.
+   Your computer has only a limited amount of precision for numbers,
+   depending on its architecture. Thus floating-point numbers that have
+   too many digits will not be accurate; adding a very small number to a
+   very large one might have no effect at all; and so on. For details,
+   read a text on numerical analysis. Example:
+
+  .\%a = 11111111111111111111  ; A long number
+  .\%b = 22222222222222222222  ; Another one
+  echo \ffpadd(\%a,\%b)        ; Add them - the result should be all 3's
+  33333333333333330000.0       ; See the result
+
+   In this example, the computer has 16 digits of precision; after that,
+   the (low-order) digits are set to 0, since the computer doesn't know
+   what they really are. In fact, the computer returns random digits, but
+   Kermit sets all digits beyond the computer's precision to 0.
+
+   C-Kermit's floating-point functions have names of the form
+   "\ffpxxx(args)" ("\f" for function, "fp" for floating-point), where
+   "xxx" is replaced by the name of the function, such as "sqrt", and
+   "args" is the argument list, consisting of one or two floating-point
+   numbers (depending on the function), and an optional "d" argument that
+   says now many decimal places should be shown in the result. Example:
+
+  \ffpdiv(10,3,1) returns "3.3"
+  \ffpdiv(10,3,2) returns "3.33"
+  \ffpdiv(10,3,3) returns "3.333"
+
+   and so on, up to the precision of the computer. If the decimal-places
+   argument is less than zero, the fractional part of the result is
+   truncated:
+
+  \ffpdiv(10,3,-1) returns "3".
+
+   If the decimal-places argument is 0, or is omitted, C-Kermit returns
+   as many decimal places as are meaningful in the computer's
+   floating-point precision, truncating any extraneous trailing 0's:
+
+  \ffpdiv(10,8) returns "1.25".
+  \ffpdiv(10,4) returns "2.5".
+  \ffpdiv(10,2) returns "5.0".
+  \ffpdiv(10,3) returns "3.333333333333333" (for 16-digit precision).
+
+   There is no way to request that a floating-point function return a
+   decimal point but no decimal places. However, this is easy enough to
+   accomplish in other ways, for example by supplying it outside the
+   function call:
+
+  echo \ffpadd(\%a,\%b,-1).
+
+   Kermit's floating-point functions always round the result for the
+   requested number of decimal places when the "d" argument is given and
+   has a value greater than 0 (see the description of \ffpround() just
+   below).
+
+   Floating-point arguments can be constants in floating-point format or
+   variables whose values are floating-point numbers. If a floating-point
+   argument is omitted, or is a variable with no value, 0.0 is supplied
+   automatically. Example:
+
+  def \%x 999.999
+  undef \%y
+  echo \ffpmin(\%x,\%y)
+  0.0
+
+   Or equivalently:
+
+  echo \ffpmin(999.999)
+  0.0
+
+   The floating-point functions are:
+
+   \ffpround(f1,d)
+          Returns f1 rounded to d decimal places. For this function only,
+          d = 0 (or d omitted) has a special meaning: return the integer
+          part of f1 rounded according to the fractional part. Examples:
+
+  \ffpround(2.74653,-1) returns "2" (fraction truncated, no rounding).
+  \ffpround(2.74653,0)  returns "3" (integer part is rounded).
+  \ffpround(2.74653)    returns "3" (d omitted same as d = 0).
+  \ffpround(2.74653,1)  returns "2.7".
+  \ffpround(2.74653,2)  returns "2.75".
+  \ffpround(2.74653,3)  returns "2.747".
+  \ffpround(2.74653,4)  returns "2.7465", etc.
+
+   \ffpadd(f1,f2,d)
+          Returns the sum of f1 and f2.
+
+   \ffpsubtract(f1,f2,d)
+          Subtracts f2 from f1 and returns the result.
+
+   \ffpmultiply(f1,f2,d)
+          Returns the product of f1 and f2.
+
+   \ffpdivide(f1,f2,d)
+          If f2 is not 0, divides f1 by f2 and returns the quotient.
+          If f2 is 0, a DIVIDE_BY_ZERO error occurs.
+
+   \ffpraise(f1,f2,d)
+          If f1 = 0 and f2 <= 0, or if f1 < 0 and f2 has a fractional
+          part, an ARG_OUT_OF_RANGE error occurs; otherwise f1 raised to
+          the f2 power is returned.
+
+   \ffpsqrt(f1,d)
+          If f1 >= 0, returns the square root of f1; otherwise
+          ARG_OUT_OF_RANGE.
+
+   \ffpabsolute(f1,d)
+          Returns the absolute value of f1 (i.e. f1 without a sign). This
+          is the floating-point analog of \fabsolute(n1).
+
+   \ffpint(f1)
+          Returns the integer part of f1. Equivalent to \ffpround(f1,-1).
+
+   \ffpexp(f1,d)
+          The base of natural logarithms, e (2.718282...), raised to the
+          f1 power.
+
+   \ffplogn(f1,d)
+          The natural logarithm of f1 (the power to which e must be
+          raised to obtain f1).
+
+   \ffplog10(f1,d)
+          The base-10 logarithm of f1 (the power to which 10 must be
+          raised to obtain f1).
+
+   \ffpmodulus(f1,f2,d)
+          If f2 is not 0, the remainder after dividing f1 by f2.
+          If f2 is 0, a DIVIDE_BY_ZERO error occurs.
+          This is the floating-point analog of \fmod(n1,n2).
+
+   \ffpmaximum(f1,f2,d)
+          Returns the maximum of f1 and f2. This is the floating-point
+          analog of \fmax(n1,n2).
+
+   \ffpminimum(f1,f2,d)
+          Returns the minimum of f1 and f2. This is the floating-point
+          analog of \fmin(n1,n2).
+
+   \ffpsine(f1,d)
+          Returns the sine of f1 radians.
+
+   \ffpcosine(f1,d)
+          Returns the cosine of f1 radians.
+
+   \ffptangent(f1,d)
+          Returns the tangent of f1 radians.
+
+   Note that all of these functions can be used with integer arguments.
+   If you want an integer result, specify d = -1 (to truncate) or feed
+   the result to \ffpround(xxx,0) (to round).
+
+   Floating-point numbers (or variables or functions that return them)
+   can be used in Boolean expressions (see [622]Section 7.20.2) that
+   compare numbers:
+
+  = x y
+  != x y
+  < x y
+  > x y
+  <= x y
+  >= x y
+
+   In these examples, x and y can be either integers or floating-point
+   numbers in any combination. In an arithmetic comparison of an integer
+   and a floating-point number, the integer is converted to
+   floating-point before the comparison is made. Examples:
+
+  .\%t = 3.000000000
+  .\%f = 3.141592653
+  .\%i = 3
+
+  if > \%f \%i echo Pi is greater.
+  if = \%t \%i echo "\%i" = "\%t".
+
+   A floating-point number can also be used in:
+
+  IF number command
+
+   where the command is executed if the number is nonzero. If the number
+   is floating-point, the command is not executed if the number is 0.0,
+   and is executed otherwise.
+
+   Floating-point numbers can be sorted using ARRAY SORT /NUMERIC (see
+   [623]Section 7.10.5 ).
+
+   Two floating-point constants are provided:
+
+  \v(math_pi) = Pi (3.141592653...)
+  \v(math_e)  = e, the base of natural logarithms (2.71828...)
+
+   These are given to the computer's precision, e.g. 16 digits. This
+   number itself is available in a variable:
+
+   \v(math_precision)
+          How many significant digits in a floating-point number.
+     _________________________________________________________________
+
+  7.24. Tracing Script Execution
+
+   The TRACE command is handy for debugging scripts.
+
+   TRACE [ { /ON, /OFF } ] [ { ASSIGNMENTS, COMMAND-LEVEL, ALL } ]
+          Selects tracing of the given object.
+
+   Optional switches are /ON and /OFF. If no switch is given, /ON is
+   implied. The trace objects are ASSIGNMENTS, COMMAND-LEVEL, and ALL.
+   The default object is ALL, meaning to select all trace objects
+   (besides ALL). Thus TRACE by itself selects tracing of everything, as
+   does TRACE /ON, and TRACE /OFF turns off all tracing.
+
+   When tracing of ASSIGNMENTS is on, every time the value of any
+   user-defined variable or macro changes, C-Kermit prints one of the
+   following:
+
+   >>> name: "value"
+          The name of the variable or macro followed by the new value in
+          quotes. This includes implicit macro-parameter assignments
+          during macro invocation.
+
+   >>> name: (undef)
+          This indicates that the variable or macro has been undefined.
+
+   <<< name: "value"
+          For RETURN statements: the name of the macro and the return
+          value.
+
+   <<< name: (null)
+          For RETURN statements that include no value or an empty value.
+
+   When tracing of COMMAND-LEVEL is on, C-Kermit prints:
+
+   [n] +F: "name"
+          Whenever a command file is entered, where "n" is the command
+          level (0 = top); the name of the command file is shown in
+          quotes.
+
+   [n] +M: "name"
+          Whenever a macro is entered; "n" is the command level. The name
+          of the macro is shown in quotes.
+
+   [n] -F: "name"
+          Whenever a command file is reentered from below, when a macro
+          or command file that it has invoked has returned.
+
+   [n] -M: "name"
+          Whenever a macro is reentered from below.
+
+   For other debugging tools, see SHOW ARGS, SHOW STACK, SET TAKE, SET
+   MACRO, and of course, ECHO.
+     _________________________________________________________________
+
+  7.25. Compact Substring Notation
+
+   It is often desirable to extract a substring from a string which is
+   stored in a variable, and for this we have the \fsubstring() function,
+   which is used like this:
+
+  define \%a 1234567890
+  echo \fsubstring(\%a,3,4) ; substring from 3rd character length 4
+  3456
+
+   or like this with macro-named variables:
+
+  define string 1234567890
+  echo \fsubstring(\m(string),3,4)
+  3456
+
+   C-Kermit 7.0 adds a pair of alternative compact notations:
+
+\:(variablename[start:length])  <-- Substring of variable's value
+\s(macroname[start:length])     <-- Substring of macro's definition
+
+   These are exactly equivalent to using \fsubstring(), except more
+   compact to write and also faster since evaluation is in one step
+   instead of two.
+
+   The "\:()" notation can be used with any Kermit variable, that is,
+   almost anything that starts with a backslash:
+
+  \:(\%a[2:6])      <-- equivalent to \fsubstring(\%a,2,6)
+  \:(\&x[1][2:6])   <-- equivalent to \fsubstring(\&x[1],2,6)
+  \:(\m(foo)[2:6])  <-- equivalent to \fsubstring(\m(foo),2,6)
+  \:(\v(time)[2:6]) <-- equivalent to \fsubstring(\v(time),2,6)
+  \:(\$(TERM)[2:6]) <-- equivalent to \fsubstring(\$(TERM),2,6)
+  \:(ABCDEFGH[2:6]) <-- equivalent to \fsubstring(ABCDEFGH,2,6)
+
+   Whatever appears between the left parenthesis and the left bracket is
+   evaluated and then the indicated substring of the result is returned.
+
+   The "\s()" notation is the same, except after evaluating the variable,
+   the result is treated as a macro name and is looked up in the macro
+   table. Then the indicated substring of the macro definition is
+   returned. Example:
+
+  define testing abcdefghijklmnopqrstuvwxyz
+  define \%a testing
+
+  \s(testing[2:6])  -->  bcdefg
+  \:(testing[2:6])  -->  esting
+  \:(\%a[2:6])      -->  esting
+  \s(\%a[2:6])      -->  bcdefg
+
+   Note that the following two examples are equivalent:
+
+  \:(\m(foo)[2:6])
+  \s(foo[2:6])
+
+   The first number in the brackets is the 1-based starting position. If
+   it is omitted, or less than 1, it is treated as 1. If it is greater
+   than the length of the string, an empty string is returned.
+
+   The second number is the length of the desired substring. If the
+   second number is omitted, is less than 0, or would be past the end of
+   the string, then "through the end of the string" is assumed. If it is
+   0, the empty string is returned.
+
+   If the brackets are empty or omitted, the original string is returned.
+
+   The starting position and length need not be literal numbers; they can
+   also be variables, functions, arithmetic expressions, or even other
+   \s() or \:() quantities; anything that evaluates to a number, for
+   example:
+
+  \s(block[1025:\fhex2n(\s(block[\%b:\%n+4]))/2])
+
+   Syntactically, \m(name) and \s(name) differ only in that the sequence
+   [*] at the end of the name (where * is any sequence of 0 or more
+   characters) is treated as substring notation in \s(name), but is
+   considered part of the name in \m(name) (to see why, see [624]Section
+   7.10.9).
+     _________________________________________________________________
+
+  7.26. New WAIT Command Options
+
+   The WAIT command has been extended to allow waiting for different
+   kinds of things (formerly it only waited for modem signals). Now it
+   also can wait for file events.
+
+    7.26.1. Waiting for Modem Signals
+
+   The previous syntax:
+
+  WAIT time { CD, DSR, RTS, RI, ... }
+
+   has changed to:
+
+  WAIT time MODEM-SIGNALS { CD, DSR, RTS, RI, ... }
+
+   However, the previous syntax is still accepted. The behavior is the
+   same in either case.
+     _________________________________________________________________
+
+    7.26.2. Waiting for File Events
+
+   The new WAIT option:
+
+  WAIT time FILE { CREATION, DELETION, MODIFICATION } filename
+
+   lets you tell Kermit to wait the given amount of time (or until the
+   given time of day) for a file whose name is filename to be created,
+   deleted, or modified, respectively. The filename may not contain
+   wildcards. If the specified event does not occur within the time
+   limit, or if WAIT CANCELLATION is ON and you interrupt from the
+   keyboard before the time is up, the WAIT command fails. If the event
+   is MODIFICATION and the file does not exist, the command fails.
+   Otherwise, if the given event occurs within the time limit, the
+   command succeeds. Examples:
+
+   WAIT 600 FILE DELETION oofa.tmp
+          Wait up to 10 minutes for file oofa.tmp to disappear.
+
+   WAIT 23:59:59 FILE MOD orders.db
+          Wait until just before midnight for the orders.db file to be
+          changed.
+
+   Example: Suppose you want to have the current copy of /etc/motd on
+   your screen at all times, and you want to hear a bell whenever it
+   changes:
+
+  def \%f /etc/motd                      ; The file of interest.
+  while 1 {                              ; Loop forever...
+      cls                                ; Clear the screen.
+      echo \%f: \v(date) \v(time)...     ; Print 2-line heading...
+      echo
+      if ( not exist \%f ) {             ; If file doesn't exist,
+          echo \%f does not exist...     ; print message,
+          wait 600 file creat \%f        ; and wait for it to appear.
+          continue
+      }
+      beep                               ; Something new - beep.
+      type /head:\v(rows-2) \%f          ; Display the file
+      if fail exit 1 \%f: \ferrstring()  ; (checking for errors).
+      wait 999 file mod \%f              ; Wait for it to change.
+  }
+
+   This notices when the file is created, deleted, or modified, and acts
+   only then (or when you interrupt it with); the time shown in the
+   heading is the time of the most recent event (including when the
+   program started).
+
+   See [625]Section 1.10, where the \v(kbchar) variable is explained.
+   This lets you modify a loop like the one above to also accept
+   single-character commands, which interrupt the WAIT, and dispatch
+   accordingly. For example:
+
+  wait 999 file mod \%f              ; Wait for the file to change.
+  if defined \v(kbchar) {            ; Interrupted from keyboard?
+      switch \v(kbchar) {            ; Handle the keystroke...
+        :q, exit                     ; Q to Quit
+        :h, echo blah blah, break    ; H for Help
+        :default, beep, continue     ; Anything else beep and ignore
+      }
+  }
+
+   This lets you write event-driven applications that wait for up to
+   three events at once: a file or modem event, a timeout, and a
+   keystroke.
+     _________________________________________________________________
+
+  7.27. Relaxed FOR and SWITCH Syntax
+
+   For consistency with the extended IF and WHILE syntax, the FOR and
+   SWITCH control lists may (but need not be) enclosed in parentheses:
+
+  FOR ( \%i 1 \%n 1 ) { command-list... }
+  SWITCH ( \%c ) { command-list... }
+
+   In the FOR command, the increment item can be omitted if the control
+   list is enclosed in parentheses, in which case the increment defaults
+   appropriately to 1 or -1, depending on the values of the first two
+   variables.
+
+   As with IF, the parentheses around the FOR-command control list must
+   be set off by spaces (in the SWITCH command, the spaces are not
+   required since the SWITCH expression is a single arithmetic
+   expression).
+
+   Also, outer braces around the command list are supplied automatically
+   if you omit them, e.g.:
+
+  FOR ( \%i 1 %n 1 ) echo \%i
+     _________________________________________________________________
+
+  8. USING OTHER FILE TRANSFER PROTOCOLS
+
+   In C-Kermit 7.0, alternative protocols can be selected using switches.
+   Switches are described in [626]Section 1.5; the use of
+   protocol-selection switches is described in [627]Section 4.7.1.
+   Example:
+
+  send /binary /protocol:zmodem x.tar.gz
+
+   Note that file transfer recovery works only with Kermit and Zmodem
+   protocols. With Zmodem, recovery can be initiated only by the sender.
+
+   Only pre-1988 versions of the publicly-distributed sz/rz programs use
+   Standard I/O; those released later than that do not use Standard I/O
+   and therefore do not work with REDIRECT. However, Omen Technology does
+   offer an up-to-date redirectable version called crzsz, which must be
+   licensed for use:
+
+     "Unix Crz and Csz support XMODEM, YMODEM, and ZMODEM transfers when
+     called by dial-out programs such as Kermit and certain versions of
+     cu(1). They are clients designed for this use.
+
+     "Crz and Csz are Copyrighted shareware programs. Use of these
+     programs beyond a brief evaluation period requires registration.
+     Please print the "mailer.rz" file, fill out the form and return
+     same with your registration."
+
+   To use the crzsz programs as your external XYZMODEM programs in
+   C-Kermit, follow the instructions in the book, but put a "c" before
+   each command, e.g.:
+
+  set protocol zmodem {csz %s} {csz -a %s} crz crz crz crz
+
+   To use Zmodem protocol over Telnet or other non-transparent
+   connections, you might need to add the -e (Escape) option:
+
+  set protocol zmodem {csz -e %s} {csz -e -a %s} crz crz crz crz
+     _________________________________________________________________
+
+  9. COMMAND-LINE OPTIONS
+
+  9.0. Extended-Format Command-Line Options
+
+   Standard UNIX command line options are a single letter. C-Kermit has
+   run out of letters, so new options are in a new extended format:
+
+ --word[:arg]
+
+   where a keyword (rather than a single letter) specifies the function,
+   and if an argument is to be included, it is separated by a colon (or
+   equal sign). Most of the new extended-format command-line options are
+   only for use with the Internet Kermit Service Daemon; see the
+   [628]IKSD Administration Guide for details. However, several of them
+   are also general in nature:
+
+   --nointerrupts
+          Disables keyboard interrupts that are normally enabled, which
+          are usually Ctrl-C (to interrupt a command) and Ctrl-Z (UNIX
+          only, to suspend C-Kermit).
+
+   --help
+          Lists the extended command-line options that are available in
+          your version of C-Kermit. If any options seem to be missing,
+          that is because your copy of C-Kermit was built with
+          compile-time options to deselect them.
+
+   --helpfile:filename
+          Specifies the name of a file to be displayed if the user types
+          HELP (not followed by a specific command or topic), in place of
+          the built-in top-level help text. The file need not fit on one
+          screen; more-prompting is used if the file is more than one
+          screen long if COMMAND MORE-PROMPTING is ON, as it is by
+          default.
+
+   --bannerfile:filename
+          The name of a file containing a message to be printed after the
+          user logs in, in place of the normal message (Copyright notice,
+          "Type HELP or ? for help", "Default transfer mode is...", etc).
+
+   --cdmessage:{on,off,0,1,2}
+          For use in the Server-Side Server configuration; whenever the
+          client tells the server to change directory, the server sends
+          the contents of a "read me" file to the client's screen. This
+          feature is On by default, and operates only in client/server
+          mode when ON or 1. If set to 2 or higher, it also operates when
+          the CD command is given at the IKSD> prompt. Synonym: --cdmsg.
+
+   --cdfile:filename
+          When cdmessage is on, this is the name of the "read me" file to
+          be sent. Normally you would specify a relative (not absolute)
+          name, since the file is opened using the literal name you
+          specified, after changing to the new directory. Example:
+
+  --cdfile:READ.ME
+
+          You can also give a list of up to 8 filenames by (a) enclosing
+          each filename in braces, and (b) enclosing the entire list in
+          braces. Example:
+          --cdfile:{{./.readme}{READ.ME}{aaareadme.txt}{README}{read-this
+          -first}} When a list is given, it is searched from left to
+          right and the first file found is displayed. The default list
+          for UNIX is:
+
+  {{./.readme}{README.TXT}{READ.ME}}
+     _________________________________________________________________
+
+  9.1. Command Line Personalities
+
+   Beginning in version 7.0, if the C-Kermit binary is renamed to
+   "telnet" (or TELNET.EXE, telnet.pr, etc, depending on the platform),
+   it accepts the Telnet command line:
+
+  telnet [ host [ port ] ]
+
+   In Unix, you can achieve the same effect with a symlink:
+
+  cd /usr/bin
+  mv telnet oldtelnet
+  ln -ls /usr/local/bin/kermit telnet
+
+   When installed in this manner, C-Kermit always reads its
+   initialization file. If no host (and therefore no port) is given,
+   C-Kermit starts in interactive prompting mode. If a host is given as
+   the first command-line argument, C-Kermit makes a connection to it.
+   The host argument can be an IP host name or address, or the name of a
+   TCP/IP entry in your C-Kermit network directory.
+
+   If a port is given, it is used. If a port is not given, then if the
+   hostname was found in your network directory and port was also listed
+   there, then that port is used. Otherwise port 23 (the Telnet port) is
+   used.
+
+   When C-Kermit is called "telnet" and it is invoked with a hostname on
+   the command line, it exits automatically when the connection is
+   closed. While the connection is open, however, you may escape back and
+   forth as many times as you like, transfer files, etc.
+
+   An rlogin personality is also available, but it is less useful, at
+   least in UNIX and VMS, where the Rlogin TCP port is privileged.
+
+   The new variable \v(name) indicates the name with which C-Kermit was
+   invoked ("kermit", "wermit", "k95", "telnet", etc).
+     _________________________________________________________________
+
+  9.2. Built-in Help for Command Line Options
+
+   "kermit -h", given from the system prompt, lists as many command-line
+   options as will fit on a standard 24x80 screen. For more comprehensive
+   help, use the interactive HELP OPTIONS command that was added in
+   C-Kermit 7.0:
+
+   HELP OPTIONS
+   Explains how command-line options work, their syntax, etc.
+
+   HELP OPTIONS ALL
+   Lists all command-line options and gives brief help about each one.
+
+   HELP OPTION x
+   Gives brief help about option "x".
+
+   HELP EXTENDED-OPTIONS
+   Lists the available extended-format command-line options.
+
+   HELP EXTENDED-OPTION xxx
+   Gives help for the specified extended option.
+     _________________________________________________________________
+
+  9.3. New Command-Line Options
+
+   Command-line options added since C-Kermit 6.0 are:
+
+   +
+          (plus sign by itself): The next argument is the name of a
+          script to execute; all subsequent arguments are ignored by
+          C-Kermit itself, but passed to the script as top-level copies
+          of \%1, \%2, etc; the \&_[] is also set accordingly. \%0 and
+          \&_[0] become the name of the script file, rather than the
+          pathname of the C-Kermit program, which is its normal value.
+          Primarily for use in the top line of "Kerbang" scripts in UNIX
+          (see [629]Section 7.19). Example from UNIX command line:
+
+  $ kermit [ regular kermit args ] + filename
+
+          Sample first line of Kerbang script:
+
+  #!/usr/local/bin/kermit +
+
+   --
+          (two hyphens surrounded by whitespace) Equivalent to "=", for
+          compatibility with UNIX getopt(1,3).
+
+   -G
+          GET (like -g), but send the incoming file to standard output.
+          Example: "kermit -G oofa.txt | lpr" retrieves a file from your
+          local computer (providing it is running a Kermit program that
+          supports the autodownload feature and has it enabled) and
+          prints it.
+
+   -O
+          equivalent to -x (start up in server mode), but exits after the
+          first client command has been executed (mnemonic: O = Only
+          One). This one is handy replacing "kermit -x" in the
+          "automatically start Kermit on the other end" string:
+
+  set protocol kermit {kermit -ir} {kermit -r} {kermit -x}
+
+          since -x leaves the remote Kermit in server mode after the
+          transfer, which can be confusing, whereas -O makes it go away
+          automatically after the transfer.
+
+   -L
+          Recursive, when used in combination with -s (mnemonic: L =
+          Levels). In UNIX or other environments where the shell expands
+          wildcards itself, the -s argument, if it contains wildcards,
+          must be quoted to prevent this, e.g.:
+
+  kermit -L -s "*.c"
+
+          In UNIX only, "kermit -L -s ." means to send the current
+          directory tree. See [630]Sections 4.10 and [631]4.11 about
+          recursive file transfer.
+
+   -V
+          Equivalent to SET FILE PATTERNS OFF ([632]Section 4.3) and SET
+          TRANSFER MODE MANUAL. In other words, take the FILE TYPE
+          setting literally. For example, "kermit -VT oofa.bin" means
+          send the file in Text mode, no matter what its name is and no
+          matter whether a kindred spirit is recognized at the other end
+          of the connection.
+
+   -0
+          (digit zero) means "be 100% transparent in CONNECT mode". This
+          is equivalent to the following series of commands: SET PARITY
+          NONE, SET COMMAND BYTESIZE 8, SET TERMINAL BYTESIZE 8, SET FLOW
+          NONE, SET TERM ESCAPE DISABLED, SET TERM CHAR TRANSPARENT, SET
+          TERM AUTODOWNLOAD OFF, SET TERM APC OFF, SET TELOPT KERMIT
+          REFUSE REFUSE.
+     _________________________________________________________________
+
+  10. C-KERMIT AND G-KERMIT
+
+   Every multifunctioned and long-lived software program grows in
+   complexity and size over time to meet the needs and requests of its
+   users and the demands of the underlying technology as it changes.
+
+   Eventually users begin to notice how big the application has grown,
+   how much disk space it occupies, how long it takes to load, and they
+   start to long for the good old days when it was lean and mean. Not
+   long after that they begin asking for a "light" version that only does
+   the basics with no frills.
+
+   And so it is with C-Kermit. A "light" version of Kermit was released
+   (for UNIX only) in December 1999 under the GNU General Public License;
+   thus it is called G-Kermit (for GNU Kermit). All it does is send and
+   receive files, period. You can find it at:
+
+  [633]http://www.columbia.edu/kermit/gkermit.html
+
+   Where the C-Kermit 7.0 binary might be anywhere from 1 to 3 million
+   bytes in size, the G-Kermit binary ranges from 30K to 100K, depending
+   on the underlying architecture (RISC vs CISC, etc).
+
+   G-Kermit and C-Kermit may reside side-by-side on the same computer.
+   G-Kermit does not make connections; it does not have a script
+   language; it does not translate character sets. G-Kermit may be used
+   instead of C-Kermit when:
+
+     * It is on the remote end.
+     * Files are to be transferred in binary mode or in text mode without
+       character-set translation.
+     * File timestamps don't need to be preserved.
+
+   In such cases G-Kermit might be preferred since it generally starts up
+   faster, and yet transfers files just as fast on most (but not
+   necessarily all) kinds of connections; for example, it supports
+   streaming ([634]Section 4.20).
+
+   G-Kermit is also handy for bootstrapping. It is easier to load on a
+   new computer than C-Kermit -- it fits on a floppy diskette with plenty
+   of room to spare. Thus if you have (say) an old PC running (say) SCO
+   Xenix and no network connection, you can download the Xenix version of
+   G-Kermit to (say) a DOS or Windows PC, copy it to diskette, read the
+   diskette on Xenix with "dosread", and then use G-Kermit to receive
+   C-Kermit (which does not fit on a diskette). If diskettes aren't an
+   option, other bootstrapping methods are possible too -- see the
+   [635]G-Kermit web page for details.
+     _________________________________________________________________
+
+III. APPENDICES
+
+  III.1. Character Set Tables
+
+    III.1.1. The Hewlett Packard Roman8 Character Set
+
+dec col/row oct hex  description
+160  10/00  240  A0  (Undefined)
+161  10/01  241  A1  A grave
+162  10/02  242  A2  A circumflex
+163  10/03  243  A3  E grave
+164  10/04  244  A4  E circumflex
+165  10/05  245  A5  E diaeresis
+166  10/06  246  A6  I circumflex
+167  10/07  247  A7  I diaeresis
+168  10/08  250  A8  Acute accent
+169  10/09  251  A9  Grave accent
+170  10/10  252  AA  Circumflex accent
+171  10/11  253  AB  Diaeresis
+172  10/12  254  AC  Tilde accent
+173  10/13  255  AD  U grave
+174  10/14  256  AE  U circumflex
+175  10/15  257  AF  Lira symbol
+176  11/00  260  B0  Top bar (macron)
+177  11/01  261  B1  Y acute
+178  11/02  262  B2  y acute
+179  11/03  263  B3  Degree Sign
+180  11/04  264  B4  C cedilla
+181  11/05  265  B5  c cedilla
+182  11/06  266  B6  N tilde
+183  11/07  267  B7  n tilde
+184  11/08  270  B8  Inverted exclamation mark
+185  11/09  271  B9  Inverted question mark
+186  11/10  272  BA  Currency symbol
+187  11/11  273  BB  Pound sterling symbol
+188  11/12  274  BC  Yen symbol
+189  11/13  275  BD  Paragraph
+190  11/14  276  BE  Florin (Guilder) symbol
+191  11/15  277  BF  Cent symbol
+192  12/00  300  C0  a circumflex
+193  12/01  301  C1  e circumflex
+194  12/02  302  C2  o circumflex
+195  12/03  303  C3  u circumflex
+196  12/04  304  C4  a acute
+197  12/05  305  C5  e acute
+198  12/06  306  C6  o acute
+199  12/07  307  C7  u acute
+200  12/08  310  C8  a grave
+201  12/09  311  C9  e grave
+202  12/10  312  CA  o grave
+203  12/11  313  CB  u grave
+204  12/12  314  CC  a diaeresis
+205  12/13  315  CD  e diaeresis
+206  12/14  316  CE  o diaeresis
+207  12/15  317  CF  u diaeresis
+208  13/00  320  D0  A ring
+209  13/01  321  D1  i circumflex
+210  13/02  322  D2  O with stroke
+211  13/03  323  D3  AE digraph
+212  13/04  324  D4  a ring
+213  13/05  325  D5  i acute
+214  13/06  326  D6  o with stroke
+215  13/07  327  D7  ae digraph
+216  13/08  330  D8  A diaeresis
+217  13/09  331  D9  i grave
+218  13/10  332  DA  O diaeresis
+219  13/11  333  DB  U diaeresis
+220  13/12  334  DC  E acute
+221  13/13  335  DD  i diaeresis
+222  13/14  336  DE  German sharp s
+223  13/15  337  DF  O circumflex
+224  14/00  340  E0  A acute
+225  14/01  341  E1  A tilde
+226  14/02  342  E2  a tilde
+227  14/03  343  E3  Icelandic Eth
+228  14/04  344  E4  Icelandic eth
+229  14/05  345  E5  I acute
+230  14/06  346  E6  I grave
+231  14/07  347  E7  O acute
+232  14/08  350  E8  O grave
+233  14/09  351  E9  O tilde
+234  14/10  352  EA  o tilde
+235  14/11  353  EB  S caron
+236  14/12  354  EC  s caron
+237  14/13  355  ED  U acute
+238  14/14  356  EE  Y diaeresis
+239  14/15  357  EF  y diaeresis
+240  15/00  360  F0  Icelandic Thorn
+241  15/01  361  F1  Icelandic thorn
+242  15/02  362  F2  Middle dot
+243  15/03  363  F3  Greek mu
+244  15/04  364  F4  Pilcrow sign
+245  15/05  365  F5  Fraction 3/4
+246  15/06  366  F6  Long dash, horizontal bar
+247  15/07  367  F7  Fraction 1/4
+248  15/08  370  F8  Fraction 1/2
+249  15/09  371  F9  Feminine ordinal
+250  15/10  372  FA  Masculine ordinal
+251  15/11  373  FB  Left guillemot
+252  15/12  374  FC  Solid box
+253  15/13  375  FD  Right guillemot
+254  15/14  376  FE  Plus or minus sign
+255  15/15  377  FF  (Undefined)
+     _________________________________________________________________
+
+    III.1.2. Greek Character Sets
+
+    III.1.2.1. The ISO 8859-7 Latin / Greek Alphabet = ELOT 928
+
+dec col/row oct hex  description
+160  10/00  240  A0  No-break space
+161  10/01  241  A1  Left single quotation mark
+162  10/02  242  A2  right single quotation mark
+163  10/03  243  A3  Pound sign
+164  10/04  244  A4  (UNUSED)
+165  10/05  245  A5  (UNUSED)
+166  10/06  246  A6  Broken bar
+167  10/07  247  A7  Paragraph sign
+168  10/08  250  A8  Diaeresis (Dialytika)
+169  10/09  251  A9  Copyright sign
+170  10/10  252  AA  (UNUSED)
+171  10/11  253  AB  Left angle quotation
+172  10/12  254  AC  Not sign
+173  10/13  255  AD  Soft hyphen
+174  10/14  256  AE  (UNUSED)
+175  10/15  257  AF  Horizontal bar (Parenthetiki pavla)
+176  11/00  260  B0  Degree sign
+177  11/01  261  B1  Plus-minus sign
+178  11/02  262  B2  Superscript two
+179  11/03  263  B3  Superscript three
+180  11/04  264  B4  Accent (tonos)
+181  11/05  265  B5  Diaeresis and accent (Dialytika and Tonos)
+182  11/06  266  B6  Alpha with accent
+183  11/07  267  B7  Middle dot (Ano Teleia)
+184  11/08  270  B8  Epsilon with accent
+185  11/09  271  B9  Eta with accent
+186  11/10  272  BA  Iota with accent
+187  11/11  273  BB  Right angle quotation
+188  11/12  274  BC  Omicron with accent
+189  11/13  275  BD  One half
+190  11/14  276  BE  Upsilon with accent
+191  11/15  277  BF  Omega with accent
+192  12/00  300  C0  iota with diaeresis and accent
+193  12/01  301  C1  Alpha
+194  12/02  302  C2  Beta
+195  12/03  303  C3  Gamma
+196  12/04  304  C4  Delta
+197  12/05  305  C5  Epsilon
+198  12/06  306  C6  Zeta
+199  12/07  307  C7  Eta
+200  12/08  310  C8  Theta
+201  12/09  311  C9  Iota
+202  12/10  312  CA  Kappa
+203  12/11  313  CB  Lamda
+204  12/12  314  CC  Mu
+205  12/13  315  CD  Nu
+206  12/14  316  CE  Ksi
+207  12/15  317  CF  Omicron
+208  13/00  320  D0  Pi
+209  13/01  321  D1  Rho
+210  13/02  322  D2  (UNUSED)
+211  13/03  323  D3  Sigma
+212  13/04  324  D4  Tau
+213  13/05  325  D5  Upsilon
+214  13/06  326  D6  Phi
+215  13/07  327  D7  Khi
+216  13/08  330  D8  Psi
+217  13/09  331  D9  Omega
+218  13/10  332  DA  Iota with diaeresis
+219  13/11  333  DB  Upsilon with diaeresis
+220  13/12  334  DC  alpha with accent
+221  13/13  335  DD  epsilon with accent
+222  13/14  336  DE  eta with accent
+223  13/15  337  DF  iota with accent
+224  14/00  340  E0  upsilon with diaeresis and accent
+225  14/01  341  E1  alpha
+226  14/02  342  E2  beta
+227  14/03  343  E3  gamma
+228  14/04  344  E4  delta
+229  14/05  345  E5  epsilon
+230  14/06  346  E6  zeta
+231  14/07  347  E7  eta
+232  14/08  350  E8  theta
+233  14/09  351  E9  iota
+234  14/10  352  EA  kappa
+235  14/11  353  EB  lamda
+236  14/12  354  EC  mu
+237  14/13  355  ED  nu
+238  14/14  356  EE  ksi
+239  14/15  357  EF  omicron
+240  15/00  360  F0  pi
+241  15/01  361  F1  rho
+242  15/02  362  F2  terminal sigma
+243  15/03  363  F3  sigma
+244  15/04  364  F4  tau
+245  15/05  365  F5  upsilon
+246  15/06  366  F6  phi
+247  15/07  367  F7  khi
+248  15/08  370  F8  psi
+249  15/09  371  F9  omega
+250  15/10  372  FA  iota with diaeresis
+251  15/11  373  FB  upsilon with diaeresis
+252  15/12  374  FC  omicron with diaeresis
+253  15/13  375  FD  upsilon with accent
+254  15/14  376  FE  omega with accent
+255  15/15  377  FF  (UNUSED)
+     _________________________________________________________________
+
+    III.1.2.2. The ELOT 927 Character Set
+
+dec col/row oct hex  description
+ 32  02/00   40  20  SPACE
+ 33  02/01   41  21  EXCLAMATION MARK
+ 34  02/02   42  22  QUOTATION MARK
+ 35  02/03   43  23  NUMBER SIGN
+ 36  02/04   44  24  DOLLAR SIGN
+ 37  02/05   45  25  PERCENT SIGN
+ 38  02/06   46  26  AMPERSAND
+ 39  02/07   47  27  APOSTROPHE
+ 40  02/08   50  28  LEFT PARENTHESIS
+ 41  02/09   51  29  RIGHT PARENTHESIS
+ 42  02/10   52  2A  ASTERISK
+ 43  02/11   53  2B  PLUS SIGN
+ 44  02/12   54  2C  COMMA
+ 45  02/13   55  2D  HYPHEN, MINUS SIGN
+ 46  02/14   56  2E  PERIOD, FULL STOP
+ 47  02/15   57  2F  SOLIDUS, SLASH
+ 48  03/00   60  30  DIGIT ZERO
+ 49  03/01   61  31  DIGIT ONE
+ 50  03/02   62  32  DIGIT TWO
+ 51  03/03   63  33  DIGIT THREE
+ 52  03/04   64  34  DIGIT FOUR
+ 53  03/05   65  35  DIGIT FIVE
+ 54  03/06   66  36  DIGIT SIX
+ 55  03/07   67  37  DIGIT SEVEN
+ 56  03/08   70  38  DIGIT EIGHT
+ 57  03/09   71  39  DIGIT NINE
+ 58  03/10   72  3A  COLON
+ 59  03/11   73  3B  SEMICOLON
+ 60  03/12   74  3C  LESS-THAN SIGN, LEFT ANGLE BRACKET
+ 61  03/13   75  3D  EQUALS SIGN
+ 62  03/14   76  3E  GREATER-THAN SIGN, RIGHT ANGLE BRACKET
+ 63  03/15   77  3F  QUESTION MARK
+ 64  04/00  100  40  COMMERCIAL AT SIGN
+ 65  04/01  101  41  CAPITAL LETTER A
+ 66  04/02  102  42  CAPITAL LETTER B
+ 67  04/03  103  43  CAPITAL LETTER C
+ 68  04/04  104  44  CAPITAL LETTER D
+ 69  04/05  105  45  CAPITAL LETTER E
+ 70  04/06  106  46  CAPITAL LETTER F
+ 71  04/07  107  47  CAPITAL LETTER G
+ 72  04/08  110  48  CAPITAL LETTER H
+ 73  04/09  111  49  CAPITAL LETTER I
+ 74  04/10  112  4A  CAPITAL LETTER J
+ 75  04/11  113  4B  CAPITAL LETTER K
+ 76  04/12  114  4C  CAPITAL LETTER L
+ 77  04/13  115  4D  CAPITAL LETTER M
+ 78  04/14  116  4E  CAPITAL LETTER N
+ 79  04/15  117  4F  CAPITAL LETTER O
+ 80  05/00  120  50  CAPITAL LETTER P
+ 81  05/01  121  51  CAPITAL LETTER Q
+ 82  05/02  122  52  CAPITAL LETTER R
+ 83  05/03  123  53  CAPITAL LETTER S
+ 84  05/04  124  54  CAPITAL LETTER T
+ 85  05/05  125  55  CAPITAL LETTER U
+ 86  05/06  126  56  CAPITAL LETTER V
+ 87  05/07  127  57  CAPITAL LETTER W
+ 88  05/08  130  58  CAPITAL LETTER X
+ 89  05/09  131  59  CAPITAL LETTER Y
+ 90  05/10  132  5A  CAPITAL LETTER Z
+ 91  05/11  133  5B  LEFT SQUARE BRACKET
+ 92  05/12  134  5C  REVERSE SOLIDUS, BACKSLASH
+ 93  05/13  135  5D  RIGHT SQUARE BRACKET
+ 94  05/14  136  5E  CIRCUMFLEX ACCENT
+ 95  05/15  137  5F  UNDERSCORE
+ 96  06/00  140  60  ACCENT GRAVE
+ 97  06/01  141  61  GREEK LETTER ALPHA
+ 98  06/02  142  62  GREEK LETTER BETA
+ 99  06/03  143  63  GREEK LETTER GAMMA
+100  06/04  144  64  GREEK LETTER DELTA
+101  06/05  145  65  GREEK LETTER EPSILON
+102  06/06  146  66  GREEK LETTER ZETA
+103  06/07  147  67  GREEK LETTER ETA
+104  06/08  150  68  GREEK LETTER THETA
+105  06/09  151  69  GREEK LETTER IOTA
+106  06/10  152  6A  GREEK LETTER KAPPA
+107  06/11  153  6B  GREEK LETTER LAMDA
+108  06/12  154  6C  GREEK LETTER MU
+109  06/13  155  6D  GREEK LETTER NU
+110  06/14  156  6E  GREEK LETTER KSI
+111  06/15  157  6F  GREEK LETTER OMICRON
+112  07/00  160  70  GREEK LETTER PI
+113  07/01  161  71  GREEK LETTER RHO
+114  07/02  162  72  GREEK LETTER SIGMA
+115  07/03  163  73  GREEK LETTER TAU
+116  07/04  164  74  GREEK LETTER UPSILON
+117  07/05  165  75  GREEK LETTER FI
+118  07/06  166  76  GREEK LETTER XI
+119  07/07  167  77  GREEK LETTER PSI
+120  07/08  170  78  GREEK LETTER OMEGA
+121  07/09  171  79  SPACE
+122  07/10  172  7A  SPACE
+123  07/11  173  7B  LEFT CURLY BRACKET, LEFT BRACE
+124  07/12  174  7C  VERTICAL LINE, VERTICAL BAR
+125  07/13  175  7D  RIGHT CURLY BRACKET, RIGHT BRACE
+126  07/14  176  7E  TILDE
+127  07/15  177  7F  RUBOUT, DELETE
+     _________________________________________________________________
+
+    III.1.2.3. PC Code Page 869
+
+   (to be filled in...)
+     _________________________________________________________________
+
+    III.2. Updated Country Codes
+
+   Date: Mon, 7 Apr 1997 23:23:49 EDT
+   From: Dave Leibold <dleibold@else.net>
+   Newsgroups: comp.dcom.telecom
+   Subject: Ex-USSR Country Codes Profile
+   Organization: TELECOM Digest
+
+   Ex-USSR Country Codes Profile
+   4 April 1997
+
+   Below is a summary of the country codes that have formed in the wake
+   of the USSR dissolution, along with some updated findings and reports.
+   Additional or corrected information on any of these nations would be
+   welcome (c/o dleibold@else.net).
+     * Kyrgyz Republic country code 996 will take effect, at least in
+       Canada, effective 1 May 1997, according to CRTC Telecom Order
+       97-464, based on Stentor Tariff Notice 433. There is no indication
+       whether there will be a permissive dialing period involved or for
+       how long such a permissive operation would remain.
+     * Country code 992 was reported as a recent assignment for
+       Tajikistan, which will be moving from country code 7 at some
+       unknown time.
+     * Uzbekistan has its own country code assignment, but I have no
+       information if this is in service yet or what implementation dates
+       have been set.
+     * Kazakstan does not have a known separate country code assignment
+       at present. It remains in country code 7 for the time being.
+     * Russia seems destined to keep country code 7.
+     * Recent news reports speak of some agreements forming between
+       Russia and Belarus. While there is no outright reunification yet,
+       there is expected to be much closer ties between the two nations.
+       Whether this will lead to a reunification of telephone codes
+       remains to be seen.
+
+   In the table, "Effective" means the date at which the country code
+   began service (which could vary according to the nation). "Mandatory"
+   means the date at which the country code 7 is invalid for calls to
+   that nation. There are a number of question marks since exact dates
+   have not been collected in all cases.
+
+CC  Nation            Effective     Mandatory    Notes
+
+370 Lithuania         1993?         ???          Announced Jan 1993
+371 Latvia            1993?         ???
+372 Estonia           1 Feb 1993?   March 1993?
+373 Moldova           1993?         ???          Announced Jan 1993
+374 Armenia           1 May 1995    1 July 1995  Announced Jan 1995 (ITU)
+375 Belarus           16 Apr 1995   1997?
+380 Ukraine           16 Apr 1995   Oct 1995?
+7   Kazakstan         (no known changes)
+7   Russia            (presumably not changing)
+992 Tajikistan        ???           ???          Announced 1996-7?
+993 Turkmenistan      3 Jan 1997    3 Apr 1997   Canada as of 29 Nov 1996
+994 Azerbaijan        Sept 1994?    ???          Announced 1992
+995 Georgia           1994?         ???          ref: Telecom Digest Oct 1994
+996 Kyrgyz Republic   1 May 1997    ???          ref: Stentor Canada/CRTC
+998 Uzbekistan        ???           ???          Announced 1996? (ITU)
+
+   Details courtesy Toby Nixon, ITU, Stentor (Canada), CRTC (Canada),
+   TELECOM Digest (including information collected for the country code
+   listings).
+     _________________________________________________________________
+
+IV. ERRATA & CORRIGENDA
+
+   The following errors in [636]Using C-Kermit, Second Edition, first
+   printing, have been noted.
+
+   First, some missing acknowledgements for C-Kermit 6.0: JE Jones of
+   Microware for help with OS-9, Nigel Roles for his help with Plan 9,
+   Lucas Hart for help with VMS and Digital UNIX, Igor Kovalenko for his
+   help with QNX. And later, to Susan Kleinmann for her help with Debian
+   Linux packaging; Patrick Volkerding for his help with Slackware Linux
+   packaging; Jim Knoble for his help with Red Hat Linux packaging; and
+   to dozens of others for sending individual C-Kermit binaries for
+   varied and diverse platforms.
+
+   Thanks to James Spath for both binaries and reporting many of the
+   typos noted below. Also to Dat Thuc Nguyen for spotting several typos.
+
+PAGE    REMARKS
+COVER   "COS" is a misprint.  There is no COS.  Pretend it says "SCO" or "VOS".
+        (This is fixed in the second printing.)
+ xxi    Second line: Fred Smith's affiliation should be Computrition.
+ 83     Change "commands other" to "commands as other" (1st paragraph)
+ 87     Change "The the" to "The" (2nd paragraph)
+ 92     "set modem-type user-defined supra" should be "set modem type ..."
+ 95     Change "VI" to "vi" (1st paragraph)
+ 96     Change "it it" to "it is" (1st paragraph)
+ 97     Change "advantage a literal" to "advantage of a literal" (2nd
+        paragraph)
+102     The call-waiting example would be better as SET DIAL PREFIX *70W
+        (rather than "*70,") because the former will not cause an incorrect
+        call to be placed with pulse dialing.
+123     Third paragraph from bottom: "..otherwise if a your local username.."
+        should be "..otherwise your local username..".
+160     Delete the "it" between "and" and "to" (2nd paragraph)
+185     In "When TRANSFER DISPLAY is OFF, C-Kermit skips the display...",
+        "OFF" should be "NONE".
+187     The last paragraph says the "A command" is ignored, should be "S".
+194     Change "it known" to "it is known" (4th paragraph).
+235     In C-Kermit 7.0, the syntax of the GET command changed.  MGET now
+        must be used to get a list of files and there is no more multiline
+        GET command.
+268     Last paragraph: "effect" should be "affect".
+275     In the SET PROTOCOL KERMIT description, the following sentence is
+        incorrect and should be removed: 'If you omit the commands, the
+        default ones are restored: "kermit -ir" and "kermit -r" respectively".
+        The correct information is given at the bottom of page 281.
+279     9th line.  The decimal value of ST is 156, not 155.
+295     In the stepping stones, skip ahead to Chapter 17 on p. 327.
+298     Table 16-2, Portuguese entry.  Column 4/00 should show section sign,
+        not acute accent.
+316     Other languages written in the Hebrew alphabet include Karaim (a Turkic
+        language spoken in Lithuania and Poland), Judeo-Kurdish, and Judeo-
+        Georgian.
+332     UNDEFINE definition, change "This just" to "This is just".
+344     It might be necessary to set the modem's pulse generation rate when
+        sending numeric pages; most Hayes compatible modems use the S11
+        register for this.
+350     Delete "is" from between "It" and "ceases" (4th paragraph)
+351     Top - both occurrences of "print \%a" should be "echo \%a".
+364     \v(input) and \v(query) out of alphabetical order.
+378     In the MYSEND macro, "if not \m(rc) goto bad" should be:
+        "if \m(rc) goto bad" (remove the "not").
+382-383 It should be stated that the loop control variable must be of the \%a
+        type, or else an array element; macro names can not be used for this.
+383     In line 3, "\%f[\%i]" should be "\&f[\%i]".
+383     In the sort example, it should be stated that the array is 1-based.
+387     Change "You can list" to "You can get a list" (5th paragraph)
+393     \Fverify() description.  The 3rd sentence could be stated more clearly
+        as "If all characters in string2 are also in string1, 0 is returned."
+398     Copying \ffiles() results to an array before is not required as of
+        C-Kermit 7.0 (see [637]Section 7.3).
+403     In "(\%a + 3) * (\%b  5)", a minus sign is missing between b and 5.
+407     C-Kermit 7.0 no longer supports multiline GET.  Change
+        "get, \%1, \%2" to "get {\%1} {\%2}" or "get /as:{\%2} {\%1}".
+409     READ example while loop should be:
+        while success { echo \m(line), read line }
+409     "WRITE file" should be "WRITE keyword" (you can't put a filename there)
+        (The same applies to WRITE-LINE / WRITELN).
+414     \Funhexify() missing from Table 18-3.
+425     MINPUT definition, change 2nd "text2" to "text3".
+436     Several lines are missing from the UNIXLOGIN macro listing.
+        After the "xif fail" block, insert:
+
+          out \%1\13                    ; Send username, carriage return
+          inp 5 Password:               ; Wait 5 sec for this prompt
+          if fail end 1 No password prompt
+          pause                         ; Wait a sec
+          out \%2\13                    ; Send password
+
+440     Change "set terminal byteszie" to "set terminal bytesize".
+        Change "input Password:" to "input 10 Password".
+448     Franchise script: "access line" should be "access \m(line)".
+453     There are two incorrectly coded IF statements in the DELIVER macro
+        definition.  Replace both occurrences of "if > \%1 \%3 {" with
+        "xif > \%i \%3 {" (replace "if" by "xif" and "\%1" with "\%i").
+453     "the the" (last paragraph) should be "the".
+454     EOT (last paragraph) is End of Transmission, not End of Text.
+457     _DEFINE definition: "name constructed" should be "name is constructed".
+457     "macro for and" (last paragraph) should be "macro and".
+459     Should explain that \v(user) is a legal abbreviation of \v(userid).
+480     Figure II-2 is backwards; the least-significant bit is transmitted
+        first, then up to the highest, and the parity bit last.
+534     The VMS Appendix section on Odd Record Lengths no longer applies;
+        C-Kermit 7.0 handles odd record lengths as well as even ones.
+559     Table VIII-3, Portuguese entry.  Column 4/00 should show section sign,
+        not acute accent.
+560-563 HP-Roman8 missing from Table VII-4; there wasn't room to squeeze it in.
+        It is listed in section II(6).
+565     "d stroke" in Table VII-5 has the wrong appearance; the stem should
+        be upright.  The letter shown in the table is actually a lowercase
+        Icelandic eth, which has a curved stem.
+601-604 BeBox, BeOS, Plan 9, and probably others not listed in trademarks.
+604     The words "SCRIBE TEXT FORMATTER" appear at the end of the last
+        sentence of the first paragraph of the Colophon.  They should have
+        been in the Index.
+Index:  Missing entries: SET { SEND, RECEIVE } PATHNAMES, Call waiting, ...
+        \F()            Page 605, add also 413-414
+        \Fbreak         389
+        \Fcapitalize    390
+        \Fchecksum      414
+        \Fcrc16         414
+        \Fexecute       414
+        \Fhexify        390
+        \Fltrim         391
+        \Frepeat        392
+        \Fspawn         392
+        \Ftod2secs      399
+        \v() built_in   Page 606, add also 361-364
+        \v(_line)       354, 361
+        \v(apcactive)   361
+        \v(charset)     362
+        \v(cpu)         362
+        \v(crc16)       357, 362
+        \v(d$xxx)       add page 362
+        \v(dialnumber)  362
+        \v(dialresult)  362
+        \v(errno)       362
+        \v(errstring)   362
+        \v(exedir)      362
+        \v(inidir)      363
+        \v(ipaddress)   363
+        \v(keyboard)    363
+        \v(macro)       363
+        \v(minput)      363
+        \v(m_xxx)       94, 363
+        \v(password)    364
+        \v(query)       364
+        \v(prompt)      364
+        \v(speed)       356, 364
+        \v(startup)     364
+        \v(status)      364
+        \v(sysid)       364
+        \v(system)      364
+        \v(fsize)       at lower half page 606 should read \v(tfsize)
+        \v(xversion)    364
+        BEEP Command    40
+        SET FLOW        62, 212
+
+   Figure II-5 on page 493. The pin assignments of the Mini Din-8
+   connector are not described anywhere. As noted in the text, these tend
+   to vary from vendor to vendor. One common arrangement is:
+
+  1. HSKout (Handshake out -- definition depends on software)
+  2. HSKin  (Handshake in or external clock)
+  3. TxD-
+  4. Not used
+  5. RxD-
+  6. TxD+
+  7. Not used
+  8. RxD+
+
+   Note the "balanced pairs" for Receive Data (RxD) and Transmit Data
+   (TxD), and the utter lack of modem signals. These connectors follow
+   the RS-423 standard, rather than RS-232. In some arrangements, Pin 1
+   is used for DTR and Pin 2 for CD; in others Pin 1 is RTS and Pin 2 is
+   CTS.
+
+   Please send reports of other errors to the authors, as well as
+   suggestions for improvements, additional index entries, and any other
+   comments:
+
+   [638]kermit@columbia.edu
+     _________________________________________________________________
+
+APPENDIX V. ADDITIONAL COPYRIGHT NOTICES
+
+   The following copyrights cover some of the source code used in the
+   development of C-Kermit, Kermit 95, or Kermit 95 support libraries.
+
+/*****************************************************************************/
+/*                                                                           */
+/*              Copyright (c) 1995 by Oy Online Solutions Ltd.               */
+/*                                                                           */
+/*   Distribution of this source code is strictly forbbidden. Use of this    */
+/*   source code is granted to the University of Columbia C-Kermit project   */
+/*   to be distributed in binary format only. Please familiarize yourself    */
+/*   with the accompanying LICENSE.P file.                                   */
+/*                                                                           */
+/*****************************************************************************/
+
+   used for Xmodem, Ymodem, and Zmodem protocol in Kermit 95 (p95.dll,
+   p2.dll)
+     _________________________________________________________________
+
+   Copyright (c) 1997 Stanford University
+
+   The use of this software for revenue-generating purposes may require a
+   license from the owners of the underlying intellectual property.
+   Specifically, the SRP-3 protocol may not be used for
+   revenue-generating purposes without a license.
+
+   Within that constraint, permission to use, copy, modify, and
+   distribute this software and its documentation for any purpose is
+   hereby granted without fee, provided that the above copyright notices
+   and this permission notice appear in all copies of the software and
+   related documentation.
+
+   THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+   EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+   WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+   IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+   INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT
+   ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY,
+   ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+   SOFTWARE.
+
+   Used for Secure Remote Password (TM) protocol (SRP) in C-Kermit,
+   Kermit 95 (k95.exe, k2.exe, k95crypt.dll, k2crypt.dll)
+     _________________________________________________________________
+
+   Copyright 1990 by the Massachusetts Institute of Technology. All
+   Rights Reserved.
+
+   Export of this software from the United States of America may require
+   a specific license from the United States Government. It is the
+   responsibility of any person or organization contemplating export to
+   obtain such a license before exporting.
+
+   WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
+   distribute this software and its documentation for any purpose and
+   without fee is hereby granted, provided that the above copyright
+   notice appear in all copies and that both that copyright notice and
+   this permission notice appear in supporting documentation, and that
+   the name of M.I.T. not be used in advertising or publicity pertaining
+   to distribution of the software without specific, written prior
+   permission. M.I.T. makes no representations about the suitability of
+   this software for any purpose. It is provided "as is" without express
+   or implied warranty.
+
+   Used for Telnet Authentication Option, Telnet Encryption Option, and
+   Kerberos (TM) authentication in C-Kermit, Kermit 95 (k95.exe, k2.exe,
+   k95crypt.dll, k2crypt.dll)
+     _________________________________________________________________
+
+   Copyright (c) 1991, 1993 The Regents of the University of California.
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are
+   met:
+    1. Redistributions of source code must retain the above copyright
+       notice, this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+       notice, this list of conditions and the following disclaimer in
+       the documentation and/or other materials provided with the
+       distribution.
+    3. All advertising materials mentioning features or use of this
+       software must display the following acknowledgement:
+
+     This product includes software developed by the University of
+     California, Berkeley and its contributors.
+    4. Neither the name of the University nor the names of its
+       contributors may be used to endorse or promote products derived
+       from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS''
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+   PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
+   BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+   BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+   OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+   Used for Telnet Authentication Option, Telnet Encryption Option, and
+   Kerberos (TM) authentication in C-Kermit, Kermit 95 (k95.exe, k2.exe,
+   k95crypt.dll, k2crypt.dll)
+     _________________________________________________________________
+
+   Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) All rights
+   reserved.
+
+   This package is an DES implementation written by Eric Young
+   (eay@cryptsoft.com). The implementation was written so as to conform
+   with MIT's libdes.
+
+   This library is free for commercial and non-commercial use as long as
+   the following conditions are aheared to. The following conditions
+   apply to all code found in this distribution.
+
+   Copyright remains Eric Young's, and as such any Copyright notices in
+   the code are not to be removed. If this package is used in a product,
+   Eric Young should be given attribution as the author of that the SSL
+   library. This can be in the form of a textual message at program
+   startup or in documentation (online or textual) provided with the
+   package.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are
+   met:
+    1. Redistributions of source code must retain the copyright notice,
+       this list of conditions and the following disclaimer.
+    2. Redistributions in binary form must reproduce the above copyright
+       notice, this list of conditions and the following disclaimer in
+       the documentation and/or other materials provided with the
+       distribution.
+    3. All advertising materials mentioning features or use of this
+       software must display the following acknowledgement: This product
+       includes software developed by Eric Young (eay@cryptsoft.com)
+
+   THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND ANY EXPRESS OR
+   IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+   ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+   IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+   OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+   The license and distribution terms for any publically available
+   version or derivative of this code cannot be changed. i.e. this code
+   cannot simply be copied and put under another distrubution license
+   [including the GNU Public License.]
+
+   The reason behind this being stated in this direct manner is past
+   experience in code simply being copied and the attribution removed
+   from it and then being distributed as part of other packages. This
+   implementation was a non-trivial and unpaid effort.
+
+   Used DES encryption in Kermit 95 (k95crypt.dll, k2crypt.dll)
+     _________________________________________________________________
+
+ * This is version 1.1 of CryptoLib
+ *
+ * The authors of this software are Jack Lacy, Don Mitchell and Matt Blaze
+ *              Copyright (c) 1991, 1992, 1993, 1994, 1995 by AT&T.
+ * Permission to use, copy, and modify this software without fee
+ * is hereby granted, provided that this entire notice is included in
+ * all copies of any software which is or includes a copy or
+ * modification of this software and in all copies of the supporting
+ * documentation for such software.
+ *
+ * NOTE:
+ * Some of the algorithms in cryptolib may be covered by patents.
+ * It is the responsibility of the user to ensure that any required
+ * licenses are obtained.
+ *
+ *
+ * SOME PARTS OF CRYPTOLIB MAY BE RESTRICTED UNDER UNITED STATES EXPORT
+ * REGULATIONS.
+ *
+ *
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR AT&T MAKE ANY
+ * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+
+   Used for Big Number library in Kermit 95 (k95crypt.dll, k2crypt.dll).
+
+   [ [639]Top ] [ [640]C-Kermit ] [ [641]Kermit Home ]
+     _________________________________________________________________
+
+   CKERMIT70.HTM / The Kermit Project / Columbia University / 8 Feb 2000
+
+References
+
+   1. http://www.columbia.edu/kermit/ckermit70.html#contents
+   2. http://www.columbia.edu/kermit/ckermit.html
+   3. http://www.columbia.edu/kermit/index.htm
+   4. mailto:kermit-support@columbia.edu
+   5. http://www.columbia.edu/kermit/
+   6. http://www.kermit-project.org/
+   7. http://www.columbia.nyc.ny.us/kermit/
+   8. ftp://kermit.columbia.edu/kermit/f/COPYING.TXT
+   9. ftp://kermit.columbia.edu/kermit/f/ckcmai.c
+  10. http://www.columbia.edu/kermit/ckermit70.html#xv
+  11. http://www.columbia.edu/kermit/ckb2.htm
+  12. ftp://kermit.columbia.edu/kermit/f/ckcbwr.txt
+  13. ftp://kermit.columbia.edu/kermit/f/ckubwr.txt
+  14. ftp://kermit.columbia.edu/kermit/f/ckvbwr.txt
+  15. ftp://kermit.columbia.edu/kermit/f/ckubwr.txt
+  16. ftp://kermit.columbia.edu/kermit/f/ckermit70.txt
+  17. ftp://kermit.columbia.edu/kermit/f/security.txt
+  18. http://www.columbia.edu/kermit/security.htm
+  19. ftp://kermit.columbia.edu/kermit/f/iksd.txt
+  20. http://www.columbia.edu/kermit/iksd.htm
+  21. http://www.columbia.edu/kermit/cuiksd.htm
+  22. ftp://kermit.columbia.edu/kermit/f/telnet.txt
+  23. http://www.columbia.edu/kermit/telnet.htm
+  24. ftp://kermit.columbia.edu/kermit/f/COPYING.TXT
+  25. http://www.columbia.edu/kermit/k95.html
+  26. http://www.opensource.org/
+  27. http://www.columbia.edu/kermit/ckb2.htm
+  28. http://www.columbia.edu/kermit/ckermit70.html#xi
+  29. http://www.columbia.edu/kermit/ckermit70.html#xii
+  30. http://www.columbia.edu/kermit/ckermit70.html#x0
+  31. http://www.columbia.edu/kermit/ckermit70.html#x1
+  32. http://www.columbia.edu/kermit/ckermit70.html#x1.0
+  33. http://www.columbia.edu/kermit/ckermit70.html#x1.1
+  34. http://www.columbia.edu/kermit/ckermit70.html#x1.2
+  35. http://www.columbia.edu/kermit/ckermit70.html#x1.3
+  36. http://www.columbia.edu/kermit/ckermit70.html#x1.4
+  37. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+  38. http://www.columbia.edu/kermit/ckermit70.html#x1.5.1
+  39. http://www.columbia.edu/kermit/ckermit70.html#x1.5.2
+  40. http://www.columbia.edu/kermit/ckermit70.html#x1.5.3
+  41. http://www.columbia.edu/kermit/ckermit70.html#x1.5.4
+  42. http://www.columbia.edu/kermit/ckermit70.html#x1.5.5
+  43. http://www.columbia.edu/kermit/ckermit70.html#x1.6
+  44. http://www.columbia.edu/kermit/ckermit70.html#x1.7
+  45. http://www.columbia.edu/kermit/ckermit70.html#x1.8
+  46. http://www.columbia.edu/kermit/ckermit70.html#x1.9
+  47. http://www.columbia.edu/kermit/ckermit70.html#x1.10
+  48. http://www.columbia.edu/kermit/ckermit70.html#x1.11
+  49. http://www.columbia.edu/kermit/ckermit70.html#x1.11.1
+  50. http://www.columbia.edu/kermit/ckermit70.html#x1.11.2
+  51. http://www.columbia.edu/kermit/ckermit70.html#x1.11.3
+  52. http://www.columbia.edu/kermit/ckermit70.html#x1.11.4
+  53. http://www.columbia.edu/kermit/ckermit70.html#x1.11.5
+  54. http://www.columbia.edu/kermit/ckermit70.html#x1.11.6
+  55. http://www.columbia.edu/kermit/ckermit70.html#x1.11.7
+  56. http://www.columbia.edu/kermit/ckermit70.html#x1.12
+  57. http://www.columbia.edu/kermit/ckermit70.html#x1.13
+  58. http://www.columbia.edu/kermit/ckermit70.html#x1.14
+  59. http://www.columbia.edu/kermit/ckermit70.html#x1.15
+  60. http://www.columbia.edu/kermit/ckermit70.html#x1.16
+  61. http://www.columbia.edu/kermit/ckermit70.html#x1.17
+  62. http://www.columbia.edu/kermit/ckermit70.html#x1.18
+  63. http://www.columbia.edu/kermit/ckermit70.html#x1.19
+  64. http://www.columbia.edu/kermit/ckermit70.html#x1.20
+  65. http://www.columbia.edu/kermit/ckermit70.html#x1.21
+  66. http://www.columbia.edu/kermit/ckermit70.html#x1.22
+  67. http://www.columbia.edu/kermit/ckermit70.html#x1.22.1
+  68. http://www.columbia.edu/kermit/ckermit70.html#x1.22.2
+  69. http://www.columbia.edu/kermit/ckermit70.html#x1.22.3
+  70. http://www.columbia.edu/kermit/ckermit70.html#x1.22.4
+  71. http://www.columbia.edu/kermit/ckermit70.html#x1.22.5
+  72. http://www.columbia.edu/kermit/ckermit70.html#x1.22.6
+  73. http://www.columbia.edu/kermit/ckermit70.html#x1.22.7
+  74. http://www.columbia.edu/kermit/ckermit70.html#x1.22.8
+  75. http://www.columbia.edu/kermit/ckermit70.html#x1.23
+  76. http://www.columbia.edu/kermit/ckermit70.html#x1.24
+  77. http://www.columbia.edu/kermit/ckermit70.html#x2
+  78. http://www.columbia.edu/kermit/ckermit70.html#x2.0
+  79. http://www.columbia.edu/kermit/ckermit70.html#x2.1
+  80. http://www.columbia.edu/kermit/ckermit70.html#x2.1.1
+  81. http://www.columbia.edu/kermit/ckermit70.html#x2.1.2
+  82. http://www.columbia.edu/kermit/ckermit70.html#x2.1.3
+  83. http://www.columbia.edu/kermit/ckermit70.html#x2.1.4
+  84. http://www.columbia.edu/kermit/ckermit70.html#x2.1.5
+  85. http://www.columbia.edu/kermit/ckermit70.html#x2.1.6
+  86. http://www.columbia.edu/kermit/ckermit70.html#x2.1.7
+  87. http://www.columbia.edu/kermit/ckermit70.html#x2.1.8
+  88. http://www.columbia.edu/kermit/ckermit70.html#x2.1.9
+  89. http://www.columbia.edu/kermit/ckermit70.html#x2.1.10
+  90. http://www.columbia.edu/kermit/ckermit70.html#x2.1.11
+  91. http://www.columbia.edu/kermit/ckermit70.html#x2.1.12
+  92. http://www.columbia.edu/kermit/ckermit70.html#x2.1.13
+  93. http://www.columbia.edu/kermit/ckermit70.html#x2.1.14
+  94. http://www.columbia.edu/kermit/ckermit70.html#x2.1.15
+  95. http://www.columbia.edu/kermit/ckermit70.html#x2.1.16
+  96. http://www.columbia.edu/kermit/ckermit70.html#x2.2
+  97. http://www.columbia.edu/kermit/ckermit70.html#x2.2.1
+  98. http://www.columbia.edu/kermit/ckermit70.html#x2.2.2
+  99. http://www.columbia.edu/kermit/ckermit70.html#x2.3
+ 100. http://www.columbia.edu/kermit/ckermit70.html#x2.3.0
+ 101. http://www.columbia.edu/kermit/ckermit70.html#x2.3.1
+ 102. http://www.columbia.edu/kermit/ckermit70.html#x2.3.2
+ 103. http://www.columbia.edu/kermit/ckermit70.html#x2.3.3
+ 104. http://www.columbia.edu/kermit/ckermit70.html#x2.3.4
+ 105. http://www.columbia.edu/kermit/ckermit70.html#x2.3.5
+ 106. http://www.columbia.edu/kermit/ckermit70.html#x2.3.6
+ 107. http://www.columbia.edu/kermit/ckermit70.html#x2.4
+ 108. http://www.columbia.edu/kermit/ckermit70.html#x2.5
+ 109. http://www.columbia.edu/kermit/ckermit70.html#x2.6
+ 110. http://www.columbia.edu/kermit/ckermit70.html#x2.7
+ 111. http://www.columbia.edu/kermit/ckermit70.html#x2.7.0
+ 112. http://www.columbia.edu/kermit/ckermit70.html#x2.7.1
+ 113. http://www.columbia.edu/kermit/ckermit70.html#x2.7.2
+ 114. http://www.columbia.edu/kermit/ckermit70.html#x2.7.3
+ 115. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4
+ 116. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4.1
+ 117. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4.2
+ 118. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4.3
+ 119. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4.4
+ 120. http://www.columbia.edu/kermit/ckermit70.html#x2.7.4.5
+ 121. http://www.columbia.edu/kermit/ckermit70.html#x2.8
+ 122. http://www.columbia.edu/kermit/ckermit70.html#x2.9
+ 123. http://www.columbia.edu/kermit/ckermit70.html#x2.9.1
+ 124. http://www.columbia.edu/kermit/ckermit70.html#x2.9.2
+ 125. http://www.columbia.edu/kermit/ckermit70.html#x2.10
+ 126. http://www.columbia.edu/kermit/ckermit70.html#x2.11
+ 127. http://www.columbia.edu/kermit/ckermit70.html#x2.12
+ 128. http://www.columbia.edu/kermit/ckermit70.html#x2.13
+ 129. http://www.columbia.edu/kermit/ckermit70.html#x2.14
+ 130. http://www.columbia.edu/kermit/ckermit70.html#x2.15
+ 131. http://www.columbia.edu/kermit/ckermit70.html#x3
+ 132. http://www.columbia.edu/kermit/ckermit70.html#x3.1
+ 133. http://www.columbia.edu/kermit/ckermit70.html#x3.2
+ 134. http://www.columbia.edu/kermit/ckermit70.html#x3.3
+ 135. http://www.columbia.edu/kermit/ckermit70.html#x3.4
+ 136. http://www.columbia.edu/kermit/ckermit70.html#x4
+ 137. http://www.columbia.edu/kermit/ckermit70.html#x4.0
+ 138. http://www.columbia.edu/kermit/ckermit70.html#x4.1
+ 139. http://www.columbia.edu/kermit/ckermit70.html#x4.1.1
+ 140. http://www.columbia.edu/kermit/ckermit70.html#x4.1.2
+ 141. http://www.columbia.edu/kermit/ckermit70.html#x4.1.3
+ 142. http://www.columbia.edu/kermit/ckermit70.html#x4.2
+ 143. http://www.columbia.edu/kermit/ckermit70.html#x4.2.1
+ 144. http://www.columbia.edu/kermit/ckermit70.html#x4.2.1.1
+ 145. http://www.columbia.edu/kermit/ckermit70.html#x4.2.1.2
+ 146. http://www.columbia.edu/kermit/ckermit70.html#x4.2.1.3
+ 147. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2
+ 148. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2.1
+ 149. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2.2
+ 150. http://www.columbia.edu/kermit/ckermit70.html#x4.2.3
+ 151. http://www.columbia.edu/kermit/ckermit70.html#x4.2.3.1
+ 152. http://www.columbia.edu/kermit/ckermit70.html#x4.2.3.2
+ 153. http://www.columbia.edu/kermit/ckermit70.html#x4.2.4
+ 154. http://www.columbia.edu/kermit/ckermit70.html#x4.2.5
+ 155. http://www.columbia.edu/kermit/ckermit70.html#x4.2.6
+ 156. http://www.columbia.edu/kermit/ckermit70.html#x4.2.7
+ 157. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8
+ 158. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.1
+ 159. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.2
+ 160. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.3
+ 161. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.4
+ 162. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 163. http://www.columbia.edu/kermit/ckermit70.html#x4.3.1
+ 164. http://www.columbia.edu/kermit/ckermit70.html#x4.3.2
+ 165. http://www.columbia.edu/kermit/ckermit70.html#x4.3.3
+ 166. http://www.columbia.edu/kermit/ckermit70.html#x4.3.4
+ 167. http://www.columbia.edu/kermit/ckermit70.html#x4.4
+ 168. http://www.columbia.edu/kermit/ckermit70.html#x4.4.1
+ 169. http://www.columbia.edu/kermit/ckermit70.html#x4.4.1.1
+ 170. http://www.columbia.edu/kermit/ckermit70.html#x4.4.1.2
+ 171. http://www.columbia.edu/kermit/ckermit70.html#x4.4.2
+ 172. http://www.columbia.edu/kermit/ckermit70.html#x4.4.2.1
+ 173. http://www.columbia.edu/kermit/ckermit70.html#x4.4.2.1.1
+ 174. http://www.columbia.edu/kermit/ckermit70.html#x4.4.2.1.2
+ 175. http://www.columbia.edu/kermit/ckermit70.html#x4.4.2.2
+ 176. http://www.columbia.edu/kermit/ckermit70.html#x4.5
+ 177. http://www.columbia.edu/kermit/ckermit70.html#x4.5.1
+ 178. http://www.columbia.edu/kermit/ckermit70.html#x4.5.2
+ 179. http://www.columbia.edu/kermit/ckermit70.html#x4.5.2.1
+ 180. http://www.columbia.edu/kermit/ckermit70.html#x4.5.2.2
+ 181. http://www.columbia.edu/kermit/ckermit70.html#x4.5.3
+ 182. http://www.columbia.edu/kermit/ckermit70.html#x4.5.4
+ 183. http://www.columbia.edu/kermit/ckermit70.html#x4.6
+ 184. http://www.columbia.edu/kermit/ckermit70.html#x4.7
+ 185. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 186. http://www.columbia.edu/kermit/ckermit70.html#x4.7.2
+ 187. http://www.columbia.edu/kermit/ckermit70.html#x4.7.3
+ 188. http://www.columbia.edu/kermit/ckermit70.html#x4.8
+ 189. http://www.columbia.edu/kermit/ckermit70.html#x4.8.1
+ 190. http://www.columbia.edu/kermit/ckermit70.html#x4.8.2
+ 191. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 192. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 193. http://www.columbia.edu/kermit/ckermit70.html#x4.9.2
+ 194. http://www.columbia.edu/kermit/ckermit70.html#x4.9.3
+ 195. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 196. http://www.columbia.edu/kermit/ckermit70.html#x4.11
+ 197. http://www.columbia.edu/kermit/ckermit70.html#x4.11.1
+ 198. http://www.columbia.edu/kermit/ckermit70.html#x4.11.2
+ 199. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3
+ 200. http://www.columbia.edu/kermit/ckermit70.html#x4.11.4
+ 201. http://www.columbia.edu/kermit/ckermit70.html#x4.11.5
+ 202. http://www.columbia.edu/kermit/ckermit70.html#x4.11.6
+ 203. http://www.columbia.edu/kermit/ckermit70.html#x4.12
+ 204. http://www.columbia.edu/kermit/ckermit70.html#x4.13
+ 205. http://www.columbia.edu/kermit/ckermit70.html#x4.14
+ 206. http://www.columbia.edu/kermit/ckermit70.html#x4.15
+ 207. http://www.columbia.edu/kermit/ckermit70.html#x4.16
+ 208. http://www.columbia.edu/kermit/ckermit70.html#x4.17
+ 209. http://www.columbia.edu/kermit/ckermit70.html#x4.17.1
+ 210. http://www.columbia.edu/kermit/ckermit70.html#x4.17.2
+ 211. http://www.columbia.edu/kermit/ckermit70.html#x4.18
+ 212. http://www.columbia.edu/kermit/ckermit70.html#x4.19
+ 213. http://www.columbia.edu/kermit/ckermit70.html#x4.20
+ 214. http://www.columbia.edu/kermit/ckermit70.html#x4.20.1
+ 215. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2
+ 216. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.1
+ 217. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.2
+ 218. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.3
+ 219. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.4
+ 220. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.5
+ 221. http://www.columbia.edu/kermit/ckermit70.html#x4.20.3
+ 222. http://www.columbia.edu/kermit/ckermit70.html#x4.21
+ 223. http://www.columbia.edu/kermit/ckermit70.html#x4.22
+ 224. http://www.columbia.edu/kermit/ckermit70.html#x4.22.1
+ 225. http://www.columbia.edu/kermit/ckermit70.html#x4.22.2
+ 226. http://www.columbia.edu/kermit/ckermit70.html#x4.22.3
+ 227. http://www.columbia.edu/kermit/ckermit70.html#x4.22.4
+ 228. http://www.columbia.edu/kermit/ckermit70.html#x4.22.5
+ 229. http://www.columbia.edu/kermit/ckermit70.html#x4.22.6
+ 230. http://www.columbia.edu/kermit/ckermit70.html#x4.22.7
+ 231. http://www.columbia.edu/kermit/ckermit70.html#x4.22.8
+ 232. http://www.columbia.edu/kermit/ckermit70.html#x4.23
+ 233. http://www.columbia.edu/kermit/ckermit70.html#x4.24
+ 234. http://www.columbia.edu/kermit/ckermit70.html#x4.25
+ 235. http://www.columbia.edu/kermit/ckermit70.html#x5
+ 236. http://www.columbia.edu/kermit/ckermit70.html#x5.0
+ 237. http://www.columbia.edu/kermit/ckermit70.html#x5.1
+ 238. http://www.columbia.edu/kermit/ckermit70.html#x5.2
+ 239. http://www.columbia.edu/kermit/ckermit70.html#x5.3
+ 240. http://www.columbia.edu/kermit/ckermit70.html#x5.3.1
+ 241. http://www.columbia.edu/kermit/ckermit70.html#x5.3.2
+ 242. http://www.columbia.edu/kermit/ckermit70.html#x5.4
+ 243. http://www.columbia.edu/kermit/ckermit70.html#x5.5
+ 244. http://www.columbia.edu/kermit/ckermit70.html#x5.6
+ 245. http://www.columbia.edu/kermit/ckermit70.html#x5.7
+ 246. http://www.columbia.edu/kermit/ckermit70.html#x6
+ 247. http://www.columbia.edu/kermit/ckermit70.html#x6.0
+ 248. http://www.columbia.edu/kermit/ckermit70.html#x6.1
+ 249. http://www.columbia.edu/kermit/ckermit70.html#x6.2
+ 250. http://www.columbia.edu/kermit/ckermit70.html#x6.3
+ 251. http://www.columbia.edu/kermit/ckermit70.html#x6.4
+ 252. http://www.columbia.edu/kermit/ckermit70.html#x6.5
+ 253. http://www.columbia.edu/kermit/ckermit70.html#x6.6
+ 254. http://www.columbia.edu/kermit/ckermit70.html#x6.6.1
+ 255. http://www.columbia.edu/kermit/ckermit70.html#x6.6.2
+ 256. http://www.columbia.edu/kermit/ckermit70.html#x6.6.2
+ 257. http://www.columbia.edu/kermit/ckermit70.html#x6.6.3
+ 258. http://www.columbia.edu/kermit/ckermit70.html#x6.6.4
+ 259. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5
+ 260. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.1
+ 261. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.2
+ 262. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.3
+ 263. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.4
+ 264. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.5
+ 265. http://www.columbia.edu/kermit/ckermit70.html#x6.7
+ 266. http://www.columbia.edu/kermit/ckermit70.html#x7
+ 267. http://www.columbia.edu/kermit/ckermit70.html#x7.0
+ 268. http://www.columbia.edu/kermit/ckermit70.html#x7.1
+ 269. http://www.columbia.edu/kermit/ckermit70.html#x7.1.1
+ 270. http://www.columbia.edu/kermit/ckermit70.html#x7.1.2
+ 271. http://www.columbia.edu/kermit/ckermit70.html#x7.1.3
+ 272. http://www.columbia.edu/kermit/ckermit70.html#x7.1.4
+ 273. http://www.columbia.edu/kermit/ckermit70.html#x7.2
+ 274. http://www.columbia.edu/kermit/ckermit70.html#x7.3
+ 275. http://www.columbia.edu/kermit/ckermit70.html#x7.4
+ 276. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 277. http://www.columbia.edu/kermit/ckermit70.html#x7.6
+ 278. http://www.columbia.edu/kermit/ckermit70.html#x7.7
+ 279. http://www.columbia.edu/kermit/ckermit70.html#x7.8
+ 280. http://www.columbia.edu/kermit/ckermit70.html#x7.9
+ 281. http://www.columbia.edu/kermit/ckermit70.html#x7.9.1
+ 282. http://www.columbia.edu/kermit/ckermit70.html#x7.9.2
+ 283. http://www.columbia.edu/kermit/ckermit70.html#x7.10
+ 284. http://www.columbia.edu/kermit/ckermit70.html#x7.10.1
+ 285. http://www.columbia.edu/kermit/ckermit70.html#x7.10.2
+ 286. http://www.columbia.edu/kermit/ckermit70.html#x7.10.3
+ 287. http://www.columbia.edu/kermit/ckermit70.html#x7.10.4
+ 288. http://www.columbia.edu/kermit/ckermit70.html#x7.10.5
+ 289. http://www.columbia.edu/kermit/ckermit70.html#x7.10.6
+ 290. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7
+ 291. http://www.columbia.edu/kermit/ckermit70.html#x7.10.8
+ 292. http://www.columbia.edu/kermit/ckermit70.html#x7.10.9
+ 293. http://www.columbia.edu/kermit/ckermit70.html#x7.10.10
+ 294. http://www.columbia.edu/kermit/ckermit70.html#x7.11
+ 295. http://www.columbia.edu/kermit/ckermit70.html#x7.12
+ 296. http://www.columbia.edu/kermit/ckermit70.html#x7.13
+ 297. http://www.columbia.edu/kermit/ckermit70.html#x7.14
+ 298. http://www.columbia.edu/kermit/ckermit70.html#x7.15
+ 299. http://www.columbia.edu/kermit/ckermit70.html#x7.16
+ 300. http://www.columbia.edu/kermit/ckermit70.html#x7.17
+ 301. http://www.columbia.edu/kermit/ckermit70.html#x7.18
+ 302. http://www.columbia.edu/kermit/ckermit70.html#x7.19
+ 303. http://www.columbia.edu/kermit/ckermit70.html#x7.20
+ 304. http://www.columbia.edu/kermit/ckermit70.html#x7.20.1
+ 305. http://www.columbia.edu/kermit/ckermit70.html#x7.20.2
+ 306. http://www.columbia.edu/kermit/ckermit70.html#x7.21
+ 307. http://www.columbia.edu/kermit/ckermit70.html#x7.22
+ 308. http://www.columbia.edu/kermit/ckermit70.html#x7.23
+ 309. http://www.columbia.edu/kermit/ckermit70.html#x7.24
+ 310. http://www.columbia.edu/kermit/ckermit70.html#x7.25
+ 311. http://www.columbia.edu/kermit/ckermit70.html#x7.26
+ 312. http://www.columbia.edu/kermit/ckermit70.html#x7.26.1
+ 313. http://www.columbia.edu/kermit/ckermit70.html#x7.26.2
+ 314. http://www.columbia.edu/kermit/ckermit70.html#x7.27
+ 315. http://www.columbia.edu/kermit/ckermit70.html#x8
+ 316. http://www.columbia.edu/kermit/ckermit70.html#x9
+ 317. http://www.columbia.edu/kermit/ckermit70.html#x9.0
+ 318. http://www.columbia.edu/kermit/ckermit70.html#x9.1
+ 319. http://www.columbia.edu/kermit/ckermit70.html#x9.2
+ 320. http://www.columbia.edu/kermit/ckermit70.html#x9.3
+ 321. http://www.columbia.edu/kermit/ckermit70.html#x10
+ 322. http://www.columbia.edu/kermit/ckermit70.html#xiii
+ 323. http://www.columbia.edu/kermit/ckermit70.html#xiii.1
+ 324. http://www.columbia.edu/kermit/ckermit70.html#xiii.1.1
+ 325. http://www.columbia.edu/kermit/ckermit70.html#xiii.1.2
+ 326. http://www.columbia.edu/kermit/ckermit70.html#xiii.1.2.1
+ 327. http://www.columbia.edu/kermit/ckermit70.html#xiii.1.2.2
+ 328. http://www.columbia.edu/kermit/ckermit70.html#xiii.1.2.3
+ 329. http://www.columbia.edu/kermit/ckermit70.html#xiii.2
+ 330. http://www.columbia.edu/kermit/ckermit70.html#xiv
+ 331. http://www.columbia.edu/kermit/ckermit70.html#xv
+ 332. http://www.columbia.edu/kermit/ckb2.htm
+ 333. http://www.columbia.edu/kermit/ckbreviews.html
+ 334. http://www.bhusa.com/
+ 335. http://www.columbia.edu/kermit/manuals.html#ckde
+ 336. http://www.columbia.edu/kermit/manuals.html#ktb
+ 337. http://www.columbia.edu/kermit/news.html
+ 338. news:comp.protocols.kermit.announce
+ 339. news:comp.protocols.kermit.misc
+ 340. http://www.columbia.edu/kermit/ckb2.htm
+ 341. http://www.columbia.edu/kermit/ckermit70.html#x4
+ 342. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 343. http://www.columbia.edu/kermit/ckermit70.html#x4.23
+ 344. http://www.columbia.edu/kermit/ckermit70.html#x4.5.1
+ 345. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 346. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 347. http://www.columbia.edu/kermit/ckermit70.html#x4.9.
+ 348. http://www.columbia.edu/kermit/ckb2.htm
+ 349. http://www.columbia.edu/kermit/ckermit70.html#x7.9.2
+ 350. http://www.columbia.edu/kermit/ckermit70.html#x2.15
+ 351. http://www.columbia.edu/kermit/ckermit70.html#x9.1
+ 352. http://www.columbia.edu/kermit/ckermit70.html#x1.6
+ 353. http://www.columbia.edu/kermit/ckermit70.html#x7.4
+ 354. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 355. http://www.columbia.edu/kermit/ckermit70.html#mjd
+ 356. http://www.columbia.edu/kermit/ckermit70.html#mjd
+ 357. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 358. http://www.columbia.edu/kermit/ckb2.htm
+ 359. http://www.columbia.edu/kermit/ckb2.htm
+ 360. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 361. http://www.columbia.edu/kermit/ckermit70.html#x2.12
+ 362. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 363. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 364. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5
+ 365. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 366. http://www.columbia.edu/kermit/ckermit70.html#x7.18
+ 367. http://www.columbia.edu/kermit/ckermit70.html#x7.4
+ 368. http://www.columbia.edu/kermit/ckermit70.html#x1.15
+ 369. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 370. http://www.columbia.edu/kermit/ckermit70.html#x7.3
+ 371. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7
+ 372. http://www.columbia.edu/kermit/ckermit70.html#x7.1
+ 373. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 374. ftp://kermit.columbia.edu/kermit/f/ckccfg.txt
+ 375. ftp://kermit.columbia.edu/kermit/f/ckccfg.txt
+ 376. http://www.columbia.edu/kermit/ckermit70.html#x1.22.4
+ 377. http://www.columbia.edu/kermit/ckermit70.html#x1.22.5
+ 378. http://www.columbia.edu/kermit/ckb2.htm
+ 379. http://www.columbia.edu/kermit/ckermit70.html#x1.22.5
+ 380. http://www.columbia.edu/kermit/ckermit70.html#x7.12
+ 381. http://www.columbia.edu/kermit/ckermit70.html#x2.1.16
+ 382. http://www.columbia.edu/kermit/ckermit70.html#x2.7
+ 383. http://www.columbia.edu/kermit/ckermit70.html#x2.3.5
+ 384. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 385. http://www.telefonica.es/cambiodenumeracion/
+ 386. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 387. http://www.columbia.edu/kermit/ckb2.htm
+ 388. http://www.columbia.edu/kermit/ckermit70.html#x2.2.2
+ 389. http://www.columbia.edu/kermit/ckermit70.html#x2.1.11
+ 390. http://www.columbia.edu/kermit/ckermit70.html#x2.1.13
+ 391. http://www.columbia.edu/kermit/ckermit70.html#x2.1.12
+ 392. http://www.columbia.edu/kermit/ckb2.htm
+ 393. http://www.columbia.edu/kermit/ckermit70.html#x2.1.1
+ 394. http://www.columbia.edu/kermit/ckb2.htm
+ 395. http://www.columbia.edu/kermit/ckb2.htm
+ 396. http://www.columbia.edu/kermit/ckermit70.html#x2.1.7
+ 397. http://www.columbia.edu/kermit/ckermit70.html#x2.1.6
+ 398. http://www.columbia.edu/kermit/ckb2.htm
+ 399. ftp://kermit.columbia.edu/kermit/f/telnet.txt
+ 400. http://www.columbia.edu/kermit/telnet.htm
+ 401. ftp://kermit.columbia.edu/kermit/f/telnet.txt
+ 402. http://www.columbia.edu/kermit/telnet.htm
+ 403. ftp://ftp.isi.edu/in-notes/rfc1572.txt
+ 404. ftp://ftp.isi.edu/in-notes/rfc779.txt
+ 405. http://www.columbia.edu/kermit/ckb2.htm
+ 406. http://www.columbia.edu/kermit/ckermit70.html#x2.10
+ 407. http://www.columbia.edu/kermit/ckermit70.html#x2.8
+ 408. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 409. http://www.columbia.edu/kermit/ckermit70.html#x4.20
+ 410. http://www.psy.uq.oz.au/~ftp/Crypto/
+ 411. http://www.columbia.edu/kermit/security.htm
+ 412. http://srp.stanford.edu/srp/
+ 413. http://www.columbia.edu/kermit/ckermit70.html#x2.7.1,
+ 414. ftp://kermit.columbia.edu/kermit/f/ckccfg.txt
+ 415. http://www.columbia.edu/kermit/security.htm
+ 416. http://www.columbia.edu/kermit/ckb2.htm
+ 417. http://www.columbia.edu/kermit/ckermit70.html#x2.7
+ 418. http://www.columbia.edu/kermit/ckermit70.html#x2.0
+ 419. ftp://kermit.columbia.edu/kermit/f/ckuins.txt
+ 420. ftp://kermit.columbia.edu/kermit/f/ckubwr.txt
+ 421. ftp://kermit.columbia.edu/kermit/f/ckuins.txt
+ 422. http://www.columbia.edu/kermit/iksd.html#x4.2
+ 423. http://www.columbia.edu/kermit/iksd.html
+ 424. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.1
+ 425. ftp://ftp.isi.edu/in-notes/rfc1945.txt
+ 426. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 427. http://www.columbia.edu/kermit/ckermit70.html#x3.2
+ 428. http://www.columbia.edu/kermit/ckermit70.html#x3.2
+ 429. http://www.columbia.edu/kermit/ckb2.htm
+ 430. http://www.columbia.edu/kermit/ckb2.htm
+ 431. http://www.columbia.edu/kermit/ckermit70.html#x5.4
+ 432. ftp://kermit.columbia.edu/kermit/f/ckubwr.txt
+ 433. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 434. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 435. http://www.columbia.edu/kermit/ckermit70.html#x4.7.3
+ 436. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 437. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 438. http://www.columbia.edu/kermit/ckermit70.html#x4.11
+ 439. http://www.columbia.edu/kermit/ckermit70.html#x4.15
+ 440. http://www.columbia.edu/kermit/ckermit70.html#x4.2.4
+ 441. http://www.columbia.edu/kermit/ckermit70.html#x4.7
+ 442. http://www.columbia.edu/kermit/ckermit70.html#x4.2.3
+ 443. http://www.columbia.edu/kermit/ckermit70.html#x4.2.1.3
+ 444. http://www.columbia.edu/kermit/ckb2.htm
+ 445. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2
+ 446. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 447. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.2
+ 448. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 449. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 450. http://www.columbia.edu/kermit/ckermit70.html#x4.11
+ 451. http://www.columbia.edu/kermit/ckermit70.html#x4.15
+ 452. http://www.telstra.com.au/docs/PGP/
+ 453. http://www.telstra.com.au/docs/PGP/pgpdoc2/pgpdoc2_17.html
+ 454. http://www.columbia.edu/kermit/security.htm
+ 455. http://www.columbia.edu/kermit/ckermit70.html#x2.7
+ 456. http://www.columbia.edu/kermit/ckb2.htm
+ 457. http://www.columbia.edu/kermit/ckermit70.html#x2.14
+ 458. http://www.columbia.edu/kermit/ckermit70.html#x1.23
+ 459. http://www.columbia.edu/kermit/ckermit70.html#x4.7
+ 460. http://www.columbia.edu/kermit/ckb2.htm
+ 461. http://www.columbia.edu/kermit/ckb2.htm
+ 462. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 463. http://www.columbia.edu/kermit/ckb2.htm
+ 464. http://www.columbia.edu/kermit/ckermit70.html#x1.5.4
+ 465. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 466. http://www.columbia.edu/kermit/ckermit70.html#x1.5.5
+ 467. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 468. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 469. http://www.columbia.edu/kermit/ckermit70.html#x1.5.4
+ 470. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 471. http://www.columbia.edu/kermit/ckermit70.html#x1.5.4
+ 472. http://www.columbia.edu/kermit/ckermit70.html#x1.5.5
+ 473. http://www.columbia.edu/kermit/ckb2.htm
+ 474. http://www.columbia.edu/kermit/ckb2.htm
+ 475. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 476. http://www.columbia.edu/kermit/ckermit70.html#x1.6
+ 477. http://www.columbia.edu/kermit/ckermit70.html#x7.10
+ 478. http://www.columbia.edu/kermit/ckermit70.html#x7.10.11
+ 479. http://www.columbia.edu/kermit/ckermit70.html#x1.6
+ 480. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2
+ 481. http://www.columbia.edu/kermit/ckermit70.html#x4.11
+ 482. http://www.columbia.edu/kermit/ckermit70.html#x1.5.4
+ 483. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 484. http://www.columbia.edu/kermit/ckermit70.html#x4.0.6
+ 485. http://www.columbia.edu/kermit/ckermit70.html#x4.2
+ 486. http://www.columbia.edu/kermit/ckermit70.html#x4.1
+ 487. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 488. http://www.columbia.edu/kermit/ckb2.htm
+ 489. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 490. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2
+ 491. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 492. http://www.columbia.edu/kermit/ckermit70.html#x4.2
+ 493. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 494. http://www.columbia.edu/kermit/ckermit70.html#x4.2.2
+ 495. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 496. http://www.columbia.edu/kermit/ckermit70.html#x4.2
+ 497. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 498. http://www.columbia.edu/kermit/ckermit70.html#x1.11.5
+ 499. http://www.columbia.edu/kermit/ckermit70.html#x4.0.6
+ 500. http://www.columbia.edu/kermit/ckermit70.html#x4.11
+ 501. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 502. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3
+ 503. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 504. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 505. http://www.columbia.edu/kermit/ckermit70.html#x4.5.1
+ 506. http://www.columbia.edu/kermit/ckermit70.html#x7.10
+ 507. http://www.columbia.edu/kermit/ckermit70.html#x7.10.5
+ 508. http://www.columbia.edu/kermit/ckermit70.html#x7.10.3
+ 509. http://www.columbia.edu/kermit/ckermit70.html#x7.10.5
+ 510. http://www.columbia.edu/kermit/ckb2.htm
+ 511. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 512. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 513. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 514. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 515. http://www.columbia.edu/kermit/ckermit70.html#x4.15
+ 516. http://www.columbia.edu/kermit/ckermit70.html#x4.18
+ 517. http://www.columbia.edu/kermit/ckermit70.html#x4.20
+ 518. http://www.columbia.edu/kermit/ckermit70.html#x4.20
+ 519. http://www.columbia.edu/kermit/ckermit70.html#x4.20
+ 520. http://www.columbia.edu/kermit/ckermit70.html#x4.19
+ 521. http://www.columbia.edu/kermit/ckermit70.html#x4.16
+ 522. http://www.columbia.edu/kermit/ckermit70.html#x4.19
+ 523. http://www.columbia.edu/kermit/ckermit70.html#x4.20.2.3
+ 524. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 525. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.4
+ 526. http://www.columbia.edu/kermit/ckermit70.html#x4.22.2
+ 527. http://www.columbia.edu/kermit/ckermit70.html#x4.22.3
+ 528. http://www.columbia.edu/kermit/ckb2.htm
+ 529. http://www.columbia.edu/kermit/ckb2.htm
+ 530. http://www.columbia.edu/kermit/ckermit70.html#x9.3
+ 531. http://www.columbia.edu/kermit/ckermit70.html#x5.2.1
+ 532. http://www.columbia.edu/kermit/ckermit70.html#x4.5.1
+ 533. http://www.columbia.edu/kermit/ckermit70.html#x4.5.2
+ 534. http://www.columbia.edu/kermit/ckermit70.html#x6.6
+ 535. http://www.columbia.edu/kermit/ckermit70.html#xiii
+ 536. http://www.columbia.edu/kermit/ckermit70.html#xiii
+ 537. ftp://ftp.isi.edu/in-notes/rfc1489.txt
+ 538. ftp://ftp.isi.edu/in-notes/rfc2319.txt
+ 539. http://www.unicode.org/
+ 540. http://www.columbia.edu/kermit/ckermit70.html#x6.6.2
+ 541. http://www.columbia.edu/kermit/ckermit70.html#x6.6.5.1
+ 542. ftp://ftp.isi.edu/in-notes/rfc2640.txt
+ 543. http://www.columbia.edu/kermit/ckermit70.html#x6.6.2
+ 544. http://www.columbia.edu/kermit/ckermit70.html#x6.0
+ 545. http://www.columbia.edu/kermit/ckermit70.html#x6.5
+ 546. http://www.columbia.edu/kermit/ckermit70.html#x6.4
+ 547. http://www.columbia.edu/kermit/ckb2.htm
+ 548. http://www.columbia.edu/kermit/ckermit70.html#x4.21
+ 549. http://www.columbia.edu/kermit/ckermit70.html#x6.5
+ 550. http://www.columbia.edu/kermit/ckermit70.html#x2.8
+ 551. http://www.columbia.edu/kermit/ckermit70.html#x7.7
+ 552. http://www.columbia.edu/kermit/ckermit70.html#x7.2
+ 553. http://www.columbia.edu/kermit/ckermit70.html#x1.19
+ 554. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 555. http://www.columbia.edu/kermit/ckermit70.html#x4.1
+ 556. http://www.columbia.edu/kermit/ckermit70.html#x4.2
+ 557. http://www.columbia.edu/kermit/ckermit70.html#x4.1
+ 558. http://www.columbia.edu/kermit/ckermit70.html#x4.2
+ 559. http://www.columbia.edu/kermit/ckermit70.html#x2.1.11
+ 560. http://www.columbia.edu/kermit/ckermit70.html#x2.10
+ 561. http://www.columbia.edu/kermit/ckermit70.html#ferrstring
+ 562. http://www.columbia.edu/kermit/ckermit70.html#x4.2.5
+ 563. http://www.columbia.edu/kermit/ckermit70.html#x2.1.10
+ 564. http://www.columbia.edu/kermit/ckermit70.html#x9.1
+ 565. http://www.columbia.edu/kermit/ckermit70.html#x7.23
+ 566. http://www.columbia.edu/kermit/ckermit70.html#x7.23
+ 567. http://www.columbia.edu/kermit/ckermit70.html#x1.22
+ 568. http://www.columbia.edu/kermit/ckermit70.html#x1.6
+ 569. http://www.columbia.edu/kermit/ckermit70.html#x7.23
+ 570. http://www.columbia.edu/kermit/ckermit70.html#x7.24
+ 571. http://www.columbia.edu/kermit/ckermit70.html#x7.24
+ 572. http://www.columbia.edu/kermit/ckermit70.html#x4.2.3
+ 573. http://www.columbia.edu/kermit/ckermit70.html#x7.12
+ 574. http://www.columbia.edu/kermit/ckermit70.html#x7.9
+ 575. http://www.columbia.edu/kermit/ckb2.htm
+ 576. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3
+ 577. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3
+ 578. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 579. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7
+ 580. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7
+ 581. http://www.columbia.edu/kermit/ckermit70.html#x4.2.8.4
+ 582. http://www.columbia.edu/kermit/ckermit70.html#x4.2.5
+ 583. http://www.columbia.edu/kermit/ckermit70.html#x7.8
+ 584. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 585. http://www.columbia.edu/kermit/ckb2.htm
+ 586. http://www.columbia.edu/kermit/ckermit70.html#x7.19
+ 587. http://www.columbia.edu/kermit/ckermit70.html#x7.16
+ 588. http://www.columbia.edu/kermit/ckermit70.html#x7.9.1
+ 589. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 590. http://www.columbia.edu/kermit/ckermit70.html#x7.3
+ 591. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3
+ 592. http://www.columbia.edu/kermit/ckermit70.html#x4.5.1
+ 593. http://www.columbia.edu/kermit/ckermit70.html#x7.10
+ 594. http://www.columbia.edu/kermit/ckermit70.html#x7.10.10
+ 595. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 596. http://www.columbia.edu/kermit/ckermit70.html#x7.23
+ 597. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7
+ 598. http://www.columbia.edu/kermit/ckermit70.html#x7.10.7
+ 599. http://www.columbia.edu/kermit/ckermit70.html#x4.11.3
+ 600. http://www.columbia.edu/kermit/ckermit70.html#x7.10.11
+ 601. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 602. http://www.columbia.edu/kermit/ckermit70.html#x7.10.3
+ 603. http://www.columbia.edu/kermit/ckermit70.html#x7.3
+ 604. http://www.columbia.edu/kermit/ckermit70.html#x7.9.2
+ 605. http://www.columbia.edu/kermit/ckb2.htm
+ 606. http://www.columbia.edu/kermit/ckermit70.html#x4.17.2
+ 607. http://www.columbia.edu/kermit/ckermit70.html#x1.22
+ 608. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 609. http://www.columbia.edu/kermit/ckermit70.html#x1.22
+ 610. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 611. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 612. http://www.columbia.edu/kermit/ckermit70.html#x1.22
+ 613. http://www.columbia.edu/kermit/ckermit70.html#x1.6
+ 614. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 615. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 616. http://www.columbia.edu/kermit/ckermit70.html#x7.19
+ 617. http://www.columbia.edu/kermit/ckermit70.html#x4.9.1
+ 618. http://www.columbia.edu/kermit/ckermit70.html#x9.3
+ 619. http://www.columbia.edu/kermit/ckermit70.html#x7.5
+ 620. http://www.columbia.edu/kermit/ckb2.htm
+ 621. http://www.columbia.edu/kermit/ckermit70.html#x7.4
+ 622. http://www.columbia.edu/kermit/ckermit70.html#x7.20.2
+ 623. http://www.columbia.edu/kermit/ckermit70.html#x7.10.5
+ 624. http://www.columbia.edu/kermit/ckermit70.html#x7.10.9
+ 625. http://www.columbia.edu/kermit/ckermit70.html#x1.10
+ 626. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 627. http://www.columbia.edu/kermit/ckermit70.html#x4.7.1
+ 628. http://www.columbia.edu/kermit/iksd.html
+ 629. http://www.columbia.edu/kermit/ckermit70.html#x7.19
+ 630. http://www.columbia.edu/kermit/ckermit70.html#x4.10
+ 631. http://www.columbia.edu/kermit/ckermit70.html#x4.11
+ 632. http://www.columbia.edu/kermit/ckermit70.html#x4.3
+ 633. http://www.columbia.edu/kermit/gkermit.html
+ 634. http://www.columbia.edu/kermit/ckermit70.html#x4.20
+ 635. http://www.columbia.edu/kermit/gkermit.html
+ 636. http://www.columbia.edu/kermit/ckb2.htm
+ 637. http://www.columbia.edu/kermit/ckermit70.html#x7.3
+ 638. mailto:kermit@columbia.edu
+ 639. http://www.columbia.edu/kermit/ckermit70.html#top
+ 640. http://www.columbia.edu/kermit/ckermit.html
+ 641. http://www.columbia.edu/kermit/index.html
diff --git a/ckermit80.txt b/ckermit80.txt
new file mode 100644 (file)
index 0000000..493338a
--- /dev/null
@@ -0,0 +1,10349 @@
+
+                           C-Kermit 8.0 Update Notes
+
+   [ [1]Contents ] [ [2]C-Kermit ] [ [3]Kermit Home ]
+
+              Second Supplement to Using C-Kermit, Second Edition
+
+For C-Kermit 8.0
+
+   As of C-Kermit version: 8.0.211
+   Date of C-Kermit release: 10 April 2003
+   This file last updated: Sat Apr 10 16:36:11 2004
+
+     * IF YOU ARE READING A PLAIN-TEXT version of this document, note
+       that it is a plain-text dump of a Web page. You can visit the
+       original (and possibly more up-to-date) Web page here:
+  [4]http://www.columbia.edu/kermit/ckermit80.html
+     * If you are reading the HTML version of this file with a GUI Web
+       browser, the features added since C-Kermit 8.0.201 are shown in
+       red if your browser and monitor permit. Features that were new to
+       versions 8.0.200 and 201 are in black.
+
+Authors: Frank da Cruz and Christine M. Gianone
+Address: The Kermit Project
+         Columbia University
+         612 West 115th Street
+         New York NY 10025-7799
+         USA
+Fax:     +1 (212) 662-6442
+E-Mail:  [5]kermit-support@columbia.edu
+Web:     [6]http://www.columbia.edu/kermit/
+Or:      [7]http://www.kermit-project.org/
+Or:      [8]http://www.columbia.nyc.ny.us/kermit/
+     _________________________________________________________________
+
+  NOTICES
+
+   This document:
+          Copyright Â© 1997, 2002, Frank da Cruz and Christine M. Gianone.
+          All rights reserved.
+
+   Kermit 95:
+          Copyright Â© 1995, 2002, Trustees of Columbia University in the
+          City of New York. All rights reserved.
+
+   C-Kermit:
+          Copyright Â© 1985, 2002,
+          Trustees of Columbia University in the City of New York. All
+          rights reserved. See the C-Kermit [9]COPYING.TXT file or the
+          copyright text in the [10]ckcmai.c module for disclaimer and
+          permissions.
+
+   When Kerberos(TM) and/or SRP(TM) (Secure Remote Password) and/or
+          SSL/TLS protocol are included:
+          Portions Copyright Â© 1990, Massachusetts Institute of
+          Technology.
+          Portions Copyright Â© 1991, 1993 Regents of the University of
+          California.
+          Portions Copyright Â© 1991, 1992, 1993, 1994, 1995 by AT&T.
+          Portions Copyright Â© 1997, Stanford University.
+          Portions Copyright Â© 1995-1997, Eric Young
+          <eay@cryptosoft.com>.
+
+   For the full text of the third-party copyright notices, see
+   [11]Appendix V.
+     _________________________________________________________________
+
+  WHAT IS IN THIS FILE
+
+   This file lists changes made to C-Kermit since version 7.0 was
+   released in January 2000. Use this file as a supplement to:
+
+     * The second edition of [12]Using C-Kermit; and:
+     * The [13]C-Kermit 7.0 Update Notes. Also available in plain-text
+       form as [14]ckermit70.txt.
+
+   until the third edition of Using C-Kermit is published. We apologize
+   for the scattered documentation and will consolidate it when we are
+   able.
+     _________________________________________________________________
+
+   ADDITIONAL FILES Several other files accompany this new Kermit
+   release:
+
+   [15]ckututor.html
+          C-Kermit Tutorial (for Unix). Also distributed in Nroff form as
+          [16]ckuker.nr, the Unix C-Kermit manual page.
+
+   [17]security.htm
+          Discussion of Kermit's new authentication and encryption
+          features, updated for C-Kermit 8.0.
+
+   [18]telnet.htm
+          Detailed documentation of Kermit's Telnet client, updated for
+          C-Kermit 8.0.
+
+   [19]ftpscripts.html
+          Tutorial: Writing FTP automation scripts
+
+   [20]ckcbwr.html
+          Platform-independent C-Kermit hints and tips. Also distributed
+          in plain text form as [21]ckcbwr.txt
+
+   [22]ckubwr.html
+          Unix-specific C-Kermit hints and tips. Also distributed in
+          plain text form as [23]ckubwr.txt.
+
+   [24]ckvbwr.html
+          VMS-specific C-Kermit hints and tips. Also distributed in plain
+          text form as [25]ckvbwr.txt.
+
+   [26]ckuins.html
+          Unix C-Kermit installation instructions. Also distributed in
+          plain text form as [27]ckuins.txt.
+
+   [28]ckvins.html
+          VMS C-Kermit installation instructions. Also distributed in
+          plain text form as [29]ckvins.txt.
+
+   [30]ckccfg.html
+          Compile-time configuration options. Also distributed in plain
+          text form as [31]ckccfg.txt.
+
+   [32]ckcplm.html
+          C-Kermit Program Logic Manual. Also distributed in plain text
+          form as [33]ckcplm.txt.
+
+   [34]iksd.html
+          Internet Kermit Service Aministrators Guide for Unix.
+
+   [35]skermit.html
+          C-Kermit as an SSH Subsystem (SFTP server replacement).
+
+   [ [36]Top ] [ [37]C-Kermit ] [ [38]Kermit Home ]
+  __________________________________________________________________________
+
+CONTENTS
+
+     [39]0. WHAT'S NEW
+     [40]1. FIXES SINCE VERSION 7.0.196
+     [41]2. SSH AND HTTP 
+         [42]2.1. SSH Connections
+         [43]2.2. HTTP Connections
+            [44]2.2.1. HTTP Command Switches
+            [45]2.2.2. HTTP Action Commands
+            [46]2.2.3. HTTP Headers
+            [47]2.2.4. Secure HTTP Connections
+            [48]2.2.5. HTTP Variables
+            [49]2.2.6. The HTTP Command-Line Personality
+     [50]3. THE BUILT-IN FTP CLIENT
+         [51]3.1. Making and Managing FTP Connections
+            [52]3.1.1. Kermit Command-Line Options for FTP
+            [53]3.1.2. The FTP Command-Line Personality
+            [54]3.1.3. The FTP URL Interpreter
+            [55]3.1.4. Interactive FTP Session Establishment
+         [56]3.2. Making Secure FTP Connections
+         [57]3.3. Setting FTP Preferences
+         [58]3.4. Managing Directories and Files
+         [59]3.5. Uploading Files With FTP
+            [60]3.5.1. FTP PUT Switches
+            [61]3.5.2. Update Mode
+            [62]3.5.3. Recovery
+         [63]3.6. Downloading Files With FTP
+            [64]3.6.1. FTP GET Switches
+            [65]3.6.2. Filename Collisions
+            [66]3.6.3. Recovery
+         [67]3.7. Translating Character Sets
+            [68]3.7.1. Character Sets and Uploading
+            [69]3.7.2. Character Sets and Downloading
+         [70]3.8. FTP Command Shortcuts
+         [71]3.9. Dual Sessions
+         [72]3.10. Automating FTP Sessions
+            [73]3.10.1. FTP-Specific Variables and Functions
+            [74]3.10.2. Examples
+            [75]3.10.3. Automating Secure FTP Connections
+         [76]3.11. Advanced FTP Protocol Features  [77]4. FILE SCANNING
+    [78]5. FILE AND DIRECTORY NAMES CONTAINING SPACES
+    [79]6. OTHER COMMAND PARSING IMPROVEMENTS
+         [80]6.1. Grouping Macro Arguments
+         [81]6.2. Directory and File Name Completion
+         [82]6.3. Passing Arguments to Command Files
+         [83]6.4. More-Prompting
+         [84]6.5. Commas in Macro Definitions
+         [85]6.6. Arrow Keys
+    [86]7. NEW COMMANDS AND SWITCHES
+    [87]8. SCRIPTING IMPROVEMENTS
+         [88]8.1. Performance and Debugging
+         [89]8.2. Using Macros as Numeric Variables
+         [90]8.3. New IF Conditions
+         [91]8.4. The ON_UNKNOWN_COMMAND and ON_CD Macros
+         [92]8.5. The SHOW MACRO Command
+         [93]8.6. Arrays
+         [94]8.7. New or Improved Built-in Variables and Functions
+         [95]8.8. The RETURN and END Commands
+         [96]8.9. UNDEFINing Groups of Variables
+         [97]8.10. The INPUT and MINPUT Commands
+         [98]8.11. Learned Scripts
+         [99]8.12. Pattern Matching
+         [100]8.13. Dates and Times
+         [101]8.14. Trapping Keyboard Interruption
+    [102]9. S-EXPRESSIONS
+         [103]9.1. What is an S-Expression?
+         [104]9.2. Integer and Floating-Point-Arithmetic
+         [105]9.3. How to Use S-Expressions
+         [106]9.4. Summary of Built-in Constants and Operators
+         [107]9.5. Variables
+         [108]9.6. Assignments and Scope
+         [109]9.7. Conditional Expressions
+         [110]9.8. Extensibility
+         [111]9.9. Examples
+         [112]9.10. Differences from Algebraic Notation
+         [113]9.11.Differences from Lisp
+    [114]10. FILE TRANSFER
+    [115]11. MODEMS AND DIALING
+    [116]12. TERMINAL CONNECTION
+    [117]13. CHARACTER SETS
+    [118]14. DIALOUT FROM TELNET TERMINAL SERVERS
+    [119]15. COPING WITH BROKEN KERMIT PARTNERS
+    [120]16. NEW COMMAND-LINE OPTIONS
+    [121]17. LOGS
+
+   [ [122]Top ] [ [123]C-Kermit ] [ [124]Kermit Home ]
+  __________________________________________________________________________
+
+0. WHAT'S NEW
+
+   The Initialization and Customization Files
+          C-Kermit 8.0 now supports specification of the initialization
+          file name (path) in an environment variable, CKERMIT_INI. It
+          also relies far less than before on the initialization for
+          functioning. See [125]Section 5 of the Unix C-Kermit
+          [126]installation instructions for details. As of version
+          8.0.201, C-Kermit also executes your customization file (if you
+          have one) even if the initialization file was not found.
+          Previously, the customization file was executed by a TAKE
+          command in the initialization file (and it still is, if an
+          initialization is found).
+
+   Incompatible Changes
+          As always, we do our best to avoid changes that break existing
+          scripts. However, C-Kermit 8.0 does include a rather pervasive
+          syntax change that might alter the behavior of scripts that
+          depend on the previous behavior. As described in [127]Section
+          5, C-Kermit now accepts doublequotes in most contexts where you
+          previously had to use braces to group multiple words into a
+          single field, or to force inclusion of leading or trailing
+          blanks. Most noticeably, in C-Kermit 7.0 and earlier:
+
+  echo {this is a string}
+
+          would print:
+
+  this is a string
+
+          whereas:
+
+  echo "this is a string"
+
+          printed:
+
+  "this is a string"
+
+          In C-Kermit 8.0, both print:
+
+  this is a string
+
+          To force the doublequotes to be treated as part of the string,
+          use either of the following forms:
+
+  echo {"this is a string"}
+  echo ""this is a string""
+
+          Similarly, to force braces to be treated as part of the string:
+
+  echo "{this is a string}"
+  echo {{this is a string}}
+
+          Other incompatibilities:
+
+         1. Using the SET HOST command to make HTTP connections is no
+            longer supported. Instead, use the new HTTP OPEN command,
+            described in [128]Section 2.2.
+
+   C-Kermit 7.1 Alpha.01 (8 December 2000)
+
+     Its major new features are those listed in the [129]Table of
+          Contents: the FTP client, file scanning, command parsing and
+          scripting improvements, S-Expressions, and support for the
+          Telnet Com Port Option, plus wider availability of the
+          Kerberos, SSL/TLS, and SRP security options for secure Internet
+          connections.
+
+   C-Kermit 7.1.199 Alpha.02 (4 January 2001)
+
+          + C-Kermit now accepts [130]FTP, TELNET, and IKSD URLs as its
+            first command-line argument.
+          + Character-set translation added to the FTP client for
+            [131]filenames. 
+          + Optional [132]setting of date of incoming files by FTP [M]GET
+            from the server date.
+          + [133]FTP CHECK filename added to let FTP client check the
+            existence of a file on the server.
+          + [134]FTP GET /NAMELIST:filename added to get list of server
+            filenames into a local file.
+          + [135]FTP [M]PUT /SERVER-RENAME:template added to make server
+            rename a file as indicated by the template after it has
+            arrived completely.
+          + FTP [M]GET /SERVER-RENAME:template added to make server
+            rename a file as indicated by the template after it has been
+            sent completely.
+          + FTP [136]VDIRECTORY added for getting verbose directory
+            listings from TOPS-20.
+          + [137]FTP TYPE TENEX added for transferring 8-bit binary files
+            with PDP-10s.
+          + Added [138]automatic text/binary mode switching for FTP
+            [M]GET, based on filename patterns (e.g. *.zip, *.gz, *.exe
+            are binary; *.txt, *.c are text).
+          + [139]SET SEND I-PACKETS OFF added for coping with Kermit
+            servers that do not support I packets.
+          + A new option was added to [140]\fword() and \fsplit() for
+            parsing comma-separated lists that might contain empty
+            elements.
+          + Bug fixes including:
+               o {} or "" could not be used as expected to represent the
+                 empty string.
+               o ,- on a line by itself in a macro definition caused
+                 subsequent statements to be skipped.
+               o FTP [M]GET didn't work right if path segments were
+                 included in the filespec.
+               o FTP MGET, if interrupted, did not clear its file list.
+               o Various problems with FTP PUT /AS-NAME that nobody
+                 noticed.
+               o Some FTP messages and displays interfered with each
+                 other.
+               o Parsing of YESTERDAY, TODAY, and TOMORROW in date-time
+                 fields was broken.
+               o Automatic old-to-new dialing directory format conversion
+                 was broken on VMS.
+               o Various source-code portability problems fixed.
+          + Improvement of various HELP and SHOW messages.
+
+   C-Kermit 7.1.199 Alpha.04 (1 April 2001)
+
+          + Big changes:
+               o Changed default modem type from NONE to GENERIC.
+               o Generic dialing now sends no init string at all.
+               o Changed default terminal bytesize from 7 to 8.
+          + New features:
+               o SET SESSION-LOG TIMESTAMPED-TEXT for timestamped session
+                 log.
+          + New modem types:
+               o Conexant modem family
+               o Lucent VENUS chipset
+               o PCTel V.90 chipset
+               o Zoom V.90
+               o Zoom V.92
+          + FTP client:
+               o FTP OPEN /PASSIVE and /ACTIVE switches added.
+               o Now works with servers that that don't include path in
+                 NLST response.
+               o Fixed SEND /RECURSIVE not to follow symlinks (UNIX).
+               o SET FTP VERBOSE-MODE default is now OFF instead of ON.
+          + Kermit protocol:
+               o Fixed what I hope is the last "Receive window full"
+                 error.
+               o SET PREFIXING or SET CONTROL PREFIX now automatically
+                 sets CLEARCHANNEL OFF.
+               o Fixed incorrect report of number of files transferred at
+                 end of transfer.
+               o Fixed SEND /RECURSIVE not to follow symlinks (UNIX).
+          + UNIX:
+               o HTTP and shadow passwords enabled for SCO 5.0.6.
+               o Even with SET FILENAMES CONVERTED, spaces were still
+                 accepted in incoming filenames; now they are converted
+                 to underscores.
+               o Added support for compile-time mktemp()/mkstemp()
+                 selection.
+          + VMS:
+               o Session-log format for scripted sessions fixed.
+          + Scripting:
+               o Fixed \frdir() not to follow symlinks (UNIX).
+               o Fixed \fday() not to dump core for dates prior to 17 Mar
+                 1858.
+          + General:
+               o "Closing blah..." message upon exit could not be
+                 surpressed.
+               o Added /PAGE and /NOPAGE to DELETE switches.
+               o Added GO response for DELETE /ASK (delete all the rest
+                 without asking).
+               o Added GO response to "more?" prompt (for multi-page
+                 screen output).
+               o Updated HELP texts.
+
+   C-Kermit 7.1.199 Beta.01 (10 May 2001)
+
+          + FTP client verbosity adjustments.
+          + Bug with generic modem dialing pausing several secs fixed.
+          + SET HOST /USER:, SET LOGIN USERID, etc, fixed when given no
+            user ID.
+          + A couple \v(dm_blah) dial modifier variables added.
+          + "--version" command-line switch added.
+          + Fixed NetBSD serial-port DTR handling.
+          + Lots of syntax cleanups for Flexelint and gcc -Wall.
+          + Fixed modem-type aliases to not take precedence over real
+            names.
+          + Fixed funny treatment of doublequotes by ECHO command.
+          + Enabled SET SESSION-LOG for VMS and other non-UNIX platorms.
+          + Fixed changing direction in command history buffer.
+          + Fixed handling of IKSD URLs.
+          + Made sure DELETE prints a message if it got any errors.
+
+   C-Kermit 8.0.200 Beta.02 (28 June 2001)
+
+          + Major version number increased from 7 to 8.
+          + [141]SSH command.
+          + More-consistent Kermit protocol defaults.
+          + CONNECT idle timeout and action selection.
+          + CONNECT status variable.
+          + A way to allocate more space for filename lists.
+          + Pseudoterminal handler fixed for late-model Linuxes.
+          + Command-line option -dd for timestamped debug log.
+          + Download directory now works for external protocols too.
+          + GREP /COUNT:variable.
+          + SET ATTRIBUTE RECORD-FORMAT { OFF, ON }.
+          + Bug fixes.
+
+   C-Kermit 8.0.200 Beta.03 (9 Sep 2001)
+
+          + [142]HTTP 1.1 connections and scripting
+          + [143]ON_CTRLC macro for trapping Ctrl-C in scripts
+          + [144]Date-time parsing improvements, timezones, comparison,
+            arithmetic
+          + [145]Pattern-matching improvements
+          + FTP improvements
+          + SET EXIT HANGUP { ON, OFF }
+          + SET FILE EOF { CTRL-Z, LENGTH }
+          + ASK[Q] /TIMEOUT
+          + Bug fixes
+          + New platforms
+
+   C-Kermit 8.0.200 Beta.04 (16 Nov 2001)
+
+          + [146]New Unix man page
+          + [147]New Unix installation instructions
+          + SET TELOPT policies are now enforced on non-Telnet ports if
+            the server begins Telnet negotiations.
+          + SET TERMINAL IDLE-ACTION { TELNET-NOP, TELNET-AYT }.
+          + UUCP lockfile creation race condition fixed.
+          + Dialout, modem signals, hangup, hardware flow control, etc,
+            tested extensively on many platforms, numerous problems
+            fixed.
+          + Improved hints when dialing fails.
+          + SET STOP-BITS 2 can now be given without SET FLOW HARDWARE.
+          + Major improvements in RFC 2217 Telnet Com-Port Control.
+          + Improved ability to REDIAL a modem server port.
+          + kermit -h now shows the command name in the usage usage
+            string.
+          + kermit -h now shows ALL command-line options.
+          + kermit -s blah, where blah is a symlink, now works.
+          + --noperms command-line option = SET ATTRIBUTE PERMISSIONS
+            OFF.
+          + HTTP and HTTPS URLs now supported on the command line.
+          + An http command-line personality is now available.
+          + Initialization file streamlined to load faster, anachronisms
+            removed.
+          + Updated NEWS, INTRO, HELP text, SHOW commands. In particular,
+            see SHOW COMM, HELP SET LINE, HELP WAIT.
+          + Date/time arithmetic routines converted from floating-point
+            to integer arithmetic (internally) for greater accuracy and
+            portability.
+          + Quoted strings containing commas no longer break macro
+            execution.
+          + Dynamic Kermit file-transfer timeouts are now much more
+            aggressive.
+          + New "hot keys" to turn debug.log on/off during file transfer.
+          + Improved hints when file transfer fails.
+          + FTP CD orientation messages are now printed.
+          + -R now accepted on the FTP command line to request Recursion.
+          + -m allows Active or Passive mode to be chosen on the FTP
+            command line.
+          + -dd on the FTP command line creates a timestamped debug.log.
+          + FTP command-line security options filled in.
+          + Improved automatic text/binary mode switching for MGET.
+          + Removed spurious error messages that sometimes occur during
+            MGET.
+          + DIRECTORY, GREP, TYPE, HEAD, and TAIL now have a /OUTPUT:file
+            option.
+          + TYPE /NUMBER adds line numbers.
+          + CAT = TYPE /NOPAGE; MORE = TYPE /PAGE.
+          + GETOK ?-help fixed.
+          + \v(timestamp) (= "\v(ndate) \v(time)")
+          + \v(hour) (hour of the day, 0-23)
+          + \funix2dospath() converts a UNIX path (/) to a DOS one (\).
+          + \fdos2unixpath() converts a DOS (Windows, OS/2) path to a
+            UNIX one.
+          + \fkeywordval() parses name=value pair, allows macro keyword
+            parameters.
+          + We now make every attempt to not write passwords to the
+            debug.log.
+          + New Certficate Authority certificates file, includes the
+            Kermit Project at Columbia University so you can access our
+            IKSD securely.
+          + Secure targets improved and better documented in Unix
+            makefile.
+          + All Linux (libc and glibc) builds consolidated under "make
+            linux".
+          + HP-UX makefile targets now have consistent names.
+          + New aix50 and aix51 targets added.
+
+   C-Kermit 8.0.200 Final (12 Dec 2001)
+
+          + Remote/local-mode confusion on some platforms introduced in
+            Beta.04, fixed.
+          + Many of the makefile targets adjusted, new ones added.
+          + New "make install" target should please most people.
+          + New command: SHOW IKSD.
+          + FTP over TLS.
+          + Last-minute touchups to text messages, HELP text, etc.
+          + Enable modem-signal reading for SCO OSR5 and Unixware 7.
+          + Special superfast TRANSMIT /BINARY /NOECHO /NOWAIT mode
+            added.
+          + Fixed PBX dialing in unmarked-area-code case.
+          + Improved SHOW COMMUNICATIONS tells lockfile directory,
+            typical dialout device name.
+          + Some FTP OPEN command parsing problems fixed.
+          + Some errors in date arithmetic fixed.
+          + New command: SET TERMINAL AUTODOWNLOAD { ..., ERROR { STOP,
+            CONTINUE } }
+          + New command: HELP FIREWALL.
+          + SET MODEM HANGUP-METHOD DTR added as synomym for RS232-SIGNAL
+          + Support for secure URL protocols added: telnets:, ftps:,
+            https:.
+
+   C-Kermit 8.0.201 (8 Feb 2002)
+
+          + Installability as an [148]SSH v2 Subsystem.
+          + [149]SET LOCUS command.
+          + [150]L-versions of CD, DIR, DELETE, MKDIR, etc, to force
+            local execution.
+          + [151]USER and ACCOUNT added as synonyms for FTP USER and FTP
+            ACCOUNT.
+          + [152]SHOW VARIABLES now accepts a list of variables.
+          + Rudimentary support for [153]Caller ID when receiving phone
+            calls.
+          + Up/Down [154]Arrow-key navigation of command history buffer.
+          + [155]Automatic execution of customization file if init file
+            is missing.
+
+   C-Kermit 8.0.206 Beta.01 (11 Oct 2002)
+
+        New commands:
+
+               o ORIENTATION lists location-related variables and their
+                 values.
+               o KCD changes to special directories by their symbolic
+                 names ("kcd ?" for a list).
+               o SET CD HOME path to specify home directory for CD and
+                 KCD commands.
+               o CONTINUE given at top level is equivalent to END --
+                 handy when PROMPT'ed out of a script, to continue the
+                 script.
+
+        New switches or operands for existing commands:
+
+               o GETOK /TIMEOUT
+               o ASK, ASKQ, GETOK /QUIET (suppresses error message on
+                 timeout)
+               o COPY /APPEND now allows concatenating multiple source
+                 files into one dest file.
+               o SET TCP { HTTP-PROXY, SOCKS-SERVER } /USER, /PASSWORD.
+               o DIRECTORY command now accepts multiple filespecs, e.g.
+                 "dir a b c".
+
+        SET QUIET ON now also applies to:
+
+               o SET HOST connection progress messages.
+               o "Press the X or E key to cancel" file-transfer message.
+               o REMOTE CD response.
+               o REMOTE LOGIN response.
+
+        Improvements and new features:
+
+               o Numerous FTP client fixes and new features, listed
+                 below.
+               o C-Kermit, when in remote mode at the end of a file
+                 transfer, now prints a one-line "where" message. Control
+                 with SET TRANSFER REPORT.
+               o Unix makefile "install" target now creates an UNINSTALL
+                 script.
+               o Improved operation and performance on RFC 2217 Telnet
+                 connections.
+               o Improved CONNECT (interactive terminal connection)
+                 performance.
+               o HELP text updated for many commands.
+
+        New or fixed makefile targets:
+
+               o Solaris 9 (several variations)
+               o Concurrent PowerMAX
+               o Mac OS X 10.2
+               o FreeBSD 1.0
+               o FreeBSD 4.6, 5.0
+               o AIX 5.2, 5.3
+
+        Bugs fixed (general):
+
+               o Failure to run in VMS Batch fixed.
+               o LDIRECTORY fixed to run Kermit's built-in DIRECTORY
+                 command rather than an external one.
+               o Fixed Solaris and other SVORPOSIX builds to find out
+                 their full hostnames rather than just the "uname -n"
+                 name.
+               o Fixed some problems matching strings that start with
+                 ".".
+               o Fixed some problems matching pattern that contain
+                 {a,b,c} lists.
+               o Fixed erroneous reporting of text-mode reception as
+                 binary when sender did not report the file size
+                 (cosmetic only).
+               o Many problems with SWITCH statements fixed.
+               o Fixed SET OPTIONS DIRECTORY /DOTFILES to work for server
+                 too.
+               o Fixed DELETE to print an error message if the file was
+                 not found.
+               o Fixed SET CONTROL UNPREFIX ALL and SET PREFIXING NONE to
+                 do the same thing.
+               o Fixed bugs executing macros from within the ON_EXIT
+                 macro.
+               o \fday() and \fnday() fixed for dates prior to 17 Nov
+                 1858.
+               o Serial speed-changing bug in Linux fixed.
+               o "Unbalanced braces" script parsing errors when using
+                 \{number} fixed.
+               o "if defined \v(name)" fixed to behave as described in
+                 the book.
+               o Fixed Problems caused by LOCAL variables whose names are
+                 left substrings of macro names.
+               o The INPUT command was fixed to honor the PARITY setting.
+               o Fixed bug with COPY to existing file that is longer than
+                 source file.
+               o REINPUT command failed to strip braces/quotes around its
+                 target string.
+               o Network directory lookups didn't work for SSH
+                 connections.
+               o REMOTE SET { FILE, TRANSFER } CHARACTER-SET fixed.
+               o Closed some holes whereby an incompletely received file
+                 was not deleted when SET FILE INCOMPLETE is DISCARD,
+                 e.g. when the Kermit is hung up upon.
+               o SET XFER CHARACTER-SET TRANSPARENT fixed to do the same
+                 as SET XFER TRANSLATION OFF.
+               o SET HOST PTY (e.g. SSH) connection fixed to pass along
+                 window-size changes.
+               o C-Kermit search path for TAKE files was accidentally
+                 disabled.
+
+        FTP client bugs fixed:
+
+               o Character set translation was broken on little-endian
+                 (e.g. PC) architectures.
+               o FTP PUT /SERVER-RENAME:, /RENAME-TO:, /MOVE-TO: switches
+                 were sticky.
+               o Make SET TRANSFER MODE MANUAL apply to FTP.
+               o Make SET FILE INCOMPLETE { KEEP, DISCARD } apply to FTP.
+               o FTP MGET /UPDATE handled equal times incorrectly.
+               o FTP MGET /RECOVER fixed to ignore file dates, use only
+                 size.
+               o FTP MGET /RECOVER sometimes downloaded files it didn't
+                 need to.
+               o FTP downloads with TRANSFER DISPLAY BRIEF could give
+                 misleading error messages.
+               o FTP MGET temp file not deleted if FTP DEBUG set to OFF
+                 after it was ON.
+               o LOCUS not switched back when FTP connection is lost.
+               o Set incoming file date even if it was not completely
+                 received.
+               o FTP MGET sent SIZE and MDTM commands even when it didn't
+                 have to.
+               o FTP MGET sent SIZE and MDTM commands even when it knew
+                 they wouldn't work.
+               o FTP MGET failed if no files were selected for download.
+               o FTP MGET a* b* c* would fail to get any c*'s if no b*'s
+                 existed.
+               o Big problems canceling MGET with Ctrl-C.
+               o Some extraneous LOCUS dialogs squelched.
+               o Some inconsistencies in SET FTP FILENAMES AUTO fixed.
+               o Fixed file-descriptor pileup after multiple MGETs when
+                 using mkstemp().
+               o Fixed "mget foo", where foo is a directory name.
+
+        FTP improvements:
+
+               o New [156]FTP protocol features added (FEAT, MLSD).
+               o FTP MGET /RECURSIVE now works as expected if server
+                 supports MLSD.
+               o FTP MGET /DATES-DIFFER to download if local and remote
+                 file dates differ.
+               o FTP DATES default changed to ON.
+               o FTP MPUT, MGET /EXCEPT now allows up to 64 patterns (up
+                 from 8).
+               o Top-level SITE and PASSIVE commands added for
+                 convenience.
+               o MGET /COLLISION:APPEND /AS-NAME:newfile *.* puts all
+                 remote files into one local file.
+               o SET FTP SERVER-TIME-OFFSET for when server has wrong
+                 timezone set.
+               o Allow for alternative server interpretations of [M]MPUT
+                 /UNIQUE.
+               o SET FTP ANONOMOUS-PASSWORD lets you specify the default
+                 anonymous password.
+               o Allow "GET /RECURSIVE path/file" to force local
+                 subdirectory creation.
+               o SET FTP DISPLAY is like SET TRANSFER DISPLAY but applies
+                 only to FTP.
+               o FTP { ENABLE, DISABLE } new-protocol-feature-name.
+               o FTP MGET /NODOTFILES.
+               o Debug log now records FTP commands and responses in
+                 grep-able format.
+
+   [ [157]Top ] [ [158]Contents ] [ [159]C-Kermit ] [ [160]Kermit Home ]
+  __________________________________________________________________________
+
+1. FIXES SINCE VERSION 7.0.196 First, the changes from 7.0.196 to 7.0.197...
+Source and makefile tweaks to get successful builds on platforms that were not
+available in time for the 7.0 release:
+
+     * 4.2BSD
+     * 4.3BSD
+     * AIX 4.3
+     * AT&T 3B2 and 3B20
+     * BeOS 4.5
+     * CLIX
+     * Interactive UNIX System V/386 R3.2 V4.1.1
+     * OS-9/68000
+     * OSF/1 1.3.
+     * PS/2 AIX 1.2.1
+     * SCO OSR5.0.x
+     * SCO Xenix 2.3.4
+     * SINIX 5.41/Intel
+     * Stratus FTX
+     * Stratus VOS
+     * SunOS 4.1 with X.25
+     * Ultrix 4.2
+     * Unixware 2.0
+
+   There were no functional changes from 196 to 197.
+
+   Fixes applied after C-Kermit 7.0.197 was released:
+
+   Source code: Big flexelint and "gcc -Wall" audit and cleanup.
+
+   Configuration:
+     * Solaris RTS/CTS (hardware flow control) didn't work.
+     * BSDI RTS/CTS worked only in one direction.
+     * FreeBSD 4.0 with ncurses 5.0 broke interactive command parsing.
+     * QNX-32 build lacked -DBIGBUFOK so couldn't execute big macros.
+
+   Connections:
+     * SET HOST /PTY didn't work on some platforms.
+     * Broken SET HOST /USER:xxx /PASSWORD:yyy /ACCOUNT:zzz switches
+       fixed.
+     * Transparent printing was broken in Unix.
+     * ANSWER 0 (wait forever) didn't work.
+     * Some problems in Multitech modem command strings.
+     * Spurious "?Sorry, can't condition console terminal" errors.
+     * Disabling modem command strings by setting them to nothing broke
+       dialing.
+     * SET DIAL TIMEOUT value was usually ignored.
+     * SET DIAL METHOD PULSE didn't work.
+     * Certain modem commands, if changed, not refreshed if modem type
+       changed.
+     * SET SESSION-LOG command was missing from VMS.
+     * VMS session log format fixed for scripts.
+     * HANGUP by dropping DTR didn't work in NetBSD.
+     * SET FLOW /AUTO versus SET FLOW confusion fixed.
+     * Spurious secondary Solaris lockfile removed.
+     * SCO OSR5 DTR On/Off hangup.
+     * UUCP lockfile race condition.
+
+   Commands and scripts:
+     * Missing CAUTIOUS and FAST commands restored.
+     * Broken PTY command in late-model Linuxes fixed (API changed).
+     * Fixed off-by-one error in command recall when switching direction.
+     * Fixed recall of commands that contain '?'.
+     * COPY /SWAP-BYTES didn't work on some architectures.
+     * Various combinations of COPY switches didn't work.
+     * Various problems with COPY or RENAME with a directory name as
+       target.
+     * SHIFT didn't decrement \v(argc) if used within IF, ELSE, or SWITCH
+       block.
+     * SHIFT didn't affect the \%* variable.
+     * Divide by zero improperly handled in some \function()s.
+     * Problems with RETURN from right-recursive functions.
+     * FSEEK /LINE \%c LAST didn't work if already at end.
+     * Some buffer vulnerabilities and potential memory leaks were
+       discovered and fixed.
+     * \frdirectory() fixed not to follow symbolic links.
+     * SET EXIT WARNING OFF fixed to work when EXIT given in a script.
+     * Missing DELETE and MKDIR error message fixed.
+     * \fday() core dump for ancient dates fixed.
+
+   File transfer:
+     * SEND /COMMAND was broken.
+     * CRECEIVE was broken (but RECEIVE /COMMAND was OK).
+     * Quoting wildcard chars in filenames didn't work.
+     * Problems canceling streaming file transfers with X or Z.
+     * Problems shifting between streaming and windowing file transfer.
+     * Non-FULL file-transfer displays erroneously said STREAMING when
+       not.
+     * An active SEND-LIST prevented GET from working.
+     * SET SERVER GET-PATH interpretation of relative names like "." was
+       wrong.
+     * The MAIL command was broken.
+     * "kermit -s *" might have skipped some files.
+     * Transaction log entries were not made for external protocol
+       transfers.
+     * File count report fixed to show number of files actually
+       transferred.
+     * Fixed filename conversion to convert spaces to underscores.
+     * Made SET PREFIXING / SET CONTROL PREFIX also adjust CLEARCHANNEL.
+     * More "Receive window full" errors fixed.
+     * Broken terminal buffering after curses display in Solaris fixed.
+     * SET FILE INCOMPLETE DISCARD did not work in all cases.
+     * Packet log changed to reformat the start-of-packet character
+       printably.
+     * Dynamic timeouts could grow ridiculously large.
+
+   Character sets:
+     * Hebrew-7 translations missed the letter Tav.
+     * C1 area of CP1252 was ignored.
+     * SET TRANSFER CHARACTER-SET TRANSPARENT could give garbage
+       translations.
+     * TRANSLATE might not work on Little Endian architectures.
+     * Insufficient range checking in certain TRANSLATE operations.
+
+   The following bugs in C-Kermit 8.0.200 were fixed in 8.0.201:
+
+     * An obscure path through the code could cause the Unix version of
+       C-Kermit to dump core during its startup sequence. This happened
+       to only one person, but now it's fixed.
+     * When C-Kermit 8.0 is in Kermit server mode and the client says
+       "get blah", where blah (on the server) is a symlink rather than a
+       real file, the server unreasonably refused to send the linked-to
+       file.
+     * When C-Kermit is an FTP client and says "get foo/bar" (i.e. a
+       filename that includes one or more path segments), it failed to
+       accept the incoming file (this happened only with GET, not MGET).
+     * Array references should be case insensitive but only lowercase
+       array letters were accepted.
+     * SHOW VARIABLES dumped core on \v(sexpression) and \v(svalue).
+     * Spurious refusals of remote directory listings if the remote
+       server's date was set in the past.
+     * In AIX, and maybe elsewhere too, Kermit's COPY command always
+       failed with "Source and destination are the same file" when the
+       destination file didn't exist.
+     * The VMS version of C-Kermit did not work in Batch or when SPAWN'd.
+       To compound the problem, it also pretty much ignored the -B and -z
+       command-line options, whose purpose is to work around such
+       problems.
+     * C-Kermit 8.0 could not be built on IRIX 5.x.
+     * The C-Kermit 8.0 build for QNX6 said it was an "(unknown
+       version)".
+
+   Other fixes are listed in the [161]previous section.
+
+   [ [162]Top ] [ [163]Contents ] [ [164]C-Kermit ] [ [165]Kermit Home ]
+  __________________________________________________________________________
+
+2. SSH AND HTTP
+
+  2.1. SSH Connections
+
+     This section does not apply to [166]Kermit 95 2.0, which has its
+     own built-in SSH client, which is documented [167]SEPARATELY. 
+
+   On most UNIX platforms, C-Kermit can make SSH (Secure SHell)
+   connection by running the external SSH command or program through its
+   pseudoterminal interface. The command is:
+
+   SSH text
+          Tells Kermit to start the external SSH client, passing the
+          given text to it on the command line. Normally the text is just
+          the hostname, but it can be anything else that is acceptable to
+          the ssh client. If the command succeeds, the connection is made
+          and Kermit automatically enters CONNECT (terminal) mode. You
+          can use the SSH command to make a connection to any host that
+          has an SSH server.
+
+   Kermit's SSH command gives you all the features of Kermit on an SSH
+   connection: command language, file transfer, character-set
+   translation, scripting, and all the rest. By default, C-Kermit invokes
+   SSH with "-e none", which disables the ssh escape character and makes
+   the connection transparent for purposes of file transfer. You can,
+   however, change the SSH invocation to whatever else you might need (an
+   explicit path, additional command-line arguments, etc) with:
+
+   SET SSH COMMAND text
+          Specifies the system command that Kermit's SSH command should
+          use to invoke the external SSH client. Use this command to
+          supply a specific path or alternative name, or to include
+          different or more command-line options.
+
+   In most cases, these connections work quite well. They can be scripted
+   like any other connection, and file transfer goes as fast as, or
+   faster than, on a regular Telnet connection. In some cases, however,
+   the underlying pseudoterminal driver is a limiting factor, resulting
+   in slow or failed file transfers. Sometimes you can work around such
+   problems by reducing the Kermit packet length. Note that Kermit does
+   not consider SSH connections to be reliable, so it does not offer to
+   use streaming in Kermit protocol transfers (but you can force it with
+   SET RELIABLE or SET STREAMING if you wish).
+
+   The SSH command is like the TELNET command: it enters CONNECT mode
+   automatically when the connection is made. Therefore, to script an SSH
+   connection, use:
+
+  set host /pty ssh -e none [ other-options ] host
+  if fail ...
+
+   to make the connection.
+
+   Here's a sequence that can be used to make a connection to a given
+   host using Telnet if the host accepts it, otherwise SSH:
+
+  if not defined \%1 exit 1 Usage: \%0 host
+  set quiet on
+  set host \%1 23 /telnet
+  if fail {
+      set host /pty ssh -l \m(user) -e none \%1
+      if fail exit 1 \%1: Telnet and SSH both fail
+      echo SSH connection to \%1 successful
+  } else {
+      echo Telnet connection to \%1 successful
+  }
+
+   In SSH v2, it is possible to make an SSH connection direct to a Kermit
+   server system if the host administrator has configured the SSH server
+   to allow this; [168]CLICK HERE for details.
+
+   Since Kermit uses external ssh client software, and since there are
+   different ssh clients (and different releases of each one), the exact
+   command to be used to make an SSH/Kermit connection can vary. Here is
+   the command for the OpenSSH 3.0.2p1 client:
+
+set host /pipe ssh -e none [ -l username ] -T -s hostname kermit
+
+   Example:
+
+set host /pipe ssh -e none -l olga -T -s hq.xyzcorp.com kermit
+
+   The SSH client might or might not prompt you for a password or other
+   information before it makes the connection; this depends on your SSH
+   configuration (your public and private keys, your authorized hosts
+   file, etc). Here's a brief synopsis of the OpenSSH client command
+   syntax ("man ssh" for details):
+
+   -e none
+          This tells the SSH client to use no escape character. Since we
+          will be transferring files across the connection, we don't want
+          the connection to suddenly block because some character in the
+          data.
+
+   -l username
+          This is the username on the remote host. You can omit the -l
+          option and its argument if your local and remote usernames are
+          the same. If they are different, you must supply the remote
+          username.
+
+   -T
+          This tells the SSH client to tell the SSH server not to
+          allocate a pseudoterminal. We are not making a terminal
+          connection, we don't need a terminal, and in fact if a terminal
+          were allocated on the remote end, the connection would not
+          work.
+
+   -s ... kermit
+          This tells the SSH client to tell the SSH server to start the
+          specified subsystem ("kermit") once the connection is made. The
+          subsystem name comes after the hostname.
+
+   hostname
+          The IP host name or address of the desired host.
+
+   You might want to include other or additional ssh command-line
+   options; "man ssh" explains what they are. Here are some examples for
+   the OpenSSH 3.0.2p1 client:
+
+   -oClearAllForwardings yes
+   -oForwardAgent no
+   -oForwardX11 no
+   -oFallbackToRsh no
+          These ensure that a secure connection is used and that the
+          connection used for file transfer is not also used for
+          forwarding other things that might be specified in the
+          ssh_config file.
+
+   -oProtocol 2
+          (i.e. SSH v2) Ensures that the negotiated protocol supports
+          subsystems.
+
+   Once you have an SSH connection to a Kermit server, it's just like any
+   other connection to a Kermit server (and very similar to a connection
+   to an FTP server). You give the client file transfer and management
+   commands for the server, and the server executes them. Of course you
+   can also give the client any other commands you wish.
+
+   [ [169]SSH Kermit Server Subsystem ] [ [170]Kermit 95 Built-in SSH
+   Client ]
+     _________________________________________________________________
+
+  2.2. HTTP Connections
+
+   Hypertext Transfer Protocol, or HTTP, is the application protocol of
+   the World Wide Web (WWW), used between Web browsers (clients) and Web
+   servers. It allows a client to get files from websites, upload files
+   to websites, delete files from websites, get information about website
+   directories and files, and interact with server-side CGI scripts.
+   C-Kermit includes an HTTP client capable of both clear-text and secure
+   HTTP connections, that can do all these tasks and can be automated
+   through the Kermit scripting language.
+
+   Although C-Kermit 7.0 could make HTTP connections to Web servers, it
+   could do so only when no other connection was open, and the procedure
+   was somewhat awkward. C-Kermit 8.0 improves matters by:
+
+     * Allowing an HTTP connection to be open at the same time as a
+       regular SET LINE or SET HOST connection, and also at the same time
+       as an FTP connection ([171]Section 3);
+     * Upgrading the HTTP protocol level from 1.0 to 1.1, thus allowing
+       for persistent connections, in which a series of commands can be
+       sent on the same connection, rather than only one as in HTTP 1.0
+       (and C-Kermit 7.0);
+     * Providing for "one-shot" URL-driven HTTP operations such as GET or
+       PUT.
+     * Providing a distinct HTTP command-line personality.
+
+   Persistent HTTP connections are managed with the following commands:
+
+   HTTP [ switches ] OPEN [ security-options ] host-or-url [ port ] 
+          Opens a persistent connection to the specified host (IP host
+          name or address) on the specified port. If any switches
+          (options, listed in the next section) are included, their
+          values are saved and used for all subsequent HTTP action
+          commands on the same connection. If no port is specified, HTTP
+          (80) is used. A Uniform Resource Locator (URL, [172]RFC 1738)
+          can be given instead of a hostname (or address) and port (but
+          the URL can not include a directory/file path). The security
+          options are explained [173]below. The HTTP OPEN command
+          replaces the C-Kermit 7.0 SET HOST hostname HTTP command, which
+          no longer works with HTTP GET and related commands.
+
+   HTTP CLOSE
+          Closes any open HTTP connection and clears any saved switch
+          values.
+
+   A URL starts with a protocol name, which must be http or https in this
+   case; optionally includes a username and password; and must contain a
+   host name or address:
+
+  protocol://[user[.password]]@host[:port][URI]
+
+   HTTP is Hypertext Transfer Protocol. HTTPS is the secure (SSL/TLS)
+   version of HTTP. The TCP service port is derived from the protocol
+   prefix (so normally the ":port" field is omitted). Thus the URL
+   protocol name specifies a default TCP service port and the URL user
+   and password fields can take the place of the /USER and /PASSWORD
+   switches ([174]Section 2.2.1). The optional URI is a "compact string
+   of characters for identifying an abstract or physical resource"
+   ([175]RFC 2396), such as a file. It must begin with a slash (/); if
+   the URI is omitted, "/" is supplied. Examples:
+
+   http open http://www.columbia.edu/
+          Equivalent to http open www.columbia.edu or http open
+          www.columbia.edu http.
+
+   http open https://olga.secret@www1.xyzcorp.com/
+          Equivalent to http /user:olga /pass:secret open
+          www1.xyzcorp.com https.
+
+   Persistence is accomplished unilaterally by C-Kermit 8.0. An HTTP 1.0
+   server closes the connection after each action. Although HTTP 1.1
+   allows multiple actions on the same connection, an HTTP 1.1 server
+   tends to close the connection if it is idle for more than a few
+   seconds, to defend itself against denial-of-service attacks. But when
+   you use Kermit's HTTP OPEN command to create a connection, Kermit
+   reopens it automatically (if necessary) for each HTTP action until you
+   close it with HTTP CLOSE, regardless of the server's HTTP protocol
+   version, or how many times it closes the connection.
+
+   Firewalls can be negotiated through proxies with the following
+   commands:
+
+   SET TCP HTTP-PROXY [ host[:port] ]
+          If a host (by hostname or IP address) is specified, Kermit uses
+          it as a proxy server when attempting outgoing TCP connections
+          -- not only HTTP connections, but all TCP/IP connections,
+          Telnet and FTP included. This allows Kermit to adapt to the
+          HTTP firewall penetration method (as opposed to other methods
+          such as SOCKS4). If no hostname or ip-address is specified, any
+          previously specified Proxy server is removed. If no port number
+          is specified, the "http" service is used. This command must be
+          given before the HTTP OPEN command if a proxy is to be used or
+          canceled.
+
+   HTTP [ switches ] CONNECT host[:port]
+          Instructs the HTTP server to act as a proxy, establishing a
+          connection to the specified host (IP hostname or address) on
+          the given port (80 = HTTP by default) and to redirect all data
+          transmitted between Kermit and itself to the given host for the
+          life of the connection. This command is to be used only for
+          debugging HTTP proxy connections. If a proxy connection is
+          required, instruct Kermit to use the proxy with the SET TCP
+          HTTP-PROXY command.
+
+    2.2.1. HTTP Command Switches
+
+   HTTP switches, like all other switches, are optional. When HTTP
+   switches are included with the HTTP OPEN command, they apply
+   automatically to this and all subsequent HTTP actions (GET, PUT, ...)
+   on the same connection until an HTTP CLOSE command is given. So if you
+   include switches (or the equivalent URL fields, such as user and
+   password) in the HTTP OPEN command, you can omit them from subsequent
+   commands on the same connection. If the connection has closed since
+   your last command, it is automatically reopened with the same options.
+
+   If you include switches with an HTTP action command (such as GET or
+   PUT), they apply only to that command.
+
+   /USER:name
+          To be used in case a page requires a username for access. The
+          username is sent with page requests. If it is given with the
+          OPEN command it is saved until needed. If a username is
+          included in a URL, it overrides the username given in the
+          switch. CAUTION: Username and password (and all other
+          information, including credit card numbers and other material
+          that you might prefer to protect from public view) are sent
+          across the network in clear text on regular HTTP connections,
+          but authentication is performed securely on HTTPS connections.
+
+   /PASSWORD:text
+          To be used in case a web page requires a password for access.
+          The password is sent with page requests. If it is given with
+          the OPEN command it is saved until needed. If a password is
+          given in a URL, it overrides the one given here. CAUTION: (same
+          as for /USER:).
+
+   /AGENT:user-agent
+          Identifies the client to the server. Overrides the default
+          agent string, which is "C-Kermit" (for C-Kermit) or "Kermit-95"
+          (for Kermit 95).
+
+   /ARRAY:array-designator
+          Tells Kermit to store the response headers in the given array,
+          one line per element. The array need not be declared in
+          advance. Example: /array:&a.
+
+   /TOSCREEN
+          Tells Kermit to display any response text on the screen. It
+          applies independently of the output file specification; thus it
+          is possible to have the server response go to the screen, a
+          file, both, or neither.
+
+   /HEADER:header-item(s)
+          Used for specifying any optional headers to be sent with HTTP
+          requests.
+
+  /HEADER:tag:value
+
+          To send more than one header, use braces for grouping:
+
+  /HEADER:{{tag:value}{tag:value}...}
+
+          For a list of valid tags and value formats see [176]RFC 2616,
+          "Hypertext Transfer Protocol -- HTTP/1.1". A maximum of eight
+          headers may be specified.
+
+    2.2.2. HTTP Action Commands
+
+   HTTP actions can occur within a persistent connection, or they can be
+   self-contained ("connectionless"). A persistent HTTP connection begins
+   with an HTTP OPEN command, followed by zero or more HTTP action
+   commands, and is terminated with an HTTP CLOSE command:
+
+  http open www.columbia.edu
+  if failure stop 1 HTTP OPEN failed: \v(http_message)
+  http get kermit/index.html
+  if failure stop 1 HTTP GET failed: \v(http_message)
+  (more actions possible here...)
+  http close
+
+   A self-contained HTTP action occurs when a URL is given instead of a
+   remote file name to an HTTP action command. In this case, Kermit makes
+   the HTTP connection, takes the action, and then closes the connection.
+   If an HTTP connection was already open, it is closed silently and
+   automatically.
+
+  http get http://www.columbia.edu/kermit/index.html
+
+   Kermit's HTTP action commands are as follows. Switches may be included
+   with any of these to override switch (or default) values given in the
+   HTTP OPEN command.
+
+   HTTP [ switches ] GET remote-filename [ local-filename ]
+          Retrieves the named file from the server specified in the most
+          recent HTTP OPEN command for which a corresponding HTTP CLOSE
+          command has not been given. The filename may not include
+          wildcards (HTTP protocol does not support them). If no HTTP
+          OPEN command is in effect, this form of the HTTP GET command
+          fails. The default local filename is the same as the remote
+          name, but with any pathname stripped. For example, the command
+          http get kermit/index.html stores the file in the current local
+          directory as index.html. If the /HEADERS: switch is included,
+          information about the file is also stored in the specified
+          array (explained in [177]Section 2.2.3). All files are
+          transferred in binary mode. HTTP does not provide for
+          record-format or character-set conversion.
+
+   HTTP [ switches ] GET url [ local-filename ]
+          When HTTP GET is given a URL rather than a filename, Kermit
+          opens a connection to the designated server (closing any
+          previously open HTTP connection), gets the file, and then
+          closes the connection. If the URL does not include a filename,
+          index.html is supplied. This is the self-contained one-step
+          "connectionless" method for getting a file from a Web server.
+          The data is not interpreted; HTTP GET is like "lynx -source"
+          rather than "lynx -dump".
+
+   In the remaining HTTP action commands, the distinction between a
+   remote filename and a URL are the same as in the HTTP GET command.
+
+   HTTP [ switches ] HEAD remote-filename-or-url [ local-filename ]
+          Like GET except without actually getting the file; instead it
+          retrieves only the headers. If the /ARRAY: or /TOSCREEN switch
+          is included, there is no default local output filename but you
+          can still specify one. If neither of these switches is
+          included, the default local filename is the same as the remote
+          filename, but with any path stripped and with ".head" appended.
+          The HEAD command can be used in a script with the /ARRAY:
+          switch to retrieve information about the requested resource to
+          determine whether the resource should actually be retrieved
+          with a subsequent GET request.
+
+   HTTP [ switches ] INDEX remote-directory-or-url [ local-filename ]
+          Asks the server to send a listing of the files in the given
+          server directory. This command is not supported by most Web
+          servers. Even when it is supported, there is no standard format
+          for the listing.
+
+   HTTP [ switches ] POST [ /MIME-TYPE:type ] source-file
+          remote-path-or-url [ result-file ]
+          Sends data to a process running on the remote host; the result
+          is usually an HTML file but could be anything. The data to be
+          posted must be read from a local file (the source-file). If a
+          result file is specified, Kermit stores the server's response
+          in it.
+
+   HTTP [ switches ] PUT [ MIME-TYPE:type ] local-file [
+          remote-file-or-url [ result-file ] ]
+          Uploads a local file to the server. Only the name of a single
+          file can be given; wildcards (and group transfers) are not
+          supported by HTTP protocol. If no remote filename is given, the
+          file is sent with the same name as the local file, but with any
+          pathname stripped.
+
+   HTTP [ switches ] DELETE remote-file-or-url [ local-result-file ]
+          Asks the server to delete the specified single file. If a
+          result file is specified, it will contain any response data
+          returned by the server.
+
+   Note the limitations of HTTP protocol compared to (say) FTP or Kermit.
+   There is no command for changing directories, no standard way to get
+   file or directory lists, no way to transfer file groups by using
+   wildcard notation, etc, and therefore no good way to (say) fetch all
+   pages, descend through subdirectories, perform automatic updates, etc.
+   There is no assurrance a connection will stay open and, as noted,
+   there is no provision for data conversion between unlike platforms.
+   The data's MIME headers can be used for postprocessing.
+
+    2.2.3. HTTP Headers
+
+   Each HTTP request and response contains a set of name/value pairs
+   called headers. HTTP headers are specified in [178]RFC 2616. For
+   example, an HTTP GET request for /index.html on www.columbia.edu
+   contains the following headers:
+
+  GET /index.html HTTP/1.1
+  Host: www.columbia.edu:80
+  User-agent: C-Kermit 8.0
+  Authorization: Basic base64-encoded-username-password
+
+   These might be followed by any others specified with a /HEADERS:
+   switch:
+
+  Accept: image/gif, image/x-xbitmap, image/jpeg, *.*
+  Accept-Encoding: gzip
+  Accept-Language: en
+  Accept-Charset: iso-8859-1,utf-8
+  Cookie: cookie-data
+
+   The server sends back a short report about the file prior to sending
+   the file contents. Example:
+
+  HTTP/1.1 200 OK
+  Date: Fri, 24 Aug 2001 21:09:39 GMT
+  Server: Apache/1.3.4 (Unix)
+  Last-Modified: Mon, 06 Aug 2001 21:16:13 GMT
+  ETag: "1fa137-10d7-3b6f091d"
+  Accept-Ranges: bytes
+  Content-Length: 4311
+  Content-Type: text/html
+
+   If you want to have this information available to a Kermit script you
+   can use the /ARRAY switch to have Kermit put it in array, one line per
+   array element. Example:
+
+  set exit warning off
+  http open www.columbia.edu
+  if fail exit 1 Can't reach server
+  http /array:&a get /index.html
+  if fail exit 1 Can't get file
+  echo Header lines: \fdim(&a)
+  for \%i 1 \fdim(&a) 1 {
+      echo \%i. \&a[\%i]
+  }
+
+   Note that the "Date:" item is the current date and time; the
+   "Last-Modifed:" item is the file's modification date and time. An
+   example showing how to use this information is presented in
+   [179]Section 8.13.7.
+
+    2.2.4. Secure HTTP Connections
+
+   SSL/TLS (Secure Sockets Layer / Transport Layer Security) is the
+   protocol used to secure HTTP, SMTP, and other Internet applications.
+   See the [180]C-Kermit Reference Section 5.4 for an introduction to
+   SSL/TLS. To make a secure HTTP connection, you need:
+
+    1. A secure client (a version of C-Kermit or Kermit 95 with SSL/TLS
+       security built in). Type "check ssl" at the Kermit prompt to make
+       sure you have it.
+    2. A secure server to connect to.
+    3. The CA Root Certificate used to authenticate the server to the
+       client. (see [181]Section 15 of the security reference for an
+       introduction to certificates).
+
+   And you must make a connection to the secure HTTP port: service name
+   HTTPS, port number 443 (as opposed to service HTTP, port 80). You can
+   also make secure connections to other ports by including the /TLS or
+   /SSL switch with the HTTP OPEN command, if the host supports SSL/TLS
+   on the given port:
+
+   The quality of the SSL/TLS connection depends on the cipher suite.
+   There are several possibilities:
+
+   Anonymous cipher suite:
+          If an anonymous cipher suite is negotiated, the connection is
+          encrypted but there is no authentication. This connection is
+          subject to a Man-In-The-Middle (MITM) attack.
+
+   X.509 certificate on the server:
+          When you connect to certain secure servers, an X.509
+          certificate is returned. This certificate is issued to a
+          special hostname, something like www1.xyzcorp.com or
+          wwws.xyzcorp.com (rather than the normal www.xyzcorp.com). It
+          is signed by the host's Certificate Authority (CA). If the host
+          certificate is configured on the client, it can be used to
+          verify the certificate received from the server. If the
+          certificate it verified as authentic, a check is made to ensure
+          it has not expired and it was issued to the host you were
+          attempting to connect to. If you had asked to connect to (say)
+          www.xyzcorp.com but were given a certificate for
+          www1.xyzcorp.com, you would be prompted for permission to
+          continue.
+
+          If the verification succeeded, the connection would be
+          encrypted with one-way (server-to-client) authentication. This
+          connection is not subject to a MITM attack.
+
+          If a username and password are transmitted over this
+          connection, they are not subject to interception. However, the
+          standard risks associated with passing the password to the host
+          for verification apply; for example, if the host has been
+          compromised, the password will be compromised.
+
+   X.509 client certificate:
+          If a connection has been established with an X.509 server
+          certificate, the server can ask the client to send a
+          certificate of its own. This certificate must be verified
+          against a CA Root certificate. The certificate itself (or
+          subject info from the certificate) is used to determine the
+          authorization for the client, and if successful, the username
+          and password need not be sent to the server.
+
+   Kerberos 5:
+          Instead of using X.509 certifcates, Kerberos 5 can be used to
+          perform the authentication and key exchange. In this situation,
+          there is mutual authentication between the client and server.
+          The Kerberos 5 principal is used by the server to look up the
+          appropriate authorization data. There is no need to send
+          username and password.
+
+   An HTTP connection is made with the HTTP OPEN command:
+
+   HTTP [ switches ] OPEN [ { /SSL, /TLS } ] host [ port ] 
+          If /SSL or /TLS switches are included (these are synonyms), or
+          if the service is HTTPS or the port is 443, a secure connection
+          is attempted using the current authentication settings; see
+          HELP SET AUTHENTICATION for details ([182]Section 6.2 of the
+          security reference). If the no /SSL or /TLS switch is included
+          but the port is 443 or the service is HTTPS, a secure
+          connection is attempted. If an /SSL or /TLS switch is included
+          but a port is not specified, an SSL/TLS connection is attempted
+          on the default port (80).
+
+   Certificates are covered in the separate [183]Kermit Security
+   Reference for C-Kermit 8.0. You should let Kermit know to verify
+   certificates with the SET AUTHENTICATION TLS command. For example:
+
+   SET AUTHENTICATION TLS CRL-DIR directory
+          Specifies a directory that contains certificate revocation
+          files where each file is named by the hash of the certificate
+          that has been revoked.
+
+   SET AUTHENTICATION TLS CRL-FILE filename
+          Specifies a file that contains a list of certificate
+          revocations.
+
+   SET AUTHENTICATION TLS VERIFY-DIR directory
+          Specifies a directory that contains root CA certificate files
+          used to verify the certificate chains presented by the peer.
+          Each file is named by a hash of the certificate.
+
+   SET AUTHENTICATION TLS VERIFY-FILE filename
+          Specifies a file that contains root CA certificates to be used
+          for verifying certificate chains.
+
+   SET AUTHENTICATION TLS VERIFY OFF
+          Tells Kermit not to require a certificate and accept any
+          certificate that is presented regardless of whether it is
+          valid.
+
+   There are many other options; see the security document for details.
+
+   Now suppose you need need to fetch the file denoted by the following
+   URL:
+
+  https://myuserid:mypassword@wwws.xyzcorp.com/clients/info/secret.html
+
+   Once you have set up the handling of certificates as desired, you can
+   use the following Kermit commands:
+
+  http /user:myuserid /password:mypassword open www1.xyzcorp.com https
+  if success {
+      http get /clients/info/secret.html
+      http close
+  }
+
+   As another example, let's say that you have a web form you need to
+   populate with three fields: red,white and blue.
+
+  <FORM ACTION="http://www.xyzcorp.com/cgi-bin/form.cgi" METHOD="POST">
+  <INPUT NAME="Red">
+  <INPUT NAME="White">
+  <INPUT NAME="Blue">
+  </FORM>
+
+   You can handle this with the HTTP POST command. The data to be posted
+   is stored in the local file data.txt.
+
+  Red=seven stripes&White=six stripes&Blue=fifty stars
+
+   and the response from the server will be stored into response.txt.
+
+  http open www.xyzcorp.com http
+  if success {
+    http /array:c post data.txt /cgi-bin/form.cgi response.txt
+    http close
+  }
+
+   In this scenario, the Common Gateway Interface (CGI) sends a response
+   whether it succeeds or fails in a script-dependent manner. The script
+   can either report success and enclose the response data; or it might
+   send a 302 Found error which indicates that the "Location:" header
+   should be used to determine the URL at which the data can be found.
+
+    2.2.5. HTTP Variables
+
+   \v(http_code)
+          The HTTP protocol code number of the most recent server reply,
+          e.g. 404 for "not found".
+
+   \v(http_connected)
+          1 when an HTTP connection is open, 0 when there is no HTTP
+          connection.
+
+   \v(http_host)
+          If an HTTP connection is open, the hostname:port, e.g.
+          www.columbia.edu:80; otherwise, empty.
+
+   \v(http_message)
+          Server error message, if any, from most recent HTTP command.
+
+   \v(http_security)
+          A list of the security parameters and values for the current
+          connection, if any. Empty if the connection is not to a secure
+          server, or there is no connection.
+
+   To display all the HTTP variables at once, type SHOW VAR HTTP:
+
+  C-Kermit> http open www.columbia.edu
+  C-Kermit> http get lkjlkjlkjlkj 
+  C-Kermit> sho var http
+   \v(http_code) = 404
+   \v(http_connected) = 1
+   \v(http_host) = www.columbia.edu:80
+   \v(http_message) = Not Found
+   \v(http_security) = NULL
+  C-Kermit>
+
+    2.2.6. The HTTP Command-Line Personality
+
+   If you invoke C-Kermit with the name "http" or "https", you can use a
+   special set of HTTP-specific command-line options. You can do this by
+   creating a symbolic linke "http" or "https" to the C-Kermit 8.0
+   executable, or by having a separate copy of it called "http" or
+   "https". Here's the usage message ("http -h"):
+
+  Usage: ./http host [ options... ]
+   -h             This message.
+   -d             Debug to debug.log.
+   -S             Stay (issue command prompt when done).
+   -Y             Do not execute Kermit initialization file.
+   -q             Quiet (suppress most messages).
+   -u name        Username.
+   -P password    Password.
+   -g pathname    Get remote pathname.
+   -p pathname    Put remote pathname.
+   -H pathname    Head remote pathname.
+   -l pathname    Local path for -g, -p, and -H.
+   -z opt[=value] Security options...
+      cert=file   Client certificate file
+      certsok     Accept all certificates
+      key=file    Client private key file
+      secure      Use SSL
+      verify=n    0 = none, 1 = peer , 2 = certificate required
+
+   The "host" argument is the name of a Web host, e.g. www.columbia.edu.
+   The action options are -p, -g, and -H. If you give an action option,
+   Kermit does the action and then exits. If you give a host without an
+   action option, Kermit makes an HTTP connection to the host and then
+   gives you the C-Kermit prompt. Here's a simple example that fetches a
+   publicly readable Web page:
+
+  http www.columbia.edu -g kermit/index.html
+
+   If you need to access a website for which a username and password are
+   required, you can supply them on the command line with -u and -P. If
+   you include a username but omit the password, Kermit prompts you for
+   it:
+
+  http www.columbia.edu -u olga -p kermit/index.html -l index.html
+  Password:
+
+   Note that when PUT'ing files to websites, you have to supply both the
+   -p (remote pathname) and -l (local path) options.
+
+   If your version of Kermit is built with SSL/TLS security, you can also
+   use the -z option to make secure HTTP (https) connections.
+
+   Finally, as noted in [184]Section 16, you can also give a URL instead
+   of a host name and options.
+
+   [ [185]Top ] [ [186]Contents ] [ [187]C-Kermit Home ] [ [188]Kermit
+   Home ]
+  __________________________________________________________________________
+
+3. THE BUILT-IN FTP CLIENT
+
+     3.1.  [189]Making and Managing FTP Connections
+     3.2.  [190]Making Secure FTP Connections
+     3.3.  [191]Setting FTP Preferences
+     3.4.  [192]Managing Directories and Files
+     3.5.  [193]Uploading Files With FTP
+     3.6.  [194]Downloading Files With FTP
+     3.7.  [195]Translating Character Sets
+     3.8.  [196]FTP Command Shortcuts
+     3.9.  [197]Dual Sessions
+     3.10. [198]Automating FTP Sessions
+     3.11. [199]Advanced FTP Protocol Features
+
+   Earlier versions of C-Kermit and K95 included an FTP command, but it
+   simply invoked an external FTP client. Now, by popular demand, Kermit
+   includes its own built-in FTP client that offers the following
+   advantages over traditional FTP clients (and its previous interface to
+   them):
+
+     * Any of Kermit's built-in [200]security methods can be used to
+       establish and conduct secure FTP sessions with [201]FTP servers
+       that support these methods. (Security modules can be subject to
+       export restrictions.)
+     * Kermit's FTP client uses "passive mode" by default to avoid
+       blockage by firewalls and network address translators. Of course
+       active mode can be chosen too when needed.
+     * [202]Character sets can be translated as part of the transfer
+       process even when the FTP server does not support character-set
+       translation, including to/from the new Internet standard
+       international character set, [203]Unicode UTF-8. This includes
+       both the file's name and (for text files only) its contents.
+     * All of C-Kermit's [204]file-selection mechanisms are available:
+       size, date, name patterns and lists, exception lists, etc.
+     * [205]Atomic file movement capabilities are provided (delete, move,
+       or rename files automatically after successful transfer).
+     * The correct file type, "ascii" (i.e. text) or binary, is chosen
+       automatically for each file (explained in [206]Section 4), and any
+       mixture of text and binary files can be sent in a single
+       operation, even across platforms.
+     * Update mode ("don't bother transferring files that didn't change
+       since last time") and recovery (resumption of an interrupted
+       transfer from the point of failure) are available in both
+       directions.
+     * When uploading files from UNIX to UNIX, the file's permissions can
+       be preserved if desired.
+     * Recursive directory-tree PUTs are supported between any two
+       platforms that have tree-structured file systems. Recursive GETs
+       are supported between like platforms if the server cooperates and
+       between like or unlike platforms if the server supports MLSD
+       ([207]Section 3.11).
+     * When receiving files, all of Kermit's file collision actions are
+       available: backup, update, refuse, rename, etc.
+     * Multi-file transfers can be interrupted on a per-file basis,
+       automatically skipping to the next file.
+     * FTP sessions are [208]fully scriptable.
+     * An entire FTP session (connect, login, CD, upload or download,
+       logout) can be specified on the command line without using a
+       script.
+     * All of Kermit's logging options and formats are available to keep
+       an accurate and complete record of each connection and file
+       transfer, and to aid in troubleshooting.
+     * All of Kermit's file-transfer display options are available
+       (fullscreen, brief, CRT, serial, none).
+
+   And best of all:
+     * Kermit doesn't give you those annoying per-file prompts every time
+       you start a multi-file transfer without remembering to give a
+       "prompt" command first :-).
+
+   [ [209]Top ] [ [210]FTP Top ] [ [211]FTP Client Overview ] [ [212]FTP
+   Script Tutorial ] [ [213]C-Kermit Home ] [ [214]Kermit Home ]
+     _________________________________________________________________
+
+  3.1. Making and Managing FTP Connections
+
+   Each copy of Kermit can have one FTP connection open at a time. FTP
+   connections are independent of regular terminal connections; a
+   terminal connection (serial or network via SET LINE, DIAL, SET HOST,
+   TELNET, etc) may be, but need not be, open at the same time as an FTP
+   connection, and terminal connections can also be closed, and new
+   connections opened, without interfering with the FTP connection (and
+   vice versa). Thus, for example, Kermit can have an FTP connection and
+   a TELNET connection open to the same host simultaneously, using the
+   TELNET connection (e.g.) to send mail or take other desired actions as
+   various FTP actions complete. Of course, each copy of Kermit can do
+   only one thing at a time, so it can't (for example) transfer a file
+   with FTP and another file with Kermit protocol simultaneously.
+
+   A Kermit FTP session can be established by [215]command-line options,
+   by [216]URL, or by [217]interactive commands.
+
+    3.1.1. Kermit Command-Line Options for FTP
+
+   The new command-line option '-9' (sorry, we're out of letters) can be
+   used when starting C-Kermit, telling it to make an FTP connection:
+
+  kermit -9 hostname
+
+   or if a non-default FTP port is needed:
+
+  kermit -9 hostname:port
+
+   You can also specify the username on the command line with the -M ("My
+   User ID") option that was already there for other connection types:
+
+  kermit -9 hostname -M olga
+
+   If you specify the username on the command line, Kermit uses it when
+   making the connection and does not prompt you for it (but it does
+   prompt you for the password if one is required).
+
+   Once the connection is made, you get the regular Kermit prompt, and
+   can give interactive commands such as the ones described below. When
+   you give a BYE command, Kermit closes the session and exits, just as a
+   regular FTP client would do. If you don't want Kermit to exit when you
+   give a BYE command, include the -S ("Stay") option on the command
+   line.
+
+   Other Kermit command-line options that are not specific to non-FTP
+   connections should affect the FTP session in the expected ways; for
+   example, -i and -T force binary and text mode transfers, respectively.
+
+   File transfers can not be initiated on the "kermit -9" command line;
+   for that you need to use Kermit's FTP personality (next section) or
+   you can use URLs ([218]Section 3.1.3).
+     _________________________________________________________________
+
+    3.1.2. The FTP Command-Line Personality
+
+   If you want to replace your regular FTP client with C-Kermit, you can
+   make a link called "ftp" to the C-Kermit binary (or you can store a
+   copy of the C-Kermit binary under the name "ftp"). When C-Kermit is
+   invoked with a program name of "ftp" (or "FTP", case doesn't matter),
+   it assumes the command-line personality of the regular FTP client:
+
+  ftp [ options ] hostname [ port ]
+
+   In this case the options are like those of a regular FTP client:
+
+  -d  Debug: enables debug messages and creates a debug.log file.
+  -n  No autologin: Kermit should not send your user ID automatically.
+  -t  Packet trace: accepted but is treated the same as -d.
+  -v  Verbose: accepted but ignored (operation is verbose by default).
+  -i  Not interactive: accepted but ignored.
+
+   and the hostname can also be a URL (explained in [219]Section 3.1.3).
+   To specify a non-default TCP port for the FTP server, include the port
+   number or name after the hostname.
+
+   There are also some bonus options that allow you to execute an entire
+   FTP session from the shell command line, as long as you don't include
+   the -n option. These are not available with regular FTP clients, and
+   at least one of these options (-g) conflicts with UNIX ftp (where -g
+   means "no globbing", which does not apply to Kermit), and some of them
+   (like the options above) also conflict with regular Kermit
+   command-line options:
+
+  -m mode      = "passive" (default) or "active"
+  -Y            Don't execute the Kermit initialization file [1]
+  -q            Quiet, suppresses all but error messages [1]
+  -S            Stay, don't exit automatically [1]
+  -A            Autologin anonymously [2]
+  -u name       Username for autologin [2] (synonym: -M [1])
+  -P password   Password for autologin (see cautions below) [2]
+  -D directory  cd after autologin [2]
+  -b            Binary mode [2]
+  -a            Text ("ascii") mode [2] (synonym: -T [1])
+  -R            Recursive (works with -p) [4]
+  -p files      Files to put (upload) after autologin [2] (synonym: -s [1])
+  -g files      Files to get (download) after autologin [3]
+
+   [1] Same as Kermit, not available in regular FTP clients.
+   [2] Conflicts with Kermit, not available in regular FTP clients.
+   [3] Same as Kermit, conflicts with regular FTP clients.
+   [4] Conflicts with Kermit, available in some FTP clients.
+
+   Fancier options such as restart, character-set translation, filename
+   collision selection, automatic move/rename/delete, etc, are not
+   available from the command line; for these you can use the commands
+   described in the following sections. The -R option might also work
+   with -g (GET) but that depends on the server.
+
+   The following security options are also available, explained in
+   [220]Section 3.2:
+
+  -k realm      Kerberos 4 realm [4]
+  -f            Kerberos 5 credentials forwarding [4]
+  -x            autoencryption mode [4]
+  -c cipher     SRP cipher type [4]
+  -H hash       SRP encryption hash [4]
+  -z option     Security options [4]
+
+   If you include -A or specify a name of "anonymous" or "ftp", you are
+   logged in anonymously and, in the absence of -P, Kermit automatically
+   supplies a password of "user@host", where "user" is your local user
+   ID, and "host" is the hostname of the computer where Kermit is
+   running. If you do not include -p or -g, Kermit enters command mode so
+   you can type commands or execute them from a script.
+
+   If you include -p or -g, Kermit attempts to transfer the specified
+   files and then exits automatically at the end of the transfer unless
+   you also included -S (Stay). It uses the "brief" file transfer display
+   (one line per file) unless you include the -q option to suppress it.
+
+   When uploading files with -p, Kermit switches automatically between
+   text and binary mode for each file.
+
+   When downloading, you can either specify a particular mode (text or
+   binary) to be used for all the files, or you can let Kermit select the
+   type for each file automatically, based on its name (see [221]Sections
+   3.5 and [222]3.6 for greater detail). In UNIX be sure to quote any
+   wildcard characters to prevent the shell from expanding them, as shown
+   in the examples just below. Filename collisions are handled according
+   Kermit's FILE COLLISION setting (if specified in your Kermit
+   customization file; otherwise the default, which is BACKUP).
+
+   It should go without saying that the -P option should be used with
+   caution. In addition to the well-known risks of transmitting plaintext
+   passwords over the Internet, in this case the password also echos to
+   the screen if you type it, and can be seen in ps and w listings that
+   show the user's currently active command and command-line arguments.
+   Thus command-line FTP sessions are most appropriate for secure or
+   anonymous connections (those that do not require passwords).
+
+   Here's an example in which you download the latest C-Kermit "tarball"
+   from the Columbia University FTP archive:
+
+  ftp -A kermit.columbia.edu -bg kermit/archives/ckermit.tar.gz
+
+   This assumes that "ftp" is a symbolic link to C-Kermit. It logs you in
+   anonymously and gets the ckermit.tar.gz file in binary mode from the
+   kermit/archives directory.
+
+   Here's a slightly more ambitious example that illustrates CD'ing to
+   the desired server directory to get a group of files in text mode (in
+   this case the C-Kermit source files):
+
+  ftp -A kermit.columbia.edu -D kermit/f -ag "ck[cuw]*.[cwh]" makefile
+
+   In this case we CD to the kermit/f directory so we don't have to
+   include it in each file specification, and we quote the ck[cuw]*.[cwh]
+   specification so the shell doesn't expand it, since we have to pass it
+   as-is to the server. Note also that the quotes don't go around the
+   entire file list; only around each file specification that needs to be
+   quoted.
+
+   Here's one more example, that uploads a debug log file in binary mode
+   to the Kermit incoming directory (as we might ask you to do when
+   following up on a problem report):
+
+  ftp -A kermit.columbia.edu -D kermit/incoming -bp debug.log
+
+   In this case the -D option is required to tell the server where to put
+   the incoming file.
+
+   Unless the -Y option is included, your Kermit initialization file
+   (.mykermrc in UNIX, K95.INI in Windows) is executed before the command
+   line options, so you can set any FTP-related preferences there, as
+   described in the subsequent sections.
+     _________________________________________________________________
+
+    3.1.3. The FTP URL Interpreter
+
+   If Kermit is invoked with either its regular personality (as "kermit")
+          or its FTP personality (as "ftp"), you can also give a URL
+          (Universal Resource Locator) instead of a hostname and options,
+          with or without a username and password:
+          ftp ftp://user:password@host/path
+          ftp ftp://user@host/path
+          ftp ftp://@host/path   (or ftp://:@host/path)
+          ftp ftp://host/path
+          kermit ftp://host/path
+
+   If the FTP personality is used, the service must be "ftp". In all
+   cases, a hostname or address must be included. If a user is included
+   but no password, you are prompted for the password. If a path
+   (filename) is included:
+     * If "@" is included without a user, Kermit prompts for the username
+       and password.
+     * If no user and no "@" are included, "anonymous" is used.
+     * GET is assumed.
+
+   If no path (and no action options) are included, an interactive FTP
+          session is started, as in this example:
+          ftp ftp://kermit.columbia.edu
+
+   If a path is included, but a username is not included, "anonymous" is
+   used and an appropriate user@host password is supplied automatically.
+   If authentication is successful, Kermit attempts to GET the file
+   indicated by the path or, if the path is the name of a directory, it
+   asks the server for a directory listing. In both cases, Kermit
+   disconnects from the server and exits after the operation is complete
+   (unless you have included the -S option on the command line).
+
+   Here's an example that gets a listing of the Kermit directory at the
+          Kermit ftp site:
+          ftp ftp://kermit.columbia.edu/kermit/
+
+   This example gets the top-level READ.ME file from the same directory:
+          ftp ftp://kermit.columbia.edu/kermit/READ.ME
+
+   Here's the same example, but requesting a text-mode transfer:
+          ftp -T ftp://kermit.columbia.edu/kermit/READ.ME
+          This illustrates that you can mix command-line options and URLs
+          if you desire.
+
+   Here's an example that logs in as a (fictitious) real user to get a
+          file:
+          ftp ftp://olga@ftp.xyzcorp.com/resume.txt
+          The password is not included, so Kermit prompts for it.
+
+   This scheme allows Kermit to be used as the FTP helper of other
+   applications, such as Web browsers, with all its advantages over other
+   FTP clients (especially the ones that are built in to most Web
+   browsers), e.g. that it can be given wildcards, and it can pick text
+   and binary mode automatically for each file.
+
+   HINT: suppose somebody sends you an FTP URL in email, or you see it in
+   some text. If your terminal screen supports copy/paste, copy the url,
+   and then at the shell prompt type "kermit", a space, and then paste
+   the URL, e.g.:
+
+  $ kermit ftp://alpha.greenie.net/pub/mgetty/source/1.1/mgetty1.1.27-O
+
+   "$ is the shell prompt; the part you type is underlined, the rest is
+   pasted in. Kermit does the rest.
+     _________________________________________________________________
+
+    3.1.4. Interactive FTP Session Establishment
+
+   As you read this and the following sections, bear in mind that any
+   command that can be given at the prompt can also be used in a script
+   program. Kermit's script programming language is the same as its
+   interactive command language. [223]CLICK HERE if you would like to
+   learn a bit more about script writing.
+
+   An FTP session is established with the FTP OPEN command:
+
+   FTP [ OPEN ] [ { /SSL, /TLS } ] hostname [ switches ] [ port ]
+          Opens an FTP connection to the given host on the given port
+          and, if FTP AUTOLOGIN is ON, also logs you in to the server,
+          prompting for username and password if necessary. If no port is
+          specified, the regular FTP protocol port (21) is used. The OPEN
+          keyword is optional (unless the hostname conflicts with one of
+          the FTP command keywords, which you can list by typing "ftp
+          ?").
+
+   The hostname can be an IP host name, numeric IP address, or if you
+   have a network directory active (SET NETWORK DIRECTORY; see Chapter 6
+   of [224]Using C-Kermit), an entry name in the directory. In the latter
+   case, if the given hostname matches exactly one entry, the associated
+   name or address is used; if it matches more than one, Kermit cycles
+   through them until one is found that can be opened; if it matches
+   none, then the hostname is used as-is. If a directory is active but
+   you want to bypass directory lookup, include an "=" sign at the
+   beginning of the hostname, and/or use a numeric IP address.
+
+   When an FTP connection is opened, the default file-transfer mode is
+   set to binary if the client and server platforms are alike (e.g. both
+   of them are some kind of UNIX), and to text ("ascii") if they are not
+   alike. This has no particular effect for uploading since Kermit
+   automatically switches between text and binary mode for each file, but
+   might be important for downloading. The connection is also set to
+   Stream mode and File structure. Record- or page-oriented file
+   transfers are not supported by C-Kermit's FTP client.
+
+   The optional FTP OPEN switches are:
+
+   /ANONYMOUS
+          Logs you in anonymously, automatically supplying username
+          "anonymous" and user@host as the password, based on your local
+          user and host names.
+
+   /NOLOGIN
+
+          Overrides SET FTP AUTOLOGIN ON for this connection only.
+
+   /USER:name
+          Uses the given username to log you in, thus avoiding the Name:
+          prompt.
+          Overrides SET FTP AUTOLOGIN OFF for this connection only.
+
+   /PASSWORD:text
+          Uses the given text as your password, thus avoiding the
+          Password: prompt. This switch is not recommended for use in
+          script files, which would be a security risk.
+
+   /ACCOUNT:text
+          Uses the given text as your account (or secondary password,
+          depending on the requirements of the server; most servers do
+          not require or accept an account name). If an account is not
+          supplied, you are not prompted for one.
+
+   /PASSIVE
+          Opens the connection in passive mode. Passive mode is the
+          default in Kermit's FTP client, unlike in most others, since it
+          works better through firewalls. The /PASSIVE and /ACTIVE
+          switches apply only to the connection that is being opened, and
+          do not affect the global FTP PASSIVE-MODE setting.
+
+   /ACTIVE
+          Opens the connection in active mode. Use this switch if the
+          server does not support passive mode, or use the command SET
+          FTP PASSIVE-MODE OFF.
+
+   /NOINIT
+          Added in C-Kermit 8.0.201.   Tells C-Kermit not to send REST,
+          STRU, FEAT, and MODE commands to the server when the connection
+          is opened, since these have been reported to cause confusion in
+          certain servers.
+
+   When a username or password is missing, a prompt is issued at the
+   controlling terminal and you must type the response; the response can
+   not be scripted. Use the switches to avoid prompts, or one of the
+   secure authentication methods described in the next section, or see
+   [225]SET FTP AUTOLOGIN and the [226]FTP USER and similar commands
+   described later in this section.
+
+   Examples:
+
+  ftp open kermit.columbia.edu /anonymous  ; Open and log in anonymously
+  ftp kermit.columbia.edu /anonymous       ; The OPEN keyword can be omitted
+  ftp xyzcorp.com                          ; Open and maybe prompt for username
+  ftp xyzcorp.com /user:olga               ; Open and log in as olga
+  ftp testing.abccorp.com 449              ; Specify a special TCP port number
+  ftp testing.abccorp.com /user:olaf /password:secret 449
+
+   The FTP OPEN command succeeds if a connection was opened to the server
+   (even if the given username and password were not valid) and fails
+   otherwise (see [227]Section 3.8 for details).
+
+   When your FTP session is complete, you can terminate it as follows:
+
+   FTP BYE
+          Closes the FTP connection if one was open. The FTP prefix can
+          be omitted if no other connection is open at the same time (see
+          [228]Section 3.8 for details). If a connection log is active,
+          an FTP record is written to it. If Kermit was started with the
+          -9 command-line option or with its FTP command-line
+          personality, and the -S (Stay) option was not given, AND there
+          is no other active connection, the FTP BYE command also exits,
+          just as it does on a regular FTP client. Synonyms: FTP CLOSE,
+          FTP QUIT (but if the FTP prefix is omitted from QUIT, this
+          becomes the regular Kermit QUIT command, which is equivalent to
+          EXIT; i.e. it closes the connection and exits from Kermit).
+
+   The following commands can be used to achieve greater control over the
+   connection and login process:
+
+   SET FTP ANONYMOUS-PASSWORD text
+          Allows you to choose the password text to be sent automatically
+          by Kermit when you open an FTP connection with the /ANONYMOUS
+          switch.
+
+   SET FTP AUTOLOGIN { ON, OFF }
+          If you give this command prior to opening an FTP connection, it
+          controls whether Kermit tries to log you in automatically as
+          part of the connection process. Normally ON, which means the
+          username and password are sent automatically (and prompted for
+          if they are not yet known). When OFF, FTP OPEN connects to the
+          server without logging in. OFF is equivalent to the -n
+          command-line option when using Kermit's FTP command-line
+          personality.
+
+   FTP USER name [ password [ account ] ]
+          Used to log in to an FTP server to which a connection has been
+          made without autologin, or when autologin failed. If the
+          password is furnished on the command line, it is used;
+          otherwise you are prompted for a password. An account may also
+          be furnished if required by the server; it is not required by
+          Kermit and is not prompted for if omitted. Synonyms: USER, FTP
+          LOGIN.
+
+   FTP ACCOUNT text
+          Sends an account name to a server that supports accounts. If
+          the server does not support accounts, an error response occurs.
+          If the server does support accounts, the account is accepted if
+          it is valid and rejected if it is not. The account might be
+          used for charging purposes or it might be a secondary password,
+          or it might be used for any other purpose, such as an access
+          password for a particular disk. Servers that support accounts
+          might or might not allow or require the account to be sent
+          prior to login; usually it is sent after login, if at all.
+          Synonym: ACCOUNT.
+
+   Example:
+
+set ftp autologin off                  ; One thing at a time please
+ftp xyzcorp.com                        ; Try to make the connection
+if fail exit 1 FTP connection failed   ; Check that it was made
+ftp user olga secret                   ; Now log in to the server
+if fail exit 1 FTP login failed        ; Check that it worked
+ftp account 103896854                  ; Login OK - send account
+if fail echo WARNING - FTP ACCT failed ; Warn if problem
+...                                    ; (have session here)
+bye                                    ; Log out and disconnect
+
+   The following commands are used to control or get information about
+   the FTP connection. Any particular FTP server does not necessarily
+   support all of them.
+
+   FTP RESET
+          Terminates a user session but leaves the connection open,
+          allowing a new login via FTP USER.
+
+   FTP IDLE [ number ]
+          Most FTP servers automatically log you out and and disconnect
+          your session if there has been no activity for a certain amount
+          of time. Use this command to ask the server to set its idle
+          limit to the given number of seconds. Omit the number to ask
+          the server to inform you of its current idle limit.
+
+   FTP STATUS [ filename ]
+          Asks the FTP server to send information about the current
+          session. The result is a free-format report that might include
+          server identification, username and login time, FTP protocol
+          settings, and file-transfer statistics. If a filename is given,
+          the server is supposed to send detailed information about the
+          file.
+
+   FTP SYSTEM
+          Asks the FTP server to identify its operating system (Listed in
+          Internet Assigned Numbers, Operating System Names). Examples:
+          UNIX, VMS, VM/CMS, WINDOWS-NT. Unfortunately many variations
+          are allowed (e.g. LINUX-2.0, LINUX-2.2, FREEBSD, ULTRIX, etc,
+          instead of UNIX; WINDOWS-NT-3, WINDOWS-NT-3.5, WINDOWS-NT-3.51,
+          WINDOWS-NT-4, etc). The report might also include other
+          information like "Type L8", "Type I", or "Type A", indicating
+          the file-transfer mode.
+
+   FTP HELP [ keyword [ keyword [ ... ] ]
+          Asks the server to list the commands it supports. The response
+          is usually cryptic, listing FTP command mnemonics, not the
+          commands used by the client (since the server has no way of
+          knowing anything about the client's user interface). For
+          example, the PUT command is STOR in FTP protocol. If a keyword
+          is given, which should be an FTP protocol command,
+          slightly-more- detailed help is given about the corresponding
+          command (if the FTP server supports this feature). Examples:
+          "ftp help", "ftp help stor".
+
+   FTP SITE text
+          (Advanced) Sends an FTP SITE (site-specific) command. Usually
+          this means that the FTP server is asked to run an external
+          command with the given arguments. You might be able to find out
+          what SITE commands are available by sending "ftp help site" to
+          the server, but in general the availability of and response to
+          SITE commands is (not surprisingly) site specific.
+
+   FTP QUOTE text
+          (Advanced) Sends an FTP command in FTP protocol format. Use
+          this command to send commands to the server that the FTP client
+          might not know about.
+
+   SHOW FTP
+          Lists client (Kermit) FTP settings and information. Also SHOW
+          CONNECTION, SHOW COMMUNICATIONS.
+
+   HELP FTP [ keyword ]
+          Asks Kermit to list and describe its built-in FTP commands.
+
+   HELP SET FTP [ keyword ]
+          Asks Kermit to list and describe its built-in SET FTP commands.
+
+   [ [229]Top ] [ [230]FTP Top ] [ [231]C-Kermit Home ] [ [232]Kermit
+   Home ]
+     _________________________________________________________________
+
+  3.2. Making Secure FTP Connections
+
+   Also see: [233]Accessing IBM Information Exchange with Kermit.
+
+   In the previous section, you can see several examples of traditional
+   insecure authentication: username and password sent across the network
+   in clear text. Of course this is bad practice on at least two counts:
+   (1) storing passwords in files (such as script files) gives access to
+   the target systems to anybody who can obtain read access to your
+   scripts; and (2) sending this information over the network leaves it
+   open to interception by network sniffers or compromised hosts.
+
+   Because of the increasing need for security on the Internet, FTP
+   servers are beginning to appear that offer secure forms of
+   authentication, in which no information is sent over the network that
+   would allow anyone who intercepts it to usurp your identity and gain
+   your access rights.
+
+   Kermit provides an equivalent form of FTP security for each type of
+   IETF standard security implemented in Telnet. These include
+   GSSAPI-KERBEROS5, KERBEROS4, Secure Remote Password (SRP), and
+   Transport Layer Security (SSL and TLS). It does not presently include
+   SSL tunneling nor any form of SSH v1 or v2. When Kermit is built with
+   the necessary libraries, secure FTP connections are attempted by
+   default, in which all connections are authenticated and the command
+   and data channels are private.
+
+   The use of authentication and encryption for FTP connections can be
+   adjusted with the commands listed below, which are available only if
+   your version of Kermit was built with the corresponding security
+   options and libraries:
+
+   SET FTP AUTHTYPE { AUTOMATIC, GSSAPI-KRB5, KERBEROS4, SRP, SSL, TLS }
+          Specifies an ordered list of authentication methods to be
+          attempted when AUTOAUTHENTICATION is ON. The default list is:
+          GSSAPI-KRB5, SRP, KERBEROS_V4, TLS, SSL. If none of the
+          selected methods are supported by the server, an insecure login
+          is used as a fallback. Note, by the way, that SSL or TLS can be
+          used to secure an anonymous connection.
+
+   SET FTP AUTOAUTHENTICATION { ON, OFF }
+          Tells whether authentication should be negotiated by the FTP
+          OPEN command. Default is ON. Use SET FTP AUTOAUTHENTICATION OFF
+          to force a clear-text, unencrypted connection to FTP servers
+          (such as the one at the Kermit FTP site) that normally would
+          try to negotiate secure authentication and encryption.
+
+   SET FTP AUTOENCRYPTION { ON, OFF }
+          Tells whether encryption (privacy) should be negotiated by the
+          FTP OPEN command, which can happen only if secure
+          authentication is also negotiated. Default is ON.
+
+   SET FTP AUTOLOGIN { ON, OFF }
+          Tells Kermit whether to try logging in automatically when you
+          make an FTP connection, as opposed to letting you do it "by
+          hand" with the FTP USER command.
+
+   SET FTP COMMAND-PROTECTION-LEVEL { CLEAR, CONFIDENTIAL, PRIVATE, SAFE
+          }
+          Determines the level of protection applied to the command
+          channel:
+
+  CLEAR         Data is sent in plaintext and not protected against tampering.
+  CONFIDENTIAL  Data is encrypted but not protected against tampering.
+  PRIVATE       Data is encrypted and is protected against tampering.
+  SAFE          Data is sent in plaintext but protected against tampering.
+
+          The default is PRIVATE.
+
+   SET FTP CREDENTIAL-FORWARDING { ON, OFF }
+          Tells whether end-user credentials are to be forwarded to the
+          server if supported by the authentication method (GSSAPI-KRB5
+          only). This is often required to allow access to distributed
+          file systems (e.g. AFS.)
+
+   SET FTP DATA-PROTECTION-LEVEL { CLEAR, CONFIDENTIAL, PRIVATE, SAFE }
+          Tells what level of protection is applied to subsequent data
+          channels. The meanings of the protection-level keywords are the
+          same as for SET FTP COMMAND-PROTECTION-LEVEL. The default is
+          PRIVATE.
+
+   SET FTP SRP CIPHER name
+          Specifies the cipher to be used for encryption when SRP
+          authentication is in use. The list of possible choices is
+          computed based on the capabilities of the local SRP library and
+          includes NONE plus zero or more of the following:
+
+  BLOWFISH_ECB        CAST5_ECB          DES_ECB          DES3_ECB
+  BLOWFISH_CBC        CAST5_CBC          DES_CBC          DES3_CBC
+  BLOWFISH_CFB64      CAST5_CFB64        DES_CFB64        DES3_CFB64
+  BLOWFISH_OFB64      CAST5_OFB64        DES_OFB64        DES3_OFB64
+
+          The default is DES3_ECB.
+
+   SET FTP SRP HASH name
+          Specifies the hash to be used for data protection when SRP
+          authentication is in use. The choices are MD5 and SHA. The
+          default is SHA.
+
+   Command-line options:
+
+   -k name
+          Specifies the realm to be used with Kerberos 4 authentication
+          (= SET AUTH K4 REALM name).
+
+   -f
+          Enables forwarding of Kerberos 5 credentials to the host when
+          using GSSAPI authentication (= SET AUTH K5 FORWARDABLE ON).
+
+   -x
+          Enables autoencryption (= SET FTP AUTOENCRYPTION ON).
+
+   -c cipher
+          Specifies the kind of cipher to be used for encryption with SRP
+          authentication. Equivalent to SET FTP SRP CIPHER, with the same
+          choices. If this option is not given, CAST5_CBC is used.
+
+   -H hash
+          Specifies the hash to be used for encryption with SRP
+          authentication. Equivalent to SET FTP SRP HASH, with the same
+          choices. If this option is not given, SHA is used.
+
+   -z debug
+          Turns on SSL/TLS debugging.
+
+   -z secure
+          Requires secure connection.
+
+   -z certsok
+          Says to accept all certificates without checking validity.
+
+   -z verify=n
+          Sets certificate verification mode to the given number, n:
+            0 = no verification
+            1 = verify certificate if presented
+            2 = require verification of certificate
+
+   -z cert=filename
+          Specifies a file containing a client certificate to be
+          presented to the FTP server.
+
+   -z key=filename
+          Specifies a file containing a private key matching the client
+          certificate.
+
+   -z !krb4
+          (nokrb4) Disables the use of Kerberos 4.
+
+   -z !gss
+   -z nogss
+          Disables the use of GSSAPI - Kerberos 5.
+
+   -z !srp
+   -z nosrp
+          Disables use of SRP.
+
+   -z !ssl
+   -z nossl
+          Disables the use of SSL.
+
+   -z !tls
+   -z notls
+          Disables the use of TLS.
+
+   Caution: If your FTP connection is secured via AUTH TLS, it is not
+   possible to interrupt a file transfer. This is a limitation of all
+   known FTP servers that support AUTH TLS.
+
+   Note that when using certain security methods, such as SSL or TLS, you
+   may be prompted to confirm or verify certain actions or conditions,
+   for example, whether to accept self-signed certificates. This can
+   interfere with unattended operation of scripts; see [234]Section 3.10.
+
+   [ [235]Top ] [ [236]FTP Top ] [ [237]C-Kermit Home ] [ [238]Kermit
+   Home ]
+     _________________________________________________________________
+
+   3.3. Setting FTP Preferences FTP preferences can be set globally and
+   persistently with the commands in the following sections; many of
+   these can also be overridden on a per-command basis with switches that
+   have the same name.
+
+    3.3.1. Logs, Messages, and Other Feedback
+
+   You can control the amount of feedback received from your FTP session
+   with the commands in this section. First, you can create a log of your
+   FTP transfers with the following commands:
+
+   SET TRANSACTION-LOG { VERBOSE, FTP, BRIEF }
+          Selects the log format. VERBOSE is the default, and is
+          described in [239]the manual. FTP chooses a WU-FTPD format, the
+          same as is used by the popular FTP server. BRIEF creates
+          per-file records in comma-separated-list format. For greater
+          detail, see [240]Section 4.17 of the [241]C-Kermit 7.0 Update
+          Notes.
+
+   LOG TRANSACTIONS filename
+          Records FTP (or Kermit, or any other protocol) uploads and
+          downloads in the given file using the format selected by the
+          most recent SET TRANSACTION-LOG command, if any, or else the
+          default format.
+
+   FTP screen messages and displays are controlled by the following
+   commands:
+
+   SET TRANSFER DISPLAY { FULLSCREEN, CRT, SERIAL, BRIEF, NONE, OFF }
+          FTP transfers use Kermit's normal file-transfer display styles.
+          Use this command to choose the desired format; the default on
+          most platforms is FULLSCREEN. The display is automatically
+          disabled if Kermit is running in the background or in batch.
+          BRIEF is always used for command-line initiated transfers
+          (unless suppressed by -q). While a file-transfer is in
+          progress, you can interrupt it in the normal Kermit way by
+          typing one of the following keys or key combinations:
+            X - Cancel current file but go on to the next one (if any).
+            Z - Cancel the entire transfer.   Ctrl-L or Ctrl-W - Refresh
+          the file-transfer display (if any).
+
+   SET FTP DISPLAY { FULLSCREEN, CRT, SERIAL, BRIEF, NONE, OFF }
+          Like SET TRANSFER DISPLAY, but applies only to FTP connections,
+          and does not affect Kermit- or other protocol file transfers.
+
+   SET QUIET { ON, OFF }
+          This command applies to Kermit in general, not just FTP. OFF by
+          default; when ON, it surpresses most messages from most
+          commands as well as the file-transfer display.
+
+   SET FTP PROGRESS-MESSAGES { ON, OFF }
+          Tells whether Kermit should print locally-generated feedback
+          messages for each non-file-transfer command. ON by default.
+
+   SET FTP VERBOSE-MODE { ON, OFF }
+          Tells whether to display all responses from the FTP server. OFF
+          by default. This shows all responses to all commands, except
+          when the file-transfer display is active, and unless you have
+          SET QUIET ON. When OFF, responses are shown only for commands
+          such as FTP PWD whose purpose is to display a response.
+
+   SET FTP DEBUG { ON, OFF }
+          Tells whether local client debugging information should be
+          displayed. OFF by default. When ON, the commands that are sent
+          to the server are shown, as well as its responses (even if
+          VERBOSE-MODE is OFF), plus additional informational messages
+          are printed regarding the progress of secure operations. Also,
+          the temporary file created by the [242]MGET command is not
+          deleted so you can see what's in it.
+
+   Set all of these to OFF when silent running is desired.
+
+    3.3.2. Operational Preferences
+
+   FTP DISABLE new-protocol-feature-name
+   FTP ENABLE new-protocol-feature-name
+          Explained in [243]Section 3.11.
+
+   SET FTP AUTOLOGIN { ON, OFF }
+          If you give this command prior to opening an FTP connection, it
+          controls whether Kermit tries to log you in automatically as
+          part of the connection process. Normally ON, which means the
+          username and password are sent automatically (and prompted for
+          if they are not yet known). When OFF, FTP OPEN connects to the
+          server without logging in. OFF is equivalent to the -n
+          command-line option when using Kermit's FTP command-line
+          personality. See [244]Section 3.1.4 for usage.
+
+   SET FTP PASSIVE-MODE { ON, OFF }
+          ON by default, to avoid random TCP port assignment for data
+          connections, which can prevent FTP protocol from working
+          through firewalls and network address translators (for more on
+          these topics, see the [245]Kermit security reference. Set to
+          OFF in case the FTP server does not support passive mode, or in
+          case the client has problems with it (it has been observed, for
+          example, that when using passive mode, the SCO XENIX 2.3.4
+          TCP/IP stack hangs in the connect() call forever). Synonyms:
+          PASSIVE [ ON ], PASSIVE OFF, PASV [ ON ], PASV OFF.
+
+   SET FTP SEND-PORT-COMMANDS { ON, OFF }
+          This command determines whether the FTP client sends a new PORT
+          command to the server when accepting incoming data connections
+          (as when not using passive mode.) When PASSIVE-MODE is OFF and
+          SET SEND-PORT is OFF, the port that was originally specified is
+          reused. This is the default behavior for normal FTP clients but
+          it is not compatible with many firewalls.
+
+   SET FTP CHARACTER-SET-TRANSLATION { ON, OFF }
+          Whether to translate character sets when transferring files
+          with FTP (explained in [246]Section 3.7). OFF by default.
+
+   SET FTP SERVER-CHARACTER-SET name
+          Tells Kermit the character set used by the FTP server, UTF-8 by
+          default ([247]Section 3.7).
+
+   SET FTP SERVER-TIME-OFFSET delta-time
+          Tells Kermit to apply the given [248]delta time to file
+          timestamps provided by the server for its files; for use when
+          (for example) the server does not have its timezone set
+          correctly.
+
+   SET FTP ERROR-ACTION { PROCEED, QUIT }
+          When transferring a group of files with FTP, and an error
+          occurs with one of the files, Kermit normally goes on the next
+          file. Use SET FTP ERROR-ACTION to QUIT to make Kermit stop the
+          transfer immediately and fail if an error occurs with any
+          single file in the group. Example: you have given Kermit a list
+          of files to send, and one of the files can not be found, or
+          read permission is denied. Note that cancelling a file by
+          typing 'X' during transfer is not considered an error (if you
+          want to cancel the entire transfer, type 'Z' or Ctrl-C).
+
+   SET FTP PERMISSIONS { AUTO, ON, OFF }
+          When uploading files with PUT or MPUT, this tells whether
+          Kermit should send each file's permissions. The default is OFF,
+          which means not to send permissions, in which case the uploaded
+          file's permissions are set by the FTP server according to its
+          own criteria. ON means to send them, AUTO means to send them
+          only if the client (Kermit) and server are on like platforms
+          (e.g. both UNIX). This command has no effect when downloading,
+          since the FTP protocol does not include a way for the server to
+          inform the client of a file's permissions. Also see [249]FTP
+          PUT /PERMISSIONS. Note that setting permissions after uploading
+          is likely to work (correctly or at all) only when the client
+          and server platforms are alike (e.g. both of them are some form
+          of UNIX). Also note that Windows files don't have permissions.
+          Also see [250]FTP CHMOD.
+
+   SET FTP DATES { ON, OFF }
+          When downloading files with GET or MGET, this tells whether
+          Kermit should try to set the received file's date from the
+          server's date. FTP DATES is ON by default. Note, however, that
+          FTP protocol does not allow date preservation when uploading.
+          So at best, SET FTP DATES ON can work only when downloading,
+          and then only when the server agrees to furnish file dates.
+
+   SET FTP FILENAMES { AUTO, CONVERTED, LITERAL }
+          When uploading (sending) files, this tells whether to convert
+          outbound filenames to "common form". This means allowing only
+          one period in a name, uppercasing any lowercase letters,
+          replacing spaces by underscores, etc. AUTOMATIC is the default,
+          meaning LITERAL when client and server are the same type of
+          system (e.g. UNIX) and CONVERTED otherwise. Special case: if
+          the setting is AUTOMATIC and the client is not UNIX and the
+          server identifies itself as UNIX, Kermit uses a less-strict
+          form of conversion, in which lowercase letters are not
+          uppercased and the filename can contain any number of periods,
+          but spaces are still converted to underscore. When receiving,
+          conversion generally means to change all-uppercase names to
+          lowercase and spaces to underscore.
+
+   SET FTP UNIQUE-SERVER-NAMES { ON, OFF }
+          Applies only to uploads. Tells the server to create new, unique
+          names for incoming files that have the same names as existing
+          files. OFF by default, in which case the server overwrites
+          existing files with new files of the same name. When ON, the
+          server uses its own built-in method for creating new names for
+          incoming files; for example, appending a period (.) and a
+          number to the name. CAUTION: Use this option only if you do not
+          need to refer to the file after it is uploaded, since FTP
+          protocol provides no mechanism for the client to find out what
+          name was assigned by the server.
+
+   SET FTP COLLISION { ... }
+          When downloading, what to do if an incoming file has the same
+          name as an existing file. Options are the same as for SET FILE
+          COLLISION. If this command is not given, Kermit's regular FILE
+          COLLISION setting is used. If this command is given, it
+          overrides the FILE COLLISION setting for FTP transfers only.
+          See [251]Section 3.6.2 for details.
+
+   SET FTP TYPE { TEXT, BINARY, TENEX }
+          Changes the default transfer mode. When sending (uploading)
+          files, this command has no effect unless you disable automatic
+          text/binary mode switching ([252]Section 4) with SET FILE SCAN
+          OFF or SET TRANSFER MODE MANUAL. When receiving (downloading)
+          files, this command establishes the transfer mode to be used
+          when a filename does not match any of Kermit's text or binary
+          filename patterns, unless you use SET FTP
+          GET-FILETYPE-SWITCHING or SET TRANSFER MODE MANUAL to disable
+          automatic switching, in which case, this command establishes
+          the transfer mode for all downloaded files. In all cases,
+          however, the FTP TYPE can be overridden in any GET or PUT
+          command by including a /TEXT (/ASCII), /BINARY, or /TENEX
+          switch. The FTP TYPE is independent of the Kermit FILE TYPE
+          setting. TENEX is used for sending 8-bit binary files to 36-bit
+          platforms such as TOPS-10, TOPS-20, and TENEX, and getting them
+          back again. Synonym: ASCII = TEXT. Note: there is also an FTP
+          TYPE command, which does what SET FTP TYPE does but also sends
+          a TYPE command to the server immediately if the given type is
+          different from the current one.
+
+   If you want want specific FTP preference settings to be in effect for
+   all your Kermit FTP sessions, put the desired SET FTP commands in your
+   Kermit customization file (~/.mykermrc in UNIX, K95CUSTOM.INI in
+   Windows).
+
+   [ [253]Top ] [ [254]FTP Top ] [ [255]C-Kermit Home ] [ [256]Kermit
+   Home ]
+     _________________________________________________________________
+
+  3.4. Managing Directories and Files
+
+   In Kermit, commands for directory and file management can refer to:
+
+     * The local computer
+     * A remote computer when you have a connection to a Kermit server or
+       IKSD.
+     * A remote computer when you have a connection to an FTP server.
+
+   (There can also be an HTTP connection, but the commands in this
+   section don't apply to HTTP connections.)
+
+   Thus in general, each such command comes in three forms:
+
+    1. With no prefix in C-Kermit 8.0.200, it refers to the local
+       computer (CD, DIR, etc). In C-Kermit 8.0.201 and later, however,
+       the "locus" switches to automatically to the remote FTP server
+       when you make an FTP connection (see the SET LOCUS description
+       [257]Section 7); thus C-Kermit 8.0.201 acts almost exactly like a
+       regular FTP client when it has an FTP connection, yet still acts
+       like itself on other kinds of connections.
+    2. With the REMOTE prefix, it is for a Kermit server (REMOTE CD,
+       REMOTE DIR).
+    3. With the FTP prefix, it's for an FTP server (FTP CD, FTP DIR).
+    4. Also see [258]Section 3.8, which explains "R-commands" and
+       "L-commands".
+
+   Kermit's FTP file and directory management commands are as follows.
+   When an R-command is included in the Synonyms list, be sure to read
+   [259]Section 3.8 about rules for use of R-commands.
+
+   FTP CD [ directory ]
+          Tells the FTP server to change its default (working) directory
+          to the one given, which usually must be expressed in the syntax
+          of the server platform (UNIX, VMS, etc). If the directory is
+          not specified, the result depends on the FTP server -- it might
+          complain that the command is illegal, or it might change to
+          your original login directory. Synonyms: FTP CWD (Change
+          Wording Directory); RCD.
+
+   FTP CDUP
+          Tells the FTP server to change its default (working) directory
+          to the parent directory of its current one (equivalent to
+          "cd .." in UNIX, or "cd [-]" in VMS). Synonyms: RCDUP, FTP UP.
+
+   FTP PWD
+          Asks the FTP server to report ("print") its current working
+          directory. Synonym: RPWD.
+
+   FTP MKDIR directory
+          Asks the FTP server to create the directory whose name is
+          given. In general, the name must be in the syntax of the
+          server's file system, and it must be either absolute (a full
+          pathname) or relative to the server's current (working)
+          directory. This command fails if the directory can't be created
+          for any reason, including that it exists already. Synonym:
+          RMKDIR.
+
+   FTP RMDIR directory
+          Asks the FTP server to remove the directory whose name is
+          given. The rules are the same as for MKDIR, plus in most cases,
+          the server will not remove any directory unless it is empty.
+          Synonym: RRMDIR.
+
+   FTP DIRECTORY [ filespec ] [ redirectors ]
+          Tells the FTP server to send a directory listing of the
+          specified files. If no filespec is given, the server lists all
+          files in its current working directory. The results are in
+          whatever format the server chooses to send them. You can use
+          UNIX-like redirectors to send the listing to a file or a
+          pipeline, exactly as with the regular Kermit client/server
+          REMOTE DIRECTORY command ([260]Using C-Kermit, Chapter 11).
+          Synonym: RDIRECTORY. Examples:
+
+    ftp dir                           ; Show listing of all files on screen
+    ftp dir *.txt                     ; List *.txt files on screen
+    ftp dir *.txt > somefile          ; Put listing in somefile
+    ftp dir *.txt >> somefile         ; Append listing to somefile
+    ftp dir *.txt | sort > somefile   ; Put sorted listing in somefile
+    ftp dir | more                    ; Runs list through "more"
+    ftp dir | sort | more             ; Runs list through "sort" and "more"
+
+   FTP VDIRECTORY [ filespec ] [ redirectors ]
+          "Verbose" directory. This is an alternative FTP DIRECTORY
+          command primarily for use with DECSYSTEM-20 (TOPS-20) FTP
+          servers, which send only filenames when given a DIRECTORY
+          command; the VDIRECTORY command makes them also send file
+          sizes, dates, and attributes.
+
+   FTP CHECK filespec
+          Asks the FTP server whether the given file exists or, if the
+          filespec contains wildcards, if any files match, and this
+          command succeeds or fails accordingly.
+
+   FTP MODTIME filename
+          Asks the FTP server, via the not-yet-standard FTP MDTM command,
+          to send the modification date and time of the given file. The
+          response should be a numeric string in the format:
+          yyyymmddhhmmssxxxxx... where yyyy is the year, mm is the month,
+          dd is the day, hh is the hour (0-23), mm is the minute, ss is
+          the second, and xxx... is the optional fraction of the second
+          (0 or more digits). The date and time is expressed in UTC (GMT,
+          Zulu, Zero-Meridian). The result is available programmatically
+          in the [261]\v(ftp_message) variable, and is understandable by
+          Kermit's date-time switches and functions. For example, suppose
+          we want to upload all local files that are newer than a
+          particular file on the server:
+
+  C-Kermit> ftp modtime signpost
+  C-Kermit> echo \v(ftp_message)
+  20010807113542.014
+  C-Kermit> ftp mput /after:\v(ftp_message)GMT *
+
+          Note that we must append "GMT" to the date-time string to let
+          the /AFTER switch know the time is GMT rather than local.
+
+   FTP SIZE filename
+          Asks the FTP server to send the size (in bytes) of the given
+          file. The result might vary depending on whether the current
+          FTP TYPE is binary or text ("ascii"). For a reliable byte
+          count, do FTP TYPE BINARY first. The result is available
+          programmatically in the [262]\v(ftp_message) variable.
+
+   FTP CHMOD permissions filename
+          Tells the FTP server to set the permissions (protection) of the
+          given file to the ones given. The permissions and filename must
+          be given in whatever syntax is required by the server. Example
+          (for a UNIX-based FTP server):
+
+  ftp chmod 664 oofa.txt
+
+          Not all servers support this command. For non-UNIX-based
+          servers, you might need to use FTP QUOTE or FTP SITE and the
+          appropriate platform-specific FTP server command.
+
+   FTP UMASK [ number ]
+          This command is probably specific to UNIX-based servers; it
+          sets the UNIX "umask", which is the default permissions mask
+          for new (in this case, incoming) files. Crudely put, the UNIX
+          umask is an octal representation of a binary number in in which
+          a 1 bit stands for a permission bit that must be 0, and a 0 bit
+          stands for a permission bit that can be 0 or 1 depending on
+          other factors, such as the permissions of the parent directory.
+          Example: "umask 007" requires that new files are created
+          without read/write/execute world permission. If the number is
+          not specified, the server's current umask is reported.
+
+   FTP RENAME filename newname
+          Asks the FTP server to rename the file whose name is "filename"
+          to "newname". Works only for one file; can not be used with
+          wildcards. The server's interpretation of "newname" can vary
+          (in some cases it must be a filename, in others perhaps it can
+          also be a directory name, in which case if the filename denote
+          a regular file, the file might be moved to the given
+          directory). Some servers might allow files to be renamed
+          ("moved") between physical disks or partitions, others might
+          not. Synonym: RRENAME.
+
+   FTP DELETE [ switches ] filespec [ filespec [ ... ] ]
+          Tells the FTP server to delete the file or files listed. Each
+          file specification may, but need not, contain wildcard
+          characters to match multiple files. File specifications and
+          wildcard syntax must be those of the server. Any file
+          specifications that contain spaces must be enclosed in braces
+          or doublequotes. FTP DELETE switches are:
+
+ /ERROR-ACTION:  /FILENAMES:     /NOBACKUPFILES  /QUIET
+ /EXCEPT:        /LARGER-THAN:   /NODOTFILES     /NOPAGE
+ /PAGE           /RECURSIVE      /SMALLER-THAN:
+
+          When used with FTP DELETE, the /RECURSIVE switch deletes files
+          but not directories, and furthermore depends on the server
+          providing recursive file lists, which is not the normal
+          behavior. For further details, see the decriptions of these
+          switches in [263]Section 3.6. Synonyms: FTP MDELETE (Kermit
+          makes no distinction between DELETE and MDELETE); RDELETE.
+
+   FTP TYPE { TEXT, BINARY, TENEX }
+          Tells the FTP server to change its file-transfer type to the
+          one given, immediately. See [264]SET FTP TYPE for details.
+
+   [ [265]Top ] [ [266]FTP Top ] [ [267]C-Kermit Home ] [ [268]Kermit
+   Home ]
+     _________________________________________________________________
+
+  3.5. Uploading Files With FTP
+
+   Uploading means sending files from the client (Kermit) to the FTP
+   server. The basic command for uploading files with FTP is PUT:
+
+   FTP PUT [ switches ] [ filespec [ as-name ] ]
+          Uploads (sends) the file or files that match the file
+          specification, which may include wildcards, to the server. If
+          no filespec is given, the names of files to send are taken from
+          the /LISTFILE: file, if any, otherwise from the SEND-LIST, if
+          any. Unless you go out of your way to prevent it, Kermit
+          determines the transfer mode (text or binary) for each file
+          automatically, and switches automatically on a per-file basis.
+          If an as-name is given, the file is sent under that name
+          instead of its own (if an as-name is given with a wildcard
+          filespec, the result is a bit more complicated, and is
+          explained later in this section).
+
+   Unlike normal FTP clients, Kermit does not prompt you by default (or
+   at all) for each file; it just sends them, just as it does with Kermit
+   protocol. The filespec can be a literal filename or a Kermit pattern,
+   described in:
+
+  [269]http://www.columbia.edu/kermit/ckermit70.html#x4.9
+
+   Kermit patterns are equivalent to C-Shell patterns and provide a fair
+   amount of flexibility in selecting which files to send, which is
+   augmented by the file-selection switches presented in [270]Section
+   3.5.1.
+
+   FTP MPUT [ switches ] filespec [ filespec [ ... ] ]
+          FTP MPUT is just like FTP PUT except it allows you to give more
+          than one file specification, and it does not allow an as-name
+          in the file list. However, as-names can be given to either PUT
+          or MPUT with the /AS-NAME: switch.
+
+   If a PUT or MPUT command results in one file being uploaded, it
+   succeeds if the file is uploaded completely and fails otherwise. If
+   more than one file is selected for upload, success or failure depends
+   on the [271]FTP ERROR-ACTION setting; if it is PROCEED (the default
+   setting), then the [M]PUT command succeeds if at least one of the
+   files was completely uploaded, and fails otherwise, If FTP
+   ERROR-ACTION is QUIT, the [M]PUT command succeeds if all selected
+   files were uploaded successfully, and fails if any file failed.
+
+   FTP uploads may be interrupted just like Kermit uploads. While the
+   transfer is in progress, type:
+
+  X to interrupt the current file and go on to the next file.
+  Z to cancel the current file and all remaining files.
+  ^C (Control-C): Like Z, but might act more quickly.
+
+   MPUT may be used as in regular FTP clients, but it is not required to
+   send multiple files; in Kermit it is required only if you want to give
+   multiple file specifications. Examples:
+
+  ftp put oofa.txt               ; Send a single file oofa.txt
+  ftp put oofa.txt budget.txt    ; Send single file oofa.txt as budget.txt
+  ftp put *.txt                  ; Send all *.txt files
+  ftp mput *.txt                 ; Send all *.txt files (same as "put *.txt")
+  ftp mput *.txt foo.bar         ; Send all *.txt files plus foo.bar
+
+   The distinction between PUT and MPUT is important only when more than
+   one filespec is given, just like the distinction between Kermit SEND
+   and MSEND:
+
+  ftp put oofa.txt budget.txt    ; Send oofa.txt AS budget.txt
+  ftp mput oofa.txt budget.txt   ; Send oofa.txt AND budget.txt
+
+   If the source file specification includes any path segments, for
+   example:
+
+  put /tmp/oofa.txt
+  put subdir/another/andanother/oofa.txt
+
+   the path portion is stripped from the filename that is sent to the
+   server. However, if an as-name contains a path, it is retained.
+   Examples:
+
+  ftp put /usr/doc/oofa.txt      ; Send as "oofa.txt".
+  ftp put oofa.txt /tmp/oofa.txt ; Send as "/tmp/oofa.txt"
+
+   The latter example sends the file oofa.txt from your current local
+   directory to the server's /tmp directory. This works only if the
+   server uses the same directory notation that you used in the as-name
+   AND the given directory already exists on the server AND if you have
+   write access to it.
+
+   Use caution when uploading from a case-sensitive file system, such as
+   UNIX, to a file system that is not case sensitive, such as Windows or
+   VMS. If you have two files in UNIX, AA and aa and upload both of them,
+   the second one will overwrite the first. The only way around this
+   provided by FTP protocol is its "unique server names" feature (SET FTP
+   UNIQUE-SERVER-NAMES or the /UNIQUE switch described below).
+     _________________________________________________________________
+
+    3.5.1. FTP PUT Switches
+
+   FTP PUT and MPUT are similar in format and behavior to the regular
+   Kermit SEND and MSEND commands, and they allow most of the same
+   optional switches:
+
+C-Kermit>ftp put ? Filename, or switch, one of the following:
+ /after:                 /larger-than:           /rename-to:
+ /array:                 /listfile:              /server-character-set:
+ /as-name:               /local-character-set:   /server-rename-to:
+ /before:                /move-to:               /simulate
+ /binary                 /nobackupfiles          /smaller-than:
+ /command                /nodotfiles             /tenex
+ /delete                 /nofollowlinks          /text
+ /dotfiles               /not-after:             /transparent
+ /error-action:          /not-before:            /type:
+ /except:                /permissions:           /update
+ /filenames:             /quiet                  /unique-server-names
+ /filter:                /recover
+ /followlinks            /recursive
+
+   Since most of these switches are common to Kermit's SEND and MSEND
+   commands, they described only briefly here. For greater detail see:
+
+     [272]http://www.columbia.edu/kermit/ckermit70.html#x1.5 (explanation
+   of switches)
+     [273]http://www.columbia.edu/kermit/ckermit70.html#x4.7
+   (file-transfer switches)
+
+   First the file-selection switches:
+
+   /AFTER:date-time
+   /BEFORE:date-time
+   /NOT-AFTER:date-time
+   /NOT-BEFORE:date-time
+          Only send those files modified on or after or before the given
+          date and time. These switches can be combined to select files
+          modified between two date/times. Various date-time formats are
+          accepted; if the date-time contains spaces, it must be enclosed
+          in braces or doublequotes. See
+          [274]http://www.columbia.edu/kermit/ckermit70.html#x1.6 and
+          [275]Section 8.13 of this document for details about date-time
+          formats. Examples:
+
+  ftp put /after:{1 jan 2000 0:00:00} *
+  ftp put /after:-5days *
+
+   /LARGER-THAN:number
+   /SMALLER-THAN:number
+          Only send files larger (smaller) than the given number of bytes
+          (octets). These switches can be combined to select files in a
+          certain size range.
+
+   /TYPE:{TEXT,BINARY}
+          Only send files that are the given type, which is determined
+          for each file just before sending it by file scanning. BINARY
+          includes TENEX; if you have included a /TENEX switch, or
+          previously given a [SET] FTP TYPE TENEX command, binary files
+          are sent in TENEX, rather than BINARY mode.
+
+   /[NO]DOTFILES
+          [Don't] include files whose names begin with dot (.). By
+          default, such files are not included unless your filespec
+          explicitly mentions them.
+
+   /NOBACKUPFILES
+          Don't include files whose names end with .~nnn~, where nnn is a
+          number, e.g. oofa.txt.~27~. These are backup files created by
+          Kermit, EMACS, and other applications. By default, backup files
+          are included.
+
+   /NOFOLLOWLINKS
+          (UNIX only) Skip over symbolic links rather than following them
+          (default). This applies to wildcard and/or recursive [M]PUTs;
+          if a single filename is given, and it happens to be a symbolic
+          link, the file it points to is sent.
+
+   /FOLLOWLINKS
+          (UNIX only) Always follow (resolve) symbolic links, even in
+          wildcard or recursive [M]PUTs. Use with caution. Watch out for
+          circular links, endless loops, etc.
+
+   /EXCEPT:pattern
+          Exception list -- don't send files whose names match the given
+          pattern. See [276]Section 1.5.4 of the [277]C-Kermit 7.0 Update
+          Notes for details. If you want to exclude a directory from a
+          recursive [M]PUT, use /EXCEPT:{dirname/*}.
+
+   /RECURSIVE
+          Sends the desired files from the current (or given) directory,
+          plus all directories beneath it, including empty directories,
+          replicating the directory structure on the server. No special
+          capabilities are required in the server, but of course your
+          login ID on the server must have the appropriate access and
+          permission to create directories. Recursive PUTs work not only
+          between like platforms (e.g. UNIX to UNIX) but also between
+          unlike ones (e.g. UNIX to VMS or Windows), in which case
+          text-file format differences are handled by Kermit's automatic
+          text/binary mode switching ([278]Section 4) and character-set
+          translation ([279]Section 3.7). Synonym: /SUBDIRECTORIES.
+
+   /UPDATE
+          Send only files that have changed since last time ([280]Section
+          3.5.2).
+
+   /ARRAY:arrayname
+          The "file" to be sent is an array, or a segment of one, rather
+          than a real file. In this case the other selection switches
+          don't apply. The array contents are sent in text mode, and each
+          array element is treated as a line. Example:
+
+  ftp put /as-name:array.txt /array:&a
+
+          (or, to send a segment of the array, /array:&a[100:199]). If
+          you don't include an /AS-NAME, a name of "_array_x_" is used
+          (where x is the array letter). If you include this switch, most
+          other switches are meaningless and ignored.
+
+   /COMMAND
+          The "file" to be sent is the standard output of a command,
+          rather than a real file. It is sent in text or binary mode
+          according to the prevailing FTP TYPE, which can be overridden
+          with a /TEXT or /BINARY switch. Example: Example:
+
+  ftp put /command /as-name:{userlist} {finger | sort -r}
+
+   /LISTFILE:filename
+          Tells Kermit to obtain the list of files to be sent from the
+          file whose name is given. This file must contain one file
+          specification (which may be wild) per line. If the list
+          includes files from different directories, such as a recursive
+          listing of a directory tree, the paths are recreated on the
+          server (if possible) if you include the /RECURSIVE switch;
+          otherwise all the files are sent to the current directory on
+          the server.
+
+   Now the other switches:
+
+   /AS-NAME:text
+          If a single file is being sent, send it with the given text as
+          its name. If multiple files are being sent, the text must be a
+          template that includes variables such as \v(filename),
+          \v(filenumber), \v(ntime), to allow dynamic creation of each
+          name. The same applies to the as-name field of the FTP PUT
+          command. If this switch is not included (and an as-name is not
+          included as the second filename to PUT), each file is sent with
+          its own name.
+
+   /BINARY
+   /TEXT
+   /TENEX
+          Forces this upload to take place in the given mode, regardless
+          of the current FTP TYPE setting, and without automatic
+          text/binary switching. /ASCII is a synonym for /TEXT.
+
+   /FILTER:command
+          Specifies that the file(s) is/are to be passed through the
+          given command or pipeline on their way to the server. Example:
+
+  ftp put /binary /filter:{gzip -c \v(filename)} /as-name:\v(filename).gz *
+
+   /TRANSPARENT
+   /LOCAL-CHARACTER-SET:name
+   /SERVER-CHARACTER-SET:name
+          Character-set translation for text files, explained in
+          [281]Section 3.7.
+
+   /ERROR-ACTION:{PROCEED,QUIT}
+          Overrides the prevailing [282]FTP ERROR-ACTION for the duration
+          of this PUT or MPUT command only.
+
+   /RECOVER
+          Resume an interrupted transfer where from the point of
+          interruption (explained in [283]Section 3.5.2). Synonym:
+          /RESTART.
+
+   /DELETE
+          Tells Kermit to delete each source file immediately after, and
+          only if, it has been uploaded completely and successfully.
+          This, in effect, moves the file from the client to the server.
+
+   /MOVE-TO:directory
+          Tells Kermit to move each source file to the named local
+          directory after, and only if, it has been uploaded completely
+          and successfully.
+
+   /RENAME-TO:template
+          Tells Kermit to rename each (local) source file according to
+          the given template after, and only if, it has been uploaded
+          completely and successfully. The template works as in /AS-NAME.
+
+   /SERVER-RENAME-TO:template
+          Tells Kermit to ask the server to rename each file according to
+          the given template as soon as, and only if, it has been
+          received completely and successfully. The template works as in
+          /AS-NAME. Requires write and rename access on the server, so
+          doesn't usually work with (e.g.) anonymous uploads to public
+          incoming areas where the permissions don't allow renaming.
+          Examples:
+
+        ftp mput /server-rename:\v(filename).ok *
+                Appends ".ok" to each filename on the server when it's
+                finished uploading.
+
+        ftp mput /as-name:\v(filename).tmp /server-rename:\v(filename) *
+                This is the reverse of the previous example; it uses a
+                temporary name while uploading is in progress and reverts
+                the file to its real name when uploading is complete.
+
+        ftp mput /as-name:\v(filename)
+                /server-rename:../final/\v(filename) *
+                Moves the file from the working directory to a final
+                directory when the upload is complete, but in this case
+                you have to know the pathname syntax of the server. If
+                the rename fails, the [M]PUT command fails according to
+                the [284]FTP ERROR-ACTION selection.
+
+   /FILENAMES:{AUTOMATIC,CONVERTED,LITERAL}
+          Overrides the [285]FTP FILENAMES setting for this upload only.
+
+   /PERMISSIONS:{ON,OFF}
+          Overrides the [286]FTP PERMISSIONS setting for this upload
+          only.
+
+   /UNIQUE
+          Tells Kermit to tell the server to give [287]unique names to
+          incoming files that would otherwise overwrite existing files
+          that have the same name. This switch conflicts with /UPDATE,
+          /RECOVER, /PERMISSIONS, and /SERVER-RENAME since the client has
+          no way of knowing the name assigned by the server.
+
+   /QUIET
+          Don't display file-transfer progress or statistics.
+
+   /SIMULATE
+          Shows which files would be sent without actually sending them.
+          Useful (for example) with /UPDATE (next section). The results
+          are shown in the file-transfer display (if it is not disabled)
+          and in the transaction log (if one is active). Hint: use SET
+          TRANSFER DISPLAY BRIEF.
+     _________________________________________________________________
+
+    3.5.2. Update Mode
+
+   When you include the /UPDATE switch, this means to skip sending any
+   file that already exists on the server if the local file's
+   modification date/time is not later than that of the corresponding
+   file on the server. Here is a typical application for update mode:
+   Suppose that on Computer A, you maintain a large set of files (say, a
+   collection of Web pages and graphics images, or the source files for a
+   software application), and you need to keep a parallel copy on another
+   Computer, B. Of course you could upload the entire collection every
+   day:
+
+  cd source-directory
+  ftp computerb.xyzcorp.com
+  ( authentication details... )
+  ftp cd target-directory
+  ftp put [ switches ] *
+
+   But if the total size is large or the network slow, this would be
+   unnecessarily time-consuming. Worse, if other users or sites had to
+   update whenever new files appeared in B's directory, this would cause
+   them unnecessary work. By including the /UPDATE switch:
+
+  ftp put /update [ other-switches ] *
+
+   only those files that changed since last time are uploaded. Here's how
+   it works. For each local file that is selected for uploading:
+
+     * The remote filename is determined in the normal way, according to
+       the [288]FTP FILENAMES setting, /FILENAMES switch, or the as-name,
+       if any.
+     * Kermit sends an MDTM (modification time) command for the
+       corresponding remote filename to the server.
+     * If the server does not understand the MDTM command, the file is
+       sent.
+     * If the server can't find a file with the given name, the file is
+       sent.
+     * If the local file's modification time is later than that of the
+       remote file, the file is sent.
+     * Otherwise -- the remote file exists but its modification time is
+       equal to or earlier than that of the local file -- the file is
+       skipped.
+
+   All time comparisons take place in Coordinated Universal Time
+   (UTC)([289]1), also known as GMT or Zulu time: Timezone 0; standard
+   time, without daylight savings.
+
+     WARNING: Some FTP servers, such as Novell NWFTPD.NLM, ignore or
+     misimplement the FTP specification and send local time rather than
+     UTC.
+
+   Update mode is useful only when always used in the same direction.
+   When you upload (PUT) a file with FTP, the destination file receives
+   the current timestamp on the server's computer, not the original
+   file's timestamp ([290]2). If you try to FTP PUT /UPDATE the same file
+   again, it will be skipped (as expected) since the remote copy is
+   newer. However, if you try to FTP GET /UPDATE the same file
+   ([291]Section 3.6), it will be transferred for the same reason.
+
+   To check the availability of PUT /UPDATE on a particular connection,
+   issue an FTP MODTIME command for a file that is known to exist on the
+   server. If it succeeds, PUT /UPDATE should work and in that case, you
+   can run a procedure like the one above every day: the first time, it
+   sends all the files; after that, it sends only the ones that changed.
+   If a transaction log is active, a notation is included for any files
+   that are skipped.
+
+   Notes:
+    1. Why is Coordinated Universal Time abbreviated UTC? From the
+       [292]National Institute of Standards and Technology FAQ: "In 1970
+       the Coordinated Universal Time system was devised by an
+       international advisory group of technical experts within the
+       International Telecommunication Union (ITU). The ITU felt it was
+       best to designate a single abbreviation for use in all languages
+       in order to minimize confusion. Since unanimous agreement could
+       not be achieved on using either the English word order, CUT, or
+       the French word order, TUC, the acronym UTC was chosen as a
+       compromise."
+    2. The Kermit FTP client is unusual in that, when downloading only,
+       it can set the received file's date from the file's date on the
+       server, but this should not affect the update feature. When
+       uploading to an FTP server, however, there is no mechanism for the
+       client to set the date of the uploaded file on the server.
+     _________________________________________________________________
+
+    3.5.3 Recovery
+
+   Suppose that while you are uploading a large file over a slow
+   connection, the connection is lost before the entire file is
+   transferred. With most FTP clients, you would have to start over, thus
+   resending the portion of the file that was sent already, and that is
+   already on the server. But Kermit's /RECOVER switch (Synonym:
+   /RESTART) lets you continue an interrupted transfer from the point of
+   failure, thus transferring only the part that wasn't sent already. The
+   prerequisites for recovery are:
+
+     * The transfer must be in BINARY mode, or else the client and server
+       must reside on like systems (e.g. both on some form of UNIX).
+     * The FTP server must support the SIZE command.
+
+   Here's how it works. When you include the /RECOVER switch:
+
+     * Kermit checks for conflicting switches, such as /UPDATE and
+       /UNIQUE; if /RECOVER is given with these switches an error occurs.
+       If /RECOVER is given in other circumstances where it could serve
+       no useful purpose (e.g. with arrays, pipes, or filters), it is
+       ignored.
+
+   If the switch is accepted, then for each selected file:
+
+     * If it is not binary (determined by scanning) and the client and
+       server are not on like platforms, recovery is canceled (the entire
+       file is sent). Otherwise:
+     * A SIZE command is sent for the file (using its remote name). If
+       the reply indicates the file was not found, or the SIZE command
+       was not understood, or any other kind of error, recovery is
+       canceled. Otherwise:
+     * A MDTM (modification time) command is sent for the file. If a
+       valid reply is received, and the modification time of the local
+       file is later than that of the remote file, recovery is canceled.
+       Otherwise:
+     * If the sizes of the two files are identical, the file is not sent.
+       Otherwise:
+     * Kermit seeks to the recovery spot in the local file, tells the
+       server to APPEND the data which is about to arrive to the remote
+       file, and then sends the data starting at the recovery point.
+
+   To safeguard file integrity, recovery is not attempted unless all the
+   preconditions are met. For the widest possible usefulness, APPEND is
+   used rather than RESTART. For stream transfers (the only kind that
+   Kermit supports) the results are the same.
+
+   By design, the /RECOVER switch can be included with any FTP PUT or
+   MPUT command, even if it specifies a group of files. This allows you
+   to resume an interrupted batch transfer from where it left off. The
+   files that were already completely sent are skipped, the file that was
+   interrupted is recovered, and the remaining files are uploaded.
+
+   By the way, it doesn't matter how the original partial file was
+   uploaded -- FTP, Kermit, Zmodem, etc: as long as the preconditions are
+   met, it can be recovered with FTP PUT /RECOVER, or for that matter
+   also using Kermit protocol and SEND /RECOVER.
+
+   A word of caution, however, when the original upload was in text mode
+   with character-set translation ([293]Section 3.7):
+
+     * If the original upload involved a translation from one single-byte
+       character set to another (e.g. Code Page 850 to Latin-1), recovery
+       is safe if you specify the same translations for the recovery. If
+       you don't, the resulting file will contain a mixture of character
+       sets.
+     * If the original upload involved a translation that changed the
+       size of the file (e.g. from an alphabetic Code Page or Latin
+       Alphabet to Unicode, or vice versa), recovery is NOT safe, even if
+       you specify the same translations.
+
+   Kermit has no way of knowing anything about the previous upload. As a
+   safeguard, an error occurs if you include /RECOVER and also specify a
+   character-set of UCS2 or UTF8, since recovery can't possibly work in
+   that situation. Otherwise, it's up to you to avoid unsafe recovery
+   operations.
+
+   [ [294]Top ] [ [295]FTP Top ] [ [296]C-Kermit Home ] [ [297]Kermit
+   Home ]
+     _________________________________________________________________
+
+  3.6. Downloading Files With FTP
+
+   Although uploading files with Kermit's FTP client is just as easy and
+   flexible as sending files with Kermit protocol, the same is not always
+   true for downloading because FTP servers lack some of the capabilities
+   of a Kermit server:
+
+     * If you want to get more than one file, you have to use MGET, not
+       GET, since the underlying FTP protocol is different in the two
+       cases. Kermit can't "autodetect" which one you mean, as it can
+       with PUT and MPUT, since it can't be expected to know the wildcard
+       syntax of the remote platform and/or FTP server (the same is true
+       for all other FTP clients). To complicate matters, FTP protocol
+       now includes two underlying mechanisms (NLST and MLSD) for
+       accomplishing MGET operations and, as explained in [298]Section
+       3.11, the two behave differently.
+     * Automatic text-binary mode switching is not done by the server. It
+       can be done by the client (Kermit), but in this case it is not
+       based on a file scan (since there is no way for Kermit prescan a
+       server file), but rather on the filename, using C-Kermit 7.0
+       [299]filename patterns.
+     * Some options that are available with FTP PUT can not be used with
+       FTP [M]GET or don't work the same way:
+         /PERMISSIONS (FTP protocol has no mechanism for this).
+         /[NOT-]BEFORE, /[NOT-]AFTER (because of the timezone problem).
+         /RECOVER works only in binary mode.   /RECURSIVE has limited
+       utility.
+
+   The commands for downloading are:
+
+   SET FILE DOWNLOAD-DIRECTORY [ directory ]
+          As with Kermit transfers, this command, if given, tells
+          C-Kermit where to store incoming files in the absence of a
+          specific as-name. If not given, incoming files are stored as
+          indicated by the as-name, if any, otherwise in the current
+          directory, just as with Kermit transfers. The more verbose
+          transfer display formats give the full pathname of each
+          received file, and, in case you have trouble finding a
+          downloaded file afterwards, its full path is also listed in the
+          transaction log (if you kept one), and you can also ask Kermit
+          where it went with the [300]WHERE command.
+
+   SET FTP GET-FILETYPE-SWITCHING { ON, OFF }
+          ON by default, causing Kermit to switch automatically into text
+          or binary mode for each file based on whether its name matches
+          a text pattern or binary pattern. Set this OFF, or use a /TEXT,
+          /BINARY, or /TENEX switch to defeat this feature. Use SHOW
+          PATTERNS to see the current pattern list.
+
+   [ FTP ] GET [ switches ] filename [ as-name ]
+          Asks the server to send the given file, and if it comes, stores
+          it locally under the given as-name, if any, otherwise under its
+          original name (modified according to the selected filename
+          conversion option), in your download directory, if you have
+          specified one, otherwise in the directory indicated in the
+          as-name, if any, otherwise in your current directory. If you
+          accidentally use a wildcard in the filename ("get *.txt") the
+          server will reply with a message like "File not found" (unless
+          there is a file whose name actually is "*.txt"). If FTP
+          GET-FILETYPE-SWITCHING is ON, and in the absence of any GET
+          switches to override it, the file is transferred in binary mode
+          if it matches any of Kermit's binary name patterns, and in text
+          mode if it matches any of Kermit's text name patterns, and in
+          the prevailing FTP TYPE if it matches none of these patterns.
+
+   [ FTP ] MGET [ switches ] filespec [ filespec [ filespec [ ... ] ] ]
+          Like GET, but for multiple files. One or more file
+          specifications can be given, and any or all (or none) of them
+          can contain wildcards or can be directory names. The file list
+          may not include an as-name, but you can still give one with the
+          /AS-NAME: switch.
+
+   In both the FTP GET and MGET commands, any filenames that contain
+   spaces must be enclosed in braces or doublequotes (see [301]Section 5
+   for details).
+
+   FTP downloads may be interrupted just like Kermit transfers. While the
+   transfer is in progress, type:
+
+     * X to interrupt the current file and go on to the next file.
+     * Z (or Control-C) to cancel the current file and all remaining
+       files.
+
+   Before proceeding, a brief word about temporary files. In FTP
+   protocol, the MGET command works by requesting a file list from the
+   server, and then (internally) issuing a GET command (FTP RETR protocol
+   directive) for each file. The file list returned by the server can be
+   any size at all, so in case it is huge, we don't store it in memory;
+   instead we put it in a temporary file. For troubleshooting purposes,
+   you should be aware of two points:
+
+    1. The location of the temporary file is chosen according the TMP or
+       TEMP environment variables. If neither of these variables is
+       defined, you might need to define it. In case there is not enough
+       space on the indicated disk or partition for the server's file
+       list, you might need to either clean up the temporary area, or
+       redefine the environment variable to indicate a different area
+       that has sufficient space.
+    2. If you want to look at the list yourself, use SET FTP DEBUG ON.
+       This tells Kermit to (a) give you the full pathname of the
+       temporary file at the end of each MGET command, and (b) not to
+       delete it, as it normally does.
+     _________________________________________________________________
+
+    3.6.1. FTP GET Switches
+
+   The following switches are available with FTP GET and MGET:
+
+   /TEXT
+          Specifies a text-mode transfer. Overrides the global FTP TYPE
+          setting and filename pattern-matching for the duration of the
+          current command only, All files are downloaded in text mode.
+          Synonym: /ASCII.
+
+   /BINARY
+          Specifies a binary-mode transfer. Overrides the global FTP TYPE
+          setting and filename pattern-matching for the duration of the
+          current command only. All files are downloaded in binary mode.
+
+   /TENEX
+          Like /BINARY but specifies a special binary transfer mode to be
+          used when getting 8-bit binary files from a 36-bit platform
+          such as TOPS-10, TOPS-20, or TENEX. All files are downloaded in
+          the special binary mode.
+
+   /RECOVER
+          This instructs Kermit to try to recover an incomplete download
+          from the point of failure. Works only in binary mode, and only
+          if the server supports the (not-yet-standard) FTP "REST"
+          directive. See [302]Section 3.6.3 for details. Synonym:
+          /RESTART.
+
+   /FILENAMES:{CONVERTED,LITERAL}
+          Overrides the [303]FTP FILENAMES (filename conversion) setting
+          for this download only, forcing incoming filenames to be either
+          converted or taken literally.
+
+   /AS-NAME:text
+          For GET, this is equivalent to giving an as-name after the
+          filename. For MGET, this is the only way to specify alternative
+          names for the incoming files. With MGET, the /AS-NAME text
+          should (must) contain a Kermit variable, usually \v(filename)
+          or \v(filenumber). Example:
+
+  mget /text /as-name:\v(filename).new *.c
+
+          This gets all ".c" files and stores them with "
+
+          .new" appended to their names. See the [304]C-Kermit 7.0 Update
+          Notes for details.
+
+   /COMMAND
+          This specifies that the incoming file is to be written to the
+          standard input of a command, rather than to a file. The command
+          name is the as-name from the GET command or the /AS-NAME
+          argument. If you need to refer to the incoming file's name in
+          the command, use \v(filename). See the description of the
+          regular Kermit [305]GET /COMMAND command for details and
+          examples.
+
+   /QUIET
+          Transfers the files quietly; don't put up a file-transfer
+          display.
+
+   /ERROR-ACTION:{QUIT,PROCEED}
+          This switch affects only MGET. If an error occurs with a
+          particular file, this tells whether to go on to the next file
+          (PROCEED) or to stop right away and fail (QUIT). The default is
+          PROCEED.
+
+   The file selection switches are:
+
+   /EXCEPT:{pattern} or /EXCEPT:{{pattern}{pattern}{...}}
+          Exception list for MGET; skip downloading any file whose name
+          matches any of the given patterns (when using the second
+          format, up to 64 patterns may be specified). [306]CLICK HERE
+          for syntax details.
+
+   /SMALLER-THAN:number
+          Download only files whose size is smaller than the given number
+          of bytes (octets). Requires that the FTP server support the
+          SIZE or MLSD directive.
+
+   /LARGER-THAN:number
+          Download only files whose size is greater than the given number
+          of bytes. Requires that the FTP server support the SIZE or MLSD
+          directive.
+
+   /NOBACKUPFILES
+          During MGET, don't download any files whose names end with
+          backup suffixes (.~n~ where n is a number).
+
+   /NODOTFILES
+          During MGET, don't download any files whose names begin with
+          period (.). Equivalent to /EXCEPT:{.*}.
+
+   /LISTFILE:local-filename
+          The given file contains a list of files to GET, one per line.
+          Filenames in the listfile can contain wildcard characters in
+          the syntax of the server. There is no limit on the number of
+          lines in the listfile.
+
+   /NAMELIST:local-filename
+          If this switch is given, then instead of actually retrieving
+          the selected files, the GET command retrieves a list of the
+          names of the files that would be retrieved, and places it in
+          the specifed file. The resulting file is an ordinary text file,
+          with one filename per line, suitable for reading by a person,
+          or processing by a computer program, including Kermit itself
+          (FOPEN / FREAD / FWRITE / FCLOSE), and as /FILELIST: file. If
+          the filename is omitted or given as "-" (dash, hyphen), the
+          list goes to the screen. NOTE: if you want a copy of the
+          complete list sent by the server, use SET FTP DEBUG ON, perform
+          an MGET, and the temporary file containing the list will be
+          kept rather than deleted (and Kermit tells you its name).
+
+   /UPDATE, /COLLISION:keyword
+          Explained in [307]Section 3.6.2.
+
+   /RECURSIVE
+          This means to try to download an entire directory tree, rather
+          than just files from a particular directory. In fact, FTP
+          protocol does not provide a method to request a recursive
+          download (unless the server supports MLSD; see [308]Section
+          3.11), so this works only if the FTP server does it anyway,
+          without being asked, as some do. In this case, Kermit detects
+          that names in the returned file list contain directory
+          separators, and therefore attempts to create the needed
+          directories as the files arrive. But this can work only if the
+          server is on the same kind of platform as the client, so the
+          pathname syntax can be recognized, and also because the server
+          does not switch between text and binary mode, which would be
+          vital for cross-platform transfers. Use with caution. Synonym:
+          /SUBDIRECTORIES.
+
+          Even when the server does not provide recursive file lists,
+          [M]GET /RECURSIVE forces Kermit to replicate any directory
+          structure implied or expressed by the server's file list. For
+          example:
+
+  get somepath/somefile
+
+          Gets the file named somefile from the server's somepath
+          directory and puts it Kermit's current (or download) directory,
+          whereas:
+
+  get /recursive somepath/somefile
+
+          creates the path locally and then puts the file in it.
+          Similarly for MGET:
+
+  mget */data/*
+
+          downloads all the files in all the data subdirectories of all
+          the subdirectories of the server's current directory and stores
+          them locally in Kermit's current (or download) directory,
+          whereas:
+
+  mget /recursive */data/*
+
+          re-creates the server's directory structure locally.
+
+   The FTP protocol does not include explicit mechanisms for recursion,
+   so Kermit builds upon what is available. Although an Internet draft
+   describes a mechanism ("MLSD") that would allow protocol-driven
+   recursion, similar to Kermit's File Attribute packets (circa 1984), it
+   has not yet attained RFC or standard status, and servers are not yet
+   widely available that offer this feature. In the meantime, the
+   effectiveness of MGET /RECURSIVE depends on the FTP server
+   implementation. If the server returns a recursive list in response to
+   the standard NLST command (whose behavior is ill-defined), Kermit's
+   FTP MGET /RECURSIVE command uses it to re-create the remote directory
+   tree locally. If the server supports MLSD, C-Kermit 8.0.206 and Kermit
+   95 2.1 and later are able to sense it automatically and use it, as
+   described below in [309]Section 3.11.
+
+   The /BEFORE:, /AFTER:, /NOT-BEFORE:, and /NOT-AFTER: switches are not
+   available for downloading because of the confusion with timezones.
+   Would the given times be in the local timezone, the server's timezone,
+   or GMT? The FTP server's directory listings show its own local times
+   but since we don't know what timezone the server is in, there's no way
+   to reconcile our local times with the server's. Similarly,
+   /PERMISSIONS can't be preserved in downloads because FTP protocol
+   provides no means of querying the server for a file's permission.
+
+   Source-file disposition switches:
+
+   /DELETE
+          Each file that is downloaded successfully is to be deleted from
+          the server. Requires the appropriate file access rights on the
+          server.
+
+   /SERVER-RENAME-TO:template
+          Asks the server to rename each (remote) source file immediately
+          after, and only if, it is sent correctly. See [310]PUT
+          /SERVER-RENAME-TO: for details.
+
+   Destination-file disposition switches:
+
+   /TO-SCREEN
+          Displays the incoming file on the screen rather than storing it
+          on disk. If this switch is given, the /RENAME-TO and /MOVE-TO
+          switches are ignored, the file-transfer display is suppressed,
+          and the given file(s) is/are shown on the screen. Can be used
+          with /FILTER, e.g.
+
+  get /text /to-screen /filter:more oofa.txt
+
+          In fact, you should always use /TO-SCREEN with /FILTER or
+          /COMMAND when the command would result in displaying the
+          incoming file on the screen; otherwise C-Kermit would have no
+          way of knowing to suppress its file transfer display (since it
+          can't be expected to know what the command or filter does).
+
+   /RENAME-TO:template
+          Each file that is downloaded is to be renamed as indicated if
+          and only if it was received completely and without error. The
+          template can be literal text or can contain variables that are
+          evaluated for each file. For MGET, the text must contain
+          variables; for GET it can be a literal string. The \v(filename)
+          variable contains the name of the current file, so:
+
+  ftp mget /rename-to:\v(filename).ok *
+
+          causes each file that is successfully downloaded to have ".ok"
+          appended to its name. For details see [311]Section 4.1 of the
+          [312]C-Kermit 7.0 Update Notes.
+
+   /MOVE-TO:text
+          Just like /RENAME-TO:, except the text denotes the name of a
+          directory to which successfully downloaded files are to be
+          moved. If the directory does not exist, it is created.
+
+   The file transfer display does not show the /MOVE-TO or /RENAME-TO
+   value, since the incoming file has not yet been moved or renamed.
+     _________________________________________________________________
+
+    3.6.2. Filename Collisions
+
+   What should happen if an incoming file has the same name as an
+   existing file in the same directory? By default, Kermit's FILE
+   COLLISION setting applies: BACKUP, RENAME, UPDATE, DISCARD, etc, as
+   described in [313]Using C-Kermit. Kermit's default FILE COLLISION
+   setting is BACKUP (rename the existing file and store the incoming
+   file under its own name) and therefore this is also the default FTP
+   collision action.
+
+   The name under which an incoming file is to be stored is determined as
+   follows:
+
+     * If an as-name was given, the as-name is used. Otherwise:
+     * If the client and server platforms are alike or [314]FTP FILENAMES
+       is set to LITERAL (or the /FILENAMES:LITERAL switch was given for
+       this download), the incoming filename is used literally.
+       Otherwise:
+     * The incoming filename is converted to a form that is friendly to
+       the local platform. For UNIX, for example, incoming filenames that
+       are all uppercase (as they might be from, say, VMS or an IBM
+       mainframe) are converted to lowercase.
+
+   If the resulting name coincides with the name of a local file that
+   already exists, we have a filename collision. Collisions are handled
+   according to the currently selected collision action:
+
+   SET FTP COLLISION { BACKUP, RENAME, UPDATE, DISCARD, APPEND, OVERWRITE
+          }
+          This establishes a filename collision for FTP, separate from
+          the Kermit one. The initial FTP collision setting is inherited
+          from Kermit's FILE COLLISION setting when the first FTP command
+          is given, but subsequent changes to Kermit's FILE COLLISION
+          setting do not affect the FTP COLLISION setting. SHOW FTP tells
+          the current FTP COLLISION setting.
+
+   FTP GET /COLLISION:{BACKUP,RENAME,UPDATE,DISCARD,APPEND,OVERWRITE}
+          Overrides the current FTP COLLISION action for this download
+          only.
+
+   FTP GET /UPDATE
+          This is equivalent to GET /COLLISION:UPDATE, and is included
+          for symmetry with PUT /UPDATE
+
+   FTP GET /UPDATE and /COLLISION:UPDATE mean to download only those
+   files whose modification dates on the server are later than those on
+   the client. Date-time comparisons are done in Coordinated Universal
+   Time (UTC, GMT, ZULU). The command:
+
+     FTP MGET /COLLISION:APPEND /AS-NAME:newfilename *.*
+
+   Downloads all matching remote files into a single local file (in
+   whatever order the server sends them).
+     _________________________________________________________________
+
+    3.6.3. Recovery
+
+   Recovery is available for downloads too, but there are some
+   differences from the uploading case described in [315]Section 3.5.3:
+
+     * The transfer must be in BINARY mode. It can not be in text mode,
+       even if the FTP server is on the same kind of platform as Kermit,
+       and even if there is no character-set translation. The original
+       download must also have been in binary mode.
+     * The FTP server must support the REST ("restart") directive.
+       Unfortunately, this is not a standard command; at this writing, it
+       is described only in an Internet Draft, not an RFC or Internet
+       Standard, but nevertheless it is found in several popular FTP
+       servers, such as [316]ProFTPD.
+
+   Here's how download recovery works:
+
+     * Kermit checks for conflicting switches, such as /UPDATE, /COMMAND,
+       or /FILTER. If /RECOVER is given with these switches an error
+       occurs.
+     * The prevailing transfer mode (SET FTP TYPE) must be BINARY. If it
+       is not, the /BINARY switch must have been included with the FTP
+       [M]GET command.
+
+   If the /RECOVER switch is accepted, then for each selected file:
+
+     * A SIZE command is sent for the file (using its remote name). If
+       the reply indicates the file was not found, or the SIZE command
+       was not understood, or any other kind of error, recovery is
+       canceled (i.e. the entire file is downloaded).
+     * If the sizes of the two files are identical, the file is not sent.
+       Otherwise:
+     * Kermit sends the REST directive to the server, indicating the size
+       of the local file. If the server responds affirmatively, Kermit
+       opens the local file in append mode and appends the incoming data
+       to it. Otherwise, recovery is canceled and the entire file is
+       downloaded.
+
+   The /RECOVER switch can be included with any FTP GET or MGET command,
+   even if it specifies a group of files. This lets you resume an
+   interrupted batch transfer from where it left off. The files that were
+   already completely sent are skipped, the file that was interrupted is
+   recovered, and the remaining files are uploaded. BUT... unlike with
+   uploading, where this can be done with any mixture of text and binary
+   files, when downloading, it can only be done if all the files are
+   binary.
+
+   It doesn't matter how the original partial file was downloaded -- FTP,
+   Kermit, HTTP, Zmodem, etc: as long as the preconditions are met, it
+   can be recovered with FTP [M]GET /RECOVER, or for that matter also
+   with GET /RECOVER (using Kermit protocol).
+
+   [ [317]Top ] [ [318]FTP Top ] [ [319]C-Kermit Home ] [ [320]Kermit
+   Home ]
+     _________________________________________________________________
+
+  3.7. Translating Character Sets
+
+   A possibly unique feature of Kermit's FTP client is its ability to
+   convert character sets when transferring files in text mode,
+   independent of the capabilites of the FTP server, as well as to
+   translate the character sets of filenames regardless of transfer mode.
+   For compatibility with existing FTP clients, and because there is a
+   certain performance penalty, Kermit won't do this unless you ask for
+   it. If you enable this feature, you need to inform Kermit of the
+   character set (to be) used on the server and in some cases (explained
+   below) also the local file character set. This discussion assumes you
+   know a bit about character sets (as you must if you have to use them);
+   see Chapter 16 of [321]Using C-Kermit for a detailed treatment. The
+   Kermit commands for FTP character-set conversion are:
+
+   SET FTP CHARACTER-SET-TRANSLATION { ON, OFF }
+          Whether to translate character sets when transferring text
+          files with FTP. OFF by default. Set this to ON to enable
+          character-set translation for subsequent FTP uploads and
+          downloads.
+
+   SET FTP SERVER-CHARACTER-SET [322]name
+          Text character set (to be) used by the server. Most FTP servers
+          are ignorant of character sets, so all translations are done
+          unilaterally by Kermit's FTP client. This means that when
+          downloading files, you must know in advance the character-set
+          used in the files you are downloading (and in their names).
+          When uploading, you must specify the character-set to which
+          local filenames and text-file contents are to be translated for
+          transmission to the server. If you SET FTP
+          CHARACTER-SET-TRANSLATION ON but do not specify an FTP
+          SERVER-CHARACTER-SET, [323]UTF8 is used, since this is the new
+          Internet standard international character set; it is upwards
+          compatible with ASCII and it encompasses most written languages
+          and therefore does not favor any particular group of people, as
+          any other default would do. If you SET FTP SERVER-CHARACTER-SET
+          to something (anything) when FTP CHARACTER-SET TRANSLATION is
+          OFF, this also sets the latter ON.
+
+   SET FILE CHARACTER-SET [324]name
+          This is the regular Kermit (non-FTP-specific) command for
+          identifying the character set (to be) used in local text files
+          and filenames.
+
+   TO REITERATE: If you SET FTP CHARACTER-SET TRANSLATION ON but do not
+   specify an FTP SERVER-CHARACTER-SET, outbound text files are converted
+   to UTF-8 and inbound text files are assumed to be UTF-8. If this is
+   not appropriate, be sure to also specify the desired FTP
+   SERVER-CHARACTER-SET.
+
+   You can use "special" (non-ASCII) characters in filenames in all the
+   client / server file management commands (FTP MKDIR, RMDIR, DIRECTORY,
+   VDIRECTORY, DELETE, etc), and also in file-transfer commands. When
+   giving commands such as FTP DIR (RDIR) and FTP PWD (RPWD), the reply
+   is translated too, so you can read it. In this example, the client and
+   server use entirely different codes to represent the special
+   characters of German:
+
+  C-Kermit> ftp xyzcorp.de /anonymous
+  C-Kermit> set ftp server-character-set latin1
+  C-Kermit> set file character-set german
+  C-Kermit> rcd Städte
+  C-Kermit> rpwd
+  "/pub/ftp/Städte is current directory"
+  C-Kermit> rdir
+  -rw-rw----  1 olaf     54018 Jan  6 17:58 Adenbüttel.txt
+  -rw-rw----  1 ursula     373 Jan  5 15:19 Aßlar.txt
+  -rw-rw----  1 gisbert    482 Jan  5 15:20 Blowatz.txt
+  -rw-rw----  1 gudrun     124 Jan  5 15:19 Böblingen.txt
+  -rw-rw----  1 olga     14348 Jan  7 14:23 Köln.txt
+
+   When the client and server file systems use different character sets,
+   you should take care to use only those characters that the two sets
+   share in common when creating filenames or text-file contents. For
+   example, PC code pages contain a lot line- and box-drawing characters,
+   and sometimes "smart quotes", etc, that are not found in ISO standard
+   8-bit character sets. You should be especially careful to avoid using
+   such characters in filenames.
+
+   [ [325]C-Kermit Character Sets ]
+     _________________________________________________________________
+
+    3.7.1. Character Sets and Uploading
+
+   Kermit's PUT and MPUT commands include full file-scanning
+   capabilities, as described in [326]Section 4. Thus if FTP
+   CHARACTER-SET-TRANSLATION is ON and your character-set associations
+   are set up appropriately, Kermit automatically switches on a per-file
+   basis between text and binary mode, and for each text file between
+   your chosen 7-bit text character set (e.g. ASCII or ISO 646 German),
+   8-bit text (e.g. Latin-1 or Japanese EUC), UCS-2, and UTF-8, and
+   converts each of these automatically to the server character-set, and
+   furthermore automatically differentiates between the Little and Big
+   Endian forms of UCS-2, always sending in Big Endian form.
+
+     WARNING: It is not advisable to use UCS-2 (or any Unicode
+     transformation other than UTF-8) "on the wire", i.e. as a server
+     character set. Most FTP servers are not able to cope with it, since
+     it contains lots of 0 (NUL) characters. If you do use it, Kermit
+     does not translate filenames to or from UCS-2, for reasons well
+     known to C programmers (for example, UNIX APIs assume filename
+     strings are NUL-terminated). [327]UTF-8 is the preferred (and
+     standard) Unicode format for the Internet.
+
+   FTP character-set translations differ from the regular Kermit ones by
+   not restricting translations to a file-character-set /
+   transfer-character-set pair. You can have Kermit's FTP client
+   translate between any pair of character sets it knows about. You can
+   see the list of supported character sets by typing either of the
+   following:
+
+  set ftp server-character-set ?
+  set file character-set ?
+
+   A typical list looks like this ([328]CLICK HERE for an explanation of
+   the names):
+
+  C-Kermit>set file char ? One of the following:
+   ascii            cp869-greek       hebrew-7         mazovia-pc
+   british          cyrillic-iso      hebrew-iso       next-multinational
+   bulgaria-pc      danish            hp-roman8        norwegian
+   canadian-french  dec-kanji         hungarian        portuguese
+   cp1250           dec-multinational iso2022jp-kanji  shift-jis-kanji
+   cp1251-cyrillic  dg-international  italian          short-koi
+   cp1252           dutch             jis7-kanji       spanish
+   cp437            elot927-greek     koi8             swedish
+   cp850            elot928-greek     koi8r            swiss
+   cp852            euc-jp            koi8u            ucs2
+   cp855-cyrillic   finnish           latin1-iso       utf8
+   cp858            french            latin2-iso
+   cp862-hebrew     german            latin9-iso
+   cp866-cyrillic   greek-iso         macintosh-latin
+  C-Kermit>
+
+   Thus you can translate not only between private sets (like PC code
+   pages) and standard ones (like Latin-1) as in Kermit protocol, but
+   also between any given pair of private sets (e.g. CP852 and Mazovia).
+   All conversions go through Unicode as the intermediate character set,
+   resulting in a minimum of character loss, since Unicode is a superset
+   of all other character sets known to Kermit.
+
+   In addition to the SET commands listed above, the FTP PUT and MPUT
+   commands include switches that apply only to the current command:
+
+   /LOCAL-CHARACTER-SET:name
+   /SERVER-CHARACTER-SET:name
+          Use these switches to force a particular translation. These
+          switches override the global FTP CHARACTER-SET-TRANSLATION and
+          SERVER-CHARACTER-SET settings and also character-set
+          differentiation by file scanning for the duration of the PUT or
+          MPUT command. The file scan is still performed, however, to
+          determine whether the file is text or binary; thus these
+          switches do not affect binary files unless you also include the
+          /TEXT switch to force all files to be treated as text.
+
+   In other words, if you include one or both of these switches with a
+   PUT or MPUT command, they are used. Similarly, the /TRANSPARENT switch
+   disables character-set translation for the PUT or MPUT command despite
+   the prevailing FTP CHARACTER-SET-TRANSLATION and SERVER-CHARACTER-SET
+   settings.
+
+   When uploading, the FILE CHARACTER-SET setting is ignored unless you
+   have forced Kermit not to [329]scan local files by including a /TEXT
+   or /BINARY switch with your [M]PUT command, or by disabling automatic
+   text/binary switching in some other way.
+
+   Examples:
+
+    1. Suppose you have a CP852 (East European) text file that you want
+       to upload and store in ISO Latin Alphabet 2 encoding:
+  ftp put /local-char:cp852 /server-char:latin2 magyar.txt
+    2. Suppose you always want your text files converted to Latin-2 when
+       uploading with FTP. Then put:
+  set ftp server-character-set latin2
+       in your Kermit customization file, and then you can omit the
+       /SERVER-CHARACTER-SET: switch from your FTP PUT commands:
+  ftp put /local-char:cp852 magyar.txt
+    3. Now suppose that all the text files on your PC are written in
+       Hungarian, but they have a variety of encodings, and you don't
+       want to have to include the /LOCAL-CHARACTER-SET: switch on every
+       FTP PUT command, or (more to the point) you want to be able to
+       send a mixture of these files all at once. Put these commands in
+       your Kermit customization file:
+  set ftp server-character-set latin2            ; ISO 8859-2
+  set file default 7-bit-character-set hungarian ; ISO 646 Hungarian
+  set file default 8-bit-character-set cp852     ; PC East European Code Page
+       and now PUT and MPUT will automatically detect and switch among
+       ISO 646 Hungarian, Code Page 852, UTF-8, and UCS-2 encodings,
+       translating each one to Latin-2 for uploading:
+  ftp put *.txt
+
+   And since binary files are also detected automatically, the latter can
+   be simplified to:
+
+  ftp put *
+
+   even when "*" matches a diverse collection of binary and text files,
+   because translations are skipped automatically for binary files.
+     _________________________________________________________________
+
+    3.7.2. Character Sets and Downloading
+
+   The commands and switches are the same as for uploading, but automatic
+   character-set switching works differently, since Kermit can't scan the
+   server files in advance. Instead, the transfer mode (text or binary)
+   is based on the filenames; each name is compared with Kermit's list of
+   text name patterns and binary name patterns. If the name matches a
+   binary pattern (for example, if the filename is oofa.tar.gz and one of
+   the filename patterns is "*.gz"), the file is downloaded in binary
+   mode; otherwise if it matches a text pattern (e.g. oofa.txt matches
+   "*.txt"), it is transferred in text ("ascii") mode. Otherwise, it is
+   transferred in the prevailing FTP TYPE.
+
+   In C-Kermit 8.0, the pattern lists used with FTP GET are not the same
+   lists used with Kermit transfers, and can not be viewed with SHOW
+   PATTERNS, nor adjusted with ADD and REMOVE TEXT-PATTERNS and
+   BINARY-PATTERNS, or SET FILE TEXT-PATTERNS and BINARY-PATTERNS.
+   Configuration of the FTP patterns list will be added in a future
+   release.
+
+   Examples:
+
+   get /server-char:latin1 /local-char:cp850 Grüße.txt
+          In this command, the filename contains special characters,
+          which you enter using whatever character set your local
+          computer uses, in this case PC Code Page 850 (cp850). The
+          command tells Kermit (in case it didn't know already from its
+          FILE CHARACTER-SET setting) that the local character set is
+          cp850 and the server's character-set is ISO 8859-1 Latin
+          Alphabet 1 (latin1). Kermit translates the filename from cp850
+          to latin1 and sends the latin1 name to the server. Since it's a
+          text file (matches "*.txt"), its contents are translated to
+          cp850 on arrival, and it is saved with a cp850 name.
+
+   mget /text /server:latin1 /local:utf8 *.txt
+          This command:
+
+          + Tells C-Kermit that the server's files are encoded in ISO
+            8859-1 Latin Alphabet 1.
+          + Tells C-Kermit to translate the incoming files into Unicode
+            UTF-8 for storage.
+          + Asks the server to send all ".txt" files in text mode.
+
+   mget /server:latin1 /local:utf8 *
+          Tells Kermit to get all files from the server's directory,
+          switching between text and binary mode based on the filename.
+          The names of all the files are translated (to UTF-8 in this
+          case), but contents are translated (also to UTF-8) only for
+          text files.
+
+   Note that any pair of 8-bit character sets is likely to have some
+   incompatibilities. Any characters in the source file that do not have
+   equivalents in the destination file's character set are converted to
+   question marks. This applies to both filenames and to text file
+   contents.
+
+   Also note that the server's ability to accept special characters in
+   filenames depends on the particular server. For example:
+
+  get Grüße.txt
+
+   works with WU-FTPD, but:
+
+  mget Grüß*.txt
+
+   does not.
+     _________________________________________________________________
+
+    3.7.3. RFC2640
+
+   [330]RFC2640, July 1999, specifies a method by which the FTP client
+   and server can negotiate the use of UTF8. However, RFC2640-capable
+   servers are rare to nonexistent at this writing, and in any case you
+   don't need them to be able to transfer text in UTF8. C-Kermit lets you
+   upload and download text files in any character set it knows about,
+   converting to or from any other character set it knows about, without
+   the knowledge, permission, or cooperation of the server, and
+   regardless of its capabilities.
+
+   [ [331]Top ] [ [332]FTP Top ] [ [333]C-Kermit Home ] [ [334]Kermit
+   Home ]
+     _________________________________________________________________
+
+  3.8. FTP Command Shortcuts
+
+   C-Kermit's FTP client coexists with other C-Kermit functions by
+   requiring the "ftp" prefix for each FTP-related command: FTP OPEN, FTP
+   GET, FTP BYE, and so on. For interactive use, however, this can be
+   rather awkward and sometimes surprising, for example when a GET
+   command starts a Kermit GET rather than an FTP GET. In fact, many
+   Kermit commands might just as easily apply to an FTP connection: GET,
+   PUT (SEND), BYE, and CLOSE. The following command lets you choose how
+   these commands are interpreted:
+
+   SET GET-PUT-REMOTE { AUTO, KERMIT, FTP }
+          Controls the orientation of GET, PUT, REMOTE and other
+          file-transfer and client/server commands that might apply to
+          either Kermit or FTP. The default setting is AUTO, meaning that
+          these commands apply to FTP if an FTP connection is open, and
+          to Kermit otherwise. KERMIT means they always apply to Kermit,
+          FTP means they always apply to FTP.
+
+   Here is a complete list of affected commands:
+
+ Kermit Command               FTP Equivalent
+  (none)                       FTP [ OPEN ]
+  LOGIN                        FTP USER
+  LOGOUT                       FTP RESET
+  BYE                          FTP BYE
+  FINISH                       FTP BYE
+  CLOSE                        FTP BYE
+  HANGUP                       FTP BYE
+  BINARY                       FTP TYPE BINARY
+  TEXT (or ASCII)              FTP TYPE ASCII
+  SEND (or PUT)                FTP PUT
+  MSEND (or MPUT)              FTP MPUT
+  RESEND                       FTP PUT /RECOVER
+  CSEND                        FTP PUT /COMMAND
+  GET                          FTP GET
+  MGET                         FTP MGET
+  REGET                        FTP GET /RECOVER
+  REMOTE HELP      (RHELP)     FTP HELP
+  REMOTE CD        (RCD)       FTP CD (CWD)
+  REMOTE PWD       (RPWD)      FTP PWD
+  REMOTE DIRECTORY (RDIR)      FTP DIRECTORY
+  REMOTE DELETE    (RDEL)      FTP DELETE
+  REMOTE MKDIR     (RMKDIR)    FTP MKDIR
+  REMOTE RMDIR     (RRMDIR)    FTP RMDIR
+  REMOTE RENAME    (RRENAME)   FTP RENAME
+  REMOTE TYPE      (RTYPE)     FTP TYPE
+  REMOTE EXIT      (REXIT)     FTP BYE
+
+   The commands in the right-hand column always access FTP. The commands
+   in the left column can access either Kermit protocol or FTP:
+
+     * When GET-PUT-REMOTE is set to KERMIT, or to AUTO when there is no
+       FTP connection, the commands in the left-hand column access Kermit
+       protocol, and those right-hand column are required for FTP.
+     * When GET-PUT-REMOTE is set to FTP, or to AUTO when there is an
+       active FTP connection, the commands in the left-hand column access
+       the FTP connection and can not be used to access Kermit protocol.
+       In this case, if you want to be able to use both Kermit protocol
+       and the FTP connection, you must SET GET-PUT-REMOTE KERMIT, and
+       then use the FTP commands in the right-hand column to access the
+       FTP connection.
+
+   Note that file-management commands such as DIRECTORY, DELETE, CD, PWD,
+   MKDIR, RMDIR, HELP, RENAME, COPY, TYPE, and so on, always apply
+   locally, no matter what kind of connection you have. This is the
+   opposite of most FTP clients, where these commands are intended for
+   the server, and require an "L" prefix for local execution (e.g. "dir"
+   gets a directory listing from the server, "ldir" gets a local
+   directory listing). To illustrate with the CD command and a typical
+   UNIX FTP client:
+
+ Client   Server      Change Local Directory     Change Remote Directory
+  FTP      FTP         lcd                        cd (cwd)
+  Kermit   Kermit      cd                         rcd, remote cd
+  Kermit   FTP         cd                         ftp cd, rcd, remote cd
+
+   Also note that not all REMOTE commands are useful with FTP, since FTP
+   servers do not offer the corresponding functions. These include:
+
+     * REMOTE ASSIGN  - FTP servers don't have variables
+     * REMOTE COPY    - FTP servers don't copy files
+     * REMOTE HOST    - FTP servers don't execute host (shell) commands
+     * REMOTE KERMIT  - FTP servers don't execute Kermit commands
+     * REMOTE PRINT   - FTP servers don't print files
+     * REMOTE QUERY   - FTP servers don't have variables
+     * REMOTE SET     - FTP servers don't have Kermit settings
+     * REMOTE WHO     - FTP servers don't send user lists
+
+   Finally note that command shortcuts do not apply to the HELP command.
+   For help about an FTP command, use (for example) "help ftp delete",
+   not "help delete" or "help rdelete".
+
+   [ [335]Top ] [ [336]FTP Top ] [ [337]C-Kermit Home ] [ [338]Kermit
+   Home ]
+     _________________________________________________________________
+
+  3.9. Dual Sessions
+
+   You can have an FTP session open at the same time as a regular Kermit
+   SET LINE or SET HOST (terminal) session. In this case, the default SET
+   GET-PUT-REMOTE AUTO setting should ensure that all "two-faced"
+   commands like GET, PUT, REMOTE, HANGUP, BYE, etc, apply to the Kermit
+   session, and all commands for the FTP session must include the FTP
+   prefix. To be absolutely certain, you can use SET GET-PUT-REMOTE
+   KERMIT.
+
+  ftp foo.bar.baz.com
+  if fail ...
+  (log in)
+  set host foo.bar.baz.com
+  if fail ...
+  (log in)
+
+   Now you have both an FTP and Telnet connection to the same host (of
+   course they could also be to different hosts, and you could also have
+   a direct or dialed serial connection instead of a Telnet connection).
+   Now assuming you have a Kermit server on the far end of the Kermit
+   connection:
+
+  rcd incoming      ; Changes Kermit server's directory (= REMOTE CD)
+  ftp cd incoming   ; Changes FTP server's directory
+  put oofa.txt      ; Sends a file on the Kermit connection
+  ftp put oofa.txt  ; Sends a file on the FTP connection
+  bye               ; Shuts down the Kermit connection
+  ftp bye           ; Shuts down the FTP connection
+
+   Note that PUT and SEND are synonyms for both FTP and Kermit
+   connections.
+
+   You can also establish dual sessions on the Kermit command line:
+
+  kermit -j host1 -9 host2
+
+   This makes a Telnet connection to host1 and an FTP connection to
+   host2.
+
+   [ [339]Top ] [ [340]FTP Top ] [ [341]C-Kermit Home ] [ [342]Kermit
+   Home ]
+     _________________________________________________________________
+
+  3.10. Automating FTP Sessions
+
+   Most of Kermit's scripting features can be used to make and control
+   FTP sessions: FOR and WHILE loops, IF-ELSE and SWITCH constructions,
+   variables, arrays, built-in functions, and all the rest. You can't use
+   INPUT, MINPUT, OUTPUT, CLEAR, or SCRIPT on an FTP session, but these
+   are not needed since the FTP protocol is well defined.
+
+   [343]CLICK HERE for an FTP scripting tutorial.
+
+    3.10.1. FTP-Specific Variables and Functions
+
+   The following variable tells whether an FTP connection is open:
+
+   \v(ftp_connected)
+          1 if there is an active FTP connection, 0 if there isn't.
+
+   The FTP OPEN command sets:
+
+   \v(ftp_host)
+          The host to which the most recent FTP connection was made.
+
+   \v(ftp_security)
+          The security method negotiated for the current FTP session. The
+          value is "NULL" when no security is used. See [344]3.2. Making
+          Secure FTP Connections.
+
+   \v(ftp_server)
+          The OS type (UNIX, VMS, etc) of the FTP server host.
+
+   The FTP USER command (or FTP OPEN /USER:, or FTP with automatic login)
+   sets:
+
+   \v(ftp_loggedin)
+          1 if you are logged in to an FTP server, 0 if you are not.
+
+   The current COMMAND-PROTECTION-LEVEL and DATA-PROTECTION-LEVEL values
+   are reflected in:
+
+   \v(ftp_cpl)
+   \v(ftp_dpl)
+          The values are "clear", "confidential", "safe" or "private".
+          See [345]3.2. Making Secure FTP Connections.
+
+   The FTP GET-PUT-REMOTE setting is reflected in:
+
+   \v(ftp_getputremote)
+          The values are "auto", "ftp", or "kermit".
+
+   Every FTP command sets the \v(success) variable, as well as the
+   following two FTP-specific variables:
+
+   \v(ftp_code)
+          The standardized numeric FTP protocol code from the server's
+          response to the last client command, a 3-digit decimal number
+          defined in [346]RFC959. Briefly:
+
+          1xx = Positive Preliminary Reply
+          2xx = Positive Completion Reply
+          3xx = Positive Intermediate Reply
+          4xx = Transient Negative Completion Reply
+          5xx = Permanent Negative Completion Reply
+
+   \v(ftp_message)
+          The text message, if any, from the server's response to the
+          last client command. If the most recent response had multiple
+          lines, this variable has only the final line. These messages
+          are not standardized and vary in format and content from server
+          to server. Synonym: \v(ftp_msg).
+
+   FTP file transfers set the regular Kermit transfer status variables:
+
+  \v(cps)         Characters per second of most recent transfer.
+  \v(filespec)    File specification used in most recent transfer.
+  \v(fsize)       Size of file most recently transferred.
+  \v(tfsize)      Total size of file group most recently transferred.
+  \v(xferstatus)  Status of most recent transfer (0 = success, 1 = failure).
+  \v(tftime)      Elapsed time of most recent transfer, in seconds.
+
+   During an FTP transfer, the per-file variables are:
+
+  \v(filename)    Name of current file.
+  \v(filenumber)  Ordinal file number in group (1, 2, 3, ...)
+     _________________________________________________________________
+
+    3.10.2. Examples
+
+   Let's begin with a simple example showing how to log in, send some
+   files, and log out:
+
+  define error if fail { ftp bye, stop 1 Error: \%1 }
+  set transact brief
+  log t
+  ftp ftp.xyzcorp.com /anonymous
+  if fail stop 1 Connection failed
+  if not \v(ftp_loggedin) stop 1 Login failed
+  ftp cd incoming
+  error {ftp cd}
+  cd upload
+  error {local cd}
+  ftp put /delete *
+  error {put}
+  ftp bye
+
+   First we define an error handling macro to be used after the
+   connection is made. Then we set up a brief-format transaction log to
+   keep a record of our file transfers. Then we make a connection to the
+   host and log in anonymously. The "if fail" command checks whether the
+   connection was made. The "if not" command checks whether login was
+   successful. Obviously the script should not continue unless both tests
+   succeed.
+
+   Next we change to the server's 'incoming' directory and to our own
+   'upload' directory, and send all the files that are in it (they can be
+   any mixture of text and binary files), deleting each source file
+   automatically after it is successfully uploaded. Each of these
+   operations is checked with the ERROR macro, which prevents the script
+   from continuing past a failure.
+
+   Finally we close the FTP session with the "bye" command.
+
+   Just like any other Kermit script, this one can be used in many ways:
+
+     * It can be stored in a file, and Kermit can be told to TAKE the
+       file.
+     * In UNIX, it can be a "[347]kerbang" script and therefore run
+       directly from the shell prompt or as a cron job.
+
+   We could have used command shortcuts like "rcd", "put", and "bye", but
+   since they can be ambiguous under certain circumstances, it is better
+   to avoid them in scripts; they are intended mainly for convenience
+   during interactive use. However, if you wish to use the shortcuts in a
+   script, you can do it this way (error handling omitted for brevity):
+
+  local \%t                       ; Declare a local temporary veriable
+  assign \%t \v(ftp_getputremote) ; Save current FTP GET-PUT-REMOTE setting
+  set ftp get-put-remote ftp      ; Choose FTP orientation
+  ftp xyzcorp.com /anonymous      ; Open an FTP connection
+  get oofa.txt                    ; GET a file
+  put foo.bar                     ; PUT a file
+  rdel yesterday.log              ; Delete a file on the server
+  bye                             ; Log out and disconnect from server.
+  set ftp get-put-remote \%t      ; Restore previous GET-PUT-REMOTE setting
+
+   Of course, FTP scripts can also be written as macros. This lets you
+   pass parameters such as hostnames, usernames, and filenames to them:
+
+  define doftpget {
+      if < \v(argc) 4 end 1 Usage: \%0 host user remotefile [ localfile ]
+      ftp \%1 /user:\%2
+      if fail end 1 FTP OPEN \%1 failed
+      if not \v(ftp_loggedin) end 1 FTP LOGIN failed
+      ftp get {\%3} {\%4}
+      if fail end 1 FTP GET \%3 failed
+      ftp bye
+  }
+
+   Add this definition to your Kermit customization file, and it will
+   always be available when you start Kermit. This macro lets you
+   download a file with FTP by giving a single command, e.g.:
+
+  doftpget xyzcorp.com anonymous oofa.txt
+     _________________________________________________________________
+
+    3.10.3. Automating Secure FTP Sessions
+
+   Often when making secure connections, you are prompted interactively
+   for certain information or permission to proceed. These prompts can
+   stop an automated procedure. To avoid them, you must give the
+   appropriate commands to disable them, and/or supply the prompted-for
+   information beforehand. Here are a few hints:
+
+     * Make sure that SET TAKE ERROR and SET MACRO ERROR are both OFF.
+       This is the default, but in case you have set either one of these
+       ON in your script or initialization file, this makes the script
+       halt on any kind of error. Normally you would want to check each
+       operation for success or failure and take appropriate action.
+     * On SSL and TLS connections, you may be asked whether it is OK to
+       proceed with a connection to server that presents a self-signed
+       certificate. You can use the SET AUTHENTICATION SSL (or TLS)
+       VERIFY or SET AUTH SSL (or TLS) CERTS-OK commands to avoid this
+       prompt by not requesting a certificate from the peer.
+     * (More to be added...)
+
+   [ [348]Top ] [ [349]FTP Top ] [ [350]FTP Script Tutorial ] [
+   [351]C-Kermit Home ] [ [352]Kermit Home ]
+     _________________________________________________________________
+
+  3.11. Advanced FTP Protocol Features
+
+   The remainder of the FTP documention (through the end of Section 3) is
+   new to C-Kermit 8.0.206, but we leave it in black to prevent
+   headaches. Except for titles.
+     * [353]TERMINOLOGY
+     * [354]FEATURE NEGOTIATION
+     * [355]USING MGET: NLST VERSUS MLSD
+     * [356]EXAMPLES
+     * [357]REFERENCES
+
+   The new releases of [358]C-Kermit (8.0.206) and [359]Kermit 95 (2.1)
+   support new FTP protocol features from RFC 2389 as well as most of
+   what's in the Elz and Hethmon Extensions to FTP Internet Draft (see
+   [360]References). Some of these features, such as SIZE (request a
+   file's size), MDTM (request file's modification time), and REST
+   (restart interrupted transfer) have been widely implemented in FTP
+   clients and servers for years (as well as in the initial release of
+   the Kermit FTP clients). Others such as FEAT and MLSD are rarely seen
+   and are new to the upcoming Kermit releases. TVFS (Trivial Virtual
+   File Store) is supported implicitly, and the UTF-8 character-set is
+   already fully supported at the protocol and data-interchange level.
+
+   For Kermit users, the main benefit of the new FTP protocol extensions
+   is the ability to do recursive downloads. But the extensions also
+   introduce complications and tradeoffs that you should be aware of. Of
+   course Kermit tries to "do the right thing" automatically in every
+   case for backwards compatibility. But (as noted later) some cases are
+   inherently ambiguous and/or can result in nasty surprises, and for
+   those situations new commands and switches are available to give you
+   precise control over Kermit's behavior, in case the defaults don't
+   produce the desired results.
+     _________________________________________________________________
+
+   3.11.1. Terminology Command-line FTP clients such as Kermit (as well
+   as the traditional FTP programs found on Unix, VMS, ..., even Windows)
+   have commands like PUT, MPUT, GET, MGET, and BYE, which they convert
+   into zero or more FTP protocol commands, such as NLST, RETR, QUIT. For
+   clarity, we'll use "command" to refer to commands given by the user to
+   the FTP client, and "directive" for FTP protocol commands sent by the
+   FTP client to the FTP server.
+     _________________________________________________________________
+
+   3.11.2. Feature Negotiation New FTP protocol features are negotiated
+   by the client sending a FEAT directive and the server responding with
+   a list of (new) features it supports, or else with an error indication
+   if it does not support the FEAT directive at all, in which case the
+   client has to guess which new features it supports (Kermit guesses
+   that it supports SIZE and MDTM but not MLST). Note that the MLST
+   feature includes MLSD, which is not listed separately as a feature.
+
+   Guessing is nice when it works, but sometimes it doesn't, and some FTP
+   servers become confused when you send them a directive they don't
+   understand, or they do something you didn't want, sometimes to the
+   point of closing the connection. For this reason, Kermit lets you
+   override default or negotiated features with the following new
+   commands:
+
+   FTP { ENABLE, DISABLE } FEAT
+          Enables or disables the automatic sending of a FEAT directive
+          upon connection to an FTP server. Note that
+          FTP [ OPEN ] /NOINIT   also inhibits sending the FEAT directive
+          (and several others) for the connection being OPEN'd, but
+          without necessarily disabling FEAT for subsequent connections
+          in the same Kermit instance. FEAT is ENABLED by default, in
+          which case many FTP servers are likely to reply:
+
+500 'FEAT': command not understood
+
+          which is normally harmless (but you never know). (In C-Kermit
+          8.0.208, this error message is suppressed unless you SET FTP
+          DEBUG ON.)
+
+   FTP ENABLE { MDTM, MLST, SIZE }
+          Enables the given directive for implicit use by the FTP GET and
+          MGET commands in case it has been disabled or erroneously
+          omitted by the server in its FEAT response. Note: MLSD can be
+          used in the FTP ENABLE and DISABLE commands as a synonym for
+          MLST. YOU MUST GIVE THIS COMMAND AFTER MAKING THE FTP
+          CONNECTION.
+
+   FTP DISABLE { MDTM, MLST, SIZE }
+          Disables implicit use of the given directive by GET or MGET in
+          case it causes problems; for example, because it makes
+          multifile downloads take too long or the server announces it
+          erroneously or misimplements it. Use DISABLE FEAT before making
+          a connection to prevent Kermit from sending the FEAT directive
+          as part of its initial sequence. Note that disabling FEAT,
+          SIZE, or MDTM does not prevent you from executing explicit FTP
+          FEATURES, FTP SIZE, or FTP MODTIME commands. Also note that
+          disabling SIZE prevents PUT /RESTART (recovery of interrupted
+          uploads) from working. YOU MUST GIVE THIS COMMAND AFTER MAKING
+          THE FTP CONNECTION.
+
+   To enable or disable more than one feature, use multiple FTP ENABLE or
+   FTP DISABLE commands. The SHOW FTP command shows which features are
+   currently enabled and disabled.
+
+   FTP FEATURES
+          This command sends a FEAT directive to the server. In case you
+          have been disabling and enabling different features, this
+          resynchronizes Kermit's feature list with the server's. If the
+          server does not support the FEAT directive, Kermit's feature
+          list is not changed.
+
+   FTP OPTIONS directive
+          Informational only: the server tells what options, if any, it
+          supports for the given directive, e.g. MLST. Fails if the
+          server does not support the OPTS directive or if the directive
+          for which options are requested is not valid. The directive is
+          case-insensitive.
+
+   FTP SIZE filename
+          Sends a SIZE directive to the server for the given file. The
+          filename must not contain wildcards. The server responds with
+          an error if the file can't be found, is not accessible, or the
+          SIZE directive is not supported, otherwise with the length of
+          the file in bytes, which Kermit displays and also makes
+          available to you in its \v(ftp_message) variable. If the
+          directive is successful, Kermit (re-)enables it for internal
+          use by the GET and MGET directives on this connection.
+
+   FTP MODTIME filename
+          Works just like the SIZE directive except it sends an MDTM
+          directive. Upon success, the server sends modification
+          date-time string, which Kermit interprets for you and also
+          makes available in its \v(ftp_message) variable.
+
+   Whenever a SIZE or MDTM directive is sent implicitly and rejected by
+   the server because it is unknown, Kermit automatically disables it.
+     _________________________________________________________________
+
+   3.11.3. Using MGET: NLST versus MLSD When you give an MGET command to
+   an FTP client, it sends a request to the FTP server for a list of
+   files, and then upon successful receipt of the list, goes through it
+   and issues a RETR (retrieve) directive for each file on the list (or
+   possibly only for selected files).
+
+   With the new FTP protocol extensions, now there are two ways to get
+   the list of files: the NLST directive, which has been part of FTP
+   protocol since the beginning, and the new MLSD directive, which is new
+   and not yet widely implemented. When NLST is used and you give a
+   command like "mget *.txt", the FTP client sends:
+
+NLST *.txt
+
+   and the server sends back a list of the files whose names match, e.g.
+
+foo.txt
+bar.txt
+baz.txt
+
+   Then when downloading each file, the client sends SIZE (if it wants
+   have a percent-done display) and MDTM (if it wants to set the
+   downloaded file's timestamp to match that of the original), as well as
+   RETR (to retrieve the file).
+
+   But when MLSD is used, the client is not supposed to send the filename
+   or wildcard to the server; instead it sends an MLSD directive with no
+   argument (or the name of a directory), and the server sends back a
+   list of all the files in the current or given directory; then the
+   client goes through the list and checks each file to see if it matches
+   the given pattern, the rationale being that the user knows only the
+   local conventions for wildcards and not necessarily the server's
+   conventions. So with NLST the server interprets wildcards; with MLSD
+   the client does.
+
+     The interpretation of NLST wildcards by the server is not
+     necessarily required or even envisioned by the FTP protocol
+     definition (RFC 959), but in practice most clients and servers work
+     this way. 
+
+   The principal advantage of MLSD is that instead of sending back a
+   simple list of filenames, it sends back a kind of database in which
+   each entry contains a filename together with information about the
+   file: type, size, timestamp, and so on; for example:
+
+size=0;type=dir;perm=el;modify=20020409191530; bin
+size=3919312;type=file;perm=r;modify=20000310140400; bar.txt
+size=6686176;type=file;perm=r;modify=20001215181000; baz.txt
+size=3820092;type=file;perm=r;modify=20000310140300; foo.txt
+size=27439;type=file;perm=r;modify=20020923151312; foo.zip
+(etc etc...)
+
+   (If the format of the file list were the only difference between NLST
+   and MLSD, the discussion would be finished: it would always be better
+   to use MLSD when available, and the MGET user interface would need no
+   changes. But there's a lot more to MLSD than the file-list format;
+   read on...)
+
+   The client learns whether the server supports MLSD in FEAT exchange.
+   But the fact that the server supports MLSD doesn't mean the client
+   should always use it. It is better to use MLSD:
+
+     * On connections where the server imposes a time penalty for every
+       command, e.g. the Red Hat Rawhide server. With MLSD, the client
+       needs to send only one command (RETR) per file, whereas NLST
+       requires three (SIZE, RETR, and MDTM). Suppose there is a
+       30-second delay for each command and 1000 files are to be fetched;
+       in that case, MLSD saves 60,000 seconds = 1000 minutes = 16 hours
+       and 40 minutes.
+     * For recursive downloads since there is no dependable way to
+       download directory trees with NLST.
+
+   But it is better to use NLST:
+
+     * If you want only a couple short files out of a large directory. In
+       this case, NLST is the better choice since the server sends a list
+       of only the files you want, not a list of (say) a million files,
+       which can make a big difference on slow connections. For example,
+       suppose your wildcard matches three files of 1K each, but the
+       million-file listing is 80MB long, and your connection is through
+       a modem. The overhead of using MLSD is practically infinite.
+     * If the server supports wildcarding features not known to the
+       client, but that can be used to achieve desirable effects
+       otherwise unobtainable, such as "[dir...]*.txt" in VMS or AOS/VS
+       "except" clauses.
+     * If you have been given a wildcard string by an FTP site
+       administrator for fetching a specific group of files out of a
+       larger directory, e.g. "mget ck[cuw]*.[cwh] makefile", that is
+       expected to work with any client (an FTP site administrator can't
+       be expected to know the wildcard syntax of every FTP client).
+
+   But when using MLSD there are complications:
+
+     * MLSD wants either a blank argument (meaning the current directory)
+       or else the name of a specific directory. The client must not send
+       it a wildcard or a filename.
+     * But if the user's command is "mget xxx", how does the client know
+       whether to send "xxx" in the MLSD directive? It might be the name
+       of a directory on on the server, in which case it should be sent,
+       or it might be the name of a file on the server (or a wildcard),
+       in which case it must not be sent. Since the client knows its own
+       wildcard syntax, then in most cases it would be right to send
+       "MLSD" with no argument if xxx is wild, and to send "MLSD xxx" if
+       it is not.
+     * But suppose the server's file system allows filename characters
+       that correspond with the client's wildcard syntax? For example:
+       "[abc]" could be either a valid VMS directory name or a wildcard
+       pattern used by the FTP client. What should the client do with
+       "mget [abc]"? In this case there must be a way for the user to
+       force sending the MGET argument as the MLSD argument.
+     * If "xxx" is a regular file in the server's current directory,
+       "mget xxx" works with NLST but not with MLSD.
+
+   To further complicate matters, NLST can (in theory) work just like
+   MLSD: if sent with a blank argument or a directory name, it is
+   supposed to return a complete list of files in the current or given
+   directory, which the client can match locally against some pattern. It
+   is not known if any FTP server or client does this but nevertheless,
+   it should be possible since this behavior can be inferred from RFC
+   959.
+
+   In view of these considerations, and given the need to preserve the
+   traditional FTP client command structure and behavior so the software
+   will be usable by most people:
+
+    1. The MGET command should produce the expected result in the common
+       cases, regardless of whether NLST or MLSD is used underneath.
+    2. For anomalous cases, the user needs a way to control whether the
+       MGET argument is sent to the server or kept for local use.
+    3. At the same time, the user might need a way to send a directory
+       name to the server, independent of any wildcard pattern.
+    4. The user needs a way to force NLST or MLSD for a given MGET
+       command.
+
+   By default, Kermit's MGET command uses MLSD if MLST is reported by the
+   server in its FEAT list. When MLSD is used, the filespec is sent to
+   the server if it is not wild (according to Kermit's own definition of
+   "wild" since it can't possibly know the server's definition). If the
+   filespec is wild it is held for local use to select files from the
+   list returned by the server. If MLST is not reported by the server or
+   is disabled, Kermit sends the MGET filespec with the NLST directive.
+
+   The default behavior can be overridden globally with FTP DISABLE MLST,
+   which forces Kermit to use NLST to get file lists. And then for
+   situations in which MLSD is enabled, the following MGET switches can
+   be used to override the defaults for a specific MGET operation:
+
+   /NLST
+          Forces the client to send NLST. Example:
+
+mget /nlst foo.*
+
+   /MLSD
+          Forces the client to send MLSD (even if MLST is disabled).
+          Example:
+
+mget /mlsd foo.*
+
+   /MATCH:pattern
+          When this switch is given, it forces the client to hold the
+          pattern for local use against the returned file list. If a
+          remote filespec is also given (e.g. the "blah" in "mget
+          /match:*.txt blah"), then it is sent as the NLST or MLSD
+          argument, presumably to specify the directory whose files are
+          to be listed. When the /MATCH switch is not given, the MGET
+          filespec is sent to the server if the directive is NLST or if
+          the filespec is not wild. Examples:
+
+  Command:                   With NLST:     With MLSD:
+    mget                      NLST           MLSD
+    mget *.txt                NLST *.txt     MLSD
+    mget foo                  NLST foo       MLSD foo
+    mget /match:*.txt         NLST           MLSD
+    mget /match:*.txt foo     NLST foo       MLSD foo
+
+   In other words, the pattern is always intepreted locally unless MGET
+   uses NLST and no /MATCH switch was given.
+     _________________________________________________________________
+
+   3.11.4. Examples
+
+  3.11.4.1. Downloading a Single File
+
+   There are no choices here, just use the FTP GET command. Kermit always
+   sends the RETR directive, and possibly SIZE and/or MDTM. The small
+   advantage of using MLST in this case is outweighed by the risk and
+   effort of coding a special case.
+
+  3.11.4.2. Downloading a Group of Files from a Single Directory
+
+   This case presents tradeoffs, especially on slow connections:
+
+     * For downloading all or most of the files in a directory, MLSD is
+       better because it eliminates the need to send SIZE and MDTM for
+       each file. No special actions are required in this case; Kermit
+       uses MLSD automatically if the server supports it (unless you have
+       disabled it).
+     * For a small number of files from a large directory, NLST is better
+       because it bypasses downloading of a potentially huge file list
+       prior to the files themselves. If you have a connection to a
+       server that supports MLSD, use the /NLST switch to force NLST:
+
+mget /nlst t[1234].h
+
+     * If the server supports MLSD but does not support separate SIZE or
+       MDTM directives, and you need the size and/or timestamp
+       information, MLSD is better; no special actions required.
+     * If the server supports MLSD but does not support the "size" and
+       "modify" facts, but it does support the SIZE or MDTM directives,
+       and you need the size and/or timestamp information, NLST is
+       better.
+
+  3.11.4.3. Downloading a Directory Tree
+
+   MLSD is the only choice for recursive downloads; they rarely, if ever,
+   work with NLST (the few cases where they do work rely on
+   extra-protocol "secret" notations for the NLST argument). No special
+   actions are required to force MLSD when the server supports it, unless
+   you have disabled it. Examples:
+
+   MGET /RECURSIVE
+          This tells the server to send all files and directories in the
+          tree rooted at its current directory.
+
+   MGET /RECURSIVE *.txt
+          This tells the server to send all *.txt files in the tree
+          rooted at its current directory.
+
+   MGET /MLSD /RECURSIVE *.txt
+          Same as the previous example but forces Kermit to send MLSD in
+          case it was disabled, or in case the server is known to support
+          it even though it did not announce it in its FEAT listing.
+
+   MGET /RECURSIVE /MATCH:*.zip archives
+          Tells the server to send all ZIP files in the tree rooted at
+          its "archives" directory.
+
+   MGET /RECURSIVE /MATCH:* [abc]
+          The server is running on VMS and you want it to send all the
+          files in the directory tree rooted at [ABC]. But since "[abc]"
+          looks just like a wildcard, you have to include a /MATCH:
+          switch to force Kermit to send "[abc]" as the MLSD argument.
+
+   In all cases in which the /RECURSIVE switch is included, the server's
+   tree is duplicated locally.
+
+     Although MLSD allows recursion and NLST does not, the MLSD
+     specification places a heavy burden on the client; the obvious,
+     straightforward, and elegant implementation (depth-first, the one
+     that Kermit currently uses) requires as many open temporary files
+     as the server's directory tree is deep, and therefore client
+     resource exhaustion -- e.g. exceeding the maximum number of open
+     files -- is a danger. Unfortunately MLSD was not designed with
+     recursion in mind. (Breadth-first traversal could be problematic
+     due to lack of sufficient navigation information.) 
+
+   Of course all of Kermit's other MGET switches can be used too, e.g.
+   for finer-grained file selection (by date, size, etc), for moving or
+   renaming files as they arrive, to override Kermit's automatic per-file
+   text/binary mode switching, to pass the incoming files through a
+   filter, to convert text-file character sets, and so on.
+
+  3.11.4.4. NLST/MLSD Summary Table
+
+   Here's a table summarizing MGET behavior when the server supports both
+   NLST and MLSD. /NLST and /MLSD switches are included for clarity to
+   indicate which protocol is being used, and the expected effects. In
+   practice you can omit the /NLST and /MLSD switches and the Kermit
+   client chooses the appropriate or desired protocol as described above.
+   Sample commands presume a Unix file system on the server, but of
+   course the server can have any file system or syntax at all.
+
+   User's Command FTP Sends Remarks
+   mget /nlst NLST Gets a list of all the files in the server's current
+   and downloads each file. The list includes names only, so Kermit also
+   must send SIZE and MDTM directives if size and timestamp information
+   is required (this is always true of NLST). Sending NLST without an
+   argument is allowed by the RFC959 NLST definition and by the Kermit
+   FTP client, but might not work with other clients, and also might not
+   work with every server.
+   mget /nlst foo NLST foo If "foo" is a directory, this gets a list of
+   all the files from the server's "foo" directory and downloads each
+   file; otherwise this downloads the file named "foo" (if any) from the
+   server's current directory.
+   mget /nlst *.txt NLST *.txt Gets a list of the files in the server's
+   current directory whose names match the pattern *.txt, and then
+   downloads each file from the list. Because we are using NLST, we send
+   the filespec (*.txt) to the server and the server interprets any
+   wildcards.
+   mget /nlst foo/*.txt NLST foo/*.txt  Gets a list of the files in the
+   server's "foo" directory whose names match the pattern *.txt, and then
+   downloads each file from the list (server interprets wildcards).
+   mget /nlst /match:*.txt NLST Gets a list of all the files in the
+   server's current directory and then downloads each one whose name
+   matches the pattern *.txt (client interprets wildcards).
+   mget /nlst /match:*.txt foo  NLST foo Gets a list of all the files in
+   the server's "foo" directory and then downloads each one whose name
+   matches the pattern *.txt (client interprets wildcards).
+   mget /mlsd MLSD Gets a list of all the files from the server's current
+   directory and then downloads each one. The list might include size and
+   timestamp information, in which case Kermit does not need to send SIZE
+   and MDTM directives for each file (this is always true of MLSD).
+   mget /mlsd foo MLSD foo Gets a list of all the files from the server's
+   "foo" directory (where the string "foo" does not contain wildcards)
+   and then downloads each one. If "foo" is a regular file and not a
+   directory, this command is supposed to fail, but some servers have
+   been observed that send the file.
+   mget /mlsd *.txt MLSD Gets a list of all the files from the server's
+   current directory and then downloads only the ones whose names match
+   the pattern "*.txt". Because we are using MLSD and the MGET filespec
+   is wild, we do not send the filespec to the server, but treat it as
+   though it had been given in a /MATCH: switch and use it locally to
+   match the names in the list.
+   mget /mlsd foo/*.txt MLSD This one won't work because MLSD requires
+   that the notions of server directory and filename-matching pattern be
+   separated. However, the client, which can't be expected to know the
+   server's file-system syntax, winds up sending a request that the
+   server will (or should) reject.
+   mget /mlsd /match:*.txt MLSD Gets a list of all the files from the
+   server's current directory and then downloads only the ones whose
+   names match the pattern "*.txt" (client interprets wildcards).
+   mget /mlsd /match:*.txt foo MLSD foo If "foo" is a directory on the
+   server, this gets a list of all the files from the server's "foo"
+   directory and then downloads only the ones whose names match the
+   pattern "*.txt" (client interprets wildcards). This leaves the server
+   CD'd to the "foo" directory; there's no way the client can restore the
+   server's original directory because MLSD doesn't give that
+   information, and since the client can not be expected to know the
+   server's file-system syntax, it would not be safe to guess. If "foo"
+   is a regular file, MLSD fails.
+   mget /mlsd foo bar MLSD This one is problematic. You're supposed to be
+   able to give MGET a list a filespecs; in this case we name two
+   directories. The client must change the server's directory to "foo" to
+   get the list of files, and then the files themselves. But then it has
+   no way to return to the server's previous directory in order to do the
+   same for "bar", as explained in the previous example.
+   mget /mlsd /match:* [abc] MLSD [abc] Including a /MATCH: switch forces
+   [abc] to be sent to the server even though the client would normally
+   think it was a wildcard and hold it for local interpretation. In this
+   example, [abc] might be a VMS directory name.
+   mget /mlsd /match:* t*.h MLSD t*.h Contrary to the MLSD specification,
+   some MLSD-capable FTP servers do interpret wildcards. This form of the
+   MGET command can be used to force a wildcard to be sent to the server
+   for interpretation.
+
+   When MLSD is used implicitly (that is, without an /MLSD switch given
+   to force the use of MLSD) and an MGET command such as "mget foo/*.txt"
+   fails, Kermit automatically falls back to NLST and tries again.
+     _________________________________________________________________
+
+   3.11.5. References
+
+    1. Postel, J., and J. Reynolds, File Transfer Protocol (FTP), RFC
+       959, October 1985: [361]ftp://ftp.isi.edu/in-notes/rfc959.txt.
+    2. Hethmon, P, and R. Elz, Feature negotiation mechanism for the File
+       Transfer Protocol, RFC 2389, August 1998:
+       [362]ftp://ftp.isi.edu/in-notes/rfc2389.txt.
+    3. Elz, R, and P. Hethmon, Extensions to FTP, Internet Draft
+       draft-ietf-ftpext-mlst-16.txt, September 2002:
+       [363]http://www.ietf.org/internet-drafts/draft-ietf-ftpext-mlst-16
+       .txt.
+    4. [364]The Kermit FTP Client (overview).
+
+   [ [365]Top ] [ [366]FTP Top ] [ [367]C-Kermit Home ] [ [368]Kermit
+   Home ]
+  __________________________________________________________________________
+
+4. FILE SCANNING
+
+   A new feature called file scanning is used in various contexts to
+   determine if a file is text or binary, and if it is text, what kind of
+   text. The overhead of file scanning is surprisingly tolerable, usually
+   about a quarter second per file. File scanning is now used instead of
+   filename patterns unless you SET FILE SCAN OFF, which restores the
+   previous behavior.
+
+   The primary benefit of file scanning is in file transfer. For all
+   practical purposes, now you can stop worrying about whether a file
+   should be sent in binary or text mode, or about sending mixtures of
+   text and binary files in a single operation, or configuring and
+   fine-tuning your lists of binary-file and text-file name patterns: now
+   it all just works.
+
+   File scanning is done by the file sender, which determines the type of
+   each file before it sends it and informs the receiver (Kermit or FTP
+   server) of the type. File scanning is NOT done by the receiver,
+   because it is the sender's responsibility to determine each file's
+   type, send the file in the right mode, and inform the receiver of the
+   mode. If both transfer partners are capable of this (or any other)
+   form of automatic text/binary mode switching, then files can be sent
+   in both directions with no worries about corruption due to
+   inappropriate transfer mode. (As noted in [369]Section 3, FTP servers
+   don't do this, so this discussion does not apply when using Kermit to
+   download from an FTP server.)
+
+   The rest of this section is mainly for the curious. If you don't read
+   it and simply accept all defaults, every file you send should go in
+   the appropriate mode automatically. As always, however, for
+   character-set translation to work for 7- and 8-bit character-set
+   files, the appropriate SET FILE CHARACTER-SET command(s) must have
+   been executed to identify their encoding (Kermit's default file
+   character-set is neutral ASCII except on platforms like HP-UX or
+   DG/UX, where the default file character-set is known). And of course,
+   receiving is another matter -- obviously the other Kermit must also
+   send each file in the appropriate mode.
+
+   Scanning is more reliable than filename patterns simply because
+   filenames are not reliable indicators of the file's contents. Classic
+   examples include ".doc" files, which are binary if Microsoft Word
+   documents but text on most other platforms, and ".com" files, which
+   are binary on DOS and Windows but text on VMS. Anyway, nobody knows
+   the naming conventions (if any) of all the applications (and persons!)
+   on your computer. Scanning, on the other hand, determines each file's
+   type by inspecting its contents rather than just looking at its name.
+
+   Also, file patterns -- even when they work as intended -- categorize
+   each file only as text or binary, whereas file scanning can make finer
+   distinctions:
+
+   BINARY
+          Binary data, not to be converted in any way. Examples include
+          binary machine code (executable programs), graphics images
+          (GIF, JPG, etc), compressed files (Z, GZ, etc), archives and
+          packages (ZIP, TAR, RPM, etc), object files and libraries (OBJ,
+          DLL, etc).
+
+   7-BIT TEXT
+          Text encoded in a 7-bit character set such as ASCII or one of
+          the ISO 646 national versions. Kermit has no way to tell which
+          character is used, only that it's 7-bit text. Typical examples
+          include program source code, README files, Perl or Kermit
+          scripts, plain-text email, HTML, TeX, and various textual
+          encodings of binary files: Hex, Base64, etc. When sending such
+          files, the FILE DEFAULT 7BIT-CHARACTER-SET is used as the file
+          character-set, and then the appropriate transfer character set
+          is chosen from the associations list (ASSOCIATE, SHOW
+          ASSOCIATIONS).
+
+   8-BIT TEXT
+          Text encoded in an 8-bit character set such as Latin-1,
+          Latin-2, Latin/Hebrew, Latin/Cyrillic, KOI8, HP-Roman8, JIS X
+          0208, Code Page 437, or Code Page 1252. Again, Kermit has no
+          way of knowing which particular set is in use, only that it's
+          8-bit text. When sending such files, the FILE DEFAULT
+          8BIT-CHARACTER-SET is used as the file character-set, and then
+          the appropriate transfer character set is chosen from the
+          associations list.
+
+   UCS2 TEXT
+          Unicode in its basic form, 16 bits (2 octets) per character.
+          When sending such files, UCS2 is the file character-set and the
+          byte order is identified automatically; the appropriate
+          transfer character set is chosen from the associations list.
+          Normally this would be UTF8. UTF-16 is not supported yet;
+          Kermit's Unicode translations are restricted to Plane 0, the
+          Base Multilingual Plane (BMP).
+
+   UTF8 TEXT
+          Unicode in its 8-bit transformation format. When sending such
+          files, UTF8 is the file character-set; the appropriate transfer
+          character set is chosen from the associations list, normally
+          UCS2 or UTF8.
+
+   File scanning is available in UNIX C-Kermit, in K-95, and to a limited
+   extent, in VMS C-Kermit (full scanning is problematic in VMS because
+   even plain-text files might contain binary record-format information).
+   The relevant commands are:
+
+   SET TRANSFER MODE { AUTOMATIC, MANUAL }
+          Tells whether the file-transfer mode (text or binary) should be
+          set by automatic or "manual" means. AUTOMATIC is the default,
+          which allows any of the automatic methods that are enabled to
+          do their jobs: FILE SCAN, FILE PATTERNS, peer recognition, etc.
+          MANUAL lets you control the transfer mode with the SET FILE
+          TYPE commands. As always, /TEXT and /BINARY switches on your
+          file-transfer commands override all other methods; if you give
+          one of these switches, scanning is not done. SHOW TRANSFER
+          displays the current TRANSFER MODE setting.
+
+   SET FILE SCAN { ON [ number ], OFF }
+          Turns this feature on and off. It's ON by default. When OFF,
+          the previous rules apply (SET FILE PATTERNS, etc). When ON is
+          given, you can also specify a number of bytes to be scanned.
+          The default is 49152 (= 48K). If a negative number is given,
+          the entire file is scanned, no matter how big, for maximum
+          certainty (for example, a PostScript file that appears to be
+          plain text might include an embedded graphic past the normal
+          scanning limit). SHOW FILE displays the current FILE SCAN
+          setting.
+
+   SET FILE DEFAULT 7BIT-CHARACTER-SET name
+          Tells the 7-bit character-set to use if scanning identifies a
+          7-bit text file, e.g. GERMAN. SHOW FILE displays the current
+          SET FILE DEFAULT settings. So does SHOW CHARACTER-SETS.
+
+   SET FILE DEFAULT 8BIT-CHARACTER-SET name
+          Tells the 8-bit character-set to use if scanning identifies an
+          8-bit text file, e.g. LATIN1. SHOW FILE and SHOW CHARACTER-SET
+          display this.
+
+   ASSOCIATE FILE-CHARACTER-SET fcs tcs
+          When sending files and a file character-set (fcs) is identified
+          by scanning, this tells C-Kermit which transfer character-set
+          (tcs) to translate it to. It also allows C-Kermit to set the
+          appropriate transfer character-set automatically whenever you
+          give a SET FILE CHARACTER-SET command.
+
+   ASSOCIATE TRANSFER-CHARACTER-SET tcs fcs
+          When receivinging files and a file arrives whose transfer
+          character-set (tcs) is announced by the sender, this command
+          tells C-Kermit which file character-set (fcs) to translate it
+          to. It also allows C-Kermit to set the appropriate file
+          character-set whenever you give a SET TRANSFER CHARACTER-SET
+          command.
+
+   SET FILE CHARACTER-SET name
+          When given for a 7-bit set, also sets FILE DEFAULT
+          7BIT-CHARACTER-SET to the same set. When given for an 8-bit
+          set, also sets FILE DEFAULT 8BIT-CHARACTER-SET to the same set.
+          If an ASSOCIATE FILE-CHARACTER-SET command has been given for
+          this set, also sets the corresponding transfer character-set.
+
+   DIRECTORY /XFERMODE [ filespec ]
+          Performs a file scan of the given files, listing the result for
+          each file. If FILE SCAN is OFF but PATTERNS are ON, the result
+          shown according to the current FILE TEXT-PATTERNS and
+          BINARY-PATTERNS, and are restricted to (B) and (T). When FILE
+          SCAN is ON, the results are:
+
+  (B)          Binary
+  (T)(7BIT)    Text: 7-bit
+  (T)(8BIT)    Text: 8-bit
+  (T)(UTF8)    Text: Unicode UTF8
+  (T)(UCS2BE)  Text: Unicode UCS2 Big Endian
+  (T)(UCS2LE)  Text: Unicode UCS2 Little Endian
+
+          So you can use DIR /XFER to get a preview of how each file in a
+          selected group will be transferred. Everything to the right of
+          the (B) or (T) is new. If FILE SCAN is OFF, you only get the
+          (B) or (T) as before.
+
+          Note: Big and Little Endian refer to the ordering of bytes
+          within a computer word. Big Endian architecture is standard and
+          is used on most non-PC computers. Little Endian architecture is
+          used on PCs.
+
+   To illustrate file-transfer with scanning, suppose you have a
+   directory containing a mixture of text and binary files, and each text
+   file can be 7-bit German ISO 646, 8-bit Latin-1, or Unicode in any of
+   the following forms: UCS2 Little Endian, UCS2 Big Endian, or UTF8
+   ([370]UTF-16 is not supported yet). Assuming all the built-in defaults
+   are in effect, the following three commands do the job:
+
+  set file char german   ; This sets the default for 7-bit text files
+  set file char latin1   ; This sets the default for 8-bit text files
+  send *
+
+   Each file is sent in the appropriate mode (text or binary), with text
+   files converted to the appropriate transfer character-set and labeled
+   so the receiver can convert them according to its own local
+   conventions.
+
+   By the way, what if you want to inhibit character-set translation but
+   still allow automatic text/binary mode switching? Previously, you
+   could simply SET TRANSFER CHARACTER-SET TRANSPARENT. But now with file
+   scanning, the file and transfer character-sets are set automatically
+   per file. A new command was added for this purpose:
+
+   SET TRANSFER TRANSLATION { ON, OFF }
+          Enables and disables file-transfer character-set translation.
+          It is enabled by default.
+
+   When TRANSFER TRANSLATION is OFF but FILE SCAN is ON, files are still
+   scanned to see if they are text or binary, but no character-set
+   translation is done when they text: only the normal record-format
+   conversion.
+
+   Like all SET commands, SET TRANSFER TRANSLATION is global and
+   persistent. You can also force a particular file-transfer command
+   (SEND, MSEND, GET, RECEIVE, TRANSMIT, etc) to not translate without
+   affecting the global translation settings by including the new
+   /TRANSPARENT switch, e.g.
+
+  send /transparent oofa.txt
+
+   As of C-Kermit 8.0.206, SET TRANSFER CHARACTER-SET TRANSPARENT implies
+   SET TRANSFER TRANSLATION OFF.
+
+   File scanning is also used in the TYPE command. The source file type
+   and character set are determined as above, and then the file is
+   automatically converted to your display character-set, line by line.
+   In Kermit 95, the display character-set is Unicode, perhaps converted
+   to your current console code page; in other versions of C-Kermit, it
+   is your current file character-set. Thus if you have the following set
+   appriately:
+
+  SET FILE CHARACTER-SET (necessary in Unix but not K95)
+  SET FILE DEFAULT 7BIT CHARACTER-SET
+  SET FILE DEFAULT 8BIT CHARACTER-SET
+
+   then you should be able to TYPE any text file and see something
+   reasonable. For example, in Unix, if your DEFAULT 7BIT-CHARACTER-SET
+   is ITALIAN and your DEFAULT 8BIT-CHARACTER-SET is LATIN1, and your
+   FILE CHARACTER-SET is LATIN1, you can TYPE an Italian ISO 646 file, a
+   Latin-1 file, or any kind of Unicode file, and have it translated
+   automatically to Latin-1 for your display.
+
+   In the GUI version of Kermit 95, you can see mixtures of many
+   different scripts if the file is UTF8 or UCS2: Roman, Cyrillic,
+   Hebrew, Greek, Armenian, Georgian, etc, all on the same screen at
+   once.
+
+   File scanning also adds a new criterion for file selection, i.e. to
+   select only text (or binary) files. Several commands now include a new
+   switch, /TYPE:{BINARY,TEXT,ALL}. BINARY means select only binary
+   regular files (not directories). TEXT means select only text files.
+   ALL means don't scan; select all files. Examples:
+
+   SEND /TYPE:BINARY *.*
+          Sends only binary files, skipping over text files.
+
+   NOTE: File scanning is NOT done when using external protocols (because
+   the external protocol programs, such as sz, are processing each file,
+   not Kermit).
+
+   DIRECTORY /TYPE:TEXT
+          Lists only text files but not binary files.
+
+   DELETE /TYPE:BINARY foo.*
+          Deletes all foo.* files that are regular binary files but does
+          not delete any text files.
+
+   CHMOD /TYPE:BINARY 775 *
+          (UNIX) Changes the permissions of all binary files to 775.
+
+   When FILE SCAN is OFF and FILE PATTERNS are ON, behavior is as before
+   with PATTERNS ON, but with some improvements:
+
+     * Pathnames are now stripped prior to pattern matching.
+     * Backup suffixes (like .~3~) are stripped prior to pattern
+       matching.
+
+   [ [371]Top ] [ [372]Contents ] [ [373]C-Kermit Home ] [ [374]Kermit
+   Home ]
+  __________________________________________________________________________
+
+5. FILE AND DIRECTORY NAMES CONTAINING SPACES
+
+   Prior to the introduction of the graphical user interface (GUI), it
+   was inconceivable that file or directory names could contain spaces,
+   because space is a field delimiter in all command languages. GUIs,
+   however, use dialog boxes for filenames, so there is never any
+   question of distinguishing a filename from adjacent fields -- because
+   there are no adjacent fields -- and therefore it has become quite
+   common on computers that have GUIs to have file and directory names
+   composed of multiple words. Of course this poses problems for command
+   shells and other text-oriented programs.
+
+   Most command shells address these problems by allowing such names to
+   be enclosed in doublequotes, e.g.:
+
+  cd "c:\Program Files"
+
+   C-Kermit previously used braces for this:
+
+  cd {c:\Program Files}
+
+   which was not what most people expected. And even when braces were
+   used, Kermit had difficulties with completion, file menus, and so
+   forth, within braced fields.
+
+   C-Kermit 8.0 allows either doublequotes or braces to be used for
+   grouping:
+
+  send "this file"
+  send {this file}
+  rename "this file" "that file"
+  rename {this file} "that file"
+  rename "this file" {that file}
+  cd {Program Files}
+  cd "Program Files"
+
+   Note that the doublequotes or brackets must enclose the whole file or
+   directory specification:
+
+  "c:\My Directory"
+
+   not:
+
+  c:\"My Directory"
+
+   In C-Kermit 8.0, you can also use completion on these filenames, in
+   which case Kermit supplies the quotes (or braces) automatically.
+   Example (in which the current directory contains only one file whose
+   name starts with "th" and its full name is "this file" (without the
+   quotes, but with the space)):
+
+  cat th<Tab>
+
+   Kermit repaints the filename field like this:
+
+  cat "this file"
+
+   That is, it backspaces over the original "th" and then writes the
+   filename in doublequotes.
+
+   If completion is only partial, Kermit still supplies the quotes, but
+   in this case also beeps. To continue the filename, you must first
+   backspace over the closing quote. The closing quote is supplied in
+   this case to make sure that you can see the spaces, especially if they
+   are trailing. For example, if the current directory contains two files
+   whose names start with "th", and their fill names are "this file" and
+   "this other file":
+
+  cat th<Tab>
+
+   Kermit prints:
+
+  cat "this "<Beep>
+
+   If it didn't print the closing quote, you would probably wonder why it
+   was beeping.
+
+   Also, if you begin a filename field with a doublequote or opening
+   brace, now you can use completion or get ?-help; this was never
+   possible before.
+
+ C-Kermit>type "thi? Input file specification, one of the following:
+   this file        this other file
+ C-Kermit>type "thi_
+
+   [ [375]Top ] [ [376]Contents ] [ [377]C-Kermit Home ] [ [378]Kermit
+   Home ]
+  __________________________________________________________________________
+
+6. OTHER COMMAND PARSING IMPROVEMENTS
+
+  6.1. Grouping Macro Arguments
+
+   Doublequotes now can be used in macro invocations to group arguments
+   containing spaces, where previously only braces could be used:
+
+  define xx show args
+  xx one "this is two" three
+
+   Result:
+
+  Macro arguments at level 0 (\v(argc) = 4):
+   \%0 = xx
+   \%1 = one
+   \%2 = this is two
+   \%3 = three
+
+   Also, you can now quote braces and quotes in macro args (this didn't
+   work before). Examples:
+
+  xx "{"  ; The argument is a single left brace
+  xx {"}  ; The argument is a doublequote character
+
+   In case this new behavior interferes with your scripts, you can
+   restore the previous behavior with:
+
+  SET COMMAND DOUBLEQUOTING OFF
+
+  6.2. Directory and File Name Completion
+
+   C-Kermit 8.0 also includes better completion for directory names, e.g.
+   in the CD command. If the name typed so far uniquely matches a
+   directory name, it is completed (as before), but now if the directory
+   contains any subdirectories, completion is partial (allowing you to
+   supply additional path segments without backspacing); otherwise it is
+   complete.
+
+   Completion has also been improved for file and directory names that
+   contain not only spaces (as described above) but also "metacharacters"
+   such as asterisk (*) and tilde (~): now the field is repainted if
+   necessary. For example, if the current directory contains only one
+   file whose name contains "blah", then in:
+
+  type *blah<Tab>
+
+   "*blah" is replaced by the filename. In earlier releases, the part
+   typed so far was left on the command line (and in the history buffer),
+   so even when the original command worked, the recalled version would
+   not. Similarly for ~ (the nearly-universal Unix notation for
+   username):
+
+  type ~olga/x<Tab>
+
+   is repainted as (e.g.):
+
+  type /users/home/olga/x(Beep)
+
+   Speaking of command history, the new SHOW HISTORY command shows your
+   command history and recall buffer. SAVE COMMAND HISTORY saves it into
+   a file of your choice.
+
+  6.3. Passing Arguments to Command Files
+
+   The method for passing arguments to command files has been improved.
+   Prior to C-Kermit 7.0 there was no provision for doing this. In
+   C-Kermit 7.0, the TAKE command was changed to allow arguments to be
+   given after the filename:
+
+  take commandfile arg1 arg2 ...
+
+   This was accomplished by replacing the current \%1, \%2, etc, with the
+   given arguments, since a new set of macro argument variables is
+   created only when a macro is executed, not a command file. It is much
+   more intuitive, however, if arguments to command files worked like
+   those to macros: the command file sees the arguments as its own \%1,
+   \%2, etc, but the caller's variables are not disturbed. C-Kermit 8.0
+   accomplishes this by automatically creating an intermediate temporary
+   macro to start the command file (if any arguments were given), thus
+   creating a new level of arguments as expected.
+
+  6.4. More-Prompting
+
+   The familiar --more?-- prompt that appears at the end of each
+   screenful of command-response output now accepts a new answer: G (Go)
+   meaning "show all the rest without pausing and asking me any more
+   questions". P (Proceed) is a synonym for G.
+
+  6.5. Commas in Macro Definitions
+
+   As noted in the [379]C-Kermit manual, comma is used to separate
+   commands in a macro definition. Even when the macro is defined on
+   multiple lines using curly-brace block-structure notation without
+   commas, the definition is still stored internally as a comma-separated
+   list of commands. Therefore special tricks are needed to include a
+   comma in a command. The classic example is:
+
+  define foo {
+      (some command)
+      if fail echo Sorry, blah failed...
+  }
+
+   This would result in Kermit trying to execute a "blah" command. This
+   could always be handled by enclosing the text in braces:
+
+  define foo {
+      (some command)
+      if fail echo {Sorry, blah failed...}
+  }
+
+   but doublequotes (more intuitive) should have worked too. Now they do:
+
+  define foo {
+      (some command)
+      if fail echo "Sorry, blah failed..."
+  }
+
+  6.6. Arrow Keys
+
+   As of version 8.0.201, C-Kermit on most platforms lets you access the
+   command history buffer with arrow keys, just as you always could with
+   control characters. The restrictions are:
+
+    1. Only Up and Down arrow keys are accepted.
+    2. Only 7-bit ANSI arrow-key sequences are understood (ESC followed
+       by [ or uppercase letter O, followed by uppercase letter A or (up)
+       B (down).
+
+   This change was made to facilitate command recall in Linux-based PDAs
+   that don't have a Control key, or at least not one that's easily (or
+   always) accessible, such as the Sharp Zaurus SL5500.
+
+   [ [380]Top ] [ [381]Contents ] [ [382]C-Kermit Home ] [ [383]Kermit
+   Home ]
+  __________________________________________________________________________
+
+7. NEW COMMANDS AND SWITCHES
+
+   See [384]Section 4 for more about file scanning and the /TYPE: switch.
+
+   ASK[Q] [ /TIMEOUT:number /QUIET /DEFAULT:text ] variable [ prompt ]
+          The new optional /TIMEOUT: switch for ASK and ASKQ causes the
+          command to time out and and fail if no response is given within
+          the specified number of seconds, 1 or greater (0 or less means
+          no timeout, wait forever). This works just like SET ASK-TIMER,
+          except its effect is local to the ASK command with which it is
+          given and it does not disturb the global ask timer setting. The
+          new /QUIET switch tells Kermit not to print an error message if
+          the ASK or ASKQ command times out waiting for a response.
+
+          Version 8.0.211 adds the /DEFAULT:text switch for ASK-Class
+          commands (ASK, ASKQ, and GETOK). This lets you supply a default
+          answer in case the user supplies an empty answer or the
+          /TIMEOUT: switch was included and the time limit expired
+          without an answer. In both these cases, the command succeeds.
+
+   CAT filename
+          Equivalent to TYPE /NOPAGE.
+
+   CDUP
+          Changes Kermit's local working directory to the parent of the
+          current one. Equivalent to "cd .." in UNIX or Windows, "cd [-]"
+          in VMS, "cd ^" in AOS/VS, etc; in other words, it's a
+          platform-independent way of moving one level up in a directory
+          tree.
+
+   CHMOD [ switches ] permission files
+          UNIX only. Sets file permissions for one or more files or
+          directories. The permission must be given as an octal number,
+          e.g. 664, 755. Switches: /DIRECTORIES, /FILES, /NOLIST, /PAGE,
+          /DOTFILES, /LIST, /NOPAGE, /RECURSIVE, /TYPE:{TEXT,BINARY,ALL},
+          /SIMULATE. The /TYPE: switch allows selection of only text or
+          binary files. For example, if you have a mixture of source
+          files and executables, you can use "chmod /files /type:text
+          664" to give owner/group read/write and world read permission
+          to the text files, and "chmod /files /type:binary 775" to give
+          the same plus execute permission to the executables. Use
+          /SIMULATE to see which files would be affected, without
+          actually changing their permissions.
+
+   CLEAR KEYBOARD-BUFFER
+          Flushes any as-yet unread characters from the keyboard input
+          buffer. Useful for flushing typeahead in scripts.
+
+   CONTINUE
+          When given at an interactive command prompt that was reached by
+          issuing a PROMPT command (described in this section) from a
+          script, this command returns to the script, continuing its
+          execution at the command after the PROMPT command. In this
+          context, CONTINUE is simply a more-intuitive synonym for END.
+
+   COPY, RENAME, and TRANSLATE
+          These commands now work on file groups if the target filename
+          is a directory, e.g. "copy oofa.* ..", "rename * ~olga/tmp/"
+
+   COPY /APPEND source destination
+          The source file specification can now include wildcards, in
+          which case all of the source files that match will go into the
+          destination file in alphabetical order by name.
+
+   DELETE /ASK
+          Asks permission to delete each file before deleting it. In
+          C-Kermit 7.0, the answers were "yes" (or "ok") and "no".
+          C-Kermit 8.0 adds "go" (meaning, delete all the rest without
+          asking) and "quit" (cancel the DELETE command and return to the
+          prompt).
+
+   DELETE /DIRECTORIES
+          Deletes not only files but also directories.
+
+   DELETE /RECURSIVE
+          Deletes all files that match the given file specification in
+          the current (or given) directory and all directories beneath
+          it.
+
+   DELETE /SUMMARY
+          Prints only the number of files deleted and total size freed,
+          without listing each file.
+
+   DELETE /TREE
+          Shorthand for DELETE /RECURSIVE /DIRECTORIES /DOTFILES/.
+          Equivalent to Windows DELTREE or Unix "rm -Rf". If no file
+          specification is given, the contents of the current directory,
+          plus all of its subdirectories and their contents, are deleted.
+
+   DELETE /TYPE:BINARY
+          Delete only regular binary files (requires FILE SCAN ON).
+
+   DELETE /TYPE:TEXT
+          Delete only regular text files (requires FILE SCAN ON).
+
+   DIRECTORY [ switches ] [ filespec [ filespec [ filespec ... ] ] ]
+          The DIRECTORY command now accepts more than one file
+          specification; e.g. "directory moon.txt sun.doc stars.*".
+
+   DIRECTORY /NORECURSIVE xxx
+          If xxx is a directory name, forces listing of the directory
+          itself rather than its contents.
+
+   DIRECTORY /FOLLOWLINKS xxx
+          (UNIX only) Tells the DIRECTORY command to follow symbolic
+          links. This not the default because it can cause endless loops.
+
+   DIRECTORY /NOFOLLOWLINKS xxx
+          (UNIX only) Tells the DIRECTORY command not to follow symbolic
+          links, but rather, merely to list them. This is the default.
+
+   DIRECTORY /OUTPUT:filename
+          Sends the results of the DIRECTORY command to the given file.
+
+   DIRECTORY /SUMMARY
+          Prints only the number of directories and files and the total
+          size, without listing each file.
+
+   DIRECTORY /TYPE:{TEXT,BINARY}
+          Shows only files of the selected type, based on file scan.
+
+   DIRECTORY /XFERMODE
+          Now shows results of file scan (see [385]Section 4).
+
+   FOPEN [ switches ] channel filename
+
+          As of version 8.0.211, FOPEN allows /dev/tty as a filename in
+          Unix-based operating systems.
+
+   FREAD /TRIM
+          (8.0.211) Trims any trailing blanks or tabs from the item (such
+          as a line of text) that it has read.
+
+   FREAD /UNTABIFY
+          (8.0.211) Converts Horizontal Tab characters to the appropriate
+          number of spaces, based on VT100-like tab stops
+          (1,9,17,25,...).
+
+   GREP [ switches ] pattern files
+          Similar to Unix grep command: displays file lines that match
+          the given [386]pattern. Switches:
+
+        /COUNT[:variable]
+                Don't show the matching lines, just tell how many lines
+                match. If a variable name is specified, the count is
+                stored in the given variable.
+
+        /DOTFILES
+                Include files whose names begin with dot.
+
+        /LINENUMBERS
+                Show line numbers of matching lines.
+
+        /NAMEONLY
+                only list the names of files that contain matching lines,
+                but not the lines themselves.
+
+        /NOBACKUP
+                Skip backup files.
+
+        /NOCASE
+                Ignore alphabetic case while pattern matching.
+
+        /NODOTFILES
+                skip files whose names start with dot (period).
+
+        /NOLIST
+                Suppress output but set SUCCESS or FAILURE according to
+                search result.
+
+        /NOMATCH
+                Look for lines that do not match the pattern.
+
+        /NOPAGE
+                Don't pause between screens of output.
+
+        /OUTPUT:filename
+                Write results into the given file.
+
+        /PAGE
+                Pause between screens of output.
+
+        /RECURSIVE
+                Search files in subdirectories too.
+
+        /TYPE:{TEXT,BINARY}
+                Search only files of the specified type.
+
+          Synonyms: FIND, SEARCH.
+
+   GETOK /TIMEOUT:n /QUIET /DEFAULT:text
+          The new /QUIET switch instructs GETOK, when given a timeout,
+          not to print an error message if it times out. As of 8.0.211, a
+          default answer can be supplied (see ASK).
+
+   HEAD [ switches ] filename
+          Equivalent to TYPE /HEAD [ other-switches ] filename.
+
+   HELP DATE
+          Explains date-time formats, including timezone notation and
+          delta times.
+
+   HELP FIREWALLS
+          Explains the firewall negotiation capabilities of your version
+          of Kermit.
+
+   KCD [ symbolic-directory-name ]
+          Changes Kermit's working directory to the named symbolic
+          directory, such as such as exedir, inidir, startup, download,
+          or and home. Type "kcd ?" for a list of symbolic directory
+          names known to your copy of Kermit, or give the new ORIENTATION
+          command for a more detailed explanation. If you give a KCD
+          command without a directory name, Kermit returns to its "home"
+          directory, which is determined in some way that depends on the
+          underlying operating system, but which you can redefine with
+          the (new) SET CD HOME command. Your home directory is shown by
+          SHOW CD and it's also the value of the \v(home) variable.
+
+   LICENSE
+          Displays the C-Kermit license.
+
+   L-commands
+          When Kermit has a connection to a Kermit or FTP server, file
+          managment commands such as CD, DIRECTORY, and DELETE might be
+          intended for the local computer or the remote server. C-Kermit
+          8.0.200 and earlier always executes these commands on the local
+          computer. If you want them executed by the remote server, you
+          have to prefix them with REMOTE (e.g. REMOTE CD) or use special
+          R-command aliases (e.g. RCD = REMOTE CD, RDIR = REMOTE DIR,
+          etc). But this feels unnatural to FTP users, who expect
+          unprefixed file management commands to be executed by the
+          remote server, rather than locally. C-Kermit 8.0.201 adds
+          automatic locus switching to present an FTP-like interface for
+          FTP connections and the normal Kermit interface for Kermit
+          connections, and a SET LOCUS command (described below) to
+          control whether or how this is done. For when LOCUS is REMOTE,
+          a new set of commands was added for local management: LCD
+          (Local CD), LDIR (Local DIR), etc. These are described below
+          under SET LOCUS.
+
+   MORE filename
+          Equivalent to TYPE /PAGE.
+
+   ORIENTATION
+          Displays symbolic directory names and the corresponding
+          variable names and values. The symbolic names, such as exedir,
+          inidir, startup, download, and home, can be used as arguments
+          to the new KCD command.
+
+   PROMPT [ text ]
+          For use in a macro or command file: enters interactive command
+          mode within the current context ([387]Section 8.1). If the
+          optional text is included, the prompt is set to it. The text
+          can include variables, functions, etc, as in the SET PROMPT
+          command. They are evaluated each time the prompt is printed.
+          Unlike the SET PROMPT command, the text argument applies only
+          to the current command level. Thus you can have different
+          prompts at different levels.
+
+   REMOTE SET MATCH { DOTIFILE, FIFO } { ON, OFF }
+          Allows the client to tell the server whether wildcards sent to
+          the server should match dot files (files whose names begin with
+          period) or FIFOs (named pipes). See SET MATCH.
+
+   SET ATTRIBUTE RECORD-FORMAT { ON, OFF }
+          Allows control of the Kermit's Record-Format attribute. Set
+          this to OFF in case incoming file are refused due to unknown or
+          invalid record formats if you want to accept the file anyway
+          (and, perhaps, postprocess it to fix its record format).
+
+   SET CD HOME [ directory ]
+          Specifies the target directory for the CD and KCD commands,
+          when they are given without an argument, and also sets the
+          value of the \v(home) variable.
+
+   SET EXIT HANGUP { OFF, ON }
+          Normally ON, meaning that when Kermit exits, it also explicitly
+          hangs up the current SET LINE / SET PORT serial port according
+          to the current SET MODEM TYPE and SET MODEM HANGUP METHOD, and
+          closes the port device if it was opened by Kermit in the first
+          place (as opposed to inherited). SET EXIT HANGUP OFF tells
+          Kermit not to do this. This can't prevent the operating system
+          from closing the device when Kermit exits (and it's a "last
+          close") but if the port or modem have been conditioned to
+          somehow ignore the close and keep the connection open, at least
+          Kermit itself won't do anything explicit to hang it up or close
+          it.
+
+   SET FILE EOF { CTRL-Z, LENGTH }
+          Specifies the end-of-file detection method to be used by
+          C-Kermit when sending and receiving text files, and in the TYPE
+          and similar text-file oriented commands. The normal and default
+          method is LENGTH. You can specify CTRL-Z when handling CP/M or
+          MS-DOS format text files, in which a Ctrl-Z (ASCII 26)
+          character within the file marks the end of the file.
+
+   SET FILE LISTSIZE number
+          Allocates space for the given number of filenames to be filled
+          in by the wildcard expander. The current number is shown by
+          SHOW FILE. If you give a command that includes a filename
+          containing a wildcard (such as "*") that matches more files
+          that Kermit's list has room for, you can adjust the list size
+          with this command.
+
+   SET FILE STRINGSPACE number
+          Allocates space for the given amount of filename strings for
+          use by the wildcard expander. The current number is shown by
+          SHOW FILE. The number is the total number of bytes of all the
+          file specifications that match the given wildcard.
+
+     If you need to process a bigger list of files than your computer
+     has memory for, you might be able use an external file list. The
+     Kermit SEND and the FTP PUT and GET commands accept a /LISTFILE:
+     switch, which gives the name of a file that contains the list of
+     files to be transferred. Example for UNIX:
+
+  !find . -print | grep / > /tmp/names
+  ftp put /update /recursive /listfile:/tmp/names
+
+   SET LOCUS { AUTO, LOCAL, REMOTE }
+          Added in C-Kermit 8.0.201.   Sets the locus for unprefixed file
+          management commands such as CD, DIRECTORY, MKDIR, etc. When
+          LOCUS is LOCAL these commands act locally and a REMOTE (or R)
+          prefix (e.g. REMOTE CD, RCD, RDIR) is required to send file
+          management commands to a remote server. When LOCUS is REMOTE,
+          an L prefix is required to issue local file management commands
+          (e.g. LCD, LDIR). The word LOCAL can't be used as a prefix
+          since it is already used for declaring local variables. LOCUS
+          applies to all types of connections, and thus is orthogonal to
+          SET GET-PUT-REMOTE, which selects between Kermit and FTP for
+          remote file-transfer and management commands. The default LOCUS
+          is AUTO, which means we switch to REMOTE whenever an FTP
+          connection is made, and to LOCAL whenever a non-FTP connection
+          is made, and switch back accordingly whenever a connnection is
+          closed. So by default, Kermit behaves in its traditional manner
+          unless you make an FTP connection, in which case it acts like a
+          regular FTP client (but better :-)   LOCUS applies to the
+          following commands:
+
+  Unprefixed    Remote       Local        Description        
+   CD (CWD)      RCD          LCD          Change (Working) Directory
+   CDUP          RCDUP        LCDUP        CD Up
+   PWD           RPWD         LPWD         Print Working Directory
+   DIRECTORY     RDIR         LDIR         Request a directory listinga
+   DELETE        RDEL         LDEL         Delete (a) file(s)
+   RENEME        RREN         LREN         Rename a file
+   MKDIR         RMKDIR       LMKDIR       Create a directory
+   RMDIR         RRMDIR       LRMDIR       Remove a directory
+
+   SET MATCH { DOTIFILE, FIFO } { ON, OFF }
+          Whether C-Kermit filename patterns (wildcards) should match
+          filenames that start with dot (period), or (Unix only) FIFOs
+          (named pipes). The defaults are to skip dotfiles in Unix but
+          match them elsewhere, and to skip FIFOs. Applies to both
+          interactive use and to server mode, when the server receives
+          wildcards, e.g. in a GET command. Also see REMOTE SET MATCH.
+
+   SET OPTIONS DIRECTORY /DOTFILES
+          Now works for server listings too (UNIX only). Give this
+          command prior to having Kermit enter server mode, and then it
+          will show files whose names begin with dot (period) when sent a
+          REMOTE DIRECTORY command.
+
+   SET QUIET ON
+          (as well as the -q command-line option) Now applies also to:
+
+          + SET HOST connection progress messages.
+          + "Press the X or E key to cancel" file-transfer message.
+          + REMOTE CD response.
+          + REMOTE LOGIN response.
+
+   SET RECEIVE PERMISSIONS { ON, OFF }
+          Tells C-Kermit whether to set the permissions of incoming files
+          (received with Kermit protocol) from the permissions supplied
+          in the file's Attribute packet (if any). Normally ON. Also see
+          SET SEND PERMISSIONS.
+
+   SET ROOT directory
+          Like UNIX chroot, without requiring privilege. Sets the root
+          for file access, does not allow reference to or creation of
+          files outside the root, and can't be undone.
+
+   SET SEND PERMISSIONS { ON, OFF }
+          Tells C-Kermit whether to include file permissions in the
+          attributes it includes with each file when sending with Kermit
+          protocol. Also see SET RECEIVE PERMISSIONS.
+
+   SET TCP { HTTP-PROXY, SOCKS-SERVER } /USER:name /PASSWORD:text
+          These commands now allow specification of username and
+          password.
+
+   SET TERMINAL . . .
+          (See [388]Section 12.)
+
+   SET TRANSFER MESSAGE [ text ]
+          Sets an initial text message to be displayed in the
+          file-transfer display. The transfer message is automatically
+          deleted once used, so must be set each time a message a
+          desired. Any variables in the message are evaluated at the time
+          the SET command is given. If the optional text is omitted, any
+          transfer message that is currently set is removed. Synonym: SET
+          XFER MSG. SHOW TRANSFER displays it if it has been set but not
+          yet used.
+
+   SHOW COMMUNICATIONS
+          In C-Kermit 8.0, SHOW COMMUNICATIONS, when given in remote mode
+          (i.e. before any connection has been established), tells the
+          typical dialout device name for the particular platform on
+          which it's running (e.g. TXA0: for VMS, or /dev/cua0p0 for
+          HP-UX). On Unix platforms, it also tells the name of the
+          lockfile directory. This way, you have an idea of what the SET
+          LINE device name should look like, and if the SET LINE command
+          fails, you know the name of the directory or device that is
+          protected against you.
+
+   SHOW VARIABLES [ name [ name [ ... ] ] ]
+          In C-Kermit 8.0.201 you can request values of a list of
+          built-in (\v(xxx)) variables. Each name is a pattern, as
+          before, but now it a free pattern rather than an anchored one
+          (explained in [389]Section 8.12) so now "show var date time"
+          shows the values of all variables whose names include the
+          strings "date" or "time".
+
+   TAIL [ switches ] filename
+          Equivalent to TYPE /TAIL [ other-switches ] filename.
+
+   TRANSMIT /NOECHO [ other switches ] filename
+          The /NOECHO switch is equivalent to giving the command SET
+          TRANSMIT ECHO OFF prior to the TRANSMIT command, except the
+          switch affects only the command with which it was given and
+          does not affect the prevailing global setting.
+
+   TRANSMIT /NOWAIT [ other switches ] filename
+          The /NOWAIT switch is equivalent to giving the command SET
+          TRANSMIT PROMPT 0 prior to the TRANSMIT command, except the
+          switch affects only the command with which it was given and
+          does not affect the prevailing global setting.
+
+   TRANSMIT /NOWAIT /NOECHO /BINARY [ other switches ] filename
+          When the TRANSMIT command is given with the /NOWAIT, /NOECHO,
+          and /BINARY switches, this activates a special "blast the whole
+          file out the communications connection all at once" mode that
+          Kermit didn't have prior to version 8.0. There has been
+          increasing demand for this type of transmission with the advent
+          of devices that expect image (e.g. .JPG) or sound (e.g. .MP3)
+          files as raw input. The obvious question is: how does the
+          receiving device know when it has the whole file? This depends
+          on the device, of course; usually after a certain amount of
+          time elapses with nothing arriving, or else when Kermit hangs
+          up or closes the connection.
+
+   TYPE /CHARACTER-SET:name
+          Allows you to specify the character set in which the file to be
+          typed is encoded.
+
+   TYPE /NUMBER
+          Adds line numbers.
+
+   TYPE /OUTPUT:filename
+          Sends the results of the TYPE command to the given file.
+
+   TYPE /TRANSLATE-TO:name
+          Used in conjunction with TYPE /CHARACTER-SET:xxx; allows you to
+          specify the character set in which the file is to be displayed.
+
+   TYPE /TRANSPARENT
+          Used to disable character-set translation in the TYPE command,
+          which otherwise can take place automatically based on file
+          scanning, even when /CHARACTER-SET and /TRANSLATE-TO switches
+          are not given.
+
+   VOID text
+          Parses the text, evaluating any backslash items in it (such as
+          function calls) but doesn't do anything further, except
+          possibly printing error messages. Useful for invoking functions
+          that have side effects without using or printing their direct
+          results, e.g. "void \fsplit(\%a,&a)".
+
+  Symbolic Links in UNIX
+
+   The UNIX versions of C-Kermit have had /FOLLOWLINKS and /NOFOLLOWLINKS
+   switches added to several commands to control the treatment of
+   symbolic links. Different commands deal differently with symbolic
+   links:
+
+   Kermit SEND, FTP MPUT
+          /NOFOLLOWLINKS is the default, which means symbolic links are
+          skipped entirely. The alternative, /FOLLOWLINKS, should be used
+          with caution, since an innocent link might point to a whole
+          file system, or it might cause a loop. There is no way in
+          Kermit or FTP protocol to send the link itself. We either skip
+          them or follow them; we can't duplicate them.
+
+   DIRECTORY
+          /NOFOLLOWLINKS is the default, which means the DIRECTORY
+          command lists symbolic links in a way that shows they are
+          links, but it does not follow them. The alternative,
+          /FOLLOWLINKS, follows links and gives information about the
+          linked-to directories and files.
+
+   DELETE, RMDIR
+          The DELETE command does not have link-specific switches. DELETE
+          never follows links. If you tell Kermit to delete a symbolic
+          link, it deletes the link itself, not the linked-to file. Ditto
+          for RMDIR.
+
+   COPY
+          The COPY command behaves just like the UNIX cp command; it
+          always follows links.
+
+   RENAME
+          The RENAME command behaves just like the UNIX mv command; it
+          operates on links directly rather than following.
+
+   [ [390]Top ] [ [391]Contents ] [ [392]C-Kermit Home ] [ [393]Kermit
+   Home ]
+  __________________________________________________________________________
+
+8. OTHER SCRIPTING IMPROVEMENTS
+
+  8.1. Performance and Debugging
+
+   A command cache for frequently used commands plus some related
+   optimizations increases the speed of compute-bound scripts by anywhere
+   from 50% to 1000%.
+
+   The new PROMPT command can be used to set breakpoints for debugging
+   scripts. If executed in a command file or macro, it gives you an
+   interactive command prompt in the current context of the script, with
+   all its variables, arguments, command stack, etc, available for
+   examination or change, and the ability to resume the script at any
+   point (END resumes it, Ctrl-C or STOP cancels it and returns to top
+   level).
+
+   The new Ctrl-C trapping feature ([394]Section 8.14) lets you intercept
+   interruption of scripts. This can be used in combination with the
+   PROMPT command to debug scripts. Example:
+
+define ON_CTRLC {
+    echo INTERRUPTED BY CTRL-C...
+    echo The command stack has not yet been rolled back:
+    show stack
+    echo Type Ctrl-C again or use the END command to return to top level.
+    prompt Debug>
+}
+
+   Adding this ON_CTRL definition to your script lets you interrupt it at
+   any point and get prompt that is issued at the current command level,
+   so you can query local variables, etc.
+
+   [ [395]Top ] [ [396]Contents ] [ [397]C-Kermit Home ] [ [398]Kermit
+   Home ]
+     _________________________________________________________________
+
+  8.2. Using Macros as Numeric Variables
+
+   A macro is a way to assign a value to a name, and then use the name to
+   refer to the value. Macros are used in two ways in Kermit: as
+   "subroutines" or functions composed of Kermit commands, which are
+   executed, or as variables to hold arbitrary values -- text, numbers,
+   filenames, etc.
+
+   When a macro is to be executed, its name is given as if it were a
+   C-Kermit command, optionally preceded by the word "do". When a macro
+   is used as a variable, it must be "escaped" with \m(xxx) (or
+   equivalent function, e.g. \s(xxx), \:(xxx), \fdefinition(xxx)), where
+   xxx is the macro name, for example:
+
+  define filename /usr/olga/oofa.txt
+  send \m(filename)
+
+   Of course variables can also hold numbers:
+
+  define size 17
+  declare \&a[\m(size)]
+  ...
+  define index 3
+  if ( == \m(index) 3 ) echo The third value is: \&a[\m(index)]
+  evaluate index (\m(index) * 4)
+  if ( > \m(index) \m(size) ) echo Out of range!
+
+   But these are contexts in which only numbers are valid. C-Kermit 8.0
+   has been changed to treat non-escaped non-numeric items in strictly
+   numeric contexts as macro names. So it is now possible (but not
+   required) to omit the \m(...) notation and just use the macro name in
+   these contexts:
+
+  define size 17
+  declare \&a[size]
+  ...
+  define index 3
+  if ( == index 3 ) echo The third value is: \&a[index]
+  evaluate index (index * 4)
+  if ( > index size ) echo Out of range!
+
+   This is especially nice for loops that deal with arrays. Here, for
+   example, is a loop that reverses the order of the elements in an
+   array. Whereas formerly it was necessary to write:
+
+  .\%n ::= \fdim(&a)
+  for \%i 1 \%n/2 1 {
+      .tmp := \&a[\%n-\%i+1]
+      .\&a[\%n-\%i+1] := \&a[\%i]
+      .\&a[\%i] := \m(tmp)
+  }
+
+   Recoding this to use macro names "i" and "n" instead of the backslash
+   variables \%i and \%n, we have:
+
+  .n ::= \fdim(&a)
+  for i 1 n/2 1 {
+      .tmp := \&a[n-i+1]
+      .\&a[n-i+1] := \&a[i]
+      .\&a[i] := \m(tmp)
+  }
+
+   which reduces the backslash count to less than half. The final
+   statement in the loop could be written ".\&a[i] ::= tmp" if the array
+   contained only numbers (since ::= indicates arithmetic expression
+   evaluation).
+
+   Also, now you can use floating-point numbers in integer contexts (such
+   as array subscripts), in which case they are truncated to an integer
+   value (i.e. the fractional part is discarded).
+
+   Examples of numeric contexts include:
+
+     * Array subscripts.
+     * Any numeric function argument.
+     * Right-hand side of ::= assignments.
+     * EVALUATE command or \fevaluate() function expression.
+     * The INCREMENT or DECREMENT by-value.
+     * IF =, >, <, !=, >=, and <= comparands.
+     * The IF number construct.
+     * FOR-loop variables.
+     * STOP, END, and EXIT status codes.
+     * The INPUT timeout value.
+     * PAUSE, WAIT, SLEEP, MSLEEP intervals.
+     * The SHIFT argument.
+     * Numeric switch arguments, e.g. TYPE /WIDTH:number, SEND
+       /LARGER:number.
+     * SCREEN MOVE-TO row and column number.
+     * Various SET DIAL parameters (timeout, retry limit, etc).
+     * Various SET SEND or RECEIVE parameters (packet length, window
+       size, etc).
+     * Various other SET parameters.
+
+   and:
+
+     * S-Expressions (explained in [399]Section 9).
+
+   Macro names used in numeric contexts must not include mathematical
+   operators. Although it is legal to create a macro called "foo+bar", in
+   a numeric context this would be taken as the sum of the values of
+   "foo" and "bar". Any such conflict can be avoided, of course, by
+   enclosing the macro name in \m(...).
+
+   [ [400]Top ] [ [401]Contents ] [ [402]C-Kermit Home ] [ [403]Kermit
+   Home ]
+     _________________________________________________________________
+
+  8.3. New IF Conditions
+
+   Several new IF conditions are available:
+
+   IF DECLARED arrayname
+          Explained in [404]Section 8.6.
+
+   IF KBHIT
+          Allows a script to test whether a key was pressed without
+          actually trying to read it.
+
+   IF KERBANG (Unix only)
+          True if Kermit was started from a Kerbang script. This is
+          useful for knowing how to interpret the \&@[] and \&_[]
+          argument vector arrays, and under what conditions to exit.
+
+   IF INTEGER n
+          This is just a synonym for IF NUMERIC, which is true if n
+          contains only digits (or, if n is a variable, its value
+          contains only digits).
+
+   By contrast, IF FLOAT n succeeds if n is a floating-point number OR an
+   integer (or a variable with floating-point or integer value).
+   Therefore, IF FLOAT should be used whenever any kind of number is
+   acceptable, whereas IF INTEGER (or IF NUMERIC) when only an integer
+   can be used.
+
+   [ [405]Top ] [ [406]Contents ] [ [407]C-Kermit Home ] [ [408]Kermit
+   Home ]
+     _________________________________________________________________
+
+  8.4. The ON_UNKNOWN_COMMAND Macro
+
+   The new ON_UNKNOWN_COMMAND macro, if defined, is executed whenever you
+   give a command that is not known to C-Kermit; any operands are passed
+   as arguments. Here are some sample definitions:
+
+  DEF ON_UNKNOWN_COMMAND telnet \%1 ; Treat unknown commands as hostnames
+  DEF ON_UNKNOWN_COMMAND dial \%1   ; Treat unknown commands phone numbers
+  DEF ON_UNKNOWN_COMMAND take \%1   ; Treat unknown commands as filenames
+  DEF ON_UNKNOWN_COMMAND !\%*       ; Treat unknown commands as shell commands
+
+   The ON_CD macro, if defined, is executed whenever Kermit is given a CD
+   (change directory) command (8.0.211). Upon entry to this macro, the
+   directory has already changed and the new directory string is
+   available in the \v(directory) variable, and also as the first
+   argument (\%1).
+
+   [ [409]Top ] [ [410]Contents ] [ [411]C-Kermit Home ] [ [412]Kermit
+   Home ]
+     _________________________________________________________________
+
+  8.5. The SHOW MACRO Command
+
+   The SHOW MACRO command has been changed to accept more than one macro
+   name:
+
+  (setq a 1 b 2 c 3)
+  show mac a b c
+  a = 1
+  b = 2
+  c = 3
+
+   An exact match is required for each name (except that case doesn't
+   matter). If you include wildcard characters, however, a pattern match
+   is performed:
+
+  show mac [a-c]*x
+
+   shows all macros whose names start with a, b, or c, and end with x.
+
+   [ [413]Top ] [ [414]Contents ] [ [415]C-Kermit Home ] [ [416]Kermit
+   Home ]
+     _________________________________________________________________
+
+  8.6. Arrays
+
+   A clarification regarding references to array names (as opposed to
+   array elements): You can use array-name "abbreviations" like &a only
+   in contexts that expect array names, like ARRAY commands or array-name
+   function arguments such as the second argument of \fsplit(). In a
+   LOCAL statement, however, you have to write \&a[], since "local &a"
+   might refer to a macro named "&a".
+
+   In function arguments, however, you MUST use the abbreviated form:
+   \fsplit(\%a,&a) or \fsplit(\%a,&a[]). If you include the backslash (as
+   in "\fsplit(\%a,\&a[])") a parse error occurs.
+
+   Here are the new array-related commands:
+
+   IF DECLARED arrayname
+          Allows a script to test whether an array has been declared. The
+          arrayname can be a non-array backslash variable such as \%1 or
+          \m(name), in which case it is evaluated first, and the result
+          is treated as the array name. Otherwise, arrayname is treated
+          as in the ARRAY commands: it can be a, &a, &a[], \&a, \&a[],
+          \&a[3], \&a[3:9], etc, with the appropriate results in each
+          case. Synonym: IF DCL.
+
+   UNDECLARE arrayname
+          UNDECLARE is a new top-level command to undeclare an array.
+          Previously this could only be done with "declare \&a[0]" (i.e.
+          re-declare the array with a dimension of 0).
+
+   ARRAY LINK linkname arrayname
+          Creates a symbolic link from the array named by linkname (which
+          must be the name of an array that is not yet declared in the
+          current context) to the array named by arrayname (which must
+          the name of a currently declared array that is not itself a
+          link, or a variable containing the name of such an array). The
+          two names indicate the same array: if you change an array
+          element, the change is reflected in the link too, and vice
+          versa. If you undeclare the link, the real array is unaffected.
+          If you undeclare the real array, all links to it disappear. If
+          you resize an array (directly or through a link), all links to
+          it are updated automatically.
+
+   Array links let you pass array names as arguments to macros. For
+   example, suppose you had a program that needed to uppercase all the
+   elements of different arrays at different times. You could write a
+   macro to do this, with the array name as an argument. But without
+   array links, there would be no way to refer to the argument array
+   within the macro. Array links make it easy:
+
+  define arrayupper {
+      local \&e[] \%i
+      array link \&e[] \%1
+      for i 1 \fdim(&e) 1 { .\&e[i] := \fupper(\&e[i]) }
+  }
+  declare \&a[] = these are some words
+  arrayupper &a
+  show array &a
+
+   The macro declares the array link LOCAL, which means it doesn't
+   conflict with any array of the same name that might exist outside the
+   macro, and that the link is destroyed automatically when the macro
+   exits. This works, by the way, even if the link name and the macro
+   argument name are the same, as long as the link is declared LOCAL.
+
+   As noted, you can't make a link to a nonexistent array. So when
+   writing a macro whose job is to create an array whose name is passed
+   as an argument, you must declare the array first (the size doesn't
+   matter as long as it's greater than 0). Example:
+
+  define tryme {                ; Demonstration macro
+      local \&e[]               ; We only need this inside the macro
+      array link \&e[] \%1      ; Make local link
+      shift                     ; Shift argument list
+      void \fsplit(\%*,&e)      ; Split remainder of arg list into array
+  }
+  declare \&a[1]                ; Declare target array in advance
+  tryme &a here are some words  ; Invoke the macro with array name and words
+  show array a                  ; See the results
+
+   One final improvement allows the macro itself to declare the array
+   (this was not possible in earlier Kermit releases): if the array name
+   in the DECLARE command is a variable (and not an array name), or
+   includes variables, the resulting value is used as the array name. So:
+
+  define tryme {                ; Demonstration macro
+      declare \%1[1]            ; Preliminary declaration for target array
+      local \&e[]               ; We only need this inside the macro
+      array link \&e[] \%1      ; Make local link
+      shift                     ; Shift argument list
+      void \fsplit(\%*,&e)      ; Split remainder of arg list into array
+  }
+  tryme &a here are some words  ; Invoke the macro with array name and words
+  show array a                  ; See the results
+
+   The SHOW ARRAY command now indicates whether an array name is a link.
+
+   Also see the descriptions of [417]\fjoin() and [418]\fsplit(), plus
+   [419]Section 8.10 on the MINPUT command, which shows how an entire
+   array (or segment of it) can be used as the MINPUT target list.
+
+   [ [420]Top ] [ [421]Contents ] [ [422]C-Kermit Home ] [ [423]Kermit
+   Home ]
+     _________________________________________________________________
+
+  8.7. New or Improved Built-in Variables and Functions
+
+   The following new built-in variables are available:
+
+  \v(buildid)       A date string like "20000808" indicating when C-Kermit was
+built.
+  \v(ftime)         Current time, secs since midnight, including fraction of se
+cond.
+  \v(iprompt)       The current SET PROMPT value
+  \v(sexp)          The most recent S-Expression (see [424]Section 9)
+  \v(sdepth)        The current S-Expression invocation depth ([425]Section 9)
+  \v(svalue)        The value of the most recent S-Expression ([426]Section 9)
+
+  \v(ftp_code)      Most recent FTP response code ([427]Section 3)
+  \v(ftp_connected) FTP connection status ([428]Section 3)
+  \v(ftp_cpl)       FTP Command Protection Level ([429]Section 3.2)
+  \v(ftp_dpl)       FTP Data Protection Level ([430]Section 3.2)
+  \v(ftp_getputremote) The current SET GET-PUT-REMOTE setting ([431]Section 3.8
+)
+  \v(ftp_host)      Name or IP address of FTP server ([432]Section 3)
+  \v(ftp_loggedin)  FTP login status ([433]Section 3)
+  \v(ftp_message)   Most recent FTP response message ([434]Section 3)
+  \v(ftp_security)  FTP Security method ([435]Section 3.2)
+  \v(ftp_server)    OS type of FTP server ([436]Section 3)
+
+  \v(http_code)       Most recent HTTP response code
+  \v(http_connected)  HTTP connection status
+  \v(http_host)       Name or IP address of HTTP server
+  \v(http_message)    Most recent HTTP response message
+  \v(http_security)   TLS cipher used to secure the HTTP session
+
+  \v(hour)            Hour of the day, 0 to 23.
+  \v(timestamp)       Equivalent to "\v(ndate) \v(time)".
+
+  \v(log_debug)       Current debug log file, if any.
+  \v(log_packet)      Current packet log file, if any.
+  \v(log_session)     Current session log file, if any.
+  \v(log_transaction) Current transaction log file, if any.
+  \v(log_connection)  Current connection log file, if any.
+
+   The following new or improved built-in functions are available:
+
+  \fcmdstack()            Allows programmatic access to the command stack.
+  \fcvtdate()             [437]Section 8.13, format options added
+  \fdelta2secs()          [438]Section 8.13
+  \fdostounixpath(s1)     Converts a DOS filename to Unix format.
+  \fsplit()               Now allows grouping/nesting in source string.
+  \fword()                Allows the same grouping and nesting.
+  \fjoin(&a,s1,n1,n2)     Copies an array into a single string.
+  \fsubstitute(s1,s2,s3)  Substitutes characters within a string.
+  \freplace()             Has new 4th "occurrence" argument.
+  \fsexpression()         Evaluates an S-Expression (explained in [439]Section
+9).
+  \ftrim(), \fltrim()     Now trim CR and LF by default, as well as SP and Tab.
+  \funixtodospath(s1)     Converts a Unix filename to DOS format.
+  \fkeywordval(s1,c1)     Assigns values to keywords (macros) (explained below)
+.
+
+   Most functions that have "2" in their names to stand for the word "to"
+   can now also be written with "to", e.g. "\fdelta2secs(),"
+   \fdeltatosecs()."
+
+   \funtabify(string)
+          (New to 8.0.211) Replaces Horizontal Tab characters in the
+          given string with spaces based on VT100-like tab stops.
+
+   \fverify(s1,s2,n)
+          As of version 8.0.211, returns -1 if s2 is an empty string.
+          Previously it returned 0, making \fverify(abc,\%a) look as if
+          \%a was a string combosed of a's, b's, and/or c's when in fact
+          it contained nothing.
+
+   \fcode(string)
+          As of version 8.0.211, returns 0 if string is empty or missing.
+          Previously it returned the empty string, which made it unsafe
+          to use in arithmetic or boolean expressions.
+
+   \v(inscale)
+          New to version 8.0.211, its value is the INPUT SCALE-FACTOR
+          ([440]Section 8.10), default 1.0.
+
+  8.7.1. The \fkeywordval() Function
+
+   \fkeywordval(s1,c1) is new to C-Kermit 8.0. Given a string s1 of the
+   form "name=value", it creates a macro with the given name and assigns
+   it the given value. If no value appears after the equal sign, any
+   existing macro of the given name is undefined. Blanks are
+   automatically trimmed from around the name and value. The optional c1
+   parameter is the assignment operator character, equal sign (=) by
+   default. This function is handy for processing keyword parameters or
+   any other form of parameter-value pair. Suppose, for example, you want
+   to write a macro that accepts keyword parameters rather than
+   positional ones:
+
+  define MYDIAL {
+      local \%i modem hangup method device speed number
+      def number 5551234          ; Assign default parameter values
+      def speed 57600
+      def modem usrobotics
+      def hangup rs232
+      def method tone
+      def country 1
+      for \%i 1 \v(argc)-1 1 {    ; Parse any keyword parameters...
+          if not \fkeywordval(\&_[\%i]) end 1 Bad parameter: "\&_[\%i]"
+      }
+      set dial country \m(country)
+      set modem type \m(modem)
+      set modem hang \m(hangup)
+      set dial method \m(tone)
+      set line \m(device)
+      if fail stop 1
+      set speed \m(speed)
+      if fail stop 1
+      show comm
+      set dial display on
+      dial \m(number)
+      if success connect
+  }
+
+   In this example, all the defaults are set up inside the macro, and
+   therefore it can be invoked with no parameters at all. But if you want
+   to have the macro dial a different number, you can supply it as
+   follows:
+
+  mydial number=7654321
+
+   You can supply any number of keyword parameters, and you can give them
+   in any order:
+
+  mydial number=7654321 hangup=modem speed=115200
+
+  8.7.2. The \fsplit(), \fjoin(), and \fword() Functions
+
+   \fjoin(&a,s1,n1,n2) is also new; it creates a string from an array (or
+   a piece of one). &a is the name of the array (a range specifier can be
+   included); s1 is a character or string to separate each element in the
+   result string (can be omitted, in which case the elements are not
+   separated at all), and n1 is a grouping mask, explained below. If s1
+   is empty or not specified, the array elements are separated with
+   spaces. If you want the elements concatenated with no separator,
+   include a nonzero n2 argument. Given the array:
+
+  declare \&a[] = 0 1 2 3 4 5 6 7 8 9
+
+   you can get effects like this:
+
+  \fjoin(&a)      0 1 2 3 4 5 6 7 8 9
+  \fjoin(&a,:)    0:1:2:3:4:5:6:7:8:9
+  \fjoin(&a,{,})  0,1,2,3,4,5,6,7,8,9
+  \fjoin(&a,...)  0...1...2...3...4...5...6...7...8...9
+  \fjoin(&a,,,1)  0123456789
+
+   \fsplit(), \fword(), \fstripb(), and \fjoin() accept a "grouping mask"
+   argument, n1, which is a number from 0 to 63, in which:
+
+   1 = "" doublequotes
+   2 = {} braces
+   4 = '' singlequotes
+   8 = () parentheses
+  16 = [] square brackets
+  32 = <> angle brackets
+
+   These can be OR'd (added) together to make any number 0-63 (-1 is
+   treated the same as 63, 0 means no grouping). If a bit is on, the
+   corresponding kind of grouping is selected. (If more than 1 bit is set
+   for \fjoin(), only the lowest-order one is used.)
+
+   If you include the same character in the grouping mask and the include
+   list, the grouping mask takes precedence. Example:
+
+  def \%a  a "b c d" e
+  \fsplit(\%a,&a[],,,-1)  = 3  <-- doublequote used for grouping
+  \fsplit(\%a,&a[],,",-1) = 3  <-- doublequote still used for grouping
+
+   Nesting of matched left and right grouping characters (parentheses,
+   braces, and brackets, but not quotes) is recognized. Example:
+
+  def \%a a (b c <d e [f g {h i} j k] l m> n o) p
+  \fsplit(\%a,&a,,,0)  = 16 (no grouping)
+  \fsplit(\%a,&a,,,2)  = 15 (braces only)
+  \fsplit(\%a,&a,,,16) = 11 (square brackets only)
+  \fsplit(\%a,&a,,,32) =  7 (angle brackets only)
+  \fsplit(\%a,&a,,,63) =  3 (all)
+  \fsplit(\%a,&a,,,-1) =  3 (all)
+
+   \fsplit() and \fjoin() are "reciprocal" functions. You can split a
+   string up into an array and join it back into a new string that is
+   equivalent, as long as \fsplit() and \fjoin() are given equivalent
+   grouping masks, except that the type of braces might change. Example:
+
+  def \%a a {b c [d e] f g} "h i" j <k l> m
+  echo STRING=[\%a]
+  echo WORDS=\fsplit(\%a,&a,,,-1)
+  show array a
+  asg \%b \fjoin(&a,{ },2)
+  echo JOIN  =[\%b]
+  echo WORDS=\fsplit(\%b,&b,,,-1)
+  show array b
+
+   The arrays a and b are identical. The strings a and b are as follows:
+
+  \%a: a {b c [d e] f g} "h i" j <k l> m
+  \%b: a {b c [d e] f g} {h i} j {k l} m
+
+   It is possible to quote separator grouping characters with backslash
+   to override their grouping function. And of course to include
+   backslash itself in the string, it must be quoted too. Furthermore,
+   each backslash must be doubled, so the command parser will still pass
+   one backslash to \fsplit() for each two that it sees. Here are some
+   examples using \fsplit() with a grouping mask of 8 (treat parentheses
+   as grouping characters).
+
+  String                  Result
+    a b c d e f             6
+    a b\\ c d e f           5
+    a b (c d e) f           4
+    a b \\(c d e\\) f       6
+    a b \\\\(c d e\\\\) f   7
+
+   \fsplit() has also been changed to create its array (if one is given)
+   each time it is called, so now it can be conveniently called in a loop
+   without having to redeclare the array each time.
+
+   Incidentally... Sometimes you might want to invoke \fsplit() in a
+   situation where you don't care about its return value, e.g. when you
+   just want to fill the array. Now you can "call" \fsplit() or any other
+   function with the new [441]VOID command:
+
+  void \fsplit(\%a,&a)
+
+   \fsplit() and \fjoin() also accept a new, optional 6th argument, an
+   options flag, a number that can specify a number of options. So far
+   there is just one option, whose value is 1:
+
+   separator-flag
+          Normally separators are collapsed. So, for example,
+
+  \fword(Three        little          words,2)
+
+          returns "little" (the second word). Space is a separator, but
+          there are multiple spaces between each word. If the value 1 is
+          included in the option flag, however, each separator counts. If
+          two separators are adjacent, an empty word is produced between
+          them. This is useful for parsing (e.g.) comma-separated lists
+          exported from databases or spreadsheets.
+
+  8.7.3. The \fcmdstack() Function
+
+   The new \fcmdstack() function gives access to the command stack:
+
+   \fcmdstack(n1,n2)
+          Arguments: n1 is the command stack level. If omitted, the
+          current level, \v(cmdlevel), is used. n2 is a function code
+          specifying the desired type of information:
+
+  0 (default) = name of object at level n1.
+  1 (nonzero) = object type (0 = prompt; 1 = command file; 2 = macro).
+
+          The default for n2 is 0.
+
+   The name associated with prompt is "(prompt)". Here's a loop that can
+   be included in a macro or command file to show the stack (similar to
+   what the SHOW STACK command does):
+
+  for \%i \v(cmdlevel) 0 -1 {
+      echo \%i. [\fcmdstack(\%i,1)] \fcmdstack(\%i,0)
+  }
+
+   In this connection, note that \v(cmdfile) always indicates the most
+   recently invoked active command file (if any), even if that file is
+   executing a macro. Similarly, \v(macro) indicates the most recently
+   invoked macro (if any), even if the current command source is not a
+   macro. The name of the "caller" of the currently executing object
+   (command file or macro) is:
+
+  \fcmdstack(\v(cmdlevel)-1)
+
+   and its type is:
+
+  \fcmdstack(\v(cmdlevel)-1,1)
+
+   To find the name of the macro that invoked the currently executing
+   object, even if one or more intermediate command files (or prompting
+   levels) are involved, use a loop like this:
+
+  for \%i \v(cmdlevel)-1 0 -1 {
+      if = \fcmdstack(\%i,1) 2 echo CALLER = \fcmdstack(\%i,0)
+  }
+
+   Of course if you make a macro to do this, the macro must account for
+   its own additional level:
+
+  define CALLER {
+      for \%i \v(cmdlevel)-2 0 -1 {
+          if = \fcmdstack(\%i,1) 2 return \fcmdstack(\%i,0)
+      }
+      return "(none)"
+  }
+
+   The built-in variable \v(cmdsource) gives the current command source
+   as a word ("prompt", "file", or "macro").
+
+  8.7.4. The VOID Command
+
+   VOID is like ECHO in that all functions and variables in its argument
+   text are evaluated. but it doesn't print anything (except possibly an
+   error message if a function was invocation contained or resulted in
+   any errors). VOID sets FAILURE if it encounters any errors, SUCCESS
+   otherwise.
+
+   [ [442]Top ] [ [443]Contents ] [ [444]C-Kermit Home ] [ [445]Kermit
+   Home ]
+     _________________________________________________________________
+
+  8.8. The RETURN and END Commands
+
+   The execution of a macro is terminated in any of the following ways:
+
+     * With an END [ number [ message ] ] command. If a number is given,
+       the macro succeeds if the number is 0, and fails if it is not
+       zero; if a number is not given, the macro succeeds.
+     * With a STOP command, which works just like END except it peels
+       back the command stack all the way to top level.
+     * With a RETURN [ text ] command, in which case the macro always
+       succeeds.
+     * By running out of commands to execute, in which case the macro
+       succeeds or fails according the most recently executed command
+       that sets success or failure.
+
+   The same considerations apply to command files invoked by the TAKE
+   command.
+
+   If a macro does not execute any commands that set success or failure,
+   then invoking the macro does not change the current SUCCESS/FAILURE
+   status. It follows, then, that the mere invocation of a macro does not
+   change the SUCCESS/FAILURE status either. This makes it possible to
+   write macros to react to the status of other commands (or macros), for
+   example:
+
+  define CHKLINE {
+      if success end 0
+      stop 1 SET LINE failed - please try another device.
+  }
+  set modem type usrobotics
+  set line /dev/cua0
+  chkline
+  set speed 57600
+  dial 7654321
+
+   By the way, none of this is news. But it was not explicitly documented
+   before, and C-Kermit 7.0 and earlier did not always handle the RETURN
+   statement as it should have.
+
+   [ [446]Top ] [ [447]Contents ] [ [448]C-Kermit Home ] [ [449]Kermit
+   Home ]
+     _________________________________________________________________
+
+  8.9. UNDEFINing Groups of Variables
+
+   The UNDEFINE command, which previously accepted one variable name, now
+   accepts a list of them, and also accepts wildcard notation to allow
+   deletion of variables that match a given pattern.
+
+   UNDEFINE [ switches ] name [ name [ name [ ... ] ] ]
+          Undefines the variables whose names are given. Up to 64 names
+          may be given in one UNDEFINE command.
+
+   If you omit the switches and include only one name, the UNDEFINE
+   command works as before.
+
+   Switches include:
+
+   /MATCHING
+          Specifies that the names given are to treated as patterns
+          rather than literal variable names. Note: pattern matching
+          can't be used with array references; use the ARRAY command to
+          manipulate arrays and subarrays.
+
+   /LIST
+          List the name of each variable to be undefined, and whether it
+          was undefined successfully ("ok" or "error"), plus a summary
+          count at the end.
+
+   /SIMULATE
+          List the names of the variables that would be deleted without
+          actually deleting them. Implies /LIST.
+
+   The UNDEFINE command fails if there were any errors and succeeds
+   otherwise.
+
+   The new _UNDEFINE command is like UNDEFINE, except the names are
+   assumed to be variable names themselves, which contain the names (or
+   parts of them) of the variables to be undefined. For example, if you
+   have the following definitions:
+
+  define \%a foo
+  define foo This is some text
+
+   then:
+
+  undef \%a
+
+   undefines the variable \%a, but:
+
+  _undef \%a
+
+   undefines the macro foo.
+
+   Normal Kermit patterns are used for matching; metacharacters include
+   asterisk, question mark, braces, and square brackets. Thus, when using
+   the /MATCHING switch, if the names of the macros you want to undefine
+   contain any of these characters, you must quote them with backslash to
+   force them to be taken literally. Also note that \%* is not the name
+   of a variable; it is a special notation used within a macro for "all
+   my arguments". The command "undef /match \%*" deletes all \%x
+   variables, where x is 0..9 and a..z. Use "undef /match \%[0-9]" to
+   delete macro argument variables or "undef /match \%[i-n]" to delete a
+   range of \%x variables.
+
+   [ [450]Top ] [ [451]Contents ] [ [452]C-Kermit Home ] [ [453]Kermit
+   Home ]
+     _________________________________________________________________
+
+  8.10. The INPUT and MINPUT Commands
+
+   As of C-Kermit 8.0.211, the INPUT and MINPUT commands accept a switch:
+
+   [M]INPUT /NOMATCH timeout
+          The /NOMATCH switch allows INPUT or MINPUT to read incoming
+          material for the specified amount of time, without attempting
+          to match it with any text or patterns. When this switch is
+          included, the [M]INPUT command succeeds when the timeout
+          interval expires, with \v(instatus) set to 1, meaning "timed
+          out", or fails upon interruption or i/o error.
+
+   Also in version 8.0.211, there is a new way to apply a scale factor to
+   [M]INPUT timeouts:
+
+   SET INPUT SCALE-FACTOR floating-point-number
+          This scales all [M]INPUT timeouts by the given factor, allowing
+          time-sensitive scripts to be adjusted to changing conditions
+          such as congested networks or different-speed modems without
+          having to change each INPUT-class command. This affects only
+          those timeouts that are given in seconds, not as wall-clock
+          times. Although the scale factor can have a fractional part,
+          the INPUT timeout is still an integer. The new built-in
+          variable \v(inscale) tells the current INPUT SCALE-FACTOR.
+
+   The MINPUT command can be used to search the incoming data stream for
+   several targets simultaneously. For example:
+
+  MINPUT 8 one two three
+
+   waits up to 8 seconds for one of the words "one", "two", or "three" to
+   arrive. Words can be grouped to indicate targets that contain spaces:
+
+  MINPUT 8 nineteeen twenty "twenty one"
+
+   And of course you can also use variables in place of (or as part of)
+   the target names:
+
+  MINPUT 8 \%a \&x[3] \m(foo)
+
+   Until now you had to know the number of targets in advance when
+   writing the MINPUT statement. Each of the examples above has exactly
+   three targets.
+
+   But suppose your script needs to look for a variable number of
+   targets. For this you can use arrays and \fjoin(), described in
+   [454]Section 8.7. Any number of \fjoin() invocations can be included
+   in the MINPUT target list, and each one is expanded into the
+   appropriate number of separate targets each time the MINPUT command is
+   executed. Example:
+
+  declare \&a[10] = one two three
+  minput 10 foo \fjoin(&a) bar
+
+   This declares an array of ten elements, and assigns values to the
+   first three of them. The MINPUT command looks for these three (as well
+   as the words "foo" and "bar"). Later, if you assign additional
+   elements to the array, the same MINPUT command also looks for the new
+   elements.
+
+   If an array element contains spaces, each word becomes a separate
+   target. To create one target per array element, use \fjoin()'s
+   grouping feature:
+
+  dcl \&a[] = {aaa bbb} {ccc ddd} {xxx yyy zzz}
+
+  minput 10 \fjoin(&a)     <-- 7 targets
+  minput 10 \fjoin(&a,,2)  <-- 3 targets
+
+   [ [455]Top ] [ [456]Contents ] [ [457]C-Kermit Home ] [ [458]Kermit
+   Home ]
+     _________________________________________________________________
+
+  8.11. Learned Scripts
+
+   C-Kermit now includes a simple script recorder that monitors your
+   commands, plus your actions during CONNECT mode, and automatically
+   generates a script program that mimics what it observed. You should
+   think of this feature as a script-writing ASSISTANT since, as you will
+   see [459]later in this section, the result generally needs some
+   editing to make it both secure and flexible. The script recorder is
+   controlled by the new LEARN command:
+
+   LEARN [ /ON /OFF /CLOSE ] [ filename ]
+          If you give a filename, the file is opened for subsequent
+          recording. The /ON switch enables recording to the current file
+          (if any); /OFF disables recording. /CLOSE closes the current
+          script recording file (if any). If you give a filename without
+          any switches, /ON is assumed.
+
+   The /OFF and /ON switches let you turn recording off and on during a
+   session without closing the file.
+
+   When recording:
+
+     * All commands that you type (or recall) at the prompt are recorded
+       in the file except:
+          + LEARN commands are not recorded.
+          + The CONNECT command is not recorded.
+          + The TELNET command is converted to SET HOST /NETWORK:TCP.
+     * Commands obtained from macros or command files are not recorded.
+     * During CONNECT:
+          + Every line you type is converted to an OUTPUT command.
+          + The last prompt before any line you type becomes an INPUT
+            command.
+          + Timeouts are calculated automatically for each INPUT command.
+          + A PAUSE command is inserted before each OUTPUT command just
+            to be safe.
+
+   Thus the script recorder is inherently line-oriented. It can't be used
+   to script character-oriented interactions like typing Space to a
+   "More?" prompt or editing a text file with VI or EMACS.
+
+   But it has advantages too; for example it takes control characters
+   into account that might not be visible to you otherwise, and it
+   automatically converts control characters in both the input and output
+   streams to the appropriate notation. It can tell, for example that the
+   "$ " prompt on the left margin in UNIX is really {\{13}\{10}$ },
+   whereas in VMS it might be {\{13}\{10}\{13}$ }. These sequences are
+   detected and recorded automatically.
+
+   A learned script should execute correctly when you give a TAKE command
+   for it. However, it is usually appropriate to edit the script a bit.
+   The most important change would be to remove any passwords from it.
+   For example, if the script contains:
+
+  INPUT 9 {\{13}\{10}Password: }
+  IF FAIL STOP 1 INPUT timeout
+  PAUSE 1
+  OUTPUT bigsecret\{13}
+
+   you should replace this by something like:
+
+  INPUT 9 {\{13}\{10}Password: }
+  IF FAIL STOP 1 INPUT timeout
+  ASKQ pswd Please type your password:
+  PAUSE 1
+  OUTPUT \m(pswd)\{13}
+
+   The LEARN command can't do this for you since it knows nothing about
+   "content"; it only knows about lines and can't be expected to parse or
+   understand them -- after all, the Password prompt might be in some
+   other language. So remember: if you use the LEARN command to record a
+   login script, be sure edit the resulting file to remove any passwords.
+   Also be sure to delete any backup copies your editor or OS might have
+   made of the file.
+
+   Other manual adjustments might also be appropriate:
+
+     * If the target of an INPUT command can vary, you can replace the
+       INPUT command with MINPUT and the appropriate target list, and/or
+       the target with a \fpattern(). For example, suppose you are
+       dialing a number that can be answered by any one of 100 terminal
+       servers, whose prompts are ts-00>, ts-01>, ts-02>, ... ts-99>. The
+       script records a particular one of these, but you want it to work
+       for all of them, so change (e.g.):
+  INPUT 10 ts-23>  ; or whatever
+       to:
+  INPUT 10 \fpattern(ts-[0-9][0-9]>)
+     * The INPUT timeout values are conservative, but they are based only
+       on a single observation; you might need to tune them.
+     * The PAUSE commands might not be necessary, or the PAUSE interval
+       might need adjustment.
+     * In case you made typographical errors during recording, they are
+       incorporated in your script; you can edit them out if you want to.
+
+   Here is a sample script generated by Kermit ("learn vms.ksc") in which
+   a Telnet connection is made to a VMS computer, the user logs in,
+   starts Kermit on VMS, sends it a file, and then logs out:
+
+  ; Scriptfile: vms.ksc
+  ; Directory:  /usr/olga
+  ; Recorded:   20001124 15:21:23
+
+  SET HOST /NETWORK:TCP vms.xyzcorp.com
+  IF FAIL STOP 1 Connection failed
+
+  INPUT 7 {\{13}\{10}\{13}Username: }
+  IF FAIL STOP 1 INPUT timeout
+  PAUSE 1
+  OUTPUT olga\{13}
+  INPUT 3 {\{13}\{10}\{13}Password: }
+  IF FAIL STOP 1 INPUT timeout
+  PAUSE 1
+  OUTPUT secret\{13}
+  INPUT 18 {\{13}\{10}\{13}$ }
+  IF FAIL STOP 1 INPUT timeout
+  PAUSE 1
+  OUTPUT set default [.incoming]\{13}
+  INPUT 12 {\{13}\{10}\{13}$ }
+  IF FAIL STOP 1 INPUT timeout
+  PAUSE 1
+  OUTPUT kermit\{13}
+  INPUT 15 {\{13}\{10}\{13}ALTO:[OLGA.INCOMING] C-Kermit>}
+  IF FAIL STOP 1 INPUT timeout
+  PAUSE 1
+  OUTPUT receive\{13}
+  send myfile.txt
+
+  INPUT 18 {\{13}\{10}\{13}ALTO:[OLGA.INCOMING] C-Kermit>}
+  IF FAIL STOP 1 INPUT timeout
+  PAUSE 1
+  OUTPUT exit\{13}
+  INPUT 6 {\{13}\{10}\{13}$ }
+  IF FAIL STOP 1 INPUT timeout
+  PAUSE 1
+  OUTPUT logout\{13}
+  close
+  exit
+
+   The commands generated by Kermit during CONNECT (INPUT, IF FAIL,
+   PAUSE, and OUTPUT) have uppercase keywords; the commands typed by the
+   user are in whatever form the user typed them (in this case,
+   lowercase).
+
+   [ [460]Top ] [ [461]Contents ] [ [462]C-Kermit Home ] [ [463]Kermit
+   Home ]
+     _________________________________________________________________
+
+  8.12. Pattern Matching
+
+   A pattern is a character string that is used to match other strings.
+   Patterns can contain metacharacters that represent special actions
+   like "match any single character", "match zero or more characters",
+   "match any single character from a list", and so on. The best known
+   application of patterns is in file specifications that contain
+   wildcards, as in "send *.txt", meaning "send all files whose names end
+   with .txt".
+
+   Patterns are also used in increasingly many other ways, to the extent
+   it is useful to point out certain important distinctions in the ways
+   in which they are used:
+
+   Anchored Patterns
+          If an anchored pattern does not begin with "*", it must match
+          the beginning of the string, and if it does not end with "*",
+          it must match the end of the string. For example, the anchored
+          pattern "abc" matches only the string "abc", not "abcde" or
+          "xyzabc" or "abcabc". The anchored pattern "abc*" matches any
+          string that starts with "abc"; the anchored pattern "*abc"
+          matches any string that ends with "abc"; the anchored pattern
+          "*abc*" matches any string that contains "abc" (including any
+          that start and/or end with it).
+
+   Floating Patterns
+          A floating pattern matches any string that contains a substring
+          that matches the pattern. In other words, a floating pattern
+          has an implied "*" at the beginning and end. You can anchor a
+          floating pattern to the beginning by starting it with "^", and
+          you can anchor it to the end by ending it with "$" (see
+          examples below).
+
+   Wildcards
+          A wildcard is an anchored pattern that has the additional
+          property that "*" does not match directory separators.
+
+   This terminology lets us describe Kermit's commands with a bit more
+   precision. When a pattern is used for matching filenames, it is a
+   wildcard, except in the TEXT-PATTERNS and BINARY-PATTERNS lists and
+   /EXCEPT: clauses, in which case directory separators are not
+   significant (for example, a BINARY-PATTERN of "*.exe" matches any file
+   whose name ends in .exe, no matter how deeply it might be buried in
+   subdirectories). When Kermit parses a file specification directly,
+   however, it uses the strict wildcard definition. For example, "send
+   a*b" sends all files whose names start with "a" and end with "b" in
+   the current directory, and not any files whose names end with "b" that
+   happen to be in subdirectories whose names start with "a". And as
+   noted, wildcards are anchored, so "delete foo" deletes the file named
+   "foo", and not all files whose names happen to contain "foo".
+
+   Most other patterns are anchored. For example:
+
+  if match abc bc ...
+
+   does not succeed (and you would be surprised if it did!). In fact, the
+   only floating patterns are the ones used by commands or functions that
+   search for patterns in files, arrays, or strings. These include:
+
+     * The GREP and TYPE /MATCH commands.
+     * The \fsearch(), \frsearch(), and \farraylook() functions.
+
+   Thus these are the only contexts in which explicit anchors ("^" and
+   "$") may be used:
+
+   grep abc *.txt
+          Prints all lines containing "abc" in all files whose names end
+          with ".txt".
+
+   grep ^abc *.txt
+          Prints all lines that start with "abc" in all ".txt" files.
+
+   grep abc$ *.txt
+          Prints all lines that end with "abc" in all ".txt" files.
+
+   grep ^a*z$ *.txt
+          Prints all lines that start with "a" and end with "z" in all
+          ".txt" files.
+
+   Similarly for TYPE /PAGE, /fsearch(), /frsearch(), and \farraylook().
+
+   Here is a brief summary of anchored and floating pattern equivalences:
+
+  Anchored   Floating
+    abc       ^abc$
+    *abc      abc$
+    abc*      ^abc
+    *abc*     abc
+
+   [ [464]Top ] [ [465]Contents ] [ [466]C-Kermit Home ] [ [467]Kermit
+   Home ]
+     _________________________________________________________________
+
+  8.13. Dates and Times
+
+   C-Kermit's comprehension of date-time formats is considerably expanded
+   in version 8.0. Any command that reads dates, including the DATE
+   command itself, or any switch, such as the /BEFORE: and /AFTER:
+   switches, or any function such as \fcvtdate(), now can understand
+   dates and times expressed in any ISO 8601 format, in Unix "asctime"
+   format, in FTP MDTM format, and in practically any format used in RFC
+   822 or RFC 2822 electronic mail, with or without timezones, and in a
+   great many other formats as well. HELP DATE briefly summarizes the
+   acceptable date-time formats.
+
+   Furthermore, C-Kermit 8.0 includes a new and easy-to-use form of
+   date-time arithmetic, in which any date or time can be combined with a
+   "delta time", to add or subtract the desired time interval (years,
+   months, weeks, days, hours, minutes, seconds) to/from the given date.
+   And new functions are available to compare dates and to compute their
+   differences.
+
+   As you can imagine, all this requires quite a bit of "syntax". The
+   basic format is:
+
+  [ date ] [ time ] [ delta ]
+
+   Each field is optional, but in most cases (depending on the context)
+   there must be at least one field. If a date is given, it must come
+   first. If no date is given, the current date is assumed. If no time is
+   given, an appropriate time is supplied depending on whether a date was
+   supplied. If no delta is given, no arithmetic is done. If a delta is
+   given without a date or time, the current date and time are used as
+   the base.
+
+   Date-time-delta fields are likely to contain spaces (although they
+   need not; space-free forms are always available). Therefore, in most
+   contexts -- and notably as switch arguments -- date-time information
+   must be enclosed in braces or doublequotes, for example:
+
+  send /after:"8-Aug-2001 12:00 UTC" *.txt
+
+   Kermit's standard internal format for dates and times is:
+
+  yyyymmdd hh:mm:ss
+
+   for example:
+
+  20010208 10:28:01
+
+   Date-times can always be given in this format. yyyy is the 4-digit
+   year, mm is the two-digit month (1-12; supply leading zero for
+   Jan-Sep), dd is the 2-digit day (leading zero for 1-9), hh is the hour
+   (0-23), mm the minute (0-59), ss the second (0-59), each with leading
+   zero if less than the field width. The date and time can be separated
+   by a space, an underscore, a colon, or the letter T. The time is in
+   24-hour format. Thus the various quantites are at the following fixed
+   positions:
+
+Position  Contents                    
+   1-4    Year   (4 digits, 0000-9999)
+   5-6    Month  (2 digits, 1-12)
+   7-8    Day    (2 digits, 1-31)
+   9      Date-Time Separator (space, :, _, or the letter T)
+  10-11   Hour   (2 digits, 0-23)
+  12      Hour-Minute Separator (colon)
+  13-14   Minute (2 digits, 0-59)
+  15      Minute-Second Separator (colon)
+  16-17   Second (2 digits, 0-59)
+
+   Example:
+
+  19800526 13:07:12  26 May 1980, 13:07:12 (1:07:12PM)
+
+   This is the format produced by the DATE command and by any function
+   that returns a date-time. It is suitable for lexical comparison and
+   sorting, and for use as a date-time in any Kermit command. When this
+   format is given as input to a command or function, various date-time
+   separators (as noted) are accepted:
+
+  19800526 13:07:12  26 May 1980, 13:07:12 (1:07:12PM)
+  20010208_10:28:35  2 February 2001, 10:28:35 AM
+  18580101:12:00:00  1 January 1858, noon
+  20110208T00:00:00  2 February 2011, midnight
+
+   Certain other special date-time formats that are encountered on
+   computer networks are recognized:
+
+   Asctime Format
+          This is a fixed format used by Unix, named after Unix's
+          asctime() ("ASCII time") function. It is always exactly 24
+          characters long. Example: Fri Aug 10 16:38:01 2001
+
+   Asctime with Timezone
+          This is like Asctime format, but includes a 3-character
+          timezone between the time and year. It is exactly 28 characters
+          long. Example: Fri Aug 10 16:38:01 GMT 2001
+
+   E-Mail Format
+          E-mail date-time formats are defined in [468]RFC 2822 with a
+          fair amount of flexibility and options. The following examples
+          are typical of e-mails and HTTP (web-page) headers:
+
+  Sat, 14 Jul 2001 11:49:29                (No timezone)
+  Fri, 24 Mar 2000 14:19:59 EST            (Symbolic timezone)
+  Tue, 26 Jun 2001 10:19:45 -0400 (EDT)    (GMT Offset + comment)
+
+   FTP MDTM Format
+          This is the date-time format supplied by FTP servers that
+          support the (not yet standard but widely used nevertheless)
+          MDTM command, by which the FTP client asks for a file's
+          modification time:
+
+  yyyymmddhhmmss[.ffff]
+
+          where yyyy is the 4-digit year, mm is the 2-digit month, and so
+          on, exactly 14 digits long. An optional fractional part
+          (fraction of second) may also be included, separated by a
+          decimal point (period). Kermit rounds to the nearest second.
+          Example:
+
+  20020208102835.515                       (8 February 2002 10:28:36 AM)
+
+    8.13.1. The Date
+
+   The date, if given, must precede the time and/or delta, and can be in
+   many, many formats. For starters, you can use several symbolic date
+   names in place of actual dates:
+
+   NOW
+          This is replaced by the current date and time. The time can not
+          be overriden (if you want to supply a specific time, use TODAY
+          rather than NOW).
+
+   TODAY
+          This is replaced by the current date and a default time of
+          00:00:00 is supplied, but can be overridden by a specific time;
+          for example, if today is 8 February 2002, then "TODAY" is
+          "20020802 00:00:00" but "TODAY 10:28" is "20020802 10:28:00".
+
+   TOMORROW
+          Like TODAY, but one day later (if today is 8 February 2002,
+          then "TOMORROW" is "20020803 00:00:00" but "TOMORROW 16:30" is
+          "20020803 16:30:00").
+
+   YESTERDAY
+          Like TODAY, but one day earlier.
+
+   MONDAY, TUESDAY, WEDNESDAY, ..., SUNDAY
+          The date on the given day of the week, today or later. A
+          default time of 00:00:00 is supplied but can be overridden.
+          Example: "SATURDAY 12:00" means next Saturday (or today, if
+          today is Saturday) at noon.
+
+   You can give an explicit date in almost any conceivable format, but
+   there are some rules:
+
+     * If a date is given, it must have three fields: day, month, and
+       year; the order can vary (except that the month can not be last).
+     * If names are used for days, months, etc, they must be English.
+     * The year must lie between 0000 and 9999, inclusive.
+     * All calendar calculations use Gregorian dating, so calculated
+       dates for years prior to 1582 (or later, depending on the country)
+       will not agree with historical dates. Other forms of dating (e.g.
+       Hebrew, Chinese) are not supported.
+
+   Various date-field separators are accepted: hyphen, slash, space,
+   underscore, period. The same field separator (if any) must be used in
+   both places; for example 18-Sep-2001 but not 18-Sep/2001. Months can
+   be numeric (1-12) or English names or abbreviations. Month name
+   abbreviations are normally three letters, e.g. Apr, May, Jun, Jul.
+   Capitalization doesn't matter.
+
+   Here are a few examples:
+
+  18 Sep 2001                              (English month, abbreviated)
+  18 September 2001                        (English month, spelled out)
+  2001 Sept 18                             (Year, month, day)
+  18-Sep-2001                              (With hyphens)
+  18/09/2001                               (All numeric with slashes)
+  18.09.2001                               (Ditto, with periods)
+  18_09_2001                               (Ditto, with underscores)
+  09/18/2001                               (See below)
+  2001/09/18                               (See below)
+  September 18, 2001                       (Correspondence style)
+  Sep-18-2001                              (Month-day-year)
+  20010918                                 (Numeric, no separators)
+
+   You can also include the day of the week with a specific date, in
+   which case it is accepted (if it is a valid day name), but not
+   verified to agree with the given date:
+
+  Tue, 18 Sep 2001                         (Abbreviated, with comma)
+  Tue,18 Sep 2001                          (Comma but no space)
+  Tue 18 Sep 2001                          (Abbreviated, no comma)
+  Tuesday 18 Sep 2001                      (Spelled out)
+  Tuesday, 18 Sep 2001                     (etc)
+  Friday, 18 Sep 2001                      (Accepted even if not Friday)
+
+   In all-numeric dates with the year last, such as 18/09/2001, Kermit
+   identifies the year because it's 4 digits, then decides which of the
+   other two numbers is the month or day based on its value. If both are
+   12 or less and are unequal, the date is ambiguous and is rejected. In
+   all-numeric dates with the year first, the second field is always the
+   month and the third is the day. The month never comes last. A date
+   with no separators is accepted only if it is all numeric and has
+   exactly eight digits, and is assumed to be in yyyymmdd format.
+
+  20010918                                 (18-Sep-2001 00:00:00)
+
+   or 14 digits (as in FTP MDTM format):
+
+  20010918123456                           (18-Sep-2001 12:34:56)
+
+   You can always avoid ambiguity by putting the year first, or by using
+   an English, rather than numeric, month. A date such as 09/08/2001
+   would be ambiguous but 2001/09/08 is not, nor is 09-Aug-2001.
+
+   Until the late 1990s, it was common to encounter 2-digit years, and
+   these are found to this day in old e-mails and other documents. Kermit
+   accepts these dates if they have English months, and interprets them
+   according to the windowing rules of [469]RFC 2822: "If a two digit
+   year is encountered whose value is between 00 and 49, the year is
+   interpreted by adding 2000, ending up with a value between 2000 and
+   2049. If a two digit year is encountered with a value between 50 and
+   99, or any three digit year is encountered, the year is interpreted by
+   adding 1900."
+
+   If you need to specify a year prior to 1000, use leading zeros to
+   ensure it is not misinterpreted as a "non-Y2K-compliant" modern year:
+
+  7-Oct-77                                 (19771007 00:00:00)
+  7-Oct-0077                               (00771007 00:00:00)
+
+    8.13.2. The Time
+
+   The basic time format is hh:mm:dd; that is hours, minutes, seconds,
+   separated by colons, perhaps with an optional fractional second
+   separated by a decimal point (period). The hours are in 24-hour
+   format; 12 is noon, 13 is 1pm, and so on. Fields omitted from the
+   right default to zero. Fields can be omitted from the left or middle
+   by including the field's terminating colon. Examples:
+
+  11:59:59                                 (11:59:59 AM)
+  11:59                                    (11:59:00 AM)
+  11                                       (11:00:00 AM)
+  11:59:59.33                              (11:59:59 AM)
+  11:59:59.66                              (Noon)
+  03:21:00                                 (3:21:00 AM)
+  3:21:00                                  (3:21:00 AM)
+  15:21:00                                 (3:21:00 PM)
+  :21:00                                   (00:21:00 AM)
+  ::01                                     (00:00:01 AM)
+  11::59                                   (11:00:59 AM)
+
+   Leading zeros can be omitted, but it is customary and more readable to
+   keep them in the minute and second fields:
+
+  03:02:01                                 (03:02:01 AM)
+  3:02:01                                  (03:02:01 AM)
+  3:2:1                                    (03:02:01 AM)
+
+   AM/PM notation is accepted if you wish to use it:
+
+  11:59:59                                 (11:59:59 AM)
+  11:59:59AM                               (11:59:59 AM)
+  11:59:59A.M.                             (11:59:59 AM)
+  11:59:59am                               (11:59:59 AM)
+  11:59:59a.m.                             (11:59:59 AM)
+  11:59:59PM                               (11:59:59 PM = 23:59:59)
+  11:59:59P.M.                             (11:59:59 PM = 23:59:59)
+  11:59:59pm                               (11:59:59 PM = 23:59:59)
+  11:59:59p.m.                             (11:59:59 PM = 23:59:59)
+
+   You can omit the colons if you wish, in which case Kermit uses the
+   following rules to interpret the time:
+
+    1. 6 digits is hh:mm:ss, e.g. 123456 is 12:34:56.
+    2. 5 digits is h:mm:ss, e.g. 12345 is 1:23:45.
+    3. 4 digits is hh:mm, e.g. 1234 is 12:34.
+    4. 3 digits is h:mm, e.g. 123 is 1:23.
+    5. 2 digits is hh, e.g. 12 is 12:00.
+    6. 1 digit is h (the hour), e.g. 1 is 1:00.
+
+   Examples:
+
+  1                                        (01:00:00 AM)
+  10                                       (10:00:00 AM)
+  230                                      (02:30:00 AM)
+  230pm                                    (02:30:00 PM = 14:30:00)
+  1115                                     (11:15:00 AM)
+  2315                                     (11:15:00 PM = 23:15:00 PM)
+  23150                                    (02:31:50 AM)
+  231500                                   (23:15:00 PM)
+
+    8.13.3. Time Zones
+
+   If a time is given, it can (but need not) be followed by a time zone
+   designator. If no time zone is included, the time is treated as local
+   time and no timezone conversions are performed.
+
+   The preferred time zone designator is the UTC Offset, as specified in
+   [470]RFC 2822: a plus sign or minus sign immediately followed by
+   exactly four decimal digits, signifying the difference in hh (hours)
+   and mm (minutes) from Universal Coordinated Time (UTC, also known as
+   Greenwich Mean Time, or GMT), with negative numbers to the West and
+   positive numbers to the East. For example:
+
+  Fri, 13 Jul 2001 12:54:29 -0700
+
+   indicates a local time of 12:54:29 that is 07 hours and 00 minutes
+   behind (less than, East of) Universal Time. The space is optional, so
+   the example could also be written as:
+
+  Fri, 13 Jul 2001 12:54:29-0700
+
+   The following symbolic time zones are also accepted, as specified by
+   [471]RFC 2822 and/or in ISO 8601:
+
+  GMT  =  +0000       Greenwich Mean Time
+  Z    =  +0000       Zulu (Zero Meridian) Time
+  UTC  =  +0000       Universal Coordinated Time
+  UT   =  +0000       Universal Time
+  EDT  =  -0400       Eastern (USA) Daylight Time
+  EST  =  -0500       Eastern (USA) Standard Time
+  CDT  =  -0500       Central (USA) Daylight Time
+  CST  =  -0600       Central (USA) Standard Time
+  MDT  =  -0600       Mountain (USA) Daylight Time
+  MST  =  -0700       Mountain (USA) Standard Time
+  PDT  =  -0700       Pacific (USA) Daylight Time
+  PST  =  -0800       Pacific (USA) Standard Time
+
+   Note that GMT, Z, UTC, and UT all express the same concept: standard
+   (not daylight) time at the Zero Meridian. UTC, by the way, is an
+   international standard symbol and does not correspond to the order of
+   the English words, Universal Coordinated Time, but it happens to have
+   the same initial letters as these words. Of course hundreds of other
+   symbolic timezones and variations exist, but they are not
+   standardized, and are therefore not supported by Kermit.
+
+   When a time zone is included with a time, the time is converted to
+   local time. In case the conversion crosses a midnight boundary, the
+   date is adjusted accordingly. Examples converting to EST (Eastern USA
+   Standard Time = -0500):
+
+ 11:30:00      =  11:30:00
+ 11:30:00 EST  =  11:30:00
+ 11:30:00 GMT  =  06:30:00
+ 11:30:00 PST  =  14:30:00
+ 11:30:00Z     =  06:30:00
+ 11:30PM GMT   =  18:30:00
+ 11:30 -0500   =  11:30:00
+ 11:30 -0800   =  08:30:00
+ 11:30 +0200   =  04:30:00
+
+   Unlike most of Kermit's other date-time conversions, timezone
+   knowledge (specifically, the offset of local time from UTC) is
+   embodied in the underlying operating system, not in Kermit itself, and
+   any conversion errors in this department are the fault of the OS. For
+   example, most UNIX platforms do not perform conversions for years
+   prior to 1970.
+
+    8.13.4. Delta Time
+
+   Date/time expressions can be composed of a date and/or time and a
+   delta time, or a delta time by itself. When a delta time is given by
+   itself, it is relative to the current local date and time. Delta times
+   have the following general format:
+
+  {+,-}[number units][hh[:mm[:ss]]]
+
+   In other words, a delta time always starts with a plus or minus sign,
+   which is followed by a "part1", a "part2", or both. The "part1", if
+   given, specifies a number of days, weeks, months, or years; "part2"
+   specifies a time in hh:mm:ss notation. In arithmetic terms, these
+   represents some number of days or other big time units, and then a
+   fraction of a day expressed as hours, minutes, and seconds; these are
+   to be added to or subtracted from the given (or implied) date and
+   time. The syntax is somewhat flexible, as shown by the following
+   examples:
+
+  +1 day                (Plus one day)
+  +1day                 (Ditto)
+  +1d                   (Ditto)
+  + 1 day               (Ditto)
+  + 1 day 3:00          (Plus one day and 3 hours)
+  +1d3:00               (Ditto)
+  +1d3                  (Ditto)
+  +3:00:00              (Plus 3 hours)
+  +3:00                 (Ditto)
+  +3                    (Ditto)
+  +2 days               (Plus 2 days)
+  -12 days 7:14:22      (Minus 12 days, 7 hours, 14 minutes, and 22 seconds)
+
+   The words "week", "month", and "year" can be used like "day" in the
+   examples above. A week is exactly equivalent to 7 days. When months
+   are specified, the numeric month number of the date is incremented or
+   decremented by the given number, and the year and day adjusted
+   accordingly if necessary (for example, 31-Jan-2001 +1month =
+   03-Mar-2001 because February does not have 31 days). When years are
+   specified, they are added or subtracted to the base year. Examples
+   (assuming the current date is 10-Aug-2001 and the current time is
+   19:21:11):
+
+  18-Sep-2001 +1day              (20010918 00:00:00)
+  today +1day                    (20010811 00:00:00)
+  now+1d                         (20010811 19:21:11)
+  + 1 day                        (20010811 19:21:11)
+  + 1 day 3:14:42                (20010811 22:35:54)
+  + 7 weeks                      (20010928 19:21:11)
+  +1d3:14:42                     (20010811 22:35:54)
+  +1w3:14:42                     (20010817 22:35:54)
+  +1m3:14:42                     (20010910 22:35:54)
+  +1y3:14:42                     (20020810 22:35:54)
+  2 feb 2001 + 10 years          (20110208 00:00:00)
+  2001-02-08 +10y12              (20110208 12:00:00)
+  31-dec-1999 23:59:59+00:00:01  (20000101 00:00:00)
+  28-feb-1996 +1day              (19960229 00:00:00) (leap year)
+  28-feb-1997 +1day              (19970301 00:00:00) (nonleap year)
+  28-feb-1997 +1month            (19970328 00:00:00)
+  28-feb-1997 +1month 11:59:59   (19970328 11:59:59)
+  28-feb-1997 +20years           (20170228 00:00:00)
+  28-feb-1997 +8000years         (99970228 00:00:00)
+
+   For compatibility with VMS, the following special delta-time format is
+   also accepted:
+
+  +number-hh:mm:ss
+  -number-hh:mm:ss
+
+   (no spaces). The hyphen after the number indicates days. It
+   corresponds exactly to the Kermit notation:
+
+  +numberdhh:mm:ss
+  -numberdhh:mm:ss
+
+   The following forms all indicate exactly the same date and time:
+
+  18-Sep-2001 12:34:56 +1-3:23:01
+  18-Sep-2001 12:34:56 +1d3:23:01
+  18-Sep-2001 12:34:56 +1 day 3:23:01
+
+   and mean "add a day plus 3 hours, 23 minutes, and 1 second" to the
+   given date.
+
+   Note that delta times are not at all the same as UTC offsets; the
+   former specifies an adjustment to the given date/time and the latter
+   specifies that the local time is a particular distance from Universal
+   Time, for example:
+
+  11-Aug-2001 12:34:56 -0800          (20010811 16:34:56 -- UTC Offset)
+  11-Aug-2001 12:34:56 -08:00         (20010811 04:34:56 -- Delta time)
+
+   If you give a time followed by a modifer that starts with a + or -
+   sign, how does Kermit know whether it's a UTC offset or a delta time?
+   It is treated as a UTC offset if the sign is followed by exactly four
+   decimal digits; otherwise it is a delta time. Examples (for USA
+   Eastern Daylight Time):
+
+  11-Aug-2001 12:34:56 -0800          (20010811 16:34:56 -- UTC Offset)
+  11-Aug-2001 12:34:56 -08:00         (20010811 04:34:56 -- Delta time)
+  11-Aug-2001 12:34:56 -800           (20010811 04:34:56 -- Delta time)
+  11-Aug-2001 12:34:56 -8             (20010811 04:34:56 -- Delta time)
+
+   The first example says that at some unknown place which is 8 hours
+   ahead of Universal Time, the time is 12:34:56, and this corresponds to
+   16:34:56 in Eastern Daylight time. The second example says to subtract
+   8 hours from the local time. The third and fourth are delta times
+   because, even though a colon is not included, the time does not
+   consist of exactly 4 digits.
+
+   When a delta time is written after a timezone, however, there is no
+   ambiguity and no syntax distinction is required:
+
+  11-Aug-2001 12:34:56 -0800 -0800    (20010811 08:34:56)
+  11-Aug-2001 12:34:56 -0800 -08:00   (Ditto)
+  11-Aug-2001 12:34:56 -08:00 -08:00  (Illegal)
+
+    8.13.5. The DATE Command
+
+   Obviously a great many combinations of date, time, time zone, and
+   delta time are possible, as well as many formatting options. The
+   purpose of all this flexibility is to comply with as many standards as
+   possible -- Internet RFCs, ISO standards, and proven corporate
+   standards -- as well as with notations commonly used by real people,
+   in order that dates and times from the widest variety of sources can
+   be assigned to a variable and used in any date-time field in any
+   Kermit command.
+
+   You can test any date-and/or-time format with the DATE command, which
+   converts it to standard yyyymmdd hh:mm:ss format if it is understood,
+   or else gives an explicit error message (rather than just "BAD DATE"
+   as in previous C-Kermit releases) to indicate what is wrong with it.
+   Examples (on Tuesday, 31 July 2001 in New York City, Eastern Daylight
+   Time, UTC -0400):
+
+  DATE command argument                   Result           
+  12:30                                   20010731 12:30:00
+  12:30:01                                20010731 12:30:01
+  12:30:01.5                              20010731 12:30:02
+  1230                                    20010731 12:30:00
+  230                                     20010731 02:30:00
+  230+1d                                  20010801 02:30:00
+  230+1d3:00                              20010801 05:30:00
+  20010718 19:21:15                       20010718 19:21:15
+  20010718_192115                         20010718 19:21:15
+  20010718T192115                         20010718 19:21:15
+  18 Jul 2001 +0400                       20010717 23:59:59
+  18 Jul 2001 192115                      20010718 19:21:15
+  18 Jul 2001 192115.8                    20010718 19:21:16
+  18-Jul-2001T1921                        20010718 19:21:00
+  18-Jul-2001 1921Z                       20010718 15:21:00
+  18-Jul-2001 1921 GMT                    20010718 15:21:00
+  18-Jul-2001 1921 UTC                    20010718 15:21:00
+  18-Jul-2001 1921 Z                      20010718 15:21:00
+  18-Jul-2001 1921Z                       20010718 15:21:00
+  18-Jul-2001 1921 -04:00:00              20010718 19:21:00
+  21-Jul-2001_08:20:00am                  20010721 08:20:00
+  21-Jul-2001_8:20:00P.M.                 20010721 20:20:00
+  Fri Jul 20 11:26:25 2001                20010720 11:26:25
+  Fri Jul 20 11:26:25 GMT 2001            20010720 07:26:25
+  Sun, 9 Apr 2000 06:46:46 +0100          20000409 01:46:46
+  Sunday, 9 Apr 2000 06:46:46 +0100       20000409 01:46:46
+  now                                     20010731 19:41:12
+  today                                   20010731 00:00:00
+  today 09:00                             20010731 09:00:00
+  tomorrow                                20010801 00:00:00
+  tomorrow 09:00                          20010801 09:00:00
+  tomorrow 09:00 GMT                      20010801 05:00:00
+  yesterday                               20010730 00:00:00
+  yesterday 09:00                         20010730 09:00:00
+  + 3 days                                20010803 00:00:00
+  +3 days                                 20010803 00:00:00
+  +3days                                  20010803 00:00:00
+  + 3days                                 20010803 00:00:00
+  + 3 days 09:00                          20010803 09:00:00
+  + 2 weeks                               20010814 00:00:00
+  + 1 month                               20010831 00:00:00
+  - 7 months                              20001231 00:00:00
+  + 10 years                              20110731 00:00:00
+  friday                                  20010803 00:00:00
+  saturday                                20010804 00:00:00
+  sunday                                  20010805 00:00:00
+  monday                                  20010806 00:00:00
+  tuesday                                 20010731 00:00:00
+  wednesday                               20010801 00:00:00
+  thursday                                20010802 00:00:00
+  friday 07:00                            20010803 07:00:00
+  thursday 1:00pm                         20010802 13:00:00
+  thursday 1:00pm GMT                     20010802 09:00:00
+  Thu, 10 Nov 94 10:50:47 EST             19941110 10:50:47
+  Fri, 20 Oct 1995 18:35:15 -0400 (EDT)   19951020 18:35:15
+  31/12/2001                              20011231 00:00:00
+  12/31/2001                              20011231 00:00:00
+  2001-July-20                            20010720 00:00:00
+  2001-September-30                       20010930 00:00:00
+  30-September-2001                       20010930 00:00:00
+  Sep 30, 2001 12:34:56                   20010930 12:34:56
+  September 30, 2001                      20010930 00:00:00
+  September 30, 2001 630                  20010930 06:30:00
+  September 30 2001 630                   20010930 06:30:00
+  Sep-30-2001 12:34:59                    20010930 12:34:59
+  20010807113542.014                      20010807 11:35.42
+  20010807113542.014Z                     20010807 07:35:42
+
+    8.13.6. New Date-Time Functions
+
+   In the following descriptions, date-time function arguments are the
+   same free-format date-time strings discussed above, with the same
+   defaults for missing fields. They are automatically converted to
+   standard format internally prior to processing.
+
+   \fcvtdate(d1)
+          Converts the date-time d1 to standard format and local time.
+          This function is not new, but now it accepts a wider range of
+          argument formats that can include timezones and/or delta times.
+          If the first argument is omitted, the current date and time are
+          assumed. The optional second argument is a format code for the
+          result:
+
+     n1 = 1: yyyy-mmm-dd hh:mm:ss (mmm = English 3-letter month
+     abbreviation)
+     n1 = 2: dd-mmm-yyyy hh:mm:ss (ditto)
+     n1 = 3: yyyymmddhhmmss (all numeric)
+
+   \futcdate(d1)
+          Converts the date-time d1 to Universal Coordinated Time (UTC),
+          also known as GMT or Zulu or Zero-Meridian time. The default d1
+          is NOW. If d1 is a valid date-time, the UTC result is returned
+          in standard format, yyyymmdd hh:ss:mm.
+
+   \fcmpdates(d1,d2)
+          Compares two free-format date-times, d1 and d2, and, if both
+          arguments are valid, returns a number: -1 if d1 is earlier than
+          (before) d2; 0 if d1 is the same as d2; 1 if d1 is later than
+          (after) d2.
+
+   \fdiffdates(d1,d2)
+          Computes the difference between two free-format date-times, d1
+          and d2. If both arguments are valid, returns a delta time which
+          is negative if d1 is earlier than (before) d2 and positive
+          otherwise. If d1 and d2 are equal, the result is "+0:00".
+          Otherwise, the result consists of the number of days, hours,
+          minutes, and seconds that separate the two date-times. If the
+          number of days is zero, it is omitted. If the number of days is
+          nonzero but the hours, minutes, and seconds are all zero, the
+          time is omitted. if the seconds are zero, they are omitted.
+
+   \fdelta2secs(dt)
+          Converts a delta time to seconds. For example, "+1d00:00:01" to
+          86401. Valid delta times must start with a + or - sign. Days
+          are accepted as time units, but not years, months, or weeks. If
+          the result would overflow a computer long word (as would happen
+          with 32-bit long words when the number of days is greater than
+          24854), the function fails.
+
+   HINT: Although Kermit has a number of built-in date and time
+   variables, it doesn't have a single one suitable for writing a
+   timestamp. For this you would normally use something like "\v(ndate)
+   \v(time)". But \fcvtdate() (with no arguments) is equivalent: it
+   returns the current date and time in yyyymmdd hh:mm:ss format,
+   suitable for time stamping.
+
+    8.13.7. Date-Time Programming Examples
+
+   Here's a macro that converts any date-time to UTC, which you might use
+   if C-Kermit didn't already have a \futcdate() function:
+
+  define utcdate {
+      .local := \fcvtdate(\%*)                 ; 1.
+      .tmp := \fcvtdate(\m(local)UTC)          ; 2.
+      .offset := \fdiffdate(\m(local),\m(tmp)) ; 3.
+      .utc := \fcvtdate(\m(local)\m(offset))   ; 4.
+      sho mac utc                              ; 5.
+  }
+
+   Brief explanation: Line 1 converts the macro argument, a free-format
+   date-time, to standard-format local time. Line 2 appends the "UTC"
+   timezone to the local time and converts the result to local time. In
+   other words, we take the same time as the local time, but pretend it's
+   UTC time, and convert it to local time. For example, if New York time
+   is 4 hours ahead of UTC, then 6:00pm New York time is 2:00pm UTC. Line
+   3 gets the difference of the two results (e.g. "+04:00"). Line 4
+   appends the difference (delta time) to the local time, and converts it
+   again, which adds (or subtracts) the UTC offset to the given time.
+   Line 5 displays the result.
+
+   Here's a script that opens a web page, gets its headers into an array,
+   scans the array for the "Last-Modified:" header, and inteprets it:
+  http open www.columbia.edu
+  if fail stop 1 HTTP OPEN failed
+  http /array:a head index.html /dev/null
+  if fail stop 1 HTTP GET failed
+  show array a
+  for \%i 1 \fdim(&a) 1 {
+      .\%x := \findex(:,\&a[\%i])
+      if not \%x continue
+      .tag := \fleft(\&a[\%i],\%x-1)
+      .val := \fltrim(\fsubstr(\&a[\%i],\%x+1))
+      if ( eq "\m(tag)" "Last-Modified" ) {
+          echo HTTP Date: \m(val)
+          .rdate := \fcvtdate(\m(val))
+          echo {Standard Date (local): \m(rdate)}
+          echo {Standard Date (UTC):   \futcdate(\m(rdate))}
+          break
+      }
+  }
+  http close
+
+   The result:
+
+  HTTP Date: Mon, 13 Aug 2001 20:05:42 GMT
+  Standard Date (local): 20010813 16:05:42
+  Standard Date (UTC):   20010813 20:05:42
+
+   As you can see, Kermit had no trouble decoding the date-time-string
+   from the website, converting to local time, and converting back to UTC
+   with no conflicts or loss of information. If it had been in any other
+   known format, the result would have been the same.
+
+   Now suppose we want to download the web page only if it is newer than
+   our local copy. The \fdate(filename) function (which returns the
+   modification date-time of the given file) and the new \fcmpdates()
+   function make it easy. Insert the following just before the BREAK
+   statement:
+
+  if ( < 0 \fcmpdates(\m(rdate),\fdate(index.html)) ) {
+     echo GETTING index.html...
+     http get index.html index.html
+     if success echo HTTP GET OK
+  } else {
+     echo index.html: no update needed
+  }
+  http close
+  exit
+
+   This says, "if 0 is less than the comparison of the remote file date
+   and the local file date, get the remote file, otherwise skip it." And
+   it automatically reconciles the time-zone difference (if any).
+
+   It would be nice to be able to extend this script into a
+   general-purpose website updater, but unfortunately HTTP protocol
+   doesn't provide any mechanism for the client to ask the server for a
+   list of files, recursive or otherwise.
+
+   [ [472]Top ] [ [473]Contents ] [ [474]C-Kermit Home ] [ [475]Kermit
+   Home ]
+     _________________________________________________________________
+
+  8.14. Trapping Keyboard Interruption
+
+   Normally when you type Ctrl-C and Kermit is in command mode (as
+   opposed to CONNECT mode) with COMMAND INTERRUPTION ON (as it is unless
+   you have set it OFF), Kermit interrupts any command that is currently
+   in progress, and if a command file or macro is executing, rolls the
+   command stack back to top level, closing all open command files,
+   deactivating all macros, deallocating all local variables and arrays,
+   and leaving you at the command prompt.
+
+   Suppose, however, you want certain actions to occur when a script is
+   interrupted; for example, closing open files, writing log entries, or
+   displaying summary results. You can do this by defining a macro named
+   ON_CTRLC. When Ctrl-C is detected, and a macro with this name is
+   defined, Kermit executes it from the current command level, thus
+   giving it full access to the environment in which the interruption
+   occurred, including local variables and open files. Only when the
+   ON_CTRLC macro completes execution is the command stack rolled back to
+   top level.
+
+   Once the ON_CTRLC macro is defined, it can be executed only once. This
+   is to prevent recursion if the user types Ctrl-C while the ON_CTRLC
+   macro is executing. If you type Ctrl-C while the Ctrl-C macro is
+   active, this does not start a new copy of ON_CTRLC; rather, it returns
+   to the top-level command prompt. After the ON_CTRLC macro returns, it
+   has been removed from the macro table so if you want to use it again
+   or install a different Ctrl-C trap, you must execute a new DEFINE
+   ON_CTRLC command. In any case, as always when you interrupt a script
+   with Ctrl-C, its completion status is FAILURE.
+
+   Normally the ON_CTRLC macro would be defined in the command file or
+   macro to which it applies, and should be declared LOCAL. This way, if
+   the command file or macro completes successfully without being
+   interrupted, the ON_CTRLC definition disappears automatically.
+   Otherwise the definition would still be valid and the macro would be
+   executed, probably out of context, the next time you typed Ctrl-C.
+
+   Here's a simple example of a command file that sets a Ctrl-C trap for
+   itself:
+
+  local on_ctrlc              ; Make Ctrl-C trap local to this command file.
+  define on_ctrlc {           ; Define the ON_CTRLC macro.
+      echo Interrupted at \v(time).
+      echo Iterations: \%n
+  }
+  xecho Type Ctrl-C to quit
+  for \%n 1 999 1 {           ; Prints a dot every second until interrupted.
+      sleep 1
+      xecho .
+  }
+  echo Finished normally at \v(time) ; Get here only if not interrupted.
+  decrement \%n
+  echo Iterations: \%n
+
+   This prints a summary no matter whether it completes normally or is
+   interrupted from the keyboard. In both cases the trap is automatically
+   removed afterwards.
+
+   For an example of how to use ON_CTRLC to debug scripts, see
+   [476]Section 8.1.
+
+   [ [477]Top ] [ [478]Contents ] [ [479]C-Kermit Home ] [ [480]Kermit
+   Home ]
+  __________________________________________________________________________
+
+9. S-EXPRESSIONS
+
+   This section is primarily for those who want to write
+   calculation-intensive scripts, especially if they require
+   floating-point arithmetic, and/or for those who are familiar with the
+   LISP programming language.
+
+   Ever since C-Kermit version 5 was released in 1988, scripting has been
+   one of its major attractions, and arithmetic is a key part of it.
+   Versions 5 and 6 included integer arithmetic only, using traditional
+   algebraic notation, e.g.:
+
+  echo \fevaluate(3*(2+7)/2)
+  13
+
+   C-Kermit 7.0 added support for floating-point arithmetic, but only
+   through function calls:
+
+  echo \ffpdivide(\ffpmultiply(3.0,\ffpadd(2.0,7.0)),2.0)
+  13.5
+
+   C-Kermit 8.0 introduces a third form of arithmetic that treats
+   integers and floating-point numbers uniformly, is easier to read and
+   write, and executes very quickly:
+
+  (/ (* 3 (+ 2 7)) 2)
+  13.5
+
+   But first some background.
+
+   The Kermit command and scripting language differs from true
+   programming languages (such as C or Fortran) in many ways; one of the
+   most prominent differences is the way in which variables are
+   distinguished from constants. In a command language, words are taken
+   literally; for example, the Unix shell:
+
+  cat foo.bar
+
+   displays the file named foo.bar. Whereas in a programming language
+   like C, words are assumed to be variables:
+
+  s = foo.bar;    /* Assigns the value of foo.bar to the variable s */
+
+   To make a programming language take words literally, you have to quote
+   or "escape" them:
+
+  s = "foo.bar";  /* Assigns a pointer to the string "foo.bar" to the variable
+s */
+
+   The opposite holds for command languages: to get them to treat a word
+   as a variable rather than a constant, you have to escape them. For
+   example, in the Unix shell:
+
+  foo=123         ; Assign value 123 to variable foo.
+  echo foo        ; Prints "foo"
+  echo $foo       ; Prints "123"
+
+   And in Kermit:
+
+  define foo 123  ; Assign value 123 to variable foo.
+  echo 123        ; This prints "123".
+  echo foo        ; This prints "foo".
+  echo \m(foo)    ; This prints "123".
+
+   In other words, character strings (such as "foo" above) are
+   interpreted as literal strings, rather than variable names, except in
+   special commands like DEFINE that deal specifically with variable
+   names (or in numeric contexts as explained in [481]Section 8.2). The
+   special "escape" character (dollar sign ($) for the shell, backslash
+   (\) for Kermit) indicates that a variable is to be replaced by its
+   value.
+
+   The requirement to escape variable names in command languages normally
+   does not impose any special hardship, but can add a considerable
+   notational burden to arithmetic expressions, which are typically full
+   of variables. Especially in Kermit when floating point numbers are
+   involved, where you must use special \ffpxxx() functions, e.g.
+   "\ffpadd(\m(a),\m(b))" rather than the simple "+" operator to add two
+   floating-point numbers together, because the original arithmetic
+   handler doesn't support floating point (this might change in the
+   future). To illustrate, the general formula for the area of a triangle
+   is:
+
+  sqrt(s * (s - a) * (s - b) * (s - c))
+
+   where a, b, and c are the lengths of the triangle's three sides and:
+
+  s = (a + b + c) / 2
+
+   Except in special cases (e.g. a = 3, b = 4, c = 5), the result has a
+   fractional part so the computation must be done using floating-point
+   arithmetic. We can create a Kermit 7.0 function for this as follows:
+
+  def area {
+      local s t1 t2 t3
+      assign s \ffpdiv(\ffpadd(\ffpadd(\%1,\%2),\%3),2.0)
+      assign t1 \ffpsub(\m(s),\%1)
+      assign t2 \ffpsub(\m(s),\%2)
+      assign t3 \ffpsub(\m(s),\%3)
+      return \ffpsqrt(\ffpmul(\m(s),\ffpmul(\m(t1),\ffpmul(\m(t2),\m(t3)))))
+  }
+
+   But as you can see, this is rather cumbersome. Note, in particular,
+   that arithmetic functions like \ffpadd(), \ffpmul(), etc, take exactly
+   two operands (like their symbolic counterparts + and *), so obtaining
+   the product of three or more numbers (as we do in this case) is
+   awkward.
+
+   Using the alternative S-Expression notation, we can reduce this to a
+   form that is both easier to read and executes faster (the details are
+   explained later):
+
+  def newarea {
+      (let s (/ (+ \%1 \%2 \%3) 2.0))
+      (sqrt (* s (- s \%1) (- s \%2) (- s \%3)))
+  }
+
+   In both examples, the \%1..3 variables are the normal Kermit macro
+   arguments, referenced by the normal escaping mechanism. For increased
+   readability, we can also assign the macro arguments \%1, \%2, and \%3
+   to the letters a, b, and c corresponding to our formula:
+
+def newarea {
+    (let a \%1 b \%2 c \%3)
+    (let s (/ (+ a b c) 2.0))
+    (sqrt (* s (- s a) (- s b) (- s c)))
+}
+
+   And now the Kermit function reads almost like the original formula.
+   Here Kermit behaves more like a regular programming language. In an
+   S-Expression, macro names need not be escaped when they are used as
+   the names of numeric variables.
+
+   [ [482]Top ] [ [483]Contents ] [ [484]C-Kermit Home ] [ [485]Kermit
+   Home ]
+     _________________________________________________________________
+
+  9.1. What is an S-Expression?
+
+   The S-Expression concept is borrowed from the Lisp programming
+   language. "S-Expression" is short for Symbolic Expression (itself
+   sometimes shortened to SEXP). S-Expressions provide a kind of
+   Alternative Mini-Universe within the Kermit command language when the
+   regular rules don't apply, a universe enclosed in parentheses.
+
+   C-Kermit does not pretend to be a full Lisp interpreter; only the
+   arithmetic parts of Lisp have been incorporated: S-Expressions that
+   operate on numbers and return numeric values (plus extensibility
+   features described in [486]Section 9.8, which allow some degree of
+   string processing).
+
+   An S-Expression is a list of zero or more items, separated by spaces,
+   within parentheses. Examples:
+
+  ()
+  (1)
+  (a)
+  (+ a 1)
+  (* 2 a b)
+
+   If the S-Expression is empty, it has the NIL (empty) value. If it is
+   not empty and the first item is an operator (such as + or *), there
+   can be zero or more subsequent items, called the operands:
+
+  (+ 1 2)
+
+   Here the operator is "+" and the operands are "1" and "2", and the
+   value of the S-Expression is the value of the operation (in this case
+   3). The operator always comes first, which is different from the
+   familiar algebraic notation; this because S-Expression operators can
+   have different numbers of operands:
+
+  (+ 1)
+  (+ 1 2)
+  (+ 1 2 3 4 5 6 7 8 9)
+
+   If the first item in the S-Expression is not an operator, then it must
+   be a variable or a number (or a macro; see [487]Section 9.8), and the
+   S-Expression can only contain one item; in this case, the
+   S-Expression's value is the value of the variable or number:
+
+  (a)
+  (3)
+
+   Operands can be numbers, variables that have numeric values, functions
+   that return numbers, or other S-Expressions. To illustrate an
+   S-Expression within an S-Expression, observe that:
+
+  (+ 1 2)
+
+   is equivalent to any of the following (plus an infinite number of
+   others):
+
+  (+ 1 (+ 1 1))
+  (+ (- 3 2) (/ 14 (+ 3 4)))
+
+   S-Expressions can be nested to any reasonable level; for example, the
+   value of the following S-Expression is 64:
+
+  (- (* (+ 2 (* 3 4)) (- 9 (* 2 2))) 6)
+
+   Operators have no precedence, implied or otherwise, since they can't
+   be mixed. The only exceptions are unary + and -, which simply indicate
+   the sign of a number:
+
+  (* 3 -1)
+
+   Order of evaluation is specified entirely by parentheses, which are
+   required around each operator and its operands: (+ a (* b c)) instead
+   of (a + b * c).
+
+   S-Expressions provide a simple and isolated environment in which
+   Kermit's macro names can be used without the \m(...) escaping that is
+   normally required. Given:
+
+  define a 1
+  define b 2
+  define c 3
+
+   Then:
+
+  (+ \m(a) \m(b) \m(c))
+
+   is equivalent to:
+
+  (+ a b c)
+
+   Within an S-Expression, as in other strictly numeric contexts
+   ([488]Section 8.2), any operand that starts with a letter is treated
+   as a Kermit macro name. In this context, abbreviations are not
+   accepted; variable names must be spelled out in full. Alphabetic case
+   is not significant; "a" and "A" are the same variable, but both are
+   different from "area".
+
+   Of course, regular Kermit variables and functions can be used in
+   S-Expressions in the normal ways:
+
+  (* \v(math_pi) (^ \%r 2))             ; Area of a circle with radius \%r
+  (+ \fjoin(&a))                        ; Sum of all elements of array \&a[]
+
+   [ [489]Top ] [ [490]Contents ] [ [491]C-Kermit Home ] [ [492]Kermit
+   Home ]
+     _________________________________________________________________
+
+  9.2. Integer and Floating-Point-Arithmetic
+
+   Normally, if all numbers in an S-Expression are integers, the result
+   is an integer:
+
+  (+ 1 1)                               ; Result is 2
+  (/ 9 3)                               ; Result is 3
+
+   If any of the operands is floating point, however, the result is also
+   floating point:
+
+  (+ 1 1.0)                             ; Result is 2.0
+  (/ 9.0 3)                             ; Result is 3.0
+
+   If all the operands are integers but the result has a fractional part,
+   the result is floating point:
+
+  (/ 10 3)                              ; Result is 3.333333333333333
+
+   To force an integer result in such cases, use the TRUNCATE operator:
+
+  (truncate (/ 10 3))                   ; Result is 3
+
+   Similarly, to force a computation to occur in floating point, you can
+   coerce one of its operands to FLOAT:
+
+  (+ 1 (float 1))                       ; Result is 2.0
+
+   The result is also floating point if the magnitude of any integer
+   operand, intermediate result, or the result itself, is larger than the
+   maximum for the underlying machine architecture:
+
+  (^ 100 100)
+
+   If the result is too large even for floating-point representation,
+   "Infinity" is printed; if it is too small to be distinguished from 0,
+   0.0 is returned.
+
+   Large numbers can be used and large results generated, but they are
+   accurate only to the precision of the underlying machine. For example,
+   the result of:
+
+ (+ 111111111111111111111 222222222222222222222)
+
+   should be 333333333333333333333, but 333333333333333300000.0 is
+   produced instead if the machine is accurate to only about 16 decimal
+   digits, even with coercion to floating-point. The order of magnitude
+   is correct but the least significant digits are wrong. The imprecise
+   nature of the result is indicated by the ".0" at the end. Contrast
+   with:
+
+ (+ 111111111 222222222)
+
+   which produces an exact integer result.
+
+   [ [493]Top ] [ [494]Contents ] [ [495]C-Kermit Home ] [ [496]Kermit
+   Home ]
+     _________________________________________________________________
+
+  9.3. How to Use S-Expressions
+
+   S-Expressions may be given as commands to C-Kermit. Any command whose
+   first character is "(" (left parenthesis) is interpreted as an
+   S-Expression.
+
+   If you enter an S-Expression at the C-Kermit> prompt, its result is
+   printed:
+
+  C-Kermit>(/ 10.0 3)
+   3.333333333333333
+  C-Kermit>
+
+   If an S-Expression is executed within a macro or command file, its
+   value is not printed. However, you can control the printing action
+   with:
+
+   SET SEXPRESSION ECHO { AUTO, ON, OFF }
+          AUTO is the default, meaning print the value at top level only;
+          ON means always print the value; OFF means never print it.
+
+   In any case, the value of the most recent S-Expression (and the
+   S-Expression itself) may be accessed programmatically through the
+   following variables:
+
+   \v(sexpression)
+          The S-Expression most recently executed.
+
+   \v(svalue)
+          The value of the S-Expression most recently executed.
+
+   Besides issuing S-Expressions as commands in themselves, you can also
+   execute them anywhere within a Kermit command, but in this case they
+   must be enclosed in a function call (otherwise they are taken
+   literally):
+
+   \fsexpression(s)
+          The argument "s" is an S-Expression; the outer parentheses may
+          be omitted. The value of the S-Expression is returned. Note
+          that since S-Expressions usually contain spaces, some form of
+          grouping or quoting might be needed in some contexts:
+
+  echo \fsexpression((+ 1 1))            ; Outer parentheses may be included
+  echo \fsexpr(+ 1 1)                    ; Outer parentheses may be omitted
+  echo Value = "\fsexp(+ 1 a)"           ; Can be embedded in strings
+  echo Value = \&a[\fsexp(/ b 2)]        ; Can be used in array subscripts
+  if = {\fsexp(+ 1 1)} 2 {               ; Braces needed here for grouping
+      echo One plus one still equals two
+  }
+
+   The IF statement illustrates how to use S-Expressions as (or in) IF or
+   WHILE conditions:
+
+     * Although S-Expressions and IF conditions are similar in
+       appearance, they are not interchangeable. Therefore you must use
+       \fsexpr() to let Kermit know it's an S-Expression rather than a
+       regular IF condition, or a boolean or algebraic expression within
+       an IF condition.
+     * In contexts where a single "word" is expected, you must enclose
+       the \fsexp() invocation in braces if the S-Expression contains
+       spaces (and most of them do).
+
+   If an S-Expression is the last command executed in a macro, its value
+   becomes the return value of the macro; no RETURN command is needed.
+   Example:
+
+  def newarea {
+      (let s (/ (+ \%1 \%2 \%3) 2.0))
+      (sqrt (* s (- s \%1) (- s \%2) (- s \%3)))
+  }
+
+   This is equivalent to (but more efficient than):
+
+  def newarea {
+      (let s (/ (+ \%1 \%2 \%3) 2.0))
+      return \fsexp(sqrt (* s (- s \%1) (- s \%2) (- s \%3)))
+  }
+
+   When an S-Expression is entered as a command -- that is, the first
+   nonblank character of the command is a left parenthesis -- then it is
+   allowed to span multiple lines, as many as you like, until the first
+   left parenthesis is matched:
+
+  (let s (/
+          (+
+           \%1
+           \%2
+           \%3
+           )
+          2.0
+          )
+       )
+  (sqrt (*
+         s
+         (- s \%1)
+         (- s \%2)
+         (- s \%3)
+         )
+        )
+
+   The S-Expression concept lends itself easily to embedding and
+   recursion, but the depth to which recursion can occur is limited by
+   the resources of the computer (memory size, address space, swap space
+   on disk) and other factors. There is no way that C-Kermit can know
+   what this limit is, since it varies not only from computer to
+   computer, but also from moment to moment. If resources are exhausted
+   by recursion, C-Kermit simply crashes; there's no way to trap this
+   error. However, you can set a depth limit on S-Expressions:
+
+   SET SEXPRESSION DEPTH-LIMIT number
+          Limits the number of times the S-Expression reader can invoke
+          itself without returning to the given number. The default limit
+          is 1000. This limit applies to S-Expressions embedded within
+          other S-Expressions as well as to S-Expressions that invoke
+          recursive macros. If the limit is exceeded, Kermit prints
+          "?S-Expression depth limit exceeded" and returns to its prompt.
+          More about recursion in [497]Section 9.8.
+
+   You can also test the depth programmatically:
+
+   \v(sdepth)
+          The current S-Expression invocation depth. The depth includes
+          both nesting level and recursion. For example, in:
+          (foo (foo (foo (foo (foo))))), the innermost (foo) is at depth
+          5.
+
+   Help, completion, and syntax checking are not available within an
+   S-Expression. If you type ? within an S-Expression, it says:
+
+  C-Kermit>(? S-Expression ("help sexp" for details)
+
+   As it says, typing "help sexp" will display a brief help text.
+
+   The SHOW SEXPRESSION command displays current SET SEXPRESSION settings
+   and related information.
+
+   [ [498]Top ] [ [499]Contents ] [ [500]C-Kermit Home ] [ [501]Kermit
+   Home ]
+     _________________________________________________________________
+
+  9.4. Summary of Built-in Constants and Operators
+
+   Three constants are built in:
+
+     * PI, whose value is the value of pi (the quotient of circumference
+       of any circle and its diameter, 3.141592653...) to the underlying
+       machine's precision;
+     * T, which always has the value 1, which signifies truth in Kermit
+       logical expressions or S-Expressions;
+     * NIL, which always has the empty value, and can serve as a False
+       truth value.
+
+   These constants are specific to S-Expressions and are not visible
+   outside them. They may not be used as the target of an assignment. So,
+   for example:
+
+  (setq t 0)   Fails
+  assign t 0   Succeeds but this is not the same T!
+
+   E (the base of natural logarithms, 2.7182818184...) is not built in
+   since it is not intrinsic in most Lisp dialects. If you want E to be
+   the base of natural logarithms you can:
+
+  (setq e (exp 1))
+
+   Operators are either symbols (such as "+") or words. Words must be
+   spelled out in full, not abbreviated. Differences of alphabetic case
+   are ignored.
+
+   The most basic operation in S-Expressions is evaluation:
+
+   EVAL [ s-expression or variable or number [ another [ another ... ] ]
+          ]
+          Evaluates its operands and returns the value of the last one
+          evaluated. Examples:
+
+  (eval)                                0
+  (eval 1)                              1
+  (eval a)                              value of a
+  (eval (+ 1 a))                        value of a+1
+  (eval (setq a 1) (setq b (+ a 0.5)))  value of b (= a+0.5)
+
+          You can use "." as a shorthand for EVAL:
+
+  (.)
+  (. 1)
+  (. a)
+  (. (+ 1 a))
+  (. (setq a 1) (setq b (+ a 0.5)))
+
+   Opposite of EVAL is the operator that suppresses evaluation of its
+   operand:
+
+   QUOTE item
+          The value (quote item) is "item". If the item is itself an
+          S-Expression, the result is the S-Expression with the outer
+          parentheses stripped. Examples:
+
+  (quote)                               (illegal)
+  (quote a)                             a
+  (quote hello)                         hello
+  (quote (this is a string))            this is a string
+  (quote this is a string)              (illegal)
+
+          A shorthand notation is also accepted for quoting:
+          'a is equivalent to (quote a). And therefore:
+          '(a b c) is equivalent to (quote (a b c)).
+          More about quoting in [502]Section 9.8.
+
+   STRING item
+          Is a combination of EVAL and QUOTE. It evaluates the item as an
+          S-Expression, and then puts quotes around the result (more
+          about this in [503]Section 9.8).
+
+   The following operators assign values to variables:
+
+   SETQ [ variable [ value [ variable [ value [ ... ] ] ] ] ]
+          Applies to global variables. For each variable given: if a
+          value is not given, the variable is undefined. If a value is
+          given, assigns the value to the variable. The value may be a
+          number, a variable, or anything that resolves to a number
+          including an S-Expression. Returns the value of the last
+          assignment. Examples:
+
+  (setq)             Does nothing, returns NIL.
+  (setq a)           Undefines a, returns NIL.
+  (setq a 1)         Assigns 1 to a, returns 1.
+  (setq a 1 b 2)     Assigns 1 to a, 2 to b, returns 2.
+  (setq a 1 b 2 c)   Assigns 1 to a, 2 to b, undefines c, returns NIL.
+
+   To undefine a variable that is not the final one in the list, give it
+   a value of "()" or NIL:
+
+  (setq a () b 2)    Undefines a, assigns 2 to b, returns 2.
+  (setq a nil b 2)   Ditto.
+
+   Note that a variable can be used right away once it has a value:
+
+  (setq a 1 b a)     Assigns 1 to a, the value of a (1) to b, returns 1.
+
+   The results of SETQ (when used with macro names) can be checked
+   conveniently with SHOW MACRO, e.g:
+
+  show mac a b c
+
+   LET [ variable [ value [ variable [ value [ ... ] ] ] ] ]
+          Like SETQ, but applies to local variables. Note that "local" is
+          used in the Kermit sense, not the Lisp sense; it applies to the
+          current Kermit command level, not to the current S-Expression.
+
+   If you want to use SETQ or LET to assign a value to a backslash
+   variable such as \%a or \&a[2], you must double the backslash:
+
+  (setq \\%a 3)
+  (setq \\%b (+ \%a 1))
+  (setq \\&a[2] (setq (\\%c (+ \%a \%b))))
+
+   In other words:
+
+     * Double the backslash when you want to indicate the variable's
+       NAME;
+     * Don't double the backslash when you want its VALUE.
+
+   See [504]Section 9.6 for a fuller explanation of variable syntax and
+   scope.
+
+   Here's a summary table of arithmetic operators; in the examples, a is
+   2 and b is -1.3:
+
+  Operator  Description                            Example           Result
+  +         Adds all operands (0 or more)          (+ a b)           0.7
+  -         Subtracts all operands (0 or more)     (- 9 5 2 1)       1
+  *         Multiplies all operands (0 or more)    (* a (+ b 1) 3)  -1.80
+  /         Divides all operands (2 or more)       (/ b a 2)        -0.325
+  ^         Raise given number to given power      (^ 3 2)           9
+  ++        Increments variables                   (++ a 1.2)        3.2
+  --        Decrements variables                   (-- a)            1
+  ABS       Absolute value of 1 operand            (abs (* a b 3))   7.8
+  MAX       Maximum of all operands (1 or more)    (max 1 2 3 4)     4
+  MIN       Minimum of all operands (1 or more)    (min 1 2 3 4)     1
+  MOD (%)   Modulus of all operands (1 or more)    (mod 7 4 2)       1
+  FLOAT     Convert an integer to floating-point   (float 1)         1.0
+  TRUNCATE  Integer part of floating-point operand (truncate 3.333)  3
+  CEILING   Ceiling of floating-point operand      (ceiling 1.25)    2
+  FLOOR     Floor of floating-point operand        (floor 1.25)      1
+  ROUND     Operand rounded to nearest integer     (round 1.75)      2
+  SQRT      Square root of 1 operand               (sqrt 2)          1.414..
+  EXP       e (2.71828..) to the given power       (exp -1)          0.367..
+  SIN       Sine of angle-in-radians               (sin (/ pi 2))    1.0
+  COS       Cosine of angle-in-radians             (cos pi)         -1.0
+  TAN       Tangent of angle-in-radians            (tan pi)          0.0
+  LOG       Natural log (base e) of given number   (log 2.7183)      1.000..
+  LOG10     Log base 10 of given number            (log10 1000)      3.0
+
+   The ++ and -- operators are also assignment operators and work just
+   like SETQ and LET in their interpretations of operators and operands,
+   but:
+
+     * Each target variable must already be defined and have a numeric
+       value;
+     * The assignment value is the amount by which to increment or
+       decrement the variable.
+     * If an assignment value is not given, 1 is used.
+
+   If you include more than one variable-value pair in a ++ or --
+   expression, every variable (except, optionally, the last) must be
+   followed by a value. Examples:
+
+  (++ a)                Equivalent to (setq a (+ a 1)) and to (++ a 1)
+  (++ a 2)              Equivalent to (setq a (+ a 2))
+  (-- a (* 2 pi))       Equivalent to (setq a (- a (* 2 pi)))
+  (++ a 1 b 1 c 1 d)    Equivalent to four SETQs incrementing a,b,c,d by 1.
+
+   Another group of operators forms the predicates. These return a "truth
+   value", in which 0 (or NIL) is false, and 1 or any other nonzero
+   number is true.
+
+  Operator  Description                            Example           Result
+  = (or ==) Operands are equal                     (= 1 1.0)         1
+  !=        Operands are not equal                 (!= 1 1.0)        0
+  <         Operands in strictly ascending order   (< 1 2 3)         1
+  <=        Operands in ascending order            (<= 1 1 2 3)      1
+  >         Operands in strictly descending order  (> 3 2 1)         1
+  >=        Operands in descending order           (<= 3 3 2 1)      1
+  AND (&&)  Operands are all true                  (and 1 1 1 1 0)   0
+  OR  (||)  At least one operand is true           (or 1 1 1 1 0)    1
+  XOR       Logical Exclusive OR                   (xor 3 1)         0
+  NOT (!)   Reverses truth value of operand        (not 3)           0
+
+   The Exclusive OR of two values is true if one value is true and the
+   other value is false.
+
+   And another group operates on bits within an integer word:
+
+  Operator  Description                            Example           Result
+  &         Bitwise AND                            (& 7 2)           2
+  |         Bitwise OR                             (| 1 2 3 4)       7
+  #         Bitwise Exclusive OR                   (# 3 1)           2
+  ~         Reverses all bits                      (~ 3)            -4
+
+   These operators coerce their operands to integer by truncation if
+   necessary. The result of bit reversal is hardware dependent.
+
+   The final category of operator works on truth values:
+
+  Operator  Description                            Example           Result
+  IF        Conditional evaluation                 (if (1) 2 3)      2
+
+   IF (predicate) (s1) [ (s2) ]
+          The IF operator is similar to Kermit's IF command. If the
+          predicate is true (i.e. evaluates to a nonzero number), the
+          first S-Expression (s1) is evaluated and its value is returned.
+          Otherwise, if (s2) is given, it is evaluated and its value
+          returned; if (s2) is not given, nothing happens and the NIL
+          (empty) value is returned.
+
+   You can group multiple expressions in the s1 and s2 expressions using
+   EVAL (or "."):
+
+  (if (< a 0) (eval (setq x 0) (setq y 0)) (eval (setq x a) (setq y b)))
+
+   or equivalently:
+
+  (if (< a 0) (. (setq x 0) (setq y 0)) (. (setq x a) (setq y b)))
+
+   Each operator has its own requirement as to number and type of
+   operands. In the following table, "number" means any kind of number --
+   integer or floating-point -- or a variable, function, macro, or
+   S-Expression that returns a number; "vname" means variable name,
+   "fpnumber" means a floating-point number (or anything that resolves to
+   one), and "integer" means integer (or anything that resolves to one).
+   "truthvalue" means anything that resolves to a value of zero or an
+   empty value (which indicates false) or a nonzero value (which
+   indicates true). "any" means any kind of value, including none at all.
+
+  Operator  Number of operands   Type of operands    Returns
+  EVAL  (.) 0 or more            S-Expression        Last value (default NIL)
+  STRING    1                    S-Expression        string
+  QUOTE (') 1                    word                string
+  SETQ      0 or more            vname value pairs   Last value (default NIL)
+  LET       0 or more            vname value pairs   Last value (default NIL)
+  +         0 or more            number              number     (default 0)
+  -         0 or more            number              number     (default 0)
+  *         0 or more            number              number     (see note (1))
+  /         2 or more            number              number
+  ^         2 or more            number              number
+  ++        1 or more            vname value pairs   Result of last increment
+  --        1 or more            vname value pairs   Result of last decrement
+  ABS       1                    number              number
+  MAX       1 or more            number              number
+  MIN       1 or more            number              number
+  MOD (%)   2                    number              number
+  FLOAT     1                    number              fpnumber
+  TRUNCATE  1                    number              integer
+  CEILING   1                    number              integer
+  FLOOR     1                    number              integer
+  ROUND     1                    number              integer
+  SQRT      1                    number              fpnumber
+  EXP       1                    number              fpnumber
+  SIN       1                    number              fpnumber
+  COS       1                    number              fpnumber
+  TAN       1                    number              fpnumber
+  LOG       1                    number              fpnumber
+  LOG10     1                    number              fpnumber
+  = (==)    1 or more            number              truthvalue
+  !=        1 or more            number              truthvalue
+  <         1 or more            number              truthvalue
+  <=        1 or more            number              truthvalue
+  >         1 or more            number              truthvalue
+  >=        1 or more            number              truthvalue
+  AND (&&)  1 or more            truthvalue          truthvalue
+  OR  (||)  1 or more            truthvalue          truthvalue
+  XOR       2                    truthvalue          truthvalue
+  NOT (!)   1                    truthvalue          truthvalue
+  &         1 or more            number (see note 2) integer
+  |         1 or more            number (see note 2) integer
+  #         2                    number (see note 2) integer
+  ~         1                    number (see note 2) integer
+  IF        2 or 3               truthvalue,any,any  any
+
+   Operators that don't require any arguments return the default values
+   shown.
+
+    1. The value of "*", when used as an operator, is initially "1" and
+       the value of the most recent S-Expression thereafter, as in Franz
+       Lisp. This is handy when doing a series of calculations by hand:
+  C-Kermit>(* 13272.42 0.40)
+   5308.968
+  C-Kermit>(/ * 2)
+   2654.4840
+  C-Kermit>
+    2. The bitwise operators coerce their operands to integer by
+       truncation.
+
+   [ [505]Top ] [ [506]Contents ] [ [507]C-Kermit Home ] [ [508]Kermit
+   Home ]
+     _________________________________________________________________
+
+  9.5. Variables
+
+   As noted elsewhere in this discussion, all backslash items (variables
+   such as \%a, macro parameters such as \%1, array elements such as
+   \&a[\%i], built-in variables such as \v(ndate), built-in functions
+   such as \fjoin(), macro names enclosed in \m(), \s(), or \:(), etc)
+   are evaluated at "top level" before the S-Expression is sent to the
+   S-Expression reader. To use a backslash variable as the target of an
+   assignment (e.g. by SETQ, LET, ++, or --), you must double the
+   backslash, e.g. (setq \\%r 1234). This is discussed at greater length
+   in the next section.
+
+   Thus S-Expression reader generally deals only with macro names (not
+   backslash items) as variables. It is important to understand how the
+   reader handles macro names. There are fundamentally two kinds of
+   S-Expressions: those that contain a single element, such as:
+
+  (foo)
+
+   and those that contain more than one element:
+
+  (foo a b c)
+
+   If an S-Expression contains only one element, and it is the name of a
+   macro, the macro's definition is examined. If the definition is a
+   number (integer or floating-point, positive or negative), then this
+   becomes the value of the expression. If the definition starts with '
+   (apostrophe), then the quoted word or string is the value of the
+   expression (explained in [509]Section 9.8). Otherwise, the macro is
+   assumed to be composed of Kermit commands (possibly including
+   S-Expressions), which are executed. If the macro has a RETURN value,
+   or it executes an S-Expression as its last command, the result becomes
+   the value of the S-Expression; otherwise the result is empty.
+
+   For S-Expressions that contain more than one element, and the first
+   element is the name of a macro, then this macro is executed with the
+   arguments that are given, after the arguments are evaluated by the
+   S-Expression reader. Likewise, If the first element is a built-in
+   operator, then it is applied to the operands after they are evaluated.
+   In both cases, each operand is fed to the S-Expression reader
+   recursively for evaluation. If an operand is a number or a quoted
+   string, it is used as-is. But if it's a macro name, this degenerates
+   into the first case, and the previous paragraph applies.
+
+   Examples:
+
+  define foo 123
+  (foo)                                Result: 123
+  define foo 'abc
+  (foo)                                Result: abc
+  define foo '(one two three)
+  (foo)                                Result: one two three
+  define foo return \frandom(1000)
+  (foo)                                Result: 713 (or other number)
+  define foo (+ a b)
+  (foo)                                Result: The sum of a and b
+
+   A more difficult example:
+
+  define foo abc
+  (foo)                                Result: ???
+
+   The result in the last example depends on the definition of abc:
+
+     * If it has no definition, an error occurs; otherwise:
+     * If the definition is an S-Expression, the result is the
+       S-Expression's value; otherwise:
+     * If the definition consists of Kermit commands, they are executed.
+       But in this case "(foo)" produces the empty result, because it
+       doesn't RETURN anything.
+
+   The use of macros as S-Expression operators is described in
+   [510]Section 9.8.
+
+   [ [511]Top ] [ [512]Contents ] [ [513]C-Kermit Home ] [ [514]Kermit
+   Home ]
+     _________________________________________________________________
+
+  9.6. Assignments and Scope
+
+   The assignment operators SETQ and LET apply to global and local
+   variables, respectively. SETQ and LET are standard Lisp operators
+   adapted to Kermit scoping rules. When the operands are numeric or
+   arithmetic, SETQ is equivalent to Kermit's EVALUATE command:
+
+  (setq a (+ 1 2))
+  evaluate a 1 + 2
+
+   When the operand is a string, SETQ is equivalent to DEFINE:
+
+  (setq a '(this is a string))
+  define a this is a string
+
+   In the first case, both statements create a macro named "a" with a
+   value of 3. But in neither case is the macro "a" necessarily global.
+   If either of these commands executes in an environment (i.e. macro
+   invocation level) where a "local a" command has been given, the "a"
+   macro is global to that environment, but is not visible outside it.
+
+   LET is equivalent to the Kermit LOCAL command, followed by the
+   corresponding EVALUATE:
+
+  (let a (+ 1 2))
+
+   is equivalent to:
+
+  local a
+  evaluate a 1 + 2
+
+   Again, "local" in this context applies to the Kermit macro invocation
+   stack, not to the S-Expression nesting level. To illustrate, recall
+   our "newarea" macro:
+
+def newarea {
+    (let a \%1 b \%2 c \%3)
+    (let s (/ (+ a b c) 2.0))
+    (sqrt (* s (- s a) (- s b) (- s c)))
+}
+
+   Because SETQ and LET expressions return a value, they can be placed
+   within a larger S-Expression. In this case we can replace the first
+   reference to the "s" variable by its defining expression:
+
+def newarea {
+    (let a \%1 b \%2 c \%3)
+    (sqrt (* (let s (/ (+ a b c) 2.0)) (- s a) (- s b) (- s c)))
+}
+
+   This would not work if LET were local to the S-Expression, but it
+   works nicely in the context of Kermit macros. The previous definition
+   is equivalent to:
+
+def newarea {
+    local a b c s
+    (setq a \%1 b \%2 c \%3)
+    (sqrt (* (setq s (/ (+ a b c) 2.0)) (- s a) (- s b) (- s c)))
+}
+
+   In both cases, the variables a, b, c, and s are local to the "newarea"
+   macro, and global within it.
+
+   Multiple assignments can be handled in several ways. Here is the
+   obvious way to initialize a series of variables to the same value:
+
+  (setq a 0)
+  (setq b 0)
+  (setq c 0)
+  (setq s 0)
+
+   Here is a more compact and efficient way of doing the same thing:
+
+  (setq a 0 b 0 c 0 s 0)
+
+   However, in case the value was more complex, it's better to put only
+   one copy of it in the S-Expression; in this case we rely on the fact
+   that SETQ returns the value of its last assignment:
+
+  (setq a (setq b (setq c (setq s (* x (^ y 2))))))
+
+   Similarly, to set a series of variables to x, x+1, x+2, ...
+
+  (setq c (+ (setq b (+ (setq a (+ (setq s x) 1)) 1)) 1))
+
+   In the last example, you can see why "last" does not always correspond
+   to "rightmost" (the leftmost variable "c" is assigned last).
+
+   If you are working with backslash variables like \%a or array elements
+   like \&a[1], remember two rules:
+    1. Don't put spaces inside array brackets.
+    2. You must double the backslash when using SETQ, LET, ++, or -- to
+       assign a value to a backslash variable.
+
+   Examples of assigning to a backslash variable:
+
+  (setq x 1)
+  (setq \\%a 0)
+  (setq \\&a[x+1] 1)
+  (++ \\%x)
+  (-- \\&a[x+2])
+
+   Examples of referring to a backslash variable's value:
+
+  (setq a (+ \%a 1))
+  (setq b (+ \%a \&a[1]))
+  (++ a \%x)
+  (-- b \&a[1])
+
+   The special notation is required because all backslashed items (\%x
+   variables, array elements, built-in \v(xxx) variables, and \fxxx()
+   function invocations) are evaluated in a single pass BEFORE the
+   S-Expression is executed; any other approach would result in
+   unacceptable performance. So, for example, in:
+
+  declare \&a[] = 1 2 3
+  define \%x 4
+  define \%y 0
+  (setq \\%y (+ \%x \&a[1]))
+
+   the S-Expression becomes:
+
+  (setq \%y (+ 4 1))
+
+   before it is sent to the S-Expression evaluator. If the backslash had
+   not been doubled on the assignment target, the result would have been:
+
+  (setq 0 (+ 4 1))
+
+   which is illegal because you can't assign a value to a number.
+   Conversely, if backslashes were doubled on right-hand-side values:
+
+  (setq \\%y (+ \\%x \\&a[1])
+
+   this too, would give an error (not numeric - "\%x").
+
+   If you omit the double backslash in the assignment target, the result
+   depends on whether the variable already has a value:
+
+  (setq \%a (* 3 3))
+
+   If \%a has a non-numeric single-word value, then this becomes the name
+   of the variable that is assigned by SETQ. To illustrate:
+
+  define \%a foo
+  echo \%a
+  foo
+  (setq \%a (* 3 3))
+  echo \%a
+  foo
+  show macro foo
+  foo = 9
+
+   If \%a has no value, a numeric value, or a multiword value, an
+   "invalid assignment" error occurs.
+
+   [ [515]Top ] [ [516]Contents ] [ [517]C-Kermit Home ] [ [518]Kermit
+   Home ]
+     _________________________________________________________________
+
+  9.7. Conditional Expressions
+
+   The IF operator provides a compact form of decision-making within
+   S-Expressions. An IF expression can stand wherever a number might
+   stand, as long is it returns a number. Here's a quick way to obtain
+   the average value of all the elements in an array that contains only
+   numbers:
+
+  (/ (+ \fjoin(&a)) (float \fdim(&a)))
+
+   This results in a "Divide by zero" error if the array is empty. If you
+   want to define the average value of an empty array to be 0 instead of
+   getting an error, you can use IF to check the array size:
+
+  (if \fdim(&a) (/ (+ \fjoin(&a)) (float \fdim(&a))) 0)
+
+   or equivalently:
+
+  (if (not \fdim(&a)) 0 (/ (+ \fjoin(&a)) (float \fdim(&a))))
+
+   Of course, IF can fit anywhere else into an S-Expression:
+
+  (setq a (+ b (if (< c 0) 0 c)))
+
+   and the IF expression can be as complex as you like:
+
+  (setq a (+ b (if (and (or (> x 0) (> y 0)) (< c 0) (> d 1) (!= e 0)) 1 0)))
+
+   and the "then" and "else" parts can contain multiple S-Expressions
+   enclosed within (EVAL ...):
+
+  (if x (eval (...) (...) (...)) (eval (...) (...) (...)))
+
+   AND and OR operators are guaranteed to "short circuit". If any operand
+   of AND is false, none of the subsequent operands is evaluated;
+   likewise, if an OR operand is true, no further operands are evaluated.
+
+   Bear in mind that the S-Expression IF is not the same as Kermit IF;
+   the condition is only allowed to be an S-Expression or a variable or
+   number, not the whole list of possibilities you see when you type "if
+   ?" at the C-Kermit> prompt. But keep reading...
+
+   [ [519]Top ] [ [520]Contents ] [ [521]C-Kermit Home ] [ [522]Kermit
+   Home ]
+     _________________________________________________________________
+
+  9.8. Extensibility
+
+   To extend the capabilities of S-Expressions, you can use Kermit macro
+   names as operators, with the following limitations:
+
+     * The macro must not have the same name as a built-in operator.
+     * You must use the full macro name, not an abbreviation.
+
+   And with the following enhancement:
+
+     * If the last statement executed by the macro is an S-Expression,
+       its value is returned automatically. In other words:
+
+  define bump (++ \%1)
+
+   is equivalent to:
+
+  define bump return \fsexpression(++ \%1)
+
+   Here's an example in which we define a FIBONACCI operator that returns
+   the nth element, n >= 0, of the Fibonacci series, 0 1 1 2 3 5 8 13 21
+   34 55, . . ., in which the first element is 0, the second is 1, and
+   each subsequent element is the sum of the two before it. This series
+   was devised by Leonardo Pisano, Filius Bonacci (Fibonacci for short)
+   in 1202 to describe how fast rabbits can breed, and also forms the
+   basis for the Golden Mean, the branching behavior of plants, the
+   spiral of a nautilus shell, etc. (Thanks to [523]Dat Thuc Nguyen for
+   December 2003 corrections to this section!)
+
+   We can write a FIBONACCI function as a macro easily with
+   S-Expressions:
+
+  define FIBONACCI {
+    (if (== \%1 0) 0
+        (if (== \%1 1) 1 (+ (fibonacci (- \%1 2)) (fibonacci (- \%1 1)))))
+  }
+
+   You can read this as:
+
+     If the argument (\%1) is 0, return a result of 0; if it is 1,
+     return 1; otherwise:
+     return the sum of fibonacci(argument - 2) and fibonacci(argument -
+     1)
+
+   Note that a RETURN statement is not needed, since S-Expressions
+   automatically set the return value of their containing macros.
+
+   For comparison, here's how it would be coded without S-Expressions:
+
+  define FIBONACCI {
+      if == \%1 0 {
+          return 0
+      } else if == \%1 1 {
+          return 1
+      } else {
+          return \feval(\fexec(fibonacci \feval(\%1-2)) -
+               + \fexec(fibonacci \feval(\%1-1)))
+      }
+  }
+
+   Now we can use the FIBONACCI function (whichever way you write it)
+   just as if it were a built-in operator:
+
+  (fibonacci 6)
+
+   Or:
+
+  (setq a 10)
+  (fibonacci a)
+
+   Within S-Expressions only (not outside them), S-Expressions themselves
+   can be used as macro arguments:
+
+  (setq a 2 b 4)
+  (setq x (fibonacci (* a b )))
+
+   The value of the S-Expression (in this case "8"), and not the
+   S-Expression itself, is sent to the macro.
+
+   Your macro is responsible for argument validation and error handling.
+   A robust Fibonacci macro would be more like this:
+
+  define FIBONACCI {
+      if < \v(argc) 2 end 1 ?\%0: Missing argument
+      if > \v(argc) 2 end 1 ?\%0: Too many arguments
+      if not integer \%1 end 1 ?\%0: Integers only
+      if < \%1 1 end 1 ?\%0: Argument out of range
+      (if (== \%1 0) 0
+         (if (== \%1 1) 1 (+ (fibonacci (- \%1 2)) (fibonacci (- \%1 1)))))
+  }
+
+   Recall that "END nonzero-number [ message ]" causes a macro invocation
+   to fail. When the macro is the operator in an S-Expression, this makes
+   the S-Expression fail too. Also note that our Fibonacci macro is just
+   an illustration, not a practical example. Since it is recursive (calls
+   itself), it won't work for large arguments because the call stack can
+   exceed available memory. See [524]Section 9.9.2 for a practical
+   alternative.
+
+   Kermit macros, when used as S-Expression operators, can do anything at
+   all except initiate file transfers: they can print messages on the
+   screen, read and write files, interact with the user, and so on. For
+   example, here's a macro ASKME that asks you to enter a number, makes
+   sure that you did, and then returns its value for use in the
+   S-Expression:
+
+  define ASKME {
+      local \%n
+      while true {
+          ask \%n { Number: }
+          if not def \%n continue
+          if not numeric \%n {
+              echo Not numeric - "\%n"
+              continue
+          }
+          break
+      }
+      return \%n
+  }
+  (setq a (* 2 (askme))) ; Get number from user, double it, assign result to a.
+
+   Here's a macro you can use to validate that a number is in a given
+   range:
+
+  define inrange {
+      if != \v(argc) 4 end 1 ?\%0: Wrong number of arguments
+      if ( < \%1 \%2 || > \%1 \%3 ) return 0
+      return 1
+  }
+
+   The first argument is the number to be checked, the second is the
+   minimum acceptable value, the third is the maximum. You can use this
+   (for example) in IF conditions:
+
+  define yes echo \%1 IS OK
+  define no echo \%1 IS NOT OK
+
+  (setq a -1 b 999)
+  (if (inrange a 0 100) (yes a) (no a))
+  (if (inrange b -1000 +1000) (yes b) (no b))
+
+   This is just an illustration, of course; there's already a built-in
+   operator to let you do range checking without help from macros:
+
+  (if (<= 0 a 100) (yes a) (no a))
+  (if (<= -1000 b +1000) (yes b) (no b))
+
+   To send string parameters to a macro, some kind of quoting is required
+   to tell the S-Expression parser to take a given "word" literally
+   rather than replacing it by its value. For this we use the Lisp QUOTE
+   operator:
+
+  define length return \flength(\%1)
+  (length (quote abcdefghijklmnopqrstuvwxyz))
+  26
+
+   This causes the string "abcdefghijklmnopqrstuvwxyz" to be sent
+   literally to the LENGTH macro. Kermit, like Lisp, also offers a
+   shortcut for QUOTE, that lets us quote a word by prefixing it with a
+   single quote (') character, also called apostophe (ASCII 39):
+
+  (length 'abcdefghijklmnopqrstuvwxyz)
+  26
+
+   The two forms are equivalent.
+
+   How the macro treats its arguments is up to the macro. In the example
+   above, the argument is treated as a literal string. However, it can
+   also be treated as a variable name:
+
+  define string This is a string
+  define length return \flength(\m(\%1))
+  (length 'string)
+  16
+
+   Note the construct \m(\%1). This means "the value of the macro whose
+   name is the value of
+   \%1". The value of \%1 in this case is the word "string", and the
+   value of the macro whose name is "string" is "This is a string".
+
+   What if the macro takes multiple arguments, or a variable number of
+   them? Here's a simple macro that prints a phrase that includes its
+   arguments:
+
+  define complain echo It's too \%*!
+
+   (Recall that \%* means "all arguments".)
+
+   It can be called in the traditional way:
+
+  complain hot                       Result: "It's too hot!"
+  complain cold and wet              Result: "It's too cold and wet!"
+
+   Or from an S-Expression if you quote the arguments:
+
+  (complain 'hot)                    Result: "It's too hot!"
+  (complain 'cold 'and 'wet)         Result: "It's too cold and wet!"
+
+   To group multiple words into a single argument, use parentheses:
+
+  (complain (quote (cold and wet)))  Result: "It's too cold and wet!"
+  (complain '(cold and wet))         Result: "It's too cold and wet!"
+
+   Note the difference:
+
+  (complain 'cold 'and 'wet)         Three arguments
+  (complain '(cold and wet))         One argument
+
+   Since the COMPLAIN macro uses \%* to refer to all its arguments, no
+   matter how many, it doesn't care which form you use. But it makes a
+   difference in cases where the macro refers to its arguments
+   individually.
+
+   To illustrate, let's consider a macro that receives the name of a
+   macro and its argument list and executes it with its arguments,
+   without knowing how many arguments there are. The following LOOP macro
+   is used to execute the given macro with the given argument list the
+   requested number of times:
+
+  def loop { local i, for i 1 \%1 1 do \%2 \%3 }
+
+   Within the LOOP macro, the first argument (\%1) is the loop count, \%2
+   is the macro name, and \%3 is the argument list. When the LOOP macro
+   is invoked traditionally like this:
+
+  loop 3 complain hot
+
+   it prints "It's too hot!" three times. To invoke it from an
+   S-Expression, you must quote both the macro name as well as the
+   argument, since in this case the macro name itself is an argument:
+
+  (loop 3 'complain 'hot)
+
+   Now what if you need to send different or variable numbers of
+   arguments to the LOOP macro? The LOOP macro can handle it already,
+   provided you group the arguments into LOOP's third argument (\%3). In
+   Kermit syntax, without grouping:
+
+  loop 3 complain cold and wet
+
+   prints "It's too cold!" three times ("and wet" is lost); but with
+   grouping (either of the following two forms):
+
+  loop 3 complain {cold and wet}
+  loop 3 complain "cold and wet"
+
+   the LOOP macro prints "It's too cold and wet!" three times as desired.
+
+   To do the same thing in an S-Expression, just use the Lisp forms of
+   quoting instead of the Kermit forms; the following two are equivalent:
+
+  (loop 3 'complain (quote (cold and wet)))
+  (loop 3 'complain '(cold and wet))
+
+   Here's a similar example in which we write a macro that shows both the
+   name and the value of one or more other macros, whose names are given
+   as arguments (similar to "show macro"):
+
+  define display {
+      local \%i
+      for \%i 1 \v(argc)-1 1 {
+          echo \&_[\%i] = \m(\&_[\%i])
+      }
+  }
+
+   (Recall that \&_[] is the macro's argument vector array, equivalent to
+   \%1, \%2, ...) The DISPLAY macro can be used in S-Expressions like
+   this:
+
+  (setq a 1 b 2 c 3)
+  (display 'a 'b 'c 'd)
+
+   which prints:
+
+  a = 1
+  b = 2
+  c = 3
+  d =
+
+   The names must be quoted to prevent their evaluation before they are
+   sent to the macro. This ability to pass variables "by name" to macros,
+   rather than by value, lets you write macros that change the values of
+   argument variables. For example, here's a macro that doubles the value
+   of its argument variable:
+
+  define double (++ \%1 \%1)
+
+   which you can call like this:
+
+  (setq a 12)
+  (double 'a)
+
+   In the macro, \%1 is replace by the variable name "a"; "(++ a a)" adds
+   "a" to itself, and sets the value of "a" to the result.
+
+   There are no built-in operators other than QUOTE, ', and STRING for
+   handling strings in S-Expressions, but using just these, plus macros
+   that use Kermit's regular string-handling features, you can easily
+   extend S-Expressions to do string manipulation:
+
+  define len return \flen(\%1)               Returns length of argument string
+  define cap return \fupper(\%1)             Uppercase argument string
+  define rev return \freverse(\%1)           Reverses argument string
+  define sub return \fsubstr(\%1,\%2,\%3)    Returns substring of arg string
+
+  (len '(this is a string))                  Result: 16
+  (rev '(this is a string))                  Result: gnirts a si siht
+  (rev (cap '(this is a string)))            Result: GNIRTS A SI SIHT
+  (sub (rev (cap '(this is a string))) 5 9)  Result: TS A SI S
+
+   You can assign a string to a macro name as follows:
+
+  (setq foo '(this is a string))
+  (setq foo (quote (this is a string)))
+
+   The two are exactly equivalent. In both cases, the macro "foo" has the
+   value:
+
+  '(this is a string)
+
+   so when it is retrieved it can be identified as a string rather than a
+   number or commands to be executed. Thus:
+
+  (setq foo (quote (this is a string)))
+  show macro foo
+  foo = '(this is a string)
+  (foo)
+  this is a string
+
+   Note the different results for "show macro foo" and "(foo)". The
+   former shows the internal definition; the latter evaluates the
+   variable, which removes the quoting. And perhaps more important, note
+   that if the apostrophe and surrounding parentheses were not stored as
+   part of the definition, (foo) would try to execute "this is a string"
+   as a command.
+
+   Given the assignment above, the following work as expected:
+
+  (len foo)                                  Result: 16
+  (rev foo)                                  Result: gnirts a si siht
+  (rev (cap foo))                            Result: GNIRTS A SI SIHT
+  (sub (rev (cap foo)) 5 8)                  Result: TS A SI S
+
+   Note that, unlike built-in S-Expression operators that return numbers
+   or truth values, these operators return strings. If you want to assign
+   their return values to other variables, you can do so:
+
+  (setq bar (rev (cap foo)))                 Result: GNIRTS A SI SIHT
+
+   But now the S-Expression processor doesn't know the value of "bar" is
+   supposed to be a string, rather than a macro to execute. For this you
+   need one final special operator, STRING. The STRING operator takes an
+   S-Expression as an operand, evaluates it, and then returns its value
+   enclosed in '(), so you can use the value as a string is subsequent
+   S-Expressions. Use STRING for referencing macros that return strings:
+
+  (setq bar (string (rev (cap foo))))        Result: '(GNIRTS A SI SIHT)
+
+   STRING is like QUOTE, except that it evaluates its operand before
+   applying the quoting, rather than taking the operand literally.
+
+   To reference backslash variables or functions that return string
+   values, you must use the regular quoting mechanisms:
+
+  (setq time '(\v(time)))
+  (setq date '(\v(date)))
+  assign \%r this is a string
+  (setq s1 '(\%r))
+
+   That's because backslash items are evaluated BEFORE the S-Expression
+   parser ever sees them, and the values of \v(time) and so on are not
+   valid S-Expressions, so STRING won't like them.
+
+   Finally a brief word on the touchy topic of quoting. Suppose you want
+   to include (say) literal parentheses in a string that will later be
+   processed by the S-Expression reader (or \fsplit() or \fword()).
+   Normally, you can't do this because parentheses are meaningful in
+   these contexts. To defeat the normal parsing rules, you can quote the
+   parentheses with backslash. However, due to the many levels of string
+   processing involved, a surprisingly large amount of backslashes might
+   be required, for example:
+
+  (setq s '(a b (c d) \\\\\\\\\\\\\\\\(e f (g h) x\\\\\\\\\\\\\\\\) j k))
+
+   This is nearly impossible to explain(*). Instead, just remember two
+   points:
+
+     * In situations like this, it's better to use DEFINE to create the
+       string, rather than SETQ. The example above requires only double
+       backslashes when DEFINE is used:
+  define s '(a b (c d) \\(e f (g h) x\\) j k)
+     * The level of quoting depends on how many levels of evaluation the
+       string must pass through, which is not always obvious. However,
+       the number of backslashes required in any given situation is
+       always a power of 2. So if 1 doesn't work, try 2; if 2 doesn't
+       work, try 4; if 4 doesn't work, try 8, 16, 32, and so on.
+
+   Considerations like this apply in any scripting language (shell, Tcl,
+   Perl, Python, etc). The situation is known as "Quoting Hell".
+
+   (*) If you really want an explanation, here it is:
+
+     * Every SEXP has its backslash items evaluated in a single pass at
+       top level before being passed to the SEXP reader, so \%1,
+       \v(ftime), etc, can be evaluated up front, freeing the SEXP reader
+       of having to know about such things, which in turn makes it much
+       more efficient. Therefore one level of quoting is lost right away,
+       and therefore you must double each backslash that is to be used as
+       a quote.
+     * When the SEXP reader sees '\', it treats it as a quote; discards
+       it and keeps the next character. Thus '\\' becomes '\'. This would
+       be the end of it, except that:
+     * The SEXP reader must call itself recursively on its operands, so
+       we must double any quotes in the operands: 2^2 = 4.
+     * If the result is to be passed as an argument to a macro, the
+       backslashes must again be doubled, because the macro processor
+       evaluates the arguments before sending them to the macro: 2^3 = 8.
+     * If the macro itself is to see the quotes, rather than just the
+       result of the quoting, the quotes must be doubled again: 2^4 = 16.
+
+   Moral: To create string constants in which grouping characters must be
+   quoted, use DEFINE rather than SETQ.
+
+   [ [525]Top ] [ [526]Contents ] [ [527]C-Kermit Home ] [ [528]Kermit
+   Home ]
+     _________________________________________________________________
+
+  9.9. Examples
+
+    9.9.1. Statistics
+
+   The following program computes statistics -- means, maxima, mimima,
+   variance, standard deviation, and correlation -- from data stored in
+   parallel arrays, \&x[] and \&y[], which can contain any mixture of
+   integer and floating-point numbers: positive, negative, or zero. Array
+   setup and validation are not shown. Except for the traditional FOR
+   loop and printing the results at the end, the entire computation is
+   done with S-Expressions:
+
+; Initialize sums, maxima, minima, and number of elements
+
+  (setq xsum 0 ysum 0 xsum2 0 ysum2 0 xysum 0)
+  (setq xmin (setq xmax \&x[1]) ymin (setq ymax \&y[1]))
+  (setq n \fdim(&x))
+
+; Loop through elements and accumulate sums, maxima, and minima
+
+  for i 1 n 1 {
+      (setq x \&x[i] y \&y[i])                    ; Notational convenience
+      (setq xmax (max xmax x) ymax (max ymax y))  ; X and Y maxima
+      (setq xmin (min xmin x) ymin (min ymin y))  ; X and Y minima
+      (++ xsum x ysum y)                          ; X and Y sums
+      (++ xsum2 (^ x 2) ysum2 (^ y 2))            ; Sum of X and Y squares
+      (++ xysum (* x y))                          ; Sum of XY products
+  }
+
+; Calculate results
+
+  (setq xmean (/ xsum n) ymean (/ ysum n))        ; Mean X and Y
+  (setq xss (- xsum2 (/ (^ xsum 2) n)))           ; Intermediate values
+  (setq yss (- ysum2 (/ (^ ysum 2) n)))
+  (setq xyss (- xysum (/ (* xsum ysum) n)))
+  (setq xvar (/ xss n) yvar (/ yss n))            ; X and Y variance
+  (setq sdx (sqrt xvar) sdy (sqrt yvar))          ; Std deviation in X and Y
+  (setq tmp (* xss yss))
+  (setq cc (if tmp (/ xyss (sqrt tmp)) 1.0))      ; Correlation coefficient
+  show macro xmean ymean xvar yvar sdx sdy cc     ; Print the results
+
+   The final "if tmp" check accounts for the possibility that both arrays
+   contain all 0's. Results can also be printed with "echo CC = \m(cc)",
+   or any other desired way. Interestingly, if we had not needed the sum
+   of the squares and products, we could have obtained the sums, maxima,
+   and minima of the X's and Y's without a loop like this:
+
+  (setq xsum (+ \fjoin(&x)) ysum (+ \fjoin(&y)))
+  (setq xmax (max \fjoin(&x)) ymax (max \fjoin(&y)))
+  (setq xmin (min \fjoin(&x)) ymin (min \fjoin(&y)))
+
+   Any Kermit function that returns numbers or lists of numbers can be
+   included in an S-Expression as an operand.
+     _________________________________________________________________
+
+    9.9.2. Practical Fibonacci Series
+
+   The recursive Fibonacci example given previously is simple and
+   elegant, but not very useful since it causes memory occupation to grow
+   each time it calls itself, until eventually both physical memory and
+   disk swap space are filled and the program crashes. Even for small
+   arguments, like 17, execution time can be prohibitive:
+
+  (setq t1 \v(ftime))
+  (setq result (fibonacci 17))
+  (setq t2 (- \v(ftime) t1))
+  echo FIBONACCI(17) = \m(result): TIME = \ffpround(t2,3)
+
+   prints (on a certain rather slow computer):
+
+  FIBONACCI(17) = 1597: TIME = 5.861
+
+   Any recursive function can be recoded iteratively. The result is not
+   as pretty, but execution is far less expensive:
+
+    define FIBITER {
+        (if (== \%3 0) (\%2) (fibiter (+ \%1 \%2) \%1 (- \%3 1)))
+    }
+    define FIBONACCI {
+        (fibiter 1 0 \%1)
+    }
+
+   Here's the result on the same computer for the same argument of 17:
+
+  FIBONACCI(17) = 1597: TIME = 0.015
+
+   (47 times faster.) Execution time increases proportionally to the size
+   of the argument in the iterative case, whereas in the recursive case
+   it goes up geometrically, quickly reaching infinity.
+
+   [ [529]Top ] [ [530]Contents ] [ [531]C-Kermit Home ] [ [532]Kermit
+   Home ]
+     _________________________________________________________________
+
+  9.10. Differences from Algebraic Notation
+
+   In C-Kermit:
+
+     * Algebraic notation uses infix operators and normal rules of
+       operator precedence, with parentheses used to force exceptions to
+       the rules; many operations can be included in an expression.
+       S-Expressions use prefix operators with no intrinsic precedence;
+       each operation is enclosed in parentheses, and the arrangement of
+       parentheses determines precedence.
+     * Algebraic infix operators require two operands; S-Expression
+       prefix operators can accept a variable number of operands.
+     * You can use algebraic notation anywhere that C-Kermit accepts a
+       number, e.g. "echo \&a[((1+1)*2-1]", but you can use S-Expressions
+       only as top-level commands. You can, however, use either algebraic
+       or S-Expressions anywhere at all by enclosing them in \fevaluate()
+       or \fsexpression(), respectively.
+     * You can use any mixture of integer and floating-point numbers in
+       S-Expressions, but only integers are permitted in algebraic
+       expressions. Outside of S-Expressions, floating point arithmetic
+       is supported only by \ffp...() function calls.
+     * Operators and operands in S-Expressions must be separated by
+       spaces, e.g. "(+ a b)". Spaces are not required in algebraic
+       expressions: "((a+b)*c)".
+     * When assigning values to backslash variables (such as \%x or
+       \&a[2]) using SETQ or LET, you must double the backslash.
+
+   [ [533]Top ] [ [534]Contents ] [ [535]C-Kermit Home ] [ [536]Kermit
+   Home ]
+     _________________________________________________________________
+
+  9.11. Differences from Lisp
+
+     * Kermit has a lot of built-in operators not found in Lisp: ++, ^,
+       etc.
+     * Most dialects of real Lisp do not allow S-Expressions that don't
+       start with an operator, for example:
+  (a)
+       This expression can cause an error in Lisp (even if "a" has a
+       value), but is acceptable in Kermit, where it returns the value of
+       the variable "a". Similarly, (1) returns the value "1".
+     * In real Lisp, EVAL requires exactly one operand. In Kermit, it can
+       have 0, 1, 2, or more operands. It returns the value of the last
+       operand evaluated.
+     * Real Lisp SETQ and LET usually require an even number of operands.
+       Kermit allows an odd number, in which case the last (or only)
+       variable is undefined (i.e. deleted, destroyed).
+     * Kermit does not support ratios such as "7/8". Some Lisp dialects
+       accept ratios as numbers, and generate ratios when told to divide
+       two integers whose quotient is not a whole number; e.g. in Common
+       Lisp:
+  [13] USER(37): (/ (+ 1 2 3 4) 3)
+  10/3
+  [13] USER(38):
+     * The result of (/ 10 3) is 3.333.... Some Lisp dialects truncate
+       the result to 3 since both operands are integers, some don't; some
+       give the result as a ratio. C-Kermit always gives a floating point
+       result when there is a fractional part. If you want an integer
+       result, you can use TRUNCATE, FLOOR, or CEILING, e.g. (truncate (/
+       10 3)).
+     * There is currently no "bignum" support. Large numbers can be used
+       and large results generated, but (as noted in [537]Section 9.2)
+       they are accurate only to the precision of the underlying machine.
+       \v(math_precision) gives the machine precision as a number of
+       decimal digits, e.g. 16.
+     * Scientific notation for floating-point numbers is not supported.
+       If the magnitude of a number is greater than the precision of the
+       underlying hardware, the less-significant digits are shown but
+       their values are meaningless. If it the number is too small to be
+       represented internally, it is shown as "0.0".
+     * Many Lisp features are omitted: List processing (CAR, CDR, etc),
+       DEFUN, Lisp-specific control structures, and so on.
+
+   [ [538]Top ] [ [539]Contents ] [ [540]C-Kermit Home ] [ [541]Kermit
+   Home ]
+  __________________________________________________________________________
+
+10. FILE TRANSFER
+
+   New commands and switches:
+
+   SET TRANSFER REPORT { OFF, ON }
+          Enables or disables the (new) one-line message printed by
+          Kermit after a remote-mode file transfer to indicate the source
+          and destination file, complete with path, to let you know where
+          the file went.
+
+   SEND /TYPE:{TEXT,BINARY}
+          Sends only files of the given type (see [542]Section 4).
+
+   SEND /NOFOLLOWLINKS:
+          (UNIX only) Skip over symbolic links rather than following them
+          (default). This applies to wildcard and/or recursive SENDs; if
+          a single filename is given, and it happens to be a symbolic
+          link, the file it points to is sent.
+
+   SEND /FOLLOWLINKS:
+          (UNIX only) Follow (resolve) symbolic links. Watch out for
+          circular links, endless loops, etc.
+
+   SET SEND I-PACKETS { OFF, ON }
+          When sending commands to a Kermit server, this tells whether
+          command packets should be preceded by an I (information)
+          packet, which is used to synchronize parameters prior to
+          executing the command. Normally ON. The only reason to set this
+          OFF is for communicating with buggy Kermit servers that
+          misbehave when an I packet is sent to them. There is also a SET
+          RECEIVE I-PACKETS command, but presently it has no effect.
+
+   SET TRANSFER MESSAGE [ text ]
+          Sets an initial message to be shown in the Last Message field
+          of the fullscreen file-transfer display.
+
+   SET TRANSFER TRANSLATION { ON, OFF }
+          Inhibits or re-enables text-file transfer character-set
+          translation globally.
+
+   { SEND, MSEND, GET, RECEIVE } /TRANSPARENT
+          Inhibits character-set translation for this transfer only.
+
+   { GET, RECEIVE } /PIPES:{ON,OFF}
+          Overrides global TRANSFER PIPES setting for this transfer only;
+          ON allows incoming files with names like "!tar xf -" to be
+          opened as pipelines rather than regular files.
+
+   The following new "hot keys" are available when Kermit's file-transfer
+   display is visible:
+
+     D: Turn on debugging, open "debug.log" if not already open.
+     d: Turn off debugging but leave log open (if it was open).
+     T: Turn on debug-log timestamps.
+     t: Turn off debug-log timestamps.
+
+   Other improvements:
+     * SET FILE DOWNLOAD-DIRECTORY now works for external protocols (e.g.
+       sz/rz) too.
+     * Improved automatic per-file text/binary switching, described in
+       [543]Section 4.
+     * When sending a file group (e.g. "send *.*"), failure to open a
+       file is no longer fatal; now C-Kermit simply goes ahead to the
+       next file.
+     * Transaction log entries are now made for external protocols too.
+
+   [ [544]Top ] [ [545]Contents ] [ [546]C-Kermit Home ] [ [547]Kermit
+   Home ]
+  __________________________________________________________________________
+
+11. MODEMS AND DIALING
+
+   In C-Kermit 8.0, the default modem type for dialing has changed from
+   NONE (= DIRECT, meaning no modem) to GENERIC. This change should have
+   no impact on direct connections. For dialing, it means that, unless
+   you SET MODEM TYPE to a specific type, such as USROBOTICS or CONEXANT,
+   Kermit assumes:
+
+    1. The modem uses the Hayes AT command set.
+    2. The modem supports error correction, data compression, and
+       hardware flow control and is already configured to use them.
+
+   In fact, Kermit assumes the modem is completely configured, and
+   therefore does not send it an initialization string or any
+   configuration commands. Instead, it sends only the simplest and most
+   portable commands:
+
+     ATQ0V1          Give dial result codes.
+     ATDTnumber      Dial the number.
+
+   (or ATD or ATDP, as appropriate).
+
+   The new defaults work for direct connections and for most modern
+   modems on most platforms, and they work much faster than
+   "full-treatment" dialing. If the new defaults don't work for you, or
+   if you need to perform explicit modem configuations or interactions,
+   then set a specific modem type and use the SET MODEM and SET DIAL
+   commands as documented in Using C-Kermit.
+
+     WARNING: Don't use the generic modem on hosts that do not support
+     RTS/CTS flow control. If Xon/Xoff is in use on the serial port,
+     you'll need to select a particular modem type so Kermit knows what
+     command to give it to enable Xon/Xoff flow control between itself
+     and your serial port.
+
+   The following new modem types were added in C-Kermit 8.0:
+
+     lucent:          Lucent Venus chipset
+     pctel:           PCTel V.90 chipset
+     conexant:        Conexant (ex-Rockwell) modem family
+     zoom-v32bis:     New name for "Zoom"
+     zoom-v34         Zoom V.34
+     zoom-v90         Zoom V.90 56K
+     zoom-v92:        Zoom V.92 with V.44 data compression
+     zoltrix-v34:     New name for "zoltrix"
+     zoltrix-hsp-v90: Synonym for PCTel
+     zoltrix-hcf-v90: Synonym for ITU-T-V250
+     smartlink-v90:   Synonym for usrobotics (same chipset)
+     acer-v90:        Synonym for Rockwell-v90
+
+   New DIAL-related variables:
+
+     \v(dm_hf):  Dial modifier: Wait for Hook-Flash.
+     \v(dm_wb):  Dial modifier: Wait for Bong.
+
+   Finally, if dialing fails, Kermit now prints a context-sensitive hint
+   suggesting possible reasons and remedies.
+
+   Added in C-Kermit 8.0.201:   Rudimentary support for Caller ID, for
+   use with the ANSWER command. If the modem reports Caller ID
+   information, Kermit stores it in variables that you can access after
+   the call is answered:
+
+  \v(callid_date)   The date of the call
+  \v(callid_time)   The time of the call
+  \v(callid_name)   The name of the caller
+  \v(callid_nmbr)   The telephone number of the caller
+  \v(callid_mesg)   A message
+
+   The format of these items depends on the originating and answering
+   phone companies and the modems and their configuration.
+
+   Not very many modems support Caller ID, and those that do (a) tend to
+   have it disabled by default, and (b) use different commands to enable
+   it. A quick survey shows of some current models shows:
+
+   - USR V.90:      No
+   - ITU-T V.250:   No
+   - Lucent Venus:  No
+   - Diamond Supra: #CID=1
+   - Rockwell 56K:  #CID=1
+   - PCTEL:         #CID=1
+   - Zoltrix:       +VCID=1
+   - Conexant:      +VCID=1
+
+   To use Kermit's Caller ID feature, you have to set the modem to wait
+   for at least two rings before answering, and you have to give the
+   command to enable Caller ID; for example (after choosing a modem with
+   SET MODEM TYPE):
+
+  set modem command autoanswer on ATS0=2#CID=1\{13}
+  set modem command autoanswer on ATS0=2+VCID=1\{13}
+
+   These commands can be undone with:
+
+  set modem command autoanswer on ATS0=1#CID=0\{13}
+  set modem command autoanswer on ATS0=1+VCID=0\{13}
+
+   Kermit presently has no built-in knowledge of the Caller ID
+   capabilities or commands of the modems in its database.
+
+   Since the variables can be accessed only after the call is answered,
+   the only way to refuse a call is to answer it, inspect the variables,
+   and then hang it up if desired.
+
+   [ [548]Top ] [ [549]Contents ] [ [550]C-Kermit Home ] [ [551]Kermit
+   Home ]
+  __________________________________________________________________________
+
+12. TERMINAL CONNECTION
+
+   Now that 7-bit connections are no longer the norm, the default
+   terminal bytesize (also called "data size" or "word size") in C-Kermit
+   8.0 is 8 bits, rather than 7 bits as it was in C-Kermit 7.0 and
+   earlier:
+
+   SET ESCAPE character
+          This command, which specifies your CONNECT-mode escape
+          character, allows you to specify any ASCII control character in
+          a variety of formats. C-Kermit 8.0.201 now also lets you
+          specify any 8-bit value, 128-255, as the escape character. In
+          the SET ESCAPE command, you can type the 8-bit character
+          literally or you can enter its numeric code. Here are examples
+          that you can enter from a terminal or console that uses the ISO
+          Latin-1 character set:
+
+  C-Kermit> set escape Ãƒ
+  C-Kermit> set escape 195
+  C-Kermit> show escape
+   Escape character: Code 195 (Ã): enabled
+  C-Kermit>
+
+          Both of these commands set the escape character value to 195
+          (decimal), which happens to be uppercase letter A with Tilde in
+          Latin-1. SHOW ESCAPE and SHOW TERMINAL show the value, as does
+          the CONNECT message.
+
+   SET TERMINAL AUTODOWNLOAD ERROR { STOP, CONTINUE }
+          When Kermit has a terminal connection to another computer, and
+          a file transfer is initiated automatically because a Kermit
+          packet was received in CONNECT mode (i.e. in the terminal
+          screen), this command tells what Kermit should do if the
+          transfer fails. The default is to STOP, which leaves Kermit in
+          command mode with its file-transfer display showing, so you can
+          see that the transfer failed and why. If you SET TERMINAL
+          AUTODOWNLOAD ERROR CONTINUE, this causes Kermit to return
+          automatically to its terminal screen (i.e. resume its CONNECT
+          session) as if the transfer had succeeded; this can be
+          desirable if the entire session is under control of a
+          host-based script.
+
+   SET TERMINAL BYTESIZE { 7, 8 }
+          The byte size to use during CONNECT and INPUT command
+          execution, which can be more restrictive than the bytesize
+          implied by the current PARITY setting, but not less
+          restrictive. In C-Kermit 7.0 and earlier, the terminal bytesize
+          was 7 by default to protect against the likelihood that parity
+          was in use on the connection without the user's knowledge. When
+          the terminal bytesize is 8 (as it is in C-Kermit 8.0 and
+          later), the user will see garbage in this (increasingly
+          unlikely) situation. Note that 8 data bits are required for
+          most character sets other than ASCII: Latin-1, UTF-8, and so
+          on.
+
+   A new command has been added to produce timestamped session logs:
+
+   SET TERMINAL SESSION-LOG TIMESTAMPED-TEXT
+          Records the terminal session in text mode (like SET TERMINAL
+          SESSION-LOG TEXT) but adds a timestamp at the beginning of each
+          line. The timestamp format is hh:mm:ss.nnn, and indicates the
+          time at which the first character of the line appeared.
+
+   In most UNIX versions (those built with the select()-capable CONNECT
+   module -- pretty much all the ones that have or could have TELNET
+   included), an idle timeout feature has been added:
+
+   SET TERMINAL IDLE-TIMEOUT number
+          If the number is not 0, then Kermit is to take an action when
+          the given amount of time passes with no activity during CONNECT
+          mode. If the number is positive it is the maximum number of
+          idle seconds; if number is negative it represents milliseconds
+          (thousandths of seconds). If 0 is given as the number, there
+          are no idle timeouts. Synonym: SET TERMINAL IDLE-LIMIT.
+
+   SET TERMINAL IDLE-ACTION { RETURN, HANGUP, EXIT, OUTPUT [ string ] }
+          The action to be taken upon an idle timeout in CONNECT mode.
+          RETURN to the prompt, HANGUP the connection, EXIT from Kermit,
+          or OUTPUT the given string (if no string is given, a NUL (ASCII
+          0) character is sent).
+
+   SET TERMINAL IDLE-ACTION { TELNET-NOP, TELNET-AYT }
+          Actions that can be selected on Telnet connections only, that
+          might be useful if idle limits are enforced by the Telnet
+          server or in the TCP/IP protocol: TELNET-NOP sends a "NO
+          Operation" (do-nothing) command, which causes no response from
+          the server; TELNET-AYT sends an "Are You There" message to the
+          server, which should make the server send back a message.
+          Neither of these actions interferes with your remote session.
+
+   SET TERMINAL IDLE-ACTION is useful for connections to hosts or
+   services that automatically log you out after a certain amount of idle
+   time, e.g.:
+
+  set term idle-timeout 300
+  set term idle-action output \32
+
+   sends a space (as if you had pressed the space bar) every 300 seconds
+   (five minutes) while there is no activity (32 is the ASCII code for
+   space).
+
+   When C-Kermit returns from CONNECT to command mode, the reason for the
+   transition is given in a new variable, \v(cx_status):
+
+      0  No CONNECT command given yet.
+      1  User escaped back manually.
+      2  A trigger string was encountered.
+      3  IKSD entered server mode.
+      4  Application Program Command received from host.
+      5  Idle timeout.
+      6  Telnet protocol error.
+      7  Keystroke macro.
+      8  Time limit exceeded.
+    100  Internal error.
+    101  Carrier required by not detected.
+    102  I/O error on connection.
+    103  Disconnected by host.
+    104  Disconnected by user.
+    105  Session limit exceeded.
+    106  Rejected due to Telnet policy.
+    107  Received kill signal.
+
+   Values 100 and above indicate there is no connection.
+
+   [ [552]Top ] [ [553]Contents ] [ [554]C-Kermit Home ] [ [555]Kermit
+   Home ]
+  __________________________________________________________________________
+
+13. CHARACTER SETS
+
+   See the section on [556]file scanning above, and the section on
+   character-set conversion in [557]FTP. Also:
+
+     * True support for CP1252 (rather than treating it as Latin-1).
+     * Proper handling of C1 values when converting ISO 8-bit text to
+       UTF-8.
+     * TYPE /CHARACTER-SET: /TRANSLATE-TO: allows specific translations.
+     * The TRANSLATE command now works on multiple files.
+     * K_CHARSET environment variable to set the file character-set.
+     * SET TRANSFER TRANSLATION OFF.
+     * FTP client character-set translation ([558]Section 3.7).
+
+   [ [559]Top ] [ [560]Contents ] [ [561]C-Kermit Home ] [ [562]Kermit
+   Home ]
+  __________________________________________________________________________
+
+14. DIALOUT FROM TELNET TERMINAL SERVERS
+
+   For years, C-Kermit has supported dialing out from Telnet modem
+   servers (also called reverse terminal servers or access servers), but
+   until now there was no way for Kermit to control the communication
+   parameters (speed, parity, etc) on the serial port of the terminal
+   server; it had to use whatever was there.
+
+   But now, if you make a connection to a server that supports the Telnet
+   Com Port Control Option, [563]RFC 2217, you have the same degree of
+   control as you would have over a serial port on the computer where
+   Kermit is running: SET SPEED, SET FLOW, SET PARITY, SET STOP-BITS,
+   SHOW COMM, WAIT, SET CARRIER-WATCH, the modem-signal variables,
+   sending Break, and so on, apply to the connection between the terminal
+   server and the modem.
+
+   For example, using a Cisco Access Server 2509, where specifying a TCP
+   port in the 6000's selects a serial port that can be used for dialing
+   out:
+
+  set host xxx 6001      ; xxx is the IP hostname or address of the server
+  (log in if necessary)  ; With a script or by hand
+  set modem type usr     ; Tell Kermit what kind of modem it has
+  set speed 57600        ; This affects the server's port
+  set flow rts/cts       ; Ditto
+  dial 7654321
+
+   The modem server might or might not require a login sequence. It might
+   also allow for automatic authentication, e.g. via Kerberos tickets.
+   NOTE: If the modem server requires a login sequence, then REDIAL might
+   not work as expected.
+
+   When you have a Telnet Com Port connection, your SET SPEED and SET
+   FLOW options change automatically to reflect the capabilities of the
+   server, rather than those of your local computer.
+
+   See the configuration manual for your server for additional
+   information. For example, how to set up the server to drop the Telnet
+   connection automatically when the telephone call is hung up (e.g.
+   "autohangup" on Cisco models).
+
+   For a Linux-based Telnet Com-Port server, click the Srdird link:
+
+   [ [564]Top ] [ [565]Contents ] [ [566]Sredird ] [ [567]C-Kermit Home ]
+   [ [568]Kermit Home ]
+  __________________________________________________________________________
+
+15. COPING WITH BROKEN KERMIT PARTNERS
+
+   There are lots of faulty Kermit protocol implementations out there,
+   found mainly in 3rd-party products ranging from communications
+   software packages to file-transfer functions imbedded within devices.
+   This topic is covered [569]HERE for C-Kermit 7.0, but C-Kermit 8.0
+   adds some additional tricks.
+
+   SET ATTRIBUTE RECORD-FORMAT { ON, OFF }
+          Allows control of the Kermit's Record-Format attribute. Set
+          this to OFF in case incoming file are refused due to unknown or
+          invalid record formats if you want to accept the file anyway.
+
+   SET SEND I-PACKETS { ON, OFF }
+          A Kermit server is supposed to accept I-packets; this is how
+          the client lets the server know its capabilities and
+          preferences before sending a command. Apparently there is at
+          least one Kermit server implementation that does not accept
+          I-packets, and does not properly respond with an Error packet
+          if it gets one. To get around such situations in C-Kermit 8.0,
+          you can use SET SEND I-PACKETS OFF to inhibit the sending of I
+          packets. In this case, the client must be able to adjust to the
+          server's configuration, rather than the other way around as we
+          are used to.
+
+   SET PROTOCOL KERMIT {} {} {}
+          C-Kermit 6.0 and later automatically send "autoupload" and
+          "autodownload" commands when in local mode and you give a file
+          transfer command. For example, if you tell kermit to "send
+          oofa.txt", Kermit sends "kermit -r" and a carriage return, in
+          case you had forgotten to start Kermit on the far end and told
+          it to receive a file. If a Kermit program had already been
+          started on the far end, it should harmlessly absorb this
+          string. However, some Kermit programs violate the Kermit
+          protocol definition and treat such strings as Kermit packets
+          even though they are not. In such cases, give this command to
+          set the Kermit protocol autoupload and download strings to
+          nothing, which tells Kermit not to send them. (This is not a
+          new feature, but it was not previously included in the "Coping"
+          section of the documentation.)
+
+   [ [570]Top ] [ [571]Contents ] [ [572]C-Kermit Home ] [ [573]Kermit
+   Home ]
+  __________________________________________________________________________
+
+16. NEW COMMAND-LINE OPTIONS
+
+   kermit -h Now prints a complete listing of its command-line options,
+   rather than an abbreviated list squeezed into a 24x80 space.
+
+   -dd              Debug, like -d but adds timestamps
+   --version  Shows C-Kermit version number.
+   --noperms  Equivalent to SET ATTRIBUTE PROTECTION OFF.
+
+   Kermit now accepts a selection of URLs (Universal Resource Locators)
+   as its first command-line argument. These are:
+
+   telnet:hostname
+          Makes a Telnet connection to the given host (IP hostname or
+          address).
+
+   ftp://[user[:password]@]hostname[/path...]
+          Makes an FTP connection to the given host (IP hostname or
+          address). If a username is given, Kermit tries to log you in;
+          if a password is given, it is used; if not, you are prompted
+          for one. If no username is given, an anonymous login is
+          performed. If a pathname is included, Kermit tries to GET the
+          given file. See [574]Section 3.1.3 for details.
+
+   ftps://[user[:password]@]hostname[/path...]
+          Makes a secure FTP connection over SSL.
+
+   telnets://[user[:password]@]hostname
+          Makes a secure Telnet connection over SSL.
+
+   kermit://[user[:password]@]hostname[/path...]
+          Makes a connection to an [575]Internet Kermit Server.
+
+   http://[user[:password]@]hostname[/path...]
+          Makes a connection to Web server.
+
+   https://[user[:password]@]hostname[/path...]
+          Makes a connection to secure Web server.
+
+   [ [576]Top ] [ [577]Contents ] [ [578]C-Kermit Home ] [ [579]Kermit
+   Home ]
+  __________________________________________________________________________
+
+17. LOGS
+
+   In C-Kermit 8.0, we make an effort to keep passwords out of the debug
+   log. This can never be 100% effective, but it's better than before,
+   when there were no precautions at all. Whenever Kermit knows it's
+   prompting for, parsing, or transmitting a password, it temporarily
+   turns off logging and then turns it back on afterwards. This keeps the
+   debug log password-free in most common cases, but there can be no
+   guarantees.
+
+   As noted elsewhere, the new "-dd" command-line option selects a
+   timestamped debug log (equivalent to "set debug timestamps on", "log
+   debug debug.log").
+
+   C-Kermit 8.0 also supports a new timestamped session log via "set
+   session-log timestamped-text", "log session".
+
+   There have been requests for other kinds of logs, for example a
+   command log. These might be added at some point. One person wanted to
+   be able to log commands with timestamps, but only commands issued at
+   the prompt, not commands from files or macros, and also wanted a
+   header line at the beginning showing the date, user, and host. This
+   can be done as follows:
+
+  .filename := \v(home)commands.log  ; (for example)
+  fopen /write \%c \m(filename)
+  if success {
+      fwrite /line \%c \v(date): User=\v(user) Host=\v(host)
+      fclose \%c
+      set debug timestamps on
+      log debug {| grep "CMD(P)" >> \m(filename)} append
+  }
+
+   [ [580]Top ] [ [581]Contents ] [ [582]C-Kermit Home ] [ [583]Kermit
+   Home ]
+     _________________________________________________________________
+
+   C-Kermit 8.0 Update Notes / [584]The Kermit Project / Columbia
+   University / 15 Dec 2003
+
+References
+
+   1. http://www.columbia.edu/kermit/ckermit80.html#contents
+   2. http://www.columbia.edu/kermit/ckermit.html
+   3. http://www.columbia.edu/kermit/index.html
+   4. http://www.columbia.edu/kermit/ckermit80.html
+   5. mailto:kermit-support@columbia.edu
+   6. http://www.columbia.edu/kermit/
+   7. http://www.kermit-project.org/
+   8. http://www.columbia.nyc.ny.us/kermit/
+   9. ftp://kermit.columbia.edu/kermit/f/COPYING.TXT
+  10. ftp://kermit.columbia.edu/kermit/f/ckcmai.c
+  11. http://www.columbia.edu/kermit/ckermit80.html#xv
+  12. http://www.columbia.edu/kermit/ck60manual.html
+  13. http://www.columbia.edu/kermit/ckermi70.html
+  14. ftp://kermit.columbia.edu/kermit/f/ckermit70.txt
+  15. http://www.columbia.edu/kermit/ckututor.html
+  16. ftp://kermit.columbia.edu/kermit/f/ckuker.nr
+  17. http://www.columbia.edu/kermit/security.htm
+  18. http://www.columbia.edu/kermit/telnet.htm
+  19. http://www.columbia.edu/kermit/ftpscripts.html
+  20. http://www.columbia.edu/kermit/ckcbwr.html
+  21. ftp://kermit.columbia.edu/kermit/f/ckcbwr.txt
+  22. http://www.columbia.edu/kermit/ckubwr.html
+  23. ftp://kermit.columbia.edu/kermit/f/ckubwr.txt
+  24. http://www.columbia.edu/kermit/ckvbwr.html
+  25. ftp://kermit.columbia.edu/kermit/f/ckvbwr.txt
+  26. http://www.columbia.edu/kermit/ckuins.html
+  27. ftp://kermit.columbia.edu/kermit/f/ckuins.txt
+  28. http://www.columbia.edu/kermit/ckvins.html
+  29. ftp://kermit.columbia.edu/kermit/f/ckvins.txt
+  30. http://www.columbia.edu/kermit/ckccfg.html
+  31. ftp://kermit.columbia.edu/kermit/f/ckccfg.txt
+  32. http://www.columbia.edu/kermit/ckcplm.html
+  33. ftp://kermit.columbia.edu/kermit/f/ckcplm.txt
+  34. http://www.columbia.edu/kermit/iksd.html
+  35. http://www.columbia.edu/kermit/skermit.html
+  36. http://www.columbia.edu/kermit/ckermit80.html#top
+  37. http://www.columbia.edu/kermit/ckermit.html
+  38. http://www.columbia.edu/kermit/index.html
+  39. http://www.columbia.edu/kermit/ckermit80.html#x0
+  40. http://www.columbia.edu/kermit/ckermit80.html#x1
+  41. http://www.columbia.edu/kermit/ckermit80.html#x2
+  42. http://www.columbia.edu/kermit/ckermit80.html#x2.1
+  43. http://www.columbia.edu/kermit/ckermit80.html#x2.2
+  44. http://www.columbia.edu/kermit/ckermit80.html#x2.2.1
+  45. http://www.columbia.edu/kermit/ckermit80.html#x2.2.2
+  46. http://www.columbia.edu/kermit/ckermit80.html#x2.2.3
+  47. http://www.columbia.edu/kermit/ckermit80.html#x2.2.4
+  48. http://www.columbia.edu/kermit/ckermit80.html#x2.2.5
+  49. http://www.columbia.edu/kermit/ckermit80.html#x2.2.6
+  50. http://www.columbia.edu/kermit/ckermit80.html#x3
+  51. http://www.columbia.edu/kermit/ckermit80.html#x3.1
+  52. http://www.columbia.edu/kermit/ckermit80.html#x3.1.1
+  53. http://www.columbia.edu/kermit/ckermit80.html#x3.1.2
+  54. http://www.columbia.edu/kermit/ckermit80.html#x3.1.3
+  55. http://www.columbia.edu/kermit/ckermit80.html#x3.1.4
+  56. http://www.columbia.edu/kermit/ckermit80.html#x3.2
+  57. http://www.columbia.edu/kermit/ckermit80.html#x3.3
+  58. http://www.columbia.edu/kermit/ckermit80.html#x3.4
+  59. http://www.columbia.edu/kermit/ckermit80.html#x3.5
+  60. http://www.columbia.edu/kermit/ckermit80.html#x3.5.1
+  61. http://www.columbia.edu/kermit/ckermit80.html#x3.5.2
+  62. http://www.columbia.edu/kermit/ckermit80.html#x3.5.3
+  63. http://www.columbia.edu/kermit/ckermit80.html#x3.6
+  64. http://www.columbia.edu/kermit/ckermit80.html#x3.6.1
+  65. http://www.columbia.edu/kermit/ckermit80.html#x3.6.2
+  66. http://www.columbia.edu/kermit/ckermit80.html#x3.6.3
+  67. http://www.columbia.edu/kermit/ckermit80.html#x3.7
+  68. http://www.columbia.edu/kermit/ckermit80.html#x3.7.1
+  69. http://www.columbia.edu/kermit/ckermit80.html#x3.7.2
+  70. http://www.columbia.edu/kermit/ckermit80.html#x3.8
+  71. http://www.columbia.edu/kermit/ckermit80.html#x3.9
+  72. http://www.columbia.edu/kermit/ckermit80.html#x3.10
+  73. http://www.columbia.edu/kermit/ckermit80.html#x3.10.1
+  74. http://www.columbia.edu/kermit/ckermit80.html#x3.10.2
+  75. http://www.columbia.edu/kermit/ckermit80.html#x3.10.3
+  76. http://www.columbia.edu/kermit/ckermit80.html#x3.11
+  77. http://www.columbia.edu/kermit/ckermit80.html#x4
+  78. http://www.columbia.edu/kermit/ckermit80.html#x5
+  79. http://www.columbia.edu/kermit/ckermit80.html#x6
+  80. http://www.columbia.edu/kermit/ckermit80.html#x6.1
+  81. http://www.columbia.edu/kermit/ckermit80.html#x6.2
+  82. http://www.columbia.edu/kermit/ckermit80.html#x6.3
+  83. http://www.columbia.edu/kermit/ckermit80.html#x6.4
+  84. http://www.columbia.edu/kermit/ckermit80.html#x6.5
+  85. http://www.columbia.edu/kermit/ckermit80.html#x6.6
+  86. http://www.columbia.edu/kermit/ckermit80.html#x7
+  87. http://www.columbia.edu/kermit/ckermit80.html#x8
+  88. http://www.columbia.edu/kermit/ckermit80.html#x8.1
+  89. http://www.columbia.edu/kermit/ckermit80.html#x8.2
+  90. http://www.columbia.edu/kermit/ckermit80.html#x8.3
+  91. http://www.columbia.edu/kermit/ckermit80.html#x8.4
+  92. http://www.columbia.edu/kermit/ckermit80.html#x8.5
+  93. http://www.columbia.edu/kermit/ckermit80.html#x8.6
+  94. http://www.columbia.edu/kermit/ckermit80.html#x8.7
+  95. http://www.columbia.edu/kermit/ckermit80.html#x8.8
+  96. http://www.columbia.edu/kermit/ckermit80.html#x8.9
+  97. http://www.columbia.edu/kermit/ckermit80.html#x8.10
+  98. http://www.columbia.edu/kermit/ckermit80.html#x8.11
+  99. http://www.columbia.edu/kermit/ckermit80.html#x8.12
+ 100. http://www.columbia.edu/kermit/ckermit80.html#x8.13
+ 101. http://www.columbia.edu/kermit/ckermit80.html#x8.14
+ 102. http://www.columbia.edu/kermit/ckermit80.html#x9
+ 103. http://www.columbia.edu/kermit/ckermit80.html#x9.1
+ 104. http://www.columbia.edu/kermit/ckermit80.html#x9.2
+ 105. http://www.columbia.edu/kermit/ckermit80.html#x9.3
+ 106. http://www.columbia.edu/kermit/ckermit80.html#x9.4
+ 107. http://www.columbia.edu/kermit/ckermit80.html#x9.5
+ 108. http://www.columbia.edu/kermit/ckermit80.html#x9.6
+ 109. http://www.columbia.edu/kermit/ckermit80.html#x9.7
+ 110. http://www.columbia.edu/kermit/ckermit80.html#x9.8
+ 111. http://www.columbia.edu/kermit/ckermit80.html#x9.9
+ 112. http://www.columbia.edu/kermit/ckermit80.html#x9.10
+ 113. http://www.columbia.edu/kermit/ckermit80.html#x9.11
+ 114. http://www.columbia.edu/kermit/ckermit80.html#x10
+ 115. http://www.columbia.edu/kermit/ckermit80.html#x11
+ 116. http://www.columbia.edu/kermit/ckermit80.html#x12
+ 117. http://www.columbia.edu/kermit/ckermit80.html#x13
+ 118. http://www.columbia.edu/kermit/ckermit80.html#x14
+ 119. http://www.columbia.edu/kermit/ckermit80.html#x15
+ 120. http://www.columbia.edu/kermit/ckermit80.html#x16
+ 121. http://www.columbia.edu/kermit/ckermit80.html#x17
+ 122. http://www.columbia.edu/kermit/ckermit80.html#top
+ 123. http://www.columbia.edu/kermit/ckermit.html
+ 124. http://www.columbia.edu/kermit/index.html
+ 125. http://www.columbia.edu/kermit/ckuins.html#x5
+ 126. http://www.columbia.edu/kermit/ckuins.html
+ 127. http://www.columbia.edu/kermit/ckermit80.html#x5
+ 128. http://www.columbia.edu/kermit/ckermit80.html#x2.2
+ 129. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 130. http://www.columbia.edu/kermit/ckermit80.html#x15
+ 131. http://www.columbia.edu/kermit/ckermit80.html#x3.7
+ 132. http://www.columbia.edu/kermit/ckermit80.html#ftpdates
+ 133. http://www.columbia.edu/kermit/ckermit80.html#ftpcheck
+ 134. http://www.columbia.edu/kermit/ckermit80.html#ftpnamelist
+ 135. http://www.columbia.edu/kermit/ckermit80.html#srvrename
+ 136. http://www.columbia.edu/kermit/ckermit80.html#ftpvdir
+ 137. http://www.columbia.edu/kermit/ckermit80.html#setftptype
+ 138. http://www.columbia.edu/kermit/ckermit80.html#x3.6
+ 139. http://www.columbia.edu/kermit/ckermit80.html#x15
+ 140. http://www.columbia.edu/kermit/ckermit80.html#x8.7
+ 141. http://www.columbia.edu/kermit/ckermit80.html#x2.1
+ 142. http://www.columbia.edu/kermit/ckermit80.html#x2.2
+ 143. http://www.columbia.edu/kermit/ckermit80.html#x8.14
+ 144. http://www.columbia.edu/kermit/ckermit80.html#x8.13
+ 145. http://www.columbia.edu/kermit/ckermit80.html#x8.13
+ 146. http://www.columbia.edu/kermit/ckututor.html
+ 147. http://www.columbia.edu/kermit/ckuins.html
+ 148. http://www.columbia.edu/kermit/skermit.html
+ 149. http://www.columbia.edu/kermit/ckermit80.html#setlocus
+ 150. http://www.columbia.edu/kermit/ckermit80.html#lcommands
+ 151. http://www.columbia.edu/kermit/ckermit80.html#ftpuser
+ 152. http://www.columbia.edu/kermit/ckermit80.html#showvar
+ 153. http://www.columbia.edu/kermit/ckermit80.html#callerid
+ 154. http://www.columbia.edu/kermit/ckermit80.html#x6.6
+ 155. http://www.columbia.edu/kermit/ckermit80.html#x0
+ 156. http://www.columbia.edu/kermit/ckermit80.html#x3.11
+ 157. http://www.columbia.edu/kermit/ckermit80.html#top
+ 158. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 159. http://www.columbia.edu/kermit/ckermit.html
+ 160. http://www.columbia.edu/kermit/index.html
+ 161. http://www.columbia.edu/kermit/ckermit80.html#x0
+ 162. http://www.columbia.edu/kermit/ckermit80.html#top
+ 163. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 164. http://www.columbia.edu/kermit/ckermit.html
+ 165. http://www.columbia.edu/kermit/index.html
+ 166. http://www.columbia.edu/kermit/k95.html
+ 167. http://www.columbia.edu/kermit/sshclient.html
+ 168. http://www.columbia.edu/kermit/skermit.html
+ 169. http://www.columbia.edu/kermit/skermit.html
+ 170. http://www.columbia.edu/kermit/sshclien.htm
+ 171. http://www.columbia.edu/kermit/ckermit80.html#x3
+ 172. ftp://ftp.isi.edu/in-notes/rfc1738.txt
+ 173. http://www.columbia.edu/kermit/ckermit80.html#x2.2.2
+ 174. http://www.columbia.edu/kermit/ckermit80.html#x2.2.1
+ 175. ftp://ftp.isi.edu/in-notes/rfc2396.txt
+ 176. ftp://ftp.isi.edu/in-notes/rfc2616.txt
+ 177. http://www.columbia.edu/kermit/ckermit80.html#x2.2.3
+ 178. ftp://ftp.isi.edu/in-notes/rfc2616.txt
+ 179. http://www.columbia.edu/kermit/ckermit80.html#x8.13.7
+ 180. http://www.columbia.edu/kermit/security.htm#x5.4
+ 181. http://www.columbia.edu/kermit/security.htm#x15
+ 182. http://www.columbia.edu/kermit/security.htm#x6.2
+ 183. http://www.columbia.edu/kermit/security.html
+ 184. http://www.columbia.edu/kermit/ckermit80.html#x16
+ 185. http://www.columbia.edu/kermit/ckermit80.html#top
+ 186. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 187. http://www.columbia.edu/kermit/ckermit.html
+ 188. http://www.columbia.edu/kermit/index.html
+ 189. http://www.columbia.edu/kermit/ckermit80.html#x3.1
+ 190. http://www.columbia.edu/kermit/ckermit80.html#x3.2
+ 191. http://www.columbia.edu/kermit/ckermit80.html#x3.3
+ 192. http://www.columbia.edu/kermit/ckermit80.html#x3.4
+ 193. http://www.columbia.edu/kermit/ckermit80.html#x3.5
+ 194. http://www.columbia.edu/kermit/ckermit80.html#x3.6
+ 195. http://www.columbia.edu/kermit/ckermit80.html#x3.7
+ 196. http://www.columbia.edu/kermit/ckermit80.html#x3.8
+ 197. http://www.columbia.edu/kermit/ckermit80.html#x3.9
+ 198. http://www.columbia.edu/kermit/ckermit80.html#x3.10
+ 199. http://www.columbia.edu/kermit/ckermit80.html#x3.11
+ 200. http://www.columbia.edu/kermit/security.htm
+ 201. http://www.columbia.edu/kermit/security.htm#servers
+ 202. http://www.columbia.edu/kermit/ckcsets.html
+ 203. http://www.columbia.edu/kermit/unicode.html
+ 204. http://www.columbia.edu/kermit/ckermi70.htm#x1.5.4
+ 205. http://www.columbia.edu/kermit/case10.html
+ 206. http://www.columbia.edu/kermit/ckermit80.html#x4
+ 207. http://www.columbia.edu/kermit/ckermit80.html#x3.11
+ 208. http://www.columbia.edu/kermit/ftpscripts.html
+ 209. http://www.columbia.edu/kermit/ckermit80.html#top
+ 210. http://www.columbia.edu/kermit/ckermit80.html#ftp
+ 211. http://www.columbia.edu/kermit/ftpclient.html
+ 212. http://www.columbia.edu/kermit/ftpscripts.html
+ 213. http://www.columbia.edu/kermit/ckermit.html
+ 214. http://www.columbia.edu/kermit/index.html
+ 215. http://www.columbia.edu/kermit/ckermit80.html#x3.1.1
+ 216. http://www.columbia.edu/kermit/ckermit80.html#x3.1.3
+ 217. http://www.columbia.edu/kermit/ckermit80.html#x3.1.4
+ 218. http://www.columbia.edu/kermit/ckermit80.html#x3.1.3
+ 219. http://www.columbia.edu/kermit/ckermit80.html#x3.1.3
+ 220. http://www.columbia.edu/kermit/ckermit80.html#x3.2
+ 221. http://www.columbia.edu/kermit/ckermit80.html#x3.5
+ 222. http://www.columbia.edu/kermit/ckermit80.html#x3.6
+ 223. http://www.columbia.edu/kermit/ftpscripts.html
+ 224. http://www.columbia.edu/kermit/ckb2.htm
+ 225. http://www.columbia.edu/kermit/ckermit80.html#ftpautolog
+ 226. http://www.columbia.edu/kermit/ckermit80.html#ftpuser
+ 227. http://www.columbia.edu/kermit/ckermit80.html#x3.8
+ 228. http://www.columbia.edu/kermit/ckermit80.html#x3.8
+ 229. http://www.columbia.edu/kermit/ckermit80.html#top
+ 230. http://www.columbia.edu/kermit/ckermit80.html#ftp
+ 231. http://www.columbia.edu/kermit/ckermit.html
+ 232. http://www.columbia.edu/kermit/index.html
+ 233. http://www.columbia.edu/kermit/ibm_ie.html
+ 234. http://www.columbia.edu/kermit/ckermit80.html#x3.10
+ 235. http://www.columbia.edu/kermit/ckermit80.html#top
+ 236. http://www.columbia.edu/kermit/ckermit80.html#ftp
+ 237. http://www.columbia.edu/kermit/ckermit.html
+ 238. http://www.columbia.edu/kermit/index.html
+ 239. http://www.columbia.edu/kermit/ck60manual.html
+ 240. http://www.columbia.edu/kermit/ckermit70.html#x4.17
+ 241. http://www.columbia.edu/kermit/ckermit70.html
+ 242. http://www.columbia.edu/kermit/ckermit80.html#x3.6
+ 243. http://www.columbia.edu/kermit/ckermit80.html#x3.11
+ 244. http://www.columbia.edu/kermit/ckermit80.html#x3.1.4
+ 245. http://www.columbia.edu/kermit/security.html
+ 246. http://www.columbia.edu/kermit/ckermit80.html#x3.7
+ 247. http://www.columbia.edu/kermit/ckermit80.html#x3.7
+ 248. http://www.columbia.edu/kermit/ckermit80.html#x8.13.4
+ 249. http://www.columbia.edu/kermit/ckermit80.html#permswitch
+ 250. http://www.columbia.edu/kermit/ckermit80.html#ftpchmod
+ 251. http://www.columbia.edu/kermit/ckermit80.html#x3.6.2
+ 252. http://www.columbia.edu/kermit/ckermit80.html#x4
+ 253. http://www.columbia.edu/kermit/ckermit80.html#top
+ 254. http://www.columbia.edu/kermit/ckermit80.html#ftp
+ 255. http://www.columbia.edu/kermit/ckermit.html
+ 256. http://www.columbia.edu/kermit/index.html
+ 257. http://www.columbia.edu/kermit/ckermit80.html#x7
+ 258. http://www.columbia.edu/kermit/ckermit80.html#x3.8
+ 259. http://www.columbia.edu/kermit/ckermit80.html#x3.8
+ 260. http://www.columbia.edu/kermit/ckb2.htm
+ 261. http://www.columbia.edu/kermit/ckermit80.html#x3.10
+ 262. http://www.columbia.edu/kermit/ckermit80.html#x3.10
+ 263. http://www.columbia.edu/kermit/ckermit80.html#x3.6
+ 264. http://www.columbia.edu/kermit/ckermit80.html#setftptype
+ 265. http://www.columbia.edu/kermit/ckermit80.html#top
+ 266. http://www.columbia.edu/kermit/ckermit80.html#ftp
+ 267. http://www.columbia.edu/kermit/ckermit.html
+ 268. http://www.columbia.edu/kermit/index.html
+ 269. http://www.columbia.edu/kermit/ckermit70.html#x4.9
+ 270. http://www.columbia.edu/kermit/ckermit80.html#x3.5.1
+ 271. http://www.columbia.edu/kermit/ckermit80.html#erroraction
+ 272. http://www.columbia.edu/kermit/ckermit70.html#x1.5
+ 273. http://www.columbia.edu/kermit/ckermit70.html#x4.7
+ 274. http://www.columbia.edu/kermit/ckermit70.html#x1.6
+ 275. http://www.columbia.edu/kermit/ckermit80.html#x8.13
+ 276. http://www.columbia.edu/kermit/ckermi70.htm#x1.5.4
+ 277. http://www.columbia.edu/kermit/ckermi70.htm
+ 278. http://www.columbia.edu/kermit/ckermit80.html#x4
+ 279. http://www.columbia.edu/kermit/ckermit80.html#x3.7
+ 280. http://www.columbia.edu/kermit/ckermit80.html#x3.5.2
+ 281. http://www.columbia.edu/kermit/ckermit80.html#x3.7
+ 282. http://www.columbia.edu/kermit/ckermit80.html#erroraction
+ 283. http://www.columbia.edu/kermit/ckermit80.html#x3.5.2
+ 284. http://www.columbia.edu/kermit/ckermit80.html#erroraction
+ 285. http://www.columbia.edu/kermit/ckermit80.html#ftpfilenames
+ 286. http://www.columbia.edu/kermit/ckermit80.html#ftpperms
+ 287. http://www.columbia.edu/kermit/ckermit80.html#ftpunique
+ 288. http://www.columbia.edu/kermit/ckermit80.html#ftpfilenames
+ 289. http://www.columbia.edu/kermit/ckermit80.html#note_utc
+ 290. http://www.columbia.edu/kermit/ckermit80.html#note_date
+ 291. http://www.columbia.edu/kermit/ckermit80.html#x3.6
+ 292. http://www.boulder.nist.gov/timefreq/faq/faq.htm#10:
+ 293. http://www.columbia.edu/kermit/ckermit80.html#x3.7
+ 294. http://www.columbia.edu/kermit/ckermit80.html#top
+ 295. http://www.columbia.edu/kermit/ckermit80.html#ftp
+ 296. http://www.columbia.edu/kermit/ckermit.html
+ 297. http://www.columbia.edu/kermit/index.html
+ 298. http://www.columbia.edu/kermit/ckermit80.html#x3.11
+ 299. http://www.columbia.edu/kermit/ckermi70.htm#x4.3
+ 300. http://www.columbia.edu/kermit/ckermit70.html
+ 301. http://www.columbia.edu/kermit/ckermit80.html#x5
+ 302. http://www.columbia.edu/kermit/ckermit80.html#x3.6.3
+ 303. http://www.columbia.edu/kermit/ckermit80.html#ftpfilenames
+ 304. http://www.columbia.edu/kermit/ckermi70.htm#x4.1
+ 305. http://www.columbia.edu/kermit/ckermi70.htm#x4.2.2
+ 306. http://www.columbia.edu/kermit/ckermi70.htm#x1.5.4
+ 307. http://www.columbia.edu/kermit/ckermit80.html#x3.6.2
+ 308. http://www.columbia.edu/kermit/ckermit80.html#x3.11
+ 309. http://www.columbia.edu/kermit/ckermit80.html#x3.11
+ 310. http://www.columbia.edu/kermit/ckermit80.html#srvrename
+ 311. http://www.columbia.edu/kermit/ckermi70.htm#x4.1
+ 312. http://www.columbia.edu/kermit/ckermi70.htm
+ 313. http://www.columbia.edu/kermit/ckb2.htm
+ 314. http://www.columbia.edu/kermit/ckermit80.html#ftpfilenames
+ 315. http://www.columbia.edu/kermit/ckermit80.html#x3.5.3
+ 316. http://www.proftpd.net/
+ 317. http://www.columbia.edu/kermit/ckermit80.html#top
+ 318. http://www.columbia.edu/kermit/ckermit80.html#ftp
+ 319. http://www.columbia.edu/kermit/ckermit.html
+ 320. http://www.columbia.edu/kermit/index.html
+ 321. http://www.columbia.edu/kermit/ckb2.htm
+ 322. http://www.columbia.edu/kermit/ckcsets.html
+ 323. http://www.columbia.edu/kermit/unicode.html
+ 324. http://www.columbia.edu/kermit/ckcsets.html
+ 325. http://www.columbia.edu/kermit/ckcsets.html
+ 326. http://www.columbia.edu/kermit/ckermit80.html#x4
+ 327. http://www.columbia.edu/kermit/utf8.html
+ 328. http://www.columbia.edu/kermit/ckcsets.html
+ 329. http://www.columbia.edu/kermit/ckermit80.html#x4
+ 330. ftp://ftp.isi.edu/in-notes/rfc2640.txt
+ 331. http://www.columbia.edu/kermit/ckermit80.html#top
+ 332. http://www.columbia.edu/kermit/ckermit80.html#ftp
+ 333. http://www.columbia.edu/kermit/ckermit.html
+ 334. http://www.columbia.edu/kermit/index.html
+ 335. http://www.columbia.edu/kermit/ckermit80.html#top
+ 336. http://www.columbia.edu/kermit/ckermit80.html#ftp
+ 337. http://www.columbia.edu/kermit/ckermit.html
+ 338. http://www.columbia.edu/kermit/index.html
+ 339. http://www.columbia.edu/kermit/ckermit80.html#top
+ 340. http://www.columbia.edu/kermit/ckermit80.html#ftp
+ 341. http://www.columbia.edu/kermit/ckermit.html
+ 342. http://www.columbia.edu/kermit/index.html
+ 343. http://www.columbia.edu/kermit/ftpscripts.html
+ 344. http://www.columbia.edu/kermit/ckermit80.html#x3.2
+ 345. http://www.columbia.edu/kermit/ckermit80.html#x3.2
+ 346. ftp://ftp.isi.edu/in-notes/rfc959.txt
+ 347. http://www.columbia.edu/kermit/ckscripts.html
+ 348. http://www.columbia.edu/kermit/ckermit80.html#top
+ 349. http://www.columbia.edu/kermit/ckermit80.html#ftp
+ 350. http://www.columbia.edu/kermit/ftpscript.html
+ 351. http://www.columbia.edu/kermit/ckermit.html
+ 352. http://www.columbia.edu/kermit/index.html
+ 353. http://www.columbia.edu/kermit/ckermit80.html#x3.11.1
+ 354. http://www.columbia.edu/kermit/ckermit80.html#x3.11.2
+ 355. http://www.columbia.edu/kermit/ckermit80.html#x3.11.3
+ 356. http://www.columbia.edu/kermit/ckermit80.html#x3.11.4
+ 357. http://www.columbia.edu/kermit/ckermit80.html#x3.11.5
+ 358. http://www.columbia.edu/kermit/ckermit.html
+ 359. http://www.columbia.edu/kermit/k95.html
+ 360. http://www.columbia.edu/kermit/ckermit80.html#x3.11.5
+ 361. ftp://ftp.isi.edu/in-notes/rfc959.txt
+ 362. ftp://ftp.isi.edu/in-notes/rfc2389.txt
+ 363. http://www.ietf.org/internet-drafts/draft-ietf-ftpext-mlst-16.txt
+ 364. http://www.columbia.edu/kermit/ftpclient.html
+ 365. http://www.columbia.edu/kermit/ckermit80.html#top
+ 366. http://www.columbia.edu/kermit/ckermit80.html#ftp
+ 367. http://www.columbia.edu/kermit/ckermit.html
+ 368. http://www.columbia.edu/kermit/index.html
+ 369. http://www.columbia.edu/kermit/ckermit80.html#x3
+ 370. http://www.columbia.edu/kermit/ckermit80.html#ucs2
+ 371. http://www.columbia.edu/kermit/ckermit80.html#top
+ 372. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 373. http://www.columbia.edu/kermit/ckermit.html
+ 374. http://www.columbia.edu/kermit/index.html
+ 375. http://www.columbia.edu/kermit/ckermit80.html#top
+ 376. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 377. http://www.columbia.edu/kermit/ckermit.html
+ 378. http://www.columbia.edu/kermit/index.html
+ 379. http://www.columbia.edu/kermit/ckb2.htm
+ 380. http://www.columbia.edu/kermit/ckermit80.html#top
+ 381. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 382. http://www.columbia.edu/kermit/ckermit.html
+ 383. http://www.columbia.edu/kermit/index.html
+ 384. http://www.columbia.edu/kermit/ckermit80.html#x4
+ 385. http://www.columbia.edu/kermit/ckermit80.html#x4
+ 386. http://www.columbia.edu/kermit/ckermit80.html#x8.12
+ 387. http://www.columbia.edu/kermit/ckermit80.html#x8.1
+ 388. http://www.columbia.edu/kermit/ckermit80.html#x12
+ 389. http://www.columbia.edu/kermit/ckermit80.html#x8.12
+ 390. http://www.columbia.edu/kermit/ckermit80.html#top
+ 391. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 392. http://www.columbia.edu/kermit/ckermit.html
+ 393. http://www.columbia.edu/kermit/index.html
+ 394. http://www.columbia.edu/kermit/ckermit80.html#x8.14
+ 395. http://www.columbia.edu/kermit/ckermit80.html#top
+ 396. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 397. http://www.columbia.edu/kermit/ckermit.html
+ 398. http://www.columbia.edu/kermit/index.html
+ 399. http://www.columbia.edu/kermit/ckermit80.html#x9
+ 400. http://www.columbia.edu/kermit/ckermit80.html#top
+ 401. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 402. http://www.columbia.edu/kermit/ckermit.html
+ 403. http://www.columbia.edu/kermit/index.html
+ 404. http://www.columbia.edu/kermit/ckermit80.html#x8.6
+ 405. http://www.columbia.edu/kermit/ckermit80.html#top
+ 406. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 407. http://www.columbia.edu/kermit/ckermit.html
+ 408. http://www.columbia.edu/kermit/index.html
+ 409. http://www.columbia.edu/kermit/ckermit80.html#top
+ 410. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 411. http://www.columbia.edu/kermit/ckermit.html
+ 412. http://www.columbia.edu/kermit/index.html
+ 413. http://www.columbia.edu/kermit/ckermit80.html#top
+ 414. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 415. http://www.columbia.edu/kermit/ckermit.html
+ 416. http://www.columbia.edu/kermit/index.html
+ 417. http://www.columbia.edu/kermit/ckermit80.html#fjoin
+ 418. http://www.columbia.edu/kermit/ckermit80.html#fsplit
+ 419. http://www.columbia.edu/kermit/ckermit80.html#x8.10
+ 420. http://www.columbia.edu/kermit/ckermit80.html#top
+ 421. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 422. http://www.columbia.edu/kermit/ckermit.html
+ 423. http://www.columbia.edu/kermit/index.html
+ 424. http://www.columbia.edu/kermit/ckermit80.html#x9
+ 425. http://www.columbia.edu/kermit/ckermit80.html#x9
+ 426. http://www.columbia.edu/kermit/ckermit80.html#x9
+ 427. http://www.columbia.edu/kermit/ckermit80.html#x3
+ 428. http://www.columbia.edu/kermit/ckermit80.html#x3
+ 429. http://www.columbia.edu/kermit/ckermit80.html#x3.2
+ 430. http://www.columbia.edu/kermit/ckermit80.html#x3.2
+ 431. http://www.columbia.edu/kermit/ckermit80.html#x3.8
+ 432. http://www.columbia.edu/kermit/ckermit80.html#x3
+ 433. http://www.columbia.edu/kermit/ckermit80.html#x3
+ 434. http://www.columbia.edu/kermit/ckermit80.html#x3
+ 435. http://www.columbia.edu/kermit/ckermit80.html#x3.2
+ 436. http://www.columbia.edu/kermit/ckermit80.html#x3
+ 437. http://www.columbia.edu/kermit/ckermit80.html#x8.13
+ 438. http://www.columbia.edu/kermit/ckermit80.html#x8.13
+ 439. http://www.columbia.edu/kermit/ckermit80.html#x9
+ 440. http://www.columbia.edu/kermit/ckermit80.html#x8.10
+ 441. http://www.columbia.edu/kermit/ckermit80.html#x8.7.4
+ 442. http://www.columbia.edu/kermit/ckermit80.html#top
+ 443. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 444. http://www.columbia.edu/kermit/ckermit.html
+ 445. http://www.columbia.edu/kermit/index.html
+ 446. http://www.columbia.edu/kermit/ckermit80.html#top
+ 447. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 448. http://www.columbia.edu/kermit/ckermit.html
+ 449. http://www.columbia.edu/kermit/index.html
+ 450. http://www.columbia.edu/kermit/ckermit80.html#top
+ 451. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 452. http://www.columbia.edu/kermit/ckermit.html
+ 453. http://www.columbia.edu/kermit/index.html
+ 454. http://www.columbia.edu/kermit/ckermit80.html#x8.7
+ 455. http://www.columbia.edu/kermit/ckermit80.html#top
+ 456. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 457. http://www.columbia.edu/kermit/ckermit.html
+ 458. http://www.columbia.edu/kermit/index.html
+ 459. http://www.columbia.edu/kermit/ckermit80.html#scriptedit
+ 460. http://www.columbia.edu/kermit/ckermit80.html#top
+ 461. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 462. http://www.columbia.edu/kermit/ckermit.html
+ 463. http://www.columbia.edu/kermit/index.html
+ 464. http://www.columbia.edu/kermit/ckermit80.html#top
+ 465. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 466. http://www.columbia.edu/kermit/ckermit.html
+ 467. http://www.columbia.edu/kermit/index.html
+ 468. ftp://ftp.isi.edu/in-notes/rfc2822.txt
+ 469. ftp://ftp.isi.edu/in-notes/rfc2822.txt
+ 470. ftp://ftp.isi.edu/in-notes/rfc2822.txt
+ 471. ftp://ftp.isi.edu/in-notes/rfc2822.txt
+ 472. http://www.columbia.edu/kermit/ckermit80.html#top
+ 473. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 474. http://www.columbia.edu/kermit/ckermit.html
+ 475. http://www.columbia.edu/kermit/index.html
+ 476. http://www.columbia.edu/kermit/ckermit80.html#x8.1
+ 477. http://www.columbia.edu/kermit/ckermit80.html#top
+ 478. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 479. http://www.columbia.edu/kermit/ckermit.html
+ 480. http://www.columbia.edu/kermit/index.html
+ 481. http://www.columbia.edu/kermit/ckermit80.html#x8.2
+ 482. http://www.columbia.edu/kermit/ckermit80.html#top
+ 483. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 484. http://www.columbia.edu/kermit/ckermit.html
+ 485. http://www.columbia.edu/kermit/index.html
+ 486. http://www.columbia.edu/kermit/ckermit80.html#x9.8
+ 487. http://www.columbia.edu/kermit/ckermit80.html#x9.8
+ 488. http://www.columbia.edu/kermit/ckermit80.html#x8.2
+ 489. http://www.columbia.edu/kermit/ckermit80.html#top
+ 490. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 491. http://www.columbia.edu/kermit/ckermit.html
+ 492. http://www.columbia.edu/kermit/index.html
+ 493. http://www.columbia.edu/kermit/ckermit80.html#top
+ 494. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 495. http://www.columbia.edu/kermit/ckermit.html
+ 496. http://www.columbia.edu/kermit/index.html
+ 497. http://www.columbia.edu/kermit/ckermit80.html#x9.8
+ 498. http://www.columbia.edu/kermit/ckermit80.html#top
+ 499. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 500. http://www.columbia.edu/kermit/ckermit.html
+ 501. http://www.columbia.edu/kermit/index.html
+ 502. http://www.columbia.edu/kermit/ckermit80.html#x9.8
+ 503. http://www.columbia.edu/kermit/ckermit80.html#x9.8
+ 504. http://www.columbia.edu/kermit/ckermit80.html#x9.6
+ 505. http://www.columbia.edu/kermit/ckermit80.html#top
+ 506. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 507. http://www.columbia.edu/kermit/ckermit.html
+ 508. http://www.columbia.edu/kermit/index.html
+ 509. http://www.columbia.edu/kermit/ckermit80.html#x9.8
+ 510. http://www.columbia.edu/kermit/ckermit80.html#x9.8
+ 511. http://www.columbia.edu/kermit/ckermit80.html#top
+ 512. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 513. http://www.columbia.edu/kermit/ckermit.html
+ 514. http://www.columbia.edu/kermit/index.html
+ 515. http://www.columbia.edu/kermit/ckermit80.html#top
+ 516. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 517. http://www.columbia.edu/kermit/ckermit.html
+ 518. http://www.columbia.edu/kermit/index.html
+ 519. http://www.columbia.edu/kermit/ckermit80.html#top
+ 520. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 521. http://www.columbia.edu/kermit/ckermit.html
+ 522. http://www.columbia.edu/kermit/index.html
+ 523. mailto:thucdat@hotmail.com
+ 524. http://www.columbia.edu/kermit/ckermit80.html#x9.9.2
+ 525. http://www.columbia.edu/kermit/ckermit80.html#top
+ 526. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 527. http://www.columbia.edu/kermit/ckermit.html
+ 528. http://www.columbia.edu/kermit/index.html
+ 529. http://www.columbia.edu/kermit/ckermit80.html#top
+ 530. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 531. http://www.columbia.edu/kermit/ckermit.html
+ 532. http://www.columbia.edu/kermit/index.html
+ 533. http://www.columbia.edu/kermit/ckermit80.html#top
+ 534. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 535. http://www.columbia.edu/kermit/ckermit.html
+ 536. http://www.columbia.edu/kermit/index.html
+ 537. http://www.columbia.edu/kermit/ckermit80.html#x9.2
+ 538. http://www.columbia.edu/kermit/ckermit80.html#top
+ 539. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 540. http://www.columbia.edu/kermit/ckermit.html
+ 541. http://www.columbia.edu/kermit/index.html
+ 542. http://www.columbia.edu/kermit/ckermit80.html#x4
+ 543. http://www.columbia.edu/kermit/ckermit80.html#x4
+ 544. http://www.columbia.edu/kermit/ckermit80.html#top
+ 545. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 546. http://www.columbia.edu/kermit/ckermit.html
+ 547. http://www.columbia.edu/kermit/index.html
+ 548. http://www.columbia.edu/kermit/ckermit80.html#top
+ 549. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 550. http://www.columbia.edu/kermit/ckermit.html
+ 551. http://www.columbia.edu/kermit/index.html
+ 552. http://www.columbia.edu/kermit/ckermit80.html#top
+ 553. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 554. http://www.columbia.edu/kermit/ckermit.html
+ 555. http://www.columbia.edu/kermit/index.html
+ 556. http://www.columbia.edu/kermit/ckermit80.html#x4
+ 557. http://www.columbia.edu/kermit/ckermit80.html#x3.7
+ 558. http://www.columbia.edu/kermit/ckermit80.html#x3.7
+ 559. http://www.columbia.edu/kermit/ckermit80.html#top
+ 560. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 561. http://www.columbia.edu/kermit/ckermit.html
+ 562. http://www.columbia.edu/kermit/index.html
+ 563. ftp://ftp.isi.edu/in-notes/rfc2217.txt
+ 564. http://www.columbia.edu/kermit/ckermit80.html#top
+ 565. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 566. ftp://kermit.columbia.edu/kermit/sredird/
+ 567. http://www.columbia.edu/kermit/ckermit.html
+ 568. http://www.columbia.edu/kermit/index.html
+ 569. http://www.columbia.edu/kermit/ckermi70.htm#x4.22
+ 570. http://www.columbia.edu/kermit/ckermit80.html#top
+ 571. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 572. http://www.columbia.edu/kermit/ckermit.html
+ 573. http://www.columbia.edu/kermit/index.html
+ 574. http://www.columbia.edu/kermit/ckermit80.html#x3.1.3
+ 575. http://www.columbia.edu/kermit/cuiksd.html
+ 576. http://www.columbia.edu/kermit/ckermit80.html#top
+ 577. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 578. http://www.columbia.edu/kermit/ckermit.html
+ 579. http://www.columbia.edu/kermit/index.html
+ 580. http://www.columbia.edu/kermit/ckermit80.html#top
+ 581. http://www.columbia.edu/kermit/ckermit80.html#contents
+ 582. http://www.columbia.edu/kermit/ckermit.html
+ 583. http://www.columbia.edu/kermit/index.html
+ 584. http://www.columbia.edu/kermit/index.html
diff --git a/ckermod.ini b/ckermod.ini
new file mode 100644 (file)
index 0000000..5848c3f
--- /dev/null
@@ -0,0 +1,144 @@
+; File CKERMOD.INI, Sample C-Kermit 7.0 customization file.
+;
+; This file, which is ONLY A SAMPLE, should be called:
+;
+;   .mykermrc   (UNIX, OS-9, Aegis, BeBox, Plan 9)
+;   CKERMOD.INI (VMS, OpenVMS, AOS/VS, OS/2, Amiga, Atari ST)
+;   ckermod.ini (Stratus VOS)
+;
+; This file is executed automatically by the standard C-Kermit initialization
+; file, CKERMIT.INI (or .kermrc).  This file is not executed by C-Kermit itself
+; unless the initialization file is not found.
+;
+; MODify this file to suit your needs and preferences, and install it in your
+; home directory.  Or replace it entirely with a new file.
+;
+; The design of this sample customization file lets you fill in a section for
+; each different operating system where you run C-Kermit.
+;
+; In UNIX, if you give this file execute permission and make sure the top
+; line indicates the full path of the C-Kermit 7.0-or-later executable, you
+; can execute this file directly, as if it was a shell script, except it is
+; interpreted by Kermit rather than the shell.  This lets you have as many
+; different startup files as you like, each suited to a particular purpose.
+;
+; Authors:  Christine Gianone, Frank da Cruz, Jeffrey Altman,
+;           The Kermit Project, Columbia University.
+; Creation: 23 November 1992 for C-Kermit 5A(188).
+; Modified: 30 June 1993 for edit 189.
+;           04 October 1994 for edit 190.
+;           17 April 1995 for edit 191.
+;            6 September 1996 for version 6.0, edit 192.
+;            1 January 2000 for version 7.0, edit 196.
+;           14 October 2001 for version 8.0, edit 200.
+
+ECHO
+ECHO Executing SAMPLE C-Kermit customization file \v(cmdfile) for \v(system)...
+ECHO { Please edit this file to reflect your needs and preferences.}
+ECHO
+;
+; ... and then remove the ECHO commands above.
+
+COMMENT - Settings that apply to all the systems I use:
+;
+set delay 1                  ; I escape back quickly
+set dial display on          ; I like to watch C-Kermit dial
+
+; Dialing locale and method
+;
+; SET DIAL COUNTRY-CODE 1    ; Uncomment and replace with yours
+; SET DIAL AREA-CODE 000     ; Uncomment and replace with yours
+; SET DIAL LD-PREFIX 1       ; Uncomment and replace with yours
+; SET DIAL INTL-PREFIX 011   ; Uncomment and replace with yours
+; SET DIAL METHOD TONE       ; Uncomment and replace with PULSE if necessary
+; SET DIAL DIRECTORY ... ... ; List dialing directory files here
+
+if < \v(version) 600192 -
+  stop 1 \v(cmdfile): C-Kermit 6.0.192 or later required.
+
+set take error on            ; Make errors fatal temporarily
+check if                     ; Do we have an IF command?
+set take error off           ; Yes we do, back to normal
+
+; The ON_EXIT macro is executed automatically when C-Kermit exits.
+; Define as desired.
+;
+define ON_EXIT echo Returning you to \v(system) now.
+
+; System-independent quick dialing macro.  Depends on having the
+; macros MYMODEM, MYPORT, and (optionally) MYSPEED defined in the
+; system-dependent sections below.
+;
+define MYDIAL {
+    if not defined MYMODEM end 1 {\%0: Modem type not defined.}
+    set modem type \m(MYMODEM)
+    if fail end 1 {\%0: \m(MYMODEM): Unsupported modem type.}
+    if not defined MYPORT end 1 {\%0: Communication port not defined.}
+    set port \m(MYPORT)
+    if fail end 1 {\%0: SET PORT \m(MYPORT) failed.}
+    if defined MYFLOW set flow \m(MYFLOW)
+    if fail end 1 {\%0: SET FLOW \m(MYFLOW) failed.}
+    if defined MYSPEED set speed \m(MYSPEED)
+    if fail end 1 {\%0: SET SPEED \m(MYSPEED) failed.}
+    dial \%1\%2\%3\%4\%5\%6\%7\%8\%9
+    end \v(status)
+}
+
+forward \v(system)              ; Go execute system-dependent commands
+
+:UNIX                           ; UNIX, all versions...
+define MYPORT /dev/cua          ; My dialing environment
+define MYMODEM usr              ; Replace these by what you actually have
+define MYSPEED 57600
+;
+; If you want all your downloads to go to the same directory, no matter
+; what your current directory is, uncomment and edit the following command:
+;
+;   set file download-directory ~/download ; Download directory for UNIX
+
+; Put other UNIX-specific commands here...
+end                             ; End of UNIX section
+
+:VMS                            ; VMS and OpenVMS
+define MYPORT TXA0:             ; My dialing environment
+define MYMODEM usr              ; Replace these by what you actually have
+define MYSPEED 57600
+; set file download-directory [\$(USER).DOWNLOAD] ; Download directory for VMS
+; Put other VMS-specific commands here...
+end                             ; End of VMS section
+
+:WIN32                          ; Windows and OS/2 customizations...
+:OS/2
+define MYPORT COM1              ; My dialing environment
+define MYMODEM usr              ; Replace these by what you actually have
+define MYSPEED 57600
+set command byte 8              ; Use 8 bits between Kermit and console
+set xfer char latin1            ; Use Latin-1 for text file transfer
+set term char latin1            ; And use Latin-1 during CONNECT mode
+; set file download-directory C:\DOWNLOADS
+end
+
+:OS9/68K                        ; OS-9/68000
+define MYPORT /t3               ; My dialing environment
+define MYMODEM usr              ; Replace these by what you actually have
+define MYSPEED 9600
+; set file download-directory ~/downloads
+end                             ; End of OS-9 section
+
+:AOS/VS                         ; Data General AOS/VS
+define MYPORT @con3             ; My dialing environment
+define MYMODEM usr              ; Replace these by what you actually have
+define MYSPEED 9600
+; set file download-directory \v(home)DOWNLOADS
+end
+
+; And so on, you get the idea...
+; Fill in the sections that apply to you.
+
+:Stratus_VOS                   ; Stratus VOS
+:Amiga                          ; Commodore Amiga
+:Atari_ST                       ; Atari ST
+:Macintosh                      ; Apple Macintosh
+:unknown                        ; Others
+
+; (End of CKERMOD.INI)
diff --git a/ckubwr.txt b/ckubwr.txt
new file mode 100644 (file)
index 0000000..4b0d387
--- /dev/null
@@ -0,0 +1,5330 @@
+
+                       C-Kermit 8.0 Unix Hints and Tips
+
+     Frank da Cruz
+     [1]The Kermit Project, [2]Columbia University
+
+   As of: C-Kermit 8.0.211 10 April 2004
+   This page last updated: Fri Apr 16 16:13:14 2004 (New York USA Time)
+
+     IF YOU ARE READING A PLAIN-TEXT version of this document, note it
+     is a plain-text dump of a Web page. You can visit the original (and
+     possibly more up-to-date) Web page here:
+
+  [3]http://www.columbia.edu/kermit/ckubwr.html
+
+     Since the material in this file has been accumulating since 1985,
+     some (much) of it might be dated. [4]Feedback from experts on
+     particular OS's and platforms is always welcome. 
+
+   [ [5]C-Kermit ] [ [6]Installation Instructions ] [ [7]TUTORIAL ]
+    ________________________________________________________________________
+
+  CONTENTS
+
+    1. [8]INTRODUCTION
+    2. [9]PREBUILT C-KERMIT BINARIES
+    3. [10]PLATFORM-SPECIFIC NOTES
+    4. [11]GENERAL UNIX-SPECIFIC LIMITATIONS AND BUGS
+    5. [12]INITIALIZATION AND COMMAND FILES
+    6. [13]COMMUNICATION SPEED SELECTION
+    7. [14]COMMUNICATIONS AND DIALING
+    8. [15]HARDWARE FLOW CONTROL
+    9. [16]TERMINAL CONNECTION AND KEY MAPPING
+   10. [17]FILE TRANSFER
+   11. [18]EXTERNAL FILE TRANSFER PROTOCOLS
+   12. [19]SECURITY
+   13. [20]MISCELLANEOUS USER REPORTS
+   14. [21]THIRD-PARTY DRIVERS
+
+   Quick Links:   [ [22]Linux ] [ [23]*BSD ] [[24]Mac OS X] [ [25]AIX ] [
+   [26]HP-UX ] [ [27]Solaris ] [ [28]SCO ] [ [29]DEC/Compaq ]
+    ________________________________________________________________________
+
+  1. INTRODUCTION
+
+   [ [30]Top ] [ [31]Contents ] [ [32]Next ]
+
+   SECTION CONTENTS
+
+  1.1. [33]Documentation
+  1.2. [34]Technical Support
+  1.3. [35]The Year 2000
+  1.4. [36]The Euro
+
+   THIS IS WHAT USED TO BE CALLED the "beware file" for the Unix version
+   of C-Kermit, previously distributed as ckubwr.txt and, before that, as
+   ckuker.bwr, after the fashion of old Digital Equipment Corporation
+   (DEC) software releases that came with release notes (describing what
+   had changed) and a "beware file" listing known bugs, limitations,
+   "non-goals", and things to watch out for. The C-Kermit beware file has
+   been accumulating since 1985, and it applies to many different
+   hardware platforms and operating systems, and many versions of them,
+   so it is quite large. Prior to C-Kermit 8.0, it was distributed only
+   in plain-text format. Now it is available as a Web document with
+   links, internal cross references, and so on, to make it easier to use.
+
+   This document applies to Unix C-Kermit in general, as well as to
+   specific Unix variations like [37]Linux, [38]AIX, [39]HP-UX,
+   [40]Solaris, and so on, and should be read in conjunction with the
+   [41]platform-independent C-Kermit beware file, which contains similar
+   information, but applying to all versions of C-Kermit (VMS, Windows,
+   OS/2, AOS/VS, VOS, etc, as well as to Unix).
+
+   There is much in this document that is (only) of historical interest.
+   The navigation links should help you skip directly to the sections
+   that are relevant to you. Numerous offsite Web links are supposed to
+   lead to further information but, as you know, Web links go stale
+   frequently and without warning. If you can supply additional,
+   corrected, updated, or better Web links, please feel free to [42]let
+   us know.
+
+  1.1. Documentation
+
+   [ [43]Top ] [ [44]Contents ] [ [45]Next ]
+
+   C-Kermit 6.0 is documented in the book [46]Using C-Kermit, Second
+   Edition, by Frank da Cruz and Christine M. Gianone, Digital Press,
+   Burlington, MA, USA, ISBN 1-55558-164-1 (1997), 622 pages. This
+   remains the definitive C-Kermit documentation. Until the third edition
+   is published (sorry, there is no firm timeframe for this), please also
+   refer to:
+
+   [47]Supplement to Using C-Kermit, Second Edition, For C-Kermit 7.0
+          Thorough documentation of features new to version 7.0.
+
+   [48]Supplement to Using C-Kermit, Second Edition, For C-Kermit 8.0
+          Thorough documentation of features new to version 8.0.
+
+  1.2. Technical Support
+
+   [ [49]Top ] [ [50]Contents ] [ [51]Section Contents ] [ [52]Next ] [
+   [53]Previous ]
+
+   For information on how to get technical support, please visit:
+
+    [54]http://www.columbia.edu/kermit/support.html
+
+  1.3. The Year 2000
+
+   [ [55]Top ] [ [56]Contents ] [ [57]Section Contents ] [ [58]Next ] [
+   [59]Previous ]
+
+   The Unix version of C-Kermit, release 6.0 and later, is "Year 2000
+   compliant", but only if the underlying operating system is too.
+   Contact your Unix operating system vendor to find out which operating
+   system versions, patches, hardware, and/or updates are required.
+   (Quite a few old Unixes are still in operation in the new millenium,
+   but with their date set 28 years in the past so at least the non-year
+   parts of the calendar are correct.)
+
+   As of C-Kermit 6.0 (6 September 1996), post-millenium file dates are
+   recognized, transmitted, received, and reproduced correctly during the
+   file transfer process in C-Kermit's File Attribute packets. If
+   post-millenium dates are not processed correctly on the other end,
+   file transfer still takes place, but the modification or creation date
+   of the received file might be incorrect. The only exception would be
+   if the "file collision update" feature is being used to prevent
+   unnecessary transfer of files that have not changed since the last
+   time a transfer took place; in this case, a file might be transferred
+   unnecessarily, or it might not be transferred when it should have
+   been. Correct operation of the update feature depends on both Kermit
+   programs having the correct date and time.
+
+   Of secondary importance are the time stamps in the transaction and/or
+   debug logs, and the date-related script programming constructs, such
+   as \v(date), \v(ndate), \v(day), \v(nday), and perhaps also the
+   time-related ones, \v(time) and \v(ntime), insofar as they might be
+   affected by the date. The \v(ndate) is a numeric-format date of the
+   form yyyymmdd, suitable for both lexical and numeric comparison and
+   sorting: e.g. 19970208 or 20011231. If the underlying operating system
+   returns the correct date information, these variables will have the
+   proper values. If not, then scripts that make decisions based on these
+   variables might not operate correctly.
+
+   Most date-related code is based upon the C Library asctime() string,
+   which always has a four-digit year. In Unix, the one bit of code in
+   C-Kermit that is an exception to this rule is several calls to
+   localtime(), which returns a pointer to a tm struct, in which the year
+   is presumed to be expressed as "years since 1900". The code depends on
+   this assumption. Any platforms that violate it will need special
+   coding. As of this writing, no such platforms are known.
+
+   Command and script programming functions that deal with dates use
+   C-Kermit specific code that always uses full years.
+
+  1.4. The Euro
+
+   [ [60]Top ] [ [61]Contents ] [ [62]Section Contents ] [ [63]Previous ]
+
+   C-Kermit 7.0 and later support Unicode (ISO 10646), ISO 8859-15 Latin
+   Alphabet 9, PC Code Page 858, Windows Code Pages 1250 and 1251, and
+   perhaps other character sets, that encode the Euro symbol, and can
+   translate among them as long as no intermediate character-set is
+   involved that does not include the Euro.
+    ________________________________________________________________________
+
+  2. PREBUILT C-KERMIT BINARIES
+
+   [ [64]Top ] [ [65]Contents ] [ [66]Next ] [ [67]Previous ]
+
+   It is often dangerous to run a binary C-Kermit (or any other) program
+   built on a different computer. Particularly if that computer had a
+   different C compiler, libraries, operating system version, processor
+   features, etc, and especially if the program was built with shared
+   libraries, because as soon as you update the libraries on your system,
+   they no longer match the ones referenced in the binary, and the binary
+   might refuse to load when you run it, in which case you'll see error
+   messages similar to:
+
+  Could not load program kermit
+  Member shr4.o not found or file not an archive
+  Could not load library libcurses.a[shr4.o]
+  Error was: No such file or directory
+
+   (These samples are from AIX.) To avoid this problem, we try to build
+   C-Kermit with statically linked libraries whenever we can, but this is
+   increasingly impossible as shared libraries become the norm.
+
+   It is often OK to run a binary built on an earlier OS version, but it
+   is rarely possible (or safe) to run a binary built on a later one, for
+   example to run a binary built under Solaris 8 on Solaris 2.6.
+   Sometimes even the OS-or-library patch/ECO level makes a difference.
+
+   A particularly insidious problem occurs when a binary was built on a
+   version of the OS that has patches from the vendor (e.g. to
+   libraries); in many cases you won't be able to run such a binary on an
+   unpatched version of the same platform.
+
+   When in doubt, build C-Kermit from the source code on the computer
+   where it is to be run (if possible!). If not, ask us for a binary
+   specific to your configuration. We might have one, and if we don't, we
+   might be able to find somebody who will build one for you.
+    ________________________________________________________________________
+
+  3. NOTES ON SPECIFIC UNIX VERSIONS
+
+   [ [68]Top ] [ [69]Contents ] [ [70]Next ] [ [71]Previous ]
+
+   SECTION CONTENTS
+
+  3.0.  [72]C-KERMIT ON PC-BASED UNIXES
+  3.1.  [73]C-KERMIT AND AIX
+  3.2.  [74]C-KERMIT AND HP-UX
+  3.3.  [75]C-KERMIT AND LINUX
+  3.4.  [76]C-KERMIT AND NEXTSTEP
+  3.5.  [77]C-KERMIT AND QNX
+  3.6.  [78]C-KERMIT AND SCO
+  3.7.  [79]C-KERMIT AND SOLARIS
+  3.8.  [80]C-KERMIT AND SUNOS
+  3.9.  [81]C-KERMIT AND ULTRIX
+  3.10. [82]C-KERMIT AND UNIXWARE
+  3.11. [83]C-KERMIT AND APOLLO SR10
+  3.12. [84]C-KERMIT AND TANDY XENIX 3.0
+  3.13. [85]C-KERMIT AND OSF/1 (DIGITAL UNIX) (TRU64 UNIX)
+  3.14. [86]C-KERMIT AND SGI IRIX
+  3.15. [87]C-KERMIT AND THE BEBOX
+  3.16. [88]C-KERMIT AND DG/UX
+  3.17. [89]C-KERMIT AND SEQUENT DYNIX
+  3.18. [90]C-KERMIT AND {FREE,OPEN,NET}BSD
+  3.19. [91]C-KERMIT AND MAC OS X
+  3.20. [92]C-KERMIT AND COHERENT
+
+   The following sections apply to specific Unix versions. Most of them
+   contain references to FAQs (Frequently Asked Questions), but these
+   tend to be ephemeral. For possibly more current information see:
+
+  [93]http://www.faqs.org
+  [94]http://aplawrence.com/Unixart/newtounix.html
+
+   One thread that runs through many of them, and implicitly perhaps
+   through all, concerns the problems that occur when trying to dial out
+   on a serial device that is (also) enabled for dialing in. The
+   "solutions" to this problem are many, varied, diverse, and usually
+   gross, involving configuring the device for bidirectional use. This is
+   done in a highly OS-dependent and often obscure manner, and the
+   effects (good or evil) are also highly dependent on the particular OS
+   (and getty variety, etc). Many examples are given in the
+   [95]OS-specific sections below.
+
+   An important point to keep in mind is that C-Kermit is a
+   cross-platform, portable software program. It was not designed
+   specifically and only for your particular Unix version, or for that
+   matter, for Unix in particular at all. It also runs on VMS, AOS/VS,
+   VOS, and other non-Unix platforms. All the Unix versions of C-Kermit
+   share common i/o modules, with compile-time #ifdef constructions used
+   to account for the differences among the many Unix products and
+   releases. If you think that C-Kermit is behaving badly or missing
+   something on your particular Unix version, you might be right -- we
+   can't claim to be expert in hundreds of different OS / version /
+   hardware / library combinations. If you're a programmer, take a look
+   at the source code and [96]send us your suggested fixes or changes. Or
+   else just [97]send us a report about what seems to be wrong and we'll
+   see what we can do.
+    ________________________________________________________________________
+
+  3.0. C-KERMIT ON PC-BASED UNIXES
+
+   [ [98]Top ] [ [99]Contents ] [ [100]Section Contents ] [ [101]Next ]
+
+   Also see: [102]http://www.pcunix.com/.
+
+   SECTION CONTENTS
+
+  3.0.1. [103]Interrupt Conflicts
+  3.0.2. [104]Windows-Specific Hardware
+  3.0.3. [105]Modems
+  3.0.4. [106]Character Sets
+  3.0.5. [107]Keyboard, Screen, and Mouse Access
+  3.0.6. [108]Laptops
+
+  3.0.1. Interrupt Conflicts
+
+   [ [109]Top ] [ [110]Contents ] [ [111]Section Contents ] [ [112]Next ]
+
+   PCs are not the best platform for real operating systems like Unix.
+   The architecture suffers from numerous deficiencies, not the least of
+   which is the stiflingly small number of hardware interrupts (either 7
+   or 15, many of which are preallocated). Thus adding devices, using
+   multiple serial ports, etc, is always a challenge and often a
+   nightmare. The free-for-all nature of the PC market and the lack of
+   standards combined with the diversity of Unix OS versions make it
+   difficult to find drivers for any particular device on any particular
+   version of Unix.
+
+   Of special interest to Kermit users is the fact that there is no
+   standard provision in the PC architecture for more than 2
+   communication (serial) ports. COM3 and COM4 (or higher) will not work
+   unless you (a) find out the hardware address and interrupt for each,
+   (b) find out how to provide your Unix version with this information,
+   and (c) actually set up the configuration in the Unix startup files
+   (or whatever other method is used). Watch out for interrupt conflicts,
+   especially when using a serial mouse, and don't expect to be able to
+   use more than two serial ports.
+
+   The techniques for resolving interrupt conflicts are different for
+   each operating system (Linux, NetBSD, etc). In general, there is a
+   configuration file somewhere that lists COM ports, something like
+   this:
+
+  com0    at isa? port 0x3f8 irq 4      # DOS COM1
+  com1    at isa? port 0x2f8 irq 3      # DOS COM2
+
+   The address and IRQ values in this file must agree with the values in
+   the PC BIOS and with the ports themselves, and there must not be more
+   than one device with the same interrupt. Unfortunately, due to the
+   small number of available interrupts, installing new devices on a PC
+   almost always creates a conflict. Here is a typical tale from a Linux
+   user (Fred Smith) about installing a third serial port:
+
+     ...problems can come from a number of causes. The one I fought with
+     for some time, and finally conquered, was that my modem is on an
+     add-in serial port, cua3/IRQ5. By default IRQ5 has a very low
+     priority, and does not get enough service in times when the system
+     is busy to prevent losing data. This in turn causes many resends.
+     There are two 'fixes' that I know of, one is to relax hard disk
+     interrupt hogging by using the correct parameter to hdparm, but I
+     don't like that one because the hdparm man page indicates it is
+     risky to use. The other one, the one I used, was to get 'irqtune'
+     and use it to give IRQ5 the highest priority instead of nearly the
+     lowest. Completely cured the problem.
+
+   Here's another one from a newsgroup posting:
+
+     After much hair pulling, I've discovered why my serial port won't
+     work. Apparently my [PC] has three serial devices (two comm ports
+     and an IR port), of which only two at a time can be active. I
+     looked in the BIOS setup and noticed that the IR port was
+     activated, but didn't realize at the time that this meant that COM2
+     was thereby de-activated. I turned off the IR port and now the
+     serial port works as advertised.
+    ________________________________________________________________________
+
+  3.0.2. Windows-Specific Hardware
+
+   [ [113]Top ] [ [114]Contents ] [ [115]Section Contents ] [ [116]Next ]
+   [ [117]Previous ]
+
+   To complicate matters, the PC platform is becoming increasingly and
+   inexorably Windows-oriented. More and more add-on devices are "Windows
+   only" -- meaning they are incomplete and rely on proprietary
+   Windows-based software drivers to do the jobs that you would expect
+   the device itself to do. PCMCIA, PCI, or "Plug-n-Play" devices are
+   rarely supported on PC-based Unix versions such as SCO; Winmodems,
+   Winprinters, and the like are not supported on any Unix variety (with
+   [118]a few exceptions). The self-proclaimed Microsoft PC 97 (or later)
+   standard only makes matters worse since its only purpose to ensure
+   that PCs are "optimized to run Windows 95 and Windows NT 4.0 and
+   future versions of these operating systems".
+
+   With the exception noted (the Lucent modem, perhaps a handful of
+   others by the time you read this), drivers for "Win" devices are
+   available only for Windows, since the Windows market dwarfs that of
+   any particular Unix brand, and for that matter all Unixes (or for that
+   matter, all non-Windows operating systems) combined. If your version
+   of Unix (SCO, Linux, BSDI, FreeBSD, etc) does not support a particular
+   device, then C-Kermit can't use it either. C-Kermit, like any Unix
+   application, must access all devices through drivers and not directly
+   because Unix is a real operating system.
+
+   Don't waste time thinking that you, or anybody else, could write a
+   Linux (or other Unix) driver for a Winmodem or other "Win" device.
+   First of all, these devices generally require realtime control, but
+   since Unix is a true multitasking operating system, realtime device
+   control is not possible outside the kernel. Second, the specifications
+   for these devices are secret and proprietary, and each one (and each
+   version of each one) is potentially different. Third, a Winmodem
+   driver would be enormously complex; it would take years to write and
+   debug, by which time it would be obsolete.
+
+   A more recent generation of PCs (circa 1999-2000) is marketed as
+   "Legacy Free". One can only speculate what that could mean. Most
+   likely it means it will ONLY run the very latest versions of Windows,
+   and is made exclusively of Winmodems, Winprinters, Winmemory, and
+   Win-CPU-fans (Legacy Free is a concept [119]pioneered by Microsoft).
+
+   Before you buy a new PC or add-on equipment, especially serial ports,
+   internal modems, or printers, make sure they are compatible with your
+   version of Unix. This is becoming an ever-greater challenge; only a
+   huge company like Microsoft can afford to be constantly cranking out
+   and/or verifying drivers for the thousands of video boards, sound
+   cards, network adapters, SCSI adapters, buses, etc, that spew forth in
+   an uncontrolled manner from all corners of the world on a daily basis.
+   With very few exceptions, makers of PCs assemble the various
+   components and then verify them only with Windows, which they must do
+   since they are, no doubt, preloading the PC with Windows. To find a
+   modern PC that is capable of running a variety of non-Windows
+   operating systems (e.g. Linux, SCO OpenServer, Unixware, and Solaris)
+   is a formidable challenge requiring careful study of each vendor's
+   "compatibility lists" and precise attention to exact component model
+   numbers and revision levels.
+    ________________________________________________________________________
+
+  3.0.3. Modems
+
+   [ [120]Top ] [ [121]Contents ] [ [122]Section Contents ] [ [123]Next ]
+   [ [124]Previous ]
+
+   External modems are recommended:
+
+     * They don't need any special drivers.
+     * You can use the lights and speaker to troubleshoot dialing.
+     * You can share them among all types of computers.
+     * You can easily turn them off and on when power-cycling seems
+       warranted.
+     * They are more likely to have manuals.
+
+   Internal PC modems (even when they are not Winmodems, which is
+   increasingly unlikely in new PCs) are always trouble, especially in
+   Unix. Even when they work for dialing out, they might not work for
+   dialing in, etc. Problems that occur when using an internal modem can
+   almost always be eliminated by switching to an external one. Even when
+   an internal modem is not a Winmodem or Plug-n-Play, it is often a
+   no-name model of unknown quality -- not the sort of thing you want
+   sitting directly on your computer's bus. (Even if it does not cause
+   hardware problems, it probably came without a command list, so no Unix
+   software will know how to control it.) For more about Unix compatible
+   modems, see:
+
+  [125]http://www.idir.net/~gromitkc/winmodem.html
+
+   Remember that PCs, even now -- more than two decades after they were
+   first introduced -- are not (in general) capable of supporting more
+   than 2 serial devices. Here's a short success story from a recent
+   newsgroup posting: "I have a Diamond SupraSonic II dual modem in my
+   machine. What I had to end up doing is buying a PS/2 mouse and port
+   and install it. Had to get rid of my serial mouse. I also had to
+   disable PnP in my computer bios. I was having IRQ conflicts between my
+   serial mouse and 'com 3'. Both modems work fine for me. My first modem
+   is ttyS0 and my second is ttyS1." Special third-party multiport boards
+   such as [126]DigiBoard are available for certain Unix platforms
+   (typically SCO, maybe Linux) that come with special platform-specific
+   drivers.
+    ________________________________________________________________________
+
+  3.0.4. Character Sets
+
+   [ [127]Top ] [ [128]Contents ] [ [129]Section Contents ] [ [130]Next ]
+   [ [131]Previous ]
+
+   PCs generally have PC code pages such as CP437 or CP850, and these are
+   often used by PC-based Unix operating systems, particularly on the
+   console. These are supported directly by C-Kermit's SET FILE
+   CHARACTER-SET and SET TERMINAL CHARACTER-SET commands. Some PC-based
+   Unix versions, such as recent Red Hat Linux releases, might also
+   support Microsoft Windows code pages such as CP1252, or even Latin
+   Alphabet 1 itself (perhaps displayed with CP437 glyphs). (And work is
+   in progress to support Unicode UTF8 in Linux.)
+
+   Certain Windows code pages are not supported directly by C-Kermit, but
+   since they are ISO Latin Alphabets with nonstandard "extensions" in
+   the C1 control range, you can substitute the corresponding Latin
+   alphabet (or other character set) in any C-Kermit character-set
+   related commands:
+
+  Windows Code Page    Substitution
+   CP 1004              Latin-1
+   CP 1051              HP Roman-8
+
+   Other Windows code pages are mostly (or totally) incompatible with
+   their Latin Alphabet counterparts (e.g. CP1250 and Latin-2), and
+   several of these are already supported by C-Kermit 7.0 and later
+   (1250, 1251, and 1252).
+    ________________________________________________________________________
+
+  3.0.5. Keyboard, Screen, and Mouse Access
+
+   [ [132]Top ] [ [133]Contents ] [ [134]Section Contents ] [ [135]Next ]
+   [ [136]Previous ]
+
+   Finally, note that as a real operating system, Unix (unlike Windows)
+   does not provide the intimate connection to the PC keyboard, screen,
+   and mouse that you might expect. Unix applications can not "see" the
+   keyboard, and therefore can not be programmed to understand F-keys,
+   Editing keys, Arrow keys, Alt-key combinations, and the like. This is
+   because:
+
+    a. Unix is a portable operating system, not only for PCs;
+    b. Unix sessions can come from anywhere, not just the PC's own
+       keyboard and screen; and:
+    c. even though it might be possible for an application that actually
+       is running on the PC's keyboard and screen to access these devices
+       directly, there are no APIs (outside of X) for this.
+    ________________________________________________________________________
+
+  3.0.6. Laptops
+
+   [ [137]Top ] [ [138]Contents ] [ [139]Section Contents ] [
+   [140]Previous ]
+
+   (To be filled in . . .)
+    ________________________________________________________________________
+
+  3.1. C-KERMIT AND AIX
+
+   [ [141]Top ] [ [142]Contents ] [ [143]Section Contents ] [ [144]Next ]
+   [ [145]Previous ]
+
+   SECTION CONTENTS
+
+  3.1.1. [146]AIX: General
+  3.1.2. [147]AIX: Network Connections
+  3.1.3. [148]AIX: Serial Connections
+  3.1.4. [149]AIX: File Transfer
+  3.1.5. [150]AIX: Xterm Key Map
+
+   For additional information see:
+     * [151]http://www.emerson.emory.edu/services/aix-faq/
+     * [152]http://www.faqs.org/faqs/by-newsgroup/comp/comp.unix.aix.html
+     * [153]http://www.cis.ohio-state.edu/hypertext/faq/usenet/aix-faq/to
+       p.html
+     * [154]http://aixpdslib.seas.ucla.edu/
+     * [155]http://www.rootvg.net (AIX history)
+     * [156]ftp://rtfm.mit.edu/pub/usenet/news.answers/aix-faq/part1
+     * [157]ftp://mirrors.aol.com/pub/rtfm/usenet-by-hierarchy/comp/unix/
+       aix
+
+   and/or read the [158]comp.unix.aix newsgroup.
+      ______________________________________________________________________
+
+    3.1.1. AIX: General
+
+   [ [159]Top ] [ [160]Contents ] [ [161]Section Contents ] [ [162]Next ]
+
+   About AIX version numbers: "uname -a" tells the two-digit version
+   number, such as 3.2 or 4.1. The three-digit form can be seen with the
+   "oslevel" command (this information is unavailable at the API level
+   and is reportedly obtained by scanning the installed patch list).
+   Supposedly all three-digit versions within the same two-digit version
+   (e.g. 4.3.1, 4.3.2) are binary compatible; i.e. a binary built on any
+   one of them should run on all others, but who knows. Most AIX
+   advocates tell you that any AIX binary will run on any AIX version
+   greater than or equal to the one under which it was built, but
+   experience with C-Kermit suggests otherwise. It is always best to run
+   a binary built under your exact same AIX version, down to the third
+   decimal place, if possible. Ideally, build it from source code
+   yourself. Yes, this advice would be easier to follow if AIX came with
+   a C compiler.
+      ______________________________________________________________________
+
+    3.1.2. AIX: Network Connections
+
+   [ [163]Top ] [ [164]Contents ] [ [165]Section Contents ] [ [166]Next ]
+   [ [167]Previous ]
+
+   File transfers into AIX 4.2 or 4.3 through the AIX Telnet or Rlogin
+   server have been observed to fail (or accumulate huge numbers of
+   correctable errors, or even disconnect the session), when exactly the
+   same kind of transfers into AIX 4.1 work without incident, as do such
+   transfers into all non-AIX platforms on the same kind of connections
+   (with a few exceptions noted elsewhere in this document). AIX 4.3.3
+   seems to be particularly fragile in this regard; the weakness seems to
+   be in its pseudoterminal (pty) driver. High-speed streaming transfers
+   work perfectly, however, if the AIX Telnet server and pty driver are
+   removed from the picture; e.g, by using "set host * 3000" on AIX.
+
+   The problem can be completely cured by replacing the IBM Telnet server
+   with [168]MIT's Kerberos Telnet server -- even if you don't actually
+   use the Kerberos part. Diagnosis: AIX pseudoterminals (which are
+   controlled by the Telnet server to give you a login terminal for your
+   session) have quirks that not even IBM knows about. The situation with
+   AIX 5.x is not known, but if it has the same problem, the same cure is
+   available.
+
+   Meanwhile, the only remedy when going through the IBM Telnet server is
+   to cut back on Kermit's performance settings until you find a
+   combination that works:
+
+     * SET STREAMING OFF
+     * SET WINDOW-SIZE small-number
+     * SET { SEND, RECEIVE } PACKET-LENGTH small-number
+     * SET PREFIXING { CAUTIOUS, ALL }
+
+   In some cases, severe cutbacks are required, e.g. those implied by the
+   ROBUST command. Also be sure that the AIX C-Kermit on the remote end
+   has "set flow none" (which is the default). NOTE: Maybe this one can
+   also be addressed by starting AIX telnetd with the "-a" option. The
+   situation with SSH connections is not known, but almost certainly the
+   same.
+
+   When these problems occur, the system error log contains:
+
+  LABEL:          TTY_TTYHOG
+  IDENTIFIER:     0873CF9F
+  Type:           TEMP
+  Resource Name:  pts/1
+
+  Description
+  TTYHOG OVER-RUN
+
+  Failure Causes
+  EXCESSIVE LOAD ON PROCESSOR
+
+  Recommended Actions
+  REDUCE SYSTEM LOAD.
+  REDUCE SERIAL PORT BAUD RATE
+
+   Before leaving the topic of AIX pseudoterminals, it is very likely
+   that Kermit's PTY and SSH commands do not work well either, for the
+   same reason that Telnet connections into AIX don't work well. A brief
+   test with "pty rlogin somehost" got a perfectly usable terminal
+   (CONNECT) session, but file-transfer problems like those just
+   described.
+
+   Reportedly, telnet from AIX 4.1-point-something to non-Telnet ports
+   does not work unless the port number is in the /etc/services file;
+   it's not clear from the report whether this is a problem with AIX
+   Telnet (in which case it would not affect Kermit), or with the sockets
+   library (in which case it would). The purported fix is IBM APAR
+   IX61523.
+
+   C-Kermit SET HOST or TELNET from one AIX 3.1 (or earlier) system to
+   another won't work right unless you set your local terminal type to
+   something other than AIXTERM. When your terminal type is AIXTERM, AIX
+   TELNET sends two escapes whenever you type one, and the AIX telnet
+   server swallows one of them. This has something to do with the "hft"
+   device. This behavior seems to be removed in AIX 3.2 and later.
+      ______________________________________________________________________
+
+    3.1.3. AIX: Serial Connections
+
+   [ [169]Top ] [ [170]Contents ] [ [171]Section Contents ] [ [172]Next ]
+   [ [173]Previous ]
+
+   In AIX 3, 4, or 5, C-Kermit won't be able to "set line /dev/tty0" (or
+   any other dialout device) if you haven't installed "cu" or "uucp" on
+   your system, because installing these is what creates the UUCP
+   lockfile directory. If SET LINE commands always result in "Sorry,
+   access to lock denied", even when C-Kermit has been given the same
+   owner, group, and permissions as cu:
+
+  -r-sr-xr-x   1 uucp     uucp       67216 Jul 27 1999  cu
+
+   and even when you run it as root, then you must go back and install
+   "cu" from your AIX installation media.
+
+   According to IBM's "From Strength to Strength" document (21 April
+   1998), in AIX 4.2 and later "Async supports speeds on native serial
+   ports up to 115.2kbps". However, no API is documented to achieve
+   serial speeds higher than 38400 bps. Apparently the way to do this --
+   which might or might not work only on the IBM 128-port multiplexer --
+   is:
+
+  cxma-stty fastbaud /dev/tty0
+
+   which, according to "man cxma-stty":
+
+     fastbaud Alters the baud rate table, so 50 baud becomes 57600 baud.
+     -fastbaud Restores the baud rate table, so 57600 baud becomes 50
+     baud.
+
+   Presumably (but not certainly) this extrapolates to 110 "baud" becomes
+   76800 bps, and 150 becomes 115200 bps. So to use high serial speeds in
+   AIX 4.2 or 4.3, the trick would be to give the "cxma-stty fastbaud"
+   command for the desired tty device before starting Kermit, and then
+   use "set speed 50", "set speed 110", or "set speed 150" to select
+   56700, 76800, or 115200 bps. It is not known whether cxma-stty
+   requires privilege.
+
+   According to one report, "Further investigation with IBM seems to
+   indicate that the only hardware capable of doing this is the 128-port
+   multiplexor with one (or more) of the 16 port breakout cables
+   (Enhanced Remote Async Node 16-Port EIA-232). We are looking at about
+   CDN$4,000 in hardware just to hang a 56kb modem on there. Of course,
+   we can then hang 15 more, if we want. This hardware combo is described
+   to be good to 230.4kbps."
+
+   Another report says (quote from AIX newsgroup, March 1999):
+
+     The machine type and the adapter determine the speed that one can
+     actually run at. The older microchannel machines have much slower
+     crystal frequencies and may not go beyond 76,800. A feature put
+     into AIX 421 allows one to key in non-POSIX baud rates and if the
+     uart can support that speed, it will get set. this applies also to
+     43p's and beyond. 115200 is the max for the 43P's native serial
+     port. As crytal frequencies continue to increase, the built-in
+     serial ports speeds will improve. To use 'uucp' or 'ate' at the
+     higher baud rates, configure the port for the desired speed, but
+     set the speed of uucp or ate to 50. Any non-POSIX speeds set in the
+     ttys configuration will the be used. In the case of the 128-port
+     adapters or the ISA 8-port or PCI 8-port adapter, there are only a
+     few higher baud rates.
+
+    a. Change the port to enable high baud rates:
+          + B50 for 57600
+          + B75 for 76800
+          + B110 for 115200
+          + B200 for 230000
+    b. chdev -l ttyX -a fastbaud=enable
+          + For the 128 ports original style rans, only 57600 bps is
+            supported.
+          + For the new enhanced RANs, up to 230Kbps is supported.
+
+   In AIX 2.2.1 on the RT PC with the 8-port multiplexer, SET SPEED 38400
+   gives 9600 bps, but SET SPEED 19200 gives 19200 (on the built-in S1
+   port).
+
+   Note that some RS/6000s (e.g. the IBM PowerServer 320) have
+   nonstandard rectangular 10-pin serial ports; the DB-25 connector is
+   NOT a serial port; it is a parallel printer port. IBM cables are
+   required for the serial ports, (The IBM RT PC also had rectangular
+   serial ports -- perhaps the same as these, perhaps different.)
+
+   If you dial in to AIX through a modem that is connected directly to an
+   AIX port (e.g. on the 128-port multiplexer) and find that data is
+   lost, especially when uploading files to the AIX system (and system
+   error logs report buffer overruns on the port):
+
+    1. Make sure the port and modem are BOTH configured for hardware
+       (RTS/CTS) flow control. The port is configured somewhere in the
+       system configuration, outside of Kermit.
+    2. Tell C-Kermit to "set flow keep"; experimentation shows that SET
+       FLOW RTS/CTS has no effect when used in remote mode (i.e. on
+       /dev/tty, as opposed to a specify port device).
+    3. Fixes for bugs in the original AIX 4.2 tty (serial i/o) support
+       and other AIX bugs are available from IBM at:
+  [174]http://service.software.ibm.com/rs6000/
+       Downloads -> Software Fixes -> Download FixDist gets an
+       application for looking up known problems.
+
+   Many problems reported with bidirectional terminal lines on AIX 3.2.x
+   on the RS/6000. Workaround: don't use bidirectional terminal lines, or
+   write a shell-script wrapper for Kermit that turns getty off on the
+   line before starting Kermit, or before Kermit attempts to do the SET
+   LINE. (But note: These problems MIGHT be fixed in C-Kermit 6.0 and
+   later.) The commands for turning getty off and on (respectively) are
+   /usr/sbin/pdisable and /usr/sbin/penable.
+      ______________________________________________________________________
+
+    3.1.4. AIX: File Transfer
+
+   [ [175]Top ] [ [176]Contents ] [ [177]Section Contents ] [ [178]Next ]
+   [ [179]Previous ]
+
+   Evidently AIX 4.3 (I don't know about earlier versions) does not allow
+   open files to be overwritten. This can cause Kermit transfers to fail
+   when FILE COLLISION is OVERWRITE, where they might work on other Unix
+   varieties or earlier AIX versions.
+
+   Transfer of binary -- and maybe even text -- files can fail in AIX if
+   the AIX terminal has particular port can have character-set
+   translation done for it by the tty driver. The following advice from a
+   knowledgeable AIX user:
+
+     [This feature] has to be checked (and set/cleared) with a separate
+     command, unfortunately stty doesn't handle this. To check:
+
+  $ setmaps
+  input map: none installed
+  output map: none installed
+
+     If it says anything other than "none installed" for either one, it
+     is likely to cause a problem with kermit. To get rid of installed
+     maps:
+
+  $ setmaps -t NOMAP
+
+     However, I seem to recall that with some versions of AIX before
+     3.2.5, only root could change the setting. I'm not sure what
+     versions - it might have only been under AIX 3.1 that this was
+     true. At least with AIX 3.2.5 an ordinary user can set or clear the
+     maps.
+
+   On the same problem, another knowledgeable AIX user says:
+
+     The way to get information on the NLS mapping under AIX (3.2.5
+     anyway) is as follows. From the command line type:
+
+  lsattr -l tty# -a imap -a omap -E -H
+
+     Replace the tty number for the number sign above. This will give a
+     human readable output of the settings that looks like this;
+
+  # lsattr -l tty2 -a imap -a omap -E -H
+  attribute value description     user_settable
+
+  imap      none  INPUT map file  True
+  omap      none  OUTPUT map file True
+
+     If you change the -H to a -O, you get output that can easily be
+     processed by another program or a shell script, for example:
+
+  # lsattr -l tty2 -a imap -a omap -E -O
+  #imap:omap
+  none:none
+
+     To change the settings from the command line, the chdev command is
+     used with the following syntax.
+
+  chdev -l tty# -a imap='none' -a omap='none'
+
+     Again substituting the appropriate tty port number for the number
+     sign, "none" being the value we want for C-Kermit. Of course, the
+     above can also be changed by using the SMIT utility and selecting
+     devices - tty. (...end quote)
+      ______________________________________________________________________
+
+    3.1.5. AIX: Xterm Key Map
+
+   [ [180]Top ] [ [181]Contents ] [ [182]Section Contents ] [
+   [183]Previous ]
+
+   Here is a sample configuration for setting up an xterm keyboard for
+   VT220 or higher terminal emulation on AIX, courtesy of Bruce Momjian,
+   Drexel Hill, PA. Xterm can be started like this:
+
+  xterm $XTERMFLAGS +rw +sb +ls $@ -tm 'erase ^? intr ^c' -name vt220 \
+          -title vt220 -tn xterm-220 "$@" &
+
+---------------------------------------------------------------------------
+  XTerm*VT100.Translations: #override \n\
+          <Key>Home: string(0x1b) string("[3~") \n \
+          <Key>End: string(0x1b) string("[4~") \n
+  vt220*VT100.Translations: #override \n\
+  Shift   <Key>F1: string("[23~") \n \
+  Shift   <Key>F2: string("[24~") \n \
+  Shift   <Key>F3: string("[25~") \n \
+  Shift   <Key>F4: string("[26~") \n \
+  Shift   <Key>F5: string("[K~") \n \
+  Shift   <Key>F6: string("[31~") \n \
+  Shift   <Key>F7: string("[31~") \n \
+  Shift   <Key>F8: string("[32~") \n \
+  Shift   <Key>F9: string("[33~") \n \
+  Shift   <Key>F10: string("[34~") \n \
+  Shift   <Key>F11: string("[28~") \n \
+  Shift   <Key>F12: string("[29~") \n \
+          <Key>Print: string(0x1b) string("[32~") \n\
+          <Key>Cancel: string(0x1b) string("[33~") \n\
+          <Key>Pause: string(0x1b) string("[34~") \n\
+          <Key>Insert: string(0x1b) string("[2~") \n\
+          <Key>Delete: string(0x1b) string("[3~") \n\
+          <Key>Home: string(0x1b) string("[1~") \n\
+          <Key>End: string(0x1b) string("[4~") \n\
+          <Key>Prior: string(0x1b) string("[5~") \n\
+          <Key>Next: string(0x1b) string("[6~") \n\
+          <Key>BackSpace: string(0x7f) \n\
+          <Key>Num_Lock: string(0x1b) string("OP") \n\
+          <Key>KP_Divide: string(0x1b) string("Ol") \n\
+          <Key>KP_Multiply: string(0x1b) string("Om") \n\
+          <Key>KP_Subtract: string(0x1b) string("OS") \n\
+          <Key>KP_Add: string(0x1b) string("OM") \n\
+          <Key>KP_Enter: string(0x1b) string("OM") \n\
+          <Key>KP_Decimal: string(0x1b) string("On") \n\
+          <Key>KP_0: string(0x1b) string("Op") \n\
+          <Key>KP_1: string(0x1b) string("Oq") \n\
+          <Key>KP_2: string(0x1b) string("Or") \n\
+          <Key>KP_3: string(0x1b) string("Os") \n\
+          <Key>KP_4: string(0x1b) string("Ot") \n\
+          <Key>KP_5: string(0x1b) string("Ou") \n\
+          <Key>KP_6: string(0x1b) string("Ov") \n\
+          <Key>KP_7: string(0x1b) string("Ow") \n\
+          <Key>KP_8: string(0x1b) string("Ox") \n\
+          <Key>KP_9: string(0x1b) string("Oy") \n
+
+  !       <Key>Up: string(0x1b) string("[A") \n\
+  !       <Key>Down: string(0x1b) string("[B") \n\
+  !       <Key>Right: string(0x1b) string("[C") \n\
+  !       <Key>Left: string(0x1b) string("[D") \n\
+
+  *visualBell:    true
+  *saveLines:     1000
+  *cursesemul:    true
+  *scrollKey:     true
+  *scrollBar:     true
+    ________________________________________________________________________
+
+  3.2. C-KERMIT AND HP-UX
+
+   [ [184]Top ] [ [185]Contents ] [ [186]Section Contents ] [ [187]Next ]
+   [ [188]Previous ]
+
+   SECTION CONTENTS
+
+  3.2.0. [189]Common Problems
+  3.2.1. [190]Building C-Kermit on HP-UX
+  3.2.2. [191]File Transfer
+  3.2.3. [192]Dialing Out and UUCP Lockfiles in HP-UX
+  3.2.4. [193]Notes on Specific HP-UX Releases
+  3.2.5. [194]HP-UX and X.25
+
+   REFERENCES
+
+   For further information, read the [195]comp.sys.hp.hpux newsgroup.
+
+   C-Kermit is included as part of the HP-UX operating system by contract
+   between Hewlett Packard and Columbia University for HP-UX 10.00 and
+   later. Each level of HP-UX includes a freshly built C-Kermit binary in
+   /bin/kermit, which should work correctly. Binaries built for regular
+   HP-UX may be used on Trusted HP-UX and vice-versa, except for use as
+   IKSD because of the different authentication methods.
+
+   Note that HP does not update C-Kermit versions for any but its most
+   current HP-UX release. So, for example, HP-UX 10.20 has C-Kermit 6.0;
+   11.00 has C-Kermit 7.0, and 11.22 has 8.0. Of course, as with all
+   software, older Kermit versions have bugs (such as buffer overflow
+   vulnerabilities) that are fixed in later versions. From time to time,
+   HP discovers one of these (long-ago fixed) bugs and issues a security
+   alert for the older OS's, recommending some draconian measure to avoid
+   the problem. The true fix in each situation is to install the current
+   release of C-Kermit.
+
+  3.2.0. Common Problems
+
+   [ [196]Top ] [ [197]Contents ] [ [198]Section Contents ] [ [199]Next ]
+
+   Some HP workstations have a BREAK/RESET key. If you hit this key while
+   C-Kermit is running, it might kill or suspend the C-Kermit process.
+   C-Kermit arms itself against these signals, but evidently the
+   BREAK/RESET key is -- at least in some circumstances, on certain HP-UX
+   versions -- too powerful to be caught. (Some report that the first
+   BREAK/RESET shows up as SIGINT and is caught by C-Kermit's former
+   SIGINT handler even when SIGINT is currently set to SIG_IGN; the
+   second kills Kermit; other reports suggest the first BREAK/RESET sends
+   a SIGTSTP (suspend signal) to Kermit, which it catches and suspends
+   itself. You can tell C-Kermit to ignore suspend signals with SET
+   SUSPEND OFF. You can tell C-Kermit to ignore SIGINT with SET COMMAND
+   INTERRUPTION OFF. It is not known whether these commands also grant
+   immunity to the BREAK/RESET key (one report states that with SET
+   SUSPEND OFF, the BREAK/RESET key is ignored the first four times, but
+   kills Kermit the 5th time). In any case:
+
+    1. If this key is mapped to SIGINT or SIGTSTP, C-Kermit catches or
+       ignores it, depending on which mode (CONNECT, command, etc) Kermit
+       is in.
+    2. If it causes HP-UX to kill C-Kermit, there is nothing C-Kermit can
+       do to prevent it.
+
+   When HP-UX is on the remote end of the connection, it is essential
+   that HP-UX C-Kermit be configured for Xon/Xoff flow control (this is
+   the default, but in case you change it and then experience
+   file-transfer failures, this is a likely reason).
+    ________________________________________________________________________
+
+  3.2.1. Building C-Kermit on HP-UX
+
+   [ [200]Top ] [ [201]Contents ] [ [202]Section Contents ] [ [203]Next ]
+   [ [204]Previous ]
+
+     This section applies mainly to old (pre-10.20) HP-UX version on
+     old, slow, and/or memory-constrained hardware.
+
+   During the C-Kermit 6.0 Beta cycle, something happened to ckcpro.w
+   (or, more precisely, the ckcpro.c file that is generated from it)
+   which causes HP optimizing compilers under HP-UX versions 7.0 and 8.0
+   (apparently on all platforms) as well as under HP-UX 9.0 on Motorola
+   platforms only, to blow up. In versions 7.0 and 8.0 the problem has
+   spread to other modules.
+
+   The symptoms vary from the system grinding to a halt, to the compiler
+   crashing, to the compilation of the ckcpro.c module taking very long
+   periods of time, like 9 hours. This problem is handled by compiling
+   the modules that tickle it without optimization; the new C-Kermit
+   makefile takes care of this, and shows how to do it in case the same
+   thing begins happening with other modules.
+
+   On HP-UX 9.0, a kernel parameter, maxdsiz (maximum process data
+   segment size), seems to be important. On Motorola systems, it is 16MB
+   by default, whereas on RISC systems the default is much bigger.
+   Increasing maxdsiz to about 80MB seems to make the problem go away,
+   but only if the system also has a lot of physical memory -- otherwise
+   it swaps itself to death.
+
+   The optimizing compiler might complain about "some optimizations
+   skipped" on certain modules, due to lack of space available to the
+   optimizer. You can increase the space (the incantation depends on the
+   particular compiler version -- see the [205]makefile), but doing so
+   tends to make the compilations take a much longer time. For example,
+   the "hpux0100o+" makefile target adds the "+Onolimit" compiler flag,
+   and about an hour to the compile time on an HP-9000/730. But it *does*
+   produce an executable that is about 10K smaller :-)
+
+   In the makefile, all HP-UX entries automatically skip optimization of
+   problematic modules.
+    ________________________________________________________________________
+
+  3.2.2. File Transfer
+
+   [ [206]Top ] [ [207]Contents ] [ [208]Section Contents ] [ [209]Next ]
+   [ [210]Previous ]
+
+   Telnet connections into HP-UX versions up to and including 11.11 (and
+   possibly 11.20) tend not to lend themselves to file transfer due to
+   limitations, restrictions, and/or bugs in the HP-UX Telnet server
+   and/or pseudoterminal (pty) driver.
+
+   In C-Kermit 6.0 (1996) an unexpected slowness was noted when
+   transferring files over local Ethernet connections when an HP-UX
+   system (9.05 or 10.00) was on the remote end. The following experiment
+   was conducted to determine the cause. C-Kermit 6.0 was used; the
+   situation is slightly better using C-Kermit 7.0's streaming feature
+   and HP-UX 10.20 on the far end.
+
+   The systems were HP-UX 10.00 (on 715/33) and SunOS 4.1.3 (on
+   Sparc-20), both on the same local 10Mbps Ethernet, packet length 4096,
+   parity none, control prefixing "cautious", using only local disks on
+   each machine -- no NFS. In the C-Kermit 6.0 (ACK/NAK) case, the window
+   size was 20; in the streaming case there is no window size (i.e. it is
+   infinite). The test file was C-Kermit executable, transferred in
+   binary mode. Conditions were relatively poor: the Sun and the local
+   net heavily loaded; the HP system is old, slow, and
+   memory-constrained.
+
+                   C-Kermit 6.0...    C-Kermit 7.0...
+ Local    Remote   ACK/NAK........    Streaming......
+ Client   Server   Send    Receive    Send    Receive
+  Sun      HP       36       18        64       18
+  HP       HP       25       15        37       16
+  HP       Sun      77       83       118       92
+  Sun      Sun      60       60       153      158
+
+   So whenever HP is the remote we have poor performance. Why?
+
+     * Changing file display to CRT has no effect (so it's not the curses
+       library on the client side).
+     * Changing TCP RECV-BUFFER or SEND-BUFFER has little effect.
+     * Telling the client to make a binary-mode connection (SET TELNET
+       BINARY REQUESTED, which successfully negotiates a binary
+       connection) has no effect on throughput.
+
+   BUT... If I start HP-UX C-Kermit as a TCP service:
+
+  set host * 3000
+  server
+
+   and then from the client "set host xxx 3000", I get:
+
+                   C-Kermit 6.0...    C-Kermit 7.0...
+ Local    Remote   ACK/NAK........    Streaming......
+ Client   Server   Send    Receive    Send    Receive
+  Sun      HP       77       67       106      139
+  HP       HP       50       50        64       62
+  HP       Sun      57       85       155      105
+  Sun      Sun      57       50       321      314
+
+   Therefore the HP-UX telnet server or pty driver seems to be adding
+   more overhead than the SunOS one, and most others. When going through
+   this type of connection (a remote telnet server) there is little
+   Kermit can do improve matters, since the telnet server and pty driver
+   are between the two Kermits, and neither Kermit program can have any
+   influence over them (except putting the Telnet connection in binary
+   mode, but that doesn't help).
+
+   (The numbers for the HP-HP transfers are lower than the others since
+   both Kermit processes are running on the same slow 33MHz CPU.)
+
+   Matters seem to have deteriorated in HP-UX 11. Now file transfers over
+   Telnet connections fail completely, rather than just being slow. In
+   the following trial, a Telnet connection was made from Kermit 95 to
+   HP-UX 11.11 on an HP-9000/785/B2000 over local 10Mbps Ethernet running
+   C-Kermit 8.00 in server mode (under the HP-UX Telnet server):
+
+                   Text........    Binary......
+  Stream  Pktlen   GET     SEND    GET     SEND
+    On     4000    Fail    Fail    Fail    Fail
+    Off    4000    Fail    Fail    Fail    Fail
+    Off    2000    OK      Fail    OK      Fail
+    On     2000    OK      Fail    OK      Fail
+    On     3000    Fail    Fail    Fail    Fail
+    On     2500    Fail    Fail    Fail    Fail
+    On     2047    OK      Fail    OK      Fail
+    On     2045    OK      Fail    OK      Fail
+    Off     500    OK      OK      OK      OK
+    On      500    OK      Fail    OK      Fail
+    On      240    OK      Fail    OK      Fail
+
+   As you can see, downloads are problematic unless the receiver's Kermit
+   packet length is 2045 or less, but uploads work only with streaming
+   disabled and the packet length restricted to 500. To force file
+   transfers to work on this connection, the desktop Kermit must be told
+   to:
+
+  set streaming off
+  set receive packet-length 2000
+  set send packet-length 500
+
+   However, if a connection is made between the same two programs on the
+   same two computers over the same network, but this time a direct
+   socket-to-socket connection bypassing the HP-UX Telnet server and pty
+   driver (tell HP-UX C-Kermit to "set host /server * 3000 /raw"; tell
+   desktop client program to "set host blah 3000 /raw"), everything works
+   perfectly with the default Kermit settings (streaming, 4K packets,
+   liberal control-character unprefixing, 8-bit transparency, etc):
+
+                   Text........    Binary......
+  Stream  Pktlen   GET     SEND    GET     SEND
+    On     4000    OK      OK      OK      OK
+
+   And in this case, transfer rates were approximately 900,000 cps. To
+   verify that the behavior reported here is not caused by the new Kermit
+   release, the same experiment was performed on a Telnet connection from
+   the same PC over the same network to the old 715/33 running HP-UX
+   10.20 and C-Kermit 8.00. Text and binary uploads and downloads worked
+   perfectly (albeit slowly) with all the default settings -- streaming,
+   4K packets, etc.
+    ________________________________________________________________________
+
+  3.2.3. Dialing Out and UUCP Lockfiles in HP-UX
+
+   [ [211]Top ] [ [212]Contents ] [ [213]Section Contents ] [ [214]Next ]
+   [ [215]Previous ]
+
+   HP workstations do not come with dialout devices configured; you have
+   to do it yourself (as root). First look in /dev to see what's there;
+   for example in HP-UX 10.00 or later:
+
+  ls -l /dev/cua*
+  ls -l /dev/tty*
+
+   If you find a tty0p0 device but no cua0p0, you'll need to creat one if
+   you want to dial out; the tty0p0 does not work for dialing out. It's
+   easy: start SAM; in the main Sam window, double-click on Peripheral
+   Device, then in the Peripheral Devices window, double-click on
+   Terminals and Modems. In the Terminals and Modems dialog, click on
+   Actions, then choose "Add modem" and fill in the blanks. For example:
+   Port number 0, speed 57600 (higher speeds tend not to work reliably),
+   "Use device for calling out", do NOT "Receive incoming calls" (unless
+   you know what you are doing), leave "CCITT modem" unchecked unless you
+   really have one, and do select "Use hardware flow control (RTS/CTS)".
+   Then click OK. This creates cua0p0 as well as cul0p0 and ttyd0p0
+
+   If the following sequence:
+
+  set line /dev/cua0p0 ; or other device
+  set speed 115200     ; or other normal speed
+
+   produces the message "?Unsupported line speed". This means either that
+   the port is not configured for dialout (go into SAM as described above
+   and make sure "Use device for calling out" is selected), or else that
+   speed you have given (such as 460800) is supported by the operating
+   system but not by the physical device (in which case, use a lower
+   speed like 57600).
+
+   In HP-UX 9.0, serial device names began to change. The older names
+   looked like "/dev/cua00", "/dev/tty01", etc (sometimes with only one
+   digit). The newer names have two digits with the letter "p" in
+   between. HP-UX 8.xx and earlier have the older form, HP-UX 10.00 and
+   later have the newer form. HP-UX 9.xx has the newer form on Series 800
+   machines, and the older form on other hardware models. The situation
+   is summarized in the following table (the Convio 10.0 column applies
+   to HP-UX 10 and 11).
+
+  Converged HP-UX Serial I/O Filenames : TTY Mux Naming
+  ---------------------------------------------------------------------
+  General meaning      Old Form     S800 9.0           Convio 10.0
+  ---------------------------------------------------------------------
+  tty* hardwired ports  tty<YY>     tty<X>p<Y>         tty<D>p<p>
+                                    diag:mux<X>        diag:mux<D>
+  ---------------------------------------------------------------------
+  ttyd* dial-in modems  ttyd<YY>    ttyd<X>p<Y>        ttyd<D>p<p>
+                                    diag:ttyd<X>p<Y>   diag:ttyd<D>p<p>
+  ---------------------------------------------------------------------
+  cua* auto-dial out    cua<YY>     cua<X>p<Y>         cua<D>p<p>
+                                    diag:cua<X>p<Y>
+  ---------------------------------------------------------------------
+  cul* dial-out         cul<YY>     cul<X>p<Y>         cul<D>p<p>
+                                    diag:cul<X>p<Y>
+  ---------------------------------------------------------------------
+   <X>= LU (Logical Unit)  <D>= Devspec (decimal card instance)
+   <Y> or <YY> = Port      <p>= Port
+
+   For dialing out, you should use the cua or cul devices. When
+   C-Kermit's CARRIER setting is AUTO or ON, C-Kermit should pop back to
+   its prompt automatically if the carrier signal drops, e.g. when you
+   log out from the remote computer or service. If you use the tty<D>p<d>
+   (e.g. tty0p0) device, the carrier signal should be ignored. The
+   tty<D>p<d> device should be used for direct connections where the
+   carrier signal does not follow RS-232 conventions (use the cul device
+   for hardwired connections through a true null modem). Do not use the
+   ttyd<D>p<d> device for dialing out.
+
+   Kermit's access to serial devices is controlled by "UUCP lockfiles",
+   which are intended to prevent different users using different software
+   programs (Kermit, cu, etc, and UUCP itself) from accessing the same
+   serial device at the same time. When a device is in use by a
+   particular user, a file with a special name is created in:
+
+  /var/spool/locks  (HP-UX 10.00 and later)
+  /usr/spool/uucp   (HP-UX 9.xx and earlier)
+
+   The file's name indicates the device that is in use, and its contents
+   indicates the process ID (pid) of the process that is using the
+   device. Since serial devices and the locks directory are not both
+   publicly readable and writable, Kermit and other communication
+   software must be installed setuid to the owner (bin) of the serial
+   device and setgid to the group (daemon) of the /var/spool/locks
+   directory. Kermit's setuid and setgid privileges are enabled only when
+   opening the device and accessing the lockfiles.
+
+   Let's say "unit" means a string of decimal digits (the interface
+   instance number) followed (in HP-UX 10.00 and later) by the letter "p"
+   (lowercase), followed by another string of decimal digits (the port
+   number on the interface), e.g.:
+
+  "0p0", "0p1", "1p0", etc       (HP-UX 10.00 and later)
+  "0p0", "0p1", "1p0", etc       (HP-UX 9.xx on Series 800)
+  "00",  "01",  "10",  "0", etc  (HP-UX 9.xx not on Series 800)
+  "00",  "01",  "10",  "0", etc  (HP-UX 8.xx and earlier)
+
+   Then a normal serial device (driver) name consists of a prefix ("tty",
+   "ttyd", "cua", "cul", or possibly "cuad" or "culd") followed by a
+   unit, e.g. "cua0p0". Kermit's treatment of UUCP lockfiles is as close
+   as possible to that of the HP-UX "cu" program. Here is a table of the
+   lockfiles that Kermit creates for unit 0p0:
+
+  Selection      Lockfile 1     Lockfile 2  
+  /dev/tty0p0    LCK..tty0p0    (none)
+* /dev/ttyd0p0   LCK..ttyd0p0   (none)
+  /dev/cua0p0    LCK..cua0p0    LCK..ttyd0p0
+  /dev/cul0p0    LCK..cul0p0    LCK..ttyd0p0
+  /dev/cuad0p0   LCK..cuad0p0   LCK..ttyd0p0
+  /dev/culd0p0   LCK..culd0p0   LCK..ttyd0p0
+  <other>        LCK..<other>   (none)
+
+   (* = Dialin device, should not be used.)
+
+   In other words, if the device name begins with "cu", a second lockfile
+   for the "ttyd" device, same unit, is created, which should prevent
+   dialin access on that device.
+
+   The <other> case allows for symbolic links, etc, but of course it is
+   not foolproof since we have no way of telling which device is really
+   being used.
+
+   When C-Kermit tries to open a dialout device whose name ends with a
+   "unit", it searches the lockfile directory for all possible names for
+   the same unit. For example, if user selects /dev/cul2p3, Kermit looks
+   for lockfiles named:
+
+  LCK..tty2p3
+  LCK..ttyd2p3
+  LCK..cua2p3
+  LCK..cul2p3
+  LCK..cuad2p3
+  LCK..culd2p3
+
+   If any of these files are found, Kermit opens them to find out the ID
+   (pid) of the process that created them; if the pid is still valid, the
+   process is still active, and so the SET LINE command fails and the
+   user is informed of the pid so s/he can use "ps" to find out who is
+   using the device.
+
+   If the pid is not valid, the file is deleted. If all such files (i.e.
+   with same "unit" designation) are successfully removed, then the SET
+   LINE command succeeds; up to six messages are printed telling the user
+   which "stale lockfiles" are being removed.
+
+   When the "set line" command succeeds in HP-UX 10.00 and later,
+   C-Kermit also creates a Unix System V R4 "advisory lock" as a further
+   precaution (but not guarantee) against any other process obtaining
+   access to the device while you are using it.
+
+   If the selected device was in use by "cu", Kermit can't open it,
+   because "cu" has changed its ownership, so we never get as far as
+   looking at the lockfiles. In the normal case, we can't even look at
+   the device to see who the owner is because it is visible only to its
+   (present) owner. In this case, Kermit says (for example):
+
+  /dev/cua0p0: Permission denied
+
+   When Kermit releases a device it has successfully opened, it removes
+   all the lockfiles that it created. This also happens whenever Kermit
+   exits "under its own power".
+
+   If Kermit is killed with a device open, the lockfile(s) are left
+   behind. The next Kermit program that tries to assign the device, under
+   any of its various names, will automatically clean up the stale
+   lockfiles because the pids they contain are invalid. The behavior of
+   cu and other communication programs under these conditions should be
+   the same.
+
+   Here, by the way, is a summary of the differences between the HP-UX
+   port driver types from John Pezzano of HP:
+
+     There are three types of device files for each port.
+
+     The ttydXXX device file is designed to work as follows:
+
+    1. The process that opens it does NOT get control of the port until
+       CD is asserted. This was intentional (over 15 years ago) to allow
+       getty to open the port but not control it until someone called in.
+       If a process wants to use the direct or callout device files
+       (ttyXXX and culXXX respectively), they will then get control and
+       getty would be blocked. This eliminated the need to use uugetty
+       (and its inherent problems with lock files) for modems. You can
+       see this demonstrated by the fact that "ps -ef" shows a ? in the
+       tty column for the getty process as getty does not have the port
+       yet.
+    2. Once CD is asserted, the port is controlled by getty (or the
+       process handling an incoming call) if there was no process using
+       the port. The ? in the "ps" command now shows the port. At this
+       point, the port accepts data.
+
+     Therefore you should use either the callout culXXX device file
+     (immediate control but no data until CD is asserted) or the direct
+     device file ttyXXX which gives immediate control and immediate data
+     and which ignores by default modem control signals.
+
+     The ttydXXX device should be used only for callin and my
+     recommendation is to use it only for getty and uugetty.
+    ________________________________________________________________________
+
+  3.2.4 Notes on Specific HP-UX Releases
+
+   SECTION CONTENTS
+
+  3.2.4.1. [216]HP-UX 11
+  3.2.4.2. [217]HP-UX 10
+  3.2.4.3. [218]HP-UX 9
+  3.2.4.4. [219]HP-UX 8
+  3.2.4.5. [220]HP-UX 7 and Earlier
+
+  3.2.4.1. HP-UX 11
+
+   [ [221]Top ] [ [222]Contents ] [ [223]Section Contents ] [ [224]Next ]
+
+   As noted in [225]Section 3.2.2, the HP-UX 11 Telnet server and/or
+   pseudoterminal driver are a serious impediment to file transfer over
+   Telnet connections into HP-UX. If you have a Telnet connection into
+   HP-UX 11, tell your desktop Kermit program to:
+
+  set streaming off
+  set receive packet-length 2000
+  set send packet-length 500
+
+   File transfer speeds over connections from HP-UX 11 (dialed or Telnet)
+   are not impeded whatsoever, and can go at whatever speed is allowed by
+   the connection and the Kermit partner on the far end.
+
+   PA-RISC binaries for HP-UX 10.20 or later should run on any PA-RISC
+   system, S700 or S800, as long as the binary was not built under a
+   later HP-UX version than the host operating system. HP-UX 11.00 and
+   11.11 are only for PA-RISC systems. HP-UX 11.20 is only for IA64
+   (subsequent HP-UX releases will be for both PA-RISC and IA64). To
+   check binary compatibility, the following C-Kermit 8.0 binaries were
+   run successfully on an HP-9000/785 with HP-UX 11.11:
+
+     * Model 7xx HP-UX 10.20
+     * Model 8xx HP-UX 10.20
+     * Model 7xx HP-UX 11.00
+     * Model 8xx HP-UX 11.00
+     * Model 7xx HP-UX 11.11
+     * Model 8xx HP-UX 11.11
+
+   Binaries built under some of the earlier HP-UX releases, such as 9.05,
+   might also work, but only if built for the same hardware family (e.g.
+   s700).
+    ________________________________________________________________________
+
+  3.2.4.2. HP-UX 10
+
+   [ [226]Top ] [ [227]Contents ] [ [228]Section Contents ] [ [229]Next ]
+   [ [230]Previous ]
+
+   Beginning in HP-UX 10.10, libcurses is linked to libxcurses, the new
+   UNIX95 (X/Open) version of curses, which has some serious bugs; some
+   routines, when called, would hang and never return, some would dump
+   core. Evidently libxcurses contains a select() routine, and whenever
+   C-Kermit calls what it thinks is the regular (sockets) select(), it
+   gets the curses one, causing a segmentation fault. There is a patch
+   for this from HP, PHCO_8086, "s700_800 10.10 libcurses patch", "shared
+   lib curses program hangs on 10.10", "10.10 enhanced X/Open curses core
+   dumps due to using wrong select call", 96/08/02 (you can tell if the
+   patch is installed with "what /usr/lib/libxcurses.1"; the unpatched
+   version is 76.20, the patched one is 76.20.1.2). It has been verified
+   that C-Kermit works OK with the patched library, but results are not
+   definite for HP-UX 10.20 or higher.
+
+   To ensure that C-Kermit works even on non-patched HP-UX 10.10 systems,
+   separate makefile entries are provided for HP-UX 10.00/10.01, 10.10,
+   10.20, etc, in which the entries for 10.10 and above link with
+   libHcurses, which is "HP curses", the one that was used in
+   10.00/10.01. HP-UX 11.20 and later, however, link with libcurses, as
+   libHcurses disappeared in 11.20.
+    ________________________________________________________________________
+
+  3.2.4.3. HP-UX 9
+
+   [ [231]Top ] [ [232]Contents ] [ [233]Section Contents ] [ [234]Next ]
+   [ [235]Previous ]
+
+   HP-UX 9.00 and 9.01 need patch PHNE_10572 (note: this replaces
+   PHNE_3641) for hptt0.o, asio0.o, and ttycomn.o in libhp-ux.a. Contact
+   Hewlett Packard if you need this patch. Without it, the dialout device
+   (tty) will be hung after first use; subsequent attempts to use will
+   return an error like "device busy". (There are also equivalent patches
+   for s700 9.03 9.05 9.07 (PHNE_10573) and s800 9.00 9.04 (PHNE_10416).
+
+   When C-Kermit is in server mode, it might have trouble executing
+   REMOTE HOST commands. This problem happens under HP-UX 9.00 (Motorola)
+   and HP-UX 9.01 (RISC) IF the C-Shell is the login shell AND with the
+   C-Shell Revision 70.15. Best thing is to install HP's Patch PHCO_4919
+   for Series 300/400 and PHCO_5015 for the Series 700/800. PHCO_5015 is
+   called "s700_800 9.X cumulative csh(1) patch with memory leak fix"
+   which works for HP-UX 9.00, 9.01, 9.03, 9.04, 9.05 and 9.07. At least
+   you need C-Shell Revision 72.12!
+
+   C-Kermit works fine -- including its curses-based file-transfer
+   display -- on the console terminal, in a remote session (e.g. when
+   logged in to the HP 9000 on a terminal port or when telnetted or
+   rlogin'd), and in an HP-VUE hpterm window or an xterm window.
+    ________________________________________________________________________
+
+  3.2.4.4. HP-UX 8
+
+   [ [236]Top ] [ [237]Contents ] [ [238]Section Contents ] [ [239]Next ]
+   [ [240]Previous ]
+
+   To make C-Kermit work on HP-UX 8.05 on a model 720, obtain and install
+   HP-UX patch PHNE_0899. This patch deals with a lot of driver issues,
+   particularly related to communication at higher speeds.
+
+   One user reports:
+
+     On HP-UX 8 DON'T install 'tty patch' PHKL_4656, install PHKL_3047
+     instead! Yesterday I tried this latest tty patch PHKL_4656 and had
+     terrible problems. This patch should fix RTS/CTS problems. With
+     text transver all looks nice. But when I switched over to binary
+     files the serial interface returned only rubish to C-Kermit. All
+     sorts of protocol, CRC and packed errors I had. After several tests
+     and after uninstalling that patch, all transvers worked fine. MB's
+     of data without any errors. So keep your fingers away from that
+     patch. If anybody needs the PHKL_3047 patch I have it here. It is
+     no longer availabel from HP's patch base.
+    ________________________________________________________________________
+
+  3.2.4.5. HP-UX 7 and Earlier
+
+   [ [241]Top ] [ [242]Contents ] [ [243]Section Contents ] [
+   [244]Previous ]
+
+   When transferring files into HP-UX 5 or 6 over a Telnet connection,
+   you must not use streaming, and you must not use a packet length
+   greater than 512. However, you can use streaming and longer packets
+   when sending files from HP-UX on a Telnet connection. In C-Kermit 8.0,
+   the default receive packet length for HP-UX 5 and 6 was changed to 500
+   (but you can still increase it with SET RECEIVE PACKET-LENGTH if you
+   wish, e.g. for non-Telnet connections). Disable streaming with SET
+   STREAMING OFF.
+
+   The HP-UX 5.00 version of C-Kermit does not include the fullscreen
+   file-transfer because of problems with the curses library.
+
+   If HP-UX 5.21 with Wollongong TCP/IP is on the remote end of a Telnet
+   connection, streaming transfers to HP-UX invariably fail. Workaround:
+   SET STREAMING OFF. Packets longer than about 1000 should not be used.
+   Transfers from these systems, however, can use streaming and/or longer
+   packets.
+
+   Reportedly, "[there is] a bug in C-Kermit using HP-UX version 5.21 on
+   the HP-9000 series 500 computers. It only occurs when the controlling
+   terminal is using an HP-27140 six-port modem mux. The problem is not
+   present if the controlling terminal is logged into an HP-27130
+   eight-port mux. The symptom is that just after dialing successfully
+   and connecting Kermit locks up and the port is unusable until both
+   forks of Kermit and the login shell are killed." (This report predates
+   C-Kermit 6.0 and might no longer apply.)
+    ________________________________________________________________________
+
+  3.2.5. HP-UX and X.25
+
+   [ [245]Top ] [ [246]Contents ] [ [247]Section Contents ] [
+   [248]Previous ]
+
+   Although C-Kermit presently does not include built-in support for
+   HP-UX X.25 (as it does for the Sun and IBM X.25 products), it can
+   still be used to make X.25 connections as follows: start Kermit and
+   then telnet to localhost. After logging back in, start padem as you
+   would normally do to connect over X.25. Padem acts as a pipe between
+   Kermit and X.25. In C-Kermit 7.0, you might also be able to avoid the
+   "telnet localhost" step by using:
+
+  C-Kermit> pty padem address
+
+   This works if padem uses standard i/o (who knows?).
+    ________________________________________________________________________
+
+  3.3. C-KERMIT AND LINUX
+
+   [ [249]Top ] [ [250]Contents ] [ [251]Section Contents ] [ [252]Next ]
+   [ [253]Previous ]
+
+   SECTION CONTENTS
+
+  3.3.1. [254]Problems Building C-Kermit for Linux
+  3.3.2. [255]Problems with Serial Devices in Linux
+  3.3.3. [256]Terminal Emulation in Linux
+  3.3.4. [257]Dates and Times
+  3.3.5. [258]Startup Errors
+  3.3.6. [259]The Fullscreen File Transfer Display
+
+   REFERENCES
+
+   For further information, read the [260]comp.os.linux.misc,
+   [261]comp.os.linux.answers, and other Linux-oriented newsgroups, and
+   see:
+
+   The Linux Document Project (LDP)
+          [262]http://www.tldp.org/
+
+   The Linux FAQ
+          [263]http://www.tldp.org/FAQ/Linux-FAQ.html
+
+   The Linux HOWTOs (especially the Serial HOWTO)
+
+     [264]http://www.tldp.org/HOWTO/Serial-HOWTO.html
+
+     [265]http://tldp.org/HOWTO/Modem-HOWTO.html
+
+     [266]ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO
+
+     [267]ftp://tsx-11.mit.edu/pub/linux/docs/HOWTO
+
+     [268]http://www.tldp.org/HOWTO/
+
+     [269]http://www.tldp.org/hmirrors.html
+
+   Linux Vendor Tech Support Pages:
+
+     [270]http://www.redhat.com/apps/support/
+
+     [271]http://www.debian.org/support
+
+     [272]http://www.slackware.com/support/
+
+     [273]http://www.caldera.com/support/
+
+     [274]http://www.suse.com/support/
+
+     [275]http://www.mandrake.com/support/
+
+     [276]http://www.turbolinux.com/support/
+
+   Linux Winmodem Support
+          [277]http://www.linmodems.org/
+
+   Also see general comments on PC-based Unixes in [278]Section 3.0.
+
+   What Linux version is it? -- "uname -a" supplies only kernel
+   information, but these days it's the distribution that matters: Red
+   Hat 7.3, Debian 2.2, Slackware 8.0, etc. Unfortunately there's no
+   consistent way to get the distribution version. Usually it's in a
+   distribution-specific file:
+
+     Red Hat:   /etc/issue or /etc/redhat-release
+     Debian:    /etc/debian_version
+     Slackware: /etc/slackware-version (at least in later versions)
+
+   Did you know: DECnet is available for Linux? See:
+
+  [279]http://linux.dreamtime.org/decnet/
+
+   (But there is no support for it in C-Kermit -- anybody interested in
+   adding it, please [280]let us know).
+
+   Before proceeding, let's handle the some of the most frequently asked
+   question in the Linux newsgroups:
+
+    1. Neither C-Kermit nor any other Linux application can use
+       Winmodems, except in the [281]rare cases where Linux drivers have
+       been written for them. See [282]Section 3.0.2 for details.
+    2. "Why does it take such a long time to make a telnet connection to
+       (or from) my Linux PC?" (this applies to C-Kermit and to regular
+       Telnet). Most telnet servers these days perform reverse DNS
+       lookups on the client (for security and/or logging reasons). If
+       the Telnet client's address cannot be found by the server's local
+       DNS server, the DNS request goes out to the Internet at large, and
+       this can take quite some time. The solution to this problem is to
+       make sure that both client and host are registered in DNS, and
+       that the registrations are exported. C-Kermit itself performs
+       reverse DNS lookups unless you tell it not to; this is to allow
+       C-Kermit to let you know which host it is actually connected to in
+       case you have made a connection to a host pool (multihomed host).
+       You can disable C-Kermit's reverse DNS lookup with SET TCP
+       REVERSE-DNS-LOOKUP OFF.
+    3. (Any question that has the word "Telnet" in it...) The knee-jerk
+       reaction is "don't use Telnet, use SSH!" There's nothing wrong
+       with Telnet. In fact it's far superior to SSH as a protocol in
+       terms of features and extensibility, not to mention platform
+       neutrality. The issue lurking behind the knee-jerk reaction is
+       security. SSH is thought to be secure, whereas Telnet is thought
+       to be insecure. This is true for clear-text Telnet (because
+       passwords travel in the clear across the network), but apparently
+       few people realize that [283]secure Telnet clients and servers
+       have been available for years, and these are more secure than SSH
+       (for reasons explained [284]HERE.
+    4. (Any question that has the word "FTP" in it...) The knee-jerk
+       reaction being "Don't use FTP, use SCP!" (or SFTP). Same answer as
+       above, but moreso. SCP and SFTP are not only not platform neutral,
+       they're diversity-hostile. They transfer files only in binary
+       mode, which mangles text files across different platforms, to the
+       same degree the platform's text-file record format and character
+       set differ. An extreme example would be an Variable-Block format
+       EBCDIC text file on an IBM mainframe, binary transfer of which to
+       Unix would do you little good indeed. FTP was designed with
+       diversity in mind and secure versions are available.
+    ________________________________________________________________________
+
+  3.3.1. Problems Building C-Kermit for Linux
+
+   [ [285]Top ] [ [286]Contents ] [ [287]Section Contents ] [ [288]Next ]
+
+   Modern Linux distributions like Red Hat give you a choice at
+   installation whether to include "developer tools". Obviously, you
+   can't build C-Kermit or any other C program from source code if you
+   have not installed the developer tools. But to confuse matters, you
+   might also have to choose (separately) to install the "curses" or
+   "ncurses" terminal control library; thus it is possible to install the
+   C compiler and linker, but omit the (n)curses library and headers. If
+   curses is not installed, you will not be able to build a version of
+   C-Kermit that supports the fullscreen file-transfer display, in which
+   case you'll need to use the "linuxnc" makefile target (nc = No Curses)
+   or else install ncurses before building.
+
+   There are all sorts of confusing issues caused by the many and varied
+   Linux distributions. Some of the worst involve the curses library and
+   header files: where are they, what are they called, which ones are
+   they really? Other vexing questions involve libc5 vs libc6 vs glibc vs
+   glibc2 (C libraries), gcc vs egcs vs lcc (compilers), plus using or
+   avoiding features that were added in a certain version of Linux or a
+   library or a distribution, and are not available in others. As of
+   C-Kermit 8.0, these questions should be resolved by the "linux"
+   makefile target itself, which does a bit of looking around to see
+   what's what, and then sets the appropriate CFLAGS.
+    ________________________________________________________________________
+
+  3.3.2. Problems with Serial Devices in Linux
+
+   [ [289]Top ] [ [290]Contents ] [ [291]Section Contents ] [ [292]Next ]
+   [ [293]Previous ]
+
+     Also see: "man setserial", "man irqtune".
+     And: [294]Sections 3.0, [295]6, [296]7, and [297]8 of this
+     document.
+
+     NOTE: Red Hat Linux 7.2 and later include a new API that allows
+     serial-port arbitration by non-setuid/gid programs. This API has
+     not yet been added to C-Kermit. If C-Kermit is to be used for
+     dialing out on Red Hat 7.2 or later, it must still be installed as
+     described in in Sections [298]10 and [299]11 of the
+     [300]Installation Instructions. 
+
+   Don't expect it to be easy. Queries like the following are posted to
+   the Linux newsgroups almost daily:
+
+     Problem of a major kind with my Compaq Presario 1805 in the sense
+     that the pnpdump doesn't find the modem and the configuration tells
+     me that the modem is busy when I set everything by hand!
+
+     I have <some recent SuSE distribution>, kernel 2.0.35. Using the
+     Compaq tells me that the modem (which is internal) is on COM2, with
+     the usual IRQ and port numbers. Running various Windows diagnostics
+     show me AT-style commands exchanged so I have no reason to beleive
+     that it is a Winmodem. Also, the diagnostics under Win98 tell me
+     that I am talking to an NS 16550AN.
+
+   [Editor's note: This does not necessarily mean it isn't a Winmodem.]
+
+     Under Linux, no joy trying to talk to the modem on /dev/cua1
+     whether via minicom, kppp, or chat; kppp at least tells me that
+     tcgetattr() failed.
+
+     Usage of setserial:
+
+  setserial /dev/cua1 port 0x2F8 irq 3 autoconfig
+  setserial -g /dev/cua1
+
+     tells me that the uart is 'unknown'. I have tried setting the UART
+     manullay via. setserial to 16550A, 16550, and the other one (8550?)
+     (I didn't try 16540). None of these manual settings resulted in any
+     success.
+
+     A look at past articles leads me to investigate PNP issues by
+     calling pnpdump but pnpdump returns "no boards found". I have
+     looked around on my BIOS (Phoenix) and there is not much evidence
+     of it being PNP aware. However for what it calls "Serial port A",
+     it offers a choice of Auto, Disabled or Manual settings (currently
+     set to Auto), but using the BIOS interface I tried to change to
+     'manual' and saw the default settings offered to be were 0x3F8 and
+     IRQ 4 (COM1). The BIOS menus did not give me any chance to
+     configure COM2 or any "modem". I ended up not saving any BIOS
+     changes in the course of my investigations.
+
+   You can also find out a fair amount about your PC's hardware
+   configuration in the text files in /proc, e.g.:
+
+  -r--r--r--    1 root            0 Sep  4 14:00 /proc/devices
+  -r--r--r--    1 root            0 Sep  4 14:00 /proc/interrupts
+  -r--r--r--    1 root            0 Sep  4 14:00 /proc/ioports
+  -r--r--r--    1 root            0 Sep  4 14:00 /proc/pci
+
+   From the directory listing they look like empty files, but in fact
+   they are text files that you "cat":
+
+$ cat /proc/pci
+   Bus  0, device  14, function  0:
+     Serial controller: US Robotics/3Com 56K FaxModem Model 5610 (rev 1).
+       IRQ 10.
+       I/O at 0x1050 [0x1057].
+
+$ setserial -g /dev/ttyS4
+/dev/ttyS4, UART: 16550A, Port: 0x1050, IRQ: 10
+
+$ cat /proc/ioports
+1050-1057 : US Robotics/3Com 56K FaxModem Model 5610
+   1050-1057 : serial(auto)
+
+$ cat /proc/interrupts
+            CPU0
+   0:    7037515          XT-PIC  timer
+   1:          2          XT-PIC  keyboard
+   2:          0          XT-PIC  cascade
+   4:          0          XT-PIC  serial
+   8:          1          XT-PIC  rtc
+   9:     209811          XT-PIC  usb-uhci, eth0
+  14:     282015          XT-PIC  ide0
+  15:          6          XT-PIC  ide1
+
+   Watch out for PCI, PCMCIA and Plug-n-Play devices, Winmodems, and the
+   like (see cautions in [301]Section 3.0 Linux supports Plug-n-Play
+   devices to some degree via the isapnp and pnpdump programs; read the
+   man pages for them. (If you don't have them, look on your installation
+   CD for isapnptool or download it from sunsite or a sunsite mirror or
+   other politically correct location du jour).
+
+   PCI modems do not use standard COM port addresses. The I/O address and
+   IRQ are assigned by the BIOS. All you need to do to get one working,
+   find out the I/O address and interrupt number with (as root) "lspci -v
+   | more" and then give the resulting address and interrupt number to
+   setserial.
+
+   Even when you have a real serial port, always be wary of interrupt
+   conflicts and similar PC hardware configuration issues: a PC is not a
+   real computer like other Unix workstations -- it is generally pieced
+   together from whatever random components were the best bargain on the
+   commodity market the week it was built. Once it's assembled and boxed,
+   not even the manufacturer will remember what it's made of or how it
+   was put together because they've moved on to a new model. Their job is
+   to get it (barely) working with Windows; for Linux and other OS's you
+   are on your own.
+
+   "set line /dev/modem" or "set line /dev/ttyS2", etc, results in an
+   error, "/dev/modem is not a tty". Cause unknown, but obviously a
+   driver issue, not a Kermit one (Kermit uses "isatty()" to check that
+   the device is a tty, so it knows it will be able to issue all the
+   tty-related ioctl's on it, like setting the speed & flow control). Try
+   a different name (i.e. driver) for the same port, e.g. "set line
+   /dev/cua2" or whatever.
+
+   To find what serial ports were registered at the most recent system
+   boot, type (as root): "grep tty /var/log/dmesg".
+
+   "set modem type xxx" (where xxx is the name of a modem) followed by
+   "set line /dev/modem" or "set
+   line /dev/ttyS2", etc, hangs (but can be interrupted with Ctrl-C).
+   Experimentation shows that if the modem is configured to always assert
+   carrier (&C0) the same command does not hang. Again, a driver issue.
+   Use /dev/cua2 (or whatever) instead. (Or not -- hopefully none of
+   these symptoms occurs in C-Kermit 7.0 or later.)
+
+   "set line /dev/cua0" reports "Device is busy", but "set line
+   /dev/ttyS0" works OK.
+
+   In short: If the cua device doesn't work, try the corresponding ttyS
+   device. If the ttyS device doesn't work, try the corresponding cua
+   device -- but note that Linux developers do not recommend this, and
+   are phasing out the cua devices. From /usr/doc/faq/howto/Serial-HOWTO:
+
+   12.4. What's The Real Difference Between the /dev/cuaN And /dev/ttySN
+          Devices?
+          The only difference is the way that the devices are opened. The
+          dialin devices /dev/ttySN are opened in blocking mode, until CD
+          is asserted (ie someone connects). So, when someone wants to
+          use the /dev/cuaN device, there is no conflict with a program
+          watching the /dev/ttySN device (unless someone is connected of
+          course). The multiple /dev entries, allow operation of the same
+          physical device with different operating characteristics. It
+          also allows standard getty programs to coexist with any other
+          serial program, without the getty being retrofitted with
+          locking of some sort. It's especially useful since standard
+          Unix kernel file locking, and UUCP locking are both advisory
+          and not mandatory.
+
+   It was discovered during development of C-Kermit 7.0 that rebuilding
+   C-Kermit with -DNOCOTFMC (No Close/Open To Force Mode Change) made the
+   aforementioned problem with /dev/ttyS0 go away. It is not yet clear,
+   however, what its affect might be on the /dev/cua* devices. As of 19
+   March 1998, this option has been added to the CFLAGS in the makefile
+   entries for Linux ("make linux").
+
+   Note that the cua device is now "deprecated", and new editions of
+   Linux will phase (have phased) it out in favor of the ttyS device. See
+   (if it's still there):
+
+  [302]http://linuxwww.db.erau.edu/mail_archives/linux-kernel/Mar_98/1441.html
+
+   (no, of course it isn't; you'll have to use your imagination). One
+   user reported that C-Kermit 7.0, when built with egcs 1.1.2 and run on
+   Linux 2.2.6 with glibc 2.1 (hardware unknown but probably a PC) dumps
+   core when given a "set line /dev/ttyS1" command. When rebuilt with
+   gcc, it works fine.
+
+   All versions of Linux seem to have the following deficiency: When a
+   modem call is hung up and CD drops, Kermit can no longer read the
+   modem signals; SHOW COMMUNICATIONS says "Modem signals not available".
+   The TIOCMGET ioctl() returns -1 with errno 5 ("I/O Error").
+
+   The Linux version of POSIX tcsendbreak(), which is used by C-Kermit to
+   send regular (275msec) and long (1.5sec) BREAK signals, appears to
+   ignore its argument (despite its description in the man page and info
+   topic), and always sends a regular 275msec BREAK. This has been
+   observed in Linux versions ranging from Debian 2.1 to Red Hat 7.1.
+    ________________________________________________________________________
+
+  3.3.3. Terminal Emulation in Linux
+
+   [ [303]Top ] [ [304]Contents ] [ [305]Section Contents ] [ [306]Next ]
+   [ [307]Previous ]
+
+   C-Kermit is not a terminal emulator. For a brief explanation of why
+   not, see [308]Section 3.0.5. For a fuller explanation, [309]ClICK
+   HERE.
+
+   In Unix, terminal emulation is supplied by the Window in which you run
+   Kermit: the regular console screen, which provides Linux Console
+   "emulation" via the "console" termcap entry, or under X-Windows in an
+   xterm window, which gives VTxxx emulation. An xterm that includes
+   color ANSI and VT220 emulation is available with Xfree86:
+
+  [310]http://dickey.his.com/xterm/xterm.html
+
+   Before starting C-Kermit in an xterm window, you might need to tell
+   the xterm window's shell to "stty sane".
+
+   To set up your PC console keyboard to send VT220 key sequences when
+   using C-Kermit as your communications program in an X terminal window
+   (if it doesn't already), create a file somewhere (e.g. in /root/)
+   called .xmodmaprc, containing something like the following:
+
+  keycode 77  = KP_F1       ! Num Lock     => DEC Gold (PF1)
+  keycode 112 = KP_F2       ! Keypad /     => DEC PF1
+  keycode 63  = KP_F3       ! Keypad *     => DEC PF3
+  keycode 82  = KP_F4       ! Keypad -     => DEC PF4
+  keycode 111 = Help        ! Print Screen => DEC Help
+  keycode 78  = F16         ! Scroll Lock  => DEC Do
+  keycode 110 = F16         ! Pause        => DEC Do
+  keycode 106 = Find        ! Insert       => DEC Find
+  keycode 97  = Insert      ! Home         => DEC Insert
+  keycode 99  = 0x1000ff00  ! Page Up      => DEC Remove
+  keycode 107 = Select      ! Delete       => DEC Select
+  keycode 103 = Page_Up     ! End          => DEC Prev Screen
+  keycode 22  = Delete      ! Backspace sends Delete (127)
+
+   Then put "xmodmap filename" in your .xinitrc file (in your login
+   directory), e.g.
+
+  xmodmap /root/.xmodmaprc
+
+   Of course you can move things around. Use the xev program to find out
+   key codes.
+
+   Console-mode keys are mapped separately using loadkeys, and different
+   keycodes are used. Find out what they are with showkey.
+
+   For a much more complete VT220/320 key mapping for [311]Xfree86 xterm,
+   [312]CLICK HERE.
+    ________________________________________________________________________
+
+  3.3.4. Dates and Times
+
+   [ [313]Top ] [ [314]Contents ] [ [315]Section Contents ] [ [316]Next ]
+   [ [317]Previous ]
+
+   If C-Kermit's date-time (e.g. as shown by its DATE command) differs
+   from the system's date and time:
+
+    a. Make sure the libc to which Kermit is linked is set to GMT or is
+       not set to any time zone. Watch out for mixed libc5/libc6 systems;
+       each must be set indpendently.
+    b. If you have changed your TZ environment variable, make sure it is
+       exported. This is normally done in /etc/profile or /etc/TZ.
+    ________________________________________________________________________
+
+  3.3.5. Startup Errors
+
+   [ [318]Top ] [ [319]Contents ] [ [320]Section Contents ] [ [321]Next ]
+   [ [322]Previous ]
+
+   C-Kermit should work on all versions of Linux current through March
+   2003, provided it was built on the same version you have, with the
+   same libraries and header files (just get the source code and "make
+   linux"). Binaries tend not to travel well from one Linux machine to
+   another, due to their many differences. There is no guarantee that a
+   particular C-Kermit binary will not stop working at a later date,
+   since Linux tends to change out from under its applications. If that
+   happens, rebuild C-Kermit from source. If something goes wrong with
+   the build process, look on the [323]C-Kermit website for a newer
+   version. If you have the latest version, then [324]report the problem
+   to us.
+
+   Inability to transfer files in Red Hat 7.2: the typical symptom would
+   be if you start Kermit and tell it to RECEIVE, it fails right away
+   with "?/dev/tty: No such device or address" or "?Bad file descriptor".
+   One report says this is because of csh, and if you change your shell
+   to bash or other shell, it doesn't happen. Another report cite bugs in
+   Red Hat 7.2 Telnetd "very seldom (if ever) providing a controlling
+   tty, and lots of other people piled on saying they have the same
+   problem.") A third theory is that this happens only when Linux has
+   been installed without "virtual terminal support".
+
+   A search of RedHat's errata pages shows a bug advisory (RHBA-2001-153)
+   issued 13 November 2001, but updated 6 December, about this same
+   symptom (but with tcsh and login.) Seems that login was not always
+   assigning a controlling TTY for the session, which would make most use
+   of "/dev/tty" somewhat less than useful.
+
+  [325]http://www.redhat.com/support/errata/RHBA-2001-153.html
+
+   Quoting: "Due to terminal handling problems in /bin/login, tcsh would
+   not find the controlling terminal correctly, and a shell in single
+   user mode would exhibit strange terminal input characteristics. This
+   update fixes both of these problems."
+
+   Since the Red Hat 5.1 release (circa August 1998), there have been
+   numerous reports of prebuilt Linux executables, and particularly the
+   Kermit RPM for Red Hat Linux, not working; either it won't start at
+   all, or it gives error messages about "terminal type unknown" and
+   refuses to initialize its curses support. The following is from the
+   [326]Kermit newsgroup:
+
+     From: rchandra@hal9000.buf.servtech.com
+     Newsgroups: comp.protocols.kermit.misc
+     Subject: Red Hat Linux/Intel 5.1 and ncurses: suggestions
+     Date: 22 Aug 1998 15:54:46 GMT
+     Organization: Verio New York
+     Keywords: RedHat RPM 5.1
+
+     Several factors can influence whether "linux" is recognized as a
+     terminal type on many Linux systems.
+
+    1. Your program, or the libraries it linked with (if statically
+       linked), or the libraries it dynamically links with at runtime,
+       are looking for an entry in /etc/termcap that isn't there. (not
+       likely, but possible... I believe but am not certain that this is
+       a very old practice in very old [n]curses library implementations
+       to use a single file for all terminal descriptions.)
+    2. Your program, or the libraries...are looking for a terminfo file
+       that just plain isn't there. (also not so likely, since many
+       people in other recent message threads said that other programs
+       work OK).
+    3. Your program, or the libraries...are looking for a terminfo file
+       that is stored at a pathname that isn't expected by your program,
+       the libraries--and so on. I forgot if I read this in the errata
+       Web page or where exactly I discovered this (Netscape install?
+       Acrobat install?), but it may just be that one libc (let's say for
+       sake of argument, libc5, but I don't know this to be true) expects
+       your terminfo to be in /usr/share/terminfo, and the other (let's
+       say libc6/glibc) expects /usr/lib/terminfo. I remember that the
+       specific instructions in this bugfix/workaround were to do the
+       following or equivalent:
+  cd /usr/lib
+  ln -s ../share/terminfo ./terminfo
+       or:
+  ln -s /usr/share/terminfo /usr/lib/terminfo
+
+     So what this says is that the terminfo database/directory structure
+     can be accessed by either path. When something goes to reference
+     /usr/lib/terminfo, the symlink redirects it to essentially
+     /usr/share/terminfo, which is where it really resides on your
+     system. I personally prefer wherever possible to use relative
+     symlinks, because they still hold, more often than break, across
+     mount points, particularly NFS mounts, where the directory
+     structure may be different on the different systems.
+
+   Evidently the terminfo file moved between Red Hat 5.0 and 5.1, but Red
+   Hat did not include a link to let applications built prior to 5.1 find
+   it. Users reported that installing the link fixes the problem.
+    ________________________________________________________________________
+
+  3.3.6. The Fullscreen File Transfer Display
+
+   [ [327]Top ] [ [328]Contents ] [ [329]Section Contents ] [
+   [330]Previous ]
+
+   Starting with ncurses versions dated 1998-12-12 (about a year before
+   ncurses 5.0), ncurses sets the terminal for buffered i/o, but
+   unfortunately is not able to restore it upon exit from curses (via
+   endwin()). Thus after a file transfer that uses the fullscreen file
+   transfer display, the terminal no longer echos nor responds
+   immediately to Tab, ?, and other special command characters. The same
+   thing happens on other platforms that use ncurses, e.g. FreeBSD.
+   Workarounds:
+
+     * Use SET XFER DISPLAY BRIEF, CRT, SERIAL, or NONE instead of
+       FULLSCREEN; or:
+     * Rebuild with KFLAGS=-DNONOSETBUF (C-Kermit 8.0)
+
+   In Red Hat 7.1, when using C-Kermit in a Gnome terminal window, it was
+   noticed that when the fullscreen file transfer display exits (via
+   endwin()), the previous (pre-file-transfer-display) screen is
+   restored. Thus you can't look at the completed display to see what
+   happened. This is a evidently a new feature of xterm. I can only
+   speculate that initscreen() and endwin() must send some kind of
+   special escape sequences that command xterm to save and restore the
+   screen. To defeat this effect, tell Linux you have a vt100 or other
+   xterm-compatible terminal that is not actually an xterm, or else tell
+   Kermit to SET TRANSFER DISPLAY to something besides FULLSCREEN.
+    ________________________________________________________________________
+
+  3.4. C-KERMIT AND NEXTSTEP
+
+   [ [331]Top ] [ [332]Contents ] [ [333]Section Contents ] [ [334]Next ]
+   [ [335]Previous ]
+
+   Run C-Kermit in a Terminal, Stuart, or xterm window, or when logged in
+   remotely through a serial port or TELNET connection. C-Kermit does not
+   work correctly when invoked directly from the NeXTSTEP File Viewer or
+   Dock. This is because the terminal-oriented gtty, stty, & ioctl calls
+   don't work on the little window that NeXTSTEP pops up for non-NeXTSTEP
+   applications like Kermit. CBREAK and No-ECHO settings do not take
+   effect in the command parser -- commands are parsed strictly line at a
+   time. "set line /dev/cua" works. During CONNECT mode, the console
+   stays in cooked mode, so characters are not transmitted until carriage
+   return or linefeed is typed, and you can't escape back. If you want to
+   run Kermit directly from the File Viewer, then launch it from a shell
+   script that puts it in the desired kind of window, something like this
+   (for "Terminal"):
+
+  Terminal -Lines 24 -Columns 80 -WinLocX 100 -WinLocY 100 $FONT $FONTSIZE \
+  -SourceDotLogin -Shell /usr/local/bin/kermit &
+
+   C-Kermit does not work correctly on a NeXT with NeXTSTEP 3.0 to which
+   you have established an rlogin connection, due to a bug in NeXTSTEP
+   3.0, which has been reported to NeXT.
+
+   The SET CARRIER command has no effect on the NeXT -- this is a
+   limitation of the NeXTSTEP serial-port device drivers.
+
+   Hardware flow control on the NeXT is selected not by "set flow
+   rts/cts" in Kermit (since NeXTSTEP offers no API for this), but
+   rather, by using a specially-named driver for the serial device:
+   /dev/cufa instead /dev/cua; /dev/cufb instead of /dev/cub. This is
+   available only on 68040-based NeXT models (the situation for Intel
+   NeXTSTEP implementations is unknown).
+
+   NeXT-built 68030 and 68040 models have different kinds of serial
+   interfaces; the 68030 has a Macintosh-like RS-422 interface, which
+   lacks RTS and CTS signals; the 68040 has an RS-423 (RS-232 compatible)
+   interface, which supports the commonly-used modem signals. WARNING:
+   the connectors look exactly the same, but the pins are used in
+   completely DIFFERENT ways -- different cables are required for the two
+   kinds of interfaces.
+
+     IF YOU GET LOTS OF RETRANSMISSIONS during file transfer, even when
+     using a /dev/cuf* device and the modem is correctly configured for
+     RTS/CTS flow control, YOU PROBABLY HAVE THE WRONG KIND OF CABLE.
+
+   On the NeXT, Kermit reportedly (by TimeMon) causes the kernel to use a
+   lot of CPU time when using a "set line" connection. That's because
+   there is no DMA channel for the NeXT serial port, so the port must
+   interrupt the kernel for each character in or out.
+
+   One user reported trouble running C-Kermit on a NeXT from within
+   NeXT's Subprocess class under NeXTstep 3.0, and/or when rlogin'd from
+   one NeXT to another: Error opening /dev/tty:, congm: No such device or
+   address. Diagnosis: Bug in NeXTSTEP 3.0, cure unknown.
+    ________________________________________________________________________
+
+  3.5. C-KERMIT AND QNX
+
+   [ [336]Top ] [ [337]Contents ] [ [338]Section Contents ] [ [339]Next ]
+   [ [340]Previous ]
+
+   See also: The [341]comp.os.qnx newsgroup.
+
+   Support for QNX 4.x was added in C-Kermit 5A(190). This is a
+   full-function implementation, thoroughly tested on QNX 4.21 and later,
+   and verified to work in both 16-bit and 32-bit versions. The 16-bit
+   version was dropped in C-Kermit 7.0 since it can no longer be built
+   successfully (after stripping most most features, I succeeded in
+   getting it to compile and link without complaint, but the executable
+   just beeps when you run it); for 16-bit QNX 4.2x, use C-Kermit 6.0 or
+   earlier, or else [342]G-Kermit.
+
+   The 32-bit version (and the 16-bit version prior to C-Kermit 7.0)
+   supports most of C-Kermit's advanced features including TCP/IP, high
+   serial speeds, hardware flow-control, modem-signal awareness, curses
+   support, etc.
+
+   BUG: In C-Kermit 6.0 on QNX 4.22 and earlier, the fullscreen file
+   transfer display worked fine the first time, but was fractured on
+   subsequent file transfers. Cause and cure unknown. In C-Kermit 7.0 and
+   QNX 4.25, this no longer occurs. It is not known if it would occur in
+   C-Kermit 7.0 or later on earlier QNX versions.
+
+   Dialout devices are normally /dev/ser1, /dev/ser2, ..., and can be
+   opened explicitly with SET LINE. Reportedly, "/dev/ser" (no unit
+   number) opens the first available /dev/sern device.
+
+   Like all other Unix C-Kermit implementations, QNX C-Kermit does not
+   provide any kind of terminal emulation. Terminal specific functions
+   are provided by your terminal, terminal window (e.g. QNX Terminal or
+   xterm), or emulator.
+
+   QNX C-Kermit, as distributed, does not include support for UUCP
+   line-locking; the QNX makefile entries (qnx32 and qnx16) include the
+   -DNOUUCP switch. This is because QNX, as distributed, does not include
+   UUCP, and its own communications software (e.g. qterm) does not use
+   UUCP line locking. If you have a UUCP product installed on your QNX
+   system, remove the -DNOUUCP switch from the makefile entry and
+   rebuild. Then check to see that Kermit's UUCP lockfile conventions are
+   the same as those of your UUCP package; if not, read the [343]UUCP
+   lockfile section of the [344]Installation Instructions and make the
+   necessary changes to the makefile entry (e.g. add -DHDBUUCP).
+
+   QNX does, however, allow a program to get the device open count. This
+   can not be a reliable form of locking unless all applications do it,
+   so by default, Kermit uses this information only for printing a
+   warning message such as:
+
+  C-Kermit>set line /dev/ser1
+  WARNING - "/dev/ser1" looks busy...
+
+   However, if you want to use it as a lock, you can do so with:
+
+  SET QNX-PORT-LOCK { ON, OFF }
+
+   This is OFF by default; if you set in ON, C-Kermit will fail to open
+   any dialout device when its open count indicates that another process
+   has it open. SHOW COMM (in QNX only) displays the setting, and if you
+   have a port open, it also shows the open count.
+
+   As of C-Kermit 8.0, C-Kermit's "open-count" form of line locking works
+   only in QNX4, not in QNX6 (this might change in a future C-Kermit
+   release).
+    ________________________________________________________________________
+
+  3.6. C-KERMIT AND SCO
+
+   [ [345]Top ] [ [346]Contents ] [ [347]Section Contents ] [ [348]Next ]
+   [ [349]Previous ]
+
+   SECTION CONTENTS
+
+3.6.1. [350]SCO XENIX
+3.6.2. [351]SCO UNIX and OSR5
+3.6.3. [352]Unixware
+3.6.4. [353]Open UNIX 8
+
+   REFERENCES
+
+     * The comp.unix.sco.* newsgroups.
+     * [354]Section 3.10 below for Unixware.
+     * The following FAQs:
+
+        The comp.sco.misc FAQ:
+                [355]http://aplawrence.com/SCOFAQ/
+
+        Caldera (SCO) comp.unix.sco.programmer FAQ:
+                [356]http://www.zenez.com/cgi-bin/scoprogfaq/faq.pl
+
+        The UnixWare 7/OpenUNIX 8 FAQ:
+                [357]http://www.zenez.com/cgi-bin/scouw7faq/faq.pl
+                [358]http://zenez.pcunix.com/cgi-bin/scouw7faq/faq.pl
+
+        High Speed Modems for SCO Unix:
+                [359]http://pcunix.com/Unixart/modems.html
+
+        The UnixWare FAQ
+                [360]http://www.freebird.org/faq/
+
+        The UnixWare 1.x and 2.0 Programmer FAQ
+                [361]http://www.freebird.org/faq/developer.html
+
+        Caldera Support Knowledge Base
+                [362]http://support.caldera.com/caldera
+
+        [363]http://stage.caldera.com/ta/
+                Caldera (SCO) Technical Article Search Center
+
+        [364]http://aplawrence.com/newtosco.html
+                New to SCO (Tony Lawrence)
+
+   The same comments regarding terminal emulation and key mapping apply
+   to SCO operating systems as to all other Unixes. C-Kermit is not a
+   terminal emulator, and you can't use it to map F-keys, Arrow keys,
+   etc. The way to do this is with xmodmap (xterm) or loadkeys (console).
+   For a brief explanation, see [365]Section 3.0.5. For a fuller
+   explanation, [366]ClICK HERE.
+
+   Also see general comments on PC-based Unixes in [367]Section 3.0.
+
+  3.6.1. SCO XENIX
+
+   [ [368]Top ] [ [369]Contents ] [ [370]Section Contents ] [ [371]Next ]
+
+   Old Xenix versions... Did you know: Xenix 3.0 is *older* than Xenix
+   2.0?
+
+   In Xenix 2.3.4 and probably other Xenix versions, momentarily dropping
+   DTR to hang up a modem does not work. DTR goes down but does not come
+   up again. Workaround: Use SET MODEM HANGUP-METHOD MODEM-COMMAND.
+   Anybody who would like to fix this is welcome to take a look at
+   tthang() in [372]ckutio.c. Also: modem signals can not be read in
+   Xenix, and the maximum serial speed is 38400.
+
+   There is all sorts of confusion among SCO versions, particularly when
+   third- party communications boards and drivers are installed,
+   regarding lockfile naming conventions, as well as basic functionality.
+   As far as lockfiles go, all bets are off if you are using a
+   third-party multiport board. At least you have the source code.
+   Hopefully you also have a C compiler :-)
+
+   Xenix 2.3.0 and later claim to support RTSFLOW and CTSFLOW, but this
+   is not modern bidirectional hardware flow control; rather it
+   implements the original RS-232 meanings of these signals for
+   unidirectional half-duplex line access: If both RTSFLOW and CTSFLOW
+   bits are set, Xenix asserts RTS when it wants to send data and waits
+   for CTS assertion before it actually starts sending data (also,
+   reportedly, even this is broken in Xenix 2.3.0 and 2.3.1).
+    ________________________________________________________________________
+
+  3.6.2. SCO UNIX AND OSR5
+
+   [ [373]Top ] [ [374]Contents ] [ [375]Section Contents ] [ [376]Next ]
+   [ [377]Previous ]
+
+   SCO systems tend to use different names (i.e. drivers) for the same
+   device. Typically /dev/tty1a refers to a terminal device that has no
+   modem control; open, read, write, and close operations do not depend
+   on carrier. On the other hand, /dev/tty1A (same name, but with final
+   letter upper case), is the same device with modem control, in which
+   carrier is required (the SET LINE command does not complete until
+   carrier appears, read/write operations fail if there is no carrier,
+   etc).
+
+   SCO OpenServer 5.0.5 and earlier do not support the reading of modem
+   signals. Thus "show comm" does not list modem signals, and C-Kermit
+   does not automatically pop back to its prompt when the modem hangs up
+   the connection (drops CD). The ioctl() call for this is simply not
+   implmented, at least not in the standard drivers. OSR5.0.6 attempts to
+   deal with modem signals but fails; however OSR5.0.6a appears to
+   function properly.
+
+   Dialing is likely not to work well in SCO OpenServer 5.0.x because
+   many of the serial-port APIs simply do not operate when using the
+   standard drivers. For example, if DTR is dropped by the recommended
+   method (setting speed to 0 for half a seconds, then restoring the
+   speed), DTR and RTS go down but never come back up. When in doubt SET
+   MODEM HANGUP-METHOD MODEM-COMMAND or SET DIAL HANGUP OFF.
+
+   On the other hand, certain functions that might not (do not) work
+   right or at all when using SCO drivers (e.g. high serial speeds,
+   hardware flow control, and/or reading of modem signals) might work
+   right when using third-party drivers. (Example: hardware flow control
+   works, reportedly, only on uppercase device like tty1A -- not tty1a --
+   and only when CLOCAL is clear when using the SCO sio driver, but there
+   are no such restrictions in, e.g., [378]Digiboard drivers).
+
+   One user reports that he can't transfer large files with C-Kermit
+   under SCO OSR5.0.0 and 5.0.4 -- after the first 5K, everything falls
+   apart. Same thing without Kermit -- e.g. with ftp over a PPP
+   connection. Later, he said that replacing SCO's SIO driver with FAS,
+   an alternative communications driver, made the problem go away:
+
+  [379]ftp://ftp.fu-berlin.de/pub/unix/driver/fas
+
+   With regard to bidirectional serial ports on OpenServer 5.0.4, the
+   following advice appeared on an SCO-related newsgroup:
+
+     No amount of configuration information is going to help you on
+     5.0.4 unless it includes the kludge for the primary problem. With
+     almost every modem, the 5.0.4 getty will barf messages and may or
+     may not connect. There are 2 solutions and only one works on 5.0.4.
+     Get the atdialer binary from a 5.0.0 system and substitute it for
+     the native 5.0.4 atdialer. The other solution is to upgrade to
+     5.0.5. And, most of all, on any OpenServer products, do NOT run the
+     badly broken Modem Manager. Configure the modems in the time
+     honored way that dates back to Xenix.
+
+   Use SCO-provided utilities for switching the directionality of a modem
+   line, such as "enable" and "disable" commands. For example, to dial
+   out on tty1a, which is normally set up for logins:
+
+  disable tty1a
+  kermit -l /dev/tty1a
+  enable tty1a
+
+   If a tty device is listed as an ACU in /usr/lib/uucp/Devices and is
+   enabled, getty resets the ownership and permissions to uucp.uucp and
+   640 every time the device is released. If you want to use the device
+   only for dialout, and you want to specify other owners or permissions,
+   you should disable it in /usr/lib/uucp/Devices; this will prevent
+   getty from doing things to it. You should also changes the device's
+   file modes in /etc/conf/node.d/sio by changing fields 5-7 for the
+   desired device(s); this determines how the devices are set if you
+   relink the kernel.
+
+   One SCO user of C-Kermit 5A(190) reported that only one copy of Kermit
+   can run at a time when a Stallion Technologies multiport boards are
+   installed. Cause, cure, and present status unknown (see [380]Section
+   14 for more info regarding Stallion).
+
+   Prior to SCO OpenServer 5.0.4, the highest serial port speed supported
+   by SCO was 38400. However, in some SCO versions (e.g. OSR5) it is
+   possible to map rarely-used lower speeds (like 600 and 1800) to higher
+   ones like 57600 and 115200. To find out how, go to
+   [381]http://www.sco.com/ and search for "115200". In OSR5.0.4, serial
+   speeds up to 921600 are supported through the POSIX interface;
+   C-Kermit 6.1.193 or later, when built for OSR5.0.4 using /bin/cc (NOT
+   the UDK, which hides the high-speed definitions from CPP), supports
+   these speeds, but you might be able to run this binary on earlier
+   releases to get the high serial speeds, depending on various factors,
+   described by Bela Lubkin of SCO:
+
+  Serial speeds under SCO Unix / Open Desktop / OpenServer
+  ========================================================
+  Third party drivers (intelligent serial boards) may provide any speeds
+  they desire; most support up to 115.2Kbps.
+
+  SCO's "sio" driver, which is used to drive standard serial ports with
+  8250/16450/16550 and similar UARTs, was limited to 38400bps in older
+  releases.  Support for rates through 115.2Kbps was added in the
+  following releases:
+
+    SCO OpenServer Release 5.0.0 (requires supplement "rs40b")
+    SCO OpenServer Release 5.0.2 (requires supplement "rs40a" or "rs40b")
+    SCO OpenServer Release 5.0.4 or later
+    SCO Internet FastStart Release 1.0.0 or later
+
+   SCO supplements are at [382]ftp://ftp.sco.com/; the "rs40" series are
+   under directory /Supplements/internet
+
+   Kermit includes the high serial speeds in all OSR5 builds, but that
+   does not necessarily mean they work. For example, on our in-house
+   5.0.5 system, SET SPEED 57600 or higher seems to succeed (no error
+   occurs) but when we read the speed back the driver says it is 50.
+   Similarly, 76800 becomes 75, and 115200 becomes 110. Testing shows the
+   resulting speed is indeed the low one we read back, not the high one
+   we asked for. Moral: Use speeds higher than 38400 with caution on SCO
+   OSR5.
+
+   Reportedly, if you have a script that makes a TCP/IP SET HOST (e.g.
+   Telnet) connection to SCO 3.2v4.2 with TCP/IP 1.2.1, and then does the
+   following:
+
+  script $ exit
+  hangup
+
+   this causes a pseudoterminal (pty) to be consumed on the SCO system;
+   if you do it enough times, it will run out of ptys. An "exit" command
+   is being sent to the SCO shell, and a HANGUP command is executed
+   locally, so the chances are good that both sides are trying to close
+   the connection at once, perhaps inducing a race condition in which the
+   remote pty is not released. It was speculated that this would be fixed
+   by applying SLS net382e, but it did not. Meanwhile, the workaround is
+   to insert a "pause" between the SCRIPT and HANGUP commands. (The
+   situation with later SCO releases is not known.)
+
+   SCO UNIX and OpenServer allow their console and/or terminal drivers to
+   be configured to translate character sets for you. DON'T DO THIS WHEN
+   USING KERMIT! First of all, you don't need it -- Kermit itself already
+   does this for you. And second, it will (a) probably ruin the
+   formatting of your screens (depending on which emulation you are
+   using); and (b) interfere with all sorts of other things -- legibility
+   of non-ASCII text on the terminal screen, file transfer, etc. Use:
+
+  mapchan -n
+
+   to turn off this feature.
+
+   Note that there is a multitude of SCO entries in the makefile, many of
+   them exhibiting an unusually large number of compiler options. Some
+   people actually understand all of this. Reportedly, things are
+   settling down with SCO OpenServer 5.x and Unixware 7 (and Open UNIX 8
+   and who knows what the next one will be -- Linux probably) -- the SCO
+   UDK compiler is said to generate binaries that will run on either
+   platform, by default, automatically. When using gcc or egcs, on the
+   other hand, differences persist, plus issues regarding the type of
+   binary that is generated (COFF, ELF, etc), and where and how it can
+   run. All of this could stand further clarification by SCO experts.
+    ________________________________________________________________________
+
+  3.6.3. Unixware
+
+   [ [383]Top ] [ [384]Contents ] [ [385]Section Contents ] [ [386]Next ]
+   [ [387]Previous ]
+
+   Unixware changed hands several times before landing at SCO, and so has
+   its [388]own section in this document. (Briefly: AT&T UNIX Systems
+   Laboratories sold the rights to the UNIX name and to System V R4 (or
+   R5?) to Novell; later Novell spun its UNIX division off into a new
+   company called Univel, which eventually was bought by SCO, which later
+   was bought by Caldera, which later sort of semi-spun-off SCO...)
+    ________________________________________________________________________
+
+  3.6.4. Open UNIX 8
+
+   [ [389]Top ] [ [390]Contents ] [ [391]Section Contents ] [
+   [392]Previous ]
+
+   SCO was bought by Caldera in 2000 or 2001 and evolved Unixware 7.1
+   into Caldera Open UNIX 8.00. It's just like Unixware 7.1 as far as
+   Kermit is concerned (the Unixware 7.1 makefile target works for Open
+   UNIX 8.00, and in fact a Unixware 7.1 Kermit binary built on Unixware
+   7.1 runs under OU8; a separate OU8 makefile target exists simply to
+   generate an appropriate program startup herald). Open Unix is now
+   defunct; subsequent releases are called UnixWare again (e.g. UnixWare
+   7.1.3).
+    ________________________________________________________________________
+
+  3.7. C-KERMIT AND SOLARIS
+
+   [ [393]Top ] [ [394]Contents ] [ [395]Section Contents ] [ [396]Next ]
+   [ [397]Previous ]
+
+   SECTION CONTENTS
+
+3.7.1. [398]Serial Port Configuration
+3.7.2. [399]Serial Port Problems
+3.7.3. [400]SunLink X.25
+3.7.4. [401]Sun Workstation Keyboard Mapping
+3.7.5. [402]Solaris 2.4 and Earlier
+
+   REFERENCES
+
+     * The [403]comp.unix.solaris newsgroup
+     * [404]http://access1.sun.com/
+     * [405]http://docs.sun.com/
+     * [406]http://www.sunhelp.com/
+     * [407]http://www.wins.uva.nl/pub/solaris/solaris2/
+     * [408]http://www.wins.uva.nl/cgi-bin/sfaq.cgi
+     * [409]ftp://ftp.wins.uva.nl/pub/solaris
+     * [410]http://www.science.uva.nl/pub/solaris/solaris2.html
+
+   And about serial communications in particular, see "Celeste's Tutorial
+   on Solaris 2.x Modems and Terminals":
+
+  [411]http://www.stokely.com/
+
+   In particular:
+
+  [412]http://www.stokely.com/unix.sysadm.resources/faqs.sun.html
+
+   For PC-based Solaris, also see general comments on PC-based Unixes in
+   [413]Section 3.0. Don't expect Solaris or any other kind of Unix to
+   work right on a PC until you resolve all interrupt conflicts. Don't
+   expect to be able to use COM3 or COM4 (or even COM2) until you have
+   configured their addresses and interrupts.
+    ________________________________________________________________________
+
+  3.7.1. Serial Port Configuration
+
+   [ [414]Top ] [ [415]Contents ] [ [416]Section Contents ] [
+   [417]Section Contents ] [ [418]Next ]
+
+   Your serial port can't be used -- or at least won't work right --
+   until it is enabled in Solaris. For example, you get a message like
+   "SERIAL: Operation would block" when attempting to dial. This probably
+   indicates that the serial port has not been enabled for use with
+   modems. You'll need to follow the instructions in your system setup or
+   management manual, such as (e.g.) the Desktop SPARC Sun System &
+   Network Manager's Guide, which should contain a section "Setting up
+   Modem Software"; read it and follow the instructions. These might (or
+   might not) include running a program called "eeprom", editing some
+   system configuration file (such as, for example:
+
+  /platform/i86pc/kernel/drv/asy.conf
+
+   and then doing a configuration reboot, or running some other programs
+   like drvconfig and devlinks. "man eeprom" for details.
+
+   Also, on certain Sun models like IPC, the serial port hardware might
+   need to have a jumper changed to make it an RS-232 port rather than
+   RS-423.
+
+   eeprom applies only to real serial ports, not to "Spiff" devices
+   (serial port expander), in which case setup with Solaris' admintool is
+   required.
+
+   Another command you might need to use is pmadm, e.g.:
+
+  pmadm -d -p zsmon -s tty3
+  pmadm -e -p zsmon -s tty3
+
+   You can use the following command to check if a process has the device
+   open:
+
+  fuser -f /dev/term/3
+
+   In some cases, however (according to Sun support, May 2001) "It is
+   still possible that a zombie process has hold of the port EVEN IF
+   there is no lock file and the fuser command comes up empty. In that
+   case, the only way to resolve the problem is by rebooting."
+
+   If you can't establish communication through a serial port to a device
+   that is not asserting CD (Carrier Detect), try setting the environment
+   variable "ttya-ignore-cd" to "true" (replace "ttya" with the port
+   name).
+    ________________________________________________________________________
+
+  3.7.2. Serial Port Problems
+
+   [ [419]Top ] [ [420]Contents ] [ [421]Section Contents ] [ [422]Next ]
+   [ [423]Previous ]
+
+   Current advice from Sun is to always the /dev/cua/x devices for
+   dialing out, rather than the /dev/term/x. Nevertheless, if you have
+   trouble dialing out with one, try the other.
+
+   Reportedly, if you start C-Kermit and "set line" to a port that has a
+   modem connected to it that is not turned on, and then "set flow
+   rts/cts", there might be some (unspecified) difficulties closing the
+   device because the CTS signal is not coming in from the modem.
+    ________________________________________________________________________
+
+  3.7.3. SunLink X.25
+
+   [ [424]Top ] [ [425]Contents ] [ [426]Section Contents ] [ [427]Next ]
+   [ [428]Previous ]
+
+   The built-in SunLink X.25 support for Solaris 2.3/2.4./25 and SunLink
+   8.01 or 9.00 works OK provided the X.25 system has been installed and
+   initialized properly. Packet sizes might need to be reduced to 256,
+   maybe even less, depending on the configuration of the X.25
+   installation. On one connection where C-Kermit 6.0 was tested, very
+   large packets and window sizes could be used in one direction, but
+   only very small ones would work in the other.
+
+   In any case, according to Sun, C-Kermit's X.25 support is superfluous
+   with SunLink 8.x / Solaris 2.3. Quoting an anonymous Sun engineer:
+
+     ... there is now no need to include any X.25 code within kermit. As
+     of X.25 8.0.1 we support the use of kermit, uucp and similar
+     protocols over devices of type /dev/xty. This facility was there in
+     8.0, and should also work on the 8.0 release if patch 101524 is
+     applied, but I'm not 100% sure it will work in all cases, which is
+     why we only claim support from 8.0.1 onwards.
+
+     When configuring X.25, on the "Advanced Configuration->Parameters"
+     screen of the x25tool you can select a number of XTY devices. If
+     you set this to be > 1, press Apply, and reboot, you will get a
+     number of /dev/xty entries created.
+
+     Ignore /dev/xty0, it is a special case. All the others can be used
+     exactly as if they were a serial line (e.g. /dev/tty) connected to
+     a modem, except that instead of using Hayes-style commands, you use
+     PAD commands.
+
+     From kermit you can do a 'set line' command to, say, /dev/xty1,
+     then set your dialing command to be "CALL 12345678", etc. All the
+     usual PAD commands will work (SET, PAR, etc).
+
+     I know of one customer in Australia who is successfully using this,
+     with kermit scripts, to manage some X.25-connected switches. He
+     used standard kermit, compiled for Solaris 2, with X.25 8.0 xty
+     devices.
+    ________________________________________________________________________
+
+  3.7.4. Sun Workstation Keyboard Mapping
+
+   [ [429]Top ] [ [430]Contents ] [ [431]Section Contents ] [ [432]Next ]
+   [ [433]Previous ]
+
+   Hints for using a Sun workstation keyboard for VT emulation when
+   accessing VMS, from the [434]comp.os.vms newsgroup:
+
+     From: Jerry Leichter <leichter@smarts.com>
+     Newsgroups: comp.os.vms
+     Subject: Re: VT100 keyboard mapping to Sun X server
+     Date: Mon, 19 Aug 1996 12:44:21 -0400
+
+     > I am stuck right now using a Sun keyboard (type 5) on systems
+     running SunOS
+     > and Solaris. I would like to use EVE on an OpenVMS box with
+     display back to
+     > the Sun. Does anyone know of a keyboard mapping (or some other
+     procedure)
+     > which will allow the Sun keyboard to approximate a VT100/VT220?
+
+     You can't get it exactly - because the keypad has one fewer key -
+     but you can come pretty close. Here's a set of keydefs I use:
+
+  keycode 101=KP_0
+  keycode 119=KP_1
+  keycode 120=KP_2
+  keycode 121=KP_3
+  keycode 98=KP_4
+  keycode 99=KP_5
+  keycode 100=KP_6
+  keycode 75=KP_7
+  keycode 76=KP_8
+  keycode 77=KP_9
+  keycode 52=KP_F1
+  keycode 53=KP_F2
+  keycode 54=KP_F3
+  keycode 57=KP_Decimal
+  keycode 28=Left
+  keycode 29=Right
+  keycode 30=KP_Separator
+  keycode 105=KP_F4
+  keycode 78=KP_Subtract
+  keycode 8=Left
+  keycode 10=Right
+  keycode 32=Up
+  keycode 33=Down
+  keycode 97=KP_Enter
+
+     Put this in a file - I use "keydefs" in my home directory and feed
+     it into xmodmap:
+
+  xmodmap - <$HOME/keydefs
+
+     This takes care of the arrow keys and the "calculator" key cluster.
+     The "+" key will play the role of the DEC "," key. The Sun "-" key
+     will be like the DEC "-" key, though it's in a physically different
+     position - where the DEC PF4 key is. The PF4 key is ... damn, I'm
+     not sure where "key 105" is. I *think* it may be on the leftmost
+     key of the group of four just above the "calculator" key cluster.
+
+     I also execute the following (this is all in my xinitrc file):
+
+  xmodmap -e 'keysym KP_Decimal = KP_Decimal'
+  xmodmap -e 'keysym BackSpace = Delete BackSpace' \
+          -e 'keysym Delete = BackSpace Delete'
+  xmodmap -e 'keysym KP_Decimal = Delete Delete KP_Decimal'
+  xmodmap -e 'add mod1 = Meta_R'
+  xmodmap -e 'add mod1 = Meta_L'
+
+     Beware of one thing about xmodmap: Keymap changes are applied to
+     the *whole workstation*, not just to individual windows. There is,
+     in fact, no way I know of to apply them to individual windows.
+     These definitions *may* confuse some Unix programs (and/or some
+     Unix users).
+
+     If you're using Motif, you may also need to apply bindings at the
+     Motif level. If just using xmodmap doesn't work, I can try and dig
+     that stuff up for you.
+    ________________________________________________________________________
+
+  3.7.5. Solaris PPP Connections
+
+   [ [435]Top ] [ [436]Contents ] [ [437]Section Contents ] [ [438]Next ]
+   [ [439]Previous ]
+
+   The following is a report from a user of C-Kermit 8.0 on Solaris 8 and
+   9, who had complained that while Kermit file transfers worked
+   perfectly on direct (non-PPP) dialout connections, they failed
+   miserably on PPP connections. We suggested that the PPP dialer
+   probably was not setting the port and/or modem up in the same way that
+   Kermit did:
+
+     I want to get back on this and tell you what the resolution was.
+     You pointed me in the direction of flow control, which turned out
+     to be the key.
+
+     Some discussion on the comp.unix.solaris newsgroup led to some
+     comments from Greg Andrews about the need to use the uucp driver to
+     talk to the modem (/dev/cua/a). I had to remind Greg that no matter
+     what the manpages for the zs and se drivers say, the ppp that Sun
+     released with Solaris 8 7/01, and has in Solaris 9, is a setuid
+     root program, and simply trying to make a pppd call from user space
+     specifying /dev/cua/a would fail because of permissions. Greg
+     finally put the question to the ppp people, who came back with
+     information that is not laid out anywhere in the docs available for
+     Solaris users. Namely, put /dev/cua/a in one of the priviledged
+     options files in the /etc/ppp directory. That, plus resetting the
+     OBP ttya-ignore-cd flag (this is Sun hardware) to false, seems to
+     have solved the problems.
+
+     While I note that I had installed Kermit suid to uucp to use
+     /dev/cua/a on this particular box, it seems to run fine through
+     /dev/term/a. Not so with pppd.
+
+     With this change in place, I seem to be able to upload and download
+     through telnet run on Kermit with the maximum length packets. I
+     note that the window allocation display does show STREAMING, using
+     telnet. Running ssh on Kermit, I see the standard 1 of 30 windows
+     display, and note that there appears to be a buffer length limit
+     between 1000 and 2000 bytes. Run with 1000, and it's tick-tock,
+     solid as a rock. With 2000 I see timeout errors and RTS/CTS action
+     on the modem.
+
+   Kermit's packet-length and other controls let you make adjustments
+   like this to get around whatever obstacles might be thrown up -- in
+   this case (running Kermit over ssh), the underling Solaris PTY driver.
+    ________________________________________________________________________
+
+  3.7.6. Solaris 2.4 and Earlier
+
+   [ [440]Top ] [ [441]Contents ] [ [442]Section Contents ] [
+   [443]Previous ]
+
+   C-Kermit can't be compiled successfully under Solaris 2.3 using
+   SUNWspro cc 2.0.1 unless at least some of the following patches are
+   applied to cc (it is not known which one(s), if any, fix the problem):
+
+     * 100935-01 SparcCompiler C 2.0.1: bad code generated when addresses
+       of two double arguments are involved
+     * 100961-05 SPARCcompilers C 2.0.1: conditional expression with
+       function returning structure gives wrong value
+     * 100974-01 SparcWorks 2.0.1: dbx jumbo patch
+     * 101424-01 SPARCworks 2.0.1 maketool SEGV's instantly on Solaris
+       2.3
+
+   With unpatched cc 2.0.1, the symptom is that certain modules generate
+   truncated object files, resulting in many unresolved references at
+   link time.
+
+     The rest of the problems in this section have to do with
+     bidirectional terminal ports and the Solaris Port Monitor. A bug in
+     C-Kermit 5A ticked a bug in Solaris. The C-Kermit bug was fixed in
+     version 6.0, and the Solaris bug was fixed in 2.4 (I think, or
+     maybe 2.5). 
+
+   Reportedly, "C-Kermit ... causes a SPARCstation running Solaris 2.3 to
+   panic after the modem connects. I have tried compiling C-Kermit with
+   Sun's unbundled C compiler, with GCC Versions 2.4.5 and 2.5.3, with
+   make targets 'sunos51', 'sunos51tcp', 'sunos51gcc', and even 'sys5r4',
+   and each time it compiles and starts up cleanly, but without fail, as
+   soon as I dial the number and get a 'CONNECT' message from the modem,
+   I get:
+
+  BAD TRAP
+  kermit: Data fault
+  kernel read fault at addr=0x45c, pme=0x0
+  Sync Error Reg 80 <INVALID>
+  ...
+  panic: Data Fault.
+  ...
+  Rebooting...
+
+   The same modem works fine for UUCP/tip calling." Also (reportedly),
+   this only happens if the dialout port is configured as in/out via
+   admintool. If it is configured as out-only, no problem. This is the
+   same dialing code that works on hundreds of other System-V based Unix
+   OS's. Since it should be impossible for a user program to crash the
+   operating system, this problem must be chalked up to a Solaris bug.
+   Even if you SET CARRIER OFF, CONNECT, and dial manually by typing
+   ATDTnnnnnnn, the system panics as soon as the modem issues its CONNECT
+   message. (Clearly, when you are dialing manually, C-Kermit does not
+   know a thing about the CONNECT message, and so the panic is almost
+   certainly caused by the transition of the Carrier Detect (CD) line
+   from off to on.) This problem was reported by many users, all of whom
+   say that C-Kermit worked fine on Solaris 2.1 and 2.2. If the
+   speculation about CD is true, then a possible workaround might be to
+   configure the modem to leave CD on (or off) all the time. Perhaps by
+   the time you read this, a patch will have been issued for Solaris 2.3.
+
+   The following is from Karl S. Marsh, Systems & Networks Administrator,
+   AMBIX Systems Corp, Rochester, NY:
+
+     Environment: Solaris 2.3 Patch 101318-45 C-Kermit 5A(189) (and
+     presumably this applies to 188 and 190 also). eeprom setting:
+
+  ttya-rts-dtr-off=false
+  ttya-ignore-cd=false
+  ttya-mode=19200,8,n,8,-
+
+     To use C-Kermit on a bidirectional port in this environment, do not
+     use admintool to configure the port. Use admintool to delete any
+     services running on the port and then quit admintool and issue the
+     following command:
+
+  pmadm -a -p zsmon -s ttyb -i root -fu -v 1 -m "`ttyadm -b -d /dev/term/b \
+  -l conttyH -m ldterm,ttcompat -s /usr/bin/login -S n`"
+
+     [NOTE: This was copied from a blurry fax, so please check it
+     carefully] where:
+
+  -a = Add service
+  -p = pmtag (zsmon)
+  -s = service tag (ttyb)
+  -i = id to be associated with service tag (root)
+  -fu = create utmp entry
+  -v = version of ttyadm
+  -m = port monitor-specific portion of the port monitor administrative file
+       entry for the service
+  -b = set up port for bidirectional use
+  -d = full path name of device
+  -l = which ttylabel in the /etc/ttydefs file to use
+  -m = a list of pushable STREAMS modules
+  -s = pathname of service to be invoked when connection request received
+  -S = software carrier detect on or off (n = off)
+
+     "This is exactly how I was able to get Kermit to work on a
+     bi-directional port without crashing the system."
+
+   On the Solaris problem, also see SunSolve Bug ID 1150457 ("Using
+   C-Kermit, get Bad Trap on receiving prompt from remote system").
+   Another user reported "So, I have communicated with the Sun tech
+   support person that submitted this bug report [1150457]. Apparently,
+   this bug was fixed under one of the jumbo kernel patches. It would
+   seem that the fix did not live on into 101318-45, as this is EXACTLY
+   the error that I see when I attempt to use kermit on my system."
+
+   Later (Aug 94)... C-Kermit dialout successfully tested on a Sun4m with
+   a heavily patched Solaris 2.3. The patches most likely to have been
+   relevant:
+
+     * 101318-50: SunOS 5.3: Jumbo patch for kernel (includes libc,
+       lockd)
+     * 101720-01: SunOS 5.3: ttymon - prompt not always visible on a
+       modem connection
+     * 101815-01: SunOS 5.3: Data fault in put() NULL queue passed from
+       ttycommon_qfull()
+     * 101328-01: SunOS 5.3: Automation script to properly setup tty
+       ports prior to PCTS execution
+
+   Still later (Nov 94): another user (Bo Kullmar in Sweden) reports that
+   after using C-Kermit to dial out on a bidirectional port, the port
+   might not answer subsequent incoming calls, and says "the problem is
+   easy enough to fix with the Serial Port Manager; I just delete the
+   service and install it again using the graphical interface, which
+   underneath uses commands like sacadm and pmadm." Later Bo reports, "I
+   have found that if I run Kermit with the following script then it
+   works. This script is for /dev/cua/a, "-s a" is the last a in
+   /dev/cua/a:
+
+  #! /bin/sh
+  kermit
+  sleep 2
+  surun pmadm -e -p zsmon -s a
+    ________________________________________________________________________
+
+  3.8. C-KERMIT AND SUNOS
+
+   [ [444]Top ] [ [445]Contents ] [ [446]Section Contents ] [ [447]Next ]
+   [ [448]Previous ]
+
+   For additional information, see "Celeste's Tutorial on SunOS 4.1.3+
+   Modems and Terminals":
+
+  [449]http://www.stokely.com/
+
+   For FAQs, etc, from Sun, see:
+     * [450]http://access1.sun.com/
+
+   For history of Sun models and SunOS versions, see (should be all the
+   same):
+     * [451]http://www.ludd.luth.se/~bear/project/sun/sun.hardware.txt
+     * [452]ftp://ftp.netcom.com/pub/ru/rubicon/sun.hdwr.ref
+     * [453]ftp://ftp.intnet.net/pub/SUN/Sun-Hardware-Ref
+
+   Sun SPARCstation users should read the section "Setting up Modem
+   Software" in the Desktop SPARC Sun System & Network Manager's Guide.
+   If you don't set up your serial ports correctly, Kermit (and other
+   communications software) won't work right.
+
+   Also, on certain Sun models like IPC, the serial port hardware might
+   need to have a jumper changed to make it an RS-232 port rather than
+   RS-423.
+
+   Reportedly, C-Kermit does not work correctly on a Sun SPARCstation in
+   an Open Windows window with scrolling enabled. Disable scrolling, or
+   else invoke Kermit in a terminal emulation window (xterm, crttool,
+   vttool) under SunView (this might be fixed in later SunOS releases).
+
+   On the Sun with Open Windows, an additional symptom has been reported:
+   outbound SunLink X.25 connections "magically" translate CR typed at
+   the keyboard into LF before transmission to the remote host. This
+   doesn't happen under SunView.
+
+   SET CARRIER ON, when used on the SunOS 4.1 version of C-Kermit
+   (compiled in the BSD universe), causes the program to hang
+   uninterruptibly when SET LINE is issued for a device that is not
+   asserting carrier. When Kermit is built in the Sys V universe on the
+   same computer, there is no problem (it can be interrupted with
+   Ctrl-C). This is apparently a limitation of the BSD-style tty driver.
+
+   SunOS 4.1 C-Kermit has been observed to dump core when running a
+   complicated script program under cron. The dump invariably occurs in
+   ttoc(), while trying to output a character to a TCP/IP TELNET
+   connection. ttoc() contains a write() call, and when the system or the
+   network is very busy, the write() call can get stuck for long periods
+   of time. To break out of deadlocks caused by stuck write() calls,
+   there is an alarm around the write(). It is possible that the core
+   dump occurs when this alarm signal is caught. (This one has not been
+   observed recently -- possibly fixed in edit 190.)
+
+   On Sun computers with SunOS 4.0 or 4.1, SET FLOW RTS/CTS works only if
+   the carrier signal is present from the communication device at the
+   time when C-Kermit enters packet mode or CONNECT mode. If carrier is
+   not sensed (e.g. when dialing), C-Kermit does not attempt to turn on
+   RTS/CTS flow control. This is because the SunOS serial device driver
+   does not allow characters to be output if RTS/CTS is set (CRTSCTS) but
+   carrier (and DSR) are not present. Workaround (maybe): SET CARRIER OFF
+   before giving the SET LINE command, establish the connection, then SET
+   FLOW RTS/CTS
+
+   It has also been reported that RTS/CTS flow control under SunOS 4.1
+   through 4.1.3 works only on INPUT, not on output, and that there is a
+   patch from Sun to correct this problem: Patch-ID# T100513-04, 20 July
+   1993 (this patch might apply only to SunOS 4.1.3). It might also be
+   necessary to configure the eeprom parameters of the serial port; e.g.
+   do the following as root at the shell prompt:
+
+  eeprom  ttya-ignore-cd=false
+  eeprom  ttya-rts-dtr-off=true
+
+   There have been reports of file transfer failures on Sun-3 systems
+   when using long packets and/or large window sizes. One user says that
+   when this happens, the console issues many copies of this message:
+
+  chaos vmunix: zs1: ring buffer overflow
+
+   This means that SunOS is not scheduling Kermit frequently enough to
+   service interrupts from the zs serial device (Zilog 8350 SCC serial
+   communication port) before its input silo overflows. Workaround: use
+   smaller packets and/or a smaller window size, or use "nice" to
+   increase Kermit's priority. Use hardware flow control if available, or
+   remove other active processes before running Kermit.
+
+   SunLink X.25 support in C-Kermit 5A(190) was built and tested
+   successfully under SunOS 4.1.3b and SunLink X.25 7.00.
+    ________________________________________________________________________
+
+  3.9. C-KERMIT AND ULTRIX
+
+   [ [454]Top ] [ [455]Contents ] [ [456]Section Contents ] [ [457]Next ]
+   [ [458]Previous ]
+
+   See also: The [459]comp.unix.ultrix and [460]comp.sys.dec newsgroups.
+
+   There is no hardware flow control in Ultrix. That's not a Kermit
+   deficiency, but an Ultrix one.
+
+   When sending files to C-Kermit on a Telnet connection to a remote
+   Ultrix system, you must SET PREFIXING ALL (or at least prefix more
+   control characters than are selected by SET PREFIXING CAUTIOUS).
+
+   Reportedly, DEC ULTRIX 4.3 is immune to C-Kermit's disabling of
+   SIGQUIT, which is the signal that is generated when the user types
+   Ctrl-\, which kills the current process (i.e. C-Kermit) and dumps
+   core. Diagnosis and cure unknown. Workaround: before starting C-Kermit
+   -- or for that matter, when you first log in because this applies to
+   all processes, not just Kermit -- give the following Unix command:
+
+  stty quit undef
+
+   Certain operations driven by RS-232 modem signal do not work on
+   DECstations or other DEC platforms whose serial interfaces use MMP
+   connectors (DEC version of RJ45 telephone jack with offset tab). These
+   connectors convey only the DSR and DTR modem signals, but not carrier
+   (CD), RTS, CTS, or RI. Use SET CARRIER OFF to enable communication, or
+   "hotwire" DSR to CD.
+
+   The maximum serial speed on the DECstation 5000 is normally 19200, but
+   various tricks are available (outside Kermit) to enable higher rates.
+   For example, on the 5000/200, 19200 can be remapped (somehow,
+   something to do with "a bit in the SIR", whatever that is) to 38400,
+   but in software you must still refer to this speed as 19200; you can't
+   have 19200 and 38400 available at the same time.
+
+   19200, reportedly, is also the highest speed supported by Ultrix, but
+   NetBSD reportedly supports speeds up to 57600 on the DECstation,
+   although whether and how well this works is another question.
+
+   In any case, given the lack of hardware flow control in Ultrix, high
+   serial speeds are problematic at best.
+    ________________________________________________________________________
+
+  3.10. C-KERMIT AND UNIXWARE
+
+   [ [461]Top ] [ [462]Contents ] [ [463]Section Contents ] [ [464]Next ]
+   [ [465]Previous ]
+
+   See also:
+     * The Freebird Project (Unixware software repository)
+       [466]http://www.freebird.org/
+     * The UnixWare FAQ: [467]http://www.freebird.org/faq/
+     * The following newsgroups:
+          + [468]comp.unix.unixware.misc
+          + [469]comp.unix.sco.misc.
+
+   Also see general comments on PC-based Unixes in [470]Section 3.0. By
+   the way, this section is separate from the SCO (Caldera) section
+   because at the time this section was started, Unixware was owned by a
+   company called Univel. Later it was sold to Novell, and then to SCO.
+   Still later, SCO was sold to Caldera.
+
+   In Unixware 2.0 and later, the preferred serial device names (drivers)
+   are /dev/term/00 (etc), rather than /dev/tty00 (etc). Note the
+   following correspondence of device names and driver characteristics:
+
+  New name       Old name     Description              
+  /dev/term/00   /dev/tty00   ???
+  /dev/term/00h  /dev/tty00h  Modem signals and hardware flow control
+  /dev/term/00m  /dev/tty00m  Modem signals(?)
+  /dev/term/00s  /dev/tty00s  Modem signals and software flow control
+  /dev/term/00t  /dev/tty00t  ???
+
+   Lockfile names use device.major.minor numbers, e.g.:
+
+  /var/spool/locks/LK.7679.003.005
+
+   The minor number varies according to the device name suffix (none, h,
+   m, s, or t). Only the device and major number are compared, and thus
+   all of the different names for the same physical device (e.g. all of
+   those shown in the table above) interlock effectively.
+
+   Prior to UnixWare 7, serial speeds higher than 38400 are not
+   supported. In UnixWare 7, we also support 57600 and 115200, plus some
+   unexpected ones like 14400, 28800, and 76800, by virtue of a strange
+   new interface, evidently peculiar to UnixWare 7, discovered while
+   digging through the header files: tcsetspeed(). Access to this
+   interface is allowed only in POSIX builds, and thus the UnixWare 7
+   version of C-Kermit is POSIX-based, unlike C-Kermit for Unixware 1.x
+   and 2.x (since the earlier UnixWare versions did not support high
+   serial speeds, period).
+
+   HOWEVER, turning on POSIX features engages all of the "#if
+   (!_POSIX_SOURCE)" clauses in the UnixWare header files, which in turn
+   prevent us from having modem signals, access to the hardware flow
+   control APIs, select(), etc -- in short, all the other things we need
+   in communications software, especially when high speeds are used. Oh
+   the irony. And so C-Kermit must be shamelessly butchered -- as it has
+   been so many times before -- to allow us to have the needed features
+   from the POSIX and non-POSIX worlds. See the UNIXWAREPOSIX sections of
+   [471]ckutio.c.
+
+   After the butchery, we wind up with Unixware 2.x having full
+   modem-signal capability, but politically-correct Unixware 7.x lacking
+   the ability to automatically detect a broken connection when carrier
+   drops.
+
+   Meanwhile the Unixware tcsetspeed() function allows any number at all
+   (any long, 0 or positive) as an argument and succeeds if the number is
+   a legal bit rate for the serial device, and fails otherwise. There is
+   no list anywhere of legal speeds. Thus the SET SPEED keyword table
+   ("set speed ?" to see it) is hardwired based on trial and error with
+   all known serial speeds, the maximum being 115200. However, to allow
+   for the possibility that other speeds might be allowed in the future
+   (or with different port drivers), the SET SPEED command for UnixWare 7
+   only allows you to specify any number at all; a warning is printed if
+   the number is not in the list, but the number is accepted anyway; the
+   command succeeds if tcsetspeed() accepts the number, and fails
+   otherwise.
+
+   In C-Kermit 8.0 testing, it was noticed that the POSIX method for
+   hanging up the phone by dropping DTR (set speed 0, pause, restore
+   speed) did not actually drop DTR. The APIs do not return any error
+   indication, but nothing happens. I changed tthang() to skip the
+   special case I had made for Unixware and instead follow the normal
+   path: if TIOCSDTR is defined use that, otherwise blah blah... It turns
+   out TIOCSDTR *is* defined, and it works.
+
+   So in Unixware (at least in 2.1.3) we can read modem signals, hangup
+   by toggling DTR, and so on, BUT... But once the remote hangs up and
+   Carrier drops, the API for reading modem signals ceases to function;
+   although the device is still open, the TIOCMGET ioctl always raises
+   errno 6 = ENXIO, "No such device or address".
+
+   Old business:
+
+   Using C-Kermit 6.0 on the UnixWare 1.1 Application Server, one user
+   reported a system panic when the following script program is executed:
+
+  set line /dev/tty4
+  set speed 9600
+  output \13
+  connect
+
+   The panic does not happen if a PAUSE is inserted:
+
+  set line /dev/tty4
+  set speed 9600
+  pause 1
+  output \13
+  connect
+
+   This is using a Stallion EasyIO card installed as board 0 on IRQ 12 on
+   a Gateway 386 with the Stallion-supplied driver. The problem was
+   reported to Novell and Stallion and (reportedly) is now fixed.
+    ________________________________________________________________________
+
+  3.11. C-KERMIT AND APOLLO SR10
+
+   [ [472]Top ] [ [473]Contents ] [ [474]Section Contents ] [ [475]Next ]
+   [ [476]Previous ]
+
+   Reportedly, version 5A(190), when built under Apollo SR10 using "make
+   sr10-bsd", compiles, links, and executes OK, but leaves the terminal
+   unusable after it exits -- the "cs7" or "cs8" (character size)
+   parameter has become cs5. The terminal must be reset from another
+   terminal. Cause and cure unknown. Suggested workaround: Wrap Kermit in
+   a shell script something like:
+
+  kermit @*
+  stty sane
+    ________________________________________________________________________
+
+  3.12. C-KERMIT AND TANDY XENIX 3.0
+
+   [ [477]Top ] [ [478]Contents ] [ [479]Section Contents ] [ [480]Next ]
+   [ [481]Previous ]
+
+   C-Kermit 7.0 was too big to be built on Tandy Xenix, even in a minimum
+   configuration; version 6.0 is the last one that fits.
+
+   Reportedly, in C-Kermit 6.0, if you type lots of Ctrl-C's during
+   execution of the initialization file, ghost Kermit processes will be
+   created, and will compete for the keyboard. They can only be removed
+   via "kill -9" from another terminal, or by rebooting. Diagnosis --
+   something strange happening with the SIGINT handler while the process
+   is reading the directory (it seems to occur during the SET PROMPT
+   [\v(dir)] ... sequence). Cure: unknown. Workaround: don't interrupt
+   C-Kermit while it is executing its init file on the Tandy 16/6000.
+    ________________________________________________________________________
+
+  3.13. C-KERMIT AND OSF/1 (DIGITAL UNIX) (TRU64 UNIX)
+
+   [ [482]Top ] [ [483]Contents ] [ [484]Section Contents ] [ [485]Next ]
+   [ [486]Previous ]
+
+   While putting together and testing C-Kermit 8.0, it was discovered
+   that binaries built for one version of Tru64 Unix (e.g. 4.0G) might
+   exhibit very strange behavior if run on a different version of Tru64
+   Unix (e.g. 5.1A). The typical symptom was that a section of the
+   initialization file would be skipped, notably locating the dialing
+   and/or network directory as well as finding and executing the
+   customization file, ~/.mykermrc. This problem also is reported to
+   occur on Tru64 Unix 5.0 (Rev 732) even when running a C-Kermit binary
+   that was built there. However, the Tru64 5.1A binary works correctly
+   on 5.0. Go figure.
+
+   When making Telnet connections to a Digital Unix or Tru64 system, and
+   your Telnet client forwards your user name, the Telnet server
+   evidently stuffs the username into login's standard input, and you
+   see:
+
+  login: ivan
+  Password:
+
+   This is clearly going to play havoc with scripts that look for
+   "login:". Workaround (when Kermit is your Telnet client): SET LOGIN
+   USER to nothing, to prevent Kermit from sending your user ID.
+
+   Before you can use a serial port on a new Digital Unix system, you
+   must run uucpsetup to enable or configure the port. Evidently the
+   /dev/tty00 and 01 devices that appear in the configuration are not
+   usable; uucpsetup turns them into /dev/ttyd00 and 01, which are. Note
+   that uucpsetup and other uucp-family programs are quite primitive --
+   they only know about speeds up to 9600 bps and their selection of
+   modems dates from the early 1980s. None of this affects Kermit, though
+   -- with C-Kermit, you can use speeds up to 115200 bps (at least in
+   DU4.0 and later) and modern modems with hardware flow control and all
+   the rest.
+
+   Reportedly, if a modem is set for &S0 (assert DSR at all times), the
+   system resets or drops DTR every 30 seconds; reportedly DEC says to
+   set &S1.
+
+   Digital Unix 3.2 evidently wants to believe your terminal is one line
+   longer than you say it is, e.g. when a "more" or "man" command is
+   given. This is has nothing to do with C-Kermit, but tends to annoy
+   those who use Kermit or other terminal emulators to access Digital
+   Unix systems. Workaround: tell Unix to "stty rows 23" (or whatever).
+
+   Reportedly, there is some bizarre behavior when trying to use a
+   version of C-Kermit built on one Digital Unix 4.0 system on another
+   one, possibly due to differing OS or library revision levels; for
+   example, the inability to connect to certain TCP/IP hosts. Solution:
+   rebuild C-Kermit from source code on the system where you will be
+   using it.
+
+   Digital Unix tgetstr() causes a segmentation fault. C-Kermit 7.0 added
+   #ifdefs to avoid calling this routine in Digital Unix. As a result,
+   the SCREEN commands always send ANSI escape sequences -- even though
+   curses knows your actual terminal type.
+
+   Reportedy the Tru64 Unix 4.0E 1091 Telnet server does not tolerate
+   streaming transfers into itself, at least not when the sending Kermit
+   is on the same local network. Solution: tell one Kermit or the other
+   (or both) to "set streaming off". This might or might be the case with
+   earlier and/or later Tru64, Digital Unix, and OSF/1 releases.
+    ________________________________________________________________________
+
+  3.14. C-KERMIT AND SGI IRIX
+
+   [ [487]Top ] [ [488]Contents ] [ [489]Section Contents ] [ [490]Next ]
+   [ [491]Previous ]
+
+   See also:
+     * The [492]comp.sys.sgi.misc and [493]comp.sys.sgi.admin newsgroups.
+       [494]The SGI website
+     * The SGI FAQ:
+          + [495]http://www-viz.tamu.edu/~sgi-faq/
+          + [496]ftp://viz.tamu.edu/pub/sgi/faq/
+
+   About IRIX version numbers: "uname -a" tells the "two-digit" version
+   number, such as "5.3" or "6.5". The three-digit form can be seen with
+   "uname -R". (this information is unavailable at the simple API level).
+   Supposedly all three-digit versions within the same two-digit version
+   (e.g. 6.5.2, 6.5.3) are binary compatible; i.e. a binary built on any
+   one of them should run on all others. The "m" suffix denotes just
+   patches; the "f" suffix indicates that features were added.
+
+   An IRIX binary built on lower MIPS model (Instruction Set
+   Architecture, ISA) can run on higher models, but not vice versa:
+
+     MIPS1 R3000 and below
+     MIPS2 R4000
+     MIPS3 R4x00
+     MIPS4 R5000 and above
+
+   Furthermore, there are different Application Binary Inferfaces (ABIs):
+
+     COFF    32 bits, IRIX 5.3, 5.2, 5.1, 4.x and below
+     o32 ELF 32 bits, IRIX 5.3, 6.0 - 6.5
+     N32 ELF 32 bits, IRIX 6.2 - 6.5
+     N64 ELF 64 bits, IRIX 6.2 - 6.5
+
+   Thus a prebuilt IRIX binary works on a particular machine only if (a)
+   the machine's IRIX version (to one decimal place) is equal to or
+   greater than the version under which the binary was built; (b) the
+   machine's MIPS level is greater or equal to that of the binary; and
+   (c) the machine supports the ABI of the binary. If all three
+   conditions are not satisfied, of course, you can build a binary
+   yourself from source code since, unlike some other Unix vendors, SGI
+   does supply a C compiler and libraries.
+
+   SGI did not supply an API for hardware flow control prior to IRIX 5.2.
+   C-Kermit 6.1 and higher for IRIX 5.2 and higher supports hardware flow
+   control in the normal way, via "set flow rts/cts".
+
+   For hardware flow control on earlier IRIX and/or C-Kermit versions,
+   use the ttyf* (modem control AND hardware flow control) devices and
+   not the ttyd* (direct) or ttym* (modem control but no hardware flow
+   control) ones, and obtain the proper "hardware handshaking" cable from
+   SGI, which is incompatible with the ones for the Macintosh and NeXT
+   even though they look the same ("man serial" for further info) and
+   tell Kermit to "set flow keep" and "set modem flow rts/cts".
+
+   Serial speeds higher than 38400 are available in IRIX 6.2 and later,
+   on O-class machines (e.g. Origin, Octane) only, and are supported by
+   C-Kermit 7.0 and later. Commands such as "set speed 115200" may be
+   given on other models (e.g. Iris, Indy, Indigo) but will fail because
+   the OS reports an invalid speed for the device.
+
+   Experimentation with both IRIX 5.3 and 6.2 shows that when logged in
+   to IRIX via Telnet, that remote-mode C-Kermit can't send files if the
+   packet length is greater than 4096; the Telnet server evidently has
+   this restriction (or bug), since there is no problem sending long
+   packets on serial or rlogin connections. However, it can receive files
+   with no problem if the packet length is greater than 4096. As a
+   workaround, the FAST macro for IRIX includes "set send packet-length
+   4000". IRIX 6.5.1 does not have this problem, so evidently it was
+   fixed some time after IRIX 6.2. Tests show file-transfer speeds are
+   better (not worse) with 8K packets than with 4K packets from IRIX
+   6.5.1.
+
+   Reportedly some Indys have bad serial port hardware. IRIX 5.2, for
+   example, needs patch 151 to work around this; or upgrade to a later
+   release. Similarly, IRIX 5.2 has several problems with serial i/o,
+   flow control, etc. Again, patch or upgrade.
+
+   Reportedly on machines with IRIX 4.0, Kermit cannot be suspended by
+   typing the suspend ("swtch") character if it was started from csh,
+   even though other programs can be suspended this way, and even though
+   the Z and SUSPEND commands still work correctly. This is evidently
+   because IRIX's csh does not deliver the SIGTSTP signal to Kermit. The
+   reason other programs can be suspended in the same environment is
+   probably that they do not trap SIGTSTP themselves, so the shell is
+   doing the suspending rather than the application.
+
+   Also see notes about IRIX 3.x in the [497]C-Kermit for Unix
+   Installation Instructions.
+
+   If you have problems making TCP/IP connections in versions of IRIX
+   built with GCC 2.95.2, see the bugs section of:
+
+  [498]http://freeware.sgi.com/Installable/gcc-2.95.2.html.
+
+   Reportedly, if you allow gcc to compile C-Kermit on Irix you should be
+   aware that there might be problems with some of the network code. The
+   specifics are at
+   [499]http://freeware.sgi.com/Installable/gcc-2.95.2.html; scroll down
+   to the "known bugs" section at the end of the document.
+    ________________________________________________________________________
+
+  3.15. C-KERMIT AND THE BEBOX
+
+   [ [500]Top ] [ [501]Contents ] [ [502]Section Contents ] [ [503]Next ]
+   [ [504]Previous ]
+
+   See also: The [505]comp.sys.be newsgroup.
+
+   The BeBox has been discontinued and BeOS repositioned for PC
+   platforms. The POSIX parts of BeOS are not finished, nor is the
+   sockets library, therefore a fully functional version of C-Kermit is
+   not possible. In version 6.0 of C-Kermit, written for BeOS DR7, it was
+   possible to:
+
+     * set line /dev/serial2 (and probably the other serial ports)
+     * set speed 115200 (and at least some of the lower baud rates)
+     * connect
+     * set modem type hayes (and likely others, too)
+     * dial phone-number
+     * set send packet-length 2048 (other lengths for both send and
+       receive)
+     * set receive packet length 2048
+     * set file type binary (text mode works, too) (with remote kermit
+       session in server mode)
+     * put bedrop.jpg
+     * get bedrop.jpg
+     * get bedrop.jpg bedrop.jpg2
+     * finish, bye
+
+   The following do not work:
+     * kermit does not detect modem hangup
+     * !/RUN/PUSH [commandline command]
+     * Running kermit in remote mode
+     * Using other protocols (x/y/zmodem)
+     * TCP networking interface (Be's TCP/IP API has a ways to go, still)
+
+   C-Kermit does not work on BeOS DR8 because of changes in the
+   underlying APIs. Unfortunately not enough changes were made to allow
+   the regular POSIX-based C-Kermit to work either. Note: the lack of a
+   fork() service requires the select()-based CONNECT module, but there
+   is no select(). There is a select() in DR8, but it doesn't work.
+
+   C-Kermit 7.0 was built for BeOS 4.5 and works in remote mode. It does
+   not include networking support since the APIs are still not there. It
+   is not known if dialing out works, but probably not. Be experts are
+   welcome to lend a hand.
+    ________________________________________________________________________
+
+  3.16. C-KERMIT AND DG/UX
+
+   [ [506]Top ] [ [507]Contents ] [ [508]Section Contents ] [ [509]Next ]
+   [ [510]Previous ]
+
+   Somebody downloaded the C-Kermit 6.0 binary built under DG/UX 5.40 and
+   ran it under DG/UX 5.4R3.10 -- it worked OK except that file dates for
+   incoming files were all written as 1 Jan 1970. Cause and cure unknown.
+   Workaround: SET ATTRIBUTE DATE OFF. Better: Use a version of C-Kermit
+   built under and for DG/UX 5.4R3.10.
+    ________________________________________________________________________
+
+  3.17. C-KERMIT AND SEQUENT DYNIX
+
+   [ [511]Top ] [ [512]Contents ] [ [513]Section Contents ] [ [514]Next ]
+   [ [515]Previous ]
+
+   Reportedly, when coming into a Sequent Unix (DYNIX) system through an
+   X.25 connection, Kermit doesn't work right because the Sequent's
+   FIONREAD ioctl returns incorrect data. To work around, use the
+   1-character-at-a-time version of myread() in ckutio.c (i.e. undefine
+   MYREAD in ckutio.c and rebuild the program). This is unsatisfying
+   because two versions of the program would be needed -- one for use
+   over X.25, and the other for serial and TCP/IP connections.
+    ________________________________________________________________________
+
+  3.18. C-KERMIT AND {FREE,OPEN,NET}BSD
+
+   [ [516]Top ] [ [517]Contents ] [ [518]Section Contents ] [ [519]Next ]
+   [ [520]Previous ]
+
+   Some NebBSD users have reported difficulty escaping back from CONNECT
+   mode, usually when running NetBSD on non-PC hardware. Probably a
+   keyboard issue.
+
+   NetBSD users have also reported that C-Kermit doesn't pop back to the
+   prompt if the modem drops carrier. This needs to be checked out &
+   fixed if possible.
+
+   (All the above seems to work properly in C-Kermit 7.0 and later.)
+    ________________________________________________________________________
+
+  3.19. C-KERMIT AND MAC OS X (Rhapsody, Darwin, Jaguar, Panther)
+
+   [ [521]Top ] [ [522]Contents ] [ [523]Section Contents ] [ [524]Next ]
+   [ [525]Previous ]
+
+   Mac OS X is Apple's 4.4BSD Unix variety, closely related to FreeBSD,
+   but different. "uname -a" is singularly uninformative, as in Linux,
+   giving only the Darwin kernel version number. As far as I can tell,
+   there is no way to find out the Mac OS X version number, such as 10.3
+   (in Linux you can find the distribution version in a
+   distribution-dependent file). Here are some points to be aware of:
+
+     * The biggest gotcha for Kermit users is that Mac OS X does not
+       support serial ports and, as far as I can tell, doesn't support
+       its built-in modem either, for anything other than making Internet
+       connections. Macintoshes capable of running Mac OS X, such as the
+       G5, some without serial ports and without any APIs to support
+       them, and also without the UUCP family of programs (including cu),
+       nor any standard for serial-port lockfile directory.
+     * At least early versions of Mac OS X came without Curses, Termlib,
+       or Terminfo libraries. Later versions seem to have ncurses. Kermit
+       uses curses for its file-transfer display. See elsewhere about
+       curses-vs-ncurses confusion.
+     * In the HFS+ file system, filenames are case-folded. Thus
+       "makefile" and "Makefile" are the same file. The UFS file system
+       is, like normal Unix, case-sensitive.
+     * Files that are composed of a resource fork and a data fork... I
+       doubt that C-Kermit does anything useful with them. There is no
+       code in C-Kermit for traditional two-forked Macintosh files, but
+       it could be added if there is any demand.
+     * In case you want to transfer a traditional Macintosh text file (or
+       data fork of a file that is plain text), you can use these
+       C-Kermit commands:
+
+set file eol cr
+set file character-set apple-quickdraw
+send /text filename
+
+     * File or pathnames that include spaces must be enclosed in either
+       doublequotes or curly braces in C-Kermit commands.
+     * Mac OS X has its own package format for applications, called
+       "fink". Various fink packages for C-Kermit are floating around
+       that are not standard releases. For example, there's a C-Kermit
+       8.0.201 package in which C-Kermit was modifed (at least) to use a
+       UUCP lockfile directory that does not exist on vanilla Mac OS X
+       systems.
+
+    Mac OS X and Serial Ports
+
+   Apple is in the forefront of companies that believe serial ports have
+   no use in the modern world and so has simply eliminated all traces of
+   them from its machines and OS. But of course serial ports are still
+   needed to connect not only to external modems, but also to the control
+   ports of hubs, routers, terminal servers, PBXs, and similar devices,
+   not to mention barcode readers, POS systems and components, automated
+   factory-floor equipment, and scientific, medical, and lab equipment
+   (to name a few). Among workers in these areas, there is a need to add
+   serial ports back onto this platform, which is being filled by
+   third-party products such as the [526]Keyspan USB Serial Adapter. To
+   use the Keyspan device, you must install the accompanying device
+   drivers, which wind up giving you serial ports with names like
+   /dev/cu.USA19H3b1P1.1.
+
+   To configure your Mac OS X system to allow C-Kermit to use these (or
+   any other) serial devices:
+
+    1. su
+       chgrp xxxx /var/spool/lock
+       chmod g+w /var/spool/lock
+       chgrp xxxx /dev/cu.*
+       (where xxxx is the name of the group for users to whom serial-port
+       access is to be granted). Use "admin" or other existing group, or
+       create a new group if desired. NB:
+
+     In the absence of official guidance from Apple or anyone else, we
+     choose /var/spool/lock as the lockfile directory because this
+     directory (a) already exists on vanilla Mac OS X installations, and
+     (b) it is the directory used for serial-port lockfiles on many
+     other platforms. 
+    2. Put all users who need access to the serial port in the same
+       group.
+    3. Make sure the serial device files that are to be used by C-Kermit
+       have group read-write permission and (if you care) lack world
+       read-write permission, e.g.:
+       chmod g+rw,o-rw /dev/cu.*
+
+   If you do the above, then there's no need to become root to use
+   Kermit, or to make Kermit suid or sgid. Just do this:
+
+chmod 775 wermit
+mv wermit /usr/local/bin/kermit
+
+   (or whatever spot is more appropriate). For greater detail about
+   installation (man page, etc), [527]CLICK HERE.
+
+   Back when Macs had serial ports, they were not RS-232 (the standard
+   for connecting computers with nearby modems) but rather RS-422 or -423
+   (a standard for connecting serial devices over longer distances).
+   Macintosh serial ports do not support modems well because they do not
+   have enough wires (or more properly in the case RS-422/423, wire
+   pairs) to convey a useful subset of modem signals. The Keyspan USB
+   adapter gives you two Mini-Din8 RS-422 ports, that are no better (or
+   worse) for communicating with modems or serial devices than a real Mac
+   Din-8 port was. In essense, you get Data In, Data Out, and two modem
+   signals. It looks to me as if the signals chosen by Keyspan are RTS
+   and CTS. This gives you hardware flow control, but at the expense of
+   Carrier Detect. Thus to use C-Kermit with a Keyspan USB serial port,
+   you must tell C-Kermit to:
+
+set modem type none                ; (don't expect a modem)
+set carrier-watch off              ; (ignore carrier signal)
+set port /dev/cu.USA19H3b1P1.1     ; (open the port)
+set flow rts/cts                   ; (this is the default)
+set speed 57600                    ; (or whatever)
+connect                            ; (or whatever)
+
+   Use Ctrl-\C in the normal manner to escape back to the C-Kermit>
+   prompt. Kermit can't pop back to its prompt automatically when Carrier
+   drops because there is no Carrier signal.
+
+         Instructions for the built-in modem remain to be written.
+
+   Links:
+     * [528]Unix tips for Mac OS X (Jerry Stratton)
+    ________________________________________________________________________
+
+  3.20. C-KERMIT AND COHERENT
+
+   [ [529]Top ] [ [530]Contents ] [ [531]Section Contents ] [
+   [532]Previous ]
+
+   Also see:
+
+     [533]http://www.uni-giessen.de/faq/archiv/coherent-faq.general/msg00
+   000.html
+
+   Mark Williams COHERENT was perhaps the first commercial Unix-based
+   operating system for PCs, first appearing about 1983 or -84 for the
+   PC/XT (?), and popular until about 1993, when Linux took over.
+   C-Kermit, as of version 8.0, is still current for COHERENT 386 4.2
+   (i.e. only for i386 and above). Curses is included, but lots of other
+   features are omitted due to lack of the appropriate OS features, APIs,
+   libraries, hardware, or just space: e.g. TCP/IP, floating-point
+   arithmetic, learned scripts. Earlier versions of COHERENT ran on 8086
+   and 80286, but these are to small to build or run C-Kermit, but
+   G-Kermit should be OK (as might be ancient versions of C-Kermit).
+
+   You can actually build a version with floating point support -- just
+   take -DNOFLOAT out of CFLAGS and add -lm to LIBS; NOFLOAT is the
+   default because COHERENT tends to run on old PCs that don't have
+   floating-point hardware. You can also add "-f" to CFLAGS to have it
+   link in the floating-point emulation library. Also I'm not sure why
+   -DNOLEARN is included, since it depends on select(), which COHERENT
+   has.
+    ________________________________________________________________________
+
+  4. GENERAL UNIX-SPECIFIC HINTS, LIMITATIONS, AND BUGS
+
+   [ [534]Top ] [ [535]Contents ] [ [536]Next ] [ [537]Previous ]
+
+  4.1. Modem Signals
+
+   There seems to be an escalating demand for the ability to control
+   "dumb serial devices" (such as "smartcard readers", barcode readers,
+   etc) by explicitly manipulating modem signals, particularly RTS. This
+   might have been easy to do in DOS, where there is no operating system
+   standing between the application and the serial device, but it is
+   problematic in Unix, where modem signals are controlled by the serial
+   device driver. If the driver does not provide an API for doing this,
+   then the application can't do it. If it does provide an API, expect it
+   to be totally different on each Unix platform, since there is no
+   standard for this.
+
+  4.2. NFS Troubles
+
+   Beginning with C-Kermit 6.0, the default C-Kermit prompt includes your
+   current (working) directory; for example:
+
+  [/usr/olga] C-Kermit>
+
+   (In C-Kermit 7.0 the square braces were replaced by round parentheses
+   to avoid conflicts with ISO 646 national character sets.)
+
+   If that directory is on an NFS-mounted disk, and NFS stops working or
+   the disk becomes unavailable, C-Kermit will hang waiting for NFS
+   and/or the disk to come back. Whether you can interrupt C-Kermit when
+   it is hung this way depends on the specific OS. Kermit has called the
+   operating systems's getcwd() function, and is waiting for it to
+   return. Some versions of Unix (e.g. HP-UX 9.x) allow this function to
+   be interrupted with SIGINT (Ctrl-C), others (such as HP-UX 8.x) do
+   not. To avoid this effect, you can always use SET PROMPT to change
+   your prompt to something that does not involve calling getcwd(), but
+   if NFS is not responding, C-Kermit will still hang any time you give a
+   command that refers to an NFS-mounted directory. Also note that in
+   some cases, the uninterruptibility of NFS-dependent system or library
+   calls is considered a bug, and sometimes there are patches. For HP-UX,
+   for example:
+
+                                                        replaced by:
+  HP-UX 10.20     libc    PHCO_8764                     PHCO_14891/PHCO_16723
+  HP-UX 10.10     libc    PHCO_8763                     PHCO_14254/PHCO_16722
+  HP-UX 9.x       libc    PHCO_7747       S700          PHCO_13095
+  HP-UX 9.x       libc    PHCO_6779       S800          PHCO_11162
+
+  4.3. C-Kermit as Login Shell
+
+   You might have reason to make C-Kermit the login shell for a specific
+   user, by entering the pathname of Kermit (possibly with command-line
+   switches, such as -x to put it in server mode) into the shell field of
+   the /etc/passwd file. This works pretty well. In some cases, for
+   "ultimate security", you might want to use a version built with
+   -DNOPUSH (see the [538]Configurations Options document for this, but
+   even if you don't, then PUSHing or shelling out from C-Kermit just
+   brings up a new copy of C-Kermit (but warning: this does not prevent
+   the user from explicitly running a shell; e.g. "run /bin/sh"; use
+   NOPUSH to prevent this).
+
+  4.4. C-Kermit versus screen and splitvt
+
+   C-Kermit file transfers will probably not work if attemped through the
+   "splitvt" or GNU "screen" programs because the screen optimization (or
+   at least, line wrapping, control-character absorption) done by this
+   package interferes with Kermit's packets.
+
+   The same can apply to any other environment in which the user's
+   session is captured, monitored, recorded, or manipulated. Examples
+   include the 'script' program (for making a typescript of a session),
+   the Computronics PEEK package and pksh (at least versions of it prior
+   to 1.9K), and so on.
+
+   You might try the following -- what we call "doomsday Kermit" --
+   settings to push packets through even the densest and most obstructive
+   connections, such as "screen" and "splitvt" (and certain kinds of 3270
+   protocol emulators): Give these commands to BOTH Kermit programs:
+
+  SET FLOW NONE
+  SET CONTROL PREFIX ALL
+  SET RECEIVE PACKET-LENGTH 70
+  SET RECEIVE START 62
+  SET SEND START 62
+  SET SEND PAUSE 100
+  SET BLOCK B
+
+   If it works, it will be slow.
+
+  4.5. C-Kermit versus DOS Emulators
+
+   On Unix workstations equipped with DOS emulators like SoftPC, watch
+   out for what these emulators do to the serial port drivers. After
+   using a DOS emulator, particularly if you use it to run DOS
+   communications software, you might have to reconfigure the serial
+   ports for use by Unix.
+
+  4.6. C-Kermit versus Job Control
+
+   Interruption by Ctrl-Z makes Unix C-Kermit try to suspend itself with
+   kill(0,SIGTSTP), but only on platforms that support job control, as
+   determined by whether the symbol SIGTSTP is defined (or on POSIX or
+   SVR4 systems, if syconf(_SC_JOB_CONTROL) or _POSIX_JOB_CONTROL in
+   addition to SIGTSTP). However, if Kermit is running under a login
+   shell (such as the original Bourne shell) that does not support job
+   control, the user's session hangs and must be logged out from another
+   terminal, or hung up on. There is no way Kermit can defend itself
+   against this. If you use a non-job control shell on a computer that
+   supports job control, give a command like "stty susp undef" to fix it
+   so the suspend signal is not attached to any particular key, or give
+   the command SET SUSPEND OFF to C-Kermit, or build C-Kermit with
+   -DNOJC.
+
+  4.7. Dates and Times
+
+   Unix time conversion functions typically apply locale rules to return
+   local time in terms of any seasonal time zone change in effect for the
+   given date. The diffdate function assumes that the same timezone rules
+   are in effect for both dates, but a date with timezone information
+   will be converted to the local time zone in effect at the given time,
+   e.g., a GMT specification will produce either a Standard Time or
+   Daylight Savings Time, depending on which applies at the given time.
+   An example using the 2001 seasonal change from EDT (-0400) to EST
+   (-0500):
+
+  C-Kermit> DATE 20011028 05:01:02 GMT  ; EDT
+  20011028 01:01:02
+  C-Kermit> DATE 20011028 06:01:02 GMT  ; EST
+  20011028 01:01:02
+  C-Kermit>
+
+   but the implicit change in timezone offset is not recognized:
+
+  C-Kermit> echo \fdiffdate(20011028 05:01:02 GMT, 20011028 06:01:02 GMT)
+  +0:00
+  C-Kermit>
+
+   Date/time arithmetic, offsets, delta times, and timezone support are
+   new to C-Kermit 8.0, and might be expected to evolve and improve in
+   subsequent releases.
+
+   On some platforms, files downloaded with HTTP receive the current
+   timestamp, rather than the HTTP "Last Modified" time (this can be
+   fixed by including utime.h, e.g. in SunOS and Tru64...).
+
+  4.8. Pseudoterminals
+
+   The SSH and PTY commands work by assigning a pseudoterminal and
+   reading and writing from it. Performance varies according to the
+   specific platform ranging from very fast to very flow.
+
+   SSH and PTY commands can fail if (a) all pseudoterminals are in use;
+   or (b) you do not have read/write access to the pseudoterminal that
+   was assigned. An example of (b) was reported with the Zipslack
+   Slackware Linux distribution, in which the pseudoterminals were
+   created with crw-r--r-- permission, instead of crw-rw-rw-.
+
+  4.9. Miscellaneous
+
+     * Reportedly, the Unix C-Kermit server, under some conditions, on
+       certain particular systems, fails to log out its login session
+       upon receipt of a BYE command. Before relying on the BYE command
+       working, test it a few times to make sure it works on your system:
+       there might be system configuration or security mechanisms to
+       prevent an inferior process (like Kermit) from killing a superior
+       one (like the login shell).
+     * On AT&T 7300 (3B1) machines, you might have to "stty nl1" before
+       starting C-Kermit. Do this if characters are lost during
+       communications operations.
+     * Under the bash shell (versions prior to 1.07 from CWRU), "pushing"
+       to an inferior shell and then exiting back to Kermit leaves Kermit
+       in the background such that it must be explicitly fg'd. This is
+       reportedly fixed in version 1.07 of bash (and definitely in modern
+       bash versions).
+    ________________________________________________________________________
+
+  5. INITIALIZATION AND COMMAND FILES
+
+   [ [539]Top ] [ [540]Contents ] [ [541]Next ] [ [542]Previous ]
+
+   C-Kermit's initialization file for Unix is .kermrc (lowercase, starts
+   with period) in your home directory, unless Kermit was built with the
+   system-wide initialization-file option (see the [543]C-Kermit for Unix
+   Installation Instructions).
+
+   C-Kermit identifies your home directory based on the environment
+   variable, HOME. Most Unix systems set this variable automatically when
+   you log in. If C-Kermit can't find your initialization file, check
+   your HOME variable:
+
+  echo $HOME      (at the Unix prompt)
+
+   or:
+
+  echo \$(HOME)   (at the C-Kermit prompt)
+
+   If HOME is not defined, or is defined incorrectly, add the appropriate
+   definition to your Unix .profile or .login file, depending on your
+   shell:
+
+  setenv HOME full-pathname-of-your-home-directory  (C-Shell, .login file)
+
+   or:
+
+  HOME=full-pathname-of-your-home-directory         (sh, ksh, .profile file)
+  export HOME
+
+   NOTE: Various other operations depend on the correct definition of
+   HOME. These include the "tilde-expansion" feature, which allows you to
+   refer to your home directory as "~" in filenames used in C-Kermit
+   commands, e.g.:
+
+  send ~/.kermrc
+
+   as well as the \v(home) variable.
+
+   Prior to version 5A(190), C-Kermit would look for its initialization
+   file in the current directory if it was not found in the home
+   directory. This feature was removed from 5A(190) because it was a
+   security risk. Some people, however, liked this behavior and had
+   .kermrc files in all their directories that would set up things
+   appropriately for the files therein. If you want this behavior, you
+   can accomplish it in various ways, for example:
+
+     * Create a shell alias, for example:
+  alias kd="kermit -Y ./.kermrc"
+     * Create a .kermrc file in your home directory, whose contents are:
+  take ./.kermrc
+
+   Suppose you need to pass a password from the Unix command line to a
+   C-Kermit script program, in such a way that it does not show up in
+   "ps" or "w" listings. Here is a method (not guaranteed to be 100%
+   secure, but definitely more secure than the more obvious methods):
+
+  echo mypassword | kermit myscript
+
+   The "myscript" file contains all the commands that need to be executed
+   during the Kermit session, up to and including EXIT, and also includes
+   an ASK or ASKQ command to read the password from standard input, which
+   has been piped in from the Unix 'echo' command, but it must not
+   include a CONNECT command. Only "kermit myscript" shows up in the ps
+   listing.
+    ________________________________________________________________________
+
+  6. COMMUNICATION SPEED SELECTION
+
+   [ [544]Top ] [ [545]Contents ] [ [546]Next ] [ [547]Previous ]
+
+   Version-7 based Unix implementations, including 4.3 BSD and earlier
+   and Unix systems based upon BSD, use a 4-bit field to record a serial
+   device's terminal speed. This leaves room for 16 speeds, of which the
+   first 14 are normally:
+
+     0, 50, 75, 110, 134.5, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
+     and 9600
+
+   The remaining two are usually called EXTA and EXTB, and are defined by
+   the particular Unix implementation. C-Kermit determines which speeds
+   are available on your system based on whether symbols for them are
+   defined in your terminal device header files. EXTA is generally
+   assumed to be 19200 and EXTB 38400, but these assumptions might be
+   wrong, or they might not apply to a particular device that does not
+   support these speeds. Presumably, if you try to set a speed that is
+   not legal on a particular device, the driver will return an error, but
+   this can not be guaranteed.
+
+   On these systems, it is usually not possible to select a speed of
+   14400 bps for use with V.32bis modems. In that case, use 19200 or
+   38400 bps, configure your modem to lock its interface speed and to use
+   RTS/CTS flow control, and tell C-Kermit to SET FLOW RTS/CTS and SET
+   DIAL SPEED-MATCHING OFF.
+
+   The situation is similar, but different, in System V. SVID Third
+   Edition lists the same speeds, 0 through 38400.
+
+   Some versions of Unix, and/or terminal device drivers that come with
+   certain third-party add-in high-speed serial communication interfaces,
+   use the low "baud rates" to stand for higher ones. For example, SET
+   SPEED 50 gets you 57600 bps; SET SPEED 75 gets you 76800; SET SPEED
+   110 gets 115200.
+
+   SCO ODT 3.0 is an example where a "baud-rate-table patch" can be
+   applied that can rotate the tty driver baud rate table such that
+   600=57600 and 1800=115k baud. Similarly for Digiboard
+   multiport/portservers, which have a "fastbaud" setting that does this.
+   Linux has a "setserial" command that can do it, etc.
+
+   More modern Unixes support POSIX-based speed setting, in which the
+   selection of speeds is not limited by a 4-bit field. C-Kermit 6.1
+   incorporates a new mechanism for finding out (at compile time) which
+   serial speeds are supported by the operating system that does not
+   involve editing of source code by hand; on systems like Solaris 5.1,
+   IRIX 6.2, and SCO OSR5.0.4, "set speed ?" will list speeds up to
+   460800 or 921600. In C-Kermit 7.0 and later:
+
+    1. If a symbol for a particular speed (say B230400 for 230400 bps)
+       appears in whatever header file defines acceptable serial speeds
+       (e.g. <termbits.h> or <sys/termios.h> or <sys/ttydev.h>, etc), the
+       corresponding speed will appear in C-Kermit's "set speed ?" list.
+    2. The fact that a given speed is listed in the header files and
+       appears in C-Kermit's list does not mean the driver will accept
+       it. For example, a computer might have some standard serial ports
+       plus some add-on ones with different drivers that accept a
+       different repertoire of speeds.
+    3. The fact that a given speed is accepted by the driver does not
+       guarantee the underlying hardware can accept it.
+
+   When Kermit is given a "set speed" command for a particular device,
+   the underlying system service is called to set the speed; its return
+   code is checked and the SET SPEED command fails if the return code
+   indicates failure. Regardless of the system service return status, the
+   device's speed is then read back and if it does not match the speed
+   that was requested, an error message is printed and the command fails.
+
+   Even when the command succeeds, this does not guarantee successful
+   operation at a particular speed, especially a high one. That depends
+   on electricity, information theory, etc. How long is the cable, what
+   is its capacitance, how well is it shielded, etc, not to mention that
+   every connection has two ends and its success depends on both of them.
+   (With the obvious caveats about internal modems, is the cable really
+   connected, interrupt conflicts, etc etc etc).
+
+   Note, in particular, that there is a certain threshold above which
+   modems can not "autobaud" -- i.e. detect the serial interface speed
+   when you type AT (or whatever else the modem's recognition sequence
+   might be). Such modems need to be engaged at a lower speed (say 2400
+   or 9600 or even 115200 -- any speed below their autobaud threshold)
+   and then must be given a modem-specific command (which can be found in
+   the modem manual) to change their interface speed to the desired
+   higher speed, and then the software must also be told to change to the
+   new, higher speed.
+
+   For additional information, read [548]Section 9.5 of the Installation
+   Instructions, plus any platform-specific notes in [549]Section 3
+   above.
+    ________________________________________________________________________
+
+  7. COMMUNICATIONS AND DIALING
+
+   [ [550]Top ] [ [551]Contents ] [ [552]Next ] [ [553]Previous ]
+
+  7.1. Serial Ports and Modems
+
+   If you SET LINE to a serial port modem-control device that has nothing
+   plugged in to it, or has a modem connected that is powered off, and
+   you have not given a prior SET MODEM TYPE or SET CARRIER-WATCH OFF
+   command, the SET LINE command is likely to hang. In most cases, you
+   can Ctrl-C out. If not, you'll have to kill C-Kermit from another
+   terminal.
+
+   Similarly, if you give a SET MODEM TYPE HAYES (or USR, or any other
+   modem type besides DIRECT, NONE, or UNKNOWN) and then SET LINE to an
+   empty port, the subsequent close (implicit or explicit) is liable to
+   hang or even crash (through no fault of Kermit's -- the hanging or
+   crashing is inside a system call such as cfsetospeed() or close()).
+
+   The SET CARRIER-WATCH command works as advertised only if the
+   underlying operating system and device drivers support this feature;
+   in particular only if a read() operation returns immediately with an
+   error code if the carrier signal goes away or, failing that, if
+   C-Kermit can obtain the modem signals from the device driver (you can
+   tell by giving a "set line" command to a serial device, and then a
+   "show communications" command -- if modem signals are not listed,
+   C-Kermit won't be able to detect carrier loss, the WAIT command will
+   not work, etc). Of course, the device itself (e.g. modem) must be
+   configured appropriately and the cables convey the carrier and other
+   needed signals, etc.
+
+   If you dial out from Unix system, but then notice a lot of weird
+   character strings being stuck into your session at random times
+   (especially if they look like +++ATQ0H0 or login banners or prompts),
+   that means that getty is also trying to control the same device.
+   You'll need to dial out on a device that is not waiting for a login,
+   or else disable getty on the device.
+
+   As of version 7.0, C-Kermit makes explicit checks for the Carrier
+   Detect signal, and so catches hung-up connections much better than 6.0
+   and earlier. However, it still can not be guaranteed to catch every
+   ever CD on-to-off transition. For example, when the HP-UX version of
+   C-Kermit is in CONNECT mode on a dialed connection and CARRIER-WATCH
+   ON or AUTO, and you turn off the modem, HP-UX is stuck in a read()
+   that never returns. (C-Kermit does not pop back to its prompt
+   automatically, but you can still escape back.)
+
+   If, on the other hand, you log out from the remote system, and it
+   hangs up, and CD drops on the local modem, C-Kermit detects this and
+   pops back to the prompt as it should. (Evidently there can be a
+   difference between CD and DSR turning off at the same time, versus CD
+   turning off while DSR stays on; experimentation with &S0/&S1/&S2 on
+   your modem might produce the desired results).
+
+   When Unix C-Kermit exits, it closes (and must close) the
+   communications device. If you were dialed out, this will most likely
+   hang up the connection. If you want to get out of Kermit and still use
+   Kermit's communication device, you have several choices:
+
+    1. Shell out from Kermit or suspend Kermit, and refer to the device
+       literally (as in "term -blah -blah < /dev/cua > /dev/cua").
+    2. Shell out from Kermit and use the device's file descriptor which
+       Kermit makes available to you in the \v(ttyfd) variable.
+    3. Use C-Kermit's REDIRECT command.
+    4. Use C-Kermit new EXEC /REDIRECT command.
+
+   If you are having trouble dialing:
+
+    1. Make sure the dialout line is configured correctly. More about
+       this below.
+    2. Make sure all necessary patches are installed for your operating
+       system.
+    3. If you can't dial on a "bidirectional" line, then configure it for
+       outbound-only (remove the getty) and try again. (The mechanisms --
+       if any -- for grabbing bidirectional lines for dialout vary wildly
+       among Unix implementations and releases, and C-Kermit -- which
+       runs on well over 300 different Unix variations -- makes no effort
+       to keep up with them; the recommended method for coping with this
+       situation is to wrap C-Kermit in a shell script that takes the
+       appropriate actions.)
+    4. Make sure C-Kermit's SET DIAL and SET MODEM parameters agree with
+       the modem you are actually using -- pay particular attention to
+       SET DIAL SPEED-MATCHING.
+    5. If MODEM HANGUP-METHOD is set to RS232-SIGNAL, change it to
+       MODEM-COMMAND. Or vice-versa.
+    6. Try SET DIAL HANGUP OFF before the DIAL command. Also, SET DIAL
+       DISPLAY ON to watch what's happening. See [554]Section 8 of the
+       [555]Installation Instructions.
+    7. Read pages 50-67 of [556]Using C-Kermit.
+    8. As a last resort, don't use the DIAL command at all; SET CARRIER
+       OFF and CONNECT to the modem and dial interactively, or write a
+       script program to dial the modem.
+
+   Make sure your dialout line is correctly configured for dialing out
+   (as opposed to login). The method for doing this is different for each
+   kind of Unix system. Consult your system documentation for configuring
+   lines for dialing out (for example, Sun SparcStation IPC users should
+   read the section "Setting up Modem Software" in the Desktop SPARC Sun
+   System & Network Manager's Guide; HP-9000 workstation users should
+   consult the manual Configuring HP-UX for Peripherals, etc).
+
+   Symptom: DIAL works, but a subsequent CONNECT command does not.
+   Diagnosis: the modem is not asserting Carrier Detect (CD) after the
+   connection is made, or the cable does not convey the CD signal. Cure:
+   Reconfigure the modem, replace the cable. Workaround: SET CARRIER OFF
+   (at least in System-V based Unix versions).
+
+   For Berkeley-Unix-based systems (4.3BSD and earlier), Kermit includes
+   code to use LPASS8 mode when parity is none, which is supposed to
+   allow 8-bit data and Xon/Xoff flow control at the same time. However,
+   as of edit 174, this code is entirely disabled because it is
+   unreliable: even though the host operating system might (or might not)
+   support LPASS8 mode correctly, the host access protocols (terminal
+   servers, telnet, rlogin, etc) generally have no way of finding out
+   about it and therefore render it ineffective, causing file transfer
+   failures. So as of edit 174, Kermit once again uses rawmode for 8-bit
+   data, and so there is no Xon/Xoff flow control during file transfer or
+   terminal emulation in the Berkeley-based versions (4.3 and earlier,
+   not 4.4).
+
+   Also on Berkeley-based systems (4.3 and earlier), there is apparently
+   no way to configure a dialout line for proper carrier handling, i.e.
+   ignore carrier during dialing, require carrier thereafter, get a fatal
+   error on any attempt to read from the device after carrier drops (this
+   is handled nicely in System V by manipulation of the CLOCAL flag). The
+   symptom is that carrier loss does not make C-Kermit pop back to the
+   prompt automatically. This is evident on the NeXT, for example, but
+   not on SunOS, which supports the CLOCAL flag. This is not a Kermit
+   problem, but a limitation of the underlying operating system. For
+   example, the cu program on the NeXT doesn't notice carrier loss
+   either, whereas cu on the Sun does.
+
+   On certain AT&T Unix systems equipped with AT&T modems, DIAL and
+   HANGUP don't work right. Workarounds: (1) SET DIAL HANGUP OFF before
+   attempting to dial; (2) If HANGUP doesn't work, SET LINE, and then SET
+   LINE <device> to totally close and reopen the device. If all else
+   fails, SET CARRIER OFF.
+
+   C-Kermit does not contain any particular support for AT&T DataKit
+   devices. You can use Kermit software to dial in to a DataKit line, but
+   C-Kermit does not contain the specialized code required to dial out
+   from a DataKit line. If the Unix system is connected to DataKit via
+   serial ports, dialout should work normally (e.g. set line /dev/ttym1,
+   set speed 19200, connect, and then see the DESTINATION: prompt, from
+   which you can connect to another computer on the DataKit network or to
+   an outgoing modem pool, etc). But if the Unix system is connected to
+   the DataKit network through the special DataKit interface board, then
+   SET LINE to a DataKit pseudodevice (such as /dev/dk031t) will not work
+   (you must use the DataKit "dk" or "dkcu" program instead). In C-Kermit
+   7.0 and later, you can make Kermit connections "though" dk or dkcu
+   using "set line /pty".
+
+   In some BSD-based Unix C-Kermit versions, SET LINE to a port that has
+   nothing plugged in to it with SET CARRIER ON will hang the program (as
+   it should), but it can't be interrupted with Ctrl-C. The interrupt
+   trap is correctly armed, but apparently the Unix open() call cannot be
+   interrupted in this case. When SET CARRIER is OFF or AUTO, the SET
+   LINE will eventually return, but then the program hangs
+   (uninterruptibly) when the EXIT or QUIT command (or, presumably,
+   another SET LINE command) is given. The latter is probably because of
+   the attempt to hang up the modem. (In edit 169, a timeout alarm was
+   placed around this operation.)
+
+   With SET DIAL HANGUP OFF in effect, the DIAL command might work only
+   once, but not again on the same device. In that case, give a CLOSE
+   command to close the device, and then another SET LINE command to
+   re-open the same device. Or rebuild your version of Kermit with the
+   -DCLSOPN compile-time switch.
+
+   The DIAL command says "To cancel: Type your interrupt character
+   (normally Ctrl-C)." This is just one example of where program messages
+   and documentation assume your interrupt character is Ctrl-C. But it
+   might be something else. In most (but not necessarily all) cases, the
+   character referred to is the one that generates the SIGINT signal. If
+   Ctrl-C doesn't act as an interrupt character for you, type the Unix
+   command "stty -a" or "stty all" or "stty everything" to see what your
+   interrupt character is. (Kermit could be made to find out what the
+   interrupt character is, but this would require a lot of
+   platform-dependent coding and #ifdefs, and a new routine and interface
+   between the platform-dependent and platform-independent parts of the
+   program.)
+
+   In general, the hangup operation on a serial communication device is
+   prone to failure. C-Kermit tries to support many, many different kinds
+   of computers, and there seems to be no portable method for hanging up
+   a modem connection (i.e. turning off the RS-232 DTR signal and then
+   turning it back on again). If HANGUP, DIAL, and/or Ctrl-\H do not work
+   for you, and you are a programmer, look at the tthang() function in
+   ckutio.c and see if you can add code to make it work correctly for
+   your system, and send the code to the address above. (NOTE: This
+   problem has been largely sidestepped as of edit 188, in which Kermit
+   first attempts to hang up the modem by "escaping back" via +++ and
+   then giving the modem's hangup command, e.g. ATH0, when DIAL
+   MODEM-HANGUP is ON, which is the default setting.)
+
+   Even when Kermit's modem-control software is configured correctly for
+   your computer, it can only work right if your modem is also configured
+   to assert the CD signal when it is connected to the remote modem and
+   to hang up the connection when your computer drops the DTR signal. So
+   before deciding Kermit doesn't work with your modem, check your modem
+   configuration AND the cable (if any) connecting your modem to the
+   computer -- it should be a straight-through modem cable conducting the
+   signals FG, SG, TD, RD, RTS, CTS, DSR, DTR, CD, and RI.
+
+   Many Unix systems keep aliases for dialout devices; for example,
+   /dev/acu might be an alias for /dev/tty00. But most of these Unix
+   systems also use UUCP lockfile conventions that do not take this
+   aliasing into account, so if one user assigns (e.g.) /dev/acu, then
+   another user can still assign the same device by referring to its
+   other name. This is not a Kermit problem -- Kermit must follow the
+   lockfile conventions used by the vendor-supplied software (cu, tip,
+   uucp).
+
+   The SET FLOW-CONTROL KEEP option should be given *before* any
+   communication (dialing, terminal emulation, file transfer,
+   INPUT/OUTPUT/TRANSMIT, etc) is attempted, if you want C-Kermit to use
+   all of the device's preexisting flow-control related settings. The
+   default flow-control setting is XON/XOFF, and it will take effect when
+   the first communication-related command is given, and a subsequent SET
+   FLOW KEEP command will not necessarily know how to restore *all* of
+   the device's original flow-control settings.
+
+  7.2. Network Connections
+
+   C-Kermit tries to use the 8th bit for data when parity is NONE, and
+   this generally works on real Unix terminal (tty) devices, but it often
+   does not work when the Unix system is accessed over a network via
+   telnet or rlogin protocols, including (in many cases) through terminal
+   servers. For example, an Encore computer with Annex terminal servers
+   only gives a 7-bit path if the rlogin protocol is selected in the
+   terminal server but it gives the full 8 bits if the proprietary RDP
+   protocol is used.
+
+   If file transfer does not work through a host to which you have
+   rlogin'd, use "rlogin -8" rather than "rlogin". If that doesn't work,
+   tell both Kermit programs to "set parity space".
+
+   The Encore TELNET server does not allow long bursts of input. When you
+   have a TELNET connection to an Encore, tell C-Kermit on the Encore to
+   SET RECEIVE PACKET-LENGTH 200 or thereabouts.
+    ________________________________________________________________________
+
+  8. HARDWARE FLOW CONTROL
+
+   [ [557]Top ] [ [558]Contents ] [ [559]Next ] [ [560]Previous ]
+
+   SET FLOW RTS/CTS is available in Unix C-Kermit only when the
+   underlying operating system provides an Application Program Interface
+   (API) for turning this feature on and off under program control, which
+   turns out to be a rather rare feature among Unix systems. To see if
+   your Unix C-Kermit version supports hardware flow control, type "set
+   flow ?" at the C-Kermit prompt, and look for "rts/cts" among the
+   options. Other common situations include:
+
+    1. The API is available, so "set flow rts/cts" appears as a valid
+       C-Kermit command, but it doesn't do anything because the device
+       driver (part of the operating system) was never coded to do
+       hardware flow control. This is common among System V R4
+       implementations (details below).
+    2. The API is not available, so "set flow rts/cts" does NOT appear as
+       a valid C-Kermit command, but you can still get RTS/CTS flow
+       control by selecting a specially named device in your SET LINE
+       command. Examples:
+          + NeXTSTEP: /dev/cufa instead of /dev/cua, /dev/cufb instead of
+            /dev/cub (68040 only; "man zs" for further info).
+          + IRIX: /dev/ttyf2 instead of /dev/ttyd2 or /dev/ttym2 ("man 7
+            serial").
+    3. The API is available, doesn't work, but a workaround as in (2) can
+       be used.
+    4. The API is available, but Kermit doesn't know about it. In these
+       cases, you can usually use an stty command to enable RTS/CTS on
+       the device, e.g. "stty crtscts" or "stty ctsflow", "stty rtsflow",
+       before starting Kermit, and then tell Kermit to SET FLOW KEEP.
+    5. No API and no special device drivers. Hardware flow control is
+       completely unavailable.
+
+   System V R4 based Unixes are supposed to supply a <termiox.h> file,
+   which gives Kermit the necessary interface to command the terminal
+   driver to enable/disable hardware flow control. Unfortunately, but
+   predictably, many implementations of SVR4 whimsically place this file
+   in /usr/include/sys rather than /usr/include (where SVID clearly
+   specifies it should be; see SVID, Third Edition, V1, termiox(BA_DEV).
+   Thus if you build C-Kermit with any of the makefile entries that
+   contain -DTERMIOX or -DSTERMIOX (the latter to select
+   <sys/termiox.h>), C-Kermit will have "set flow rts/cts" and possibly
+   other hardware flow-control related commands. BUT... That does not
+   necessarily mean that they will work. In some cases, the underlying
+   functions are simply not coded into the operating system.
+
+   WARNING: When hardware flow control is available, and you enable in
+   Kermit on a device that is not receiving the CTS signal, Kermit can
+   hang waiting for CTS to come up. This is most easily seen when the
+   local serial port has nothing plugged in to it, or is connected to an
+   external modem that is powered off.
+    ________________________________________________________________________
+
+  9. TERMINAL CONNECTION AND KEY MAPPING
+
+   [ [561]Top ] [ [562]Contents ] [ [563]Next ] [ [564]Previous ]
+
+   C-Kermit is not a terminal emulator. Refer to page 147 of [565]Using
+   C-Kermit, 2nd Edition: "Most versions of C-Kermit -- Unix, VMS,
+   AOS/VS, VOS, etc -- provide terminal connection without emulation.
+   These versions act as a 'semitransparent pipe' between the remote
+   computer and your terminal, terminal emulator, console driver, or
+   window, which in turn emulates (or is) a specific kind of terminal."
+   The environment in which you run C-Kermit is up to you.
+
+   If you are an X Windows user, you should be aware of an alternative to
+   xterm that supports VT220 emulation, from Thomas E. Dickey:
+
+  [566]http://dickey.his.com/xterm/xterm.html
+
+   Unix C-Kermit's SET KEY command currently can not be used with keys
+   that generate "wide" scan codes or multibyte sequences, such as
+   workstation function or arrow keys, because Unix C-Kermit does not
+   have direct access to the keyboard.
+
+   However, many Unix workstations and/or console drivers provide their
+   own key mapping feature. With xterm, for example, you can use
+   'xmodmap' ("man xmodmap" for details); here is an xterm mapping to map
+   the Sun keyboard to DEC VT200 values for use with VT-terminal oriented
+   applications like VMS EVE:
+
+  keycode 101=KP_0
+  keycode 119=KP_1
+  keycode 120=KP_2
+  keycode 121=KP_3
+  keycode 98=KP_4
+  keycode 99=KP_5
+  keycode 100=KP_6
+  keycode 75=KP_7
+  keycode 76=KP_8
+  keycode 77=KP_9
+  keycode 52=KP_F1
+  keycode 53=KP_F2
+  keycode 54=KP_F3
+  keycode 57=KP_Decimal
+  keycode 28=Left
+  keycode 29=Right
+  keycode 30=KP_Separator
+  keycode 105=KP_F4
+  keycode 78=KP_Subtract
+  keycode 8=Left
+  keycode 10=Right
+  keycode 32=Up
+  keycode 33=Down
+  keycode 97=KP_Enter
+
+   Users of Linux consoles can use loadkeys ("man dumpkeys loadkeys
+   keytables" for details. The format used by loadkeys is compatible with
+   that used by Xmodmap, although it is not definitely certain that the
+   keycodes are compatible for different keyboard types (e.g. Sun vs HP
+   vs PC, etc).
+    ________________________________________________________________________
+
+  10. FILE TRANSFER
+
+   [ [567]Top ] [ [568]Contents ] [ [569]Next ] [ [570]Previous ]
+
+   If uploads (or downloads) fail immediately, give the CAUTIOUS command
+   to Kermit and try again. If they still fail, then try SET PREFIXING
+   ALL. If they still fail, try SET PARITY SPACE. If they still fail, try
+   ROBUST.
+
+   If reception (particularly of large files and/or binary files) begins
+   successfully but then fail constently after a certain amount of bytes
+   have been sent, check:
+
+     * Your ulimit ("ulimit -a")
+     * The amount of available space on the target disk ("df ." or "df -k
+       .")
+     * Your personal disk quota (platform- and site-dependent)
+     * The maximum file size on the receiver's file system (e.g. 2GB in
+       old verions the Linux VFS file system, and/or in applications that
+       have not been recoded to use new "large file" APIs).
+     * If it's an NFS-mounted disk (if so, try uploading to a local disk)
+     * Is there an "idle limit" on the receiving end?
+
+   If none of these seem to explain it, then the problem is not size
+   related, but reflects some clash between the file contents and the
+   characteristics of the connection, in which case follow the
+   instructions in the first paragraph of this section.
+
+   Suppose two copies of Kermit are receiving files into the same
+   directory, and the files have the same name, e.g. "foo.bar". Whichever
+   one starts first opens an output file called "foo.bar". The second one
+   sees there is already a foo.bar file, and so renames the existing
+   foo.bar to foo.bar.~1~ (or whatever). When the first file has been
+   received completely, Kermit goes to change its modification time and
+   permissions to those given by the file sender in the Attribute packet.
+   But in Unix, the APIs for doing this take a filename, not a file
+   descriptor. Since the first Kermit's file has been renamed, and the
+   second Kermit is using the original name, the first Kermit changes the
+   modtime and permissions of the second Kermit's file, not its own.
+   Although there might be a way to work around this in the code, e.g.
+   using inode numbers to keep track of which file is which, this would
+   be tricky and most likely not very portable. It's better to set up
+   your application to prevent such things from happening, which is easy
+   enough using the script language, filename templates, etc.
+
+   Suppose you start C-Kermit with a command-line argument to send or
+   receive a file (e.g. "kermit -r") and then type Ctrl-\c immediately
+   afterwards to escape back and initiate the other end of the transfer,
+   BUT your local Kermit's escape character is not Ctrl-\. In this case,
+   the local Kermit passes the Ctrl-\ to the remote system, and if this
+   is Unix, Ctrl-\ is likely to be its SIGQUIT character, which causes
+   the current program to halt and dump core. Well, just about the first
+   thing C-Kermit does when it starts is to disable the SIGQUIT signal.
+   However, it is still possible for SIGQUIT to cause Kermit to quit and
+   dump core if it is delivered while Kermit is being loaded or started,
+   before the signal can be disabled. There's nothing Kermit itself can
+   do about this, but you can prevent it from happening by disabling
+   SIGQUIT in your Unix session. The command is usually something like:
+
+  stty quit undef
+
+   Unix C-Kermit does not reject incoming files on the basis of size.
+   There appears to be no good (reliable, portable) way to determine in
+   advance how much disk space is available, either on the device, or
+   (when quotas or other limits are involved) to the user.
+
+   Unix C-Kermit discards all carriage returns from incoming files when
+   in text mode.
+
+   If C-Kermit has problems creating files in writable directories when
+   it is installed setuid or setgid on BSD-based versions of Unix such as
+   NeXTSTEP 3.0, it probably needs to be rebuilt with the -DSW_ACC_ID
+   compilation switch.
+
+   If you SET FILE DISPLAY FULLSCREEN, and C-Kermit complains "Sorry,
+   terminal type not supported", it means that the terminal library
+   (termcap or termlib) that C-Kermit was built with does not know about
+   a terminal whose name is the current value of your TERM environment
+   variable. If this happens, but you want to have the fullscreen file
+   transfer display, EXIT from C-Kermit and set a Unix terminal type from
+   among the supported values that is also supported by your terminal
+   emulator, or else have an entry for your terminal type added to the
+   system termcap and/or terminfo database.
+
+   If you attempt to suspend C-Kermit during local-mode file transfer and
+   then continue it in the background (via bg), it will block for "tty
+   output" if you are using the FULLSCREEN file transfer display. This is
+   apparently a problem with curses. Moving a local-mode file transfer
+   back and forth between foreground and background works correctly,
+   however, with the SERIAL, CRT, BRIEF, or NONE file transfer displays.
+
+   If C-Kermit's command parser no longer echoes, or otherwise acts
+   strangely, after returning from a file transfer with the fullscreen
+   (curses) display, and the curses library for your version of Unix
+   includes the newterm() function, then try rebuilding your version of
+   C-Kermit with -DCK_NEWTERM. Similarly if it echoes doubly, which might
+   even happen during a subsequent CONNECT session. If rebuilding with
+   -DCK_NEWTERM doesn't fix it, then there is something very strange
+   about your system's curses library, and you should probably not use
+   it. Tell C-Kermit to SET FILE DISPLAY CRT, BRIEF, or anything else
+   other than FULLSCREEN, and/or rebuild without -DCK_CURSES, and without
+   linking with (termlib and) curses. Note: This problem seemed to have
+   escalated in C-Kermit 7.0, and -DCK_NEWTERM had to be added to many
+   builds that previously worked without it: Linux, AIX 4.1, DG/UX, etc.
+   In the Linux case, it is obviously because of changes in the (n)curses
+   library; the cause in the other cases is not known.
+
+   C-Kermit creates backup-file names (such as "oofa.txt.~1~") based on
+   its knowledge of the maximum filename length on the platform where it
+   is running, which is learned at compile time, based on MAXNAMLEN or
+   equivalent symbols from the system header files. But suppose C-Kermit
+   is receiving files on a Unix platform that supports long filenames,
+   but the incoming files are being stored on an NFS-mounted file system
+   that supports only short names. NFS maps the external system to the
+   local APIs, so C-Kermit has no way of knowing that long names will be
+   truncated. Or that C-Kermit is running on a version of Unix that
+   supports both long-name and short-name file systems simultaneously
+   (such as HP-UX 7.00). This can cause unexpected behavior when creating
+   backup files, or worse. For example, you are sending a group of files
+   whose names are differentiated only by characters past the point at
+   which they would be truncated, each file will overwrite the previous
+   one upon arrival.
+    ________________________________________________________________________
+
+  11. EXTERNAL FILE TRANSFER PROTOCOLS
+
+   [ [571]Top ] [ [572]Contents ] [ [573]Next ] [ [574]Previous ]
+
+   SECTION CONTENTS
+
+  11.1. [575]C-Kermit as an External Protocol
+  11.2. [576]Invoking External Protocols from C-Kermit
+
+   Unix C-Kermit can be used in conjunction with other communications
+   software in various ways. C-Kermit can be invoked from another
+   communications program as an "external protocol", and C-Kermit can
+   also invoke other communication software to perform external
+   protocols.
+
+   This sort of operation makes sense only when you are dialing out from
+   your Unix system (or making a network connection from it). If the Unix
+   system is the one you have dialed in to, you don't need any of these
+   tricks. Just run the desired software on your Unix system instead of
+   Kermit. When dialing out from a Unix system, the difficulty is getting
+   two programs to share the same communication device in spite of the
+   Unix UUCP lockfile mechanism, which would normally prevent any
+   sharing, and preventing the external protocol from closing (and
+   therefore hanging up) the device when it exits back to the program
+   that invoked it.
+
+  11.1. C-KERMIT AS AN EXTERNAL PROTOCOL
+
+   [ [577]Top ] [ [578]Contents ] [ [579]Section Contents ] [ [580]Next ]
+
+   (This section deleted; see [581]Using C-Kermit, 2nd Ed, Chapter 14.)
+
+   "pcomm" is a general-purpose terminal program that provides file
+   transfer capabilities itself (X- and YMODEM variations) and the
+   ability to call on external programs to do file transfers (ZMODEM and
+   Kermit, for example). You can tell pcomm the command to send or
+   receive a file with an external protocol:
+                        Send                            Receive  
+        ZMODEM          sz filename                     rz
+        Kermit          kermit -s filename              kermit -r
+
+   pcomm runs external programs for file transfer by making stdin and
+   stdout point to the modem port, and then exec-ing "/bin/sh -c xxx"
+   (where xxx is the appropriate command). However, C-Kermit does not
+   treat stdin and stdout as the communication device unless you instruct
+   it:
+
+
+                        Send                            Receive  
+        Kermit          kermit -l 0 -s filename         kermit -l 0 -r
+
+   The "-l 0" option means to use file descriptor 0 for the communication
+   device.
+
+   In general, any program can pass any open file descriptor to C-Kermit
+   for the communication device in the "-l" command-line option. When
+   Kermit is given a number as the argument to the "-l" option, it simply
+   uses it as a file descriptor, and it does not attempt to close it upon
+   exit.
+
+   Here's another example, for Seyon (a Linux communication program).
+   First try the technique above. If that works, fine; otherwise... If
+   Seyon does not give you a way to access and pass along the file
+   descriptor, but it starts up the Kermit program with its standard i/o
+   redirected to its (Seyon's) communications file descriptor, you can
+   also experiment with the following method, which worked here in brief
+   tests on SunOS. Instead of having Seyon use "kermit -r" or "kermit -s
+   filename" as its Kermit protocol commands, use something like this
+   (examples assume C-Kermit 6.0):
+
+   For serial connections:
+
+  kermit -YqQl 0 -r                     <-- to receive
+  kermit -YqQl 0 -s filename(s)         <-- to send one or more files
+
+   For Telnet connections:
+
+  kermit -YqQF 0 -r                     <-- to receive
+  kermit -YqQF 0 -s filename(s)         <-- to send one or more files
+
+   Command line options:
+
+  Y    - skip executing the init file
+  Q    - use fast file transfer settings (default in 8.0)
+  l 0  - transfer files using file descriptor 0 for a serial connection
+  F 0  - transfer files using file descriptor 0 for a Telnet connection
+  q    - quiet - no messages
+  r    - receive
+  s    - send
+
+  11.2. INVOKING EXTERNAL PROTOCOLS FROM C-KERMIT
+
+   [ [582]Top ] [ [583]Contents ] [ [584]Section Contents ] [
+   [585]Previous ]
+
+     (This section is obsolete, but not totally useless. See Chapter 14
+     of [586]Using C-Kermit, 2nd Edition). 
+
+   After you have opened a communication link with C-Kermit's SET LINE
+   (SET PORT) or SET HOST (TELNET) command, C-Kermit makes its file
+   descriptor available to you in the \v(ttyfd) variable so you can pass
+   it along to other programs that you RUN from C-Kermit. Here, for
+   example, C-Kermit runs itself as an external protocol:
+
+  C-Kermit>set modem type hayes
+  C-Kermit>set line /dev/acu
+  C-Kermit>set speed 2400
+  C-Kermit>dial 7654321
+   Call complete.
+  C-Kermit>echo \v(ttyfd)
+   3
+  C-Kermit>run kermit -l \v(ttyfd)
+
+   Other programs that accept open file descriptors on the command line
+   can be started in the same way.
+
+   You can also use your shell's i/o redirection facilities to assign
+   C-Kermit's open file descriptor (ttyfd) to stdin or stdout. For
+   example, old versions of the Unix ZMODEM programs, sz and rz, when
+   invoked as external protocols, expect to find the communication device
+   assigned to stdin and stdout with no option for specifying any other
+   file descriptor on the sz or rz command line. However, you can still
+   invoke sz and rz as exterior protocols from C-Kermit if your current
+   shell ($SHELL variable) is ksh (the Korn shell) or bash (the
+   Bourne-Again shell), which allows assignment of arbitrary file
+   descriptors to stdin and stdout:
+
+  C-Kermit> run rz <&\v(ttyfd) >&\v(ttyfd)
+
+   or:
+
+  C-Kermit> run sz oofa.zip <&\v(ttyfd) >&\v(ttyfd)
+
+   In version 5A(190) and later, you can use C-Kermit's REDIRECT command,
+   if it is available in your version of C-Kermit, to accomplish the same
+   thing without going through the shell:
+
+  C-Kermit> redirect rz
+
+   or:
+
+  C-Kermit> redirect sz oofa.zip
+
+   A complete set of rz,sz,rb,sb,rx,sx macros for Unix C-Kermit is
+   defined in the file ckurzsz.ini. It automatically chooses the best
+   redirection method (but is redundant since C-Kermit 6.0, which now has
+   built-in support for external protocols via its SET PROTOCOL command).
+
+   Note that external protocols can be used on C-Kermit SET LINE or SET
+   HOST connections only if they operate through standard input and
+   standard output. If they open their own connections, Kermit can't
+   redirect them over its own connection.
+    ________________________________________________________________________
+
+  12. SECURITY
+
+   [ [587]Top ] [ [588]Contents ] [ [589]Next ] [ [590]Previous ]
+
+   As of version 7.0, C-Kermit supports a wide range of security options
+   for authentication and encryption: Kerberos 4, Kerberos 5 / GSSAPI,
+   SSL/TLS, and SRP. See the separate [591]security document for details.
+    ________________________________________________________________________
+
+  13. MISCELLANEOUS USER REPORTS
+
+   [ [592]Top ] [ [593]Contents ] [ [594]Next ] [ [595]Previous ]
+
+Date: Thu, 12 Mar 92 1:59:25 MEZ
+From: Walter Mecky <walter@rent-a-guru.de>
+Subject: Help.Unix.sw
+To: svr4@pcsbst.pcs.com, source@usl.com
+
+PRODUCT:        Unix
+RELEASE:        Dell SVR4 V2.1 (is USL V3.0)
+MACHINE:        AT-386
+PATHNAME:       /usr/lib/libc.so.1
+                /usr/ccs/lib/libc.a
+ABSTRACT:       Function ttyname() does not close its file descriptor
+DESCRIPTION:
+        ttyname(3C) opens /dev but never closes it. So if it is called
+        often enough the open(2) in ttyname() fails. Because the broken
+        ttyname() is in the shared lib too all programs using it can
+        fail if they call it often enough. One important program is
+        uucico which calls ttyname for every file it transfers.
+
+   Here is a little test program if your system has the bug:
+
+#include <stdlib.h>
+#include <stdio.h>
+main() {
+    int i = 0;
+    while (ttyname(0) != NULL)
+      i++;
+    perror("ttyname");
+    printf("i=%d\n", i);
+}
+
+   If this program runs longer than some seconds you don't have the bug.
+
+   WORKAROUND: None FIX: Very easy if you have source code.
+
+   Another user reports some more explicit symptoms and recoveries:
+
+> What happens is when invoking ckermit we get one of the following
+> error messages:
+>   You must set line
+>   Not a tty
+>   No more processes.
+> One of the following three actions clears the peoblem:
+>   shutdown -y -g0 -i6
+>   kill -9 the ttymon with the highest PID
+>   Invoke sysadm and disable then enable the line you want to use.
+> Turning off respawn of sac -t 300 and going to getty's and uugetty's
+> does not help.
+>
+> Also C-Kermit reports "?timed out closing /dev/ttyxx".
+> If this happens all is well.
+
+------------------------------
+
+   (Note: the following problem also occurs on SGI and probably many
+   other Unix systems):
+
+   From: James Spath <spath@jhunix.hcf.jhu.edu>
+   To: Info-Kermit-Request@cunixf.cc.columbia.edu
+   Date: Wed, 9 Sep 1992 20:20:28 -0400
+   Subject: C-Kermit vs uugetty (or init) on Sperry 5000
+
+   We have successfully compiled the above release on a Unisys/Sperry
+   5000/95. We used the sys5r3 option, rather than sys5r2 since we have
+   VR3 running on our system. In order to allow dialout access to
+   non-superusers, we had to do "chmod 666 /dev/tty###, where it had been
+   -rw--w--w- (owned by uucp), and to do "chmod +w /usr/spool/locks". We
+   have done text and binary file transfers through local and remote
+   connections.
+
+   The problem concerning uucp ownership and permissions is worse than I
+   thought at first. Apparently init or uugetty changes the file
+   permissions after each session. So I wrote the following C program to
+   open a set of requested tty lines. I run this for any required
+   outgoing line prior to a Kermit session.
+
+   ------ cut here -------
+/* opentty.c -- force allow read on tty lines for modem i/o */
+/* idea from: restrict.c -- System 5 Admin book Thomas/Farrow p. 605 */
+/* /jes jim spath {spath@jhunix.hcj.jhu.edu } */
+/* 08-Sep-92 NO COPYRIGHT. */
+/* this must be suid to open other tty lines */
+
+/* #define DEBUG */
+#define TTY "/dev/tty"
+#define LOK "/usr/spool/locks/LCK..tty"
+#include <stdio.h>
+
+/* allowable lines: */
+#define TOTAL_LINES 3
+static char allowable[TOTAL_LINES][4] = { "200", "201", "300" };
+static int total=TOTAL_LINES;
+int allow;
+
+/* states: */
+#define TTY_UNDEF 0
+#define TTY_LOCK  1
+#define TTY_OKAY  2
+
+main(argc, argv)
+int argc; char *argv[]; {
+    char device[512];
+    char lockdev[512];
+    int i;
+    if (argc == 1) {
+        fprintf(stderr, "usage: open 200 [...]\n");
+    }
+    while (--argc > 0 && (*++argv) != NULL ) {
+#ifdef DEBUG
+        fprintf(stderr, "TRYING: %s%s\n", TTY, *argv);
+#endif
+        sprintf(device, "%s%s", TTY, *argv);
+        sprintf(lockdev, "%s%s", LOK, *argv);
+        allow = TTY_UNDEF; i = 0;
+        while (i <= total) { /* look at all defined lines */
+#ifdef DEBUG
+            fprintf(stderr, "LOCKFILE? %s?\n", lockdev);
+#endif
+            if (access(lockdev, 00) == 0) {
+                allow=TTY_LOCK;
+                break;
+            }
+#ifdef DEBUG
+            fprintf(stderr, "DOES:%s==%s?\n", allowable[i], *argv);
+#endif
+            if (strcmp(allowable[i], *argv) == 0)
+              allow=TTY_OKAY;
+            i++;
+        }
+#ifdef DEBUG
+        fprintf(stderr, "allow=%d\n", allow);
+#endif
+        switch (allow) {
+          case TTY_UNDEF:
+            fprintf (stderr, "open: not allowed on %s\n", *argv);
+            break;
+          case TTY_LOCK:
+            fprintf (stderr, "open: device locked: %s\n", lockdev);
+            break;
+          case TTY_OKAY:
+            /* attempt to change mode on device */
+            if (chmod (device, 00666) < 0)
+              fprintf (stderr, "open: cannot chmod on %s\n", device);
+            break;
+          default:
+            fprintf (stderr, "open: FAULT\n");
+        }
+    }
+    exit (0);
+}
+    ________________________________________________________________________
+
+  14. THIRD-PARTY DRIVERS
+
+   [ [596]Top ] [ [597]Contents ] [ [598]Next ] [ [599]Previous ]
+
+   Unix versions, especially those for PCs (SCO, Unixware, etc) might be
+   augmented by third-party communication-board drivers from Digiboard,
+   Stallion, etc. These can sometimes complicate matters for Kermit
+   considerably since Kermit has no way of knowing that it is going
+   through a possibly nonstandard driver. Various examples are listed in
+   the earlier sections of this document; search for Stallion, Digiboard,
+   etc. Additionally:
+
+     * The Stallion Technologies EasyConnection serial board driver does
+       not always report the state of DSR as low. From Stallion (October
+       1997): "Unfortunately, this is a bug in our driver. We have
+       implemented all of the other TIOMC functions, eg DTR, DCD, RTS and
+       CTS, but not DSR. Our driver should report the actual state of DSR
+       on those of our cards that have a DSR signal. That the driver
+       always reports DSR as not asserted (0), is a bug in the driver.
+       The driver should be either reporting the state of DSR correctly
+       on those cards that support DSR or as always asserted (1) on those
+       cards that do not have a DSR signal. This will be fixed in a
+       future version of our drivers; at this time I cannot say when this
+       will be." And later, "As far as I can tell, we don't support the
+       termios/termiox ioctls that relate specifically to DSR and RI; all
+       the rest are supported. This will, as I mentioned earlier, be
+       fixed in the next release of our ATA software."
+       - World Wide Escalation Support, Stallion Technologies, Toowong
+       QLD, [600]support@stallion.oz.au.
+
+   Later (December 1997, from the same source):
+
+     * We have now released a new version of the ATA software, version
+       5.4.0. This version fixes the problem with the states of the DSR
+       and RI signals and how they were being reported by the driver.
+       This is the problem that you reported in October. The DSR signal
+       is reported correctly on those cards that support the DSR signal,
+       such as the early revision of the EasyIO card and the
+       EasyConnection 8D4 panel, and as always asserted on those cards
+       that do not support the DSR signal in the hardware. The new driver
+       is available from our Web site, [601]www.stallion.com, in the
+       /drivers/ata5/UnixWare directory.
+
+   [ [602]Top ] [ [603]Contents ] [ [604]C-Kermit Home ] [ [605]C-Kermit
+   8.0 Overview ] [ [606]Kermit Home ]
+     _________________________________________________________________
+
+   C-Kermit 8.0 Unix Hints and Tips / [607]The Kermit Project /
+   [608]Columbia University / [609]kermit@columbia.edu
+
+References
+
+   1. http://www.columbia.edu/kermit/
+   2. http://www.columbia.edu/
+   3. http://www.columbia.edu/kermit/ckubwr.html
+   4. mailto:kermit-support@columbia.edu
+   5. http://www.columbia.edu/kermit/ckermit.html
+   6. http://www.columbia.edu/kermit/ckuins.html
+   7. http://www.columbia.edu/kermit/ckututor.html
+   8. http://www.columbia.edu/kermit/ckubwr.html#x1
+   9. http://www.columbia.edu/kermit/ckubwr.html#x2
+  10. http://www.columbia.edu/kermit/ckubwr.html#x3
+  11. http://www.columbia.edu/kermit/ckubwr.html#x4
+  12. http://www.columbia.edu/kermit/ckubwr.html#x5
+  13. http://www.columbia.edu/kermit/ckubwr.html#x6
+  14. http://www.columbia.edu/kermit/ckubwr.html#x7
+  15. http://www.columbia.edu/kermit/ckubwr.html#x8
+  16. http://www.columbia.edu/kermit/ckubwr.html#x9
+  17. http://www.columbia.edu/kermit/ckubwr.html#x10
+  18. http://www.columbia.edu/kermit/ckubwr.html#x11
+  19. http://www.columbia.edu/kermit/ckubwr.html#x12
+  20. http://www.columbia.edu/kermit/ckubwr.html#x13
+  21. http://www.columbia.edu/kermit/ckubwr.html#x14
+  22. http://www.columbia.edu/kermit/ckubwr.html#x3.3
+  23. http://www.columbia.edu/kermit/ckubwr.html#x3.18
+  24. http://www.columbia.edu/kermit/ckubwr.html#x3.19
+  25. http://www.columbia.edu/kermit/ckubwr.html#x3.1
+  26. http://www.columbia.edu/kermit/ckubwr.html#x3.2
+  27. http://www.columbia.edu/kermit/ckubwr.html#x3.7
+  28. http://www.columbia.edu/kermit/ckubwr.html#x3.6
+  29. http://www.columbia.edu/kermit/ckubwr.html#x3.13
+  30. http://www.columbia.edu/kermit/ckubwr.html#top
+  31. http://www.columbia.edu/kermit/ckubwr.html#contents
+  32. http://www.columbia.edu/kermit/ckubwr.html#x2
+  33. http://www.columbia.edu/kermit/ckubwr.html#x1.1
+  34. http://www.columbia.edu/kermit/ckubwr.html#x1.2
+  35. http://www.columbia.edu/kermit/ckubwr.html#x1.3
+  36. http://www.columbia.edu/kermit/ckubwr.html#x1.4
+  37. http://www.columbia.edu/kermit/ckubwr.html#x3.3
+  38. http://www.columbia.edu/kermit/ckubwr.html#x3.1
+  39. http://www.columbia.edu/kermit/ckubwr.html#x3.2
+  40. http://www.columbia.edu/kermit/ckubwr.html#x3.7
+  41. http://www.columbia.edu/kermit/ckcbwr.html
+  42. mailto:kermit-support@columbia.edu
+  43. http://www.columbia.edu/kermit/ckubwr.html#top
+  44. http://www.columbia.edu/kermit/ckubwr.html#contents
+  45. http://www.columbia.edu/kermit/ckubwr.html#x1.2
+  46. http://www.columbia.edu/kermit/ck60manual.html
+  47. http://www.columbia.edu/kermit/ckermit70.html
+  48. http://www.columbia.edu/kermit/ckermit80.html
+  49. http://www.columbia.edu/kermit/ckubwr.html#top
+  50. http://www.columbia.edu/kermit/ckubwr.html#contents
+  51. http://www.columbia.edu/kermit/ckubwr.html#x1
+  52. http://www.columbia.edu/kermit/ckubwr.html#x1.3
+  53. http://www.columbia.edu/kermit/ckubwr.html#x1.1
+  54. http://www.columbia.edu/kermit/support.html
+  55. http://www.columbia.edu/kermit/ckubwr.html#top
+  56. http://www.columbia.edu/kermit/ckubwr.html#contents
+  57. http://www.columbia.edu/kermit/ckubwr.html#x1
+  58. http://www.columbia.edu/kermit/ckubwr.html#x1.4
+  59. http://www.columbia.edu/kermit/ckubwr.html#x1.2
+  60. http://www.columbia.edu/kermit/ckubwr.html#top
+  61. http://www.columbia.edu/kermit/ckubwr.html#contents
+  62. http://www.columbia.edu/kermit/ckubwr.html#x1
+  63. http://www.columbia.edu/kermit/ckubwr.html#x1.3
+  64. http://www.columbia.edu/kermit/ckubwr.html#top
+  65. http://www.columbia.edu/kermit/ckubwr.html#contents
+  66. http://www.columbia.edu/kermit/ckubwr.html#x3
+  67. http://www.columbia.edu/kermit/ckubwr.html#x1
+  68. http://www.columbia.edu/kermit/ckubwr.html#top
+  69. http://www.columbia.edu/kermit/ckubwr.html#contents
+  70. http://www.columbia.edu/kermit/ckubwr.html#x4
+  71. http://www.columbia.edu/kermit/ckubwr.html#x2
+  72. http://www.columbia.edu/kermit/ckubwr.html#x3.0
+  73. http://www.columbia.edu/kermit/ckubwr.html#x3.1
+  74. http://www.columbia.edu/kermit/ckubwr.html#x3.2
+  75. http://www.columbia.edu/kermit/ckubwr.html#x3.3
+  76. http://www.columbia.edu/kermit/ckubwr.html#x3.4
+  77. http://www.columbia.edu/kermit/ckubwr.html#x3.5
+  78. http://www.columbia.edu/kermit/ckubwr.html#x3.6
+  79. http://www.columbia.edu/kermit/ckubwr.html#x3.7
+  80. http://www.columbia.edu/kermit/ckubwr.html#x3.8
+  81. http://www.columbia.edu/kermit/ckubwr.html#x3.9
+  82. http://www.columbia.edu/kermit/ckubwr.html#x3.10
+  83. http://www.columbia.edu/kermit/ckubwr.html#x3.11
+  84. http://www.columbia.edu/kermit/ckubwr.html#x3.12
+  85. http://www.columbia.edu/kermit/ckubwr.html#x3.13
+  86. http://www.columbia.edu/kermit/ckubwr.html#x3.14
+  87. http://www.columbia.edu/kermit/ckubwr.html#x3.15
+  88. http://www.columbia.edu/kermit/ckubwr.html#x3.16
+  89. http://www.columbia.edu/kermit/ckubwr.html#x3.17
+  90. http://www.columbia.edu/kermit/ckubwr.html#x3.18
+  91. http://www.columbia.edu/kermit/ckubwr.html#x3.19
+  92. http://www.columbia.edu/kermit/ckubwr.html#x3.20
+  93. http://www.faqs.org/
+  94. http://aplawrence.com/Unixart/newtounix.html
+  95. http://www.columbia.edu/kermit/x3
+  96. mailto:kermit-support@columbia.edu
+  97. http://www.columbia.edu/kermit/support.html
+  98. http://www.columbia.edu/kermit/ckubwr.html#top
+  99. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 100. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 101. http://www.columbia.edu/kermit/ckubwr.html#x3.1
+ 102. http://www.pcunix.com/
+ 103. http://www.columbia.edu/kermit/ckubwr.html#x3.0.1
+ 104. http://www.columbia.edu/kermit/ckubwr.html#x3.0.2
+ 105. http://www.columbia.edu/kermit/ckubwr.html#x3.0.3
+ 106. http://www.columbia.edu/kermit/ckubwr.html#x3.0.4
+ 107. http://www.columbia.edu/kermit/ckubwr.html#x3.0.5
+ 108. http://www.columbia.edu/kermit/ckubwr.html#x3.0.6
+ 109. http://www.columbia.edu/kermit/ckubwr.html#top
+ 110. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 111. http://www.columbia.edu/kermit/ckubwr.html#x3.0
+ 112. http://www.columbia.edu/kermit/ckubwr.html#x3.0.2
+ 113. http://www.columbia.edu/kermit/ckubwr.html#top
+ 114. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 115. http://www.columbia.edu/kermit/ckubwr.html#x3.0
+ 116. http://www.columbia.edu/kermit/ckubwr.html#x3.0.3
+ 117. http://www.columbia.edu/kermit/ckubwr.html#x3.0.1
+ 118. http://www.linmodems.org/
+ 119. http://www.microsoft.com/hwdev/platform/PCdesign/LR/default.asp
+ 120. http://www.columbia.edu/kermit/ckubwr.html#top
+ 121. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 122. http://www.columbia.edu/kermit/ckubwr.html#x3.0
+ 123. http://www.columbia.edu/kermit/ckubwr.html#x3.0.4
+ 124. http://www.columbia.edu/kermit/ckubwr.html#x3.0.2
+ 125. http://www.idir.net/~gromitkc/winmodem.html
+ 126. http://www.digi.com/
+ 127. http://www.columbia.edu/kermit/ckubwr.html#top
+ 128. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 129. http://www.columbia.edu/kermit/ckubwr.html#x3.0
+ 130. http://www.columbia.edu/kermit/ckubwr.html#x3.0.5
+ 131. http://www.columbia.edu/kermit/ckubwr.html#x3.0.3
+ 132. http://www.columbia.edu/kermit/ckubwr.html#top
+ 133. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 134. http://www.columbia.edu/kermit/ckubwr.html#x3.0
+ 135. http://www.columbia.edu/kermit/ckubwr.html#x3.0.6
+ 136. http://www.columbia.edu/kermit/ckubwr.html#x3.0.4
+ 137. http://www.columbia.edu/kermit/ckubwr.html#top
+ 138. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 139. http://www.columbia.edu/kermit/ckubwr.html#x3.0
+ 140. http://www.columbia.edu/kermit/ckubwr.html#x3.0.5
+ 141. http://www.columbia.edu/kermit/ckubwr.html#top
+ 142. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 143. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 144. http://www.columbia.edu/kermit/ckubwr.html#x3.2
+ 145. http://www.columbia.edu/kermit/ckubwr.html#x3.0
+ 146. http://www.columbia.edu/kermit/ckubwr.html#x3.1.1
+ 147. http://www.columbia.edu/kermit/ckubwr.html#x3.1.2
+ 148. http://www.columbia.edu/kermit/ckubwr.html#x3.1.3
+ 149. http://www.columbia.edu/kermit/ckubwr.html#x3.1.4
+ 150. http://www.columbia.edu/kermit/ckubwr.html#x3.1.5
+ 151. http://www.emerson.emory.edu/services/aix-faq/
+ 152. http://www.faqs.org/faqs/by-newsgroup/comp/comp.unix.aix.html
+ 153. http://www.cis.ohio-state.edu/hypertext/faq/usenet/aix-faq/top.html
+ 154. http://aixpdslib.seas.ucla.edu/
+ 155. http://www.rootvg.net (AIX history)/
+ 156. ftp://rtfm.mit.edu/pub/usenet/news.answers/aix-faq/part1
+ 157. ftp://mirrors.aol.com/pub/rtfm/usenet-by-hierarchy/comp/unix/aix
+ 158. news:comp.unix.aix
+ 159. http://www.columbia.edu/kermit/ckubwr.html#top
+ 160. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 161. http://www.columbia.edu/kermit/ckubwr.html#x3.1
+ 162. http://www.columbia.edu/kermit/ckubwr.html#x3.1.2
+ 163. http://www.columbia.edu/kermit/ckubwr.html#top
+ 164. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 165. http://www.columbia.edu/kermit/ckubwr.html#x3.1
+ 166. http://www.columbia.edu/kermit/ckubwr.html#x3.1.3
+ 167. http://www.columbia.edu/kermit/ckubwr.html#x3.1.1
+ 168. http://www.columbia.edu/kermit/security.html#servers
+ 169. http://www.columbia.edu/kermit/ckubwr.html#top
+ 170. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 171. http://www.columbia.edu/kermit/ckubwr.html#x3.1
+ 172. http://www.columbia.edu/kermit/ckubwr.html#x3.1.4
+ 173. http://www.columbia.edu/kermit/ckubwr.html#x3.1.2
+ 174. http://service.software.ibm.com/rs6000/
+ 175. http://www.columbia.edu/kermit/ckubwr.html#top
+ 176. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 177. http://www.columbia.edu/kermit/ckubwr.html#x3.1
+ 178. http://www.columbia.edu/kermit/ckubwr.html#x3.1.5
+ 179. http://www.columbia.edu/kermit/ckubwr.html#x3.1.3
+ 180. http://www.columbia.edu/kermit/ckubwr.html#top
+ 181. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 182. http://www.columbia.edu/kermit/ckubwr.html#x3.1
+ 183. http://www.columbia.edu/kermit/ckubwr.html#x3.1.4
+ 184. http://www.columbia.edu/kermit/ckubwr.html#top
+ 185. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 186. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 187. http://www.columbia.edu/kermit/ckubwr.html#x3.3
+ 188. http://www.columbia.edu/kermit/ckubwr.html#x3.1
+ 189. http://www.columbia.edu/kermit/ckubwr.html#x3.2.0
+ 190. http://www.columbia.edu/kermit/ckubwr.html#x3.2.1
+ 191. http://www.columbia.edu/kermit/ckubwr.html#x3.2.2
+ 192. http://www.columbia.edu/kermit/ckubwr.html#x3.2.3
+ 193. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4
+ 194. http://www.columbia.edu/kermit/ckubwr.html#x3.2.5
+ 195. news:comp.sys.hp.hpux
+ 196. http://www.columbia.edu/kermit/ckubwr.html#top
+ 197. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 198. http://www.columbia.edu/kermit/ckubwr.html#x3.2
+ 199. http://www.columbia.edu/kermit/ckubwr.html#x3.2.1
+ 200. http://www.columbia.edu/kermit/ckubwr.html#top
+ 201. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 202. http://www.columbia.edu/kermit/ckubwr.html#x3.2
+ 203. http://www.columbia.edu/kermit/ckubwr.html#x3.2.2
+ 204. http://www.columbia.edu/kermit/ckubwr.html#x3.2.0
+ 205. ftp://kermit.columbia.edu/kermit/f/makefile
+ 206. http://www.columbia.edu/kermit/ckubwr.html#top
+ 207. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 208. http://www.columbia.edu/kermit/ckubwr.html#x3.2
+ 209. http://www.columbia.edu/kermit/ckubwr.html#x3.2.3
+ 210. http://www.columbia.edu/kermit/ckubwr.html#x3.2.1
+ 211. http://www.columbia.edu/kermit/ckubwr.html#top
+ 212. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 213. http://www.columbia.edu/kermit/ckubwr.html#x3.2
+ 214. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4
+ 215. http://www.columbia.edu/kermit/ckubwr.html#x3.2.2
+ 216. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.1
+ 217. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.2
+ 218. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.3
+ 219. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.4
+ 220. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.5
+ 221. http://www.columbia.edu/kermit/ckubwr.html#top
+ 222. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 223. http://www.columbia.edu/kermit/ckubwr.html#x3.2
+ 224. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.2
+ 225. http://www.columbia.edu/kermit/ckubwr.html#x3.2.2
+ 226. http://www.columbia.edu/kermit/ckubwr.html#top
+ 227. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 228. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4
+ 229. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.3
+ 230. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.1
+ 231. http://www.columbia.edu/kermit/ckubwr.html#top
+ 232. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 233. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4
+ 234. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.4
+ 235. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.2
+ 236. http://www.columbia.edu/kermit/ckubwr.html#top
+ 237. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 238. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4
+ 239. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.5
+ 240. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.3
+ 241. http://www.columbia.edu/kermit/ckubwr.html#top
+ 242. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 243. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4
+ 244. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4.4
+ 245. http://www.columbia.edu/kermit/ckubwr.html#top
+ 246. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 247. http://www.columbia.edu/kermit/ckubwr.html#x3.2
+ 248. http://www.columbia.edu/kermit/ckubwr.html#x3.2.4
+ 249. http://www.columbia.edu/kermit/ckubwr.html#top
+ 250. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 251. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 252. http://www.columbia.edu/kermit/ckubwr.html#x3.4
+ 253. http://www.columbia.edu/kermit/ckubwr.html#x3.2
+ 254. http://www.columbia.edu/kermit/ckubwr.html#x3.3.1
+ 255. http://www.columbia.edu/kermit/ckubwr.html#x3.3.2
+ 256. http://www.columbia.edu/kermit/ckubwr.html#x3.3.3
+ 257. http://www.columbia.edu/kermit/ckubwr.html#x3.3.4
+ 258. http://www.columbia.edu/kermit/ckubwr.html#x3.3.5
+ 259. http://www.columbia.edu/kermit/ckubwr.html#x3.3.6
+ 260. news:comp.os.linux.misc
+ 261. news:comp.os.linux.answers
+ 262. http://www.tldp.org/
+ 263. http://www.tldp.org/FAQ/Linux-FAQ.html
+ 264. http://www.tldp.org/HOWTO/Serial-HOWTO.html
+ 265. http://tldp.org/HOWTO/Modem-HOWTO.html
+ 266. ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO
+ 267. ftp://tsx-11.mit.edu/pub/linux/docs/HOWTO
+ 268. http://www.tldp.org/HOWTO/
+ 269. http://www.tldp.org/hmirrors.html
+ 270. http://www.redhat.com/apps/support/
+ 271. http://www.debian.org/support
+ 272. http://www.slackware.com/support/
+ 273. http://www.caldera.com/support/
+ 274. http://www.suse.com/support/
+ 275. http://www.mandrake.com/support/
+ 276. http://www.turbolinux.com/support/
+ 277. http://www.linmodems.org/
+ 278. http://www.columbia.edu/kermit/ckubwr.html#x3.0
+ 279. http://linux.dreamtime.org/decnet/
+ 280. mailto:kermit-support@columbia.edu
+ 281. http://www.linmodems.org/
+ 282. http://www.columbia.edu/kermit/ckubwr.html#x3.0.2
+ 283. http://www.columbia.edu/kermit/security.html#servers
+ 284. http://www.columbia.edu/kermit/sshclient.html
+ 285. http://www.columbia.edu/kermit/ckubwr.html#top
+ 286. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 287. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 288. http://www.columbia.edu/kermit/ckubwr.html#x3.3.2
+ 289. http://www.columbia.edu/kermit/ckubwr.html#top
+ 290. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 291. http://www.columbia.edu/kermit/ckubwr.html#x3.3
+ 292. http://www.columbia.edu/kermit/ckubwr.html#x3.3.3
+ 293. http://www.columbia.edu/kermit/ckubwr.html#x3.3.1
+ 294. http://www.columbia.edu/kermit/ckubwr.html#x3.0
+ 295. http://www.columbia.edu/kermit/ckubwr.html#x6
+ 296. http://www.columbia.edu/kermit/ckubwr.html#x7
+ 297. http://www.columbia.edu/kermit/ckubwr.html#x8
+ 298. http://www.columbia.edu/kermit/ckuins.html#x10
+ 299. http://www.columbia.edu/kermit/ckuins.html#x11
+ 300. http://www.columbia.edu/kermit/ckuins.html
+ 301. http://www.columbia.edu/kermit/ckubwr.html#x3.0
+ 302. http://linuxwww.db.erau.edu/mail_archives/linux-kernel/Mar_98/1441.html
+ 303. http://www.columbia.edu/kermit/ckubwr.html#top
+ 304. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 305. http://www.columbia.edu/kermit/ckubwr.html#x3.3
+ 306. http://www.columbia.edu/kermit/ckubwr.html#x3.3.4
+ 307. http://www.columbia.edu/kermit/ckubwr.html#x3.3.2
+ 308. http://www.columbia.edu/kermit/ckubwr.html#x3.0.5
+ 309. http://www.columbia.edu/kermit/ckfaq.html#term
+ 310. http://dickey.his.com/xterm/xterm.html
+ 311. http://dickey.his.com/xterm/xterm.html
+ 312. ftp://kermit.columbia.edu/kermit/f/xmodmap.txt
+ 313. http://www.columbia.edu/kermit/ckubwr.html#top
+ 314. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 315. http://www.columbia.edu/kermit/ckubwr.html#x3.3
+ 316. http://www.columbia.edu/kermit/ckubwr.html#x3.3.5
+ 317. http://www.columbia.edu/kermit/ckubwr.html#x3.3.3
+ 318. http://www.columbia.edu/kermit/ckubwr.html#top
+ 319. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 320. http://www.columbia.edu/kermit/ckubwr.html#x3.3
+ 321. http://www.columbia.edu/kermit/ckubwr.html#x3.3.6
+ 322. http://www.columbia.edu/kermit/ckubwr.html#x3.3.4
+ 323. http://www.columbia.edu/kermit/ckermit.html
+ 324. mailto:kermit-support@columbia.edu
+ 325. http://www.redhat.com/support/errata/RHBA-2001-153.html
+ 326. news:comp.protocols.kermit.misc
+ 327. http://www.columbia.edu/kermit/ckubwr.html#top
+ 328. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 329. http://www.columbia.edu/kermit/ckubwr.html#x3.3
+ 330. http://www.columbia.edu/kermit/ckubwr.html#x3.3.5
+ 331. http://www.columbia.edu/kermit/ckubwr.html#top
+ 332. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 333. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 334. http://www.columbia.edu/kermit/ckubwr.html#x3.5
+ 335. http://www.columbia.edu/kermit/ckubwr.html#x3.3
+ 336. http://www.columbia.edu/kermit/ckubwr.html#top
+ 337. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 338. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 339. http://www.columbia.edu/kermit/ckubwr.html#x3.6
+ 340. http://www.columbia.edu/kermit/ckubwr.html#x3.4
+ 341. news:comp.os.qnx
+ 342. http://www.columbia.edu/kermit/gkermit.html
+ 343. http://www.columbia.edu/kermit/ckuins.html#x10
+ 344. http://www.columbia.edu/kermit/ckuins.html
+ 345. http://www.columbia.edu/kermit/ckubwr.html#top
+ 346. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 347. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 348. http://www.columbia.edu/kermit/ckubwr.html#x3.7
+ 349. http://www.columbia.edu/kermit/ckubwr.html#x3.5
+ 350. http://www.columbia.edu/kermit/ckubwr.html#x3.6.1
+ 351. http://www.columbia.edu/kermit/ckubwr.html#x3.6.2
+ 352. http://www.columbia.edu/kermit/ckubwr.html#x3.6.3
+ 353. http://www.columbia.edu/kermit/ckubwr.html#x3.6.4
+ 354. http://www.columbia.edu/kermit/ckubwr.html#x3.10
+ 355. http://aplawrence.com/SCOFAQ/
+ 356. http://www.zenez.com/cgi-bin/scoprogfaq/faq.pl
+ 357. http://www.zenez.com/cgi-bin/scouw7faq/faq.pl
+ 358. http://zenez.pcunix.com/cgi-bin/scouw7faq/faq.pl
+ 359. http://pcunix.com/Unixart/modems.html
+ 360. http://www.freebird.org/faq/
+ 361. http://www.freebird.org/faq/developer.html
+ 362. http://support.caldera.com/caldera
+ 363. http://stage.caldera.com/ta/
+ 364. http://aplawrence.com/newtosco.html
+ 365. http://www.columbia.edu/kermit/ckubwr.html#x3.0.5
+ 366. http://www.columbia.edu/kermit/ckfaq.html#term
+ 367. http://www.columbia.edu/kermit/ckubwr.html#x3.0
+ 368. http://www.columbia.edu/kermit/ckubwr.html#top
+ 369. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 370. http://www.columbia.edu/kermit/ckubwr.html#x3.6
+ 371. http://www.columbia.edu/kermit/ckubwr.html#x3.6.1
+ 372. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 373. http://www.columbia.edu/kermit/ckubwr.html#top
+ 374. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 375. http://www.columbia.edu/kermit/ckubwr.html#x3.6
+ 376. http://www.columbia.edu/kermit/ckubwr.html#x3.6.3
+ 377. http://www.columbia.edu/kermit/ckubwr.html#x3.6.1
+ 378. http://www.digi.com/
+ 379. ftp://ftp.fu-berlin.de/pub/unix/driver/fas
+ 380. http://www.columbia.edu/kermit/ckubwr.html#x14
+ 381. http://www.sco.com/
+ 382. ftp://ftp.sco.com/
+ 383. http://www.columbia.edu/kermit/ckubwr.html#top
+ 384. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 385. http://www.columbia.edu/kermit/ckubwr.html#x3.6
+ 386. http://www.columbia.edu/kermit/ckubwr.html#x3.6.4
+ 387. http://www.columbia.edu/kermit/ckubwr.html#x3.6.2
+ 388. http://www.columbia.edu/kermit/ckubwr.html#x3.10
+ 389. http://www.columbia.edu/kermit/ckubwr.html#top
+ 390. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 391. http://www.columbia.edu/kermit/ckubwr.html#x3.6
+ 392. http://www.columbia.edu/kermit/ckubwr.html#x3.6.3
+ 393. http://www.columbia.edu/kermit/ckubwr.html#top
+ 394. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 395. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 396. http://www.columbia.edu/kermit/ckubwr.html#x3.8
+ 397. http://www.columbia.edu/kermit/ckubwr.html#x3.6
+ 398. http://www.columbia.edu/kermit/ckubwr.html#x3.7.1
+ 399. http://www.columbia.edu/kermit/ckubwr.html#x3.7.2
+ 400. http://www.columbia.edu/kermit/ckubwr.html#x3.7.3
+ 401. http://www.columbia.edu/kermit/ckubwr.html#x3.7.4
+ 402. http://www.columbia.edu/kermit/ckubwr.html#x3.7.5
+ 403. news:comp.unix.solaris
+ 404. http://access1.sun.com/
+ 405. http://docs.sun.com/
+ 406. http://www.sunhelp.com/
+ 407. http://www.wins.uva.nl/pub/solaris/solaris2/
+ 408. http://www.wins.uva.nl/cgi-bin/sfaq.cgi
+ 409. ftp://ftp.wins.uva.nl/pub/solaris
+ 410. http://www.science.uva.nl/pub/solaris/solaris2.html
+ 411. http://www.stokely.com/
+ 412. http://www.stokely.com/unix.sysadm.resources/faqs.sun.html
+ 413. http://www.columbia.edu/kermit/ckubwr.html#x3.0
+ 414. http://www.columbia.edu/kermit/ckubwr.html#top
+ 415. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 416. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 417. http://www.columbia.edu/kermit/ckubwr.html#x3.7
+ 418. http://www.columbia.edu/kermit/ckubwr.html#x3.7.2
+ 419. http://www.columbia.edu/kermit/ckubwr.html#top
+ 420. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 421. http://www.columbia.edu/kermit/ckubwr.html#x3.7
+ 422. http://www.columbia.edu/kermit/ckubwr.html#x3.7.3
+ 423. http://www.columbia.edu/kermit/ckubwr.html#x3.7.1
+ 424. http://www.columbia.edu/kermit/ckubwr.html#top
+ 425. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 426. http://www.columbia.edu/kermit/ckubwr.html#x3.7
+ 427. http://www.columbia.edu/kermit/ckubwr.html#x3.7.4
+ 428. http://www.columbia.edu/kermit/ckubwr.html#x3.7.2
+ 429. http://www.columbia.edu/kermit/ckubwr.html#top
+ 430. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 431. http://www.columbia.edu/kermit/ckubwr.html#x3.7
+ 432. http://www.columbia.edu/kermit/ckubwr.html#x3.7.5
+ 433. http://www.columbia.edu/kermit/ckubwr.html#x3.7.3
+ 434. news:comp.os.vms
+ 435. http://www.columbia.edu/kermit/ckubwr.html#top
+ 436. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 437. http://www.columbia.edu/kermit/ckubwr.html#x3.7
+ 438. http://www.columbia.edu/kermit/ckubwr.html#x3.7.6
+ 439. http://www.columbia.edu/kermit/ckubwr.html#x3.7.4
+ 440. http://www.columbia.edu/kermit/ckubwr.html#top
+ 441. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 442. http://www.columbia.edu/kermit/ckubwr.html#x3.7
+ 443. http://www.columbia.edu/kermit/ckubwr.html#x3.7.5
+ 444. http://www.columbia.edu/kermit/ckubwr.html#top
+ 445. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 446. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 447. http://www.columbia.edu/kermit/ckubwr.html#x3.9
+ 448. http://www.columbia.edu/kermit/ckubwr.html#x3.7
+ 449. http://www.stokely.com/
+ 450. http://access1.sun.com/
+ 451. http://www.ludd.luth.se/~bear/project/sun/sun.hardware.txt
+ 452. ftp://ftp.netcom.com/pub/ru/rubicon/sun.hdwr.ref
+ 453. ftp://ftp.intnet.net/pub/SUN/Sun-Hardware-Ref
+ 454. http://www.columbia.edu/kermit/ckubwr.html#top
+ 455. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 456. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 457. http://www.columbia.edu/kermit/ckubwr.html#x3.10
+ 458. http://www.columbia.edu/kermit/ckubwr.html#x3.8
+ 459. news:comp.unix.ultrix
+ 460. news:comp.sys.dec
+ 461. http://www.columbia.edu/kermit/ckubwr.html#top
+ 462. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 463. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 464. http://www.columbia.edu/kermit/ckubwr.html#x3.11
+ 465. http://www.columbia.edu/kermit/ckubwr.html#x3.9
+ 466. http://www.freebird.org/
+ 467. http://www.freebird.org/faq/
+ 468. news:comp.unix.unixware.misc
+ 469. news:comp.unix.sco.misc
+ 470. http://www.columbia.edu/kermit/ckubwr.html#x3.0
+ 471. ftp://kermit.columbia.edu/kermit/f/ckutio.c
+ 472. http://www.columbia.edu/kermit/ckubwr.html#top
+ 473. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 474. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 475. http://www.columbia.edu/kermit/ckubwr.html#x3.12
+ 476. http://www.columbia.edu/kermit/ckubwr.html#x3.10
+ 477. http://www.columbia.edu/kermit/ckubwr.html#top
+ 478. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 479. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 480. http://www.columbia.edu/kermit/ckubwr.html#x3.13
+ 481. http://www.columbia.edu/kermit/ckubwr.html#x3.11
+ 482. http://www.columbia.edu/kermit/ckubwr.html#top
+ 483. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 484. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 485. http://www.columbia.edu/kermit/ckubwr.html#x3.14
+ 486. http://www.columbia.edu/kermit/ckubwr.html#x3.12
+ 487. http://www.columbia.edu/kermit/ckubwr.html#top
+ 488. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 489. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 490. http://www.columbia.edu/kermit/ckubwr.html#x3.15
+ 491. http://www.columbia.edu/kermit/ckubwr.html#x3.13
+ 492. news:comp.sys.sgi.misc
+ 493. news:comp.sys.sgi.admin
+ 494. http://www.sgi.com/
+ 495. http://www-viz.tamu.edu/~sgi-faq/
+ 496. ftp://viz.tamu.edu/pub/sgi/faq/
+ 497. http://www.columbia.edu/kermit/ckuins.html
+ 498. http://freeware.sgi.com/Installable/gcc-2.95.2.html
+ 499. http://freeware.sgi.com/Installable/gcc-2.95.2.html
+ 500. http://www.columbia.edu/kermit/ckubwr.html#top
+ 501. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 502. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 503. http://www.columbia.edu/kermit/ckubwr.html#x3.16
+ 504. http://www.columbia.edu/kermit/ckubwr.html#x3.14
+ 505. news:comp.sys.be
+ 506. http://www.columbia.edu/kermit/ckubwr.html#top
+ 507. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 508. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 509. http://www.columbia.edu/kermit/ckubwr.html#x3.17
+ 510. http://www.columbia.edu/kermit/ckubwr.html#x3.15
+ 511. http://www.columbia.edu/kermit/ckubwr.html#top
+ 512. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 513. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 514. http://www.columbia.edu/kermit/ckubwr.html#x3.18
+ 515. http://www.columbia.edu/kermit/ckubwr.html#x3.16
+ 516. http://www.columbia.edu/kermit/ckubwr.html#top
+ 517. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 518. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 519. http://www.columbia.edu/kermit/ckubwr.html#x3.19
+ 520. http://www.columbia.edu/kermit/ckubwr.html#x3.17
+ 521. http://www.columbia.edu/kermit/ckubwr.html#top
+ 522. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 523. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 524. http://www.columbia.edu/kermit/ckubwr.html#x3.20
+ 525. http://www.columbia.edu/kermit/ckubwr.html#x3.18
+ 526. http://www.keyspan.com/products/usb/adapter/
+ 527. http://www.columbia.edu/kermit/ckuins.html
+ 528. http://cerebus.sandiego.edu/~jerry/UnixTips/
+ 529. http://www.columbia.edu/kermit/ckubwr.html#top
+ 530. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 531. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 532. http://www.columbia.edu/kermit/ckubwr.html#x3.19
+ 533. http://www.uni-giessen.de/faq/archiv/coherent-faq.general/msg00000.html
+ 534. http://www.columbia.edu/kermit/ckubwr.html#top
+ 535. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 536. http://www.columbia.edu/kermit/ckubwr.html#x5
+ 537. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 538. http://www.columbia.edu/kermit/ckccfg.html
+ 539. http://www.columbia.edu/kermit/ckubwr.html#top
+ 540. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 541. http://www.columbia.edu/kermit/ckubwr.html#x6
+ 542. http://www.columbia.edu/kermit/ckubwr.html#x4
+ 543. http://www.columbia.edu/kermit/ckuins.html
+ 544. http://www.columbia.edu/kermit/ckubwr.html#top
+ 545. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 546. http://www.columbia.edu/kermit/ckubwr.html#x7
+ 547. http://www.columbia.edu/kermit/ckubwr.html#x5
+ 548. http://www.columbia.edu/kermit/ckuins.html#9.5
+ 549. http://www.columbia.edu/kermit/ckubwr.html#x3
+ 550. http://www.columbia.edu/kermit/ckubwr.html#top
+ 551. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 552. http://www.columbia.edu/kermit/ckubwr.html#x8
+ 553. http://www.columbia.edu/kermit/ckubwr.html#x6
+ 554. http://www.columbia.edu/kermit/ckuins.html#x8
+ 555. http://www.columbia.edu/kermit/ckuins.html
+ 556. http://www.columbia.edu/kermit/ck60manual.html
+ 557. http://www.columbia.edu/kermit/ckubwr.html#top
+ 558. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 559. http://www.columbia.edu/kermit/ckubwr.html#x9
+ 560. http://www.columbia.edu/kermit/ckubwr.html#x7
+ 561. http://www.columbia.edu/kermit/ckubwr.html#top
+ 562. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 563. http://www.columbia.edu/kermit/ckubwr.html#x10
+ 564. http://www.columbia.edu/kermit/ckubwr.html#x8
+ 565. http://www.columbia.edu/kermit/ck60manual.html
+ 566. http://dickey.his.com/xterm/xterm.html
+ 567. http://www.columbia.edu/kermit/ckubwr.html#top
+ 568. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 569. http://www.columbia.edu/kermit/ckubwr.html#x11
+ 570. http://www.columbia.edu/kermit/ckubwr.html#x9
+ 571. http://www.columbia.edu/kermit/ckubwr.html#top
+ 572. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 573. http://www.columbia.edu/kermit/ckubwr.html#x12
+ 574. http://www.columbia.edu/kermit/ckubwr.html#x10
+ 575. http://www.columbia.edu/kermit/ckubwr.html#x11.1
+ 576. http://www.columbia.edu/kermit/ckubwr.html#x11.2
+ 577. http://www.columbia.edu/kermit/ckubwr.html#top
+ 578. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 579. http://www.columbia.edu/kermit/ckubwr.html#x11
+ 580. http://www.columbia.edu/kermit/ckubwr.html#x11.2
+ 581. http://www.columbia.edu/kermit/ck60manual.html
+ 582. http://www.columbia.edu/kermit/ckubwr.html#top
+ 583. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 584. http://www.columbia.edu/kermit/ckubwr.html#x11
+ 585. http://www.columbia.edu/kermit/ckubwr.html#x11.1
+ 586. http://www.columbia.edu/kermit/ck60manual.html
+ 587. http://www.columbia.edu/kermit/ckubwr.html#top
+ 588. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 589. http://www.columbia.edu/kermit/ckubwr.html#x13
+ 590. http://www.columbia.edu/kermit/ckubwr.html#x11
+ 591. http://www.columbia.edu/kermit/security.html
+ 592. http://www.columbia.edu/kermit/ckubwr.html#top
+ 593. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 594. http://www.columbia.edu/kermit/ckubwr.html#x14
+ 595. http://www.columbia.edu/kermit/ckubwr.html#x12
+ 596. http://www.columbia.edu/kermit/ckubwr.html#top
+ 597. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 598. http://www.columbia.edu/kermit/ckubwr.html#x15
+ 599. http://www.columbia.edu/kermit/ckubwr.html#x14
+ 600. mailto:support@stallion.oz.au
+ 601. http://www.stallion.com/
+ 602. http://www.columbia.edu/kermit/ckubwr.html#top
+ 603. http://www.columbia.edu/kermit/ckubwr.html#contents
+ 604. http://www.columbia.edu/kermit/ckermit.html
+ 605. http://www.columbia.edu/kermit/ck80.html
+ 606. http://www.columbia.edu/kermit/index.html
+ 607. http://www.columbia.edu/kermit/index.html
+ 608. http://www.columbia.edu/
+ 609. mailto:kermit@columbia.edu
diff --git a/ckuins.txt b/ckuins.txt
new file mode 100644 (file)
index 0000000..86448a3
--- /dev/null
@@ -0,0 +1,3519 @@
+
+C-Kermit 8.0 Unix Installation Instructions
+
+   [ [1]Contents ] [ [2]C-Kermit ] [ [3]Kermit Home ]
+
+   Frank da Cruz
+   The Kermit Project
+   Columbia University
+
+      As of C-Kermit version: 8.0.211, 10 April 2004
+      This file last updated: Tue Apr 13 10:14:33 2004 (New York City
+   time)
+
+   IF YOU ARE READING A PLAIN-TEXT version of this document, note that
+   this file is a plain-text dump of a Web page. You can visit the
+   original (and possibly more up-to-date) Web page here:
+
+[4]http://www.columbia.edu/kermit/ckuins.html
+  __________________________________________________________________________
+
+CONTENTS
+
+     [5]OVERVIEW
+
+    1. [6]INTERNET QUICK START
+    2. [7]INSTALLING FROM PACKAGES
+    3. [8]INSTALLING PREBUILT BINARIES
+    4. [9]BUILDING FROM SOURCE CODE
+    5. [10]INSTALLING THE KERMIT FILES
+    6. [11]INSTALLING UNIX C-KERMIT FROM DOS-FORMAT DISKETTES
+    7. [12]CHECKING THE RESULTS
+    8. [13]REDUCING THE SIZE OF THE EXECUTABLE PROGRAM IMAGE
+    9. [14]UNIX VERSIONS
+   10. [15]DIALING OUT AND COORDINATING WITH UUCP
+   11. [16]RUNNING UNIX C-KERMIT SETUID OR SETGID
+   12. [17]CONFIGURING UNIX WORKSTATIONS
+   13. [18]BIZARRE BEHAVIOR AT RUNTIME
+   14. [19]CRASHES AND CORE DUMPS
+   15. [20]SYSLOGGING
+   16. [21]BUILDING SECURE VERSIONS OF C-KERMIT 8.0
+   17. [22]INSTALLING C-KERMIT AS AN SSH SERVER SUBSYSTEM
+  __________________________________________________________________________
+
+OVERVIEW
+
+   [ [23]Top ] [ [24]Contents ] [ [25]Next ]
+
+     WARNING: This document contains notes that have been accumulating
+     since the early 1980s. Many of the products and Unix versions
+     mentioned here have not been heard of in a long while, but that
+     does not necessarily mean they are not still running in some
+     obscure nook. 
+
+   This file contains Unix-specific information. A lot of it. Unlike most
+   other packages, C-Kermit tries very hard to be portable to every Unix
+   variety (and every release of each one) known to exist, including many
+   that are quite old, as well as to other platforms like VMS, AOS/VS,
+   VOS, OS-9, the BeBox, the Amiga, etc.
+
+   Since C-Kermit gets so deeply into the file system, i/o system, and
+   other areas that differ radically from one Unix platform to the next,
+   this means that a lot can go wrong when you try to install C-Kermit on
+   (for example) a new release of a particular variety of Unix, in which
+   certain things might have changed that C-Kermit depended upon.
+
+   This file concentrates on installation. For a description of general
+   configuration options for C-Kermit, please read the [26]Configurations
+   Options document. For troubleshooting after installation, see the
+   [27]General Hints and Tips and [28]Unix-Specific Hints and Tips
+   documents. The latter, in particular, contains lots of information on
+   lots of specific Unix platforms. If you want to work on the source
+   code, see the [29]C-Kermit Program Logic Manual
+
+   You may install C-Kermit:
+
+     * From an "[30]install package", if one is available.
+     * As a [31]prebuilt binary, if available, plus accompanying text
+       files.
+     * By building from [32]source code.
+  __________________________________________________________________________
+
+1. INTERNET QUICK START
+
+   [ [33]Top ] [ [34]Contents ] [ [35]Next ] [ [36]Previous ]
+
+   If your Unix computer is on the Internet and it has a C compiler,
+   here's how to download, build, and install C-Kermit directly from the
+   "tarballs" or Zip archives:
+
+    1. Make a fresh directory and cd to it.
+    2. Download the C-Kermit source code:
+       [37]ftp://kermit.columbia.edu/kermit/archives/cku211.tar.Z
+       (compress format) or
+       [38]ftp://kermit.columbia.edu/kermit/archives/cku211.tar.gz
+       (gunzip format).
+    3. Uncompress the compressed tar file with "uncompress" or "gunzip",
+       according to which type of compressed file you downloaded. (If you
+       don't understand this, you could download a (much larger)
+       uncompressed tar archive directly:
+       [39]ftp://kermit.columbia.edu/kermit/archives/cku211.tar
+    4. Now type "tar xvf cku211.tar" to unpack the individual files from
+       the tar archive.
+    5. Type "rm cku211.tar" to get rid of the tar archive, which is no
+       longer needed.
+    6. Read the comments at the top of the makefile to find out which
+       target to use and then type the appropriate "make" command, such
+       as "make linux", "make solaris8", etc.
+    7. This produces a binary in your current directory called "wermit".
+       Start it by typing "./wermit" and [40]try it out to make sure it
+       works. Then read [41]Section 5 for how to install it, or simply
+       copy the wermit binary to the desired public directory, rename it
+       to kermit, and give it the needed permissions (and, if it is going
+       to be used to dial out, give it the same group and owner and
+       permissions as the cu, tip, or minicom program).
+
+   For secure installations, see [42]Sections 5 and [43]16.
+  __________________________________________________________________________
+
+2. INSTALLING FROM PACKAGES
+
+   [ [44]Top ] [ [45]Contents ] [ [46]Next ] [ [47]Previous ]
+
+   Various Unix varieties -- Linux, Solaris, AIX, etc -- now incorporate
+   the idea of "install packages", and many users expect to find all new
+   applications in this format. A selection of install packages might be
+   available for any given release of C-Kermit, but there is a tradeoff
+   between convenience and safety. Unix presents several notable problems
+   to the builder of install packages:
+
+    a. Since C-Kermit is portable to many non-Unix platforms (VMS, VOS,
+       AOS/VS, etc), some of the files in the C-Kermit distribution do
+       not fit into the Unix application model. In particular, C-Kermit
+       includes some plain text files (described in [48]Section 5) and
+       Unix has no standard place to put such files. Typical Unix package
+       managers do not allow for them. Where should they go, and how will
+       the user know where to find them?
+    b. Installation of any program that will be used to make modem calls
+       requires some important decisions from the installer regarding
+       security and privilege.
+
+   Item (b) is discussed at length in [49]Sections 10 and [50]11 of this
+   document, but the package-related aspects are also given here. The
+   basic problem is that Unix dialout devices and the UUCP "lock files"
+   that regulate contention for them (described in [51]Section 10) are
+   usually protected against "world". Therefore, the install procedure
+   must either run as root in order to give the Kermit binary the
+   required permissions, group, and/or owner, or else the dialout devices
+   and associated directories must be open for group or world reading and
+   writing. Otherwise, the Kermit program just installed WILL NOT WORK
+   for dialing out.
+
+   Thus, a well-crafted installation procedure should present the options
+   and allow the installer to choose the method, if any, for regulating
+   access to the dialout devices:
+
+    a. Check the permissions of the lockfile directory and the dialout
+       devices. If they do not allow group or world R/W access, then:
+    b. "Your UUCP lockfile directory and/or dialout devices require
+       privilege to access. You must either change their permissions or
+       install Kermit with privileges."
+    c. "If you wish to install Kermit with privileges, it will be given
+       the same owner, group, and permissions as the cu program so it can
+       use the dialout devices."
+    d. If they choose (c) but the user is not root, give a message that
+       the install procedure can be run only by root and then quit.
+
+   It should go without saying, of course, that any binaries that are to
+   be included in an install package should be built fresh on the exact
+   platform (e.g. Red Hat 8.0 on Intel) for which the package is
+   targeted; prebuilt binaries ([52]next section) from other sites are
+   likely to have library mismatches. [53]CLICK HERE for more about
+   building C-Kermit install packages.
+
+   The Kermit Project does not have the resources or the expertise to
+   make install packages for every platform. Most install packages,
+   therefore, are contributed by others, and they do not necessarily
+   follow the guidelines given above. Pay attention to what they do.
+
+   If you are an end user who has obtained a C-Kermit install package for
+   a particular platform, you should be aware that some additional steps
+   might needed if you want to use Kermit to dial out. Read [54]Section
+   10 for details.
+  __________________________________________________________________________
+
+3. INSTALLING PREBUILT BINARIES
+
+   [ [55]Top ] [ [56]Contents ] [ [57]Next ] [ [58]Previous ]
+
+   Hundreds of prebuilt C-Kermit binaries are available on the CDROM in
+   the BINARY tree [NOTE: The C-Kermit CDROM is still for version 7.0],
+   and at our ftp site in the [59]kermit/bin area (with names starting
+   with "ck"), also accessible on the [60]C-Kermit website. To install a
+   prebuilt binary:
+
+    a. Rename the binary to "wermit".
+    b. Make sure it works; some tests are suggested in [61]Section 7.
+    c. Follow steps (b) through (e) in [62]Section 4.
+    d. Install related files as described in [63]Section 5.
+
+   But first... Please heed the following cautions:
+
+    a. If you pick the wrong binary, it won't work (or worse).
+    b. Even when you pick the appropriate binary, it still might not work
+       due to shared-library mismatches, etc. (see [64]Section 4.0).
+    c. Don't expect a binary built on or for version n of your OS to work
+       on version n - x (where x > 0). However, it is usually safe to run
+       a binary built on (or for) an older OS release on a newer one.
+
+   Therefore, it is better to build your own binary from source code
+   ([65]next section) if you can. But since it is increasingly for Unix
+   systems (not to mention VMS and other OS's) to be delivered without C
+   compilers, it is often impractical. In such cases, try the most
+   appropriate prebuilt binary or binaries, and if none of them work,
+   [66]contact us and we'll see what we can do to help.
+  __________________________________________________________________________
+
+4. BUILDING FROM SOURCE CODE
+
+   [ [67]Top ] [ [68]Contents ] [ [69]Next ] [ [70]Previous ]
+
+   Also see: [71]Section 8 and [72]Section 9.
+
+   C-Kermit is designed to be built and used on as many platforms as
+   possible: Unix and non-Unix, old and new (and ancient), ANSI C and
+   K&R. The Unix version does not use or depend on any external tools for
+   building except the "make" utility, the C compiler, and the linker. It
+   does not use any automated configuration tools such as configure,
+   autoconf, automake, libtool, etc. Everything in C-Kermit has been
+   built by hand based on direct experience or reports or contributions
+   from users of each platform.
+
+   The [73]C-Kermit makefile contains the rules for building the program
+   for each of the hundreds of different kinds of Unix systems that
+   C-Kermit attempts to support. It covers all Unix variations since
+   about 1980 -- pretty much everything after Unix V6. Separate makefiles
+   are used for [74]Plan 9 and [75]2.x BSD.
+
+   Prerequisites:
+
+     * The C compiler, linker, and make program must be installed.
+     * The C libraries and header files must be installed (*).
+     * The C-Kermit source code and makefile in your current directory.
+     * The C-Kermit text files ([76]Section 5) in your current directory.
+
+     * This is becoming problematic in this new age of "selective
+       installs" e.g. of Linux packages. C-Kermit builds will often fail
+       because replying "no" to some obscure Linux installation option
+       will result in missing libraries or header files. Ditto on
+       platforms like AIX and Solaris that don't come with C compilers,
+       and then later have gcc installed, but are still missing crucial
+       libraries, like libm (math).
+
+   Plus:
+
+     * For TCP/IP networking support, the sockets library and related
+       header files must be installed.
+     * The math library for floating-point arithmetic support (can be
+       deselected by adding -DNOFLOAT to CFLAGS and removing -lm from
+       LIBS).
+     * Many and varied security libraries for building a secure version
+       (Kerberos, SSL/TLS, SRP, Zlib,...) These are required only if you
+       select a secure target.
+     * For the curses-based fullscreen file-ransfer display, the curses
+       or ncurses header file(s) and library, and probably also the
+       termcap and/or termlib library. Note that the names and locations
+       of these files and libraries are likely to change capriciously
+       with every new release of your Unix product. If you discover that
+       the C-Kermit build procedure fails because your curses and/or
+       termxxx headers or libraries are not named or located as expected,
+       please [77]let us know. In the meantime, work around by installing
+       symlinks.
+     * IMPORTANT: Modern Linux distributions might give you the choice
+       during installation of whether to install the "ncurses development
+       package" (perhaps called "ncurses-devel"). If you did not install
+       it, you won't be able to build C-Kermit with curses support
+       included. In this case, either go back and install ncurses, or
+       else choose (or create) a non-curses makefile target for your
+       platform. To install the ncurses developers tools in Red Hat
+       Linux, do:
+
+mount redhat cdrom
+goto RedHat/RPMS
+rpm -ivh ncurses-devel*.rpm
+or to have the exact name ls ncurse* and load as
+rpm -ivh filename
+then leave the cdrom and unmount it.
+
+     * In AIX you might have to go back and install any or all of:
+
+bos.adt.base
+bos.adt.include
+bos.adt.lib
+bos.adt.libm
+bos.adt.utils
+
+       from the first installation CD.
+
+   The makefile might need to be renamed from ckuker.mak to makefile.
+   Directions:
+
+    a. Type "make xxx" where xxx is the name of the makefile target most
+       appropriate to your platform, e.g. "make linux", "make aix43",
+       etc. Read the [78]comments at the top of the makefile for a
+       complete list of available targets (it's a long list).
+    b. Test the resulting 'wermit' file (see [79]Section 7 for
+       suggestions). If it's OK, proceed; otherwise [80]notify us.
+
+     NOTE: steps (c) through (e) can be accomplished using the
+     [81]makefile 'install' target as described in [82]Section 5.4. 
+    c. Rename the 'wermit' file to 'kermit', copy it to the desired
+       binary directory (such as /usr/local/bin or /opt/something), and
+       if it is to be used for dialing out, give it the same owner,
+       group, and permissions as the 'cu' program (IMPORTANT: read
+       [83]Sections 10 and [84]11 for details).
+    d. Install the man page, ckuker.nr, with your other man pages.
+    e. Install the accompanying text files (see [85]Section 5).
+    f. If you want C-Kermit to also offer a Telnet command-line
+       personality, make a symbolic link as follows:
+
+cd directory-where-kermit-binary-is
+ln -s kermit telnet
+
+       If you want C-Kermit to be the default Telnet client, make sure
+       the directory in which you created the symlink is in the PATH
+       ahead of the where the regular Telnet client is.
+    g. If you want C-Kermit to also offer an FTP command-line
+       personality, make a symlink called "ftp" as in (f).
+    h. If you want C-Kermit to also offer an FTTP command-line
+       personality, make a symlink called "http" as in (f).
+    i. If you want to offer an Internet Kermit Service, follow the
+       directions in the [86]IKSD Administrator's Guide.
+    ________________________________________________________________________
+
+  4.0. Special Considerations for C-Kermit 8.0
+
+   [ [87]Top ] [ [88]Contents ] [ [89]Next ]
+
+   Also see: [90]C-Kermit Configuration Options
+
+   SECTION CONTENTS
+
+4.1. [91]The Unix Makefile
+4.2. [92]The C-Kermit Initialization File
+4.3. [93]The 2.x BSD Makefile
+4.4. [94]The Plan 9 Makefile
+4.5. [95]Makefile Failures
+
+   (Also see the [96]Configurations Options document, [97]Section 8).
+
+   Lots of new features have been added in versions 7.0 and 8.0 that
+   require access to new symbols, APIs, libraries, etc, and this will no
+   doubt cause problems in compiling, linking, or execution on platforms
+   where 6.0 and earlier built without incident. This section contains
+   what we know as of the date of this file.
+
+   The first category concerns the new Kermit Service Daemon (IKSD; see
+   the [98]IKSD Administrator's Guide for details):
+
+   The wtmp File
+          When C-Kermit is started as an IKSD (under inetd), it makes
+          syslog and wtmp entries, and also keeps its own ftpd-like log.
+          The code assumes the wtmp log is /var/log/wtmp on Linux and
+          /usr/adm/wtmp elsewhere. No doubt this assumption will need
+          adjustment. Use -DWTMPFILE=path to override at compile time
+          (there is also a runtime override). See [99]iksd.html for
+          details.
+
+   UTMP, utsname(), etc
+          C-Kermit 7.0 gets as much info as it can about its job --
+          mainly for IKSD logging -- from utmp. But of course utmp
+          formats and fields differ, and for that matter, there can be
+          two different header files, <utmp.h> and <utmpx.h>. Look for
+          HAVEUTMPX and HAVEUTHOST in [100]ckufio.c and let me know of
+          any needed adjustments.
+
+   Password lookup
+          IKSD needs to authenticate incoming users against the password
+          list. In some cases, this requires the addition of -lcrypt
+          (e.g. in Unixware 2.x). In most others, the crypt functions are
+          in the regular C library. If you get "crypt" as an unresolved
+          symbol at link time, add -lcrypt to LIBS. If your site has
+          local replacement libraries for authentication, you might need
+          a special LIBS clause such as "LIBS=-L/usr/local/lib -lpwent".
+
+          These days most Unix systems take advantage of shadow password
+          files or Plugable Authentication Modules (PAM). If your system
+          uses shadow passwords you must add -DCK_SHADOW to the CFLAGS
+          list. If your system requires PAM you must add -DCK_PAM to the
+          CFLAGS and -lpam -ldl to LIBS.
+
+   getusershell()
+          This is called by the IKSD at login time to see if a user has
+          been "turned off". But many Unix platforms lack this function.
+          In that case, you will get unresolved symbol reports at link
+          time for _getusershell, _endusershell; to work around, add
+          -DNOGETUSERSHELL.
+
+   initgroups()
+          This is called by IKSD after successful authentication. But
+          some platforms do not have this function, so obviously it can't
+          be called there, in which case add -DNOINITGROUPS.
+
+   setreuid(), setreuid(), setregid() not found or "deprecated"
+          Find out what your Unix variety wants you to use instead, and
+          make appropriate substitutions in routine zvpass(), module
+          [101]ckufio.c, and [102]let us know.
+
+   printf()
+          IKSD installs a printf() substitute to allow redirection of
+          printf-like output to the connection. However, this can
+          conflict with some curses libraries. In this case, separate
+          binaries must be built for IKSD and non-IKSD use.
+
+   If you encounter difficulties with any of the above, and you are not
+   interested in running C-Kermit as an IKSD, then simply add NOIKSD to
+   CFLAGS and rebuild. Example:
+
+make sco286
+(get lots of errors)
+make clean
+make sco286 "KFLAGS=-DNOIKSD"
+
+   Some non-IKSD things to watch out for:
+
+   Return type of main()
+          The main() routine is in [103]ckcmai.c. If you get complaints
+          about "main: return type is not blah", define MAINTYPE on the
+          CC command line, e.g.:
+
+make xxx "KFLAGS=-DMAINTYPE=blah
+
+          (where blah is int, long, or whatever). If the complaint is
+          "Attempt to return a value from a function of type void" then
+          add -DMAINISVOID:
+
+make xxx "KFLAGS=-DMAINISVOID=blah
+
+   DNS Service Records
+          This feature allows a remote host to redirect C-Kermit to the
+          appropriate socket for the requested service; e.g. if C-Kermit
+          requests service "telnet" and the host offers Telnet service on
+          port 999 rather than the customary port 23. If you get
+          compile-time complaints about not being able to find
+          <resolv.h>, <netdb.h>, or <arpa/nameser.h>, add -DNO_DNS_SRV to
+          CFLAGS. If you get link-time complaints about unresolved
+          symbols res_search or dn_expand, try adding -lresolve to LIBS.
+
+   \v(ipaddress)
+          If "echo \v(ipaddress)" shows an empty string rather than your
+          local IP address, add -DCKGHNLHOST to CFLAGS and rebuild.
+
+   <sys/wait.h>
+          If this file can't be found at compile time, add -DNOREDIRECT
+          to CFLAGS. This disables the REDIRECT and PIPE commands and
+          anything else that needs the wait() system service.
+
+   syslog()
+          C-Kermit can now write syslog records. Some older platforms
+          might not have the syslog facility. In that case, add
+          -DNOSYSLOG. Others might have it, but require addition of
+          -lsocket to LIBS (SCO OSR5 is an example). See [104]Section 15.
+
+   putenv()
+          If "_putenv" comes up as an undefined symbol, add -DNOPUTENV to
+          CFLAGS and rebuild.
+
+   "Passing arg1 of 'time' from incompatible pointer"
+          This is a mess. See the mass of #ifdefs in the appropriate
+          module, [105]ckutio.c or [106]ckufio.c.
+
+   gettimeofday()
+          Wrong number of arguments. On most platforms, gettimeofday()
+          takes two arguments, but on a handful of others (e.g. Motorola
+          System V/88 V4, SNI Reliant UNIX 5.43, etc) it takes one. If
+          your version of gettimeofday() is being called with two args
+          but wants one, add -DGTODONEARG.
+
+   "Assignment makes pointer from integer without a cast"
+          This warning might appear in [107]ckutio.c or [108]ckufio.c.
+          (or elsewhere), and usually can be traced to the use of a
+          system or library function that returns a pointer but that is
+          not declared in the system header files even though it should
+          be. Several functions are commonly associated with this error:
+
+          + getcwd(): Add -DDCLGETCWD to CFLAGS and rebuild.
+          + popen() : Add -DDCLPOPEN to CFLAGS and rebuild.
+          + fdopen(): Add -DDCLFDOPEN to CFLAGS and rebuild.
+
+   "Operands of = have incompatible types"
+   "Incompatible types in assignment"
+          If this comes from [109]ckcnet.c and comes from a statement
+          involving inet_addr(), try adding -DINADDRX to CFLAGS. If that
+          doesn't help, then try adding -DNOMHHOST.
+
+   Complaints about args to get/setsockopt(), getpeername(),
+          getsockname()
+          These are all in [110]ckcnet.c. Different platforms and OS's
+          and versions of the same OS change this all the time: int,
+          size_t, unsigned long, etc. All the affected variables are
+          declared according to #ifdefs within ckcnet.c, so find the
+          declarations and adjust the #ifdefs accordingly.
+
+   size_t
+          In case of complaints about "unknown type size_t", add
+          -DSIZE_T=int (or other appropriate type) to CFLAGS.
+
+   'tz' undefined
+   Use of undefined enum/struct/union 'timezone'
+          Left of 'tv_sec' specifies undefined struct/union 'timeval' And
+          similar complaints in [111]ckutio.c: Add -DNOGFTIMER and/or
+          -DNOTIMEVAL.
+
+   Symlinks
+          The new built-in DIRECTORY command should show symlinks like
+          "ls -l" does. If it does not, check to see if your platform has
+          the lstat() and readlink() functions. If so, add -DUSE_LSTAT
+          and -DCKSYMLINK to CFLAGS and rebuild. On the other hand, if
+          lstat() is unresolved at link time, add -DNOLSTAT to CFLAGS. If
+          readlink() is also unresolved, add -DNOSYMLINK.
+
+   realpath()
+          Link-time complains about realpath() -- find the library in
+          which it resides and add it to LIBS (example for Unixware 7.1:
+          "-lcudk70") or add -DNOREALPATH to CFLAGS and rebuild. If built
+          with realpath() but debug log file is truncated or mangled,
+          ditto (some realpath() implementations behave differently from
+          others). If built with realpath() and seemingly random core
+          dumps occur during file path resolution, ditto.
+
+   Failure to locate header file <term.h>
+          Usually happens on Linux systems that have the C compiler
+          installed, but not the ncurses package (see comments about
+          selective installs above). Go back and install ncurses, or use
+          "make linuxnc" (Linux No Curses).
+
+   "Can't find shared library libc.so.2.1"
+   "Can't find shared library libncurses.so.3.0", etc...
+          You are trying to run a binary that was built on a computer
+          that has different library versions than your computer, and
+          your computer's loader is picky about library version numbers.
+          Rebuild from source on your computer.
+
+   Time (struct tm) related difficulties:
+          Errors like the following:
+
+"ckutio.c", line 11994: incomplete struct/union/enum tm: _tm
+"ckutio.c", line 11995: error: cannot dereference non-pointer type
+"ckutio.c", line 11995: error: assignment type mismatch
+"ckutio.c", line 11997: warning: using out of scope declaration: localtime
+"ckutio.c", line 11997: error: unknown operand size: op "="
+"ckutio.c", line 11997: error: assignment type mismatch
+"ckutio.c", line 11998: error: undefined struct/union member: tm_year
+"ckutio.c", line 12000: error: undefined struct/union member: tm_mon
+"ckutio.c", line 12001: error: undefined struct/union member: tm_mday
+"ckutio.c", line 12002: error: undefined struct/union member: tm_hour
+"ckutio.c", line 12003: error: undefined struct/union member: tm_min
+"ckutio.c", line 12004: error: undefined struct/union member: tm_sec
+
+          are due to failure to include the appropriate time.h header
+          files. Unix platforms generally have one or more of the
+          following: <time.h>, <sys/time.h>, and <sys/timeb.h>. Any
+          combination of these might be required. Defaults are set up for
+          each makefile target. The defaults can be corrected on the CC
+          command line by adding the appropriate definition from the
+          following list to CFLAGS:
+
+-DTIMEH         Include <time.h>
+-DNOTIMEH       Don't include <time.h>
+-DSYSTIMEH      Include <sys/time.h>
+-DNOSYSTIMEH    Don't include <sys/time.h>
+-DSYSTIMEBH     Include <sys/timeb.h>
+-DNOSYSTIMEBH   Don't include <sys/timeb.h>
+
+          Note that <sys/timeb.h> is relatively scarce in the System V
+          and POSIX environments; the only platform of recent vintage
+          where it was/is used is OSF/1 and its derivatives (Digital Unix
+          and Tru64 Unix).
+
+   Struct timeval and/or timezone not declared:
+          In some cases, merely including the appropriate time.h header
+          files is still not enough. POSIX.1 does not define the timeval
+          struct, and so the items we need from the header are protected
+          against us by #ifndef _POSIX_SOURCE or somesuch. In this case,
+          we have to declare the timeval (and timezone) structs
+          ourselves. To force this, include -DDCLTIMEVAL in CFLAGS.
+
+   Warnings about dn_expand() Argument #4
+          WARNING: argument is incompatible with prototyp. It's the old
+          char versus unsigned char stupidity again. Try to find a
+          compiler switch like GCC's "-funsigned-char". Failing that, add
+          -DCKQUERYTYPE=xxx to CFLAGS, where xxx is whatever 'man
+          dn_expand' tells you the type of the 4th argument should be
+          (presumably either char or unsigned char; in the latter case
+          use CHAR to avoid confusion caused by multiple words.
+
+   Switch Table Overflow (in [112]ckcuni.c)
+          Add -DNOUNICODE to CFLAGS.
+
+   Compile-time warnings about ck_out() or tgetstr() or tputs():
+          Easy solution: Add -DNOTERMCAP to CFLAGS. But then you lose the
+          SCREEN function. Real solution: Try all different combinations
+          of the following CFLAGS:
+
+-DTPUTSARGTYPE=char    -DTPUTSFNTYPE=int
+-DTPUTSARGTYPE=int     -DTPUTSFNTYPE=void
+
+          Until the warnings go away, except maybe "ck_outc: return with
+          a value in a function returning void", and in that case also
+          add -DTPUTSISVOID.
+
+   "Passing arg 1 of to tputs() makes pointer from integer without a
+          cast":
+          Add -DTPUTSARG1CONST to CFLAGS.
+
+   "Undefined symbol: dup2"
+          Add -DNOZEXEC to CFLAGS.
+
+   "header file 'termcap.h' not found"
+          Add -DNOHTERMCAP to CFLAGS.
+
+   Other difficulties are generally of the "where is curses.h and what is
+   it called this week?" variety (most easily solved by making symlinks
+   in the include and lib directories), or overzealous complaints
+   regarding type mismatches in function calls because of the totally
+   needless and silly signed versus unsigned char conflict (*), etc. In
+   any case, please send any compilation or linking warnings or errors to
+   the author, preferably along with fixes.
+
+     * C-Kermit does not use the signed property of chars at all
+       anywhere, ever. So if all chars and char *'s can be made unsigned
+       at compile time, as they can in gcc with "-funsigned-char", they
+       should be.
+
+   IMPORTANT: If you find any of these hints necessary for a particular
+   make target (or you hit upon others not listed here), PLEASE SEND A
+   REPORT TO:
+
+[113]kermit-support@columbia.edu
+    ________________________________________________________________________
+
+  4.1. The Unix Makefile
+
+   [ [114]Top ] [ [115]Contents ] [ [116]Section Contents ] [ [117]Next ]
+   [ [118]Previous ]
+
+   If your distribution does not contain a file with the name "makefile"
+   or "Makefile", then rename the file called ckuker.mak to makefile:
+
+mv ckuker.mak makefile
+
+   Then type "make xxx", where xxx is the platform you want to build
+   C-Kermit for. These are listed in the [119]comments at the top of the
+   makefile. For example, to build C-Kermit for Linux, type:
+
+make linux
+
+   Here are some typical examples:
+
+     Target    Description
+     linux     Linux, any version on any hardware platform
+     openbsd   OpenBSD, any version on any hardware platform
+     aix43     AIX 4.3
+     aix43g    AIX 4.3, built with gcc
+     solaris9  Solaris 9
+     solaris9g Solaris 9 built with gcc
+     hpux1100  HP-UX 11-point-anything
+
+   The makefile is quite long, and at least two versions of Unix, SCO
+   Xenix/286 and 2.x BSD, cannot cope with its length. An attempt to
+   "make sco286" gives the message "Make: Cannot alloc mem for env..
+   Stop". Solution: edit away some or all of the nonrelevant material
+   from the makefile. (A separate version of the makefile is provided for
+   BSD 2.x: ckubs2.mak but C-Kermit 8.0 can't be built for BSD 2.x -- it
+   has simply grown too large.)
+
+   Some make programs reportedly cannot handle continued lines (lines
+   ending in backslash (\)). If you have a problem with the makefile, try
+   editing the makefile to join the continued lines (remove the
+   backslashes and the following linefeed).
+
+   Other makefile troubles may occur because tabs in the makefile have
+   somehow been converted to spaces. Spaces and tabs are distinct in Unix
+   makefiles.
+
+   Similarly, carriage returns might have been added to the end of each
+   line, which also proves confusing to most Unix versions of make.
+
+   Check to see if there are comments about your particular version in
+   its makefile target itself. In a text editor such as EMACS or VI,
+   search for the make entry name followed by a colon, e.g. "linux:" (if
+   you really are building C-Kermit for Linux, do this now).
+
+   Check to see if there are comments about your particular version in
+   the [120]ckubwr.txt file ([121]CLICK HERE for the Web version).
+
+   If you have trouble with building [122]ckwart.c, or running the
+   resulting wart preprocessor program on [123]ckcpro.w:
+
+    1. Just "touch" the [124]ckcpro.c file that comes in the distribution
+       and then give the "make" command again, or:
+    2. Compile ckwart.c "by hand": cc -o wart ckwart.c, or:
+    3. Try various other tricks. E.g. one Linux user reported that that
+       adding the "static" switch to the rule for building wart fixed
+       everything:
+
+wart: ckwart.$(EXT)
+        $(CC) -static -o wart ckwart.$(EXT) $(LIBS)
+
+   If your compiler supports a compile-time option to treat ALL chars
+   (and char *'s, etc) as unsigned, by all means use it -- and send me
+   email to let me know what it is (I already know about gcc
+   -funsigned-char).
+
+   To add compilation options (which are explained later in this
+   document) to your makefile target without editing the makefile,
+   include "KFLAGS=..." on the make command line, for example:
+
+make linux KFLAGS=-DNODEBUG
+make bsd "KFLAGS=-DKANJI -DNODEBUG -DNOTLOG -DDYNAMIC -UTCPSOCKET"
+
+   Multiple options must be separated by spaces. Quotes are necessary if
+   the KFLAGS= clause includes spaces. The KFLAGS are added to the end of
+   the CFLAGS that are defined in the selected makefile target. For
+   example, the "bsd" entry includes -DBSD4 -DTCPSOCKET, so the second
+   example above compiles Kermit with the following options:
+
+-DBSD4 -DTCPSOCKET -DKANJI -DNODEBUG -DNOTLOG -DDYNAMIC -UTCPSOCKET
+
+   (Notice how "-UTCPSOCKET" is used to negate the effect of the
+   "-DTCPSOCKET" option that is included in the makefile target.)
+
+   WARNING: Be careful with KFLAGS. If you build C-Kermit, change some
+   files, and then run make again using the same make entry but
+   specifying different KFLAGS than last time, make won't detect it and
+   you could easily wind up with inconsistent object modules, e.g. some
+   of them built with a certain option, others not. When in doubt, "make
+   clean" first to make sure all your object files are consistent.
+   Similarly, if you change CFLAGS, LIBS, or any other items in the
+   makefile, or you rebuild using a different makefile target, "make
+   clean" first.
+
+   If you create a new makefile target, use static linking if possible.
+   Even though this makes your C-Kermit binary bigger, the resulting
+   binary will be more portable. Dynamically linked binaries tend to run
+   only on the exact configuration and version where they were built; on
+   others, invocation tends to fail with a message like:
+
+Can't find shared library "libc.so.2.1"
+    ________________________________________________________________________
+
+  4.2. The C-Kermit Initialization File
+
+   [ [125]Top ] [ [126]Contents ] [ [127]Section Contents ] [ [128]Next ]
+   [ [129]Previous ]
+
+   (This section is obsolete.) Read [130]Section 5 about the
+   initialization file.
+    ________________________________________________________________________
+
+  4.3. The 2.x BSD Makefile
+
+   [ [131]Top ] [ [132]Contents ] [ [133]Section Contents ] [ [134]Next ]
+   [ [135]Previous ]
+
+     This section is obsolete. C-Kermit 6.0 was the last release that
+     could be built on PDP-11 based BSD versions.
+    ________________________________________________________________________
+
+  4.4. The Plan 9 Makefile
+
+   [ [136]Top ] [ [137]Contents ] [ [138]Section Contents ] [ [139]Next ]
+   [ [140]Previous ]
+
+   Use the separate makefile [141]ckpker.mk. NOTE: The Plan 9 version of
+   C-Kermit 8.0 has not yet been built. There should be no impediment to
+   building it. However, even when built successfully, certain key
+   features are missing, notably TCP/IP networking.
+    ________________________________________________________________________
+
+  4.5. Makefile Failures
+
+   [ [142]Top ] [ [143]Contents ] [ [144]Section Contents ] [
+   [145]Previous ]
+
+   First, be sure the source files are stored on your current disk and
+   directory with the right names (in lowercase). Second, make sure that
+   the makefile itself does not contain any lines with leading spaces:
+   indented lines must all start with horizontal TAB, and no spaces.
+
+   Then make sure that your Unix PATH is defined to find the appropriate
+   compiler for your makefile target. For example, on SunOS systems,
+   "make sunos41" builds C-Kermit for the BSD environment, and assumes
+   that /usr/ucb/cc will be used for compilation and linking. If your
+   PATH has /usr/5bin ahead of /usr/ucb, you can have problems at compile
+   or link time (a commonly reported symptom is the inability to find
+   "ftime" during linking). Fix such problems by redefining your Unix
+   PATH, or by specifying the appropriate "cc" in CC= and CC2= statements
+   in your makefile target.
+
+   During edits 166-167, considerable effort went into making C-Kermit
+   compilable by ANSI C compilers. This includes prototyping all of
+   C-Kermit's functions, and including the ANSI-defined system header
+   files for system and library functions, as defined in K&R, second
+   edition: <string.h>, <stdlib.h>, <unistd.h> (except in NeXTSTEP this
+   is <libc.h>), and <sys/stdtypes.h>. If you get warnings about any of
+   these header files not being found, or about argument mismatches
+   involving pid_t, uid_t, or gid_t, look in ckcdeb.h and make
+   amendments. C-Kermit assumes it is being compiled by an ANSI-compliant
+   C compiler if __STDC__ is defined, normally defined by the compiler
+   itself. You can force ANSI compilation without defining __STDC__
+   (which some compilers won't let you define) by including -DCK_ANSIC on
+   the cc command line.
+
+   On the other hand, if your compiler defines __STDC__ but still
+   complains about the syntax of Kermit's function prototypes, you can
+   disable the ANSI-style function prototyping by including -DNOANSI on
+   the command line.
+
+   For SCO OpenServer, UNIX, ODT, and XENIX compilations, be sure to pick
+   the most appropriate [146]makefile target, and be sure you have
+   installed an SCO development system that is keyed to your exact SCO
+   operating system release, down to the minor version (like 2.3.1).
+
+   Also note that SCO distributes some of its libraries in encrypted
+   form, and they must be decrypted before C-Kermit can be linked with
+   them. If not, you might see a message like:
+
+ld: file /usr/lib/libsocket.a is of unknown type: magic number = 6365
+
+   To decrypt, you must supply a key (password) that came with your
+   license. Call SCO for further info.
+
+   If your compiler uses something other than int for the pid (process
+   id) data type, put -DPID_T=pid_t or whatever in your CFLAGS.
+
+   If you get complaints about unknown data types uid_t and gid_t, put
+   -DUID_T=xxx -DGID_T=yyy in your CFLAGS, where xxx and yyy are the
+   appropriate types.
+
+   If your compilation fails because of conflicting or duplicate
+   declarations for sys_errlist, add -DUSE_STRERROR or -DNDSYSERRLIST to
+   CFLAGS.
+
+   If your compilation dies because getpwnam() is being redeclared (or
+   because of "conflicting types for getwpnam"), add -DNDGPWNAM to your
+   CFLAGS. If that doesn't work, then add -DDCGPWNAM to your CFLAGS (see
+   ckufio.c around line 440).
+
+   If the compiler complains about the declaration of getpwnam() during
+   an ANSI C compilation, remove the declaration from ckufio.c or change
+   the argument in the prototype from (char *) to (const char *).
+
+   If you get complaints that getpwuid() is being called with an improper
+   type, put -DPWID_T=xx in your CFLAGS.
+
+   If you get compile-time warnings that t_brkc or t_eofc (tchars
+   structure members, used in BSD-based versions) are undefined, or
+   structure-member- related warnings that might be traced to this fact,
+   add -DNOBRKC to CFLAGS.
+
+   If you get a linker message to the effect that _setreuid or _setregid
+   is not defined, add -DNOSETREU to CFLAGS, or add -DCKTYP_H=blah to
+   CFLAGS to make C-Kermit read the right <types.h>-kind-of-file to pick
+   up these definitions.
+
+   If you get a message that _popen is undefined, add -DNOPOPEN to
+   CFLAGS.
+
+   If you get a complaint at compile time about an illegal
+   pointer-integer combination in ckufio.c involving popen(), or at link
+   time that _popen is an undefined symbol, add the declaration "FILE
+   *popen();" to the function zxcmd() in ckufio.c (this declaration is
+   supposed to be in <stdio.h>). If making this change does not help,
+   then apparently your Unix does not have the popen() function, so you
+   should add -DNOPOPEN to your make entry, in which case certain
+   functions involving "file" i/o to the standard input and output of
+   subprocesses will not be available.
+
+   If your linker complains that _getcwd is undefined, you can add a
+   getcwd() function to ckufio.c, or add it to your libc.a library using
+   ar:
+
+#include <stdio.h>
+
+char *
+getcwd(buf,size) char *buf; int size; {
+#ifndef NOPOPEN
+#ifdef DCLPOPEN
+    FILE *popen();
+#endif
+    FILE *pfp;
+
+    if (!buf) return(NULL);
+    if (!(pfp = popen("pwd","r"))) return(NULL);
+    fgets(buf,size-2,pfp);
+    pclose(pfp);
+    buf[strlen(buf)-1] = '\0';
+    return((char *)buf);
+#else
+    buf[0] = '\0';
+    return(NULL);
+#endif /* NOPOPEN */
+}
+
+#ifdef NOPOPEN
+FILE *popen(s,t) char *s,*t; {
+    return(NULL);
+}
+#endif /* NOPOPEN */
+
+   If you get complaints about NPROC having an invalid value, add a valid
+   definition for it (depends on your system), as in the cray entry.
+
+   If you get some symbol that's multiply defined, it probably means that
+   a variable name used by Kermit is also used in one of your system
+   libraries that Kermit is linked with. For example, under PC/IX some
+   library has a variable or function called "data", and the variable
+   "data" is also used extensively by Kermit. Rather than edit the Kermit
+   source files, just put a -D in the make entry CFLAGS to change the
+   Kermit symbol at compile time. In this example, it might be
+   -Ddata=xdata.
+
+   Some symbol is defined in your system's header files, but it produces
+   conflicts with, or undesired results from, Kermit. Try undefining the
+   symbol in the makefile target's CFLAGS, for example -UFIONREAD.
+
+   Some well-known symbol is missing from your system header files. Try
+   defining in the makefile target's CFLAGS, for example -DFREAD=1.
+
+   You get many warnings about pointer mismatches. This probably means
+   that Kermit is assuming an int type for signal() when it should be
+   void, or vice-versa. Try adding -DSIG_I (for integer signal()) or
+   -DSIG_V (for void) to CFLAGS. Or just include KFLAGS=-DSIG_V (or
+   whatever) in your "make" command, for example:
+
+make bsd KFLAGS=-DSIG_V
+
+   You get many messages about variables that are declared and/or set but
+   never used. It is difficult to avoid these because of all the
+   conditional compilation in the program. Ignore these messages.
+
+   Some of C-Kermit's modules are so large, or contain so many character
+   string constants, or are so offensive in some other way, that some C
+   compilers give up and refuse to compile them. This is usually because
+   the -O (optimize) option is included in the make entry. If this
+   happens to you, you can (a) remove the -O option from the make entry,
+   which will turn off the optimizer for ALL modules; or (b) compile the
+   offending module(s) by hand, including all the switches from make
+   entry except for -O, and then give the appropriate "make" command
+   again; or (c) increase the value of the -Olimit option, if your
+   compiler supports this option; or (d) change the [147]makefile target
+   to first compile each offending module explicitly without
+   optimization, then compile the others normally (with optimization),
+   for example:
+
+#Fortune 32:16, For:Pro 2.1 (mostly like 4.1bsd)
+ft21:
+        @echo 'Making C-Kermit $(CKVER) for Fortune 32:16 For:Pro 2.1...'
+        $(MAKE) ckuusx.$(EXT) "CFLAGS= -DNODEBUG -DBSD4 -DFT21 -DNOFILEH \
+        -SYM 800 \ -DDYNAMIC -DNOSETBUF -DCK_CURSES $(KFLAGS) -DPID_T=short"
+        $(MAKE) ckuxla.$(EXT) "CFLAGS= -DNODEBUG -DBSD4 -DFT21 -DNOFILEH \
+        -SYM 800 \ -DDYNAMIC -DNOSETBUF -DCK_CURSES $(KFLAGS) -DPID_T=short"
+        $(MAKE) ckudia.$(EXT) "CFLAGS= -DNODEBUG -DBSD4 -DFT21 -DNOFILEH \
+        -SYM 800 \ -DDYNAMIC -DNOSETBUF -DCK_CURSES $(KFLAGS) -DPID_T=short"
+        $(MAKE) wermit "CFLAGS= -O -DNODEBUG -DBSD4 -DFT21 -DNOFILEH -SYM 800 \
+        -DDYNAMIC -DNOSETBUF -DCK_CURSES $(KFLAGS) -DPID_T=short" \
+        "LNKFLAGS= -n -s" "LIBS= -lcurses -ltermcap -lv -lnet"
+
+   As an extreme example, some compilers (e.g. gcc on the DG AViiON) have
+   been known to dump core when trying to compile ckwart.c with
+   optimization. So just do this one "by hand":
+
+cc -o wart ckwart.c
+
+   or:
+
+touch ckcpro.c
+
+   and then give the "make" command again.
+
+   Speaking of wart, it is unavoidable that some picky compilers might
+   generate "statement unreachable" messages when compiling ckcpro.c.
+   Unreachable statements can be generated by the wart program, which
+   generates ckcpro.c automatically from [148]ckcpro.w, which translates
+   lex-like state/input constructions into a big switch/case
+   construction.
+
+   Some function in Kermit wreaks havoc when it is called. Change all
+   invocations of the function into a macro that evaluates to the
+   appropriate return code that would have been returned by the function
+   had it been called and failed, for example: -Dzkself()=0. Obviously
+   not a good idea if the function is really needed.
+
+   If you have just installed SunOS 4.1.2 or 4.1.3, you might find that
+   C-Kermit (and any other C program) fails to link because of unresolved
+   references from within libc. This is because of a mistake in Sun's
+   /usr/lib/shlib.etc files for building the new libc. Change the libc
+   Makefile so that the "ld" lines have "-ldl" at the end. Change the
+   README file to say "mv xccs.multibyte. xccs.multibyte.o" and follow
+   that instruction.
+  __________________________________________________________________________
+
+5. INSTALLING THE KERMIT FILES
+
+   [ [149]Top ] [ [150]Contents ] [ [151]Next ] [ [152]Previous ]
+
+   SECTION CONTENTS
+
+5.1. [153]The C-Kermit Initialization File
+5.2. [154]Text Files
+5.3. [155]Installing the Kermit Files
+5.4. [156]The Makefile Install Target
+
+   The C-Kermit executable does not need any external files to run.
+   Unlike, say, the cu program, which on most platforms is useless unless
+   you (as root) edit the /usr/spool/uucp/Systems and
+   /usr/spool/uucp/Devices files to supply whatever obscure and
+   undocumented syntax is required to match some supposedly user-friendly
+   mnemonic to the real pathname of whatever device you want to use,
+   Kermit runs on its own without needing any external configuration
+   files, and lets you refer to device (and network hosts and services)
+   by their own natural undisguised names.
+
+   Nevertheless, a number of external files can be installed along with
+   the C-Kermit executable if you wish. These include configuration and
+   customization files that are read by Kermit as well as documentation
+   files to be read by people. All of this material is (a) optional, and
+   (b) available on the Kermit website:
+
+[157]http://www.columbia.edu/kermit/
+
+   and usually in a more pleasant form, perhaps also with updated
+   content. So if your computer is on the Internet, there is no need to
+   install anything but the Kermit executable if users know how to find
+   the Kermit website (and if they don't, Kermit's "help" command tells
+   them).
+
+  5.1. The C-Kermit Initialization File
+
+   In C-Kermit 7.0 and earlier, the standard initialization file was a
+   key C-Kermit component because:
+
+    a. It "loaded" the dialing and network directories.
+    b. It defined all the macros and variables for the services
+       directory.
+    c. It defined macros for quickly changing Kermit's file-transfer
+       performance tuning.
+
+   The standard initialization file is quite long (more than 600 lines)
+   and requires noticeable processing time (the slower the computer, the
+   more noticeable), yet few people actually use the services directory,
+   whose definition takes up most of its bulk. Meanwhile, in C-Kermit
+   8.0, many of the remaining functions of the standard initialization
+   file are now built in; for example, the FAST, CAUTIOUS, and ROBUST
+   commands.
+
+   More to the point, many of the settings that could be made only in the
+   initialization and customization files can now be picked up from
+   environment variables. The first group identifies initialization and
+   directory files:
+
+   CKERMIT_INI
+          The path of your Kermit initialization file, if any. This
+          overrides the built-in search for $HOME/.kermrc.
+
+   K_CHARSET
+          The character set used for encoding local text files.
+          Equivalent to SET FILE CHARACTER-SET.
+
+   K_DIAL_DIRECTORY
+          The full pathname of one or more Kermit dialing directory
+          files. Equivalent to SET DIAL DIRECTORY.
+
+   K_NET_DIRECTORY
+          The full pathname of one or more Kermit network directory
+          files. Equivalent to SET NETWORK DIRECTORY.
+
+   K_INFO_DIRECTORY
+   K_INFO_DIR
+          The full pathname of a directory containing Kermit (if any)
+          containing ckubwr.txt and other Kermit text files. Overrides
+          Kermit's built-in search for this directory.
+
+   The next group is related to dialing modems:
+
+   K_COUNTRYCODE
+          The telephonic numeric country code for this location, e.g. 1
+          for North America or 39 for Italy. It is recommended that this
+          one be set for all users, system-wide. Not only is it used to
+          process portable-format dialing directory entries, but it is
+          also compared against Kermit's built-in list of "tone
+          countries" to see if tone dialing can be used. Equivalent to
+          Kermit's SET DIAL COUNTRY-CODE command.
+
+   K_AREACODE
+          The telephonic numeric area code for this location, e.g. 212
+          for Manhattan, New York, USA. Recommend this one also be set
+          system-wide, so shared portable-format dialing directories will
+          work automatically for everybody. Equivalent to Kermit's SET
+          DIAL AREA-CODE command.
+
+   K_DIAL_METHOD
+          TONE or PULSE. Equivalent to Kermit's SET DIAL METHOD command.
+          If a dial method is not set explicitly (or implicitly from the
+          country code), Kermit does not specify a dialing method, and
+          uses the modem's default method, which tends to be pulse.
+
+   K_INTL_PREFIX
+          The telephonic numeric international dialing prefix for this
+          location. Equivalent to Kermit's SET DIAL INTL-PREFIX command.
+
+   K_LD_PREFIX
+          The telephonic numeric long-distance dialing prefix for this
+          location. Equivalent to Kermit's SET DIAL LD-PREFIX command.
+
+   K_PBX_ICP
+          The telephonic numeric PBX internal call prefix for this
+          location. Equivalent to Kermit's SET DIAL PBX-INSIDE-PREFIX
+          command.
+
+   K_PBX_OCP
+          The telephonic numeric PBX external call prefix for this
+          location. Equivalent to Kermit's SET DIAL PBX-OUTSIDE-PREFIX
+          command.
+
+   K_PBX_XCH
+          The telephonic numeric PBX exchange (first part of the
+          subscriber number). Equivalent to Kermit's SET DIAL
+          PBX-EXCHANGE command.
+
+   K_TF_AREACODE
+          A list of one or more telephonic numeric toll-free area codes.
+
+   K_TF_PREFIX
+          The telephonic numeric toll-free dialing prefix, in case it is
+          different from the long-distance prefix. Equivalent to Kermit's
+          SET DIAL TF-PREFIX command.
+
+   The final group includes well-known environment variables that are
+   also used by Kermit:
+
+   CDPATH
+          Where the CD command should look for relative directory names.
+
+   SHELL
+          The path of your Unix shell. Used by the RUN (!) command to
+          choose the shell to execute its arguments.
+
+   USER
+          Your Unix username.
+
+   EDITOR
+          The name or path of your preferred editor (used by the EDIT
+          command). Equivalent to SET EDITOR.
+
+   BROWSER
+          The name or path of your preferred web browser (used by the
+          BROWSE command). Equivalent to Kermit's SET BROWSER command.
+
+   Does this mean the initialization file can be abolished? I think so.
+   Here's why:
+
+     * Kermit already does everything most people want it to do without
+       one.
+     * Important site-specific customizations can be done with global
+       environment variables.
+     * There is no longer any need for everybody to have to use the
+       standard initialization file.
+     * This means that your initialization file, if you want one, can
+       contain your own personal settings, definitions, and preferences,
+       rather than 600 lines of "standard" setups.
+     * If you still want the services directory, you can either TAKE the
+       standard initialization file (which must be named anything other
+       than $HOME/.kermrc to avoid being executed automatically every
+       time you start Kermit), or you can make it a kerbang script and
+       execute it "directly" (the [158]makefile install target does this
+       for you by putting ckermit.ini in the same directory as the Kermit
+       binary, adding the appropriate Kerbang line to the top, and giving
+       it execute permission).
+
+   In fact, you can put any number of kerbang scripts in your PATH to
+   start up C-Kermit in different ways, to have it adopt certain
+   settings, make particular connections, execute complicated scripts,
+   whatever you want.
+
+  5.2. Text Files
+
+   These are entirely optional. Many of them are to be found at the
+   Kermit website in HTML form (i.e. as Web pages with clickable links,
+   etc), and very likely also more up to date. Plain-text files that
+   correspond to Web pages were simply "dumped" by Lynx from the website
+   to plain ASCII text. The format is whatever Lynx uses for this
+   purpose. If you wish, you can install them on your computer as
+   described in the [159]next section.
+
+   [160]COPYING.TXT
+          Copyright notice, permissions, and disclaimer.
+
+   [161]ckermit.ini
+          The standard initialization file, intended more for reference
+          (in most cases) than actual use; see [162]Section 5.1.
+
+   [163]ckermod.ini
+          A sample customization file.
+
+   [164]ckermit70.txt
+          Supplement to [165]Using C-Kermit for version 7.0. Available on
+          the Kermit website as:
+          [166]http://www.columbia.edu/kermit/ckermit70.html
+
+   [167]ckermit80.txt
+          Supplement to [168]Using C-Kermit for version 8.0. Available on
+          the Kermit website as:
+          [169]http://www.columbia.edu/kermit/ckermit80.html
+
+   [170]ckcbwr.txt
+          The general C-Kermit hints and tips ("beware") file. Available
+          on the Kermit website as:
+          [171]http://www.columbia.edu/kermit/ckcbwr.html
+
+   [172]ckubwr.txt
+          The Unix-specific C-Kermit hints and tips file. Available on
+          the Kermit website as:
+          [173]http://www.columbia.edu/kermit/ckubwr.html
+
+   [174]ckuins.txt
+          Unix C-Kermit Installation Instructions (this file). Available
+          on the Kermit website as:
+          [175]http://www.columbia.edu/kermit/ckuins.html
+
+   [176]ckccfg.txt
+          C-Kermit compile-time configuration options. Available on the
+          Kermit website as:
+          [177]http://www.columbia.edu/kermit/ckccfg.html
+
+   [178]ckcplm.txt
+          The C-Kermit program logic manual. Available on the Kermit
+          website as:
+          [179]http://www.columbia.edu/kermit/ckcplm.html
+
+   [180]ca_certs.pem
+          Certificate Authority certificates for secure connections (see
+          [181]Section 16).
+
+  5.3. Installing the Kermit Files
+
+   There is an "install" target in the [182]makefile that you can use if
+   you wish. However, since every site has its own layout and
+   requirements, it is often better to install the Kermit files by hand.
+   You don't have to use the makefile install target to install C-Kermit.
+   This is especially true since not all sites build C-Kermit from
+   source, and therefore might not even have the makefile. But you should
+   read this section in any case.
+
+     If your computer already has an older version of C-Kermit
+     installed, you should rename it (e.g. to "kermit6" or "kermit7") so
+     in case you have any trouble with the new version, the old one is
+     still available.
+
+   In most cases, you need to be root to install C-Kermit, if only to
+   gain write access to directories in which the binary and manual page
+   are to be copied. The C-Kermit binary should be installed in a
+   directory that is in the users' PATH, but that is not likely to be
+   overwritten when you install a new version of the operating system. A
+   good candidate would be the /usr/local/bin/ directory, but the
+   specific choice is site dependent. Example (assuming the appropriate
+   Kermit binary is stored in your current directory as "wermit", e.g.
+   because you just built it from source and that's the name the makefile
+   gave it):
+
+mv wermit /usr/local/bin/kermit
+chmod 755 /usr/local/bin/kermit
+
+   or (only after you finish reading this section!) simply:
+
+make install
+
+   IMPORTANT: IF C-KERMIT IS TO BE USED FOR DIALING OUT, you must also do
+   something to give it access to the dialout devices and lockfile
+   directories. The 'install' target does not attempt to set Kermit's
+   owner, group, and permissions to allow dialing out. This requires
+   privileges, open eyes, and human decision-making. Please read
+   [183]Sections 10 and [184]11 below, make the necessary decisions, and
+   then implement them by hand as described in those sections.
+
+   You should also install the man page, which is called ckuker.nr, in
+   the man page directory for local commands, such as /usr/man/man1/,
+   renamed appropriately, e.g. to kermit.1. This is also taken care of by
+   "make install".
+
+   Optionally, the text files listed in the [185]previous section can be
+   placed in a publicly readable directory. Suggested directory names
+   are:
+
+/usr/local/doc/kermit/
+/usr/local/lib/kermit/
+/usr/share/lib/kermit/
+/opt/kermit/doc/
+
+   (or any of these without the "/kermit"). Upon startup, C-Kermit checks
+   the following environment variables whose purpose is to specify the
+   directory where the C-Kermit text files are, in the following order:
+
+K_INFO_DIRECTORY
+K_INFO_DIR
+
+   If either of these is defined, C-Kermit checks for the existence of
+   the ckubwr.txt file (Unix C-Kermit Hints and Tips). If not found, it
+   checks the directories listed above (both with and without the
+   "/kermit") plus several others to see if they contain the ckubwr.txt
+   file. If found, various C-Kermit messages can refer the user to this
+   directory.
+
+   Finally, if you want to put the source code files somewhere for people
+   to look at, you can do that too.
+
+  5.4. The Makefile Install Target
+
+   The makefile "install" target does almost everything for you if you
+   give it the information it needs by setting the variables described
+   below. You can use this target if:
+
+     * You downloaded the [186]complete C-Kermit archive and built
+       C-Kermit from source; or:
+     * You downloaded an [187]individual C-Kermit binary and the
+       [188]C-Kermit text-file archive, and your computer has a "make"
+       command.
+
+   Here are the parameters you need to know:
+
+   BINARY
+          Name of the binary you want to install as "kermit". Default:
+          "wermit".
+
+   prefix
+          (lower case) If you define this variable, its value is
+          prepended to all the following xxxDIR variables (8.0.211 and
+          later).
+
+   DESTDIR
+          If you want to install the Kermit files in a directory
+          structure like /opt/kermit/bin/, /opt/kermit/doc/,
+          /opt/kermit/src/, then define DESTIR as the root of this
+          structure; for example, /opt/kermit. The DESTDIR string should
+          not end with a slash. By default, DESTDIR is not defined. If it
+          is defined, but the directory does not exist, the makefile
+          attempts to create it, which might require you to be root. Even
+          so, this can fail if any segments in the path except the last
+          one do not already exist. WARNING: If the makefile creates any
+          directories, it gives them a mode of 755, and the default owner
+          and group. Modify these by hand if necessary.
+
+   BINDIR
+          Directory in which to install the Kermit binary (and the
+          standard C-Kermit initialization file, if it is found, as a
+          Kerbang script). If DESTDIR is defined, BINDIR must start with
+          a slash. BINDIR must not end with a slash. If DESTDIR is
+          defined, BINDIR is a subdirectory of DESTDIR. If BINDIR does
+          not exist, the makefile attempts to create it as with DESTDIR.
+          Default: /usr/local/bin.
+
+   MANDIR
+          Directory in which to install the C-Kermit manual page as
+          "kermit" followed by the manual-chapter extension (next item).
+          Default: /usr/man/man1. If MANDIR is defined, the directory
+          must already exist.
+
+   MANEXT
+          Extension for the manual page. Default: 1 (digit one).
+
+   SRCDIR
+          Directory in which to install the C-Kermit source code. If
+          DESTDIR is defined, this is a subdirectory of DESTDIR. Default:
+          None.
+
+   CERTDIR
+          For secure builds only: Directory in which to install the
+          ca_certs.pem file. This must be the verification directory used
+          by programs that use the SSL libraries at your site. Default:
+          none. Possibilities include: /usr/local/ssl, /opt/ssl,
+          /usr/lib/ssl, . . .     If CERTDIR is defined, the directory
+          must already exist.
+
+   INFODIR
+          Directory in which to install the C-Kermit text files. If
+          DESTDIR is defined, this is a subdirectory of DESTDIR. Default:
+          None. If INFODIR is defined but does not exist, the makefile
+          attempts to create it, as with DESTDIR.
+
+   Examples:
+
+   make install
+          Installs "wermit" as /usr/local/bin/kermit with permissions
+          755, the default owner and group, and no special privileges.
+          The manual page is installed as /usr/man/man1/kermit.1. Text
+          files are not copied anywhere, nor are the sources.
+
+   make MANDIR= install
+          Just like "make install" but does not attempt to install the
+          manual page.
+
+   make DESTDIR=/opt/kermit BINDIR=/bin SRCDIR=/src INFODIR=/doc install
+          Installs the Kermit binary "wermit" as /opt/kermit/bin/kermit,
+          puts the source code in /opt/kermit/src, and puts the text
+          files in /opt/kermit/doc, creating the directories if they
+          don't already exist, and puts the man page in the default
+          location.
+
+   make BINDIR=/usr/local/bin CERTDIR=/usr/local/ssl install
+          Installs the Kerberized Kermit binary "wermit" as
+          /usr/local/bin/kermit, puts the CA Certificates file in
+          /usr/local/ssl/, and the man page in the normal place.
+
+   For definitive information, see the makefile. The following is
+   excerpted from the 8.0.211 makefile:
+
+# The following symbols are used to specify library and header file locations
+# Redefine them to the values used on your system by:
+# . editing this file
+# . defining the values on the command line
+# . defining the values in the environment and use the -e option
+#
+prefix  = /usr/local
+srproot = $(prefix)
+sslroot = $(prefix)
+manroot = $(prefix)
+
+K4LIB=-L/usr/kerberos/lib
+K4INC=-I/usr/kerberos/include
+K5LIB=-L/usr/kerberos/lib
+K5INC=-I/usr/kerberos/include
+SRPLIB=-L$(srproot)/lib
+SRPINC=-I$(srproot)/include
+SSLLIB=-L$(sslroot)/ssl/lib
+SSLINC=-I$(sslroot)/ssl/include
+...
+WERMIT = makewhat
+BINARY = wermit
+DESTDIR =
+BINDIR = $(prefix)/bin
+MANDIR = $(manroot)/man/man1
+MANEXT = 1
+SRCDIR =
+INFODIR =
+CERTDIR =
+  __________________________________________________________________________
+
+6. INSTALLING UNIX C-KERMIT FROM DOS-FORMAT DISKETTES
+
+   [ [189]Top ] [ [190]Contents ] [ [191]Next ] [ [192]Previous ]
+
+     This section is obsolete. We don't distribute C-Kermit on diskettes
+     any more because (a)there is no demand, and (b) it no longer fits. 
+
+   If you received a DOS-format diskette containing a binary executable
+   C-Kermit program plus supporting text files, be sure to chmod +x the
+   executable before attempting to run it.
+
+   In version 5A(190) and later, all the text files on the C-Kermit
+   DOS-format diskettes are in Unix format: LF at the end of each line
+   rather than CRLF. This means that no conversions are necessary when
+   copying to your Unix file system, and that all the files on the
+   diskette, text and binary, can be copied together. The following
+   comments apply to the DOS-format diskettes furnished with version
+   5A(189) and earlier or to other DOS-format diskettes you might have
+   obtained from other sources.
+
+   If you have received C-Kermit on MS-DOS format diskettes (such as
+   those distributed by Columbia University), you should make sure that
+   your DOS-to-Unix conversion utility (such as "dosread") both: (1)
+   changes line terminators in all files from carriage-return linefeed
+   (CRLF) to just linefeed (LF) (such as "dosread -a") and remove any
+   Ctrl-Z's, and (2) that all filenames are converted from uppercase to
+   lowercase. If these conversions were not done, you can use the
+   following shell script on your Unix system to do them:
+
+---(cut here)---
+#!/bin/sh
+#
+# Shell script to convert C-Kermit DOS-format files into Unix format.
+# Lowercases the filenames, strips out carriage returns and Ctrl-Z's.
+#
+x=$1 # the name of the source directory
+y=$2 # the name of the target directory if [ $# -lt 2 ]; then
+  echo "usage: $0 source-directory target-directory"
+  exit 1
+fi
+if cd $1 ; then
+  echo "Converting files from $1 to $2"
+else
+  echo "$0: cannot cd to $1"
+  exit 1
+fi
+for i in *; do
+  j=`echo $i | tr 'A-Z' 'a-z'`
+  echo $x/$i =\> $y/$j
+  tr -d '\015\032' < $i > $y/$j
+done
+---(cut here)---
+
+   Cut out this shell script, save it as "convert.sh" (or any other name
+   you prefer), then "chmod +x convert.sh". Then, create a new, empty
+   directory to put the converted files in, and then "convert.sh /xxx
+   /yyy" where /xxx is the name of the directory where the PC-format
+   files are, and /yyy is the name of the new, empty directory. The
+   converted files will appear in the new directory.
+  __________________________________________________________________________
+
+7. CHECKING THE RESULTS
+
+   [ [193]Top ] [ [194]Contents ] [ [195]Next ] [ [196]Previous ]
+
+   First some quick checks for problems that can be easily corrected by
+   recompiling with different options:
+
+   DIRECTORY listing is garbage
+          Permissions, size, and date are random garbage (but the
+          filenames are correct) in a C-Kermit DIRECTORY listing. On some
+          platforms, the lstat() function is present but simply doesn't
+          work; try adding -DNOLSTAT to CFLAGS and rebuild. If that
+          doesn't fix it, also add -DNOLINKBITS. If it's still not fixed,
+          remove -DNOLSTAT and -DNOLINKBITS and add -DNOSYMLINK.
+
+   curses
+          When you make a connection with C-Kermit and transfer files
+          using the fullscreen (curses) file-transfer display, and then
+          get the C-Kermit> prompt back afterwards, do characters echo
+          when you type them? If not, the curses library has altered the
+          buffering of /dev/tty. Try rebuilding with KFLAGS=-DCK_NEWTERM.
+          If it already has -DCK_NEWTERM in CFLAGS, try removing it. If
+          that doesn't help, then rebuild with -DNONOSETBUF (yes, two
+          NO's). If none of this works (and you can't fix the code), then
+          either don't use the fullscreen display, or rebuild with
+          -DNOCURSES.
+
+   Ctrl-L or any SCREEN command crashes C-Kermit:
+          Rebuild with -DNOTERMCAP.
+
+   No prompt after CONNECT:
+          After escaping back from CONNECT mode, does your C-Kermit>
+          prompt disappear? (Yet, typing "?" still produces a command
+          list, etc) In that case, add -DCKCONINTB4CB to CFLAGS and
+          rebuild.
+
+   Here is a more thorough checklist can use to tell whether your version
+   of C-Kermit was built correctly for your Unix system, with hints on
+   how to fix or work around problems:
+
+    a. Start C-Kermit (usually by typing "./wermit" in the directory
+       where you ran the makefile). Do you see the C-Kermit> prompt? If
+       not, C-Kermit incorrectly deduced that it was running in the
+       background. The test is in conbgt() in [197]ckutio.c. If you can
+       fix it for your system, please send in the fix (Hint: read about
+       "PID_T" below). Otherwise, you can force C-Kermit to foreground
+       mode by starting it with the -z command line option, as in "kermit
+       -z", or giving the interactive command SET BACKGROUND OFF.
+    b. When you type characters at the C-Kermit prompt, do they echo
+       immediately? If not, something is wrong with concb() and probably
+       the other terminal mode settings routines in [198]ckutio.c. Be
+       sure you have used the most appropriate make entry.
+    c. At the C-Kermit> prompt, type "send ./?". C-Kermit should list all
+       the files in the current directory. If not, it was built for the
+       wrong type of Unix file system. Details below. In the meantime,
+       try SET WILDCARD-EXPANSION SHELL as a workaround.
+    d. CD to a directory that contains a variety of files, symlinks, and
+       subdirectories and give a DIRECTORY command at the C-Kermit>
+       prompt. Do the permissions, size, and date appear correct? If not
+       see [199]Section 4.0.
+    e. Assuming your platform supports long file names, create a file
+       with a long name in your current directory, e.g.:
+
+$ touch thisisafilewithaveryveryveryveryveryveryveryverylooooooooongname
+
+       (you might need to make it longer than this, perhaps as long as
+       257 or even 1025 characters).
+       Check with ls to see if your version of Unix truncated the name.
+       Now start C-Kermit and type "send thisis<ESC>". Does Kermit
+       complete the name, showing the same name as ls did? If not, wrong
+       filesystem. Read on.
+    f. Make sure that Kermit has the maximum path length right. Just type
+       SHOW FILE and see what it says about this. If it is too short,
+       there could be some problems at runtime. To correct, look in
+       [200]ckcdeb.h to see how the symbol CKMAXPATH is set and make any
+       needed adjustments.
+    g. Send a file to your new Kermit program from a different Kermit
+       program that is known to work. Is the date/timestamp of the new
+       file identical to the original? If not, adjustments are needed in
+       zstrdt() in [201]ckufio.c.
+    h. Go to another computer (Computer B) from which you can send files
+       to C-Kermit. Connect Computer B to the computer (A) where you are
+       testing C-Kermit. Then:
+    i. Send a file from B to A. Make sure it transferred OK and was
+       created with the the right name.
+    j. Send a file from B to A, specifying an "as-name" that is very,
+       very long (longer than the maximum name length on computer A).
+       Check to make sure that the file was received OK and that its name
+       was truncated to Computer A's maximum length. If not, check the
+       MAXNAMLEN definition in [202]ckufio.c.
+    k. Tell C-Kermit on Computer A to "set receive pathnames relative"
+       and then send it a file from Computer B specifying an as-name that
+       contains several directory segments:
+
+send foo dir1/dir2/dir3/foo
+
+       Check to make sure that dir1/dir2/dir3/foo was created in Computer
+       A's current directory (i.e. that three levels of directories were
+       created).
+    l. Repeat step k, but make each path segment in the pathname longer
+       than Computer A's maximum name length. Make sure each directory
+       name, and the final filename, were truncated properly.
+    m. Type Ctrl-C (or whatever your Unix interrupt character is) at the
+       prompt. Do you get "^C..." and a new prompt? If instead, you get a
+       core dump (this shouldn't happen any more) "rm core" and then
+       rebuild with -DNOCCTRAP added to your CFLAGS. If it did work, then
+       type another Ctrl-C. If this does the same thing as the first one,
+       then Ctrl-C handling is OK. Otherwise, the SIGINT signal is either
+       not getting re-armed (shouldn't happen) or is being masked off
+       after the first time it is caught, in which case, if your Unix is
+       POSIX-based, try rebuilding C-Kermit with -DCK_POSIX_SIG.
+    n. Type Ctrl-Z (or whatever your Unix suspend character is) to put
+       C-Kermit in the background. Did it work? If nothing happened, then
+       (a)your version of Unix does not support job control, or (b) your
+       version of C-Kermit was probably built with -DNOJC. If your
+       session became totally frozen, then you are probably running
+       C-Kermit on a Unix version that supports job control, but under a
+       shell that doesn't. If that's not the case, look in the congm()
+       and psuspend() routines in [203]ckutio.c and see if you can figure
+       out what's wrong. If you can't, rebuild with -DNOJC.
+    o. Give a SET LINE command for a dialout device, e.g. "set line
+       /dev/tty00". If you got some kind of permission or access denied
+       message, go read [204]Section 10 and then come back here.
+    p. After giving a successful SET LINE command, type "show comm" to
+       see the communication parameters. Do they make sense?
+    q. Type "set speed ?" and observe the list of available speeds. Is it
+       what you expected? If not, see [205]Section 2) of the
+       [206]Configurations Options document.
+    r. Give a SET SPEED command to change the device's speed. Did it
+       work? (Type "show comm" again to check.)
+    s. Try dialing out: SET MODEM TYPE , SET LINE , SET SPEED , DIAL . If
+       it doesn't work, keep reading. After dialing, can you REDIAL?
+    t. If your version was built with TCP/IP network support, try the
+       TELNET command.
+    u. Transfer some files in remote mode on incoming asynchronous serial
+       (direct or modem) connections, and on incoming network (telnet,
+       rlogin, terminal server) connections. If you get lots of errors,
+       try different SET FLOW settings on the remote Kermit program.
+    v. Establish a serial connection from C-Kermit to another computer
+       (direct or dialed) and transfer some files. If you have network
+       support, do the same with a network connection.
+    w. If your version was built with fullscreen file transfer display
+       support, check that it works during local-mode file transfer.
+       Also, check C-Kermit's operation afterwards: is the echoing funny?
+       etc etc. If there are problems, see [207]Section 4.
+    x. If your version was built with script programming language
+       support, TAKE the ckedemo.ksc file to give it a workout.
+    y. Does C-Kermit interlock correctly with UUCP-family programs (cu,
+       tip, uucp, etc)? If not, read the section [208]DIALING OUT AND
+       COORDINATING WITH UUCP below.
+    z. Modem signals... Give a SET LINE command to a serial device and
+       then type the SHOW MODEM command. If it says "Modem signals
+       unavailable in this version of Kermit", then you might want to
+       look at the ttgmdm() routine in [209]ckutio.c and add the needed
+       code -- if indeed your version of Unix provides a way to get modem
+       signals (some don't; e.g. modem signals are a foreign concept to
+       POSIX, requiring politically incorrect workarounds).
+   aa. If it says "Modem signals unavailable", then it is likely that the
+       API for getting modem signals is provided, but it doesn't actually
+       do anything (e.g. ioctl(ttyfd,TIOCMGET,&x) returns EINVAL).
+   ab. In any case, it still should be able to manipulate the DTR signal.
+       To test, SET LINE , SET MODEM NONE, and HANGUP. The DTR light
+       should go out momentarily. If it doesn't, see if you can add the
+       needed code for your system to the tthang() routine in
+       [210]ckutio.c.
+   ac. If your version of Kermit has the SET FLOW RTS/CTS command, check
+       to see if it works: give Kermit this command, set your modem for
+       RTS/CTS, transfer some files (using big packet and window sizes)
+       and watch the RTS and CTS lights on the modem. If they go on and
+       off (and Kermit does not get packet errors), then it works. If
+       your version of Kermit does not have this command, but your
+       version of Unix does support hardware flow control, take a look at
+       the tthflow() command in [211]ckutio.c and see if you can add the
+       needed code (see the section on [212]HARDWARE FLOW CONTROL below).
+       (And please [213]send back any added code, so that others can
+       benefit from it and it can be carried forward into future
+       releases.)
+   ad. If C-Kermit starts normally and issues its prompt, echoing is
+       normal, etc, but then after returning from a CONNECT session, the
+       prompt no longer appears, try rebuilding with -DCKCONINTB4CB.
+   ae. (8.0.206 or later) Type some commands at the C-Kermit prompt. Can
+       you use the Up-arrow and Down-arrow keys on your keyboard to
+       access Kermit's command history? If not, and you're a programmer,
+       take a look at the USE_ARROWKEYS sections of ckucmd.c.
+  __________________________________________________________________________
+
+8. REDUCING THE SIZE OF THE EXECUTABLE PROGRAM IMAGE
+
+   [ [214]Top ] [ [215]Contents ] [ [216]Next ] [ [217]Previous ]
+
+   Also see: [218]C-Kermit Configuration Options
+
+    a. Many of C-Kermit's options and features can be deselected at
+       compile time. The greatest savings at the least sacrifice in
+       functionality is to disable the logging of debug information by
+       defining NODEBUG during compilation. See the [219]Configurations
+       Options document for further information.
+    b. Use shared libraries rather than static linking. This is the
+       default on many Unix systems anyway. However, executables built
+       for dynamic linking with shared libraries are generally not
+       portable away from the machine they were built on, so this is
+       recommended if the binary is for your use only.
+    c. Most Unix systems have a "strip" command to remove symbol table
+       information from an executable program image. "man strip" for
+       further information. The same effect can be achieved by including
+       "-s" among the link flags when building C-Kermit.
+    d. SCO, Interactive, and some other Unix versions have an "mcs"
+       command. "mcs -d wermit" can be used to delete the contents of the
+       ".comment" section from the executable program image.
+    e. Many modern optimizers can be instructed to optimize for space
+       rather than execution efficiency. Check the CFLAGS in the makefile
+       target, adjust as desired.
+  __________________________________________________________________________
+
+9. UNIX VERSIONS
+
+   [ [220]Top ] [ [221]Contents ] [ [222]Next ] [ [223]Previous ]
+
+   SECTION CONTENTS
+
+9.1 [224]Standards
+     9.1.1. [225]POSIX
+     9.1.2. [226]ANSI C
+     9.1.3. [227]Other Standards
+9.2. [228]Library Issues
+9.3. [229]Unix File System Peculiarities
+9.4. [230]Hardware Flow Control
+9.5. [231]Terminal Speeds
+9.6. [232]Millisecond Sleeps
+9.7. [233]Nondestructive Input Buffer Peeking
+9.8. [234]Other System-Dependent Features
+9.9. [235]Terminal Interruption
+
+   There are several major varieties of Unix: Bell Laboratories Seventh
+   Edition, AT&T System V, Berkeley Standard Distribution (BSD), and
+   POSIX. Each has many, many subvarieties and descendents, and there are
+   also hybrids that exhibit symptoms of two or more varieties, plus
+   special quirks of their own.
+
+   Seventh edition versions of C-Kermit include the compile-time option
+   -DV7 in the CFLAGS string in the makefile target. Various V7-based
+   implementations are also supported: -DCOHERENT, -DMINIX, etc.
+
+   AT&T-based versions of Unix Kermit include the compile-time option
+   -DATTSV (standing for AT&mp;T Unix System V). This applies to System
+   III and to System V up to and including Release 2. For System V
+   Release 3, the flag -DSVR3 should be used instead (which also implies
+   -DATTSV). This is because the data type of signal() and several other
+   functions was changed between SVR2 and SVR3. For System V Release 4,
+   include -DSVR4 because of changes in UUCP lockfile conventions; this
+   also implies -DSVR3 and -DATTSV.
+
+   For BSD, the flag -BSDxx must be included, where xx is the BSD version
+   number, for example BSD4 (for version 4.2 or later, using only 4.2
+   features), -DBSD41 (for BSD 4.1 only), -DBSD43 (for 4.3), -DBSD29 (BSD
+   2.9 for DEC PDP-11s). -DBSD44 is for 4.4BSD, which is the basis of
+   FreeBSD, NetBSD, OpenBSD, BSDI, and Mac OS X, and which contains many
+   POSIX features, and has little relation to 4.3BSD and earlier.
+
+   For POSIX, include the flag -DPOSIX. POSIX defines a whole new set of
+   terminal i/o functions that are not found in traditional AT&T or
+   Berkeley implementations, and also defines the symbol _POSIX_SOURCE,
+   which is used in many system and library header files, mainly to
+   disable non-POSIX (i.e. useful) features.
+
+   Note (circa 1997): In order to enable serial speeds higher than 38400
+   bps, it is generally necessary to add -DPOSIX (among other things),
+   since the older terminal APIs can not accommodate the new speeds --
+   out o' bits. But this often also means wholesale conversion to POSIX
+   APIs. In general, just try adding -DPOSIX and then see what goes
+   wrong. Be wary of features disappearing: when _POSIX_SOURCE is
+   defined, all sorts of things that were perfectly OK before suddenly
+   become politically incorrect -- like reading modem signals, doing
+   hardware flow control, etc. POSIX was evidently not designed with
+   serial communication in mind!
+
+   Case in point: In UnixWare 7.0, #define'ing POSIX causes strictness
+   clauses in the header files to take effect. These prevent <sys/time.h>
+   from defining the timeval and timezone structs, which are needed for
+   all sorts of things (like select()). Thus, if we want the high serial
+   speeds, we have to circumvent the POSIX clauses.
+
+   Similarly in SCO OpenServer R5.0.4 where, again, we must use the POSIX
+   APIs to get at serial speeds higher than 38400, but then doing so
+   removes hardware flow control -- just when we need it most! In cases
+   like this, dirty tricks are the only recourse (search for SCO_OSR504
+   in [236]ckutio.c for examples).
+
+   For reasons like this, Unix implementations tend to be neither pure
+   AT&T nor pure BSD nor pure POSIX, but a mixture of two or more of
+   these, with "compatibility features" allowing different varieties of
+   programs to be built on the same computer. In general, Kermit tries
+   not to mix and match but to keep a consistent repertoire throughout.
+   However, there are certain Unix implementations that only work when
+   you mix and match. For example, the Silicon Graphics IRIX operating
+   system (prior to version 3.3) is an AT&T Unix but with a BSD file
+   system. The only way you can build Kermit successfully for this
+   configuration is to include -DSVR3 plus the special option -DLONGFN,
+   meaning "pretend I was built with -DBSDxx when it's time to compile
+   file-related code". See the "iris" makefile target.
+    ________________________________________________________________________
+
+  9.1. Standards
+
+   [ [237]Top ] [ [238]Section Contents ] [ [239]Contents ] [ [240]Next ]
+
+   SUBSECTION CONTENTS
+
+9.1.1. [241]POSIX
+9.1.2. [242]ANSI C
+9.1.3. [243]Other Standards
+
+   In edits 166-167 (1988-89), C-Kermit was heavily modified to try to
+   keep abreast of new standards while still remaining compatible with
+   old versions of C and Unix. There are two new standards of interest:
+   ANSI C (as described in Kernighan and Ritchie, "The C Programming
+   Language", Second Edition, Prentice Hall, 1988) and POSIX.1 (IEEE
+   Standard 1003.1 and ISO/IEC 9945-1, 1990, "Portable Operating System
+   Interface"). These two standards have nothing to do with each other:
+   you can build C-Kermit with a non-ANSI compiler for a POSIX system, or
+   for a non-POSIX system with with an ANSI compiler.
+
+    9.1.1. POSIX
+
+   POSIX.1 defines a repertoire of system functions and header files for
+   use by C language programs. Most notably, the ioctl() function is not
+   allowed in POSIX; all ioctl() functions have been replaced by
+   device-specific functions like tcsetattr(), tcsendbreak(), etc.
+
+   Computer systems that claim some degree of POSIX compliance have made
+   some attempt to put their header files in the right places and give
+   them the right names, and to provide system library functions with the
+   right names and calling conventions. Within the header files,
+   POSIX-compliant functions are supposed to be within #ifdef
+   _POSIX_SOURCE..#endif conditionals, and non-POSIX items are not within
+   these conditionals.
+
+   If Kermit is built with neither -D_POSIX_SOURCE nor -DPOSIX, the
+   functions and header files of the selected version of Unix (or VMS,
+   etc) are used according to the CFLAGS Kermit was built with.
+
+   If Kermit is built with -D_POSIX_SOURCE but not -DPOSIX, then one of
+   the -DBSD or -DATTSV flags (or one that implies them) must also be
+   defined, but it still uses only the POSIX features in the system
+   header files. This allows C-Kermit to be built on BSD or AT&T systems
+   that have some degree of POSIX compliance, but still use BSD or AT&T
+   specific features.
+
+   The dilimma is this: it is often necessary to define _POSIX_SOURCE to
+   get at new or modern features, such as high serial speeds and the APIs
+   to deal with them. But defining _POSIX_SOURCE also hides other APIs
+   that Kermit needs, for example the ones dealing with modem signals
+   (others are listed just below). Thus all sorts of hideous contortions
+   are often required to get a full set of features.
+
+   The POSIX standard does not define anything about uucp lockfiles.
+   "make posix" uses NO (repeat, NO) lockfile conventions. If your
+   POSIX-compliant Unix version uses a lockfile convention such as
+   HDBUUCP (see below), use the "posix" entry, but include the
+   appropriate lockfile option in your KFLAGS on the "make" command line,
+   for example:
+
+make posix "KFLAGS=-DHDBUUCP"
+
+   POSIX.1 also lacks certain other features that Kermit needs. For
+   example:
+
+     * There is no defined way for an application to do wildcard matching
+       of filenames. Kermit uses the inode in the directory structure,
+       but POSIX.1 does not include this concept. (Later POSIX revisions
+       include functions named (I think) glob() and fnmatch(), but these
+       functions are not yet in Kermit, and might not be appropriate in
+       any case.)
+     * There is no POSIX mechanism for sensing or controlling modem
+       signals, nor to enable RTS/CTS or other hardware flow control.
+     * There is no select() for multiplexing i/o, and therefore no
+       TCP/IP.
+     * There is no way to check if characters are waiting in a
+       communications device (or console) input buffer, short of trying
+       to read them -- no select(), ioctl(fd,FIONREAD,blah), rdchk(),
+       etc. This is bad for CONNECT mode and bad for sliding windows.
+     * No way to do a millisecond sleep (no nap(), usleep(), select(),
+       etc).
+     * There is no popen().
+
+   So at this point, there cannot be one single fully functional POSIX
+   form of C-Kermit unless it also has "extensions", as do Linux, QNX,
+   etc.
+
+   More on POSIX (quoting from a newsgroup posting by Dave Butenhof):
+
+     Standards tend to look at themselves as "enabling". So POSIX
+     standards say that, in order to use POSIX functions, a program must
+     define some macro that will put the development environment in
+     "POSIX mode". For the ancient POSIX 1003.1-1990, the symbol is
+     _POSIX_SOURCE. For recent revisions, it's _POSIX_C_SOURCE with an
+     appropriate value. POSIX 1003.1-1996 says that, to use its features
+     in a portable manner, you must define _POSIX_C_SOURCE=199506L
+     before including any header files.
+
+     But for Solaris, or Digital Unix, the picture is different. POSIX
+     is one important but small part of the universe. Yet POSIX
+     unconditionally and unambiguously REQUIRES that, when
+     _POSIX_C_SOURCE=199506L, ALL of the functions and definitions
+     required by the standard, and NO others (except in specific
+     restricted namespaces, specifically "_" followed by an uppercase
+     letter or "__" followed by a lowercase letter) shall be visible.
+     That kinda puts a cramp on BSD and SVID support, because those
+     require names that are not in the "protected" POSIX namespaces.
+     It's ILLEGAL to make those symbols visible, unless you've done
+     something else that's beyond the scope of POSIX to allow the system
+     to infer that you didn't really mean it.
+
+     In most cases, you should just compile, with no standards-related
+     macros defined. The system will make available every interface and
+     definition that isn't incompatible with the "main stream". There
+     may indeed be cases where two standards cross, and you really can't
+     use both together. But, in general, they play nicely together as
+     long as you don't do anything rash -- like telling the system that
+     it's not allowed to let them.
+
+     In the area of threads, both Solaris and Digital Unix support
+     incompatible thread APIs. We have POSIX and DCE, they have POSIX
+     and UI. The nasty areas are in the _r routines and in some aspects
+     of signal behavior. You cannot compile a single source file that
+     uses both semantics. That's life. It sounds as if Solaris defaults
+     to the UI variants, but allows you to define this
+     _POSIX_THREAD_SEMANTICS to get around it. We default to POSIX, and
+     allow you to define _PTHREAD_USE_D4 (automatically defined by the
+     cc "-threads" switch) to select the DCE thread variants. That
+     default, because you're operating outside of any individual
+     standard, is really just a marketing decision.
+      ______________________________________________________________________
+
+    9.1.2. ANSI C
+
+   [ [244]Top ] [ [245]Contents ] [ [246]Section Contents ] [
+   [247]Subsection Contents ] [ [248]Next ] [ [249]Previous ]
+
+   The major difference between ANSI C and earlier C compilers is
+   function prototyping. ANSI C allows function arguments to be checked
+   for type agreement, and (when possible) type coercion in the event of
+   a mismatch. For this to work, functions and their arguments must be
+   declared before they are called. The form for function declarations is
+   different in ANSI C and non-ANSI C (ANSI C also accepts the earlier
+   form, but then does not do type checking).
+
+   As of edit 167, C-Kermit tries to take full advantage of ANSI C
+   features, especially function prototyping. This removes many bugs
+   introduced by differing data types used or returned by the same
+   functions on different computers. ANSI C features are automatically
+   enabled when the symbol __STDC__ is defined. Most ANSI C compilers,
+   such as GNU CC and the new DEC C compiler define this symbol
+   internally.
+
+   On the downside, ANSI C compilation increases the
+   administrative/bureacratic burden, spewing out countless unneeded
+   warnings about mismatched types, especially when we are dealing with
+   signed and unsigned characters, requiring casts everywhere to shut up
+   the mindless complaints -- there is no use for signed chars in Kermit
+   (or probably anywhere else). Some compilers, mercifully, include a
+   "treat all chars as unsigned" option, and when available it should be
+   used -- not only to stop the warnings, but also to avoid unhelpful
+   sign extension on high-bit characters.
+
+   To force use of ANSI C prototypes, include -DCK_ANSIC on the cc
+   command line. To disable the use of ANSI prototypes, include -DNOANSI.
+      ______________________________________________________________________
+
+    9.1.3. Other Standards
+
+   [ [250]Top ] [ [251]Contents ] [ [252]Section Contents ] [
+   [253]Subsection Contents ] [ [254]Next ] [ [255]Previous ]
+
+   As the years go by, standards with-which-all-must-comply continue to
+   pile up: AES, XPG2, XPG3, XPG4, FIPS 151-2, successive generations of
+   POSIX, OSF/1, X/Open, Spec 1170, UNIX95, Open Group UNIX98, ISO/IEC
+   9945 parts 1-4, ISO 9899, 88Open, OS 99, Single Unix Specification
+   (SUS, [256]IEEE 1003.1-2001, not to mention "mature standards" like
+   V7, 4.2/4.3BSD, System V R3 and R4 (SVID2 and SVID3), 4.4BSD (the
+   basis for BSDI, OpenBSD, NetBSD, FreeBSD, Mac OS X etc), /usr/group,
+   plus assorted seismic pronouncements of the neverending series of
+   ephemeral corporate consortia, not to mention the libc-vs-glibc
+   turmoil in the Linux arena and who knows what else.
+
+   None of these standards simplifies life for portable applications like
+   C-Kermit -- each one is simply one more environment to support (or
+   circumvent, as in many cases these standards do more harm than good by
+   denying access to facilities we need, e.g. as noted in above in
+   [257]9.1.1).
+    ________________________________________________________________________
+
+  9.2. Library Issues
+
+   [ [258]Top ] [ [259]Contents ] [ [260]Section Contents ] [
+   [261]Subsection Contents ] [ [262]Next ] [ [263]Previous ]
+
+   On most modern platforms, applications are -- and often must be --
+   dynamically linked. This has numerous advantages (smaller executables,
+   ability to patch a library and thereby patch all applications that use
+   it, etc), but also causes some headaches: most commonly, the library
+   ID built into the executable at link time does not match the ID of the
+   corresponding library on the target system, and so the loader refuses
+   to let the application run.
+
+   This problem only gets worse over time. In the Linux and *BSD world,
+   we also have totally different libraries (each with their own names
+   and numbering systems) that cover the same territory; for example,
+   curses vs ncurses, libc versus glibc. Combinations proliferate and any
+   given Unix computer might have any combination. For this reason it is
+   becoming increasingly difficult to produce a "Linux binary" for a
+   given architecture (e.g. PC or Alpha). There has to be a separate
+   binary for (at least) every combination of curses vs ncurses and libc
+   vs glibc.
+
+   In such cases, the best advice is for every user to build C-Kermit
+   from source code on the system where it will run. Too bad most
+   commercial Unix vendors have stopped including C compilers with the
+   operating system!
+    ________________________________________________________________________
+
+  9.3. Unix File System Peculiarities
+
+   [ [264]Top ] [ [265]Contents ] [ [266]Section Contents ] [ [267]Next ]
+   [ [268]Previous ]
+
+   Normally, including a BSD, System-V, POSIX, or DIRENT flag in the make
+   entry selects the right file system code. But some versions of Unix
+   are inconsistent in this regard, and building in the normal way either
+   gives compiler or linker errors, or results in problems at runtime,
+   typically failure to properly expand wildcard file specifications when
+   you do something like "send *.*", or failure to recognize long
+   filenames, as in "send filewithaveryveryveryveryverylongname".
+
+   C-Kermit is supposed to know about all the various styles of Unix file
+   systems, but it has to be told which one to use when you build it,
+   usually in the makefile target CFLAGS as shown below, but you might
+   also have to add something like -I/usr/include/bsd to CFLAGS, or
+   something like -lbsd to LIBS.
+
+   C-Kermit gives you the following CFLAGS switches to adapt to your file
+   system's peculiarities:
+
+-DDIRENT   - #include <dirent.h>
+-DSDIRENT  - #include <sys/dirent.h>
+-DNDIR     - #include <ndir.h>
+-DXNDIR    - #include <sys/ndir.h>
+-DRTU      - #include "/usr/lib/ndir.h", only if NDIR and XNDIR not defined.
+-DSYSUTIMH - #include <sys/utime.h> for setting file creation dates.
+-DUTIMEH   - #include <utime.h> for setting file creation dates.
+
+   (Note, RTU should only be used for Masscomp RTU systems, because it
+   also selects certain other RTU-specific features.)
+
+   If none of these is defined, then <sys/dir.h> is used. IMPORTANT: If
+   your system has the file /usr/include/dirent.h then be sure to add
+   -DDIRENT to your makefile target's CFLAGS. "dirent" should be used in
+   preference to any of the others, because it supports all the features
+   of your file system, and the others probably don't.
+
+   Having selected the appropriate directory header file, you might also
+   need to tell Kermit how to declare the routines and variables it needs
+   to read the directory. This happens most commonly on AT&T System-V
+   based UNIXes, particularly System V R3 and earlier, that provide long
+   file and directory names (longer than 14 characters). Examples include
+   certain releases of HP-UX, DIAB DNIX, older versions of Silicon
+   Graphics IRIX, and perhaps also MIPS. In this case, try adding
+   -DLONGFN to your makefile target.
+
+   Another problem child is <sys/file.h>. Most Unix C-Kermit versions
+   need to #include this file from within [269]ckufio.c and
+   [270]ckutio.c, but some not only do not need to include it, but MUST
+   not include it because (a) it doesn't exist, or (b) it has already
+   been included by some other header file and it doesn't protect itself
+   against multiple inclusion, or (c) some other reason that prevents
+   successful compilation. If you have compilation problems that seem to
+   stem from including this file, then add the following switch to CFLAGS
+   in your makefile target:
+
+-DNOFILEH
+
+   There are a few odd cases where <sys/file.h> must be included in one
+   of the cku[ft]io.c files, but not the other. In that case, add the
+   aforementioned switch, but go into the file that needs <sys/file.h>
+   and add something like this:
+
+#ifdef XXX       /* (where XXX is a symbol unique to your system) */
+#undef NOFILEH
+#endif /* XXX */
+
+   before the section that includes <sys/file.h>.
+
+   Kermit's SEND command expands wildcard characters "?" and "*" itself.
+   Before version 5A, commands like "send *" would send all regular
+   (non-directory) files, including "hidden files" (whose names start
+   with "."). In version 5A, the default behavior is to match like the
+   Bourne shell or the ls command, and not include files whose names
+   start with dot. Such files can still be sent if the dot is included
+   explicitly in the SEND command: "send .oofa, send .*". To change back
+   to the old way and let leading wildcard characters match dot files,
+   include the following in your CFLAGS:
+
+-DMATCHDOT
+
+   (In C-Kermit 6.0, there is also a command to control this at runtime.)
+
+   Complaints about data-type mismatches:
+
+     * If you get compile-time complaints about data type mismatches for
+       process-ID related functions like getpid(), add -DPID_T=pid_t.
+     * If you get compile-time complaints about data type mismatches for
+       user ID related functions like getuid(), add -DUID_T=uid_t.
+     * If you get compile-time complaints about data type mismatches for
+       user-ID related functions like getgid(), add -DGID_T=gid_t.
+     * If you get compile-time complaints about data type mismatches for
+       getpwuid(), add -DPWID_T=uid_t (or whatever it should be).
+
+   File creation dates: C-Kermit attempts to set the creation date/time
+   of an incoming file according to the date/time given in the file's
+   attribute packet, if any. If you find that the dates are set
+   incorrectly, you might need to build Kermit with the -DSYSUTIMEH flag,
+   to tell it to include <sys/utime.h>. If that doesn't help, look at the
+   code in zstrdt() in [271]ckufio.c.
+    ________________________________________________________________________
+
+  9.4. Hardware Flow Control
+
+   [ [272]Top ] [ [273]Contents ] [ [274]Section Contents ] [ [275]Next ]
+   [ [276]Previous ]
+
+   Hardware flow control is a problematic concept in many popular Unix
+   implementations. Often it is lacking altogether, and when available,
+   the application program interface (API) to it is inconsistent from
+   system to system. Here are some examples:
+
+    a. POSIX does not support hardware flow control.
+    b. RTS/CTS flow control support MIGHT be available for System V R3
+       and later if /usr/include/termiox.h exists (its successful
+       operation also depends on the device driver, and the device
+       itself, not to mention the cable, etc, actually supporting it). If
+       your SVR3-or-later Unix system does have this file, add:
+
+-DTERMIOX
+
+       to your CFLAGS. If the file is in /usr/include/sys instead, add:
+
+-DSTERMIOX
+
+       Note that the presence of this file does not guarantee that
+       RTS/CTS will actually work -- that depends on the device-driver
+       implementation (reportedly, many Unix versions treat
+       hardware-flow-control related ioctl's as no-ops).
+    c. Search ("grep -i") through /usr/include/*.h and
+       /usr/include/sys/*.h for RTS or CTS and see what turns up. For
+       example, in SunOS 4.x we find "CRTSCTS". Figuring out how to use
+       it is another question entirely! In IBM AIX RS/6000 3.x, we have
+       to "add" a new "line discipline" (and you won't find uppercase RTS
+       or CTS symbols in the header files).
+    d. NeXTSTEP and IRIX, and possibly others, support hardware flow
+       control, but do not furnish an API to control it, and thus on
+       these systems Kermit has no command to select it -- instead, a
+       special device name must be used. (NeXTSTEP: /dev/cufa instead of
+       /dev/cua; IRIX: /dev/ttyf00)
+
+   See the routine tthflow() in [277]ckutio.c for details. If you find
+   that your system offers hardware flow control selection under program
+   control, you can add this capability to C-Kermit as follows:
+
+    a. See if it agrees with one of the methods already used in
+       tthflow(). if not, add new code, appropriately #ifdef'd.
+    b. Add -DCK_RTSCTS to the compiler CFLAGS in your makefile target or
+       define this symbol within the appropriate #ifdefs in
+       [278]ckcdeb.h.
+
+   To illustrate the difficulties with RTS/CTS, here is a tale from Jamie
+   Watson <jw@adasoft.ch>, who added the RTS/CTS code for the RS/6000,
+   about his attempts to do the same for DEC ULTRIX:
+
+     "The number and type of hardware signals available to/from a serial
+     port vary between different machines and different types of serial
+     interfaces on each machine. This means that, for example, there are
+     virtually no hardware signals in or out available on the DECsystem
+     3000/3100 series; on the DECsystem 5000/2xx series all modem
+     signals in/out are present on both built-in serial ports; on the
+     DECsystem 5100 some ports have all signals and some only have some;
+     and so on... It looks to me as if this pretty well rules out any
+     attempt to use hardware flow control on these platforms, even if we
+     could figure out how to do it. The confusion on the user level
+     about whether or not it should work for any given platform or port
+     would be tremendous. And then it isn't clear how to use the
+     hardware signals even in the cases where the device supports them."
+    ________________________________________________________________________
+
+  9.5. Terminal Speeds
+
+   [ [279]Top ] [ [280]Contents ] [ [281]Section Contents ] [ [282]Next ]
+   [ [283]Previous ]
+
+   The allowable speeds for the SET SPEED command are defined in
+   [284]ckcdeb.h. If your system supports speeds that are not listed in
+   "set speed ?", you can add definitions for them to ckcdeb.h.
+
+   Then if the speed you are adding is one that was never used before in
+   Kermit, such as 921600, you'll also need to add the appropriate
+   keywords to spdtab[] in [285]ckuus3.c, and the corresponding case to
+   ttsspd() in [286]ckutio.c.
+    ________________________________________________________________________
+
+  9.6. Millisecond Sleeps
+
+   [ [287]Top ] [ [288]Contents ] [ [289]Section Contents ] [ [290]Next ]
+   [ [291]Previous ]
+
+   There is no standard for millisecond sleeps, but at least five
+   different functions have appeared in various Unix versions that can be
+   used for this purpose: nap() (mostly in System V), usleep() (found at
+   least in SunOS and NeXT OS), select() (found in 4.2BSD and later, and
+   part of any TCP/IP sockets library), nanosleep(), and sginap(). If you
+   have any of these available, pick one (in this order of preference, if
+   you have more than one):
+
+-DSELECT: Include this in CFLAGS if your system has the select() function.
+-DNAP:    Include this in CFLAGS if your system has the nap() function.
+-USLEEP:  Include this in CFLAGS if your system has the usleep() function.
+
+   NOTE: The nap() function is assumed to be a function that puts the
+   process to sleep for the given number of milliseconds. If your
+   system's nap() function does something else or uses some other units
+   of time (like the NCR Tower 32, which uses clock-ticks), do not
+   include -DNAP.
+
+   Reportedly, all versions of System V R4 for Intel-based computers, and
+   possibly also SVR3.2, include nap() as a kernel call, but it's not in
+   the library. To include code to use it via syscall(3112,x), without
+   having to include Xenix compatibility features, include the following
+   compile-time option:
+
+-DNAPHACK
+    ________________________________________________________________________
+
+  9.7. Nondestructive Input Buffer Peeking
+
+   [ [292]Top ] [ [293]Contents ] [ [294]Section Contents ] [ [295]Next ]
+   [ [296]Previous ]
+
+   Some AT&T Unix versions have no way to check if input is waiting on a
+   tty device, but this is a very important feature for Kermit. Without
+   it, sliding windows might not work very well (or at all), and you also
+   have to type your escape character to get Kermit's attention in order
+   to interrupt a local-mode file transfer. If your system offers an
+   FIONREAD ioctl, the build procedure should pick that up automatically
+   and use it, which is ideal.
+
+   If your system lacks FIONREAD but has a select() function, this can be
+   used instead. If the build procedure fails to include it (SHOW
+   FEATURES will list SELECT), then you can add it to your CFLAGS:
+
+-DSELECT
+
+   Conversely, if the build procedure tries to use select() when it
+   really is not there, add:
+
+-DNOSELECT
+
+   Note: select() is not part of System V nor of POSIX, but it has been
+   added to various System-V- and POSIX-based systems as an extension.
+
+   Some System-V variations (SCO Xenix/UNIX/ODT and DIAB DNIX) include a
+   rdchk() function that can be used for buffer peeking. It returns 0 if
+   no characters are waiting and 1 if characters are waiting (but unlike
+   FIONREAD, it does not tell the actual number). If your system has
+   rdchk(), add:
+
+-DRDCHK:  Include this in CFLAGS if your system has the rdchk() function.
+
+   Otherwise, if your version of Unix has the poll() function (and the
+   /usr/include/poll.h file) -- which appears to be a standard part of
+   System V going back to at least SVR3, include:
+
+-DCK_POLL
+    ________________________________________________________________________
+
+  9.8. Other System-Dependent Features
+
+   [ [297]Top ] [ [298]Contents ] [ [299]Section Contents ] [ [300]Next ]
+   [ [301]Previous ]
+
+   Systems with <termios.h> might have the symbol IEXTEN defined. This is
+   used to turn "extended features" in the tty device driver on and off,
+   such as Ctrl-O to toggle output flushing, Ctrl-V to quote input
+   characters, etc.
+
+   In most Unix implementations, it should be turned off during Kermit
+   operation, so if [302]ckutio.c finds this symbol, it uses it. This is
+   necessary, at least, on BSDI. On some systems, however, IEXTEN is
+   either misdefined or misimplemented. The symptom is that CR, when
+   typed to the command processor, is echoed as LF, rather than CRLF.
+   This happens (at least) on Convex/OS 9.1. The solution is to add the
+   following symbol to the makefile target's CFLACS:
+
+-DNOIEXTEN
+
+   However, in at least one Unix implementation, QNX 4.21, IEXTEN must be
+   set before hardware flow control can be used.
+
+   In edits 177 and earlier, workstation users noticed a "slow screen
+   writing" phenomenon during interactive command parsing. This was
+   traced to a setbuf() call in [303]ckutio.c that made console (stdout)
+   writes unbuffered. This setbuf() call has been there forever, and
+   could not be removed without some risk. Kermit's operation was tested
+   on the NeXT in edit 178 with the setbuf() call removed, and the
+   slow-writing symptom was cured, and everything else (command parsing,
+   proper wakeup on ?, ESC, Ctrl-U, and other editing characters,
+   terminal emulation, remote-mode and local-mode file transfer, etc)
+   seemed to work as well as or better than before. In subsequent edits,
+   this change was made to many other versions too, with no apparent ill
+   effects. To remove the setbuf() call for your version of Kermit, add:
+
+-DNOSETBUF
+
+   Later reports indicate that adding -DNOSETBUF has other beneficial
+   effects, like cutting down on swapping when Kermit is run on
+   workstations with small memories. But BEWARE: on certain small Unix
+   systems, notably the AT&T 6300 and 3B1 (the very same ones that
+   benefit from NOSETBUF), NOSETBUF seems to conflict with CK_CURSES. The
+   program builds and runs OK, but after once using the curses display,
+   echoing is messed up. In this case, we use a System-V specific
+   variation in the curses code, using newterm() to prevent System V from
+   altering the buffering. See makefile entries for AT&T 6300 and 3B1.
+
+   The Unix version of C-Kermit includes code to switch to file
+   descriptor zero (stdin) for remote-mode file transfer. This code is
+   necessary to prevent Kermit from giving the impression that it is
+   "idle" during file transfers, which, at some sites, can result in the
+   job being logged out in the middle of an active file transfer by
+   idle-job monitors.
+
+   However, this feature can interfere with certain setups; for example,
+   there is a package which substitutes a pty/tty pair for /dev/tty and
+   sets file descriptor 0 to be read-only, preventing Kermit from sending
+   packets. Or... When a Unix shell is invoked under the PICK
+   environment, file descriptor 0 is inoperative.
+
+   To remove this feature and allow Kermit to work in such environments,
+   add the compile-time option:
+
+-DNOFDZERO
+
+   On some versions of Unix, earlier releases of C-Kermit were reported
+   to render a tty device unusable after a hangup operation. Examples
+   include IBM AIX on the RT PC and RS/6000. A typical symptom of this
+   phenomenon is that the DIAL command doesn't work, but CONNECTing to
+   the device and dialing manually do work. A further test is to SET DIAL
+   HANGUP OFF, which should make dialing work once by skipping the
+   pre-dial hangup. However, after the connection is broken, it can't be
+   used any more: subsequent attempts to DIAL the same device don't work.
+   The cure is usually to close and reopen the device as part of the
+   hangup operation. To do this, include the following compile-time
+   option:
+
+-DCLSOPN
+
+   Similarly, there is a section of code in ttopen(), which does another
+   close(open()) to force the O_NDELAY mode change. On some systems, the
+   close(open()) is required to make the mode change take effect, and
+   apparently on most others it does no harm. But reportedly on at least
+   one System V R4 implementation, and on SCO Xenix 3.2, the
+   close(open()) operation hangs if the device lacks carrier, EVEN THOUGH
+   the CLOCAL characteristic has just been set to avoid this very
+   problem. If this happens to you, add this to your CFLAGS:
+
+-DNOCOTFMC
+
+   or, equivalently, in your KFLAGS on the make command line. It stands
+   for NO Close(Open()) To Force Mode Change.
+
+   C-Kermit renames files when you give a RENAME command and also
+   according to the current SET FILE COLLISION option when receiving
+   files. The normal Unix way to rename a file is via two system calls:
+   link() and unlink(). But this leaves open a window of vulnerability.
+   Some Unix systems also offer an atomic rename(oldname,newname)
+   function. If your version of Unix has this function, add the following
+   to your CFLAGS:
+
+-DRENAME
+
+   C-Kermit predefines the RENAME for several Unix versions in
+   [304]ckcdeb.h (SVR4, SUNOS41, BSD44, AIXRS, etc). You can tell if
+   rename() is being used if the SHOW FEATURES command includes RENAME in
+   the compiler options list. If the predefined RENAME symbol causes
+   trouble, then add NORENAME to your CFLAGS. Trouble includes:
+
+    a. Linker complains that _rename is an unresolved symbol.
+    b. Linking works, but Kermit's RENAME command doesn't work (which
+       happens because older versions of rename() might have their
+       arguments reversed).
+
+   If rename() is not used, then Kermit uses link()/unlink(), which is
+   equivalent except it is not atomic: there is a tiny interval in which
+   some other process might "do something" to one of the files or links.
+
+   Some Unix systems (Olivetti X/OS, Amdahl UTS/V, ICL SVR3, etc) define
+   the S_ISREG and S_ISDIR macros incorrectly. This is compensated for
+   automatically in [305]ckufio.c. Other systems might have this same
+   problem. If you get a compile-time error message regarding S_ISREG
+   and/or S_ISDIR, add the following to your CFLAGS:
+
+-DISDIRBUG
+
+   Finally, here's a symbol you should NEVER define:
+
+-DCOMMENT
+
+   It's used for commenting out blocks of code. If for some reason you
+   find that your compiler has COMMENT defined, then add -UCOMMENT to
+   CFLAGS or KFLAGS! Similarly, some header files have been known to
+   define COMMENT, in which case you must add "#undef COMMENT" to each
+   C-Kermit source module, after all the #includes.
+    ________________________________________________________________________
+
+  9.9. Terminal Interruption
+
+   [ [306]Top ] [ [307]Contents ] [ [308]Section Contents ] [ [309]Next ]
+   [ [310]Previous ]
+
+   When C-Kermit enters interactive command mode, it sets a Control-C
+   (terminal keyboard interrupt = SIGINT) trap to allow it to return to
+   the command prompt whenever the user types Control-C (or whatever is
+   assigned to be the interrupt character). This is implemented using
+   setjmp() and longjmp(). On some systems, depending on the machine
+   architecture and C compiler and who knows what else, you might get
+   "Memory fault (coredump)" or "longjmp botch" instead of the desired
+   effect (this should not happen in 5A(190) and later). In that case,
+   add -DNOCCTRAP to your CFLAGS and rebuild the program.
+
+   Job control -- the ability to "suspend" C-Kermit on a Unix system by
+   typing the "susp" character (normally Ctrl-Z) and then resume
+   execution later (with the "fg" command) -- is a tricky business.
+   C-Kermit must trap suspend signals so it can put the terminal back
+   into normal mode when you suspend it (Kermit puts the terminal into
+   various strange modes during interactive command parsing, CONNECT, and
+   file transfer). Supporting code is compiled into C-Kermit
+   automatically if <signal.h> includes a definition for the SIGTSTP
+   signal. HOWEVER... some systems define this signal without supporting
+   job control correctly. You can build Kermit to ignore SIGTSTP signals
+   by including the -DNOJC option in CFLAGS. (You can also do this at
+   runtime by giving the command SET SUSPEND OFF.)
+
+     NOTE: As of version 5A(190), C-Kermit makes another safety check.
+     Even if job control is available in the operating system (according
+     to the numerous checks made in congm()), it will still disable the
+     catching of SIGTSTP signals if SIGTSTP was set to SIG_IGN at the
+     time C-Kermit was started.
+
+   System V R3 and earlier systems normally do not support job control.
+   If you have an SVR3 system that does, include the following option in
+   your CFLAGS:
+
+-DSVR3JC
+
+   On systems that correctly implement POSIX signal handling, signals can
+   be handled more reliably than in Bell, Berkeley, or AT&T Unixes. On
+   systems (such as QNX) that are "strictly POSIX", POSIX signal handling
+   *must* be used, otherwise no signal will work more than once. If you
+   have POSIX-based system and you find that your version of Kermit
+   responds to Ctrl-C (SIGINT) or Ctrl-Z (SIGTSTP) only once, then you
+   should add the following option to your CFLAGS:
+
+-DCK_POSIX_SIG
+
+   But be careful; some POSIX implementations, notably 4.4BSD, include
+   POSIX signal handling symbols and functions as "stubs" only, which do
+   nothing. Look in <signal.h> for sigsetjmp and siglongjmp and read the
+   comments.
+  __________________________________________________________________________
+
+10. DIALING OUT AND COORDINATING WITH UUCP
+
+   [ [311]Top ] [ [312]Contents ] [ [313]Next ] [ [314]Previous ]
+
+     NOTE: Red Hat Linux 7.2 and later include a new API that allows
+     serial-port arbitration by non-setuid/gid programs. This API has
+     not yet been added to C-Kermit. If C-Kermit is to be used for
+     dialing out on Red Hat 7.2 or later, it must still be installed as
+     described in this section and the next. 
+
+   The short version:
+
+     In order for C-Kermit to be able to dial out from your Unix
+     computer, you need to give it the same owner, group, and
+     permissions as your other dialout programs, such as cu, tip,
+     minicom, uucp, seyon, etc.
+
+   The long version:
+
+   Make sure your dialout line is correctly configured for dialing out
+   (as opposed to login). The method for doing this is different for each
+   kind of Unix. Consult your system documentation for configuring lines
+   for dialing out (for example, Sun SPARCstation IPC users should read
+   the section "Setting up Modem Software" in the Desktop SPARC Sun
+   System and Network Manager's Guide, or the Terminals and Modems
+   section of the HP manual, "Configuring HP-UX for Peripherals" (e.g.
+   /usr/sbin/sam => Peripheral Devices => Terminals and Modems => Add
+   Modem).
+
+   Unlike most other multiuser, multitasking operating systems, Unix
+   allows multiple users to access the same serial device at the same
+   time, even though there is no earthly reason why two users should do
+   this. When they do, user A will read some of the incoming characters,
+   and user B will read the others. In all likelihood, neither user will
+   see them all. Furthermore, User B can hang up User A's call, etc.
+
+   Rather than change Unix to enforce exclusive access to serial devices
+   such as ttys, Unix developers chose instead to use a "lock file". Any
+   process that wants to open a tty device should first check to see if a
+   file of a certain name exists, and if so, not to open the device. If
+   the file does not exist, the process creates the file and then opens
+   the device. When the process closes the device, it destroys the
+   lockfile. This procedure was originated for use with Unix's UUCP, CU,
+   and TIP programs, and so these lockfiles are commonly called "UUCP
+   lockfiles" (UUCP = Unix-to-Unix Copy Program).
+
+   As you can imagine, this method is riddled with pitfalls:
+
+     * If a process does not observe the prevailing lockfile convention,
+       then it can interfere with other "polite" processes. And in fact,
+       very few Unix applications or commands handle lockfiles at all; an
+       original design goal of Unix was that "everything is a file", and
+       countless utilities operate on files directly (by opening them) or
+       indirectly through redirection of standard i/o, without creating
+       or looking for lockfiles.
+     * If a process crashes while it has the device open, the lockfile is
+       left behind, preventing further processes from using the device.
+     * Various versions of Unix use different names for the lockfiles,
+       put them in different directories, with different owners and
+       groups and permissions, and specify their contents differently.
+     * On a given platform, the lockfile conventions may change from one
+       Unix release to the next (for example, SunOS 4.0 to 4.1) or, in
+       the case of Linux, across different distributions.
+     * The same tty device might have more than one name, and most
+       lockfile conventions don't allow for this. Similarly for symbolic
+       links.
+
+   In an attempt to address the problem of "stale" lockfiles, most UUCP
+   implementations put the PID (Process ID) of the creating process in
+   the lockfile. Thus, another process that wants to open the
+   corresponding device can check not only for the lockfile itself, but
+   also can check the PID for validity. But this doesn't work well
+   either:
+
+     * PIDs are stored in diverse formats that change with every new
+       release (short, integer, long, or string in any of various
+       formats). If the reading program does not follow the same
+       convention as the writing program, it can diagnose a valid PID to
+       be invalid, and therefore not honor the lock.
+     * PIDs recycle. If the lockfile was created by PID 1234, which later
+       crashed without removing the lockfile, and then a new process 1234
+       exists a the time the lockfile is checked, the lockfile will be
+       improperly taken as valid, and access to the device denied
+       unnecessarily.
+
+   Several techniques address the problem of multiple names for the same
+   device:
+
+     * Multiple lockfiles. For example, if the user opens a device
+       through a symlink, a lockfile is created for both the symlink name
+       and the true name (obtained from readlink()). However, when
+       multiple drivers are installed for the same device (e.g. /dev/cua,
+       /dev/cufa, etc), this approach won't work unless all applications
+       *know* all the different names for the same device and make
+       lockfiles for all of them, which is obviously not practical.
+     * Lockfiles whose names are not based on the device name. These
+       lockfiles generally have names like LK.inode/major/minor, where
+       inode, major, and minor are numbers, which will always be the same
+       for any physical device, no matter what its name. This form of
+       lockfile is used in System V R4 and its derivatives, such as
+       Solaris, UnixWare, etc. If lockfiles must be used (as opposed to,
+       say, kernel-based locks), this would seem to be the most effective
+       form.
+
+   Most versions of Unix were not designed to accommodate third-party
+   communications software; thus vendors of these Unix products feel no
+   compunction about changing lockfile conventions from release to
+   release, since they also change their versions of the cu, uucp, tip,
+   etc, programs at the same time to match. And since the source code to
+   these programs might not be published, it is difficult for makers of
+   third-party products like C-Kermit to find out what the new
+   conventions are. It also forces release of new versions of C-Kermit
+   whenever the OS vendor makes a change like this.
+
+   Some Unix vendors have taken a small step to simplify communications
+   application development for their products: the inclusion of lockfile
+   routines in the standard system C runtime libraries to shield the
+   application from the details of lockfile management (IBM AIX is an
+   example). When such routines are used, communications applications do
+   not need modification when lockfile conventions change (although they
+   will need recompiling if the routines are statically linked into the
+   application). In the AIX example, the simple function calls ttylock(),
+   ttyunlock(), and ttylocked() replace hundreds of lines of ugly code in
+   C-Kermit that attempts to keep pace with every release of every Unix
+   product over the last 20 years. Inclusion of ttylock() code occurs
+   when:
+
+-DUSETTYLOCK
+
+   is included in the CFLAGS.
+
+   If such routines are available, they should be used. The rest of this
+   section applies when they are not.
+
+   To fit in with UUCP and other Unix-based communication software,
+   C-Kermit must have the same idea as your system's uucp, cu, and tip
+   programs about what the UUCP lock directory is called, what the
+   lockfile itself is called, and what its contents should be. In most
+   cases, C-Kermit preprocessor flags create the appropriate
+   configuration at compile time if the appropriate makefile target was
+   used (see [315]ckutio.c). The following CFLAGS options can be used to
+   override the built-in configuration:
+
+   -DLCKDIR
+          Tells Kermit that the UUCP lock directory is
+          /usr/spool/uucp/LCK.
+
+   -DACUCNTRL
+          Tells Kermit to use the BSD 4.3 acucntrl() program to turn off
+          getty (login) on the line before using it, and restore getty
+          when done.
+
+   -DHDBUUCP
+          Include this if your system uses Honey DanBer UUCP, in which
+          the lockfile directory and format are relatively standardized.
+
+   -DLOCK_DIR=\\\"/xxx/yyy\\\"
+          Gives the lock directory name explicitly. The triple quoting is
+          necessary. For example:
+
+CFLAGS= -DBSD4 -DLOCK_DIR=\\\"/usr/local/locks\\\" -DNODEBUG
+
+          (NOTE: The triple quoting assumes this is a "top-level" make
+          entry, and not a make entry that calls another one.)
+
+   -DLFDEVNO The lockfile name uses the tty device inode and major and
+          minor
+          numbers: LK.dev.maj.min, as in Sys V R4, e.g. LK.035.044.008.
+
+   When the LK.inode.major.minor form is used, a single lockfile is
+   enough. Otherwise, a single lockfile rarely suffices. For example, in
+   Linux, it is common to have a /dev/modem symbolic link to an actual
+   dialout device, like /dev/cua0 or /dev/ttyS0, whose purpose is to hide
+   the details of the actual driver from the user. So if one user opens
+   /dev/modem, a lockfile called LCK..modem is created, which does not
+   prevent another user from simulataneously opening the same device by
+   its real name.
+
+   On SCO Unix platforms, we have a slightly different problem: the same
+   device is, by convention, known by "lowercase" and "uppercase" names,
+   depending on whether it has modem control. So by convention,
+   communications programs are supposed to create the lockfiles based on
+   the lowercase name. But some programs don't follow this convention. In
+   HP-UX, we have several different names for each serial device. And so
+   on.
+
+   For this reason, on platforms where the LK.inode.major.minor form is
+   not used, C-Kermit also creates a secondary lockfile (which is simply
+   a link to the first) if:
+
+    a. The given device name is a symbolic link. The secondary link is
+       based on the device's real name.
+    b. On SCO: The device name is not a symbolic link, but it contains
+       uppercase letters. The primary link is based on the lowercase
+       name; the secondary link is based on the name that was given.
+    c. On HP-UX: The device name starts with "cu". The primary link is
+       based on the name that was given; the secondary link is based on
+       the corresponding "ttyd" device, e.g. "LCK..cua0p0" and
+       "LCK..ttyd0p0".
+
+   NOTE: symlinks are not handled in HP-UX.
+
+   Honey DanBer (HDB) UUCP, which is becoming increasingly popular, has
+   two characteristics:
+
+    a. Lockfiles are kept in /usr/spool/locks/ (usually).
+    b. A lockfile contains the process id (pid) in ASCII, rather than as
+       an int.
+
+   Non-HDB selections assume the lockfile contains the pid in int form
+   (or, more precisely, in PID_T form, where PID_T is either int or
+   pid_t, depending on your system's C library and header files). (b), by
+   the way, is subject to interpretation: the numeric ASCII string may or
+   may not be terminated by a newline, it may or may not have leading
+   spaces (or zeros), and the number of leading spaces or zeros can
+   differ, and the differences can be significant.
+
+   Even if you build the program with the right lockfile option, you can
+   still have problems when you try to open the device. Here are the
+   error messages you can get from SET LINE, and what they mean:
+
+    a. "Timed out, no carrier." This one is not related to lockfiles. It
+       means that you have SET CARRIER ON xx, where xx is the number of
+       seconds to wait for carrier, and carrier did not appear within xx
+       seconds. Solution: SET CARRIER AUTO or OFF.
+    b. "Sorry, access to lock denied." Kermit has been configured to use
+       lockfiles, but (a)the lockfile directory is write-protected
+       against you, or (b) it does not exist. The "access to lock denied"
+       message will tell you the reason. If the directory does not exist,
+       check to make sure Kermit is using the right name. Just because
+       version n of your Unix used a certain lockfile directory is no
+       gurantee that version n.1 does not use a different one.
+       Workaround: ask the system administrator to install a symbolic
+       link from the old name to the new name. Other solutions: (see
+       below)
+    c. "Sorry, access to tty device denied." The tty device that you
+       specified in your SET LINE command is read/write protected against
+       you. Solution: (see below)
+    d. "Sorry, device is in use." The tty device you have specified is
+       currently being used by another user. A prefatory message gives
+       you an "ls -l" listing of the lockfile, which should show the
+       username of the person who created it, plus a message "pid = nnn"
+       to show you the process id of the user's program. Solutions: try
+       another device, wait until the other user is finished, ask the
+       other user to hurry up, or ask the system manager for help.
+    e. "Sorry, can't open connection: reason". The device cannot be
+       opened for some other reason, which is listed.
+    f. "sh: /usr/lib/uucp/acucntrl: not found". This means your Kermit
+       program was built with the -DACUCNTRL switch, but your computer
+       system does not have the BSD 4.3 acucntrl program. Solution:
+       install the acucntrl program if you have it, or rebuild Kermit
+       without the -DACUCNTRL switch.
+
+   There are two solutions for problems (b) and (c), both of which
+   involve intervention by your Unix system administrator (superuser):
+
+    a. Have the superuser change the permission of the lockfile directory
+       and to the tty devices so that everyone on the system has
+       read/write permission.
+
+su% chmod 777 /usr/spool/locks (or whatever the path is)
+su% chmod 666 /dev/ttyXX
+
+       One risk here is that people can write lots of junk into the
+       lockfile directory, delete other people's files in the lockfile
+       directory, and intercept other people's data as it goes in and out
+       of the tty device. The major danger here would be intercepting a
+       privileged password. Of course, any user could write a short,
+       ordinary, unprivileged program to do exactly the same thing if the
+       tty device was world read/writeable. The other risk as that
+       telephone calls are not controlled -- anybody on your system can
+       make them, without having to belong to any particular group, and
+       this could run up your phone bill.
+    b. Use groups to regulate access. Normally the lockfile directory and
+       and the dialout devices will have the same group (such as uucp).
+       If so, then put everybody who's allowed to dial out into that
+       group, and make sure that the lockfile directory and the tty
+       devices have group read AND write permission. Example:
+
+su% chmod 770 /usr/spool/locks (or whatever the path is)
+su% chmod 660 /dev/ttyXX
+
+       User whatever tool is available on your platform to add users to
+       the appropropriate group (e.g. edit the /etc/group file).
+    c. Have the superuser change Kermit to run setuid and/or setgid to
+       the owner and/or group of the lockfile directory and the tty
+       devices if necessary), typically uucp (see [316]next section), but
+       NOT root. Example:
+
+su% chown uucp kermit          - or -  chgrp uucp kermit
+su% chmod u+s kermit (setuid)  - or -  chmod g+s kermit (setgid)
+
+       and then make sure the lockfile directory, and the tty devices,
+       have owner (setuid) and/or group (setgid) write permission. For
+       example:
+
+su% chmod o+rwx /usr/spool/uucp
+su% chown uucp /dev/ttyXX ; chmod 600 /dev/ttyXX
+
+       In some cases, the owner and group must be distinct; the key point
+       is that read/write access is required to both the UUCP lockfile
+       directory and the tty itself.
+
+   If you make C-Kermit setuid or setgid to root, it refuses to run:
+
+Fatal: C-Kermit setuid to root!
+
+   Example:
+
+crw-r-----   1 uucp     uucp       5,  67 Feb 11 06:23 /dev/cua3
+drwxrwxr-x   3 root     uucp         1024 Feb 11 06:22 /var/lock
+
+   requires suid uucp to get read/write access on /dev/cua3 and sgid to
+   get read/write access on /var/lock (since you can't set Kermit's uid
+   or gid to root).
+
+     The reason Kermit can't be setuid or setgid to root has to do with
+     the fact that some Unix OS's can't switch user or group IDs in that
+     case. Unfortunately, the prohibition against making Kermit setuid
+     or setgid to root means that Unix C-Kermit can't be used to make
+     rlogin connections by non-root users. (The rlogin port is
+     privileged, which is why the regular rlogin command is setuid root
+     -- which is safe because the rlogin program never has to create or
+     access files like Kermit does.)
+
+   For the lockfile mechanism to achieve its desired purpose --
+   prevention of access to the same tty device by more than one process
+   at a time -- ALL programs on a given computer that open, read or
+   write, and close tty devices must use the SAME lockfile conventions.
+   Unfortunately, this is often not the case. Here is a typical example
+   of how this can go wrong: In SunOS 4.0 and earler, the lockfile
+   directory was /usr/spool/uucp; in 4.1 it was changed to
+   /var/spool/locks in the quest for political correctness. Consequently,
+   any third-party programs (such as C-Kermit) that were not modified to
+   account for this change, recompiled, and reinstalled, did not use the
+   same lockfiles as uucp, tip, etc, and so the entire purpose of the
+   lockfile is defeated.
+
+   What if your Unix system does not have UUCP installed? For example,
+   you have a Unix workstation, and you do not use uucp, cu, or tip, or
+   UUCP was not even supplied with your version of Unix (QNX is an
+   example). In this case, you have two choices:
+
+    a. If there may be more than one person running Kermit at the same
+       time, competing for the same tty device, then create a special
+       lockfile directory just for Kermit, for example,
+       /usr/spool/kermit, and make sure you have read/write access to it.
+       Then add the following to your makefile target CFLAGS, as shown
+       earlier:
+
+-DLOCK_DIR=\\\"/usr/spool/kermit\\\"
+
+    b. If you are the only user on your workstation, and no other
+       processes will ever be competing with Kermit for the dialout tty
+       device, then add -DNOUUCP to your makefile target's CFLAGS and
+       rebuild Kermit.
+  __________________________________________________________________________
+
+11. RUNNING UNIX C-KERMIT SETUID OR SETGID
+
+   [ [317]Top ] [ [318]Contents ] [ [319]Next ] [ [320]Previous ]
+
+   Even if you don't intend to run C-Kermit setuid, somebody else might
+   come along and chown and chmod it after it has been built. You should
+   be sure that it is built correctly to run setuid on your system. For
+   POSIX and AT&T Unix based versions, you don't have to do anything
+   special.
+
+   For 4.2 and 4.3 BSD-based Unix versions, you normally need not add
+   anything special to the makefile. The program assumes that the
+   setreuid() and setregid() functions are available, without which we
+   cannot switch back and forth between real and effective uids. If
+   "make" complains that _setreuid or _setregid is/are not defined, add
+   -DNOSETREU to CFLAGS. In this case it is very likely (but not certain)
+   that you cannot protect ttys and lockfiles against people and have
+   them run Kermit setuid.
+
+   If make does not complain about this, you should find out whether your
+   BSD version (4.3 or other systems like SunOS 4.x that claim to include
+   BSD 4.3 compatibility) includes the saved-setuid feature (see long
+   notes under edit 146 in ckc178.upd). If it does, then add -DSAVEDUID
+   to CFLAGS.
+
+     IMPORTANT NOTE: Most Unix system documentation will not give you
+     the required information. To determine whether your Unix system
+     supplies the the saved-original-effective-user/group-id feature,
+     use the ckuuid.c program. Read and follow the instructions in the
+     comments at the beginning.
+
+   C-Kermit for 4.4BSD-based systems automatically use sete[ug]id(). See
+   [321]ckutio.c.
+
+   If you have a version of Unix that is not BSD-based, but which
+   supplies the setreuid() and setregid() functions, and these are the
+   only way to switch between real and effective uid, add -DSETREUID to
+   your makefile target.
+
+     WARNING: There are two calls to access() in [322]ckufio.c, by which
+     Kermit checks to see if it can create an output file. These calls
+     will not work correctly when (a)you have installed C-Kermit setuid
+     or setgid on a BSD-based Unix system, and (b) the
+     saved-original-effective-uid/gid feature is not present, and (c)
+     the access() function always checks what it believes to be the real
+     ID rather than the effective ID. This is the case, for example, in
+     Olivetti X/OS and in NeXTSTEP. In such cases, you can force correct
+     operation of access() calls by defining the symbol SW_ACC_ID at
+     compile time in CFLAGS.
+
+   If you have a version of Unix that does not allow a process to switch
+   back and forth between its effective and real user and group ids
+   multiple times, you probably should not attempt to run Kermit setuid,
+   because once having given up its effective uid or gid (which it must
+   do in order to transfer files, fork a shell, etc) it can never get it
+   back, and so it can not use the original effective uid or gid to
+   create or delete uucp lockfiles. In this case, you'll either have to
+   set the permissions on your lockfile directory to make them publicly
+   read/writable, or dispense with locking altogether.
+
+   MORAL: Are you thoroughly sickened and/or frightened by all that you
+   have just read? You should be. What is the real answer? Simple. Serial
+   devices -- such as ttys and magnetic tapes -- in Unix should be opened
+   with exclusive access only, enforced by the Unix kernel. Shared access
+   has no conceivable purpose, legitimate or otherwise, except by
+   privileged system programs such as getty. The original design dates
+   from the late 1960s, when Unix was developed for laboratory use under
+   a philosophy of trust by people within shouting distance of each other
+   -- but even then, no useful purpose was served by this particular form
+   of openness; it was probably more of a political statement. Since the
+   emergence of Unix from the laboratory into the commercial market, we
+   have seen every vestige of openness -- but this one -- stripped away.
+   I'd like to see some influential Unix maker take the bold step of
+   making the simple kernel change required to enforce exclusive access
+   to serial devices. (Well, perhaps not so simple when bidirectionality
+   must also be a goal -- but then other OS's like VMS solved this
+   problem decades ago.)
+  __________________________________________________________________________
+
+12. CONFIGURING UNIX WORKSTATIONS
+
+   [ [323]Top ] [ [324]Contents ] [ [325]Next ] [ [326]Previous ]
+
+   On desktop workstations that are used by only the user at the console
+   keyboard, C-Kermit is always used in local mode. But as delivered,
+   C-Kermit runs in remote mode by default. To put it in local mode at
+   startup, you can put a SET LINE command in your .mykermrc.
+
+   You can also build C-Kermit to start up in local mode by default. To
+   do this, include the following in the CFLAGS in your makefile target:
+
+-DDFTTY=\\\"/dev/ttyxx\\\"
+
+   where ttyxx is the name of the device you will be using for
+   communications. Presently there is no way of setting the default modem
+   type at compile time, so use this option only for direct lines.
+
+   C-Kermit does not work well on certain workstations if it is not run
+   from within a terminal window. For example, you cannot start C-Kermit
+   on a NeXT by launching it directly from NeXTstep. Similarly for Sun
+   workstations in the Open Windows environment. Run Kermit in a terminal
+   window.
+  __________________________________________________________________________
+
+13. BIZARRE BEHAVIOR AT RUNTIME
+
+   [ [327]Top ] [ [328]Contents ] [ [329]Next ] [ [330]Previous ]
+
+   See the "beware file",
+
+   [331]ckubwr.txt, for hints about runtime misbehavior. This section
+   lists some runtime problems that can be cured by rebuilding C-Kermit.
+
+   The program starts, but there is no prompt, and certain operations
+   don't work (you see error messages like "Kermit command error in
+   background execution"). This is because Kermit thinks it is running in
+   the background. See conbgt() in [332]ckutio.c. Try rebuilding Kermit
+   with:
+
+ -DPID_T=pid_t
+
+   added to your CFLAGS. If that doesn't help, find out the actual data
+   type for pids (look in types.h or similar file) and use it in place of
+   "pid_t", for example:
+
+ -DPID_T=short
+
+   Unexplainable and inappropriate error messages ("Sockets not supported
+   on this device", etc) have been traced in at least one case to a lack
+   of agreement between the system header files and the actual kernel.
+   This happened because the GNU C compiler (gcc) was being used. gcc
+   wants to have ANSI-C-compliant header files, and so part of the
+   installation procedure for gcc is (or was) to run a shell script
+   called "fixincludes", which translates the system's header files into
+   a separate set of headers that gcc likes. So far so good. Later, a new
+   version of the operating system is installed and nobody remembers to
+   run fixincludes again. From that point, any program compiled with gcc
+   that makes use of header files (particularly ioctl.h) is very likely
+   to misbehave. Solution: run fixincludes again, or use your system's
+   regular C compiler, libraries, and header files instead of gcc.
+  __________________________________________________________________________
+
+14. CRASHES AND CORE DUMPS
+
+   [ [333]Top ] [ [334]Contents ] [ [335]Next ] [ [336]Previous ]
+
+   If C-Kermit constitently dumps core at the beginning of a file
+   transfer, look in SHOW FEATURES for CKREALPATH. If found, rebuild with
+   -DNOREALPATH and see if that fixes the problem (some UNIXes have
+   realpath() but it doesn't work).
+
+   Total failure of the Kermit program can occur because of bad memory
+   references, bad system calls, or problems with dynamic memory
+   allocation. First, try to reproduce the problem with debugging turned
+   on: run Kermit with the -d command-line option (for example, "wermit
+   -d") and then examine the resulting debug.log file. The last entry
+   should be in the vicinity of the crash. In VMS, a crash automatically
+   produces a "stack dump" which shows the routine where the crash
+   occurs. In some versions of Unix, you can get a stack dump with "adb"
+   -- just type "adb wermit core" and then give the command "$c", then
+   Ctrl-D to quit (note: replace "wermit" by "kermit" or by the full
+   pathname of the executable that crashed if it is not in the current
+   directory). Or use gdb to get a backtrace, etc.
+
+   In edit 186, one implementation, UNISYS 5000/95 built with "make
+   sys5r3", has been reported to run out of memory very quickly (e.g.
+   while executing a short initialization file that contains a SET DIAL
+   DIRECTORY command). Debug logs show that malloc calls are failing,
+   reason unknown. For this and any other implementation that gives error
+   messages about "malloc failure" or "memory allocation failure",
+   rebuild the program *without* the -DDYNAMIC CFLAGS definition, for
+   example:
+
+make sys5r3 KFLAGS=-UDYNAMIC
+
+   As of edit 169, C-Kermit includes a malloc() debugging package which
+   you may link with the Kermit program to catch runtime malloc errors.
+   See the makefile entries for sunos41md and nextmd for examples of how
+   to select malloc debugging. Once you have linked Kermit with the
+   malloc debugger, it will halt with an informative message if a
+   malloc-related error occurs and, if possible, dump core. For this
+   reason, malloc-debugging versions of Kermit should be built without
+   the "-s" link option (which removes symbols, preventing analysis of
+   the core dump). You have several ways to track down the malloc error:
+   Analyze the core dump with adb. Or reproduce the problem with "log
+   debug" and then look at the code around the last debug.log entry. If
+   you have gcc, build the program with "-g" added to CFLAGS and then
+   debug it with gdb, e.g.
+
+gdb wermit
+break main
+run
+.. set other breakpoints or watchpoints
+continue
+
+   Watchpoints are especially useful for finding memory leaks, but they
+   make the program run about a thousand times slower than usual, so
+   don't set them until the last possible moment. When a watchpoint is
+   hit, you can use the "where" command to find out which C-Kermit source
+   statement triggered it.
+
+   If you have the Pure Software Inc "Purify" product, see the sunos41cp
+   makefile entry for an example of how to use it to debug C-Kermit.
+  __________________________________________________________________________
+
+15. SYSLOGGING
+
+   [ [337]Top ] [ [338]Contents ] [ [339]Next ] [ [340]Previous ]
+
+   "Syslogging" means recording selected in the system log via the Unix
+   syslog() facility, which is available in most Unix versions.
+   Syslogging is not done unless C-Kermit is started with:
+
+--syslog:n
+
+   on the command-line, where n is a number greater than 0 to indicate
+   the level of syslogging. See [341]Section 4.2 of the [342]IKSD
+   Administrator's Guide for details.
+
+   Obviously you can't depend on users to include --syslog:3 (or
+   whatever) on the command line every time they start C-Kermit, so if
+   you want certain kinds of records to be recorded in the system log,
+   you can build C-Kermit with forced syslogging at the desired level,
+   e.g.:
+
+make linux KFLAGS=-DSYSLOGLEVEL=2
+
+   Levels 2 and 3 are the most likely candidates for this treatment.
+   Level 2 forces logging of all successful dialout calls (e.g. for
+   checking against or phone bills), and level 3 records all connections
+   (SET LINE or SET HOST / TELNET / RLOGIN, etc) so you can see who is
+   connecting out from your system, and to where.
+
+   Level 2 and 3 records are equivalent to those in the connection log;
+   see the [343]C-Kermit 7.0 Supplement) for a detailed description of
+   the connection log.
+  __________________________________________________________________________
+
+16. BUILDING SECURE VERSIONS OF C-KERMIT 8.0
+
+   [ [344]Top ] [ [345]Contents ] [ [346]Next ] [ [347]Previous ]
+
+   C-Kermit 7.0 and later may be built with Kerberos(TM) and/or SRP(TM)
+   (Secure Remote Password) and/or SSL/TLS security for strong
+   authentication and encryption of Internet connections. These security
+   methods require external libraries that, in their binary forms, are
+   restricted from export by USA law. See the [348]Kermit Security
+   Reference) for details. C-Kermit binaries themselves are likewise
+   restricted; the C-Kermit binaries that are available for public
+   download on the Internet are not allowed to contain the security
+   options.
+
+   Sample makefile entries are provided for Linux and many other
+   operating systems. A list of secure makefile entries is included in
+   the Makefile. Complete instructions on building C-Kermit 8.0 with MIT
+   Kerberos; Secure Remote Password; and/or OpenSSL can be found in the
+   [349]Kermit Security Reference.
+
+   C-Kermit 8.0 comes with a current list of Certificate Authority
+   certificates, including one for the Kermit Project that can be used
+   for authentication to Columbia's [350]Internet Kermit Service (IKSD).
+   You can use C-Kermit 7.0 or later to access Columbia's IKSD securely
+   by installing the Kermit Project certificate in
+   /usr/local/ssl/cert.pem (or the appropriate location based upon the
+   installation of OpenSSL on your system). You can find a copy of the
+   certificates file at:
+
+[351]ftp://kermit.columbia.edu/kermit/c-kermit/ca_certs.pem
+  __________________________________________________________________________
+
+17. INSTALLING C-KERMIT AS AN SSH SERVER SUBSYSTEM
+
+   [ [352]Top ] [ [353]Contents ] [ [354]Previous ]
+
+   This requires C-Kermit 8.0.206 or later and an SSH v2 server. If you
+   list C-Kermit as a Subsystem in the SSH v2 server configuration file
+   (as, for example, SFTP is listed), users can make SSH connections
+   direct to a Kermit server as explained here:
+
+[355]http://www.columbia.edu/kermit/skermit.html
+
+   The name and location of the SSH server configuration file depends on
+   your platform, which SSH product(s) you have, etc. C-Kermit itself
+   must be referred to in this file as "kermit-sshsub". On the host,
+   install the C-Kermit 8.0.211 binary in the normal way. Then, in the
+   same directory as the C-Kermit binary, make a symbolic link:
+
+ln -s kermit kermit-sshsub
+
+   (Note: the "make install" makefile target does this for you.) Then in
+   the sshd configuration file, add a line:
+
+Subsystem  kermit   /some/path/kermit-sshsub
+
+   (where /some/path is the fully specified directory where the symlink
+   is.) This is similar to the line that sets up the SFTP susbsystem.
+   Example:
+
+Subsystem   sftp    /usr/local/libexec/sftp-server
+Subsystem   kermit  /usr/local/bin/kermit-sshsub
+
+   The mechanics might vary for other SSH servers; "man sshd" for
+   details. The method shown here is used because the OpenSSH server does
+   not permit the subsystem invocation to include command-line options.
+   C-Kermit would have no way of knowing that it should enter Server mode
+   if it were not called by a special name.
+
+   [ [356]Top ] [ [357]Contents ] [ [358]C-Kermit Home ] [ [359]C-Kermit
+   8.0 Overview ] [ [360]Kermit Home ]
+     _________________________________________________________________
+
+
+    C-Kermit 8.0 Unix Installation Instructions / The Kermit Project /
+    Columbia University / 10 April 2004
+
+References
+
+   1. http://www.columbia.edu/kermit/ckuins.html#contents
+   2. http://www.columbia.edu/kermit/ckermit.html
+   3. http://www.columbia.edu/kermit/index.html
+   4. http://www.columbia.edu/kermit/ckuins.html
+   5. http://www.columbia.edu/kermit/ckuins.html#x0
+   6. http://www.columbia.edu/kermit/ckuins.html#x1
+   7. http://www.columbia.edu/kermit/ckuins.html#x2
+   8. http://www.columbia.edu/kermit/ckuins.html#x3
+   9. http://www.columbia.edu/kermit/ckuins.html#x4
+  10. http://www.columbia.edu/kermit/ckuins.html#x5
+  11. http://www.columbia.edu/kermit/ckuins.html#x6
+  12. http://www.columbia.edu/kermit/ckuins.html#x7
+  13. http://www.columbia.edu/kermit/ckuins.html#x8
+  14. http://www.columbia.edu/kermit/ckuins.html#x9
+  15. http://www.columbia.edu/kermit/ckuins.html#x10
+  16. http://www.columbia.edu/kermit/ckuins.html#x11
+  17. http://www.columbia.edu/kermit/ckuins.html#x12
+  18. http://www.columbia.edu/kermit/ckuins.html#x13
+  19. http://www.columbia.edu/kermit/ckuins.html#x14
+  20. http://www.columbia.edu/kermit/ckuins.html#x15
+  21. http://www.columbia.edu/kermit/ckuins.html#x16
+  22. http://www.columbia.edu/kermit/ckuins.html#x16
+  23. http://www.columbia.edu/kermit/ckuins.html#top
+  24. http://www.columbia.edu/kermit/ckuins.html#contents
+  25. http://www.columbia.edu/kermit/ckuins.html#x1
+  26. http://www.columbia.edu/kermit/ckccfg.html
+  27. http://www.columbia.edu/kermit/ckcbwr.html
+  28. http://www.columbia.edu/kermit/ckubwr.html
+  29. http://www.columbia.edu/kermit/ckcplm.html
+  30. http://www.columbia.edu/kermit/ckuins.html#x2
+  31. http://www.columbia.edu/kermit/x3
+  32. http://www.columbia.edu/kermit/ckuins.html#x4
+  33. http://www.columbia.edu/kermit/ckuins.html#top
+  34. http://www.columbia.edu/kermit/ckuins.html#contents
+  35. http://www.columbia.edu/kermit/ckuins.html#x2
+  36. http://www.columbia.edu/kermit/ckuins.html#x0
+  37. ftp://kermit.columbia.edu/kermit/archives/cku211.tar.Z
+  38. ftp://kermit.columbia.edu/kermit/archives/cku211.tar.gz
+  39. ftp://kermit.columbia.edu/kermit/archives/cku211.tar
+  40. http://www.columbia.edu/kermit/ckuins.html#x7
+  41. http://www.columbia.edu/kermit/ckuins.html#x5
+  42. http://www.columbia.edu/kermit/ckuins.html#x5
+  43. http://www.columbia.edu/kermit/ckuins.html#x16
+  44. http://www.columbia.edu/kermit/ckuins.html#top
+  45. http://www.columbia.edu/kermit/ckuins.html#contents
+  46. http://www.columbia.edu/kermit/ckuins.html#x3
+  47. http://www.columbia.edu/kermit/ckuins.html#x1
+  48. http://www.columbia.edu/kermit/ckuins.html#x5
+  49. http://www.columbia.edu/kermit/ckuins.html#X10
+  50. http://www.columbia.edu/kermit/ckuins.html#x11
+  51. http://www.columbia.edu/kermit/ckuins.html#x10
+  52. http://www.columbia.edu/kermit/ckuins.html#x3
+  53. http://www.columbia.edu/kermit/ck80packages.html
+  54. http://www.columbia.edu/kermit/ckuins.html#x10
+  55. http://www.columbia.edu/kermit/ckuins.html#top
+  56. http://www.columbia.edu/kermit/ckuins.html#contents
+  57. http://www.columbia.edu/kermit/ckuins.html#x4
+  58. http://www.columbia.edu/kermit/ckuins.html#x2
+  59. ftp://kermit.columbia.edu/kermit/bin/
+  60. http://www.columbia.edu/kermit/ck80binaries.html
+  61. http://www.columbia.edu/kermit/ckuins.html#x7
+  62. http://www.columbia.edu/kermit/ckuins.html#build
+  63. http://www.columbia.edu/kermit/ckuins.html#x5
+  64. http://www.columbia.edu/kermit/ckuins.html#x4
+  65. http://www.columbia.edu/kermit/ckuins.html#x4
+  66. mailto:kermit@columbia.edu
+  67. http://www.columbia.edu/kermit/ckuins.html#top
+  68. http://www.columbia.edu/kermit/ckuins.html#contents
+  69. http://www.columbia.edu/kermit/ckuins.html#x5
+  70. http://www.columbia.edu/kermit/ckuins.html#x3
+  71. http://www.columbia.edu/kermit/ckuins.html#x8
+  72. http://www.columbia.edu/kermit/ckuins.html#x9
+  73. ftp://kermit.columbia.edu/kermit/c-kermit/makefile
+  74. ftp://kermit.columbia.edu/kermit/c-kermit/ckpker.mk
+  75. ftp://kermit.columbia.edu/kermit/c-kermit/ckubsd.mak
+  76. http://www.columbia.edu/kermit/ckuins.html#x5
+  77. mailto:kermit-support@columbia.edu
+  78. ftp://kermit.columbia.edu/kermit/c-kermit/makefile
+  79. http://www.columbia.edu/kermit/ckuins.html#x7
+  80. mailto:kermit-support@columbia.edu
+  81. ftp://kermit.columbia.edu/kermit/c-kermit/makefile
+  82. http://www.columbia.edu/kermit/ckuins.html#x5.4
+  83. http://www.columbia.edu/kermit/ckuins.html#x10
+  84. http://www.columbia.edu/kermit/ckuins.html#x11
+  85. http://www.columbia.edu/kermit/ckuins.html#x5
+  86. http://www.columbia.edu/kermit/iksd.html
+  87. http://www.columbia.edu/kermit/ckuins.html#top
+  88. http://www.columbia.edu/kermit/ckuins.html#contents
+  89. http://www.columbia.edu/kermit/ckuins.html#x4.1
+  90. http://www.columbia.edu/kermit/ckccfg.html
+  91. http://www.columbia.edu/kermit/ckuins.html#x4.1
+  92. http://www.columbia.edu/kermit/ckuins.html#x4.2
+  93. http://www.columbia.edu/kermit/ckuins.html#x4.3
+  94. http://www.columbia.edu/kermit/ckuins.html#x4.4
+  95. http://www.columbia.edu/kermit/ckuins.html#x4.5
+  96. http://www.columbia.edu/kermit/ckccfg.html
+  97. http://www.columbia.edu/kermit/ckccfg.html#x8
+  98. http://www.columbia.edu/kermit/iksd.html
+  99. http://www.columbia.edu/kermit/iksd.html
+ 100. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c
+ 101. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c
+ 102. mailto:kermit-support@columbia.edu
+ 103. ftp://kermit.columbia.edu/kermit/c-kermit/ckcmai.c
+ 104. http://www.columbia.edu/kermit/ckuins.html#x15
+ 105. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 106. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c
+ 107. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 108. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c
+ 109. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.c
+ 110. ftp://kermit.columbia.edu/kermit/c-kermit/ckcnet.c
+ 111. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 112. ftp://kermit.columbia.edu/kermit/c-kermit/ckcuni.c
+ 113. mailto:kermit-support@columbia.edu
+ 114. http://www.columbia.edu/kermit/ckuins.html#top
+ 115. http://www.columbia.edu/kermit/ckuins.html#contents
+ 116. http://www.columbia.edu/kermit/ckuins.html#x4
+ 117. http://www.columbia.edu/kermit/ckuins.html#x4.2
+ 118. http://www.columbia.edu/kermit/ckuins.html#x4.0
+ 119. ftp://kermit.columbia.edu/kermit/c-kermit/makefile
+ 120. ftp://kermit.columbia.edu/kermit/c-kermit/ckubwr.txt
+ 121. http://www.columbia.edu/kermit/ckubwr.html
+ 122. ftp://kermit.columbia.edu/kermit/c-kermit/ckwart.c
+ 123. ftp://kermit.columbia.edu/kermit/c-kermit/ckcpro.w
+ 124. ftp://kermit.columbia.edu/kermit/c-kermit/ckcpro.c
+ 125. http://www.columbia.edu/kermit/ckuins.html#top
+ 126. http://www.columbia.edu/kermit/ckuins.html#contents
+ 127. http://www.columbia.edu/kermit/ckuins.html#x4
+ 128. http://www.columbia.edu/kermit/ckuins.html#x4.3
+ 129. http://www.columbia.edu/kermit/ckuins.html#x4.1
+ 130. http://www.columbia.edu/kermit/ckuins.html#x5
+ 131. http://www.columbia.edu/kermit/ckuins.html#top
+ 132. http://www.columbia.edu/kermit/ckuins.html#contents
+ 133. http://www.columbia.edu/kermit/ckuins.html#x4
+ 134. http://www.columbia.edu/kermit/ckuins.html#x4.4
+ 135. http://www.columbia.edu/kermit/ckuins.html#x4.2
+ 136. http://www.columbia.edu/kermit/ckuins.html#top
+ 137. http://www.columbia.edu/kermit/ckuins.html#contents
+ 138. http://www.columbia.edu/kermit/ckuins.html#x4
+ 139. http://www.columbia.edu/kermit/ckuins.html#x4.5
+ 140. http://www.columbia.edu/kermit/ckuins.html#x4.3
+ 141. ftp://kermit.columbia.edu/kermit/c-kermit/ckpker.mk
+ 142. http://www.columbia.edu/kermit/ckuins.html#top
+ 143. http://www.columbia.edu/kermit/ckuins.html#contents
+ 144. http://www.columbia.edu/kermit/ckuins.html#x4
+ 145. http://www.columbia.edu/kermit/ckuins.html#x4.4
+ 146. ftp://kermit.columbia.edu/kermit/c-kermit/makefile
+ 147. ftp://kermit.columbia.edu/kermit/c-kermit/makefile
+ 148. ftp://kermit.columbia.edu/kermit/c-kermit/ckcpro.w
+ 149. http://www.columbia.edu/kermit/ckuins.html#top
+ 150. http://www.columbia.edu/kermit/ckuins.html#contents
+ 151. http://www.columbia.edu/kermit/ckuins.html#x6
+ 152. http://www.columbia.edu/kermit/ckuins.html#x4
+ 153. http://www.columbia.edu/kermit/ckuins.html#x5.1
+ 154. http://www.columbia.edu/kermit/ckuins.html#x5.2
+ 155. http://www.columbia.edu/kermit/ckuins.html#x5.3
+ 156. http://www.columbia.edu/kermit/ckuins.html#x5.4
+ 157. http://www.columbia.edu/kermit/
+ 158. http://www.columbia.edu/kermit/ckuins.html#x5.4
+ 159. http://www.columbia.edu/kermit/ckuins.html#x5.3
+ 160. ftp://kermit.columbia.edu/kermit/c-kermit/COPYING.TXT
+ 161. ftp://kermit.columbia.edu/kermit/c-kermit/ckermit.ini
+ 162. http://www.columbia.edu/kermit/ckuins.html#x5.1
+ 163. ftp://kermit.columbia.edu/kermit/c-kermit/ckermod.ini
+ 164. ftp://kermit.columbia.edu/kermit/c-kermit/ckermit70.txt
+ 165. http://www.columbia.edu/kermit/ck60manual
+ 166. http://www.columbia.edu/kermit/ckermit70.html
+ 167. ftp://kermit.columbia.edu/kermit/c-kermit/ckermit80.txt
+ 168. http://www.columbia.edu/kermit/ck60manual
+ 169. http://www.columbia.edu/kermit/ckermit80.html
+ 170. ftp://kermit.columbia.edu/kermit/c-kermit/ckcbwr.txt
+ 171. http://www.columbia.edu/kermit/ckcbwr.html
+ 172. ftp://kermit.columbia.edu/kermit/c-kermit/ckubwr.txt
+ 173. http://www.columbia.edu/kermit/ckubwr.html
+ 174. ftp://kermit.columbia.edu/kermit/c-kermit/ckuins.txt
+ 175. http://www.columbia.edu/kermit/ckuins.html
+ 176. ftp://kermit.columbia.edu/kermit/c-kermit/ckccfg.txt
+ 177. http://www.columbia.edu/kermit/ckccfg.html
+ 178. ftp://kermit.columbia.edu/kermit/c-kermit/ckcplm.txt
+ 179. http://www.columbia.edu/kermit/ckcplm.html
+ 180. ftp://kermit.columbia.edu/kermit/c-kermit/ca_certs.pem
+ 181. http://www.columbia.edu/kermit/ckuins.html#x16"
+ 182. ftp://kermit.columbia.edu/kermit/c-kermit/makefile
+ 183. http://www.columbia.edu/kermit/ckuins.html#x?
+ 184. http://www.columbia.edu/kermit/ckuins.html#x11
+ 185. http://www.columbia.edu/kermit/ckuins.html#x5.2
+ 186. http://www.columbia.edu/kermit/ckermit.html#download
+ 187. http://www.columbia.edu/kermit/ck80binaries.html
+ 188. http://www.columbia.edu/kermit/ckermit.html#download
+ 189. http://www.columbia.edu/kermit/ckuins.html#top
+ 190. http://www.columbia.edu/kermit/ckuins.html#contents
+ 191. http://www.columbia.edu/kermit/ckuins.html#x7
+ 192. http://www.columbia.edu/kermit/ckuins.html#x5
+ 193. http://www.columbia.edu/kermit/ckuins.html#top
+ 194. http://www.columbia.edu/kermit/ckuins.html#contents
+ 195. http://www.columbia.edu/kermit/ckuins.html#x8
+ 196. http://www.columbia.edu/kermit/ckuins.html#x6
+ 197. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 198. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 199. http://www.columbia.edu/kermit/ckuins.html#x4.0
+ 200. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h
+ 201. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c
+ 202. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c
+ 203. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 204. http://www.columbia.edu/kermit/ckuins.html#x10
+ 205. http://www.columbia.edu/kermit/ckccfg.html#x2
+ 206. http://www.columbia.edu/kermit/ckccfg.html
+ 207. http://www.columbia.edu/kermit/ckuins.html#x4
+ 208. http://www.columbia.edu/kermit/ckuins.html#x10
+ 209. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 210. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 211. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 212. http://www.columbia.edu/kermit/ckuins.html#x9.4
+ 213. mailto:kermit-support@columbia.edu
+ 214. http://www.columbia.edu/kermit/ckuins.html#top
+ 215. http://www.columbia.edu/kermit/ckuins.html#contents
+ 216. http://www.columbia.edu/kermit/ckuins.html#x9
+ 217. http://www.columbia.edu/kermit/ckuins.html#x7
+ 218. http://www.columbia.edu/kermit/ckccfg.html
+ 219. http://www.columbia.edu/kermit/ckccfg.html
+ 220. http://www.columbia.edu/kermit/ckuins.html#top
+ 221. http://www.columbia.edu/kermit/ckuins.html#contents
+ 222. http://www.columbia.edu/kermit/ckuins.html#x10
+ 223. http://www.columbia.edu/kermit/ckuins.html#x8
+ 224. http://www.columbia.edu/kermit/ckuins.html#x9.1
+ 225. http://www.columbia.edu/kermit/ckuins.html#x9.1.1
+ 226. http://www.columbia.edu/kermit/ckuins.html#x9.1.2
+ 227. http://www.columbia.edu/kermit/ckuins.html#x9.1.3
+ 228. http://www.columbia.edu/kermit/ckuins.html#x9.2
+ 229. http://www.columbia.edu/kermit/ckuins.html#x9.3
+ 230. http://www.columbia.edu/kermit/ckuins.html#x9.4
+ 231. http://www.columbia.edu/kermit/ckuins.html#x9.5
+ 232. http://www.columbia.edu/kermit/ckuins.html#x9.6
+ 233. http://www.columbia.edu/kermit/ckuins.html#x9.7
+ 234. http://www.columbia.edu/kermit/ckuins.html#x9.8
+ 235. http://www.columbia.edu/kermit/ckuins.html#x9.9
+ 236. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 237. http://www.columbia.edu/kermit/ckuins.html#top
+ 238. http://www.columbia.edu/kermit/ckuins.html#x9
+ 239. http://www.columbia.edu/kermit/ckuins.html#contents
+ 240. http://www.columbia.edu/kermit/ckuins.html#x9.2
+ 241. http://www.columbia.edu/kermit/ckuins.html#x9.1.1
+ 242. http://www.columbia.edu/kermit/ckuins.html#x9.1.2
+ 243. http://www.columbia.edu/kermit/ckuins.html#x9.1.3
+ 244. http://www.columbia.edu/kermit/ckuins.html#top
+ 245. http://www.columbia.edu/kermit/ckuins.html#contents
+ 246. http://www.columbia.edu/kermit/ckuins.html#x9
+ 247. http://www.columbia.edu/kermit/ckuins.html#x9.1
+ 248. http://www.columbia.edu/kermit/ckuins.html#x9.1.3
+ 249. http://www.columbia.edu/kermit/ckuins.html#x9.1.1
+ 250. http://www.columbia.edu/kermit/ckuins.html#top
+ 251. http://www.columbia.edu/kermit/ckuins.html#contents
+ 252. http://www.columbia.edu/kermit/ckuins.html#x9
+ 253. http://www.columbia.edu/kermit/ckuins.html#x9.1
+ 254. http://www.columbia.edu/kermit/ckuins.html#x9.2
+ 255. http://www.columbia.edu/kermit/ckuins.html#x9.1.2
+ 256. http://www.opengroup.org/onlinepubs/007904975/
+ 257. http://www.columbia.edu/kermit/ckuins.html#x9.1.1
+ 258. http://www.columbia.edu/kermit/ckuins.html#top
+ 259. http://www.columbia.edu/kermit/ckuins.html#contents
+ 260. http://www.columbia.edu/kermit/ckuins.html#x9
+ 261. http://www.columbia.edu/kermit/ckuins.html#x9.1
+ 262. http://www.columbia.edu/kermit/ckuins.html#x9.3
+ 263. http://www.columbia.edu/kermit/ckuins.html#x9.1
+ 264. http://www.columbia.edu/kermit/ckuins.html#top
+ 265. http://www.columbia.edu/kermit/ckuins.html#contents
+ 266. http://www.columbia.edu/kermit/ckuins.html#x9
+ 267. http://www.columbia.edu/kermit/ckuins.html#x9.4
+ 268. http://www.columbia.edu/kermit/ckuins.html#x9.2
+ 269. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c
+ 270. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 271. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c
+ 272. http://www.columbia.edu/kermit/ckuins.html#top
+ 273. http://www.columbia.edu/kermit/ckuins.html#contents
+ 274. http://www.columbia.edu/kermit/ckuins.html#x9
+ 275. http://www.columbia.edu/kermit/ckuins.html#x9.5
+ 276. http://www.columbia.edu/kermit/ckuins.html#x9.3
+ 277. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 278. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h
+ 279. http://www.columbia.edu/kermit/ckuins.html#top
+ 280. http://www.columbia.edu/kermit/ckuins.html#contents
+ 281. http://www.columbia.edu/kermit/ckuins.html#x9
+ 282. http://www.columbia.edu/kermit/ckuins.html#x9.6
+ 283. http://www.columbia.edu/kermit/ckuins.html#x9.4
+ 284. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h
+ 285. ftp://kermit.columbia.edu/kermit/c-kermit/ckuus3.c
+ 286. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 287. http://www.columbia.edu/kermit/ckuins.html#top
+ 288. http://www.columbia.edu/kermit/ckuins.html#contents
+ 289. http://www.columbia.edu/kermit/ckuins.html#x9
+ 290. http://www.columbia.edu/kermit/ckuins.html#x9.7
+ 291. http://www.columbia.edu/kermit/ckuins.html#x9.5
+ 292. http://www.columbia.edu/kermit/ckuins.html#top
+ 293. http://www.columbia.edu/kermit/ckuins.html#contents
+ 294. http://www.columbia.edu/kermit/ckuins.html#x9
+ 295. http://www.columbia.edu/kermit/ckuins.html#x9.8
+ 296. http://www.columbia.edu/kermit/ckuins.html#x9.6
+ 297. http://www.columbia.edu/kermit/ckuins.html#top
+ 298. http://www.columbia.edu/kermit/ckuins.html#contents
+ 299. http://www.columbia.edu/kermit/ckuins.html#x9
+ 300. http://www.columbia.edu/kermit/ckuins.html#x9.9
+ 301. http://www.columbia.edu/kermit/ckuins.html#x9.7
+ 302. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 303. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 304. ftp://kermit.columbia.edu/kermit/c-kermit/ckcdeb.h
+ 305. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c
+ 306. http://www.columbia.edu/kermit/ckuins.html#top
+ 307. http://www.columbia.edu/kermit/ckuins.html#contents
+ 308. http://www.columbia.edu/kermit/ckuins.html#x9
+ 309. http://www.columbia.edu/kermit/ckuins.html#x10
+ 310. http://www.columbia.edu/kermit/ckuins.html#x9.8
+ 311. http://www.columbia.edu/kermit/ckuins.html#top
+ 312. http://www.columbia.edu/kermit/ckuins.html#contents
+ 313. http://www.columbia.edu/kermit/ckuins.html#x11
+ 314. http://www.columbia.edu/kermit/ckuins.html#x9
+ 315. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 316. http://www.columbia.edu/kermit/ckuins.html#x11
+ 317. http://www.columbia.edu/kermit/ckuins.html#top
+ 318. http://www.columbia.edu/kermit/ckuins.html#contents
+ 319. http://www.columbia.edu/kermit/ckuins.html#x12
+ 320. http://www.columbia.edu/kermit/ckuins.html#x10
+ 321. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 322. ftp://kermit.columbia.edu/kermit/c-kermit/ckufio.c
+ 323. http://www.columbia.edu/kermit/ckuins.html#top
+ 324. http://www.columbia.edu/kermit/ckuins.html#contents
+ 325. http://www.columbia.edu/kermit/ckuins.html#x13
+ 326. http://www.columbia.edu/kermit/ckuins.html#x11
+ 327. http://www.columbia.edu/kermit/ckuins.html#top
+ 328. http://www.columbia.edu/kermit/ckuins.html#contents
+ 329. http://www.columbia.edu/kermit/ckuins.html#x14
+ 330. http://www.columbia.edu/kermit/ckuins.html#x12
+ 331. ftp://kermit.columbia.edu/kermit/c-kermit/ckubwr.txt
+ 332. ftp://kermit.columbia.edu/kermit/c-kermit/ckutio.c
+ 333. http://www.columbia.edu/kermit/ckuins.html#top
+ 334. http://www.columbia.edu/kermit/ckuins.html#contents
+ 335. http://www.columbia.edu/kermit/ckuins.html#x15
+ 336. http://www.columbia.edu/kermit/ckuins.html#x13
+ 337. http://www.columbia.edu/kermit/ckuins.html#top
+ 338. http://www.columbia.edu/kermit/ckuins.html#contents
+ 339. http://www.columbia.edu/kermit/ckuins.html#x16
+ 340. http://www.columbia.edu/kermit/ckuins.html#x14
+ 341. http://www.columbia.edu/kermit/iksd.html#x4.2
+ 342. http://www.columbia.edu/kermit/iksd.html
+ 343. http://www.columbia.edu/kermit/ckermit2.html
+ 344. http://www.columbia.edu/kermit/ckuins.html#top
+ 345. http://www.columbia.edu/kermit/ckuins.html#contents
+ 346. http://www.columbia.edu/kermit/ckuins.html#x17
+ 347. http://www.columbia.edu/kermit/ckuins.html#x15
+ 348. http://www.columbia.edu/kermit/security.html
+ 349. http://www.columbia.edu/kermit/security80.html
+ 350. http://www.columbia.edu/kermit/cuiksd.html
+ 351. ftp://kermit.columbia.edu/kermit/c-kermit/ca_certs.pem
+ 352. http://www.columbia.edu/kermit/ckuins.html#top
+ 353. http://www.columbia.edu/kermit/ckuins.html#contents
+ 354. http://www.columbia.edu/kermit/ckuins.html#x16
+ 355. http://www.columbia.edu/kermit/skermit.html
+ 356. http://www.columbia.edu/kermit/ckuins.html#top
+ 357. http://www.columbia.edu/kermit/ckuins.html#contents
+ 358. http://www.columbia.edu/kermit/ckermit.html
+ 359. http://www.columbia.edu/kermit/ck80.html
+ 360. http://www.columbia.edu/kermit/index.html
diff --git a/ckututor.txt b/ckututor.txt
new file mode 100644 (file)
index 0000000..9448126
--- /dev/null
@@ -0,0 +1,1959 @@
+
+C-KERMIT 8.0 UNIX MANUAL PAGE AND TUTORIAL
+
+     Frank da Cruz, Christine M. Gianone
+     [1]The Kermit Project, [2]Columbia University
+     
+   [ [3]PDF version ] [ [4]Nroff version ]
+   
+     This document is intended to give the beginner sufficient
+     information to make basic (if not advanced) use of C-Kermit 8.0.
+     Although it might be rather long for a Unix manual page (about 1600
+     lines), it's still far shorter than the C-Kermit manual, which
+     should be consulted for advanced topics such as customization,
+     character-sets, scripting, etc. We also attempt to provide a clear
+     structural overview of C-Kermit's many capabilities, functional
+     areas, states, and modes and their interrelation, that should be
+     helpful to beginners and veterans alike, as well as to those
+     upgrading to the new release. 
+     
+   Most recent update: 24 October 2002
+    ________________________________________________________________________
+  
+  CONTENTS
+     * [5]DESCRIPTION
+     * [6]SYNOPSIS
+     * [7]OPTIONS
+     * [8]COMMAND LANGUAGE
+     * [9]INITIALIZATION FILE
+     * [10]MODES OF OPERATION
+     * [11]MAKING CONNECTIONS
+     * [12]TRANSFERRING FILES WITH KERMIT
+     * [13]KERMIT CLIENT/SERVER CONNECTIONS
+     * [14]KERMIT'S BUILT-IN FTP AND HTTP CLIENTS
+     * [15]INTERNET KERMIT SERVICE
+     * [16]SECURITY
+     * [17]ALTERNATIVE COMMAND-LINE PERSONALITIES
+     * [18]LICENSE
+     * [19]OTHER TOPICS
+     * [20]DOCUMENTATION AND UPDATES
+     * [21]FILES
+     * [22]AUTHORS
+     _________________________________________________________________
+   
+   DESCRIPTION [ [23]Top ] [ [24]Contents ] [ [25]Next ]
+   
+   [26]C-Kermit is an all-purpose communications software package from
+   the [27]Kermit Project at [28]Columbia University that:
+   
+     * Is portable to many platforms, Unix and non-Unix alike.
+     * Can make both serial and network connections.
+     * Can conduct interactive terminal sessions over its connection.
+     * Can transfer text or binary files over the same connection.
+     * Can convert text-file character sets in terminal mode or file
+       transfer.
+     * Is customizable in every aspect of its operation.
+       
+   C-Kermit is a modem program, a Telnet client, an Rlogin client, an FTP
+   client, an HTTP client, and on selected platforms, also an X.25
+   client. It can make its own secure Internet connections using
+   IETF-approved security methods including Kerberos IV, Kerberos V,
+   SSL/TLS, and SRP and it can also make SSH (Secure Shell) connections
+   through your external SSH client application. It can be the far-end
+   file-transfer or client/server partner of your desktop Kermit client.
+   It can also accept incoming dialed and network connections. It can
+   even be installed as an Internet service on its own standard TCP
+   socket, 1649 [[29]RFC2839, [30]RFC2840].
+   
+   And perhaps most important, everything you can do "by hand"
+   (interactively) with C-Kermit, can be "scripted" (automated) using its
+   built-in cross-platform transport-independent script programming
+   language, which happens to be identical to its interactive command
+   language.
+   
+   This manual page offers an overview of C-Kermit 8.0 for Unix ("Unix"
+   is an operating system family that includes AIX, DG/UX, FreeBSD,
+   HP-UX, IRIX, Linux, Mac OS X, NetBSD, OpenBSD, Open Server, Open Unix,
+   QNX, Solaris, SunOS, System V R3, System V R4, Tru64 Unix, Unixware,
+   Xenix, and many others). For thorough coverage, please consult the
+   published C-Kermit manual and supplements (see [31]DOCUMENTATION
+   below). For further information about C-Kermit, Kermit software for
+   other platforms, and Kermit manuals, visit the Kermit Project website:
+   
+  [32]http://www.columbia.edu/kermit/
+
+   This is a longer-than-average manual page, and yet it barely scratches
+   the surface. Don't be daunted. C-Kermit is a large and complex
+   package, evolving over decades of practice and experience, but that
+   doesn't mean it's hard to learn or use. Its most commonly used
+   functions are explained here with pointers to additional information
+   elsewhere.
+   
+   [ [33]Kermit Home ] [ [34]C-Kermit Home ] [ [35]C-Kermit FAQ ]
+    ________________________________________________________________________
+  
+  SYNOPSIS [ [36]Top ] [ [37]Contents ] [ [38]Next ] [ [39]Previous ]
+  
+   Usage:  kermit [filename] [-x arg [-x arg]...[-yyy]..] [ {=,--,+} text
+   ] ]
+   Or:    kermit URL
+   
+     * -x is an option requiring an argument;
+     * -y is an option with no argument.
+       
+   If the first command-line argument is the name of a file,
+   interactive-mode commands are executed from the file. The '=' (or
+   "--") argument tells Kermit not to parse the remainder of the command
+   line, but to make the words following '=' available as \%1, \%2, ...
+   \%9. The "+" argument is like "=" but for use in "kerbang scripts"
+   (explained [40]below). A second command-line format allows the one and
+   only argument to be a [41]Telnet, FTP, HTTP, or IKSD URL.
+   
+   Order of execution:
+   
+    1. [42]The command file (if any).
+    2. [43]The initialization file, if any, unless suppressed with -Y.
+    3. [44]The customization file (if it is executed by the
+       initialization file).
+    4. [45]The command-line URL (if any, and if so, execution stops
+       here).
+    5. [46]Command-line options (if any).
+    6. [47]Interactive commands.
+       
+   Some command-line options can cause actions (such as -s to send a
+   file); others just set parameters. If any action options are included
+   on the command line, Kermit exits when finished unless also given the
+   -S ("stay") option. If no action options are given, no initialization
+   or command files contained an EXIT or QUIT command, and no fatal
+   errors occurred, Kermit issues its prompt and waits for you to type
+   commands.
+   
+     Bear in mind that C-Kermit can be built with selected features
+     disabled, and also that certain features are not available on all
+     platforms. For example, C-Kermit can't be built with TCP/IP support
+     on a platform that does not have TCP/IP header files and libraries
+     (and even if Kermit does include TCP/IP support, it can't be used
+     to make TCP/IP connections on a computer that does not have a
+     TCP/IP stack installed). If your version of C-Kermit lacks a
+     feature mentioned here, use its SHOW FEATURES command to see what
+     might have been excluded. 
+     
+   C-Kermit has three kinds of commands: regular single-letter
+   command-line options, extended-format command-line options, and
+   interactive commands.
+   
+   [ [48]Kermit Home ] [ [49]C-Kermit Home ] [ [50]C-Kermit FAQ ]
+    ________________________________________________________________________
+  
+  OPTIONS [ [51]Top ] [ [52]Contents ] [ [53]Next ] [ [54]Previous ]
+  
+   Like most Unix commands, C-Kermit can be be given options on the
+   command line. But C-Kermit also can be used interactively by giving it
+   [55]commands composed of words, which are more intuitive than cryptic
+   command-line options, and more flexible too. In other words, you don't
+   have to use C-Kermit's command-line options, but they are available if
+   you want to. (By the same token, you don't have to use its interactive
+   commands either -- you can use either or both in any combination.)
+   
+   C-Kermit is generally installed in the PATH as "kermit", and therefore
+   is invoked by typing the word "kermit" (lowercase) at the shell
+   prompt, and then pressing the Return or Enter key. If you wish to
+   include command-line options, put them after the word "kermit" but
+   before pressing Return or Enter, separated by spaces, for example:
+   
+  $ kermit -s ckermit.tar.gz
+
+   ('$' is the shell prompt; "kermit -s ckermit.tar.gz" is what you type,
+   followed by Return or Enter.)
+   
+   Here is a list of C-Kermit's single-letter command-line options, which
+   start with a single dash (-), in ASCII ("alphabetical") order.
+   Alphabetic case is significant (-A is not the same as -a). The Action?
+   column contains Y for action options and N for non-action options.
+   Option Action? Description
+   -0 N (digit zero) 100% transparent Connect state for "in-the-middle"
+   operation: 8 bits, no parity, no escape character, everything passes
+   through.
+   -8 N (digit eight) Connection is 8-bit clean (this is the default in
+   C-Kermit 8.0). Equivalent to the EIGHTBIT command, which in turn is a
+   shortcut for SET TERMINAL BYTESIZE 8, SET COMMAND BYTESIZE 8, SET
+   PARITY NONE.
+   -9 arg N (digit nine) Make a connection to an FTP server. Equivalent
+   to the FTP OPEN command.
+   Argument: IP-address-or-hostname[:optional-TCP-port].
+   NOTE: C-Kermit also has a separate FTP command-line personality, with
+   regular FTP-like command-line syntax. [56]More about this below.
+   -A N Kermit is to be started as an Internet service (IKSD) (only from
+   inetd.conf).
+   -B N Kermit is running in Batch or Background (no controlling
+   terminal). To be used in case Kermit doesn't automatically sense its
+   background status. Equivalent to the SET BACKGROUND ON command.
+   -C arg N Interactive-mode Commands to be executed.
+   Argument: Commands separated by commas, list in doublequotes.
+   -D arg N Delay before starting to send in Remote mode. Equivalent to
+   the SET DELAY command.
+   Argument: Number of seconds.
+   -E N Exit automatically when connection closes. Equivalent to SET EXIT
+   ON-DISCONNECT ON.
+   -F arg N Use an open TCP connection.
+   Argument: Numeric file descriptor of open TCP connection.
+   Also see: -j, -J.
+   -G arg Y Get file(s) from server, send contents to standard output,
+   which normally would be piped to another process.
+   Argument: Remote file specification, in quotes if it contains
+   metacharacters.
+   Also see: -g, -k.
+   -H N Suppress program startup Herald and greeting.
+   -I N Tell Kermit it has a reliable connection, to force streaming to
+   be used where it normally would not be. Equivalent to the SET RELIABLE
+   ON command.
+   -J arg N "Be like Telnet." Like -j but implies -E.
+   Argument: IP hostname/address optionally followed by service.
+   NOTE: C-Kermit also has a separate Telnet command-line personality,
+   with regular Telnet-like command-line syntax. [57]More about this
+   below.
+   -L N Recursive directory descent for files in -s option.
+   -M arg N My user name (for use with Telnet, Rlogin, FTP, etc).
+   Equivalent to the SET LOGIN USER command.
+   Argument: Username string.
+   -O Y (Uppercase letter O) Be a server for One command only. Also see:
+   -x.
+   -P N Don't convert file (Path) names of transferred files. Equivalent
+   to SET FILE NAMES LITERAL.
+   -Q N Quick Kermit protocol settings. Equivalent to the FAST command.
+   This is the default in C-Kermit 7.0 and later.
+   -R N Remote-only (this just makes IF REMOTE true).
+   -S N Stay (enter command parser after action options).
+   -T N Force Text mode for file transfer; implies -V. Equivalent to SET
+   TRANSFER MODE MANUAL, SET FILE TYPE TEXT.
+   -V N Disable automatic per-file text/binary switching. Equivalent to
+   SET TRANSFER MODE MANUAL.
+   -Y N Skip (don't execute) the initialization file.
+   -a arg N As-name for file(s) in -s, -r, or -g.
+   Argument: As-name string (alternative filename). When receiving files,
+   this can be a directory name.
+   -b arg N Speed for serial device. Equivalent to SET SPEED.
+   Argument: Numeric Bits per second for serial connections.
+   -c Y Enter Connect state before transferring files.
+   -d N Create a debug.log file with detailed debugging information (a
+   second -d adds timestamps). Equivalent to LOG DEBUG but takes effect
+   sooner.
+   -e arg N Maximum length for incoming Kermit file-transfer packets.
+   Equivalent to SET RECEIVE PACKET-LENGTH.
+   Argument: Length in bytes.
+   -f Y Send a FINISH command to a Kermit server.
+   -g arg N Get file(s) from a Kermit server.
+   Argument: File specification on other computer, in quotes if it
+   contains metacharacters. Equivalent to GET.
+   Also see: -a, -G, -r.
+   -h Y Print Help text for single-letter command-line options (pipe thru
+   'more' to prevent scrolling).
+   -i N Force binary (Image) mode for file transfer; implies -V.
+   Equivalent to SET TRANSFER MODE MANUAL, SET FILE TYPE BINARY.
+   -j arg N Make a TCP/IP connection.
+   Argument: IP host name/address and optional service name or number.
+   Equivalent to the TELNET command.
+   Also see: -J, -F.
+   -k Y Receive file(s) to standard output, which normally would be piped
+   to another process.
+   Also see: -r, -G.
+   -l arg N (Lowercase letter L) Make a connection on the given serial
+   communications device. Equivalent to the SET LINE (SET PORT) command.
+   Argument: Serial device name, e.g. /dev/ttyS0.
+   -m arg N Modem type for use with the -l device. Equivalent to the SET
+   MODEM TYPE command.
+   Argument: Modem name as in SET MODEM TYPE command, e.g. "usrobotics".
+   -n Y Enter Connect state after transferring files (historical).
+   -p arg N Parity. Equivalent to the SET PARITY command.
+   Argument: One of the following: e(ven), o(dd), m(ark), n(one),
+   s(pace).
+   -q N Quiet (suppress most messages). Equivalent to SET QUIET ON.
+   -r Y Receive file(s). Equivalent to the RECEIVE command.
+   Argument: (none, but see -a)
+   -s arg N Send file(s).
+   Argument: One or more local file specifications. Equivalent to the
+   SEND command.
+   Also see: -a.
+   -t N (Historical) Xon (Ctrl-Q) Turnaround character for half-duplex
+   connections (used on serial linemode connections to old mainframes).
+   Equivalent to SET DUPLEX HALF, SET HANDSHAKE XON.
+   -v arg N Window size for Kermit protocol (ignored when streaming).
+   Equivalanet to SET WINDOW-SIZE.
+   Argument: Number, 1 to 32.
+   -w N Incoming files Write over existing files. Equivalent to SET FILE
+   COLLISION OVERWRITE.
+   -x Y Enter server mode. Equivalent to the SERVER command. Also see:
+   -O.
+   -y arg N Alternative initialization file.
+   Argument: Filename.
+   -z N Force foreground behavior. To be used in case Kermit doesn't
+   automatically sense its foreground status. Equivalent to the SET
+   BACKGROUND OFF command.
+   
+   Extended command-line options (necessary because single-letter ones
+   are about used up) start with two dashes (--), with words rather than
+   single letters as option names. If an extended option takes an
+   argument, it is separated from the option word by a colon (:).
+   Extended options include:
+   Option Description
+   --bannerfile:filename File to display upon startup or IKSD login.
+   --cdfile:filename File to be sent for display to the client when
+   server changes directory (filename is relative to the changed-to
+   directory).
+   --cdmessage:{on,off} Enable/disable the server CD message feature.
+   --help Prints usage message for extended options.
+   --helpfile:filename Designates a file containing custom text to
+   replace the top-level HELP command.
+   --nointerrupts Disables keyboard interrupts.
+   --noperms Disables the Kermit protocol file Permissions attribute, to
+   prevent transmission of file permissions (protection) from sender to
+   receiver.
+   
+   Plus several other [58]IKSD-Only options.
+   
+   See the [59]file-transfer section for examples of command-line
+   invocation.
+    ________________________________________________________________________
+  
+  COMMAND LANGUAGE [ [60]Top ] [ [61]Contents ] [ [62]Next ] [ [63]Previous ]
+  
+     * [64]Command Files, Macros, and Scripts
+     * [65]Command List
+       
+   C-Kermit's interactive command language is the subject of a
+   [66]622-page book and another several hundred pages of updates, far
+   too much for a manual page. But it's not hard to get started. At the
+   shell prompt, just type "kermit" to get C-Kermit's interactive command
+   prompt:
+   
+  $ kermit
+  (/current/directory) C-Kermit>
+
+   Begin by typing "help" (and then press the Return or Enter key) for a
+   top-level overview, read it, and go from there. Your second command
+   should probably be "intro" (introduction). Note the prompt shows your
+   current directory (unless you tell Kermit to prompt you with something
+   else).
+   
+   Interactive commands are composed mainly of regular English words,
+   usually in the form of imperative sentences, such as:
+   
+  send oofa.txt
+
+   which tells Kermit to send (transfer) the file whose name is oofa.txt,
+   or:
+   
+  set transfer mode automatic
+
+   which sets Kermit's "transfer mode" to "automatic" (whatever that
+   means).
+   
+   While typing commands, you can abbreviate, ask for help (by pressing
+   the "?" key anywhere in a command), complete keywords or filenames
+   (with the Tab or Esc key), and edit your typing with Backspace or
+   Delete, Ctrl-W, Ctrl-U, etc. You can also recall previous commands,
+   save your command history, and who knows what else. Give the INTRO
+   command for details.
+   
+   C-Kermit has hundreds of commands, and they can be issued in infinite
+   variety and combinations, including commands for:
+   
+     * Making connections (SET LINE, DIAL, TELNET, SSH, FTP, CONNECT,
+       ...)
+     * Breaking connections (HANGUP, CLOSE)
+     * Transferring files (SEND, GET, RECEIVE, MOVE, RESEND, ...)
+     * Establishing preferences (SET)
+     * Displaying preferences (SHOW)
+     * Managing local files (CD, DELETE, MKDIR, DIRECTORY, RENAME, TYPE,
+       ...)
+     * Managing remote files (RCD, RDEL, RMKDIR, RDIR, ...)
+     * Using local files (FOPEN, FCLOSE, FREAD, FWRITE)
+     * Programming (TAKE, DEFINE, IF, FOR, WHILE, SWITCH, DECLARE, ...)
+     * Interacting with the user (ECHO, ASK, ...)
+     * Interacting with a remote computer (INPUT, OUTPUT, ...)
+     * Interacting with local programs (RUN, EXEC, PTY, ...)
+     * Logging things (LOG SESSION, LOG PACKETS, LOG DEBUG, ...)
+       
+   And of course QUIT or EXIT to get out and HELP to get help, and for
+   programmers: loops, decision making, variables, arrays, associative
+   arrays, integer and floating point arithmetic, macros, built-in and
+   user-defined functions, string manipulation, pattern matching, block
+   structure, scoping, recursion, and all the rest. To get a list of all
+   C-Kermit's commands, type a question mark (?) at the prompt. To get a
+   description of any command, type HELP followed by the name of the
+   command, for example:
+   
+  help send
+
+   The command interruption character is Ctrl-C (hold down the Ctrl key
+   and press the C key).
+   
+   The command language "escape character", used to introduce variable
+   names, function invocations, and so on, is backslash (\). If you need
+   to include a literal backslash in a command, type two of them, e.g.:
+   
+  get c:\\k95\\k95custom.ini
+
+  Command Files, Macros, and Scripts
+  
+   A file containing Kermit commands is called a Kermit command file or
+   Kermit script. It can be executed with Kermit's TAKE command:
+   
+  (/current/dir) C-Kermit> take commandfile
+
+   (where "commandfile" is the name of the command file). Please don't
+   pipe a command file into Kermit's standard input (which might or might
+   not work); if you have Kermit commands in a file, tell Kermit to TAKE
+   the file.
+   
+   In Unix only, a Kermit command file can also be executed directly by
+   including a "kerbang" line as the first line of the file:
+   
+  #!/usr/local/bin/kermit +
+
+   That is, a top line that starts with "#!", followed immediately by the
+   full path of the Kermit executable, and then, if the Kermit script is
+   to be given arguments on the command line, a space and a plus sign.
+   The script file must also have execute permission:
+   
+  chmod +x commandfile
+
+   Except for the " +" part, this is exactly the same as you would do for
+   a shell script, a Perl script, etc. Here's a simple but useless
+   example script that regurgitates its arguments (up to three of them):
+   
+  #!/usr/local/bin/kermit +
+  if defined \%1 echo "Argument 1: \%1"
+  if defined \%2 echo "Argument 2: \%2"
+  if defined \%3 echo "Argument 3: \%3"
+  if defined \%4 echo "etc..."
+  exit
+
+   If this file is stored in your current directory as "commandfile",
+   then:
+   
+  ./commandfile one two three four five
+
+   prints:
+   
+  Argument 1: one
+  Argument 2: two
+  Argument 3: three
+  etc...
+
+   This illustrates the basic structure of a standalone Kermit script:
+   the "kerbang line", then some commands. It should end with "exit"
+   unless you want the Kermit prompt to appear when it is finished. \%1
+   is the first argument, \%2 the second, and so on.
+   
+   You can also create your own commands by defining named macros
+   composed of other Kermit commands (or macros). Here's a simple
+   example:
+   
+  define mydial {
+      set modem type usrobotics
+      set port /dev/ttyS0
+      if fail end 1
+      set speed 57600
+      dial \%1
+      if success connect
+  }
+
+   This shows how you can combine many commands into one command,
+   "mydial" in this case (you can use any name you like, provided it does
+   not clash with the name of a built-in command). When this macro
+   definition is in effect, you can type commands like:
+   
+  mydial 7654321
+
+   and it executes all the commands in macro definition, substituting the
+   first operand ("7654321") for the formal parameter ("\%1") in the
+   definition. This saves you from having to type lots of commands every
+   time you want to make a modem call.
+   
+   One way to have the macro definition in effect is to type the
+   definition at the Kermit prompt. Another way is to store the
+   definition in a file and TAKE the file. If you want the the definition
+   to be in effect automatically every time you start Kermit, put the
+   definition in your initialization or customization file (explained
+   [67]below).
+   
+   Here's a somewhat more ambitious example:
+   
+  define mydelete {
+      local trash
+      assign trash \v(home)trashcan/
+      if not defined \%1 end 1 "Delete what?"
+      if wild \%1 end 1 "Deleting multiple files is too scary"
+      if not exist \%1 end 1 "I can't find \%1"
+      if not directory \m(trash) {
+          mkdir \m(trash)
+          if fail end 1 "No trash can"
+      }
+      rename /list \%1 \m(trash)
+  }
+  define myundelete {
+      local trash
+      assign trash \v(home)trashcan/
+      if not defined \%1 end 1 "Undelete what?"
+      if wild \%1 end 1 "Undeleting multiple files is too hard"
+      if not directory \m(trash) end 1 "No trash can"
+      if not exist \m(trash)\%1 end 1 "I can't find \%1 in trash can"
+      rename /list \m(trash)\%1 .
+  }
+
+   These macros are not exactly production quality (they don't handle
+   filenames that include path segments, they don't handle multiple
+   files, etc), but you get the idea: you can pass arguments to macros,
+   they can check them and make other kinds of decisions, and the
+   commands themselves are relatively intuitive and intelligible.
+   
+   If you put the above lines into your initialization or customization
+   file, you'll have MYDELETE and MYUNDELETE commands available every
+   time you start Kermit, at least as long as you don't suppress
+   execution of the initialization file. (Exercise for the reader: Make
+   these macros generally useful: remove limitations, add trashcan
+   display, browsing, emptying, etc.)
+   
+   Kerbang scripts execute without the initialization file. This to keep
+   them portable and also to make them start faster. If you want to write
+   Kerbang scripts that depend on the initialization file, include the
+   command
+   
+  take \v(home).kermrc
+
+   at the desired spot in the script. By the way, \v(xxx) is a built-in
+   variable (xxx is the variable name, "home" in this case). To see what
+   built-in variables are available, type "show variables" at the
+   C-Kermit prompt. To see what else you can show, type "show ?". \m(xxx)
+   is a user defined variable (strictly speaking, it is a macro used as a
+   variable).
+   
+  Command List
+  
+   C-Kermit has more than 200 top-level commands, and some of these, such
+   as SET, branch off into hundreds of subcommands of their own, so it's
+   not practical to describe them all here. Instead, here's a concise
+   list of the most commonly used top-level commands, grouped by
+   category. To learn about each command, type "help" followed by the
+   command name, e.g. "help set". Terms such as Command state and Connect
+   state are explained in subsequent sections.
+   
+   Optional fields are shown in [ italicized brackets ]. filename means
+   the name of a single file. filespec means a file specification that is
+   allowed to contain wildcard characters like '*' to match groups of
+   files. options are (optional) switches like /PAGE, /NOPAGE, /QUIET,
+   etc, listed in the HELP text for each command. Example:
+   
+  send /recursive /larger:10000 /after:-1week /except:*.txt *
+
+   which can be read as "send all the files in this directory and all the
+   ones underneath it that are larger than 10000 bytes, no more than one
+   week old, and whose names don't end with ".txt".
+   
+   Basic Commands
+          HELP Requests top-level help.
+          HELP command Requests help about the given command.
+          INTRODUCTION Requests a brief introduction to C-Kermit.
+          LICENSE Displays the C-Kermit software copyright and license.
+          VERSION Displays C-Kermit's version number.
+          EXIT [ number ] Exits from Kermit with the given status code.
+          Synonyms: QUIT, E, Q.
+          TAKE filename [ parameters... ] Executes commands from the
+          given file.
+          LOG item [ filename ] Keeps a log of the given item in the
+          given file.
+          [ DO ] macro [ parameters... ]    Executes commands from the
+          given macro.
+          SET parameter value Sets the given parameter to the given
+          value.
+          SHOW category Shows settings in a given category.
+          STATUS Tells whether previous command succeeded or failed.
+          DATE [ date-and/or-time ] Shows current date-time or interprets
+          given date-time.
+          RUN [ extern-command [ parameters... ] Runs the given external
+          command. Synonym: !.
+          EXEC [ extern-command [ params... ] Kermit overlays itself with
+          the given command.
+          SUSPEND Stops Kermit and puts it in the background. Synonym: Z.
+          
+   Local File Management
+          TYPE [ options ] filename Displays the contents of the given
+          file.
+          MORE [ options ] filename Equivalent to TYPE /PAGE (pause after
+          each screenful).
+          CAT [ options ] filename Equivalent to TYPE /NOPAGE.
+          HEAD [ options ] filename Displays the first few lines of a
+          given file.
+          TAIL [ options ] filename Displays the last few lines of a
+          given file.
+          GREP [ options ] pattern filespec Displays lines from files
+          that match the pattern. Synonym: FIND.
+          DIRECTORY [ options ] [ filespec ] Lists files (built-in, many
+          options).
+          LS [ options ] [ filespec ] Lists files (runs external "ls"
+          command).
+          DELETE [ options ] [ filespec ] Deletes files. Synonym: RM.
+          PURGE [ options ] [ filespec ] Removes backup (*.~n~) files.
+          COPY [ options ] [ filespecs... ] Copies files. Synonym: CP.
+          RENAME [ options ] [ filespecs... ] Renames files. Synonym: MV.
+          CHMOD [ options ] [ filespecs... ] Changes permissions of
+          files.
+          TRANSLATE filename charsets filename ] Converts file's
+          character set. Synonym: XLATE.
+          CD Changes your working directory to your home directory.
+          CD directory Changes your working directory to the one given.
+          CDUP Changes your working directory one level up.
+          PWD Displays your working directory.
+          BACK Returns to your previous working directory.
+          MKDIR [ directory ] Creates a directory.
+          RMDIR [ directory ] Removes a directory.
+          
+   Making Connections
+          SET LINE [ options ] devicename        Opens the named serial
+          port. Synonym: SET PORT.
+          OPEN LINE [ options ] devicename Same as SET LINE. Synonym:
+          OPEN PORT.
+          SET MODEM TYPE [ name ] Tells Kermit what kind of modem is on
+          the port.
+          DIAL [ number ] Tells Kermit to dial the given phone number
+          with the modem.
+          REDIAL Redials the most recently dialed phone number.
+          ANSWER Waits for and answers an incoming call on the modem.
+          AUTHENTICATE [ parameters... ] Performs secure authentication
+          on a TCP/IP connection.
+          SET NETWORK TYPE { TCP/IP, X.25, ... } Selects network type for
+          subsequent SET HOST commands.
+          SET HOST [ options ] host [ port ] Opens a network connection
+          to the given host and port.
+          SET HOST [ options ] * port Waits for an incoming TCP/IP
+          connection on the given port.
+          TELNET [ options ] host Opens a Telnet connection to the host
+          and enters Connect state.
+          RLOGIN [ options ] host Opens an Rlogin connection to the host
+          and enters Connect state.
+          IKSD [ options ] host Opens a connection to an Internet Kermit
+          Service.
+          SSH [ options ] host Opens an SSH connection to the host and
+          enters Connect state.
+          FTP OPEN host [ options ] Opens an FTP connection to the host.
+          HTTP [ options ] OPEN host Opens an HTTP connection to the
+          host.
+          PTY external-command Runs the command on a pseudoterminal as if
+          it were a connection.
+          PIPE external-command Runs the command through a pipe as if it
+          were a connection.
+          
+   Using Connections
+          CONNECT [ options ]                    Enters Connect
+          (terminal) state. Synonym: C.
+          REDIRECT command Redirects the given external command over the
+          connection.
+          TELOPT command Sends a Telnet protocol command (Telnet
+          connections only).
+          Ctrl-\C "Escapes back" from Connect state to Command state.
+          Ctrl-\B (In Connect state) Sends a BREAK signal (serial or
+          Telnet).
+          Ctrl-\! (In Connect state) Enters inferior shell; "exit" to
+          return.
+          Ctrl-\? (In Connect state) Shows a menu of other escape-level
+          options.
+          Ctrl-\Ctrl-\ (In Connect state) Type two Ctrl-Backslashes to
+          send one of them.
+          SET ESCAPE [ character ] Changes Kermit's Connect-state escape
+          character.
+          
+   Closing Connections
+          HANGUP Hangs up the currently open serial-port or network
+          connection.
+          CLOSE Closes the currently open serial-port or network
+          connection.
+          SET LINE (with no devicename)          Closes the currently
+          open serial-port or network connection.
+          SET HOST (with no hostname) Closes the currently open
+          serial-port or network connection.
+          FTP CLOSE Closes the currently open FTP connection.
+          HTTP CLOSE Closes the currently open HTTP connection.
+          EXIT Also closes all connections. Synonym: QUIT.
+          SET EXIT WARNING OFF Suppresses warning about open connections
+          on exit or close.
+          
+   File Transfer
+          SEND [ options ] filename [ as-name ]  Sends the given file.
+          Synonym: S.
+          SEND [ options ] filespec Sends all files that match.
+          RESEND [ options ] filespec Resumes an interupted SEND from the
+          point of failure.
+          RECEIVE [ options ] [ as-name ] Waits passively for files to
+          arrive. Synonym: R.
+          LOG TRANSACTIONS [ filename ] Keeps a record of file transfers.
+          FAST Use fast file-transfer settings (default).
+          CAUTIOUS Use cautious and less fast file-transfer settings.
+          ROBUST Use ultra-conservative and slow file-transfer settings.
+          STATISTICS [ options ] Gives statistics about the most recent
+          file transfer.
+          WHERE After transfer: "Where did my files go?".
+          TRANSMIT [ options ] [ filename ] Sends file without protocol.
+          Synonym: XMIT.
+          LOG SESSION [ filename ] Captures remote text or files without
+          protocol.
+          SET PROTOCOL [ name... ] Tells Kermit to use an external
+          file-transfer protocol.
+          FTP { PUT, MPUT, GET, MGET, ... } FTP client commands.
+          HTTP { PUT, GET, HEAD, POST, ... } HTTP client commands.
+          
+   Kermit Server
+          ENABLE, DISABLE                        Controls which features
+          can be used by clients.
+          SET SERVER Sets parameters prior to entering Server state.
+          SERVER Enters Server state.
+          
+   Client of Kermit or FTP Server
+          [ REMOTE ] LOGIN [ user password ] Logs in to a Kermit server
+          or IKSD that requires it.
+          [ REMOTE ] LOGOUT Logs out from a Kermit server or IKSD.
+          SEND [ options ] filename [ as-name ]  Sends the given file to
+          the server. Synonyms: S, PUT.
+          SEND [ options ] filespec Sends all files that match.
+          RESEND [ options ] filespec Resumes an interupted SEND from the
+          point of failure.
+          GET [ options ] remote-filespec Asks the server to send the
+          given files. Synonym: G.
+          REGET [ options ] remote-filespec Resumes an interrupted GET
+          from the point of failure.
+          REMOTE CD [ directory ] Asks server to change its working
+          directory. Synonym: RCD.
+          REMOTE PWD [ directory ] Asks server to display its working
+          directory. Synonym: RPWD.
+          REMOTE DIRECTORY [ filespec... ] Asks server to send a
+          directory listing. Synonym: RDIR.
+          REMOTE DELETE [ filespec... ] Asks server to delete files.
+          Synonym: RDEL.
+          REMOTE [ command... ] (Many other commands: "remote ?" for a
+          list).
+          MAIL [ options ] filespec Sends file(s) to be delivered as
+          e-mail (Kermit only).
+          FINISH Asks the server to exit server state (Kermit only).
+          BYE Asks the server to log out and close the connection.
+          
+   Script Programming
+          DEFINE, DECLARE, UNDEFINE, UNDECLARE, ASSIGN, EVALUATE,
+          SEXPRESSION, ARRAY, SORT, INPUT, OUTPUT, IF, FOR, WHILE,
+          SWITCH, GOTO, ECHO, ASK, GETC, GETOK, ASSERT, WAIT, SLEEP,
+          FOPEN, FREAD, FWRITE, FCLOSE, STOP, END, RETURN, LEARN, SHIFT,
+          TRACE, VOID, INCREMENT, DECREMENT, ... For these and many more
+          you'll need to consult the [68]manual and supplements, and/or
+          visit the [69]Kermit Script Library, which also includes a
+          brief tutorial. Hint: HELP LEARN to find out how to get Kermit
+          to write simple scripts for you.
+          
+   Many of Kermit's commands have synonyms, variants, relatives, and so
+   on. For example, MSEND is a version of SEND that accepts a list of
+   file specifications to be sent, rather than just one file
+   specification, and MPUT is a synonym of MSEND. MOVE means to SEND and
+   then DELETE the source file if successful. MMOVE is like MOVE, but
+   accepts a list of filespecs, and so on. These are described in the
+   [70]full documentation.
+   
+   Use question mark to feel your way through an unfamiliar command, as
+   in this example (the part you type is underlined):
+   
+  C-Kermit> remote ? One of the following:
+   assign     delete     help       login      print      rename     space
+   cd         directory  host       logout     pwd        rmdir      type
+   copy       exit       kermit     mkdir      query      set        who
+  C-Kermit> remote set ? One of the following:
+   attributes   file         retry        transfer
+   block-check  receive      server       window
+  C-Kermit> remote set file ? One of the following:
+   character-set  incomplete     record-length
+   collision      names          type
+  C-Kermit> remote set file names ? One of the following:
+   converted  literal
+  C-Kermit> remote set file names literal
+  C-Kermit>
+
+   This is called menu on demand: you get a menu when you want one, but
+   menus are not forced on you even when know what you're doing. Note
+   that you can also abbreviate most keywords, and you can complete them
+   with the Tab or Esc key. Also note that ? works for filenames too, and
+   that you can use it in the middle of a keyword or filename, not just
+   at the beginning. For example, "send x?" lists all the files in the
+   current directory whose names start with 'x'.
+   
+   [ [71]Kermit Home ] [ [72]C-Kermit Home ] [ [73]C-Kermit FAQ ]
+    ________________________________________________________________________
+  
+  INITIALIZATION FILE [ [74]Top ] [ [75]Contents ] [ [76]Next ] [ [77]Previous
+  ]
+  
+   In its default configuration, C-Kermit executes commands from a file
+   called .kermrc in your home directory when it starts, unless it is
+   given the -Y or -y command-line option. Custom configurations might
+   substitute a shared system-wide initialization file. The SHOW FILE
+   command tells what initialization file, if any, was used. The standard
+   initialization file "chains" to an individual customization file,
+   .mykermc, in the home directory, in which each user can establish
+   her/his own preferences, define macros, and so on.
+   
+   Since execution of the initialization file (at least the standard one)
+   makes C-Kermit take longer to start, it might be better not to have an
+   initialization file, especially now that Kermit's default startup
+   configuration is well attuned to modern computing and networking -- in
+   other words, you no longer have do anything special to make Kermit
+   transfers go fast. So instead of having an initialization file that is
+   executed every time Kermit starts, you might consider making one or
+   more kerbang scripts (with names other that .kermrc) that do NOT
+   include an "exit" command, and invoke those when you need the
+   settings, macro definitions, and/or scripted actions they contain, and
+   invoke C-Kermit directly when you don't.
+   
+   To put it another way... We still distribute the standard
+   initialization file since it's featured in the manual and backwards
+   compatibility is important to us. But there's no harm in not using it
+   if you don't need the stuff that's in it (services directory, dialing
+   directory, network directory, and associated macro definitions). On
+   the other hand, if there are settings or macros you want in effect
+   EVERY time you use Kermit, the initialization file (or the
+   customization file it chains to) is the place to put them, because
+   that's the only place Kermit looks for them automatically each time
+   you start it.
+   
+   [ [78]Kermit Home ] [ [79]C-Kermit Home ] [ [80]C-Kermit FAQ ]
+    ________________________________________________________________________
+  
+  MODES OF OPERATION [ [81]Top ] [ [82]Contents ] [ [83]Next ] [ [84]Previous ]
+  
+   Kermit is said to be in Local mode if it has made a connection to
+   another computer, e.g. by dialing it or establishing a Telnet
+   connection to it. The other computer is remote, so if you start
+   another copy of Kermit on the remote computer, it is said to be in
+   Remote mode (as long as it has not made any connections of its own).
+   The local Kermit communicates over the communications device or
+   network connection, acting as a conduit between the the remote
+   computer and your keyboard and screen. The remote Kermit is the
+   file-transfer partner to the local Kermit and communicates only
+   through its standard input and output.
+   
+   At any moment, a Kermit program can be in any of the following states.
+   It's important to know what they are and how to change from one to the
+   other.
+   
+   Command state
+          
+          In this state, Kermit reads commands from:
+          
+          + Your keyboard; or:
+          + A file, or:
+          + A macro definition.
+            
+          You can exit from Command state back to Unix with the EXIT or
+          QUIT command (same thing). You can enter Connect state with any
+          of various commands (CONNECT, DIAL, TELNET, etc). You can enter
+          file transfer state with commands like SEND, RECEIVE, and GET.
+          You can enter Server state with the SERVER command. The TAKE
+          command tells Kermit to read and execute commands from a file.
+          The (perhaps implied) DO command tells Kermit to read and
+          execute commands from a macro definition. While in Command
+          state, you can interrupt any command, macro, or command file by
+          typing Ctrl-C (hold down the Ctrl key and press the C key);
+          this normally brings you back to the prompt.
+          
+   Shell state
+          
+          You can invoke an inferior shell or external command from the
+          Kermit command prompt by using the PUSH, RUN (!), EDIT, or
+          BROWSE command. While the inferior shell or command is active,
+          Kermit is suspended and does nothing. Return to Kermit Command
+          state by exiting from the inferior shell or application.
+          
+   Connect state
+          
+          In this state, which can be entered only when in Local mode
+          (i.e. when Kermit has made a connection to another computer),
+          Kermit is acting as a terminal to the remote computer. Your
+          keystrokes are sent to the remote computer and characters that
+          arrive over the communication connection are displayed on your
+          screen. This state is entered when you give a CONNECT, DIAL,
+          TELNET, RLOGIN, or IKSD command. You can return to command
+          state by logging out of the remote computer, or by typing:
+          
+  Ctrl-\c
+
+          That is: Hold down the Ctrl key and press the backslash key,
+          then let go of the Ctrl key and press the C key. This is called
+          escaping back. Certain other escape-level commands are also
+          provided; type Ctrl-\? for a list. For example, you can enter
+          Shell state with:
+          
+  Ctrl-\!
+
+          To send a Ctrl-\ to the host while in Connect state, type two
+          of them in a row. See HELP CONNECT and HELP SET ESCAPE for more
+          info.
+          
+   Local file-transfer state
+          
+          In this state, Kermit is sending packets back and forth with
+          the other computer in order to transfer a file or accomplish
+          some other file-related task. And at the same time, it is
+          displaying its progress on your screen and watching your
+          keyboard for interruptions. In this state, the following
+          single-keystroke commands are accepted:
+          
+            X Interrupt the current file and go on to the next (if any).
+            Z Interrupt the current file and skip all the rest.
+            E Like Z but uses a "stronger" protocol (use if X or Z don't
+          work).
+            Ctrl-C   Interrupt file-transfer mode (use if Z or E don't
+          work).
+          
+          Kermit returns to its previous state (Command or Connect) when
+          the transfer is complete or when interrupted successfully by X,
+          Z, E, or Ctrl-C (hold down the Ctrl key and press the C key).
+          
+   Remote file-transfer state
+          
+          In this state, Kermit is exchanging file-transfer packets with
+          its local partner over its standard i/o. It leaves this state
+          automatically when the transfer is complete. In case you find
+          your local Kermit in Connect state and the remote one in
+          File-transfer state (in which it seems to ignore your
+          keystrokes), you can usually return it to command state by
+          typing three Ctrl-C's in a row. If that doesn't work, return
+          your local Kermit to Command state (Ctrl-\ C) and type
+          "e-packet" and then press the Return or Enter key; this forces
+          a fatal Kermit protocol error.
+          
+   Remote Server state
+          
+          This is like Remote File-transfer state, except it never
+          returns automatically to Command state. Rather, it awaits
+          further instructions from the client program; that is, from
+          your Local Kermit program. You can return the Remote Server to
+          its previous state by issuing a "finish" command to the client,
+          or if you are in Connect state, by typing three Ctrl-C's in a
+          row. You can tell the server job to log out and break the
+          connection by issuing a "bye" command to the client.
+          
+   Local Server state
+          
+          Like Remote-Server state, but in local mode, and therefore with
+          its file-transfer display showing, and listening for single-key
+          commands, as in Local File-transfer state. Usually this state
+          is entered automatically when a remote Kermit program gives a
+          GET command.
+          
+   C-Kermit, Kermit 95, and MS-DOS Kermit all can switch automatically
+   from Connect state to Local File-transfer state when you initiate a
+   file transfer from the remote computer by starting Kermit and telling
+   it to send or get a file, in which case, Connect state is
+   automatically resumed after the file transfer is finished.
+   
+   Note that C-Kermit is not a terminal emulator. It is a communications
+   application that you run in a terminal window (e.g. console or Xterm).
+   The specific emulation, such as VT100, VT220, Linux Console, or Xterm,
+   is provided by the terminal window in which you are running C-Kermit.
+   Kermit 95 and MS-DOS Kermit, on the other hand, are true terminal
+   emulators. Why is C-Kermit not a terminal emulator? [85]CLICK HERE to
+   read about it.
+   
+   [ [86]Kermit Home ] [ [87]C-Kermit Home ] [ [88]C-Kermit FAQ ]
+    ________________________________________________________________________
+  
+  MAKING CONNECTIONS [ [89]Top ] [ [90]Contents ] [ [91]Next ] [ [92]Previous ]
+  
+   Here is how to make different kinds of connections using interactive
+   Kermit commands (as noted above, you can also make connections with
+   command-line options). Note that you don't have to make connections
+   with Kermit. It can also be used on the far end of a connection as the
+   remote file transfer and management partner of your local
+   communications software.
+   
+   Making a Telnet Connection
+          
+          At the C-Kermit command prompt, simply type:
+          
+  telnet foo.bar.com         ; Substitute desired host name or address.
+  telnet xyzcorp.com 3000    ; You can also include a port number.
+
+          If the connection is successful, Kermit automically enters
+          Connect state. When you logout from the remote host, Kermit
+          automatically returns to its prompt. More info: HELP TELNET,
+          HELP SET TELNET, HELP SET TELOPT. Also see the [93]IKSD section
+          below.
+          
+   Making an Rlogin connection
+          
+          This is just like Telnet, except you have to be root to do it
+          because Rlogin uses a privileged TCP port:
+          
+  rlogin foo.bar.com         ; Substitute desired host name or address.
+
+          More info: HELP RLOGIN.
+          
+   Making an SSH Connection
+          
+          Unlike Telnet and Rlogin, SSH connections are not built-in, but
+          handled by running your external SSH client through a
+          pseudoterminal. Using C-Kermit to control the SSH client gives
+          you all of Kermit's features (file transfer, character-set
+          conversion, scripting, etc) over SSH.
+          
+  ssh foo.bar.com            ; Substitute desired host name or address.
+
+          More info: HELP SSH, HELP SET SSH.
+          
+   Dialing with a Modem
+          
+          If it's an external modem, make sure it is connected to a
+          usable serial port on your computer with a regular
+          (straight-through) modem cable, and to the telephone jack with
+          a telephone cable, and that it's turned on. Then use these
+          commands:
+          
+  set modem type usrobotics  ; Or other supported type
+  set line /dev/ttyS0        ; Specify device name
+  set speed 57600            ; Or other desired speed
+  set flow rts/cts           ; Most modern modems support this
+  set dial method tone       ; (or pulse)
+  dial 7654321               ; Dial the desired number
+
+          Type "set modem type ?" for a list of supported modem types. If
+          you omit the SET MODEM TYPE command, the default type is
+          "generic-high-speed", which should work for most modern
+          AT-command-set modems. If the line is busy, Kermit redials
+          automatically. If the call does not succeed, use "set dial
+          display on" and try it again to watch what happens. If the call
+          succeeds, Kermit enters Connect state automatically and returns
+          to its prompt automatically when you log out from the remote
+          computer or the connection is otherwise lost.
+          
+          You can also dial from a modem that is accessible by Telnet,
+          e.g. to a reverse terminal server. In this case the command
+          sequence is:
+          
+  set host ts.xxx.com 2000   ; Terminal-server and port
+  set modem type usrobotics  ; Or other supported type
+  set dial method tone       ; (or pulse)
+  dial 7654321               ; Dial the desired number
+
+          If the terminal server supports the Telnet Com Port Option,
+          [94]RFC 2217, you can also give serial-port related commands
+          such as SET SPEED, SET PARITY, and so on, and Kermit relays
+          them to the terminal server using the protocol specified in the
+          RFC.
+          
+          More info: HELP SET MODEM, HELP SET LINE, HELP SET SPEED, HELP
+          SET FLOW, HELP DIAL, HELP SET DIAL, HELP SET MODEM, HELP SET
+          CARRIER-WATCH, SHOW COMMUNICATIONS, SHOW MODEM, SHOW DIAL.
+          
+   Direct Serial Port
+          
+          Connect the two computers, A and B, with a null modem cable (or
+          two modem cables interconnected with a null-modem adapter or
+          modem eliminator). From Computer A:
+          
+  set modem type none        ; There is no modem
+  set line /dev/ttyS0        ; Specify device name
+  set carrier-watch off      ; If DTR and CD are not cross-connected
+  set speed 57600            ; Or other desired speed
+  set flow rts/cts           ; If RTS and CTS are cross-connected
+  set flow xon/xoff          ; If you can't use RTS/CTS
+  set parity even            ; (or "mark" or "space", if necessary)
+  set stop-bits 2            ; (rarely necessary)
+  connect                    ; Enter Connect (terminal) state
+
+          This assumes Computer B is set up to let you log in. If it
+          isn't, you can run a copy of Kermit on Computer B and follow
+          approximately the same directions. More info: As above plus
+          HELP CONNECT.
+          
+   With modems or direct serial connections, you might also have to "set
+   parity even" (or "mark" or "space") if it's a 7-bit connection.
+   
+   Of the connection types listed above, only one can be open at a time.
+   However, any one of these can be open concurrently with an [95]FTP or
+   HTTP session. Each connection type can be customized to any desired
+   degree, scripted, logged, you name it. See the manual.
+   
+   NOTE: On selected platforms, C-Kermit also can make X.25 connections.
+   See the manual for details.
+   
+   [ [96]Kermit Home ] [ [97]C-Kermit Home ] [ [98]C-Kermit FAQ ]
+    ________________________________________________________________________
+  
+  TRANSFERRING FILES WITH KERMIT [ [99]Top ] [ [100]Contents ] [ [101]Next ] [
+  [102]Previous ]
+  
+     * [103]Downloading Files
+     * [104]Uploading Files
+     * [105]Kermit Transfers the Old-Fashioned Way
+     * [106]If File Transfer Fails
+     * [107]Advanced Kermit File Transfer Features
+     * [108]Non-Kermit File Transfer
+       
+   There is a [109]widespread and persistent belief that Kermit is a slow
+   protocol. This is because, until recently, it used conservative tuning
+   by default to make sure file transfers succeeded, rather than failing
+   because they overloaded the connection. Some extra commands (or
+   command-line options, like -Q) were needed to make it go fast, but
+   nobody bothered to find out about them. Also, it takes two to tango:
+   most non-Kermit-Project Kermit protocol implementations really ARE
+   slow. The best file-transfer partners for C-Kermit are: another copy
+   of [110]C-Kermit (7.0 or later) and [111]Kermit 95. These combinations
+   work well and they work fast by default. MS-DOS Kermit is good too,
+   but you have to tell it to go fast (by giving it the FAST command).
+   
+   Furthermore, all three of these Kermit programs support "autodownload"
+   and "autoupload", meaning that when they are in Connect state and a
+   Kermit packet comes in from the remote, they automatically switch into
+   file transfer mode.
+   
+   And plus, C-Kermit and K95 also switch automatically between text and
+   binary mode for each file, so there is no need to "set file type
+   binary" or "set file type text", or to worry about files being
+   corrupted because they were transferred in the wrong mode.
+   
+   What all of these words add up to is that now, when you use up-to-date
+   Kermit software from the Kermit Project, file transfer is not only
+   fast, it's ridiculously easy. You barely have to give any commands at
+   all.
+   
+   Downloading Files
+          
+          Let's say you have [112]Kermit 95, [113]C-Kermit, or
+          [114]MS-DOS Kermit on your desktop computer, with a connection
+          to a Unix computer that has C-Kermit installed as "kermit". To
+          download a file (send it from Unix to your desktop computer),
+          just type the following command at your Unix shell prompt:
+          
+  kermit -s oofa.txt
+
+          (where oofa.txt is the filename). If you want to send more than
+          one file, you can put as many filenames as you want on the
+          command line, and they can be any combination of text and
+          binary:
+          
+  kermit -s oofa.txt oofa.zip oofa.html oofa.tar.gz
+
+          and/or you can use wildcards to send groups of files:
+          
+  kermit -s oofa.*
+
+          If you want to send a file under an assumed name, use:
+          
+  kermit -s friday.txt -a today.txt
+
+          This sends the file friday.txt but tells the receiving Kermit
+          that its name is today.txt. In all cases, as noted, when the
+          file transfer is finished, your desktop Kermit returns
+          automatically to Connect state. No worries about escaping back,
+          re-connecting, text/binary mode switching. Almost too easy,
+          right?
+          
+   Uploading Files
+          
+          To upload files (send them from your desktop computer to the
+          remote Unix computer) do the same thing, but use the -g (GET)
+          option instead of -s:
+          
+  kermit -g oofa.txt
+
+          This causes your local Kermit to enter server mode; then the
+          remote Kermit program requests the named file and the local
+          Kermit sends it and returns automatically to Connect state when
+          done.
+          
+          If you want to upload multiple files, you have have use shell
+          quoting rules, since these aren't local files:
+          
+  kermit -g "oofa.txt oofa.zip oofa.html oofa.tar.gz"
+  kermit -g "oofa.*"
+
+          If you want to upload a file but store it under a different
+          name, use:
+          
+  kermit -g friday.txt -a today.txt
+
+   Kermit Transfers the Old-Fashioned Way
+          
+          If your desktop communications software does not support
+          autoupload or autodownload, or it does not include Kermit
+          server mode, the procedure requires more steps.
+          
+          To download a file, type:
+          
+  kermit -s filename
+
+          on the host as before, but if nothing happens automatically in
+          response to this command, you have to switch your desktop
+          communications software into Kermit Receive state. This might
+          be done by escaping back using keyboard characters or hot keys
+          (Alt-x is typical) and/or with a command (like RECEIVE) or a
+          menu. When the file transfer is complete, you have to go back
+          to Connect state, Terminal emulation, or whatever terminology
+          applies to your desktop communications software.
+          
+          To upload a file, type:
+          
+  kermit -r
+
+          on the host (rather than "kermit -g"). This tells C-Kermit to
+          wait passively for a file to start arriving. Then regain the
+          attention of your desktop software (Alt-x or whatever) and
+          instruct it to send the desired file(s) with Kermit protocol.
+          When the transfer is finished, return to the Connect or
+          Terminal screen.
+          
+   If File Transfer Fails
+          
+          Although every aspect of Kermit's operation can be finely
+          tuned, there are also three short and simple "omnibus tuning"
+          commands you can use for troubleshooting:
+          
+        FAST
+                Use fast file-transfer settings. This has been the
+                default since C-Kermit 7.0 now that most modern computers
+                and connections support it. If transfers fail with fast
+                settings, try . . .
+                
+        CAUTIOUS
+                Use cautious but not paranoid settings. File transfers,
+                if they work, will go at medium speed. If not, try . . .
+                
+        ROBUST
+                Use the most robust, resilient, conservative, safe, and
+                reliable settings. File transfers will almost certainly
+                work, but they will be quite slow (of course this is a
+                classic tradeoff; ROBUST was C-Kermit's default tuning in
+                versions 6.0 and earlier, which made everybody think
+                Kermit protocol was slow). If ROBUST doesn't do the
+                trick, try again with SET PARITY SPACE first in case it's
+                not an 8-bit connection.
+                
+          Obviously the success and performance of a file transfer also
+          depends on C-Kermit's file transfer partner. Up-to-date, real
+          [115]Kermit Project partners are recommended because they
+          contain the best Kermit protocol implementations and because
+          [116]we can support them in case of trouble.
+          
+          If you still have trouble, consult Chapter 10 of [117]Using
+          C-Kermit, or send email to [118]kermit-support@columbia.edu.
+          
+   Advanced Kermit File-Transfer Features
+          
+          Obviously there is a lot more to Kermit file transfer,
+          including all sorts of interactive commands, preferences,
+          options, logging, debugging, troubleshooting, and anything else
+          you can imagine but that's what the [119]manual and updates are
+          for. Here are a few topics you can explore if you're interested
+          by Typing HELP for the listed commands:
+          
+        Logging transfers:
+                LOG TRANSACTIONS (HELP LOG)
+                
+        Automatic per-file text/binary mode switching:
+                SET TRANSFER MODE { AUTOMATIC, MANUAL } (HELP SET
+                TRANSFER).
+                
+        Cross-platform recursive directory tree transfer:
+                SEND /RECURSIVE, GET /RECURSIVE (HELP SEND, HELP GET).
+                
+        File collision options:
+                SET FILE COLLISION { OVERWRITE, BACKUP, DISCARD, ... }
+                (HELP SET FILE).
+                
+        Update mode (only transfer files that changed since last time):
+                SET FILE COLLISION UPDATE (HELP SET FILE).
+                
+        Filename selection patterns:
+                (HELP WILDCARD).
+                
+        Flexible file selection:
+                SEND (or GET) /BEFORE /AFTER /LARGER /SMALLER /TYPE
+                /EXCEPT, ...
+                
+        Character-set conversion:
+                SET { FILE, TRANSFER } CHARACTER-SET, ASSOCIATE, ...
+                
+        File/Pathname control:
+                SET { SEND, RECEIVE } PATHNAMES, SET FILE NAMES.
+                
+        Atomic file movement:
+                SEND (or GET) /DELETE /RENAME /MOVE-TO
+                
+        Transferring to/from standard i/o of other commands:
+                SEND (or GET) /COMMAND
+                
+        Recovery of interrupted transfer from point of failure:
+                RESEND, REGET (HELP RESEND, HELP REGET).
+                
+   Non-Kermit File Transfer
+          
+          You can also use C-Kermit to transfer files with FTP or HTTP
+          Internet protocols; [120]see below.
+          
+          On a regular serial or Telnet connection where the other
+          computer doesn't support Kermit protocol at all, you have
+          several options. For example, if your desktop communications
+          software supports Zmodem, use "rz" and "sz" on the host rather
+          than Kermit. But if Kermit is your desktop software, and you
+          are using it to make calls or network connections to other
+          computers that don't support Kermit protocol (or that don't
+          have a good implementation of it), then if your computer also
+          has external X, Y, or Zmodem programs that are redirectable,
+          Kermit can use them as external protocols. HELP SET PROTOCOL
+          for details.
+          
+          You can also capture "raw" data streams from the other computer
+          with LOG SESSION (HELP LOG and HELP SET SESSION-LOG for
+          details), and you can upload files without any protocol at all
+          with TRANSMIT (HELP TRANSMIT, HELP SET TRANSMIT).
+          
+   [ [121]Kermit Home ] [ [122]C-Kermit Home ] [ [123]C-Kermit FAQ ]
+    ________________________________________________________________________
+  
+  KERMIT CLIENT/SERVER CONNECTIONS [ [124]Top ] [ [125]Contents ] [ [126]Next ]
+  [ [127]Previous ]
+  
+   On any kind of connection you can make with Kermit -- serial, TCP/IP,
+   X.25, etc -- you can set up a convenient client/server relationship
+   between your Kermit client (the one that made the connection) and the
+   Kermit program on the far end of the connection (the remote Kermit) by
+   putting the remote Kermit in server mode. This is normally done by
+   giving it a SERVER command, or by starting it with the -x command-line
+   option. In some cases ([128]Internet Kermit Service, SSH connections
+   to a Kermit subsystem, or specially configured hosts), there is
+   already a Kermit server waiting on the far end. Here is a quick
+   synopsis of the commands you can give to the client for interacting
+   with the server:
+   
+   SEND [ switches ] filename
+          Sends the named file to the server. The filename can include
+          wildcards. Lots of switches are available for file selection,
+          etc. Type HELP SEND at the client prompt for details.
+          
+   GET [ switches ] filename
+          Asks the server to send the named file. The filename can
+          include wildcards. Type HELP GET at the client prompt for
+          details.
+          
+   BYE
+          Terminates the server and closes your connection to it.
+          
+   FINISH
+          Terminates the server. If you started the server yourself, this
+          leaves the remote host at its shell prompt. If it was a
+          dedicated server (such as IKSD or an SSH subsystem), FINISH is
+          equivalent to BYE.
+          
+   SET LOCUS { LOCAL, REMOTE, AUTO }
+          (C-Kermit 8.0.201 and later, K95 1.1.21 and later) This tells
+          the client whether file-management commands like CD, PWD,
+          DIRECTORY, DELETE, MKDIR, etc, should be executed locally or by
+          the server. In this type of connection, the default is LOCAL.
+          Use SET LOCUS REMOTE if you want Kermit to behave like an FTP
+          client, in which case these commands are executed remotely, and
+          their local versions must have an L prefix: LCD, LPWD,
+          LDIRECTORY, etc. When LOCUS is LOCAL, then the remote versions
+          must have an R prefix: RCD, RPWD, RDIRECTORY, etc. HELP SET
+          LOCUS for details. SHOW COMMAND to see current locus.
+          
+   The following commands are affected by SET LOCUS:
+   
+   CD, LCD, RCD
+   Change (working, current) directory. HELP CD for details.
+   
+   CDUP, LCDUP, RCDUP
+   CD one level up.
+   
+   DIRECTORY, LDIRECTORY, RDIRECTORY
+   Produce a directory listing. Many options are available for local
+   listings. HELP DIRECTORY for details.
+   
+   DELETE, LDELETE, RDELETE
+   Deletes files or directories. Many options available, HELP DELETE.
+   
+   RENAME, LRENAME, RRENAME
+   Renames files or directories. Many options available, HELP RENAME.
+   
+   MKDIR, LMKDIR, RMKDIR
+   Creates a directory. HELP MKDIR.
+   
+   RMDIR, LRMDIR, RRMDIR
+   Removes a directory. HELP RMDIR. There are dozens -- maybe hundreds --
+   of other commands, described in the built-in help, on the website,
+   and/or in the published or online manuals. But even if you don't have
+   access to documentation, you can "set locus remote" and then use
+   pretty much the same commands you would use with any FTP client.
+   
+   [ [129]Kermit Home ] [ [130]C-Kermit Home ] [ [131]C-Kermit FAQ ]
+    ________________________________________________________________________
+  
+  KERMIT'S BUILT-IN FTP AND HTTP CLIENTS [ [132]Top ] [ [133]Contents ] [
+  [134]Next ] [ [135]Previous ]
+  
+   Kermit's FTP client is like the regular Unix FTP client that you're
+   used to, but with some differences:
+   
+     * It has lots more commands and features.
+     * You can have an FTP session and a regular Kermit serial or Telnet
+       session open at the same time.
+     * FTP sessions can be fully automated.
+       
+   By default Kermit's FTP client tries its best to present the same user
+   interface as a regular FTP client: PUT, GET, DIR, CD, BYE, etc, should
+   work the same, even though some of these commands have different
+   meaning in Kermit-to-Kermit connections; for example, CD, DIR, RENAME,
+   etc, in Kermit act locally, whereas in FTP they are commands for the
+   server. This might cause some confusion, but as in all things Kermit,
+   you have total control:
+   
+     * The [136]SET LOCUS command lets you specify where file management
+       commands should be executed -- locally or remotely -- for any kind
+       of connection.
+     * Any FTP command can be prefixed with the word "FTP" to remove any
+       ambiguity.
+       
+   Pending publication of the next edition of the manual, the Kermit FTP
+   client is thoroughly documented at the Kermit Project website:
+   
+  [137]http://www.columbia.edu/kermit/ftpclient.html
+
+   You also can use HELP FTP and HELP SET FTP to get descriptions of
+   Kermit's FTP-related commands.
+   
+   The HTTP client is similar to the FTP one, except you prefix each
+   command with HTTP instead of FTP: HTTP OPEN, HTTP GET, HTTP PUT, HTTP
+   CLOSE, etc. Type HELP HTTP for details, or visit the to view the
+   [138]manual supplements. HTTP connections can be open at the same time
+   as regular serial or Telnet connections and FTP connections. So Kermit
+   can manage up to three types connections simultaneously.
+   
+   [ [139]Kermit Home ] [ [140]C-Kermit Home ] [ [141]C-Kermit FAQ ] [
+   [142]FTP Client ] [ [143]HTTP Client ]
+    ________________________________________________________________________
+  
+  INTERNET KERMIT SERVICE [ [144]Top ] [ [145]Contents ] [ [146]Next ] [
+  [147]Previous ]
+  
+   C-Kermit can be configured and run as an Internet service (called
+   IKSD), similar to an FTP server (FTPD) except you can (but need not)
+   interact with it directly, plus it does a lot more than an FTP server
+   can do. The TCP port for IKSD is 1649. It uses Telnet protocol.
+   C-Kermit can be an Internet Kermit Server, or it can be a client of an
+   IKSD. You can make connections from C-Kermit to an IKSD with any of
+   the following commands:
+   
+  telnet foo.bar.edu 1649
+  telnet foo.bar.edu kermit   ; if "kermit" is listed in /etc/services
+  iksd foo.bar.edu
+
+   The IKSD command is equivalent to a TELNET command specifying port
+   1649. For more information about making and using connections to an
+   IKSD, see:
+   
+  [148]http://www.columbia.edu/kermit/cuiksd.html
+
+   You can run an Internet Kermit Service on your own computer too (if
+   you are the system administrator). For instructions, see:
+   
+  [149]http://www.columbia.edu/kermit/iksd.html
+
+   [ [150]Kermit Home ] [ [151]C-Kermit Home ] [ [152]C-Kermit FAQ ]
+    ________________________________________________________________________
+  
+  SECURITY [ [153]Top ] [ [154]Contents ] [ [155]Next ] [ [156]Previous ]
+  
+   All of C-Kermit's built-in TCP/IP networking methods (Telnet, Rlogin,
+   IKSD, FTP, and HTTP) can be secured by one or more of the following
+   IETF-approved methods:
+   
+     * MIT Kerberos IV
+     * MIT Kerberos V
+     * SSL/TLS
+     * Stanford SRP
+       
+   For complete instructions see:
+   
+  [157]http://www.columbia.edu/kermit/security.html
+
+   And as noted previously, you can also make SSH connections with
+   C-Kermit if you already have an SSH client installed.
+   
+   [ [158]Kermit Home ] [ [159]C-Kermit Home ] [ [160]C-Kermit FAQ ]
+    ________________________________________________________________________
+  
+  ALTERNATIVE COMMAND-LINE PERSONALITIES [ [161]Top ] [ [162]Contents ] [
+  [163]Next ] [ [164]Previous ]
+  
+   When invoked as "kermit" or any other name besides any of the special
+   ones, C-Kermit has the command-line options described above in the
+   [165]OPTIONS section. However, if you invoke C-Kermit using any of the
+   following names:
+   
+     telnet  Telnet client
+     ftp     FTP client
+     http    HTTP client
+     https   Secure HTTP client
+   
+   Kermit's command-line personality changes to match. This can be done
+   (among other ways) with symbolic links (symlinks). For example, if you
+   want C-Kermit to be your regular Telnet client, or the Telnet helper
+   of your Web browser, you can create a link like the following in a
+   directory that lies in your PATH ahead of the regular telnet program:
+   
+  ln -s /usr/local/bin/kermit telnet
+
+   Now when you give a "telnet" command, you are invoking Kermit instead,
+   but with its Telnet command-line personality so, for example:
+   
+  telnet xyzcorp.com
+
+   Makes a Telnet connection to xyzcorp.com, and Kermit exits
+   automatically when the connection is closed (just like the regular
+   Telnet client). Type "telnet -h" to get a list of Kermit's
+   Telnet-personality command-line options, which are intended to be as
+   compatible as possible with the regular Telnet client.
+   
+   Similarly for FTP:
+   
+  ln -s /usr/local/bin/kermit ftp
+
+   And now type "ftp -h" to see its command-line options, and use command
+   lines just like you would give your regular FTP client:
+   
+  ftp -n xyzcorp.com
+
+   but with additional options allowing an entire session to be specified
+   on the command line, as explained in the C-Kermit [166]FTP client
+   documentation.
+   
+   And similarly for HTTP:
+   
+  ln -s /usr/local/bin/kermit http
+  ./http -h
+  ./http www.columbia.edu -g kermit/index.html
+
+   Finally, if Kermit's first command-line option is a Telnet, FTP, IKSD,
+   or HTTP URL, Kermit automatically makes the appropriate kind of
+   connection and, if indicated by the URL, takes the desired action:
+   
+  kermit telnet:xyzcorp.com                            ; Opens a Telnet session
+  kermit telnet://olga@xyzcorp.com                     ; Ditto for user olga
+  kermit ftp://olga@xyzcorp.com/public/oofa.zip        ; Downloads a file
+  kermit kermit://kermit.columbia.edu/kermit/f/READ.ME ; Ditto for IKSD
+  kermit iksd://kermit.columbia.edu/kermit/f/READ.ME   ; (This works too)
+  kermit http://www.columbia.edu/kermit/index.html     ; Grabs a web page
+  kermit https://wwws.xyzcorp.com/secret/plan.html     ; Grabs a secure web pag
+e
+
+   [ [167]Kermit Home ] [ [168]C-Kermit Home ] [ [169]C-Kermit FAQ ]
+    ________________________________________________________________________
+  
+  LICENSE [ [170]Top ] [ [171]Contents ] [ [172]Next ] [ [173]Previous ]
+  
+   C-Kermit has an unusual license, but a fair and sensible one given
+   that the Kermit Project must support itself out of revenue: it's not a
+   BSD license, not GPL, not Artistic, not commercial, not shareware, not
+   freeware. It can be summed up like this: if you want C-Kermit for your
+   own use, you can download and use it without cost or license (but we'd
+   appreciate it if you would purchase the manual). But if you want to
+   sell C-Kermit or bundle it with a product or otherwise distribute it
+   in a commercial setting EXCEPT WITH AN OPEN-SOURCE OPERATING SYSTEM
+   DISTRIBUTION such as Linux, FreeBSD, NetBSD, or OpenBSD, you must
+   license it. To see the complete license, give the LICENSE command at
+   the prompt, or see the COPYING.TXT file distributed with C-Kermit 7.0
+   or later, or download it from
+   [174]ftp://kermit.columbia.edu/kermit/c-kermit/COPYING.TXT. Send
+   licensing inquiries to [175]kermit@columbia.edu.
+   
+   [ [176]Kermit Home ] [ [177]C-Kermit Home ] [ [178]C-Kermit FAQ ]
+    ________________________________________________________________________
+  
+  OTHER TOPICS [ [179]Top ] [ [180]Contents ] [ [181]Next ] [ [182]Previous ]
+  
+   There's way more to C-Kermit than we've touched on here --
+   troubleshooting, customization, character sets, dialing directories,
+   sending pages, script writing, and on and on, all of which are covered
+   in the manual and updates and supplements. For the most up-to-date
+   information on documentation (or updated documentation itself) visit
+   the Kermit Project website:
+   
+  [183]http://www.columbia.edu/kermit/
+
+   There you will also find [184]Kermit software packages for other
+   platforms: different Unix varieties, Windows, DOS, VMS, IBM
+   mainframes, and many others: 20+ years' worth.
+   
+   [ [185]Kermit Home ] [ [186]C-Kermit Home ] [ [187]C-Kermit FAQ ]
+    ________________________________________________________________________
+  
+  DOCUMENTATION AND UPDATES [ [188]Top ] [ [189]Contents ] [ [190]Next ] [
+  [191]Previous ]
+  
+   The manual for C-Kermit is:
+   
+    1. Frank da Cruz and Christine M. Gianone, [192]Using C-Kermit,
+       Second Edition, Digital Press / Butterworth-Heinemann, Woburn, MA,
+       1997, 622 pages, ISBN 1-55558-164-1. This is a printed book. It
+       covers C-Kermit 6.0.
+    2. The C-Kermit 7.0 Supplement:
+       [193]http://www.columbia.edu/kermit/ckermit70.html
+    3. The C-Kermit 8.0 Supplement:
+       [194]http://www.columbia.edu/kermit/ckermit80.html
+       
+   The C-Kermit home page is here:
+   
+  [195]http://www.columbia.edu/kermit/ckermit.html
+
+   Visit this page to learn about new versions, Beta tests, and other
+   news; to read case studies and tutorials; to download source code,
+   install packages, and [196]prebuilt binaries for many platforms. Also
+   visit:
+   
+   [197]http://www.columbia.edu/kermit/scriptlib.html
+          The Kermit script library and tutorial
+          
+   [198]http://www.columbia.edu/kermit/newfaq.html
+          The Kermit FAQ (Frequently Asked Questions about Kermit)
+          
+   [199]http://www.columbia.edu/kermit/ckfaq.html
+          The C-Kermit FAQ (Frequently Asked Questions about C-Kermit)
+          
+   [200]http://www.columbia.edu/kermit/security.html
+          The Kermit security reference.
+          
+   [201]http://www.columbia.edu/kermit/telnet.html
+          C-Kermit Telnet client documentation.
+          
+   [202]http://www.columbia.edu/kermit/studies.html
+          Case studies.
+          
+   [203]http://www.columbia.edu/kermit/ckcbwr.html
+          General C-Kermit Hints and Tips.
+          
+   [204]http://www.columbia.edu/kermit/ckubwr.html
+          Unix C-Kermit Hints and Tips.
+          
+   [205]http://www.columbia.edu/kermit/ckvbwr.html
+          VMS C-Kermit Hints and Tips.
+          
+   [206]http://www.columbia.edu/kermit/ckuins.html
+          Unix C-Kermit Installation Instructions
+          
+   [207]http://www.columbia.edu/kermit/ckvins.html
+          VMS C-Kermit Installation Instructions
+          
+   [208]http://www.columbia.edu/kermit/support.html
+          Technical support.
+          
+   [209]http://www.columbia.edu/kermit/k95tutorial.html
+          Kermit 95 tutorial (this document).
+          
+   [210]comp.protocols.kermit.misc
+          The Kermit newsgroup (unmoderated).
+          
+   [ [211]Kermit Home ] [ [212]C-Kermit Home ] [ [213]C-Kermit FAQ ]
+    ________________________________________________________________________
+  
+  FILES [ [214]Top ] [ [215]Contents ] [ [216]Next ] [ [217]Previous ]
+  
+   [218]COPYING.TXT
+          C-Kermit license.
+          
+   [219]~/.kermrc
+          Initialization file.
+          
+   [220]~/.mykermrc
+          Customization file.
+          
+   ~/.kdd
+          Kermit dialing directory (see manual).
+          
+   ~/.knd
+          Kermit network directory (see manual).
+          
+   ~/.ksd
+          Kermit services directory (see manual).
+          
+   [221]ckuins.html
+          Installation instructions for Unix.
+          
+   [222]ckcbwr.html
+          General C-Kermit bugs, hints, tips.
+          
+   [223]ckubwr.html
+          Unix-specific C-Kermit bugs, hints, tips.
+          
+   [224]ckcplm.html
+          C-Kermit program logic manual.
+          
+   [225]ckccfg.html
+          C-Kermit compile-time configuration options.
+          
+   ssh
+          (in your PATH) SSH connection helper.
+          
+   rz, sz, etc.
+          (in your PATH) external protocols for XYZmodem.
+          
+   /var/spool/locks (or whatever)
+          UUCP lockfile for dialing out (see [226]installation
+          instructions).
+          
+   [ [227]Kermit Home ] [ [228]C-Kermit Home ] [ [229]C-Kermit FAQ ]
+    ________________________________________________________________________
+  
+  AUTHORS [ [230]Top ] [ [231]Contents ] [ [232]Previous ]
+  
+     Frank da Cruz and Jeffrey E Altman
+     The Kermit Project - Columbia Univerity
+     612 West 115th Street
+     New York NY 10025-7799
+     USA
+     
+   1985-present, with contributions from hundreds of others all over the
+   world.
+     _________________________________________________________________
+   
+   
+    C-Kermit 8.0 Unix Manual Page and Tutorial /
+    [233]kermit@columbia.edu / 24 October 2002
+
+References
+
+   1. http://www.columbia.edu/kermit/
+   2. http://www.columbia.edu/
+   3. http://www.columbia.edu/kermit/ckututor.pdf
+   4. ftp://kermit.columbia.edu/kermit/test/text/ckuker.nr
+   5. http://www.columbia.edu/kermit/ckututor.html#description
+   6. http://www.columbia.edu/kermit/ckututor.html#synopsis
+   7. http://www.columbia.edu/kermit/ckututor.html#options
+   8. http://www.columbia.edu/kermit/ckututor.html#commands
+   9. http://www.columbia.edu/kermit/ckututor.html#initfile
+  10. http://www.columbia.edu/kermit/ckututor.html#modes
+  11. http://www.columbia.edu/kermit/ckututor.html#connections
+  12. http://www.columbia.edu/kermit/ckututor.html#transfer
+  13. http://www.columbia.edu/kermit/ckututor.html#server
+  14. http://www.columbia.edu/kermit/ckututor.html#ftp
+  15. http://www.columbia.edu/kermit/ckututor.html#iksd
+  16. http://www.columbia.edu/kermit/ckututor.html#security
+  17. http://www.columbia.edu/kermit/ckututor.html#personae
+  18. http://www.columbia.edu/kermit/ckututor.html#license
+  19. http://www.columbia.edu/kermit/ckututor.html#other
+  20. http://www.columbia.edu/kermit/ckututor.html#documentation
+  21. http://www.columbia.edu/kermit/ckututor.html#files
+  22. http://www.columbia.edu/kermit/ckututor.html#authors
+  23. http://www.columbia.edu/kermit/ckututor.html#top
+  24. http://www.columbia.edu/kermit/ckututor.html#contents
+  25. http://www.columbia.edu/kermit/ckututor.html#synopsis
+  26. http://www.columbia.edu/kermit/ckermit.html
+  27. http://www.columbia.edu/kermit/
+  28. http://www.columbia.edu/
+  29. ftp://ftp.isi.edu/in-notes/rfc2839.txt
+  30. ftp://ftp.isi.edu/in-notes/rfc2840.txt
+  31. http://www.columbia.edu/kermit/ckututor.html#documentation
+  32. http://www.columbia.edu/kermit/
+  33. http://www.columbia.edu/kermit/
+  34. http://www.columbia.edu/kermit/ckermit.html
+  35. http://www.columbia.edu/kermit/ckfaq.html
+  36. http://www.columbia.edu/kermit/ckututor.html#top
+  37. http://www.columbia.edu/kermit/ckututor.html#contents
+  38. http://www.columbia.edu/kermit/ckututor.html#options
+  39. http://www.columbia.edu/kermit/ckututor.html#synopsis
+  40. http://www.columbia.edu/kermit/ckututor.html#kerbang
+  41. http://www.columbia.edu/kermit/ckututor.html#personae
+  42. http://www.columbia.edu/kermit/ckututor.html#kerbang
+  43. http://www.columbia.edu/kermit/ckututor.html#initfile
+  44. http://www.columbia.edu/kermit/ckututor.html#initfile
+  45. http://www.columbia.edu/kermit/ckututor.html#personae
+  46. http://www.columbia.edu/kermit/ckututor.html#options
+  47. http://www.columbia.edu/kermit/ckututor.html#commands
+  48. http://www.columbia.edu/kermit/
+  49. http://www.columbia.edu/kermit/ckermit.html
+  50. http://www.columbia.edu/kermit/ckfaq.html
+  51. http://www.columbia.edu/kermit/ckututor.html#top
+  52. http://www.columbia.edu/kermit/ckututor.html#contents
+  53. http://www.columbia.edu/kermit/ckututor.html#commands
+  54. http://www.columbia.edu/kermit/ckututor.html#description
+  55. http://www.columbia.edu/kermit/ckututor.html#commands
+  56. http://www.columbia.edu/kermit/ckututor.html#personae
+  57. http://www.columbia.edu/kermit/ckututor.html#personae
+  58. http://www.columbia.edu/kermit/ckututor.html#iksd
+  59. http://www.columbia.edu/kermit/ckututor.html#transfer
+  60. http://www.columbia.edu/kermit/ckututor.html#top
+  61. http://www.columbia.edu/kermit/ckututor.html#contents
+  62. http://www.columbia.edu/kermit/ckututor.html#initfile
+  63. http://www.columbia.edu/kermit/ckututor.html#options
+  64. http://www.columbia.edu/kermit/ckututor.html#kerbang
+  65. http://www.columbia.edu/kermit/ckututor.html#cmdlist
+  66. http://www.columbia.edu/kermit/ckututor.html#documentation
+  67. http://www.columbia.edu/kermit/ckututor.html#initfile
+  68. http://www.columbia.edu/kermit/ckututor.html#documentation
+  69. http://www.columbia.edu/kermit/ckscripts.html
+  70. http://www.columbia.edu/kermit/ckututor.html#documentation
+  71. http://www.columbia.edu/kermit/
+  72. http://www.columbia.edu/kermit/ckermit.html
+  73. http://www.columbia.edu/kermit/ckfaq.html
+  74. http://www.columbia.edu/kermit/ckututor.html#top
+  75. http://www.columbia.edu/kermit/ckututor.html#contents
+  76. http://www.columbia.edu/kermit/ckututor.html#modes
+  77. http://www.columbia.edu/kermit/ckututor.html#commands
+  78. http://www.columbia.edu/kermit/
+  79. http://www.columbia.edu/kermit/ckermit.html
+  80. http://www.columbia.edu/kermit/ckfaq.html
+  81. http://www.columbia.edu/kermit/ckututor.html#top
+  82. http://www.columbia.edu/kermit/ckututor.html#contents
+  83. http://www.columbia.edu/kermit/ckututor.html#connections
+  84. http://www.columbia.edu/kermit/ckututor.html#initfile
+  85. http://www.columbia.edu/kermit/ckfaq.html#term
+  86. http://www.columbia.edu/kermit/
+  87. http://www.columbia.edu/kermit/ckermit.html
+  88. http://www.columbia.edu/kermit/ckfaq.html
+  89. http://www.columbia.edu/kermit/ckututor.html#top
+  90. http://www.columbia.edu/kermit/ckututor.html#contents
+  91. http://www.columbia.edu/kermit/ckututor.html#transfer
+  92. http://www.columbia.edu/kermit/ckututor.html#modes
+  93. http://www.columbia.edu/kermit/ckututor.html#iksd
+  94. ftp://ftp.isi.edu/in-notes/rfc2217.txt
+  95. http://www.columbia.edu/kermit/ckututor.html#ftp
+  96. http://www.columbia.edu/kermit/
+  97. http://www.columbia.edu/kermit/ckermit.html
+  98. http://www.columbia.edu/kermit/ckfaq.html
+  99. http://www.columbia.edu/kermit/ckututor.html#top
+ 100. http://www.columbia.edu/kermit/ckututor.html#contents
+ 101. http://www.columbia.edu/kermit/ckututor.html#server
+ 102. http://www.columbia.edu/kermit/ckututor.html#connections
+ 103. http://www.columbia.edu/kermit/ckututor.html#download
+ 104. http://www.columbia.edu/kermit/ckututor.html#upload
+ 105. http://www.columbia.edu/kermit/ckututor.html#oldfashioned
+ 106. http://www.columbia.edu/kermit/ckututor.html#trouble
+ 107. http://www.columbia.edu/kermit/ckututor.html#advanced
+ 108. http://www.columbia.edu/kermit/ckututor.html#nonkermit
+ 109. http://www.columbia.edu/kermit/kermit.html#notslow
+ 110. http://www.columbia.edu/kermit/ckermit.html
+ 111. http://www.columbia.edu/kermit/k95.html
+ 112. http://www.columbia.edu/kermit/k95.html
+ 113. http://www.columbia.edu/kermit/ckermit.html
+ 114. http://www.columbia.edu/kermit/mskermit.html
+ 115. http://www.columbia.edu/kermit/
+ 116. http://www.columbia.edu/kermit/support.html
+ 117. http://www.columbia.edu/kermit/ckmanual.html
+ 118. mailto:kermit-support@columbia.edu
+ 119. http://www.columbia.edu/kermit/ckututor.html#documentation
+ 120. http://www.columbia.edu/kermit/ckututor.html#ftp
+ 121. http://www.columbia.edu/kermit/
+ 122. http://www.columbia.edu/kermit/ckermit.html
+ 123. http://www.columbia.edu/kermit/ckfaq.html
+ 124. http://www.columbia.edu/kermit/ckututor.html#top
+ 125. http://www.columbia.edu/kermit/ckututor.html#contents
+ 126. http://www.columbia.edu/kermit/ckututor.html#ftp
+ 127. http://www.columbia.edu/kermit/ckututor.html#transfer
+ 128. http://www.columbia.edu/kermit/ckututor.html#iksd
+ 129. http://www.columbia.edu/kermit/
+ 130. http://www.columbia.edu/kermit/ckermit.html
+ 131. http://www.columbia.edu/kermit/ckfaq.html
+ 132. http://www.columbia.edu/kermit/ckututor.html#top
+ 133. http://www.columbia.edu/kermit/ckututor.html#contents
+ 134. http://www.columbia.edu/kermit/ckututor.html#iksd
+ 135. http://www.columbia.edu/kermit/ckututor.html#transfer
+ 136. http://www.columbia.edu/kermit/ckututor.html#server
+ 137. http://www.columbia.edu/kermit/ftpclient.html
+ 138. http://www.columbia.edu/kermit/ckututor.html#documentation
+ 139. http://www.columbia.edu/kermit/
+ 140. http://www.columbia.edu/kermit/ckermit.html
+ 141. http://www.columbia.edu/kermit/ckfaq.html
+ 142. http://www.columbia.edu/kermit/ckermit3.html#x3
+ 143. http://www.columbia.edu/kermit/ckermit3.html#x2.2
+ 144. http://www.columbia.edu/kermit/ckututor.html#top
+ 145. http://www.columbia.edu/kermit/ckututor.html#contents
+ 146. http://www.columbia.edu/kermit/ckututor.html#security
+ 147. http://www.columbia.edu/kermit/ckututor.html#ftp
+ 148. http://www.columbia.edu/kermit/cuiksd.html
+ 149. http://www.columbia.edu/kermit/iksd.html
+ 150. http://www.columbia.edu/kermit/
+ 151. http://www.columbia.edu/kermit/ckermit.html
+ 152. http://www.columbia.edu/kermit/ckfaq.html
+ 153. http://www.columbia.edu/kermit/ckututor.html#top
+ 154. http://www.columbia.edu/kermit/ckututor.html#contents
+ 155. http://www.columbia.edu/kermit/ckututor.html#personae
+ 156. http://www.columbia.edu/kermit/ckututor.html#iksd
+ 157. http://www.columbia.edu/kermit/security.html
+ 158. http://www.columbia.edu/kermit/
+ 159. http://www.columbia.edu/kermit/ckermit.html
+ 160. http://www.columbia.edu/kermit/ckfaq.html
+ 161. http://www.columbia.edu/kermit/ckututor.html#top
+ 162. http://www.columbia.edu/kermit/ckututor.html#contents
+ 163. http://www.columbia.edu/kermit/ckututor.html#license
+ 164. http://www.columbia.edu/kermit/ckututor.html#iksd
+ 165. http://www.columbia.edu/kermit/ckututor.html#options
+ 166. http://www.columbia.edu/kermit/ckermit3.html#x3.1.2
+ 167. http://www.columbia.edu/kermit/
+ 168. http://www.columbia.edu/kermit/ckermit.html
+ 169. http://www.columbia.edu/kermit/ckfaq.html
+ 170. http://www.columbia.edu/kermit/ckututor.html#top
+ 171. http://www.columbia.edu/kermit/ckututor.html#contents
+ 172. http://www.columbia.edu/kermit/ckututor.html#other
+ 173. http://www.columbia.edu/kermit/ckututor.html#personae
+ 174. ftp://kermit.columbia.edu/kermit/c-kermit/COPYING.TXT
+ 175. mailto:kermit@columbia.edu
+ 176. http://www.columbia.edu/kermit/
+ 177. http://www.columbia.edu/kermit/ckermit.html
+ 178. http://www.columbia.edu/kermit/ckfaq.html
+ 179. http://www.columbia.edu/kermit/ckututor.html#top
+ 180. http://www.columbia.edu/kermit/ckututor.html#contents
+ 181. http://www.columbia.edu/kermit/ckututor.html#documentation
+ 182. http://www.columbia.edu/kermit/ckututor.html#license
+ 183. http://www.columbia.edu/kermit/
+ 184. http://www.columbia.edu/kermit/howtoget.html
+ 185. http://www.columbia.edu/kermit/
+ 186. http://www.columbia.edu/kermit/ckermit.html
+ 187. http://www.columbia.edu/kermit/ckfaq.html
+ 188. http://www.columbia.edu/kermit/ckututor.html#top
+ 189. http://www.columbia.edu/kermit/ckututor.html#contents
+ 190. http://www.columbia.edu/kermit/ckututor.html#files
+ 191. http://www.columbia.edu/kermit/ckututor.html#other
+ 192. http://www.columbia.edu/kermit/ckmanual.html
+ 193. http://www.columbia.edu/kermit/ckermit70.html
+ 194. http://www.columbia.edu/kermit/ckermit80.html
+ 195. http://www.columbia.edu/kermit/ckermit.html
+ 196. http://www.columbia.edu/kermit/ck80binaries.html
+ 197. http://www.columbia.edu/kermit/scriptlib.html
+ 198. http://www.columbia.edu/kermit/newfaq.html
+ 199. http://www.columbia.edu/kermit/ckfaq.html
+ 200. http://www.columbia.edu/kermit/security.html
+ 201. http://www.columbia.edu/kermit/telnet.html
+ 202. http://www.columbia.edu/kermit/studies.html
+ 203. http://www.columbia.edu/kermit/ckcbwr.html
+ 204. http://www.columbia.edu/kermit/ckubwr.html
+ 205. http://www.columbia.edu/kermit/ckvbwr.html
+ 206. http://www.columbia.edu/kermit/ckuins.html
+ 207. http://www.columbia.edu/kermit/ckvins.html
+ 208. http://www.columbia.edu/kermit/support.html
+ 209. http://www.columbia.edu/kermit/k95tutorial.html
+ 210. news:comp.protocols.kermit.misc
+ 211. http://www.columbia.edu/kermit/
+ 212. http://www.columbia.edu/kermit/ckermit.html
+ 213. http://www.columbia.edu/kermit/ckfaq.html
+ 214. http://www.columbia.edu/kermit/ckututor.html#top
+ 215. http://www.columbia.edu/kermit/ckututor.html#contents
+ 216. http://www.columbia.edu/kermit/ckututor.html#authors
+ 217. http://www.columbia.edu/kermit/ckututor.html#documentation
+ 218. ftp://kermit.columbia.edu/kermit/c-kermit/COPYING.TXT
+ 219. ftp://kermit.columbia.edu/kermit/c-kermit/ckermit.ini
+ 220. ftp://kermit.columbia.edu/kermit/c-kermit/ckermod.ini
+ 221. http://www.columbia.edu/kermit/ckuins.html
+ 222. http://www.columbia.edu/kermit/ckcbwr.html
+ 223. http://www.columbia.edu/kermit/ckubwr.html
+ 224. http://www.columbia.edu/kermit/ckcplm.html
+ 225. http://www.columbia.edu/kermit/ckccfg.html
+ 226. http://www.columbia.edu/kermit/ckuins.html
+ 227. http://www.columbia.edu/kermit/
+ 228. http://www.columbia.edu/kermit/ckermit.html
+ 229. http://www.columbia.edu/kermit/ckfaq.html
+ 230. http://www.columbia.edu/kermit/ckututor.html#top
+ 231. http://www.columbia.edu/kermit/ckututor.html#contents
+ 232. http://www.columbia.edu/kermit/ckututor.html#files
+ 233. mailto:kermit@columbia.edu