Annotation of 43BSD/contrib/kermit/ckuker.mss, revision 1.1

1.1     ! root        1: @comment[      -*-Text-*-      ]
        !             2: @Part(CKUNIX,root="KER:KUSER")
        !             3: @string(-ckversion="@q<4C(057)>")
        !             4: @define(exx=example,above 2,below 1)
        !             5: @Chapter<UNIX KERMIT>
        !             6: 
        !             7: @Begin<Description,Leftmargin +12,Indent -12,spread 0>
        !             8: @i(Program:)@\Frank da Cruz, Bill Catchings, Jeff Damens, Columbia
        !             9: University; Herm Fischer, Encino CA; contributions by
        !            10: many others.
        !            11: 
        !            12: @i(Language:)@\C
        !            13: 
        !            14: @i(Documentation:)@\Frank da Cruz, Herm Fischer
        !            15: 
        !            16: @i(Version:)@\@value(-ckversion)
        !            17: 
        !            18: @i(Date: )@\July 26, 1985
        !            19: @end<Description>
        !            20: 
        !            21: C-Kermit is a completely new implementation of Kermit, written modularly and
        !            22: transportably in C.  The protocol state transition table is written in
        !            23: @i'wart', a (non-@|proprietary) lex-@|like preprocessor for C.
        !            24: System-@|dependent primitive functions are isolated into separately compiled
        !            25: modules so that the program should be easily portable among Unix systems and
        !            26: also to non-@|Unix systems that have C compilers.  This document applies to
        !            27: Unix implementations of C-Kermit, and in most ways also to the VMS
        !            28: implementation.
        !            29: 
        !            30: @subheading<Unix Kermit Capabilities At A Glance:>
        !            31: @begin<format,leftmargin +2,above 1,below 1>
        !            32: @tabclear()@tabset(3.5inches,4.0inches)
        !            33: Local operation:@\Yes
        !            34: Remote operation:@\Yes
        !            35: Login scripts:@\Yes
        !            36: Transfer text files:@\Yes
        !            37: Transfer binary files:@\Yes
        !            38: Wildcard send:@\Yes
        !            39: File transfer interruption:@\Yes
        !            40: Filename collision avoidance:@\Yes
        !            41: Can time out:@\Yes
        !            42: 8th-bit prefixing:@\Yes
        !            43: Repeat count prefixing:@\Yes
        !            44: Alternate block checks:@\Yes
        !            45: Terminal emulation:@\Yes
        !            46: Communication settings:@\Yes
        !            47: Transmit BREAK:@\Yes
        !            48: Support for dialout modems:@\Yes
        !            49: IBM mainframe communication:@\Yes
        !            50: Transaction logging:@\Yes
        !            51: Session logging:@\Yes
        !            52: Debug logging:@\Yes
        !            53: Packet logging:@\Yes
        !            54: Act as server:@\Yes
        !            55: Talk to server:@\Yes
        !            56: Advanced server functions:@\Yes
        !            57: Local file management:@\Yes
        !            58: Command/Init files:@\Yes
        !            59: UUCP and multiuser line locking:@\Yes
        !            60: File attributes packets:@\No
        !            61: Command macros:@\No
        !            62: Raw file transmit:@\No
        !            63: @end<format>
        !            64: 
        !            65: @index(C-Kermit)@index(Unix Kermit)
        !            66: C-Kermit provides traditional Unix command line operation as well as
        !            67: interactive command prompting and execution.  The command line options
        !            68: provide access to a minimal subset of C-Kermit's capabilities; the
        !            69: interactive command set is far richer.
        !            70: 
        !            71: On systems with dialout modems, C-Kermit can use its command file and login
        !            72: script facilities to replicate the file transfer functionality of
        !            73: UUCP among heterogeneous operating systems, including the use of scheduled
        !            74: (e.g. late night) unattended operation.
        !            75: 
        !            76: @section(The Unix File System)
        !            77: 
        !            78: Consult your Unix manual for details about the file system under your version
        !            79: of Unix.  For the purposes of Kermit, several things are worth briefly noting.
        !            80: Unix files generally have lowercase names, possibly containing one or more dots
        !            81: or other special characters.  Unix directories are tree-@|structured.
        !            82: Directory levels are separated by slash (@qq[/]) characters.  For example,
        !            83: @example(/usr/foo/bar)
        !            84: denotes the file @q(bar) in the directory @q(/usr/foo).  Wildcard or
        !            85: "meta" characters allow groups of files to be specified.  @qq(*)
        !            86: matches any string; @qq(?) matches any single character.
        !            87: 
        !            88: When C-Kermit is invoked with file arguments specified on the Unix command
        !            89: line, the Unix shell (Bourne Shell, C-Shell, etc) expands the meta characters 
        !            90: itself, and in this case a wider variety is available.  For example,
        !            91: @example(kermit -s ~/ck[uvm]*.{upd,bwr}])
        !            92: is expanded by the Berkeley C-Shell into a list of all the files in the
        !            93: user's home directory (@q[~/]) that start with the characters "@q(ck)",
        !            94: followed by a single character @qq(u), @qq(v), or @qq(m), followed by zero
        !            95: or more characters, followed by a dot, followed by one of the strings
        !            96: @qq(upd) or @qq(bwr).  Internally, the C-Kermit program itself expands only
        !            97: the @qq(*) and @qq(?) meta characters.
        !            98: 
        !            99: Unix files are linear streams of 8-bit bytes.  Text files consist of 7-bit
        !           100: ASCII characters, with the high-@|order bit off (0), and lines separated by the
        !           101: Unix newline character, which is linefeed (LF, ASCII 10).  This distinguishes
        !           102: Unix text files from those on most other ASCII systems, in which lines are
        !           103: separated by a carriage-@|return linefeed sequence (CRLF, ASCII 13 followed by
        !           104: ASCII 10).  Binary files are likely to contain data in the high bits of the
        !           105: file bytes, and have no particular line or record structure.
        !           106: 
        !           107: When transferring files, C-Kermit will convert between upper and lower
        !           108: case filenames and between LF and CRLF line terminators automatically,
        !           109: unless told to do otherwise.  When binary files must be transferred, the
        !           110: program must be instructed not to perform LF/CRLF conversion (@q[-i] on the
        !           111: command line or "set file type binary" interactively; see below).
        !           112: 
        !           113: @section(File Transfer)
        !           114: 
        !           115: If C-Kermit is in local mode, the screen (stdout) is continously updated to
        !           116: show the progress of the file transer.  A dot is printed for every four data
        !           117: packets, other packets are shown by type:
        !           118: @begin(description,leftmargin +6, indent -2, spread 0)
        !           119: I@\Exchange Parameter Information
        !           120: 
        !           121: R@\Receive Initiate
        !           122: 
        !           123: S@\Send Initiate
        !           124: 
        !           125: F@\File Header
        !           126: 
        !           127: G@\Generic Server Command
        !           128: 
        !           129: C@\Remote Host Command
        !           130: 
        !           131: N@\Negative Acknowledgement (NAK)
        !           132: 
        !           133: E@\Fatal Error
        !           134: 
        !           135: T@\Indicates a timeout occurred
        !           136: 
        !           137: Q@\Indicates a damaged, undesired, or illegal packet was received
        !           138: 
        !           139: @q<%>@\Indicates a packet was retransmitted
        !           140: @end(description)
        !           141: You may type certain "interrupt" commands during file transfer:
        !           142: @begin(description,leftmargin +16,indent -12,spread 0)
        !           143: Control-F:@\Interrupt the current File, and go on to the next (if any).
        !           144: 
        !           145: Control-B:@\Interrupt the entire Batch of files, terminate the transaction.
        !           146: 
        !           147: Control-R:@\Resend the current packet
        !           148: 
        !           149: Control-A:@\Display a status report for the current transaction.
        !           150: @end(description)
        !           151: These interrupt characters differ from the ones used in other Kermit
        !           152: implementations to avoid conflict with commonly used Unix shell interrupt
        !           153: characters.  With Version 7, System III, and System V implementations of
        !           154: Unix, interrupt commands must be preceeded by the 'connect' escape character
        !           155: (e.g. normally-@q[\]).
        !           156: 
        !           157: @begin(quotation)
        !           158: @i(CAUTION:)@index(Warning)@index<File Warning>
        !           159:  If Control-F or Control-B is used to cancel an incoming file,
        !           160: and a file of the same name previously existed, @i(and) the "file warning"
        !           161: feature is not enabled, then the previous copy of the file will disappear.
        !           162: @end(quotation)
        !           163: 
        !           164: @i(EMERGENCY EXIT:)@index<Emergency Exit>
        !           165: When running Unix Kermit in remote mode, if you have started a protocol
        !           166: operation (sending or receiving a file, server command wait, etc), you will
        !           167: not be able to regain control of the terminal until the protocol operation
        !           168: has run its course (completed or timed out).  In particular, you cannot stop
        !           169: the protocol by typing the normal Unix interrupt characters, since the
        !           170: terminal has been put in "raw mode".  If you need to regain control quickly
        !           171: -- for instance, because the protocol is stuck -- you can type the following
        !           172: sequence of four characters directly to the Unix Kermit program ("connect"
        !           173: first if necessary):
        !           174: @display<Control-A Control-C Control-C Carriage-Return>
        !           175: This will cause the program to exit and restore the terminal to normal.
        !           176: 
        !           177: @section(Command Line Operation)
        !           178: 
        !           179: The C-Kermit command line syntax has been changed from that of earlier
        !           180: releases of Unix Kermit to conform to the @ux(Proposed Syntax Standards for
        !           181: Unix System Commands) put forth by Kathy Hemenway and Helene Armitage of
        !           182: AT&T Bell Laboratories in @i(Unix/World), Vol.1, No.3, 1984.  The rules that
        !           183: apply are:
        !           184: 
        !           185: @begin(itemize,spread 0)
        !           186: Command names must be between 2 and 9 characters ("kermit" is 6).
        !           187: 
        !           188: Command names must include lower case letters and digits only.
        !           189: 
        !           190: An option name is a single character.
        !           191: 
        !           192: Options are delimited by '@q(-)'.
        !           193: 
        !           194: Options with no arguments may be grouped (bundled) behind one delimiter.
        !           195: 
        !           196: Option-arguments cannot be optional.
        !           197: 
        !           198: Arguments immediately follow options, separated by whitespace.
        !           199: 
        !           200: The order of options does not matter.
        !           201: 
        !           202: '@q(-)' preceded and followed by whitespace means standard input.
        !           203: @end(itemize)
        !           204: A group of bundled options may end with an option that has an argument.
        !           205: 
        !           206: The following notation is used in command descriptions:
        !           207: @begin(description,leftmargin +8,indent -8)
        !           208: @i(fn)@\A Unix file specification, possibly containing the "wildcard"
        !           209: characters `@q[*]' or `@q[?]' (`@q[*]' matches all character strings, `@q[?]'
        !           210: matches any single character).
        !           211: 
        !           212: @i(fn1)@\A Unix file specification which may not contain `@q[*]' or `@q[?]'.
        !           213: 
        !           214: @i(rfn)@\A remote file specification in the remote system's own syntax, which
        !           215: may denote a single file or a group of files.
        !           216: 
        !           217: @i(rfn1)@\A remote file specification which should denote only a single file.
        !           218: 
        !           219: @i(n)@\A decimal number between 0 and 94.
        !           220: 
        !           221: @i(c)@\A decimal number between 0 and 127 representing the value of an
        !           222: ASCII character.
        !           223: 
        !           224: @i(cc)@\A decimal number between 0 and 31, or else exactly 127,
        !           225: representing the value of an ASCII control character.
        !           226: 
        !           227: @q([ ])@\Any field in square braces is optional.
        !           228: 
        !           229: @q({x,y,z})@\Alternatives are listed in curly braces.
        !           230: @end(description)
        !           231: 
        !           232: C-Kermit command line options may specify either actions or settings.  If
        !           233: C-Kermit is invoked with a command line that specifies no actions, then it
        !           234: will issue a prompt and begin interactive dialog.
        !           235: Action options specify either protocol transactions or terminal connection.
        !           236: 
        !           237: @begin<description,leftmargin +8,indent -8>
        !           238: @q(-s )@i(fn)@\Send the specified file or files.  If @i(fn) contains
        !           239: wildcard (meta) characters, the Unix shell expands it into a list.  If @i(fn)
        !           240: is '@q[-]' then kermit sends from standard input, which must
        !           241: come from a file:
        !           242: @example(kermit -s - < foo.bar)
        !           243: or a parallel process:
        !           244: @example(ls -l | kermit -s -)
        !           245: You cannot use this mechanism to send
        !           246: terminal typein.  If you want to send a file whose name is @qq(-)
        !           247: you can precede it with a path name, as in
        !           248: @example(kermit -s ./-)
        !           249: 
        !           250: @q(-r)@\Receive a file or files.  Wait passively for files to arrive.
        !           251: 
        !           252: @q(-k)@\Receive (passively) a file or files, sending them to standard
        !           253: output.  This option can be used in several ways:
        !           254: @begin(description,leftmargin +4,indent -4)
        !           255: @q(kermit -k)@\Displays the incoming files on your screen; to be used only
        !           256: in "local mode" (see below).
        !           257: 
        !           258: @q(kermit -k > )@i(fn1)@\Sends the incoming file or files to the named file,
        !           259: @i(fn1).  If more than one file arrives, all are concatenated together
        !           260: into the single file @i(fn1).
        !           261: 
        !           262: @q(kermit -k | command)@\Pipes the incoming data (single or multiple
        !           263: files) to the indicated command, as in
        !           264: @example'kermit -k | sort > sorted.stuff'
        !           265: @end(description)
        !           266: 
        !           267: @q(-a )@i(fn1)@\If you have specified a file transfer option, you may specify
        !           268: an alternate name for a single file with the @q(-a) option.  For example,
        !           269: @example'kermit -s foo -a bar'
        !           270: sends the file @q(foo) telling the receiver that its name is @q(bar).
        !           271: If more than one file arrives or is sent, only the first file is
        !           272: affected by the @q(-a) option:
        !           273: @example'kermit -ra baz'
        !           274: stores the first incoming file under the name @q(baz).
        !           275: 
        !           276: @q(-x)@\Begin server operation.  May be used in either local or remote mode.
        !           277: @end(description)
        !           278: 
        !           279: Before proceeding, a few words about remote and local operation are
        !           280: necessary.  C-Kermit is "local" if it is running on PC or workstation that
        !           281: you are using directly, or if it is running on a multiuser system and
        !           282: transferring files over an external communication line -- not your job's
        !           283: controlling terminal or console.  C-Kermit is remote if it is running on a
        !           284: multiuser system and transferring files over its own controlling terminal's
        !           285: communication line, connected to your PC or workstation.
        !           286: 
        !           287: If you are running C-Kermit on a PC, it is in local mode by default,
        !           288: with the "back port" designated for file transfer and terminal connection.
        !           289: If you are running C-Kermit on a multiuser (timesharing) system, it is
        !           290: in remote mode unless you explicitly point it at an external line for
        !           291: file transfer or terminal connection.  The following command sets
        !           292: C-Kermit's "mode":
        !           293: 
        !           294: @begin(description,leftmargin +8,indent -8)
        !           295: @q(-l )@i(dev)@\Line  -- Specify a terminal line to use for file
        !           296: transfer and terminal connection, as in
        !           297: @example'kermit -l /dev/ttyi5'
        !           298: @end(description)
        !           299: 
        !           300: When an external line is being used, you might also need some additional
        !           301: options for successful communication with the remote system:
        !           302: 
        !           303: @begin(description,leftmargin +8,indent -8)
        !           304: @q(-b )@i(n)@\Baud  -- Specify the baud rate for the line given in the
        !           305: @q(-l) option, as in
        !           306: @example'kermit -l /dev/ttyi5 -b 9600'
        !           307: This option should always be included with the @q(-l) option, since the
        !           308: speed of an external line is not necessarily what you expect.
        !           309: 
        !           310: @q(-p )@i(x)@\Parity -- e,o,m,s,n (even, odd, mark, space, or none).  If parity
        !           311: is other than none, then the 8th-bit prefixing mechanism will be
        !           312: used for transferring 8-bit binary data, provided the opposite
        !           313: Kermit agrees.  The default parity is none.
        !           314: 
        !           315: @q(-t)@\Specifies half duplex, line turnaround with XON as the handshake
        !           316: character.
        !           317: @end(description)
        !           318: 
        !           319: The following commands may be used only with a C-Kermit which is local --
        !           320: either by default or else because the -l option has been specified.
        !           321: 
        !           322: @begin(description,leftmargin +8,indent -8)
        !           323: @q(-g )@i(rfn)@\Actively request a remote server to send the named file
        !           324: or files; @i(rfn) is a file specification in the remote host's own syntax.  If
        !           325: @i(fn) happens to contain any special shell characters, like '@q(*)',
        !           326: these must be quoted, as in
        !           327: @example'kermit -g x\*.\?'
        !           328: 
        !           329: @q(-f)@\Send a 'finish' command to a remote server.
        !           330: 
        !           331: @q(-c)@\Establish a terminal connection over the specified or default
        !           332: communication line, before any protocol transaction takes place.
        !           333: Get back to the local system by typing the escape character
        !           334: (normally Control-Backslash) followed by the letter 'c'.
        !           335: 
        !           336: @q(-n)@\Like @q(-c), but @i(after) a protocol transaction takes place;
        !           337: @q(-c) and @q(-n) may both be used in the same command.  The use of @q(-n)
        !           338: and @q(-c) is illustrated below.
        !           339: @end(description)
        !           340: On a timesharing system, the @q(-l) and @q(-b) options will also have to
        !           341: be included with the @q(-r), @q(-k), or @q(-s) options if the other
        !           342: Kermit is on a remote system.
        !           343: 
        !           344: Several other command-line options are provided:
        !           345: @begin(description,leftmargin +8,indent -8)
        !           346: @q(-i)@\Specifies that files should be sent or received exactly "as is"
        !           347: with no conversions.  This option is necessary for transmitting
        !           348: binary files.  It may also be used to slightly boost efficiency
        !           349: in Unix-to-Unix transfers of text files by eliminating CRLF/newline
        !           350: conversion.
        !           351: 
        !           352: @q(-w)@\Write-Protect -- Avoid filename collisions for incoming files.
        !           353: 
        !           354: @q(-q)@\Quiet -- Suppress screen update during file transfer, for instance
        !           355: to allow a file transfer to proceed in the background.
        !           356: 
        !           357: @q(-d)@\Debug -- Record debugging information in the file @q(debug.log) in 
        !           358: the current directory.  Use this option if you believe the program
        !           359: is misbehaving, and show the resulting log to your local
        !           360: kermit maintainer.
        !           361: 
        !           362: @q(-h)@\Help -- Display a brief synopsis of the command line options.
        !           363: @end(description)
        !           364: The command line may contain no more than one protocol action option.
        !           365: 
        !           366: Files are sent with their own names, except that lowercase letters are raised
        !           367: to upper, pathnames are stripped off, certain special characters like (`@q[~]')
        !           368: and (`@q[#]') are changed to `@q(X)', and if the file name begins with a
        !           369: period, an `@q(X)' is inserted before it.  Incoming files are stored under
        !           370: their own names except that uppercase letters are lowered, and, if @q(-w) was
        !           371: specified, a "generation number" is appended to the name if it has the same
        !           372: name as an existing file which would otherwise be overwritten.  If the @q(-a)
        !           373: option is included, then the same rules apply to its argument.  The file
        !           374: transfer display shows any transformations performed upon filenames.
        !           375: 
        !           376: During transmission, files are encoded as follows:
        !           377: @begin(itemize)
        !           378: Control characters are converted to prefixed printables.
        !           379: 
        !           380: Sequences of repeated characters are collapsed via repeat counts, if
        !           381: the other Kermit is also capable of repeated-@|character compression.
        !           382: 
        !           383: If parity is being used on the communication line, data characters with 
        !           384: the 8th (parity) bit on are specially prefixed, provided the other Kermit
        !           385: is capable of 8th-bit prefixing; if not, 8-bit binary files cannot be
        !           386: successfully transferred.
        !           387: 
        !           388: Conversion is done between Unix newlines and carriage-@|return-@|linefeed 
        !           389: sequences unless the @q(-i) option was specified.
        !           390: @end(itemize)
        !           391: 
        !           392: @subheading(Command Line Examples:)
        !           393: 
        !           394: @exx(kermit -l /dev/ttyi5 -b 1200 -cn -r)
        !           395: This command connects you to the system on the other end of @q(ttyi5) at
        !           396: 1200 baud, where you presumably log in and run Kermit with a 'send'
        !           397: command.  After you escape back, C-Kermit waits for a file (or files) to
        !           398: arrive.  When the file transfer is completed, you are again connected to
        !           399: the remote system so that you can logout.
        !           400: 
        !           401: @exx(kermit -l /dev/ttyi4 -b 1800 -cntp m -r -a foo)
        !           402: This command is like the preceding one, except the remote system in this
        !           403: case uses half duplex communication with mark parity.  The first file
        !           404: that arrives is stored under the name @q(foo).
        !           405: 
        !           406: @exx(kermit -l /dev/ttyi6 -b 9600 -c | tek)
        !           407: This example uses Kermit to connect your terminal to the system at the
        !           408: other end of @q(ttyi6).  The C-Kermit terminal connection does not
        !           409: provide any particular terminal emulation, so C-Kermit's standard i/o is
        !           410: piped through a (hypothetical) program called tek, which performs (say)
        !           411: Tektronix emulation.
        !           412: 
        !           413: @exx(kermit -l /dev/ttyi6 -b 9600 -nf)
        !           414: This command would be used to shut down a remote server and then connect
        !           415: to the remote system, in order to log out or to make further use of it.
        !           416: The @q(-n) option is invoked @i(after) @q(-f) (@q[-c] would have been invoked
        !           417: before).
        !           418: 
        !           419: @exx(kermit -l /dev/ttyi6 -b 9600 -qg foo.\* &)
        !           420: This command causes C-Kermit to be invoked in the background, getting a group
        !           421: of files from a remote server (note the quoting of the `@q[*]' character).  No
        !           422: display occurs on the screen, and the keyboard is not sampled for
        !           423: interruption commands.  This allows other work to be done while file
        !           424: transfers proceed in the background.
        !           425: 
        !           426: @exx(kermit -l /dev/ttyi6 -b 9600 -g foo.\* > foo.log < /dev/null &)
        !           427: This command is like the previous one, except the file transfer display has
        !           428: been redirected to the file @q(foo.log).  Standard input is also redirected, to
        !           429: prevent C-Kermit from sampling it for interruption commands.
        !           430: 
        !           431: @exx(kermit -iwx)
        !           432: This command starts up C-Kermit as a server.  Files are transmitted with
        !           433: no newline/@|carriage-@|return-@|linefeed conversion; the @q(-i) option is
        !           434: necessary for binary file transfer and useful for Unix-@|to-@|Unix transfers.
        !           435: Incoming files that have the same names as existing files are given new, unique
        !           436: names.
        !           437: 
        !           438: @exx(kermit -l /dev/ttyi6 -b 9600)
        !           439: This command sets the communication line and speed.  Since no action is
        !           440: specified, C-Kermit issues a prompt and enters an interactive dialog with
        !           441: you.  Any settings given on the command line remain in force during the
        !           442: dialog, unless explicitly changed.
        !           443: 
        !           444: @exx(kermit)
        !           445: This command starts up Kermit interactively with all default settings.
        !           446: 
        !           447: The next example shows how Unix Kermit might be used to send an entire
        !           448: directory tree from one Unix system to another, using the tar program as
        !           449: Kermit's standard input and output.  On the orginating system, in this case the
        !           450: remote, type (for instance):@label(-uxtar)
        !           451: 
        !           452: @exx(tar cf - /usr/fdc | kermit -is -)
        !           453: This causes tar to send the directory @q(/usr/fdc) (and all its files and all
        !           454: its subdirectories and all their files...) to standard output instead of to a
        !           455: tape; kermit receives this as standard input and sends it as a binary file.
        !           456: On the receiving system, in this case the local one, type (for instance):
        !           457: 
        !           458: @exx(kermit -il /dev/ttyi5 -b 9600 -k | tar xf -)
        !           459: Kermit receives the tar archive, and sends it via standard output to its own
        !           460: copy of tar, which extracts from it a replica of the original directory tree.
        !           461: 
        !           462: A final example shows how a Unix compression utility might be used to speed
        !           463: up Kermit file transfers:
        !           464: @begin(example)
        !           465: compress file | kermit -is -     (@i(sender))
        !           466: kermit -ik | uncompress          (@i(receiver))
        !           467: @end(example)  
        !           468: 
        !           469: @subheading(Exit Status Codes:)
        !           470: 
        !           471: Unix Kermit returns an exit status of zero, except when a fatal error is
        !           472: encountered, where the exit status is set to one.  With background
        !           473: operation (e.g., `@q(&)' at end of invoking command line) driven by scripted
        !           474: interactive commands (redirected standard input and/or take files),
        !           475: any failed interactive command (such as failed dial or script attempt)
        !           476: causes the fatal error exit.
        !           477: 
        !           478: 
        !           479: @section(Interactive Operation)
        !           480: 
        !           481: C-Kermit's interactive command prompt is "@q(C-Kermit>)".  In response to this
        !           482: prompt, you may type any valid command.  C-Kermit executes the command and
        !           483: then prompts you for another command.  The process continues until you
        !           484: instruct the program to terminate.
        !           485: 
        !           486: Commands begin with a keyword, normally an English verb, such as "send".
        !           487: You may omit trailing characters from any keyword, so long as you specify
        !           488: sufficient characters to distinguish it from any other keyword valid in that
        !           489: field.  Certain commonly-@|used keywords (such as "send", "receive", "connect")
        !           490: have special non-@|unique abbreviations ("s" for "send", "r" for "receive",
        !           491: "c" for "connect").
        !           492: 
        !           493: Certain characters have special functions during typein of interactive
        !           494: commands:
        !           495: @Begin(Description,leftmargin +8,indent -4)
        !           496: @q(?)@\Question mark, typed at any point in a command, will produce a
        !           497: message explaining what is possible or expected at that point.  Depending on
        !           498: the context, the message may be a brief phrase, a menu of keywords, or a list
        !           499: of files.
        !           500: 
        !           501: @q(ESC)@\(The Escape or Altmode key) -- Request completion of the current
        !           502: keyword or filename, or insertion of a default value.  The result will be a
        !           503: beep if the requested operation fails.
        !           504: 
        !           505: @q(DEL)@\(The Delete or Rubout key) -- Delete the previous character from the
        !           506: command.  You may also use BS (Backspace, Control-H) for this function.
        !           507: 
        !           508: @q(^W)@\(Control-W) -- Erase the rightmost word from the command line.
        !           509: 
        !           510: @q(^U)@\(Control-U) -- Erase the entire command.
        !           511: 
        !           512: @q(^R)@\(Control-R) -- Redisplay the current command.
        !           513: 
        !           514: @q(SP)@\(Space) -- Delimits fields (keywords, filenames, numbers) within
        !           515: a command.  HT (Horizontal Tab) may also be used for this purpose.
        !           516: 
        !           517: @q(CR)@\(Carriage Return) -- Enters the command for execution.  LF (Linefeed)
        !           518: or FF (formfeed) may also be used for this purpose.
        !           519: 
        !           520: @q(\)@\(Backslash) -- Enter any of the above characters into the command,
        !           521: literally.  To enter a backslash, type two backslashes in a row (@q[\\]).
        !           522: A backslash at the end of a command line causes the next line to be treated
        !           523: as a continuation line; this is useful for readability in command files,
        !           524: especially in the 'script' command.
        !           525: @End(Description)
        !           526: You may type the editing characters (@q[DEL], @q[^W], etc) repeatedly, to
        !           527: delete all the way back to the prompt.  No action will be performed until the
        !           528: command is entered by typing carriage return, linefeed, or formfeed.  If you
        !           529: make any mistakes, you will receive an informative error message and a new
        !           530: prompt -- make liberal use of `@q[?]' and ESC to feel your way through the
        !           531: commands.  One important command is "help" -- you should use it the first time
        !           532: you run C-Kermit.
        !           533: 
        !           534: A command line beginning with a percent sign @qq(%) is ignored.  Such
        !           535: lines may be used to include illustrative commentary in Kermit command dialogs.
        !           536: 
        !           537: Interactive C-Kermit accepts commands from files as well as from the
        !           538: keyboard.  When you enter interactive dialog, C-Kermit looks for the file
        !           539: @q(.kermrc) in your home or current directory (first it looks in the home
        !           540: directory, then in the current one) and executes any commands it finds there.
        !           541: These commands must be in interactive format, not Unix command-@|line format.
        !           542: A "take" command is also provided for use at any time during an interactive
        !           543: session.  Command files may be nested to any reasonable depth.
        !           544: 
        !           545: Here is a brief list of C-Kermit interactive commands:
        !           546: @begin(format,spread 0)
        !           547: @tabclear()@tabset(1.5inches,2.0inches,2.5inches)
        !           548: @>!@\  Execute a Unix shell command, or start a shell.
        !           549: @>bye@\  Terminate and log out a remote Kermit server.
        !           550: @>close@\  Close a log file.
        !           551: @>connect@\  Establish a terminal connection to a remote system.
        !           552: @>cwd@\  Change Working Directory.
        !           553: @>dial@\  Dial a telephone number.
        !           554: @>directory@\  Display a directory listing.
        !           555: @>echo@\  Display arguments literally.
        !           556: @>exit@\  Exit from the program, closing any open files.
        !           557: @>finish@\  Instruct a remote Kermit server to exit, but not log out.
        !           558: @>get@\  Get files from a remote Kermit server.
        !           559: @>help@\  Display a help message for a given command.
        !           560: @>log@\  Open a log file -- debugging, packet, session, transaction.
        !           561: @>quit@\  Same as 'exit'.
        !           562: @>receive@\  Passively wait for files to arrive.
        !           563: @>remote@\  Issue file management commands to a remote Kermit server.
        !           564: @>script@\  Execute a login script with a remote system.
        !           565: @>send@\  Send files.
        !           566: @>server@\  Begin server operation.
        !           567: @>set@\  Set various parameters.
        !           568: @>show@\  Display values of 'set' parameters.
        !           569: @>space@\  Display current disk space usage.
        !           570: @>statistics@\  Display statistics about most recent transaction.
        !           571: @>take@\  Execute commands from a file.
        !           572: @end(format)
        !           573: 
        !           574: The 'set' parameters are:
        !           575: @begin(format,spread 0)
        !           576: @tabclear()@tabset(1.5inches,2.0inches,2.5inches)
        !           577: @>block-check@\  Level of packet error detection.
        !           578: @>delay@\  How long to wait before sending first packet.
        !           579: @>duplex@\  Specify which side echoes during 'connect'.
        !           580: @>escape-character@\  Prefix for "escape commands" during 'connect'.
        !           581: @>file@\  Set various file parameters.
        !           582: @>flow-control@\  Communication line full-duplex flow control.
        !           583: @>handshake@\  Communication line half-duplex turnaround character.
        !           584: @>incomplete@\  Disposition for incompletely received files.
        !           585: @>line@\  Communication line device name.
        !           586: @>modem-dialer@\  Type of modem-dialer on communication line.
        !           587: @>parity@\  Communication line character parity.
        !           588: @>prompt@\  The C-Kermit program's interactive command prompt.
        !           589: @>receive@\  Parameters for inbound packets.
        !           590: @>send@\  Parameters for outbound packets.
        !           591: @>speed@\  Communication line speed.
        !           592: @end(format)
        !           593: 
        !           594: The 'remote' commands are:
        !           595: @begin(format,spread 0)
        !           596: @tabclear()@tabset(1.5inches,2.0inches,2.5inches)
        !           597: @>cwd@\  Change remote working directory.
        !           598: @>delete@\  Delete remote files.
        !           599: @>directory@\  Display a listing of remote file names.
        !           600: @>help@\  Request help from a remote server.
        !           601: @>host@\  Issue a command to the remote host in its own command language.
        !           602: @>space@\  Display current disk space usage on remote system.
        !           603: @>type@\  Display a remote file on your screen.
        !           604: @>who@\  Display who's logged in, or get information about a user.
        !           605: @end(format)
        !           606: 
        !           607: Most of these commands are described adequately in the Kermit User Guide.
        !           608: Special aspects of certain Unix Kermit commands are described below.
        !           609: 
        !           610: @heading<The 'send' command>
        !           611: 
        !           612: Syntax:  @q<send >@i(fn)@q<@ @ - >@i<or>@q< -@ @ >@q<send >@i(fn1)@q< >@i<rfn1>
        !           613: 
        !           614: Send the file or files denoted by @i(fn) to the other Kermit, which should be
        !           615: running as a server, or which should be given the 'receive' command.  Each file
        !           616: is sent under its own name (as described above, or as specified by the 'set
        !           617: file names' command).  If the second form of the 'send' command is used, i.e.
        !           618: with @i(fn1) denoting a single Unix file, @i(rfn1) may be specified as a name
        !           619: to send it under.  The 'send' command may be abbreviated to 's', even though
        !           620: 's' is not a unique abbreviation for a top-level C-Kermit command.
        !           621: 
        !           622: The wildcard (meta) characters `@q[*]' and `@q[?]' are accepted in @i(fn).  If
        !           623: `@q[?]' is to be included, it must be prefixed by `@q[\]' to override its
        !           624: normal function of providing help.  `@q[*]' matches any string, `@q[?]' matches
        !           625: any single character.  Other notations for file groups, like `@q([a-z]og)', are
        !           626: not available in interactive commands (though of course they are available on
        !           627: the command line).  When @i(fn) contains `@q[*]' or `@q[?]' characters, there
        !           628: is a limit to the number of files that can be matched, which varies from system
        !           629: to system.  If you get the message "Too many files match" then you'll have to
        !           630: make a more judicious selection.  If @i(fn) was of the form
        !           631: @example(usr/longname/anotherlongname/*)
        !           632: then C-Kermit's string space will fill up rapidly -- try doing a cwd (see
        !           633: below) to the path in question and reissuing the command.
        !           634: 
        !           635: @i<Note> -- C-Kermit sends only from the current or specified directory.
        !           636: It does not traverse directory trees.  If the source directory contains
        !           637: subdirectories, they will be skipped.  Conversely, C-Kermit does not create
        !           638: directories when receiving files.  If you have a need to do this, you can
        !           639: pipe tar through C-Kermit, as shown in the example on page @pageref(-uxtar),
        !           640: or under System III/V Unix you can use cpio.
        !           641: 
        !           642: @i<Another Note> -- C-Kermit does not skip over "invisible" files that match
        !           643: the file specification; Unix systems usually treat files whose names start
        !           644: with a dot (like @q(.login), @q(.cshrc), and @q(.kermrc)) as invisible.
        !           645: Similarly for "temporary" files whose names start with "@q(#)".
        !           646: 
        !           647: @heading<The 'receive' command>
        !           648: 
        !           649: Syntax:  @q<receive@ @ - >@i<or>@q< -@ @ receive >@i<fn1>
        !           650: 
        !           651: Passively wait for files to arrive from the other Kermit, which must be given
        !           652: the 'send' command -- the 'receive' command does not work in conjunction with a
        !           653: server (use 'get' for that).  If @i(fn1) is specified, store the first incoming
        !           654: file under that name.  The 'receive' command may be abbreviated to 'r'.
        !           655: 
        !           656: 
        !           657: @heading<The 'get' command:>
        !           658: 
        !           659: Syntax:@q<  get >@i<rfn>
        !           660: @begin(example)
        !           661:     @i<or>: get
        !           662:             @i(rfn)
        !           663:             @i(fn1)
        !           664: @end(example)
        !           665: Request a remote Kermit server to send the named file or files.  Since a
        !           666: remote file specification (or list) might contain spaces, which normally
        !           667: delimit fields of a C-Kermit command, an alternate form of the command is
        !           668: provided to allow the inbound file to be given a new name: type 'get' alone
        !           669: on a line, and you will be prompted separately for the remote and local
        !           670: file specifications, for example
        !           671: @Begin(Example)
        !           672: C-Kermit>@ux(get)
        !           673:  Remote file specification: @ux(profile exec)
        !           674:  Local name to store it under: @ux(profile.exec)
        !           675: @End(Example)
        !           676: As with 'receive', if more than one file arrives as a result of the 'get'
        !           677: command, only the first will be stored under the alternate name given by
        !           678: @i(fn1); the remaining files will be stored under their own names if possible.
        !           679: If a `@q[?]' is to be included in the remote file specification, you must
        !           680: prefix it with `@q[\]' to suppress its normal function of providing help.
        !           681: 
        !           682: If you have started a multiline 'get' command, you may escape from its
        !           683: lower-@|level prompts by typing a carriage return in response to the prompt,
        !           684: e.g.
        !           685: @Begin(Example)
        !           686: C-Kermit>@ux(get)
        !           687:  Remote file specification: @ux(foo)
        !           688:  Local name to store it under: @i<(Type a carriage return here)>
        !           689: (cancelled)
        !           690: C-Kermit>
        !           691: @End(Example)
        !           692: 
        !           693: @heading(The 'server' command:)
        !           694: 
        !           695: The 'server' command places C-Kermit in "server mode" on the currently selected
        !           696: communication line.  All further commands must arrive as valid Kermit packets
        !           697: from the Kermit on the other end of the line.  The Unix Kermit server can
        !           698: respond to the following commands:
        !           699: @begin(format,spread 0,above 1,below 1)
        !           700: @tabclear()@tabset(2.25inches)
        !           701: @u<Command>@\@ux<Server Response>
        !           702:   get@\  Sends files
        !           703:   send@\  Receives files
        !           704:   bye@\  Attempts to log itself out
        !           705:   finish@\  Exits to level from which it was invoked
        !           706:   remote directory@\  Sends directory lising
        !           707:   remote delete@\  Removes files
        !           708:   remote cwd@\  Changes working directory
        !           709:   remote type@\  Sends files to your screen
        !           710:   remote space@\  Reports about its disk usage
        !           711:   remote who@\  Shows who's logged in
        !           712:   remote host@\  Executes a Unix shell command
        !           713:   remote help@\  Lists these capabilities
        !           714: @end(format)
        !           715: Note that the Unix Kermit server cannot always respond to a BYE command.
        !           716: It will attempt to do so using "@q<kill()>", but this will not work
        !           717: on all systems or under all conditions.
        !           718: 
        !           719: If the Kermit server is directed at an external line (i.e. it is in
        !           720: "local mode") then the console may be used for other work if you have
        !           721: 'set file display off'; normally the program expects the
        !           722: console to be used to observe file transfers and enter status queries or
        !           723: interruption commands.  The way to get C-Kermit into background operation from
        !           724: interactive command level varies from system to system (e.g. on Berkeley Unix
        !           725: you would halt the program with @q(^Z) and then use the C-Shell 'bg' command to
        !           726: continue it in the background).  The more common method
        !           727: is to invoke the program with the desired command line arguments, including
        !           728: "@q(-q)", and with a terminating "@q(&)".
        !           729: 
        !           730: When the Unix Kermit server is given a 'remote host' command, it executes it
        !           731: using the shell invoked upon login, e.g. the Bourne shell or the Berkeley
        !           732: C-Shell.
        !           733: 
        !           734: @Heading(The 'remote', 'bye', and 'finish' commands:)
        !           735: 
        !           736: C-Kermit may itself request services from a remote Kermit server.  In
        !           737: addition to 'send' and 'get', the following commands may also be sent from
        !           738: C-Kermit to a Kermit server:
        !           739: 
        !           740: @begin(description,leftmargin +8,indent -4)
        !           741: remote cwd [@i(directory)]@\If the optional remote directory specification is
        !           742: included, you will be prompted on a separate line for a password, which will
        !           743: not echo as you type it.
        !           744: @end(description)
        !           745: @begin(description,leftmargin +28, indent -24,spread 0,above 1)
        !           746: remote delete rfn@\delete remote file or files.
        !           747: 
        !           748: remote directory [@i(rfn)]@\directory listing of remote files.
        !           749: 
        !           750: remote host @i(command)@\command in remote host's own command language.
        !           751: 
        !           752: remote space@\disk usage report from remote host.
        !           753: 
        !           754: remote type [@i(rfn)]@\display remote file or files on the screen.
        !           755: 
        !           756: remote who [@i(user)]@\display information about who's logged in.
        !           757: 
        !           758: remote help@\display remote server's capabilities.
        !           759: @end(description)
        !           760: @begin(description,leftmargin +8,indent -4)
        !           761: bye @i(and) finish:@\When connected to a remote Kermit server, these commands
        !           762: cause the remote server to terminate; 'finish' returns it to Kermit or system
        !           763: command level (depending on the implementation or how the program was invoked);
        !           764: 'bye' also requests it to log itself out.
        !           765: @end(description)
        !           766: @heading(The 'log' and 'close' commands:)
        !           767: 
        !           768: Syntax: @q<log {debugging, packets, session, transactions} >[ @i(fn1) ]
        !           769: 
        !           770: C-Kermit's progress may be logged in various ways.  The 'log' command
        !           771: opens a log, the 'close' command closes it.  In addition, all open logs
        !           772: are closed by the 'exit' and 'quit' commands.  A name may be specified for
        !           773: a log file; if the name is omitted, the file is created with a default
        !           774: name as shown below.
        !           775: 
        !           776: @begin(description,leftmargin +4,indent -4)
        !           777: log debugging@\This produces a voluminous log of the internal workings of
        !           778: C-Kermit, of use to Kermit developers or maintainers in tracking down suspected
        !           779: bugs in the C-Kermit program.  Use of this feature dramatically slows down the
        !           780: Kermit protocol.  Default name: @q(debug.log).
        !           781: 
        !           782: log packets@\This produces a record of all the packets that go in and out of
        !           783: the communication port.  This log is of use to Kermit maintainers who are
        !           784: tracking down protocol problems in either C-Kermit or any Kermit that
        !           785: C-Kermit is connected to.  Default name:  @q(packet.log).
        !           786: 
        !           787: log session@\This log will contain a copy of everything you see on your screen
        !           788: during the 'connect' command, except for local messages or interaction with
        !           789: local escape commands.  Default name:  @q(session.log).
        !           790: 
        !           791: log transactions@\The transaction log is a record of all the files that were
        !           792: sent or received while transaction logging was in effect.  It includes time
        !           793: stamps and statistics, filename transformations, and records of any
        !           794: errors that may have occurred.  The transaction log allows you to have
        !           795: long unattended file transfer sessions without fear of missing some
        !           796: vital screen message.  Default name:  @q(transact.log).
        !           797: @end(description)
        !           798: The 'close' command explicitly closes a log, e.g. 'close debug'.
        !           799: 
        !           800: @i<Note:>  Debug and Transaction logs are a compile-time option; C-Kermit may
        !           801: be compiled without these logs, in which case it will run faster, it will
        !           802: take up less space on the disk, and the commands relating to them will not
        !           803: be present.
        !           804: 
        !           805: @Heading(Local File Management Commands:)
        !           806: 
        !           807: Unix Kermit allows some degree of local file management from interactive
        !           808: command level:
        !           809: @begin(description,leftmargin +4,indent -4)
        !           810: directory [@i(fn)]@\
        !           811: Displays a listing of the names, modes, sizes, and dates of files
        !           812: matching @i(fn) (which defaults to `@q[*]').  Equivalent to `@q(ls -l)'.
        !           813: 
        !           814: cwd [directory-name]@\
        !           815: Changes Kermit's working directory to the one given, or to the
        !           816: default directory if the directory name is omitted.  This command affects only
        !           817: the Kermit process and any processes it may subsequently create.
        !           818: 
        !           819: space@\
        !           820: Display information about disk space and/or quota in the current
        !           821: directory and device.
        !           822: 
        !           823: @q(! )[@i(command)]@\
        !           824: The command is executed by the Unix shell.  If no command is specified, then an
        !           825: interactive shell is started; exiting from the shell, e.g. by typing Control-D,
        !           826: will return you to C-Kermit command level.  C-Kermit attempts to use your
        !           827: preferred, customary shell.  Use the `@q(!)' command to provide file management
        !           828: or other functions not explicitly provided by C-Kermit commands.  The `@q(!)'
        !           829: command has certain peculiarities:
        !           830: @begin(itemize,spread 0)       
        !           831: At least one space must separate the '!' from the shell command.
        !           832: 
        !           833: A 'cd' command executed in this manner will have no effect -- use the
        !           834: C-Kermit 'cwd' command instead. 
        !           835: @end(itemize)
        !           836: @end(description)
        !           837: 
        !           838: @heading(The 'set' and 'show' Commands:)
        !           839: 
        !           840: Since Kermit is designed to allow diverse systems to communicate, it is
        !           841: often necessary to issue special instructions to allow the program to adapt
        !           842: to peculiarities of the another system or the communication path.  These
        !           843: instructions are accomplished by the 'set' command.  The 'show' command may
        !           844: be used to display current settings.  Here is a brief synopsis of settings
        !           845: available in the current release of C-Kermit:
        !           846: 
        !           847: @begin(description,leftmargin +4,indent -4)
        !           848: block-check {1, 2, 3}@\ Determines the level of per-packet error detection.
        !           849: "1" is a single-@|character 6-bit checksum, folded to include the values of all
        !           850: bits from each character.  "2" is a 2-character, 12-bit checksum.  "3" is a
        !           851: 3-character, 16-bit cyclic redundancy check (CRC).  The higher the block check,
        !           852: the better the error detection and correction and the higher the resulting
        !           853: overhead.  Type 1 is most commonly used; it is supported by all Kermit
        !           854: implementations, and it has proven adequate in most circumstances.  Types 2 or
        !           855: 3 would be used to advantage when transferring 8-bit binary files over noisy
        !           856: lines.
        !           857: 
        !           858: delay @i(n)@\How many seconds to wait before sending the first packet after a
        !           859: 'send' command.  Used in remote mode to give you time to escape back to your
        !           860: local Kermit and issue a 'receive' command.  Normally 5 seconds.
        !           861: 
        !           862: duplex {full, half}@\For use during 'connect'.  Specifies which side is doing
        !           863: the echoing; 'full' means the other side, 'half' means C-Kermit must echo
        !           864: typein itself.
        !           865: 
        !           866: escape-character @i(cc)@\For use during 'connect' to get C-Kermit's attention.
        !           867: The escape character acts as a prefix to an 'escape command', for instance to
        !           868: close the connection and return to C-Kermit or Unix command level.
        !           869: The normal escape character is Control-Backslash (28).
        !           870: The escape character is also used in System III/V implementations
        !           871: to prefix interrupt commands during file transfers.
        !           872: 
        !           873: file {display, names, type, warning}@\
        !           874: Establish various file-related parameters:
        !           875: @begin(description,leftmargin +4,indent -4)
        !           876: display {on, off}@\Normally 'on'; when in local mode, display progress of file
        !           877: transfers on the screen (stdout), and listen to the keyboard (stdin)
        !           878: for interruptions.  If off (-q on command line) none of this is
        !           879: done, and the file transfer may proceed in the background oblivious
        !           880: to any other work concurrently done at the console terminal.
        !           881: 
        !           882: names {converted, literal}@\
        !           883: Normally converted, which mean that outbound filenames have path
        !           884: specifications stripped, lowercase letters raised to upper,
        !           885: tildes and extra periods changed to X's, and an X inserted in
        !           886: front of any name that starts with period.  Incoming files have
        !           887: uppercase letters lowered.  Literal means that none of these
        !           888: conversions are done; therefore, any directory path appearing in a
        !           889: received file specification must exist and be write-accessible.
        !           890: When literal naming is being used, the sender should not use path
        !           891: names in the file specification unless the same path exists on the
        !           892: target system and is writable.
        !           893: 
        !           894: type {binary, text}@\Normally text, which means that conversion is done between
        !           895: Unix newline characters and the carriage-@|return/@|linefeed sequences
        !           896: required by the canonical Kermit file transmission format, and in
        !           897: common use on non-@|Unix systems.  Binary means to transmit file
        !           898: contents without conversion.  Binary (`@q(-i)' in command line notation)
        !           899: is necessary for binary files, and desirable in all Unix-@|to-@|Unix
        !           900: transactions to cut down on overhead.
        !           901: 
        !           902: warning {on, off}@\Normally off, which means that incoming files will silently
        !           903: overwrite existing files of the same name.  When on (`@q(-w)' on command line)
        !           904: Kermit will check if an arriving file would overwrite an existing file; if so,
        !           905: it will construct a new name for the arriving file, of the form @q(foo~)@i(n),
        !           906: where foo is the name they share and @i(n) is a "generation number"; if @i(foo)
        !           907: exists, then the new file will be called @q(foo~1).  If @q(foo) and @q(foo~1)
        !           908: exist, the new file will be @q(foo~2), and so on.  If the new name would be
        !           909: longer than the maximum length for a filename, then characters would be deleted
        !           910: from the end first, for instance, @q(thelongestname) on a system with a limit
        !           911: of 14 characters would become @q(thelongestn~1).
        !           912: @begin(quotation)
        !           913: @i(CAUTION:)  If Control-F or Control-B is used to cancel an incoming file,
        !           914: and a file of the same name previously existed, @i(and) the "file warning"
        !           915: feature is not enabled, then the previous copy of the file will disappear.
        !           916: @end(quotation)
        !           917: @end(description)
        !           918: 
        !           919: flow-control {none, xon/xoff}@\Normally xon/xoff for full duplex flow control.
        !           920: Should be set to 'none' if the other system cannot do xon/xoff flow control, or
        !           921: if you have issued a 'set handshake' command.  If set to xon/xoff, then
        !           922: handshake should be set to none.  This setting applies during both terminal
        !           923: connection and file transfer.
        !           924: 
        !           925: incomplete {discard, keep}@\Disposition for incompletely received files.
        !           926: If an incoming file is interrupted or an error occurs during transfer,
        !           927: the part that was received so far is normally discarded.  If you "set
        !           928: incomplete keep" then such file fragments will be kept.
        !           929: 
        !           930: handshake {xon, xoff, cr, lf, bell, esc, none}@\Normally none.  Otherwise,
        !           931: half-duplex communication line turnaround handshaking is done, which means Unix
        !           932: Kermit will not reply to a packet until it has received the indicated handshake
        !           933: character or has timed out waiting for it; the handshake setting applies only
        !           934: during file transfer.  If you set handshake to other than none, then flow
        !           935: should be set to none.
        !           936: 
        !           937: line [device-name]@\
        !           938: The device name for the communication line to be used for file transfer and
        !           939: terminal connection, e.g. @q(/dev/ttyi3).  If you specify a device name,
        !           940: Kermit will be in local mode, and you should remember to issue any other
        !           941: necessary 'set' commands, such as 'set speed'.  If you omit the device name,
        !           942: Kermit will revert to its default mode of operation.  If you specify
        !           943: @q(/dev/tty), Kermit will enter remote mode (useful when logged in through
        !           944: the "back port" of a system normally used as a local-mode workstation).  When
        !           945: Unix Kermit enters local mode, it attempts to synchronize with other programs
        !           946: (like uucp) that use external communication lines so as to prevent two
        !           947: programs using the same line at once; before attempting to lock the specified
        !           948: line, it will close and unlock any external line that was previously in use.
        !           949: The method used for locking is the "uucp lock file", explained in more detail
        !           950: later.
        !           951: 
        !           952: modem-dialer {direct, hayes, racalvadic, ventel, ...}@\ The type of modem
        !           953: dialer on the communication line.  "Direct" indicates either there is no
        !           954: dialout modem, or that if the line requires carrier detection to open, then
        !           955: 'set line' will hang waiting for an incoming call.  "Hayes", "Ventel", and the
        !           956: others indicate that 'set line' (or the -l argument) will prepare for a
        !           957: subsequent 'dial' command for the given dialer.  Support for new dialers is
        !           958: added from time to time, so type 'set modem ?' for a list of those supported
        !           959: in your copy of Kermit.  See the description of the 'dial' command
        !           960: 
        !           961: parity {even, odd, mark, space, none}@\Specify character parity for use in
        !           962: packets and terminal connection, normally none.  If other than none, C-Kermit
        !           963: will seek to use the 8th-bit prefixing mechanism for transferring 8-bit binary
        !           964: data, which can be used successfully only if the other Kermit agrees; if not,
        !           965: 8-bit binary data cannot be successfully transferred.
        !           966: 
        !           967: prompt [string]@\The given string will be substituted for "@q(C-Kermit)>" as
        !           968: this program's prompt.  If the string is omitted, the prompt will revert to
        !           969: "@q(C-Kermit>)".  If the string is enclosed in doublequotes, the quotes will
        !           970: be stripped and any leading and trailing blanks will be retained.
        !           971: 
        !           972: send @i<parameter>@\
        !           973: Establish parameters to use when sending packets.  These will be in effect
        !           974: only for the initial packet sent, since the other Kermit may override these
        !           975: parameters during the protocol parameter exchange (unless noted below).
        !           976: @begin(description,leftmargin +4,indent -4)
        !           977: end-of-packet @i(cc)@\Specifies the control character needed by the other
        !           978: Kermit to recognize the end of a packet.  C-Kermit sends this character at the
        !           979: end of each packet.  Normally 13 (carriage return), which most Kermit
        !           980: implementations require.  Other Kermits require no terminator at all, still
        !           981: others may require a different terminator, like linefeed (10).
        !           982: 
        !           983: packet-length @i(n)@\Specify the maximum packet length to send.  Normally 90.
        !           984: Shorter packet lengths can be useful on noisy lines, or with systems or front
        !           985: ends or networks that have small buffers.  The shorter the packet, the higher
        !           986: the overhead, but the lower the chance of a packet being corrupted by noise,
        !           987: and the less time to retransmit corrupted packets.  This command overrides
        !           988: the value requested by the other Kermit during protocol initiation.
        !           989: 
        !           990: pad-character @i(cc)@\Designate a character to send before each packet.
        !           991: Normally, none is sent.  Outbound padding is sometimes necessary for
        !           992: communicating with slow half duplex systems that provide no other means of
        !           993: line turnaround control.  It can also be used to send special characters
        !           994: to communications equipment that needs to be put in "transparent" or
        !           995: "no echo" mode, when this can be accomplished in by feeding it a certain
        !           996: control character.
        !           997: 
        !           998: padding @i(n)@\How many pad characters to send, normally 0.
        !           999: 
        !          1000: start-of-packet @i(cc)@\The normal Kermit packet prefix is Control-A (1); this
        !          1001: command changes the prefix C-Kermit puts on outbound packets.  The only
        !          1002: reasons this should ever be changed would be: Some piece of equipment somewhere
        !          1003: between the two Kermit programs will not pass through a Control-A; or, some
        !          1004: piece of of equipment similarly placed is echoing its input.  In the latter
        !          1005: case, the recipient of such an echo can change the packet prefix for outbound
        !          1006: packets to be different from that of arriving packets, so that the echoed
        !          1007: packets will be ignored.  The opposite Kermit must also be told to change the
        !          1008: prefix for its inbound packets.
        !          1009: 
        !          1010: timeout @i(n)@\Specifies the number of seconds you want the other Kermit
        !          1011: to wait for a packet before timing it out and requesting retransmission.
        !          1012: @end(description)
        !          1013: 
        !          1014: receive @i<parameter>@\
        !          1015: Establish parameters to request the other Kermit to use when sending packets.
        !          1016: @begin(description,leftmargin +4,indent -4)
        !          1017: end-of-packet @i(cc)@\Requests the other Kermit to terminate its packets with
        !          1018: the specified character.
        !          1019: 
        !          1020: packet-length @i(n)@\Specify the maximum packet length to that you want the
        !          1021: other Kermit to send.  Normally 90.
        !          1022: 
        !          1023: pad-character @i(cc)@\C-Kermit normally does not need to have incoming packets
        !          1024: preceded with pad characters.  This command allows C-Kermit to request the
        !          1025: other Kermit to use @i(cc) as a pad character.  Default @i(cc) is NUL, ASCII 0.
        !          1026: 
        !          1027: padding @i(n)@\How many pad characters to ask for, normally 0.
        !          1028: 
        !          1029: start-of-packet @i(cc)@\Change the prefix C-Kermit looks for on inbound
        !          1030: packets to correspond with what the other Kermit is sending.
        !          1031: 
        !          1032: timeout @i(n)@\Normally, each Kermit partner sets its packet timeout interval
        !          1033: based on what the opposite Kermit requests.  This command allows you to
        !          1034: override the normal procedure and specify a timeout interval for Unix Kermit to
        !          1035: use when waiting for packets from the other Kermit.  If you specify 0, then no
        !          1036: timeouts will occur, and Unix Kermit will wait forever for expected packets to
        !          1037: arrive.
        !          1038: @end(description)
        !          1039: 
        !          1040: speed {0, 110, 150, 300, 600, 1200, 1800, 2400, 4800, 9600}@\The baud rate for
        !          1041: the external communication line.  This command cannot be used to change the
        !          1042: speed of your own console terminal.  Many Unix systems are set up in such a way
        !          1043: that you must give this command after a 'set line' command before you can use
        !          1044: the line.  'set baud' is a synomym for 'set speed'.
        !          1045: @end(description)
        !          1046: 
        !          1047: @heading(The 'show' Command:)
        !          1048: 
        !          1049: Syntax: @q<show {parameters, versions}>
        !          1050: 
        !          1051: The "show" command with the default argument of "parameters" displays
        !          1052: the values of all the 'set' parameters described above.  If you type
        !          1053: "show versions", then C-Kermit will display the version numbers and
        !          1054: dates of all its internal modules.  You should use the "show versions"
        !          1055: command to ascertain the vintage of your Kermit program before reporting
        !          1056: problems to Kermit maintainers.
        !          1057: 
        !          1058: @heading(The 'statistics' Command:)
        !          1059: 
        !          1060: The statistics command displays information about the most recent Kermit
        !          1061: protocol transaction, including file and communication line i/o, timing
        !          1062: and efficiency, as well as what encoding options were in effect (such as
        !          1063: 8th-bit prefixing, repeat-@|count compression).
        !          1064: 
        !          1065: @heading(The 'take' and 'echo' Commands:)
        !          1066: 
        !          1067: Syntax: @q<take >@i<fn1>@*
        !          1068: @ @ @ @ @ @q<echo >@i<[text to be echoed]>
        !          1069: 
        !          1070: The 'take' command instructs C-Kermit to execute commands from the named
        !          1071: file.  The file may contain any interactive C-Kermit commands, including
        !          1072: 'take'; command files may be nested to any reasonable depth.  The 'echo'
        !          1073: command may be used within command files to issue greetings, announce
        !          1074: progress, ring the terminal bell, etc.
        !          1075: 
        !          1076: The 'echo' command should not be confused with the Unix 'echo' command, which
        !          1077: can be used to show how meta characters would be expanded.  The Kermit echo
        !          1078: command simply displays its text argument (almost) literally at the terminal;
        !          1079: the argument may contain octal escapes of the form @qq(\ooo),
        !          1080: where @q(o) is an octal digit (0-7), and there may be 1, 2, or 3 such digits,
        !          1081: whose value specify an ASCII character, such as @qq(\007) (or @qq(\07) or
        !          1082: just @qq(\7)) for beep, @qq(\012) for newline, etc.  Of course, each
        !          1083: backslash must be must be entered twice in order for it to be passed along
        !          1084: to the echo command by the Kermit command parser.
        !          1085: 
        !          1086: Take-command files are in exactly the same syntax as interactive commands.
        !          1087: Note that this implies that if you want to include special characters like
        !          1088: question mark or backslash that you would have to quote with backslash when
        !          1089: typing interactive commands, you must quote these characters the same way
        !          1090: in command files.  Long lines may be continued by ending them with a single
        !          1091: backslash.
        !          1092: 
        !          1093: Command files may be used in lieu of command macros, which have not been
        !          1094: implemented in this version of C-Kermit.  For instance, if you commonly
        !          1095: connect to a system called 'B' that is connected to ttyh7 at 4800 baud,
        !          1096: you could create a file called @q(b) containing the commands
        !          1097: @begin(example)
        !          1098: % C-Kermit command file to connect to System B thru /dev/ttyh7
        !          1099: set line /dev/ttyh7
        !          1100: set speed 4800
        !          1101: % Beep and give message
        !          1102: echo \\007Connecting to System B...
        !          1103: connect
        !          1104: @end(example)
        !          1105: and then simply type 'take b' (or 't b' since no other commands begin with
        !          1106: the letter 't') whenever you wish to connect to system B.  Note the
        !          1107: comment lines and the beep inserted into the 'echo' command.
        !          1108: 
        !          1109: @index<IBM>
        !          1110: For connecting to IBM mainframes, a number of 'set' commands are required;
        !          1111: these, too, are conveniently collected into a 'take' file like this one:
        !          1112: @begin(example)
        !          1113: % Sample C-Kermit command file to set up current line
        !          1114: % for IBM mainframe communication
        !          1115: %
        !          1116: set parity mark
        !          1117: set handshake xon
        !          1118: set flow-control none
        !          1119: set duplex half
        !          1120: @end(example)
        !          1121: 
        !          1122: Note that no single command is available to wipe out all of these settings
        !          1123: and return C-Kermit to its default startup state; to do that, you can either
        !          1124: restart the program, or else make a command file that executes the necessary
        !          1125: 'set' commands:
        !          1126: @begin(example)
        !          1127: % Sample C-Kermit command file to restore normal settings
        !          1128: %
        !          1129: set parity none
        !          1130: set handshake none
        !          1131: set flow-control xon/xoff
        !          1132: set duplex full
        !          1133: @end(example)
        !          1134: 
        !          1135: An implicit 'take' command is executed upon your @q(.kermrc) file upon
        !          1136: C-Kermit's initial entry into interactive dialog.  The @q(.kermrc) file should
        !          1137: contain 'set' or other commands you want to be in effect at all times.
        !          1138: For instance, you might want override the default action when incoming files
        !          1139: have the same names as existing files -- in that case, put the command
        !          1140: @example(set file warning on)
        !          1141: in your @q(.kermrc) file.  On some non-Unix systems that run C-Kermit, this
        !          1142: file might have a different name, such as @q<kermit.ini>.
        !          1143: @begin(quotation)
        !          1144: @i(NOTE:) The initialization file is currently @i(not) processed if Kermit is
        !          1145: invoked with an action command from the command line.  The same effect can be
        !          1146: achieved, however, by defining an alias or shell procedure that starts up
        !          1147: Kermit with the desired command line options.
        !          1148: @end(quotation)
        !          1149: 
        !          1150: Commands executed from take files are not echoed at the terminal.  If you
        !          1151: want to see the commands as well as their output, you could feed the
        !          1152: command file to C-Kermit via redirected stdin, as in
        !          1153: @example('kermit < cmdfile')
        !          1154: Errors encountered during execution of take files (such as failure to complete
        !          1155: dial or script operations) cause termination of the current take file, popping
        !          1156: to the level that invoked it (take file, interactive level, or the shell).
        !          1157: When kermit is executed in the background, errors during execution of a take
        !          1158: file are fatal.
        !          1159: 
        !          1160: @heading(The 'connect' Command:)
        !          1161: 
        !          1162: The connect command links your terminal to another computer as if it were
        !          1163: a local terminal to that computer, through the device specified in the most
        !          1164: recent 'set line' command, or through the default device if your system
        !          1165: is a PC or workstation.  All characters you type at your keyboard
        !          1166: are sent out the communication line, all characters arriving at the
        !          1167: communication port are displayed on your screen.  Current settings of speed,
        !          1168: parity, duplex, and flow-@|control are honored.  If you have issued a 'log
        !          1169: session' command, everything you see on your screen will also be recorded
        !          1170: to your session log.  This provides a way to "capture" files from systems
        !          1171: that don't have Kermit programs available.
        !          1172: 
        !          1173: To get back to your own system, you must type the escape character, which is
        !          1174: Control-@|Backslash (@q[^\]) unless you have changed it with the 'set escape'
        !          1175: command, followed by a single-@|character command, such as 'c' for "close
        !          1176: connection".  Single-@|character commands include:
        !          1177: @begin(description,leftmargin +8,indent -6,spread 0.4)
        !          1178: c@\Close the connection
        !          1179: 
        !          1180: b@\Send a BREAK signal
        !          1181: 
        !          1182: 0@\(zero) send a null
        !          1183: 
        !          1184: s@\Give a status report about the connection
        !          1185: 
        !          1186: h@\Hangup the phone
        !          1187: 
        !          1188: @q[^\]@\Send Control-Backslash itself (whatever you have defined the
        !          1189: escape character to be, typed twice in a row sends one copy of it).
        !          1190: @end(description)
        !          1191: Uppercase and control equivalents for these letters are also accepted.  A
        !          1192: space typed after the escape character is ignored.  Any other character will
        !          1193: produce a beep.
        !          1194: 
        !          1195: The connect command simply displays incoming characters on the screen.  It is
        !          1196: assumed any screen control sequences sent by the host will be handled by
        !          1197: the firmware in your terminal or PC.  If terminal emulation is desired,
        !          1198: then the connect command can invoked from the Unix command line (@q(-c) or
        !          1199: @q(-n)), piped through a terminal emulation filter, e.g.
        !          1200: @example(kermit -l /dev/acu -b 1200 -c | tek)
        !          1201: 'c' is an acceptable non-unique abbreviation for 'connect'.
        !          1202: 
        !          1203: @heading(The 'dial' command:)
        !          1204: 
        !          1205: Syntax: @q(dial )@i(telephone-number-string)
        !          1206: 
        !          1207: @index<Modems>@index<Dialout Modems>
        !          1208: This command controls dialout modems; you should have already issued a "set
        !          1209: line" and "set speed" command to identify the terminal device, and a "set
        !          1210: modem" command to identify the type of modem to be used for dialing.  In the
        !          1211: "dial" command, you supply the phone number and the Kermit program feeds it to
        !          1212: the modem in the appropriate format and then interprets dialer return codes and
        !          1213: modem signals to inform you whether the call was completed.  The
        !          1214: telephone-@|number-@|string may contain imbedded modem-@|dialer commands, such
        !          1215: as comma for Hayes pause, or `@q(&)' for Ventel dialtone wait and `@q(%)' for
        !          1216: Ventel pause (consult your modem manual for details).
        !          1217: 
        !          1218: At the time of this writing, support is included for the following modems:
        !          1219: @begin(itemize,spread 0)
        !          1220: Cermetek Info-Mate 212A
        !          1221: 
        !          1222: DEC DF03-AC
        !          1223: 
        !          1224: DEC DF100 Series
        !          1225: 
        !          1226: DEC DF200 Series
        !          1227: 
        !          1228: General DataComm 212A/ED
        !          1229: 
        !          1230: Hayes Smartmodem 1200 and compatibles
        !          1231: 
        !          1232: Penril
        !          1233: 
        !          1234: Racal Vadic
        !          1235: 
        !          1236: US Robotics 212A
        !          1237: 
        !          1238: Ventel
        !          1239: @end(itemize)
        !          1240: Support for new modems is added to the program from time to time; you
        !          1241: can check the current list by typing "@q<set modem ?>".
        !          1242: 
        !          1243: The device used for dialing out is the one selected in the most recent "set
        !          1244: line" command (or on a workstation, the default line if no "set line" command
        !          1245: was given).  The "dial" command calls locks the path (see the section on line
        !          1246: locking below) and establishes a call on an exclusive basis.  If it is desired
        !          1247: to dial a call and then return to the shell (such as to do kermit activities
        !          1248: depending on standard in/out redirection), it is necessary to place the dialed
        !          1249: call under one device name (say, "@q</dev/cua0>") and then escape to the shell
        !          1250: @i<within Kermit> on a linked device which is separate from the dialed line
        !          1251: (say, "@q</dev/cul0>").  This is the same technique used by uucp (to allow
        !          1252: locks to be placed separately for dialing and conversing).
        !          1253: 
        !          1254: Because modem dialers have strict requirements to override the carrier-@|detect
        !          1255: signal most Unix implementations expect, the sequence for dialing is more rigid
        !          1256: than most other C-Kermit procedures.
        !          1257: 
        !          1258: Example one:
        !          1259: @begin(example)
        !          1260: @ux<kermit -l /dev/cul0 -b 1200>
        !          1261: C-Kermit>@ux<set modem-dialer hayes>   @i(hint: abbreviate) set m h
        !          1262: C-Kermit>@ux<dial 9,5551212>
        !          1263: Connected!
        !          1264: C-Kermit>@ux<connect>                  @i(hint: abbreviate) c
        !          1265: @i(logon, request remote server, etc.)
        !          1266: C-Kermit> ...
        !          1267: C-Kermit>@ux<quit>                     @i(hint: abbreviate) q
        !          1268: @end(example)
        !          1269: this disconnects modem, and unlocks line.
        !          1270: 
        !          1271: Example two:
        !          1272: @begin(example)
        !          1273: @u(kermit)
        !          1274: C-Kermit>@ux(set modem-dialer ventel)
        !          1275: C-Kermit>@ux(set line /dev/cul0)
        !          1276: C-Kermit>@ux(dial 9&5551212%)
        !          1277: Connected!
        !          1278: C-Kermit> ...
        !          1279: @end(example)
        !          1280: Example three:
        !          1281: @begin(example)
        !          1282: kermit
        !          1283: C-Kermit>@ux(take my-dial-procedure)
        !          1284: Connected!
        !          1285: 
        !          1286: @i(file my-dial-procedure):
        !          1287: set modem hayes
        !          1288: set line /dev/tty99
        !          1289: dial 5551212
        !          1290: connect
        !          1291: @end(example)
        !          1292: For Hayes @index<Hayes Modem> dialers, two important switch settings are #1 and
        !          1293: #6.  #1 should be up so that the DTR is only asserted when the line is 'open'.
        !          1294: #6 should be up so carrier-@|detect functions properly.  Switches #2 (English
        !          1295: versus digit result codes) and #4 (Hayes echoes modem commands) may be in
        !          1296: either position.
        !          1297: 
        !          1298: For any dialers in general, this Kermit program requires that the modem provide
        !          1299: the "carrier detect" signal when a call is in progress, and remove that signal
        !          1300: when the call completes or the line drops.  If a switch setting is available to
        !          1301: force carrier detect, it should not be in that setting.  Secondly, this Kermit
        !          1302: program requires that the modem track the computer's "data terminal ready"
        !          1303: signal (DTR).  If a switch setting is available to simulate DTR asserted within
        !          1304: the modem, then it should not be in that setting.  Otherwise the modem will be
        !          1305: unable to hang up at the end of a call or when interrupts are received by
        !          1306: Kermit.
        !          1307: 
        !          1308: If you want to interrupt a dial command in progress (for instance, because
        !          1309: you just realize that you gave it the wrong number), type a Control-C to
        !          1310: get back to command level.
        !          1311: 
        !          1312: @heading(The 'script' Command:)
        !          1313: 
        !          1314: Syntax: @q(script )@i(expect send [expect send] . . .)
        !          1315: 
        !          1316: "expect" has the syntax: @i(expect[-send-expect[-send-expect[...]]])
        !          1317: 
        !          1318: This command facilitates logging into a remote system and/or invoking
        !          1319: programs or other facilities after login on a remote system.
        !          1320: 
        !          1321: This login script facility operates in a manner similar to that commonly
        !          1322: used by the Unix uucp System's "@q(L.sys)" file entries.  A login script 
        !          1323: is a sequence of the form:
        !          1324: @example(@i<expect send [expect send] . . .>)
        !          1325: where @i(expect) is a prompt or message to be issued by the remote site, and
        !          1326: @i(send) is the string (names, numbers, etc) to return.  The send may also be
        !          1327: the keyword EOT, to send Control-D, or BREAK, to send a break signal.  Letters
        !          1328: in send may be prefixed by `@q[~]' to send special characters.  These are:
        !          1329: @begin(description,leftmargin +8,indent -4,spread 0)
        !          1330: @q(~b)@\backspace
        !          1331: 
        !          1332: @q(~s)@\space
        !          1333: 
        !          1334: @q(~q)@\`@q[?]'(trapped by Kermit's command interpreter)
        !          1335: 
        !          1336: @q(~n)@\linefeed
        !          1337: 
        !          1338: @q(~r)@\carriage return
        !          1339: 
        !          1340: @q(~t)@\tab
        !          1341: 
        !          1342: @q(~')@\single quote
        !          1343: 
        !          1344: @q(~~)@\tilde
        !          1345: 
        !          1346: @q(~")@\double quote
        !          1347: 
        !          1348: @q(~x)@\XON (Control-Q)
        !          1349: 
        !          1350: @q(~c)@\don't append a carriage return
        !          1351: 
        !          1352: @q(~)@i(o[o[o]])@ @ an octal character
        !          1353: 
        !          1354: @q(~d)@\delay approx 1/3 second during send
        !          1355: 
        !          1356: @q(~w)@i([d[d]])@ @ wait specified interval during expect, then time out
        !          1357: @end(description)
        !          1358: As with some uucp systems, sent strings are followed by @q(~r) unless they have
        !          1359: a @q(~c).
        !          1360: 
        !          1361: Only the last 7 characters in each expect are matched.  A null @i(expect),
        !          1362: e.g. @q(~0) or two adjacent dashes, causes a short delay before proceeding
        !          1363: to the next send sequence.  A null expect always succeeds.
        !          1364: 
        !          1365: As with uucp, if the expect string does not arrive, the script attempt
        !          1366: fails.  If you expect that a sequence might not arrive, as with uucp, 
        !          1367: conditional sequences may be expressed in the form:
        !          1368: @example(@i<-send-expect[-send-expect[...]]>)
        !          1369: where dashed sequences are followed as long as previous expects fail.
        !          1370: Timeouts for expects can be specified using @q(~w); @q(~w) with no
        !          1371: arguments waits 15 seconds.
        !          1372: 
        !          1373: @i(Expect/send) transactions can be easily be debugged by logging
        !          1374: transactions.  This records all exchanges, both expected and actual.
        !          1375: 
        !          1376: Note that `@q[\]' characters in login scripts, as in any other C-Kermit
        !          1377: interactive commands, must be doubled up.  A line may be ended with a
        !          1378: single `@q[\]' for continuation.
        !          1379: 
        !          1380: Example one:
        !          1381: 
        !          1382: Using a modem, dial a UNIX host site.  Expect "login" (...gin), and if it
        !          1383: doesn't come, simply send a null string with a @q(~r).  (Some Unixes
        !          1384: require either an EOT or a BREAK instead of the null sequence, depending
        !          1385: on the particular site's "logger" program.)  After providing user id
        !          1386: and password, respond "x" to a question-mark prompt, expect the Bourne
        !          1387: shell "@q($)" prompt (and send return if it doesn't arrive).  Then cd to
        !          1388: directory kermit, and run the program called "wermit", entering the
        !          1389: interactive connect state after wermit is loaded.
        !          1390: @begin(example)
        !          1391: set modem-dialer ventel
        !          1392: set line /dev/tty77
        !          1393: set baud 1200
        !          1394: dial 9&5551212
        !          1395: script gin:--gin:--gin: smith ssword: mysecret ~q x $--$ \
        !          1396:  cd~skermit $ wermit
        !          1397: connect
        !          1398: @end(example)
        !          1399: 
        !          1400: Example two:
        !          1401: 
        !          1402: @index(TELENET)
        !          1403: Using a modem, dial the Telenet network.  This network expects three
        !          1404: returns with slight delays between them.  These are sent following
        !          1405: null expects.  The single return is here sent as a null string, with
        !          1406: a return appended by default.  Four returns are sent to be safe before
        !          1407: looking for the prompt.  Then the Telenet id and password are entered.
        !          1408: Then telenet is instructed to connect to a host site (c 12345).  The
        !          1409: host has a data switch, and to "which system" it responds "myhost".
        !          1410: This is followed by a TOPS-20 logon, and a request to load Kermit,
        !          1411: set even parity, and enter the server mode.  Files
        !          1412: are then exchanged.  The commands are in a take file; note the continuation
        !          1413: of the 'script' command onto several lines using the `@q[\]' terminator.
        !          1414: @begin(example)
        !          1415: set modem-dialer hayes
        !          1416: set line /dev/cul0
        !          1417: set baud 1200
        !          1418: dial 9,5551212
        !          1419: set parity even
        !          1420: script ~0 ~0 ~0 ~0 ~0 ~0 ~0 ~0 @@--@@--@@ id~saa001122 = 002211 @@ \
        !          1421:     c~s12345 ystem-c~s12345-ystem myhost @@ joe~ssecret @@ kermit \
        !          1422:     > set~sparity~seven > server
        !          1423: send some.stuff
        !          1424: get some.otherstuff
        !          1425: bye
        !          1426: quit
        !          1427: @end(example)
        !          1428: Since these commands may be executed totally in the background, they
        !          1429: can also be scheduled.  A typical shell script, which might be scheduled
        !          1430: by cron, would be as follows (csh used for this example):
        !          1431: 
        !          1432: @begin(example)
        !          1433: #
        !          1434: #keep trying to dial and log onto remote host and exchange files
        !          1435: #wait 10 minutes before retrying if dial or script fail.
        !          1436: # 
        !          1437: cd someplace
        !          1438: while ( 1 )
        !          1439:         kermit < /tonight.cmd >> nightly.log &
        !          1440:         if ( ! $status ) break
        !          1441:         sleep 600
        !          1442: end
        !          1443: @end(example)
        !          1444: File @q(tonight.cmd) might have two takes in it, for example, one to take
        !          1445: a file with the set modem, set line, set baud, dial, and script, and
        !          1446: a second take of a file with send/get commands for the remote server.
        !          1447: The last lines of @q(tonight.cmd) should be a bye and a quit.
        !          1448: 
        !          1449: @heading(The 'help' Command:)
        !          1450: 
        !          1451: @begin(example,leftmargin 0)
        !          1452: @r(Syntax:) help
        !          1453: @ @ @ @i(or): help @i(keyword)
        !          1454: @ @ @ @i(or): help {set, remote} @i(keyword)
        !          1455: @end(example)
        !          1456: 
        !          1457: Brief help messages or menus are always available at interactive command
        !          1458: level by typing a question mark at any point.  A slightly more verbose form
        !          1459: of help is available through the 'help' command.  The 'help' command with
        !          1460: no arguments prints a brief summary of how to enter commands and how to
        !          1461: get further help.  'help' may be followed by one of the top-level C-Kermit
        !          1462: command keywords, such as 'send', to request information about a command.
        !          1463: Commands such as 'set' and 'remote' have a further level of help.  Thus you
        !          1464: may type 'help', 'help set', or 'help set parity'; each will provide a
        !          1465: successively more detailed level of help.
        !          1466: 
        !          1467: 
        !          1468: @heading(The 'exit' and 'quit' Commands:)
        !          1469: 
        !          1470: These two commands are identical.  Both of them do the following:
        !          1471: 
        !          1472: @begin(itemize,spread 0)
        !          1473: Attempt to insure that the terminal is returned to normal.
        !          1474: 
        !          1475: Relinquish access to any communication line assigned via 'set line'.
        !          1476: 
        !          1477: Relinquish any uucp and multiuser locks on the communications line.
        !          1478: 
        !          1479: Hang up the modem, if the communications line supports data terminal ready.
        !          1480: 
        !          1481: Close any open log files.
        !          1482: @end(itemize)
        !          1483: After exit from C-Kermit, your default directory will be the same as when
        !          1484: you started the program.  The 'exit' command is issued implicitly whenever
        !          1485: C-Kermit halts normally, e.g. after a command line invocation, or after certain
        !          1486: kinds of interruptions.
        !          1487: 
        !          1488: @section(UUCP Lock Files)
        !          1489: 
        !          1490: Unix has no standard way of obtaining exclusive access to an external
        !          1491: communication line.  When you issue the 'set line' command to Unix Kermit, Unix
        !          1492: would normally grant you access to the line even if some other process is
        !          1493: making use of it.  The method adopted by most Unix systems to handle this
        !          1494: situation is the "UUCP lock file".  UUCP, the Unix-@|to-@|Unix Copy program,
        !          1495: creates a file in its directory (usually @q(/usr/spool/uucp), on some systems
        !          1496: @q</etc/locks>) with a name like @q(LCK..)@i(name), where @i(name) is the
        !          1497: device name, for instance @q(tty07).
        !          1498: 
        !          1499: Unix Kermit uses UUCP lock files in order to avoid conflicts with UUCP,
        !          1500: tip, or other programs that follow this convention.  Whenever you attempt
        !          1501: to access an external line using the 'set line' command or `@q(-l)' on the
        !          1502: command line, Kermit looks
        !          1503: in the UUCP directory for a lock file corresponding to that device.  For
        !          1504: instance, if you 'set line /dev/ttyi6' then Kermit looks for the file
        !          1505: @example(/usr/spool/uucp/LCK..ttyi6)
        !          1506: If it finds this file, it gives you an error message and a directory
        !          1507: listing of the file so that you can see who is using it, e.g.
        !          1508: @begin(example)
        !          1509: -r--r--r--  1 fdc        4 May  7 13:02 /usr/spool/uucp/LCK..ttyi6
        !          1510: @end(example)
        !          1511: In this case, you would look up user fdc to find out how soon the line
        !          1512: will become free.
        !          1513: 
        !          1514: This convention requires that the uucp directory be publicly readable
        !          1515: and writable.  If it is not, the program will issue an appropriate warning
        !          1516: message, but will allow you to proceed at your own risk (and the risk of
        !          1517: anyone else who might also be using the same line).
        !          1518: 
        !          1519: If no lock file is found, Unix Kermit will attempt create one, thus preventing
        !          1520: anyone who subsequently tries to run Kermit, UUCP, tip, or similar programs on
        !          1521: the same line from gaining access until you release the line.  If Kermit could
        !          1522: not create the lock file (for instance because the uucp directory is
        !          1523: write-@|protected), then you will receive a warning message but will be allowed
        !          1524: to proceed at your -- and everyone else's -- risk.  When Kermit terminates
        !          1525: normally, your lock file is removed.
        !          1526: 
        !          1527: Even when the lock directory is writable and readable, the locking mechanism
        !          1528: depends upon all users using the same name for the same device.  If a device
        !          1529: has more than one path associated with it, then a lock can be circumvented by
        !          1530: using an alias.
        !          1531: 
        !          1532: When a lock-@|creating program abruptly terminates, e.g. because it crashes or
        !          1533: is killed via shell command, the lock file remains in the uucp directory,
        !          1534: spuriously indicating that the line is in use.  If the lock file is owned by
        !          1535: yourself, you may remove it.  Otherwise, you'll have to get the owner or the
        !          1536: system manager to remove it, or else wait for a system task to do so; uucp
        !          1537: supports a function (uuclean) which removes these files after a predetermined
        !          1538: age -- uucp sites tend to run this function periodically via crontab.
        !          1539: 
        !          1540: Locking is not needed, or used, if communications occur over the user's
        !          1541: login terminal line (normally @q[/dev/tty]).
        !          1542: 
        !          1543: It may be seen that line locking is fraught with peril.  It is included in Unix
        !          1544: Kermit only because other Unix communication programs rely on it.  While it
        !          1545: is naturally desirable to assure exclusive access to a line, it is also
        !          1546: undesirable to refuse access to a vacant line only because of a spurious lock
        !          1547: file, or because the uucp directory is not appropriately protected.
        !          1548: 
        !          1549: @section(C-Kermit under Berkeley or System III/V Unix:)
        !          1550: 
        !          1551: C-Kermit may be interrupted at command level or during file transfer by typing
        !          1552: Control-C.  The program will perform its normal exit function, restoring the
        !          1553: terminal and releasing any lock.  If a protocol transaction was in progress, an
        !          1554: error packet will be sent to the opposite Kermit so that it can terminate
        !          1555: cleanly.
        !          1556: 
        !          1557: C-Kermit may be invoked in the background ("@q(&)" on shell commmand line).
        !          1558: If a background process is "killed", the user will have to manually
        !          1559: remove any lock file and may need to restore the modem.  This is because 
        !          1560: the kill signal (@q<kill(@i[x],9)>) cannot be trapped by Kermit.
        !          1561: 
        !          1562: During execution of a system command ('directory', 'cwd', or `@q(!)'), C-Kermit
        !          1563: can often be returned to command level by typing a single Control-C.  (With
        !          1564: System III/V, the usual interrupt function (often the DEL key) is replaced by
        !          1565: Control-C.) 
        !          1566: 
        !          1567: Under Berkeley Unix only: C-Kermit may also be interrupted by @q(^Z) to put the
        !          1568: process in the background.  In this case the terminal is not restored.  You
        !          1569: will have to type Control-J followed by "reset" followed by another Control-J
        !          1570: to get your terminal back to normal.
        !          1571: 
        !          1572: Control-C, Control-Z, and Control-@q(\) lose their normal functions during
        !          1573: terminal connection and also during file transfer when the controlling tty
        !          1574: line is being used for packet i/o.
        !          1575: 
        !          1576: If you are running C-Kermit in "quiet mode" in the foreground, then
        !          1577: interrupting the program with a console interrupt like Control-C will not
        !          1578: restore the terminal to normal conversational operation.  This is because
        !          1579: the system call to enable console interrupt traps will cause the program to
        !          1580: block if it's running in the background, and the primary reason for quiet
        !          1581: mode is to allow the program to run in the background without blocking, so
        !          1582: that you can do other work in the foreground.
        !          1583: 
        !          1584: If C-Kermit is run in the background ("&" on shell commmand line), then
        !          1585: the interrupt signal (Control-C) (and System III/V quit signal) are
        !          1586: ignored.  This prevents an interrupt signal intended for a foreground
        !          1587: job (say a compilation) from being trapped by a background Kermit session.
        !          1588: 
        !          1589: 
        !          1590: @section(C-Kermit on the DEC Pro-3xx with Pro/Venix Version 1)
        !          1591: 
        !          1592: The DEC Professional 300 series are PDP-11/23 based personal computers.  Venix
        !          1593: Version 1 is a Unix v7 derivative.  It should not be confused with Venix
        !          1594: Version 2, which is based on ATT System V; these comments apply to Venix
        !          1595: Version 1 only.  C-Kermit runs in local mode on the Pro-3@i(xx) when invoked
        !          1596: from the console; the default device is @q(/dev/com1.dout).  When connected to
        !          1597: a remote system (using C-Kermit's 'connect' command), Pro/Venix itself (not
        !          1598: Kermit) provides VT52 terminal emulation.  Terminal operation at high speeds
        !          1599: (like 9600 baud) requires xon/xoff flow control, which unfortunately interferes
        !          1600: with applications such as the EMACS that use Control-Q and Control-S as
        !          1601: commands.
        !          1602: 
        !          1603: When logging in to a Pro-3xx (or any workstation) through the "back port",
        !          1604: it may be necessary to give the command "set line /dev/tty" in order to get
        !          1605: C-Kermit to function correctly in remote mode (on a system in which it 
        !          1606: normally expects to be operating in local mode).
        !          1607: 
        !          1608: @section(C-Kermit under VAX/VMS)
        !          1609: 
        !          1610: Version 4C of C-Kermit can be built using VAX-11 C to run under VMS.  Most
        !          1611: of the descriptions in this manual hold true, but it should be noted that
        !          1612: as of this writing the VMS support is not thoroughly tested, and no explicit
        !          1613: support exists for the various types of VMS files and their attributes.
        !          1614: 
        !          1615: The C-Kermit init file for VMS is called @q<KERMIT.INI>.
        !          1616: 
        !          1617: 
        !          1618: @section(C-Kermit on the Macintosh)
        !          1619: 
        !          1620: The "protocol kernel" of C-Kermit is also used by Columbia's Macintosh Kermit.
        !          1621: The user and system interface is entirely different, and is covered in a
        !          1622: separate document.
        !          1623: 
        !          1624: @section(C-Kermit Restrictions and Known Bugs)
        !          1625: 
        !          1626: @begin(enumerate)
        !          1627: @ux(Editing characters):
        !          1628: The program's interactive command interrupt, delete, and kill characters are
        !          1629: Control-C, Delete (or Backspace), and Control-U, respectively.  There is
        !          1630: currently no way to change them to suit your taste or match those used by
        !          1631: your shell, in case those are different.
        !          1632: 
        !          1633: @ux(High baud rates):
        !          1634: There's no way to specify baud rates higher than 9600 baud.  Most Unix
        !          1635: systems don't supply symbols for them (unless you use EXTA, EXTB), and even
        !          1636: when they do, the program has no way of knowing whether a specific port's
        !          1637: serial i/o controller supports those rates.
        !          1638: 
        !          1639: @ux(Modem controls):
        !          1640: If a connection is made over a communication line (rather than on the
        !          1641: controlling terminal line), and that line has modem controls, (e.g. data
        !          1642: terminal ready and carrier detection implementation), returning to the shell
        !          1643: level will disconnect the conversation.  In that case, one should use
        !          1644: interactive mode commands, and avoid use of piped shell-@|level operation
        !          1645: (also see 'set modem-dialer' and 'dial' commands.)
        !          1646: 
        !          1647: @ux(Login Scripts):  The present login scripts implementation follows
        !          1648: the Unix conventions of uucp's "@q(L.sys)" file, rather than the normal
        !          1649: Kermit "INPUT/@|OUTPUT" style, so there's no way to arbitrarily mingle
        !          1650: script output with Kermit commands (e.g. changing parity or duplex in
        !          1651: the middle of a script).
        !          1652: 
        !          1653: @begin(multiple)
        !          1654: @ux(Dial-out vs dial-in communications lines):
        !          1655: C-Kermit requires a dial-out or dedicated line for the "set line" or "-l"
        !          1656: options.  Most systems have some lines dedicated to dial-in, which they enable
        !          1657: "loggers" on, and some lines available for dial-out.  Where a line
        !          1658: must be shared between dial-in and dial-out, several options are
        !          1659: available (though they are, strictly speaking, outside the pervue of
        !          1660: C-Kermit).
        !          1661: 
        !          1662: A simple shell program can be used to change directionality of the line if
        !          1663: your Unix has the enable(8) and disable(8) commands.  In that case, the shell
        !          1664: program could "grep" a "who" to see if anybody is logged onto the desired
        !          1665: line; if not, it could "disable" the line.  The shell program will need to be
        !          1666: set-uID'ed to root.  The shell program can be called from kermit prior to a
        !          1667: dial command, e.g., "@q(! mydisable.shellprog)".  Prior to the final "quit"
        !          1668: from C-Kermit, another shell program could be executed to "enable" the line
        !          1669: again.  This program also needs to be set-uID'ed to root.
        !          1670: 
        !          1671: If your Unix lacks the enable(8) and disable(8) commands, another common
        !          1672: technique works if your system supports the @q(/etc/ttys) file.  A shell
        !          1673: program could call up an awk program to find the line in the file and set the
        !          1674: enable byte to 0 (to directly disable the line).  Likewise, it can be
        !          1675: reenabled by a counterpart at the end.  It may be necessary to pause for 60
        !          1676: seconds after modifying that file before the logger sees it and actually
        !          1677: disables the line.
        !          1678: @end(multiple)
        !          1679: 
        !          1680: @begin(multiple)
        !          1681: @ux(Using C-Kermit on Local Area Networks):
        !          1682: C-Kermit can successfully operate at speeds up to 9600 baud over LANs,
        !          1683: provided the network buffers are big enough to accommodate Kermit packets
        !          1684: (which are almost always less than 100 characters long).
        !          1685: 
        !          1686: When computers are connected to LAN's through asynchronous terminal
        !          1687: interfaces, then the connection should be configured to do XON/XOFF flow
        !          1688: control between the network interface and the computer, rather than passing
        !          1689: these signals through transparently.  This can help prevent Kermit from
        !          1690: overrunning the LAN's buffers if they are small (or if the LAN is congested),
        !          1691: and will can also prevent the LAN from overrunning a slow Kermit's buffers.
        !          1692: 
        !          1693: If the network hardware cannot accept 100 characters at a time, and flow
        !          1694: control cannot be done between the network and the computer, then Kermit's
        !          1695: "set send/receive packet-length" command can be used to shorten the packets.
        !          1696: @end(multiple)
        !          1697: 
        !          1698: @ux(Resetting terminal after abnormal termination or kill): When C-Kermit
        !          1699: terminates abnormally (say, for example, by a kill
        !          1700: command issued by the operator) the user may need to reset the terminal state.
        !          1701: If commands do not seem to be accepted at the shell prompt, try
        !          1702: Control-J "stty sane" Control-J (use "reset" on Berkeley Unix).
        !          1703: That should take the terminal out of "raw mode" if it was stuck there.
        !          1704: 
        !          1705: @ux(Remote host commands may time-out on lengthy activity):
        !          1706: Using "remote host" to instruct the C-Kermit server to invoke Unix
        !          1707: functions (like "make") that might take a long time to produce output can cause
        !          1708: timeout conditions.
        !          1709: 
        !          1710: @ux(XOFF deadlocks):
        !          1711: When connecting back to C-Kermit after a transaction, or after finishing
        !          1712: the server, it may be necessary to type a Control-Q to clear up an XOFF
        !          1713: deadlock.  There's not much the program can do about this...
        !          1714: 
        !          1715: @ux(PC/IX Login Scripts -- Unfound Bug):
        !          1716: Though login scripts appear to work properly on most processors, in the
        !          1717: case of the PC/XT with PC/IX, it appears that longer scripts
        !          1718: need to be broken up into shorter scripts (invoked sequentially from
        !          1719: the take file).  This is because the portion of the script handler
        !          1720: which checks if an operation timed out seems to leave the processor
        !          1721: in a strange state (i.e. hung).
        !          1722: @end(enumerate)
        !          1723: 
        !          1724: @section(How to Build C-Kermit for a Unix System)
        !          1725: 
        !          1726: The C-Kermit files, as distributed from Columbia, all begin with the prefix
        !          1727: "ck".  You should make a directory for these files and then cd to it.  A
        !          1728: makefile is provided to build C-Kermit for various Unix systems (there are
        !          1729: separate makefiles for VMS and the Macintosh).  As distributed, the makefile
        !          1730: has the name "@q(ckuker.mak)".  You should rename it to "@q(makefile)" and then
        !          1731: type "make xxx", where xxx is the symbol for your system, for instance "make
        !          1732: bsd" to make C-Kermit for 4.x BSD Unix.  The result will be a program called
        !          1733: "wermit".  You should test this to make sure it works; if it does, then you can
        !          1734: rename it to "kermit" and install it for general use.  See the makefile for a
        !          1735: list of the systems supported and the corresponding "make" arguments.
        !          1736: 
        !          1737: @section(Adapting C-Kermit to Other Systems)
        !          1738: 
        !          1739: C-Kermit is designed for portability.  The level of portability is indicated
        !          1740: in parentheses after the module name: "C" means any system that has a C
        !          1741: compiler that conforms to the description in "The C Programming Language" by
        !          1742: Kernighan & Ritchie (Prentice-Hall, 1978).  "Cf" is like "C", but also
        !          1743: requires "standard" features like printf and fprintf, argument passing via
        !          1744: argv/argc, and so on, as described in Kernighan & Ritchie.  "Unix" means the
        !          1745: module should be useful under any Unix implementation; it requires features
        !          1746: such as fork() and pipes.  Anything else means that the module is particular
        !          1747: to the indicated system.  C-Kermit file names are of the form:
        !          1748: 
        !          1749: @q[ck<@i(system)><@i(what)>.<@i(type)>]
        !          1750: 
        !          1751: where the part before the dot is no more than 6 characters long, the part
        !          1752: after the dot no more than 3 characters long, and:
        !          1753: 
        !          1754: @q[<@i(type)>] is the file type:
        !          1755: @begin(description,leftmargin +8,indent -6,spread 0)
        !          1756: c:@\C language source
        !          1757: 
        !          1758: h:@\Header file for C language source
        !          1759: 
        !          1760: w:@\Wart preprocessor source, converted by Wart (or Lex) to a C program
        !          1761: 
        !          1762: nr:@\Nroff/Troff text formatter source
        !          1763: 
        !          1764: mss:@\Scribe text formatter source
        !          1765: 
        !          1766: doc:@\Documentation
        !          1767: 
        !          1768: hlp:@\Help text
        !          1769: 
        !          1770: bld:@\Instructions for building the program
        !          1771: 
        !          1772: bwr:@\A "beware" file - list of known bugs
        !          1773: 
        !          1774: upd:@\Program update log
        !          1775: 
        !          1776: mak:@\Makefile
        !          1777: @end(description)
        !          1778: 
        !          1779: @q[<@i(system)>] is a single character to tell what system the file applies to:
        !          1780: @begin(description,leftmargin +8,indent -6,spread 0)
        !          1781: a:@\Descriptive material, documentation
        !          1782: 
        !          1783: c:@\All systems with C compilers
        !          1784: 
        !          1785: d:@\MS-DOS
        !          1786: 
        !          1787: m:@\Macintosh
        !          1788: 
        !          1789: u:@\Unix
        !          1790: 
        !          1791: v:@\VAX/VMS
        !          1792: 
        !          1793: w:@\Wart
        !          1794: @end(description)
        !          1795: 
        !          1796: @q[<@i(what)>] is mnemonic (up to 3 characters) for what's in the file:
        !          1797: @begin(description,leftmargin +8,indent -6,spread 0)
        !          1798: aaa:@\A "read-me" file, like this one
        !          1799: 
        !          1800: cmd:@\Command parsing
        !          1801: 
        !          1802: con:@\Connect command
        !          1803: 
        !          1804: deb:@\Debug/Transaction Log formats, Typedefs
        !          1805: 
        !          1806: dia:@\Modem/Dialer control
        !          1807: 
        !          1808: fio:@\System-depdendent File I/O
        !          1809: 
        !          1810: fns:@\Protocol support functions
        !          1811: 
        !          1812: fn2:@\More protocol support functions
        !          1813: 
        !          1814: ker:@\General C-Kermit definitions, information, documentation
        !          1815: 
        !          1816: mai:@\Main program
        !          1817: 
        !          1818: pro:@\Protocol
        !          1819: 
        !          1820: scr:@\Script command
        !          1821: 
        !          1822: tio:@\System-dependent terminal i/o & control and interrupt handing
        !          1823: 
        !          1824: usr:@\User interface
        !          1825: 
        !          1826: us2:@\More user interface
        !          1827: 
        !          1828: us3:@\Still more user interface
        !          1829: @end(description)
        !          1830: 
        !          1831: Examples:
        !          1832: 
        !          1833: @begin(description,spread 0)
        !          1834: @q(ckufio.c)@\File i/o for Unix
        !          1835: 
        !          1836: @q(ckmtio.c)@\Terminal i/o for Macintosh
        !          1837: 
        !          1838: @q(ckuker.mss)@\Scribe source for for Kermit User Guide chapter
        !          1839: 
        !          1840: @q(ckuker.nr)@\Nroff source file for Unix C-Kermit man page
        !          1841: @end(description)
        !          1842: 
        !          1843: The following material discusses each of the C-Kermit modules briefly.
        !          1844: @begin(description,leftmargin +4, indent -4)
        !          1845: @q<ckcmai.c, ckcker.h, ckcdeb.h (Cf)>:@\This is the main program.  It contains
        !          1846: declarations for global variables and 
        !          1847: a small amount of code to initialize some variables and invoke the command
        !          1848: parser.  In its distributed form, it assumes that command line arguments are
        !          1849: passed to it via argc and argv.  Since this portion of code is only several
        !          1850: lines long, it should be easy to replace for systems that have different
        !          1851: styles of user interaction.  The header files define symbols and macros used
        !          1852: by the various modules of C-Kermit.  @q(ckcdeb.h) is the only header file
        !          1853: that is included by all the C-Kermit modules, so it contains not only the
        !          1854: debug format definitions, but also any compiler-@|dependent typedefs.
        !          1855: 
        !          1856: @q<ckwart.c (Cf), ckcpro.w (C)>:@\The ckcpro module embodies the Kermit
        !          1857: protocol state table and the code to accomplish state switching.  It is written
        !          1858: in "wart", a language which may be regarded as a subset of the Unix "lex"
        !          1859: lexical analyzer generator.  Wart implements enough of lex to allow the ckprot
        !          1860: module to function.  Lex itself was not used because it is proprietary.
        !          1861: The protocol module @q(ckcpro.w) is read by wart, and a
        !          1862: system-@|independent C program is produced.  The syntax of a Wart program is
        !          1863: illustrated by @q(ckcpro.w), and is described in @q(ckwart.doc).
        !          1864: 
        !          1865: @q<ckcfns.c (C)>:@\The module contains all the Kermit protocol support
        !          1866: functions -- packet formation, encoding, decoding, block check calculation,
        !          1867: filename and data conversion, protocol parameter negotiation, and high-@|level
        !          1868: interaction with the communication line and file system.  To accommodate small
        !          1869: systems, this module has been split into two -- @q(ckcfns.c) and @q(ckcfn2.c).
        !          1870: 
        !          1871: @q(ckutio.c):@\This module contains the system-@|dependent primitives for
        !          1872: communication line i/o, timers, and interrupts for the various versions of
        !          1873: Unix.  Certain important variables are defined in this module, which determine
        !          1874: whether C-Kermit is by default remote or local, what the default communication
        !          1875: device is, and so forth.  The tio module maintains its own private database of
        !          1876: file descriptors and modes for the console terminal and the file transfer
        !          1877: communication line so that other modules (like ckcfns or the terminal connect
        !          1878: module) need not be concerned with them.  The variations among Unix
        !          1879: implementations with respect to terminal control and timers are accommodated
        !          1880: via conditional compilation.
        !          1881: 
        !          1882: @q(ckufio.c):@\This module contains system-dependent primitives for file i/o,
        !          1883: wildcard (meta character) expansion, file existence and access checking, and
        !          1884: system command execution for the various versions of Unix.  It maintains an
        !          1885: internal database of i/o "channels" (file pointers in this case) for the files
        !          1886: C-Kermit cares about -- the input file (the file which is being sent), the
        !          1887: output file (the file being received), the various logs, the screen, and so
        !          1888: forth.  This module varies little among Unix implementations except for the
        !          1889: wildcard expansion code; the directory structure of 4.2bsd Unix is different
        !          1890: from that of other Unix systems.  Again, variation among Unix systems is
        !          1891: selected using conditional compilation.
        !          1892: 
        !          1893: @begin(multiple)
        !          1894: @q(ckuusr.h, ckuusr.c, ckuus2.c, ckuus3.c) (Unix):@\This is the "user
        !          1895: interface" for C-Kermit.  It includes the command parser,
        !          1896: the screen output functions, and console input functions.  The command
        !          1897: parser comes in two pieces -- the traditional Unix command line decoder
        !          1898: (which is quite small and compact), and the interactive keyword parser
        !          1899: (which is rather large).  This module is fully replacable; its interface to
        !          1900: the other modules is very simple, and is explained at the beginning of the
        !          1901: source file.  The ckuusr module also includes code to execute any commands
        !          1902: directly which don't require the Kermit protocol -- local file management,
        !          1903: etc.  The module is rated "Unix" because it makes occasional use of the
        !          1904: @q[system()] function.
        !          1905: 
        !          1906: Note that while @q(ckuusr) is logically one module, it has been split up into
        !          1907: three C source files, plus a header file for the symbols they share in common.
        !          1908: This is to accommodate small systems that cannot handle big modules.
        !          1909: @q(ckuusr.c) has the command line and top-@|level interactive command parser;
        !          1910: @q(ckuus2.c) has the help command and strings; @q(ckuus3) has the set
        !          1911: and remote commands along with the logging, screen, and "interrupt" functions.
        !          1912: @end(multiple)
        !          1913: 
        !          1914: @q(ckucmd.c, ckucmd.h) (Cf):@\This is an interactive command parsing package
        !          1915: developed for C-Kermit.  It is written portably enough to be usable on any
        !          1916: system that has a C compiler that supports functions like printf.  The file
        !          1917: name parsing functions depend upon primitives defined in the fio module; if
        !          1918: these primitives cannot be supplied for a certain system, then the filename
        !          1919: parsing functions can be deleted, and the package will still be useful for
        !          1920: parsing keywords, numbers, arbitrary text strings, and so forth.  The style of
        !          1921: interaction is the same as that found on the DECSYSTEM-20.
        !          1922: 
        !          1923: @q(ckucon.c) (Unix):@\This is the connect module.  As supplied, it should
        !          1924: operate in any Unix environment, or any C-based environment that provides the
        !          1925: fork() function.  The module requires access to global variables that specify
        !          1926: line speed, parity, duplex, flow control, etc, and invokes functions from the
        !          1927: tio module to accomplish the desired settings and input/output, and functions
        !          1928: from the fio module to perform session logging.  No terminal emulation is
        !          1929: performed, but since standard i/o is used for the console, this may be piped
        !          1930: through a terminal emulation filter.  The ckucon function may be entirely
        !          1931: replaced, so long as the global settings are honored by its replacement.  PC
        !          1932: implementations of C-Kermit may require the ck?con module to do screen control,
        !          1933: escape sequence interpretation, etc, and may also wish to write special code to
        !          1934: get the best possible performance.
        !          1935: 
        !          1936: @q(ckudia.c) (Unix):@\This is the dialer module.  As supplied, it handles
        !          1937: Hayes, Ventel, Penril, Racal-Vadic, and several other modems.
        !          1938: 
        !          1939: @q(ckuscr.c) (Unix):@\This is the login script module.  As supplied, it handles
        !          1940: uucp-@|style scripts. 
        !          1941: @end(description)
        !          1942: 
        !          1943: Moving C-Kermit to a new system entails:
        !          1944: @begin(enumerate)
        !          1945: Creating a new @q<ck?tio> module in C, assembler, or whatever language is
        !          1946: most appropriate for system programming on the new system.  If the system
        !          1947: is Unix-like, then support may be added within the @q<ckutio.c> module itself
        !          1948: using conditional compilation.
        !          1949: 
        !          1950: Creating a new @q<ck?fio> module, as above.
        !          1951: 
        !          1952: If the system is not Unix-like, then a new @q<ckuusr> module may be required,
        !          1953: as well as a different invocation of it from @q<ckcmai>.
        !          1954: 
        !          1955: If the distributed connect module doesn't work or performs poorly, then
        !          1956: it may be replaced.  For instance, interrupt-@|driven i/o may be required,
        !          1957: especially if the system doesn't have forks.
        !          1958: @end(enumerate)
        !          1959: Those who favor a different style of user/program interaction from that
        !          1960: provided in @q(ckuusr.c) may replace the entire module, for instance with one
        !          1961: that provides a mouse/@|window/@|icon environment, a menu/@|function-@|key
        !          1962: environment, etc.
        !          1963: 
        !          1964: A few guidelines should be followed to maintain portability:
        !          1965: @begin(itemize)
        !          1966: Keep variable and function names to 6 characters or less.  Don't use
        !          1967: identifiers that are distinguished from one another only by alphabetic
        !          1968: case.
        !          1969: 
        !          1970: Keep modules small.  For instance, on a PDP-11 it is necessary to keep
        !          1971: the code segment of each module below 8K in order to allow the segment
        !          1972: mapping to occur which is necessary to run programs larger than 64K on a
        !          1973: non-@|I-and-D-@|space machine.
        !          1974: 
        !          1975: Keep strings short; many compilers have restrictive maximum lengths; 128
        !          1976: is the smallest maximum string constant length we've encountered so far.
        !          1977: 
        !          1978: Keep (f,s)printf formats short.  If these exceed some compiler dependent
        !          1979: maximum (say, 128) memory will be overwritten and the program will probably
        !          1980: core dump.
        !          1981: 
        !          1982: Do not introduce system dependencies into @q(ckcpro.w) or @q(ckcfn*.c).
        !          1983: 
        !          1984: If a variable is a character, declare as CHAR, not int, to prevent the
        !          1985: various sign extension and byte swapping foulups that occur when characters
        !          1986: are placed in integer variables.
        !          1987: 
        !          1988: Remember that different systems may use different length words for different
        !          1989: things.  Don't assume an integer can be used as a pointer, etc.
        !          1990: 
        !          1991: Don't declare static functions; these can wreak havoc with systems that do
        !          1992: segment mapping.
        !          1993: 
        !          1994: In conditional compilations expressions, use @q(#ifdef) and @q(#ifndef) and
        !          1995: not @q(#if), which is not supported by some compilers.  Also, don't use any
        !          1996: operators in these expressions; many compilers will fail to understand
        !          1997: expressions like @w<@q(#ifdef FOO | BAR)>.
        !          1998: 
        !          1999: Don't define multiline macros.
        !          2000: @End(Itemize)
        !          2001: In general, remember that this program will have to be compilable by old
        !          2002: compilers and runnable on small systems.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.