
                      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
