Annotation of coherent/g/usr/lib/uucp/tay104/uucp.texi, revision 1.1

1.1     ! root        1: \input texinfo   @c -*-texinfo-*-
        !             2: @c %**start of header
        !             3: @setfilename uucp.info
        !             4: @settitle Taylor UUCP
        !             5: @setchapternewpage odd
        !             6: @c %**end of header
        !             7: 
        !             8: @iftex
        !             9: @finalout
        !            10: @end iftex
        !            11: 
        !            12: @ignore
        !            13: ---------------------------------------------------------------------->
        !            14: Franc,ois Pinard says:
        !            15: 
        !            16: Hi, Ian!  This is the promised merging of the current documents from
        !            17: Taylor UUCP 1.01, plus the patches to documentation you sent to me, into
        !            18: a taylor.texi file.  Many things remain to do, among which:
        !            19: 
        !            20: - merging in the Taylor UUCP program man pages.
        !            21: ----------------------------------------------------------------------<
        !            22: @end ignore
        !            23: 
        !            24: @ifinfo
        !            25: This file documents Taylor UUCP, version 1.04.
        !            26: 
        !            27: Copyright @copyright{} 1992, 1993 Ian Lance Taylor
        !            28: 
        !            29: Permission is granted to make and distribute verbatim copies of this
        !            30: manual provided the copyright notice and this permission notice are
        !            31: preserved on all copies.
        !            32: 
        !            33: @ignore 
        !            34: Permission is granted to process this file through TeX and print the
        !            35: results, provided the printed document carries a copying permission
        !            36: notice identical to this one except for the removal of this paragraph
        !            37: (this paragraph not being relevant to the printed manual).
        !            38: 
        !            39: @end ignore
        !            40: Permission is granted to copy and distribute modified versions of this
        !            41: manual under the conditions for verbatim copying, provided also that the
        !            42: section entitled ``Copying'' are included exactly as in the original, and
        !            43: provided that the entire resulting derived work is distributed under the
        !            44: terms of a permission notice identical to this one.
        !            45: 
        !            46: Permission is granted to copy and distribute translations of this manual
        !            47: into another language, under the above conditions for modified versions,
        !            48: except that the section entitled ``Copying'' may be included in a
        !            49: translation approved by the author instead of in the original English.
        !            50: @end ifinfo
        !            51: 
        !            52: @titlepage
        !            53: @title Taylor UUCP
        !            54: @subtitle Version 1.04
        !            55: @author Ian Lance Taylor @code{<ian@@airs.com>}
        !            56: 
        !            57: @page
        !            58: @vskip 0pt plus 1filll
        !            59: Copyright @copyright{} 1992, 1993 Ian Lance Taylor
        !            60: 
        !            61: Published by Ian Lance Taylor @code{<ian@@airs.com>}.
        !            62: 
        !            63: Permission is granted to make and distribute verbatim copies of this
        !            64: manual provided the copyright notice and this permission notice are
        !            65: preserved on all copies.
        !            66: 
        !            67: Permission is granted to copy and distribute modified versions of this
        !            68: manual under the conditions for verbatim copying, provided also that the
        !            69: section entitled ``Copying'' are included exactly as in the original, and
        !            70: provided that the entire resulting derived work is distributed under the
        !            71: terms of a permission notice identical to this one.
        !            72: 
        !            73: Permission is granted to copy and distribute translations of this manual
        !            74: into another language, under the above conditions for modified versions,
        !            75: except that the section entitled ``Copying'' may be included in a
        !            76: translation approved by the author instead of in the original English.
        !            77: @end titlepage
        !            78: 
        !            79: @node Top, Copying, (dir), (dir)
        !            80: @top Taylor UUCP 1.04
        !            81: 
        !            82: This is the documentation for the Taylor UUCP package, version 1.04.
        !            83: The programs were written by Ian Lance Taylor.  The author can be
        !            84: reached at @code{<ian@@airs.com>}, or @samp{c/o Cygnus Support, 4th
        !            85: Floor, Building 200, 1 Kendall Square, Cambridge, MA, 02139}.
        !            86: 
        !            87: There is a mailing list for discussion of the package.  To join (or get
        !            88: off) the list, send mail to
        !            89: @code{<taylor-uucp-request@@gnu.ai.mit.edu>}.  Mail to this address is
        !            90: answered by a person, not a program.  When joining the list, please give
        !            91: the address at which you wish to receive mail; do not rely on the
        !            92: message headers.  To send a message to the list, send it to
        !            93: @code{<taylor-uucp@@gnu.ai.mit.edu>}.
        !            94: 
        !            95: @menu
        !            96: * Copying::                     Taylor UUCP copying conditions
        !            97: * Introduction::                Introduction to Taylor UUCP
        !            98: * Overall Installation::        Taylor UUCP installation
        !            99: * Configuration Files::         Taylor UUCP configuration files
        !           100: * Protocols::                   UUCP protocol internals
        !           101: * Hacking::                     Hacking Taylor UUCP
        !           102: * Acknowledgements::            Acknowledgements
        !           103: 
        !           104: * Index (concepts)::            Concept index
        !           105: * Index (configuration file)::  Index to new configuration files
        !           106: 
        !           107:  --- The Detailed Node Listing ---
        !           108: 
        !           109: Taylor UUCP Overall Installation
        !           110: 
        !           111: * Configuration::               Configuring Taylor UUCP
        !           112: * Compilation::                 Compiling Taylor UUCP
        !           113: * Testing::                     Testing Taylor UUCP
        !           114: * Installation::                Installing Taylor UUCP
        !           115: * TCP::                         TCP together with Taylor UUCP
        !           116: 
        !           117: Installing Taylor UUCP
        !           118: 
        !           119: * Running uucico::              Running uucico
        !           120: * Using UUCP for mail and news::  Using UUCP for mail and news.
        !           121: * Trimming UUCP Log Files::     Trimming UUCP Log Files
        !           122: 
        !           123: Using UUCP for mail and news.
        !           124: 
        !           125: * Sending mail or news::        Sending mail or news via UUCP
        !           126: * Receiving mail or news::      Receiving mail or news via UUCP
        !           127: 
        !           128: Taylor UUCP Configuration Files
        !           129: 
        !           130: * Configuration File Format::   Configuration file format
        !           131: * Configuration Examples::      Examples of configuration files
        !           132: * Time Strings::                How to write time strings
        !           133: * Chat Scripts::                How to write chat scripts
        !           134: * config File::                 The main configuration file
        !           135: * sys File::                    The system configuration file
        !           136: * port File::                   The port configuration files
        !           137: * dial File::                   The dialer configuration files
        !           138: * Security::                    Security issues
        !           139: 
        !           140: Examples of Configuration Files
        !           141: 
        !           142: * config File Examples::        Examples of the main configuration file
        !           143: * Leaf Example::                Call a single remote site
        !           144: * Gateway Example::             The gateway for several local systems
        !           145: 
        !           146: The Main Configuration File
        !           147: 
        !           148: * Miscellaneous (config)::      Miscellaneous config file commands
        !           149: * Configuration File Names::    Using different configuration files
        !           150: * Log File Names::              Using different log files
        !           151: * Debugging Levels::            Debugging levels
        !           152: 
        !           153: The System Configuration File
        !           154: 
        !           155: * Defaults and Alternates::     Using defaults and alternates
        !           156: * Naming the System::           Naming the system
        !           157: * Calling Out::                 Calling out
        !           158: * Accepting a Call::            Accepting a call
        !           159: * Protocol Selection::          Protocol selection
        !           160: * File Transfer Control::       File transfer control
        !           161: * Miscellaneous (sys)::         Miscellaneous sys file commands
        !           162: * Default sys File Values::     Default values
        !           163: 
        !           164: Calling Out
        !           165: 
        !           166: * When to Call::                When to call
        !           167: * Placing the Call::            Placing the call
        !           168: * Logging In::                  Logging in
        !           169: 
        !           170: UUCP protocol internals
        !           171: 
        !           172: * Grades::                      UUCP grades
        !           173: * Lock Files::                  UUCP lock file format
        !           174: * UUCP Protocol::               The common UUCP protocol
        !           175: * g Protocol::                  The UUCP @samp{g} protocol
        !           176: * f Protocol::                  The UUCP @samp{f} protocol
        !           177: * t Protocol::                  The UUCP @samp{t} protocol
        !           178: * e Protocol::                  The UUCP @samp{e} protocol
        !           179: * x Protocol::                  The UUCP @samp{x} protocol
        !           180: * d Protocol::                  The UUCP @samp{d} protocol
        !           181: * Capital G Protocol::          The UUCP @samp{G} protocol
        !           182: * Documentation References::    Documentation references
        !           183: 
        !           184: The Common UUCP Protocol
        !           185: 
        !           186: * Initial Handshake::           Initial handshake
        !           187: * File Requests::               File requests
        !           188: * Final Handshake::             Final handshake
        !           189: 
        !           190: File Requests
        !           191: 
        !           192: * S Request::                   S request
        !           193: * R Request::                   R request
        !           194: * X Request::                   X request
        !           195: * H Request::                   H request
        !           196: 
        !           197: Hacking Taylor UUCP
        !           198: 
        !           199: * System Dependence::           System Dependence
        !           200: * Naming Conventions::          Naming Conventions
        !           201: * Patches::                     Patches
        !           202: @end menu
        !           203: 
        !           204: @node Copying, Introduction, Top, Top
        !           205: @unnumbered Taylor UUCP Copying Conditions
        !           206: 
        !           207: This package is covered by the GNU Public License.  See the file
        !           208: @file{COPYING} for details.  If you would like to do something with this
        !           209: package that you feel is reasonable, but you feel is prohibited by the
        !           210: license, contact me to see if we can work it out.
        !           211: 
        !           212: Here is some propaganda from the Free Software Foundation.  If you find
        !           213: this stuff offensive or annoying, remember that you probably did not
        !           214: spend any money to get this code.  I did not write this code to make
        !           215: life easier for developers of UUCP packages, I wrote it to help end
        !           216: users, and I believe that these are the most appropriate conditions for
        !           217: distribution.
        !           218: 
        !           219: All the programs, scripts and documents relating to Taylor UUCP are
        !           220: @dfn{free}; this means that everyone is free to use them and free to
        !           221: redistribute them on a free basis.  The Taylor UUCP-related programs are
        !           222: not in the public domain; they are copyrighted and there are
        !           223: restrictions on their distribution, but these restrictions are designed
        !           224: to permit everything that a good cooperating citizen would want to do.
        !           225: What is not allowed is to try to prevent others from further sharing any
        !           226: version of these programs that they might get from you.
        !           227: 
        !           228: Specifically, we want to make sure that you have the right to give away
        !           229: copies of the programs that relate to Taylor UUCP, that you receive
        !           230: source code or else can get it if you want it, that you can change these
        !           231: programs or use pieces of them in new free programs, and that you know
        !           232: you can do these things.
        !           233: 
        !           234: To make sure that everyone has such rights, we have to forbid you to
        !           235: deprive anyone else of these rights.  For example, if you distribute
        !           236: copies of the Taylor UUCP related programs, you must give the recipients
        !           237: all the rights that you have.  You must make sure that they, too,
        !           238: receive or can get the source code.  And you must tell them their
        !           239: rights.
        !           240: 
        !           241: Also, for our own protection, we must make certain that everyone finds
        !           242: out that there is no warranty for the programs that relate to Taylor
        !           243: UUCP.  If these programs are modified by someone else and passed on, we
        !           244: want their recipients to know that what they have is not what we
        !           245: distributed, so that any problems introduced by others will not reflect
        !           246: on our reputation.
        !           247: 
        !           248: The precise conditions of the licenses for the programs currently being
        !           249: distributed that relate to Taylor UUCP are found in the General Public
        !           250: Licenses that accompany them.
        !           251: 
        !           252: @node Introduction, Overall Installation, Copying, Top
        !           253: @chapter Introduction to Taylor UUCP
        !           254: 
        !           255: General introductions to UUCP are available, and perhaps one day I will
        !           256: write one.  In the meantime, here is a very brief one that concentrates
        !           257: on the programs provided by Taylor UUCP.
        !           258: 
        !           259: Taylor UUCP is a complete UUCP package.  It is covered by the GNU Public
        !           260: License, which means that the source code is always available.  It is
        !           261: composed of several programs; most of the names of these programs are
        !           262: based on earlier UUCP packages.
        !           263: 
        !           264: @table @code
        !           265: 
        !           266: @item uucp
        !           267: 
        !           268: The @code{uucp} program is used to copy file between systems.  It is
        !           269: similar to the standard Unix @code{cp} program, except that you can
        !           270: refer to a file on a remote system by using @samp{system!} before the
        !           271: file name.  For example, to copy the file @file{notes.txt} to the system
        !           272: @samp{airs}, you would say @samp{uucp notes.txt airs!~/notes.txt}.  In
        !           273: this example @samp{~} is used to name the UUCP public directory on
        !           274: @samp{airs}.
        !           275: 
        !           276: @item uux
        !           277: 
        !           278: The @code{uux} program is used to request a program to be executed on a
        !           279: remote system.  This is how mail and news are transferred over UUCP.  As
        !           280: with @code{uucp}, programs and files on remote systems may be named by
        !           281: using @samp{system!}.  For example, to run the @code{rnews} program on
        !           282: @samp{airs} passing it standard input, you would say @samp{uux -
        !           283: airs!rnews}.  The @samp{-} means to read standard input and set things
        !           284: up such that when @code{rnews} runs on @samp{airs} it will receive the
        !           285: same standard input.
        !           286: 
        !           287: @end table
        !           288: 
        !           289: Neither @code{uucp} nor @code{uux} actually do any work immediately.
        !           290: Instead, they queue up requests for later processing.  They then start a
        !           291: daemon process which processes the requests and calls up the appropriate
        !           292: systems.  Normally the system will also start the daemon periodically to
        !           293: check if there is any work to be done.  The advantage of this approach
        !           294: is that it all happens automatically.  You don't have to sit around
        !           295: waiting for the files to be transferred.  The disadvantage is that if
        !           296: anything goes wrong it might be a while before anybody notices.
        !           297: 
        !           298: @table @code
        !           299: 
        !           300: @item uustat
        !           301: 
        !           302: The @code{uustat} program does many things.  By default it will simply
        !           303: list all the jobs you have queued with @code{uucp} or @code{uux} that
        !           304: have not yet been processed.  You can use @code{uustat} to remove any of
        !           305: your jobs from the queue.  You can also it use it to show the status of
        !           306: the UUCP system in various ways, such as showing the connection status
        !           307: of all the remote systems your system knows about.  The system
        !           308: administrator can use @code{uustat} to automatically discard old jobs
        !           309: while sending mail to the user who requested them.
        !           310: 
        !           311: @item uuname
        !           312: 
        !           313: The @code{uuname} program by default lists all the remote systems your
        !           314: system knows about.  You can also use it to get the name of your local
        !           315: system.  It is mostly useful for shell scripts.
        !           316: 
        !           317: @item uulog
        !           318: 
        !           319: The @code{uulog} program can be used to display entries in the UUCP log
        !           320: file.  It can select the entries for a particular system or a particular
        !           321: user.  You can use it to see what has happened to your queued jobs in
        !           322: the past.
        !           323: 
        !           324: @item uuto
        !           325: @item uupick
        !           326: 
        !           327: @code{uuto} is a simple shell script interface to @code{uucp}.  It will
        !           328: transfer a file, or the contents of a directory, to a remote system, and
        !           329: notify a particular user on the remote system when it arrives.  The
        !           330: remote user can then retrieve the file(s) with @code{uupick}.
        !           331: 
        !           332: @item cu
        !           333: 
        !           334: The @code{cu} program can be used to call up another system and
        !           335: communicate with it as though you were directly connected.  It can also
        !           336: do simple file transfers, though it does not provide any error checking.
        !           337: 
        !           338: @end table
        !           339: 
        !           340: These eight programs just described, @code{uucp}, @code{uux},
        !           341: @code{uuto}, @code{uupick}, @code{uustat}, @code{uuname}, @code{uulog},
        !           342: and @code{cu} are the user programs provided by Taylor UUCP@.
        !           343: @code{uucp}, @code{uux}, and @code{uuto} add requests to the work queue,
        !           344: @code{uupick} extracts files from the UUCP public directory,
        !           345: @code{uustat} examines the work queue, @code{uuname} examines the
        !           346: configuration files, @code{uulog} examines the log files, and @code{cu}
        !           347: just uses the UUCP configuration files.
        !           348: 
        !           349: The real work is actually done by two daemon processes, which are
        !           350: normally run automatically rather than by a user.
        !           351: 
        !           352: @table @code
        !           353: 
        !           354: @item uucico
        !           355: 
        !           356: The @code{uucico} daemon is the program which actually calls the remote
        !           357: system and transfers files and requests.  @code{uucico} is normally
        !           358: started automatically by @code{uucp} and @code{uux}.  Most systems will
        !           359: also start it periodically to make sure that all work requests are
        !           360: handled.  @code{uucico} checks the queue to see what work needs to be
        !           361: done, and then calls the appropriate systems.  If the call fails,
        !           362: perhaps because the phone line is busy, @code{uucico} leaves the
        !           363: requests in the queue and goes on to the next system to call.  It is
        !           364: also possible to force @code{uucico} to call a remote system even if
        !           365: there is no work to be done for it, so that it can pick up any work that
        !           366: may be queued up remotely.
        !           367: 
        !           368: @item uuxqt
        !           369: 
        !           370: The @code{uuxqt} daemon processes execution requests made by the
        !           371: @code{uux} program on remote systems.  It also processes requests made
        !           372: on the local system which require files from a remote system.  It is
        !           373: normally started by @code{uucico}.
        !           374: 
        !           375: @end table
        !           376: 
        !           377: Suppose you, on the system @samp{bantam}, want to copy a file to the
        !           378: system @samp{airs}.  You would run the @code{uucp} command locally, with
        !           379: a command like @samp{uucp notes.txt airs!~/notes.txt}.  This would queue
        !           380: up a request on @samp{bantam} for @samp{airs}, and would then start the
        !           381: @code{uucico} daemon.  @code{uucico} would see that there was a request
        !           382: for @samp{airs} and attempt to call it.  When the call succeeded,
        !           383: another copy of @code{uucico} would be started on @samp{airs}.  The two
        !           384: copies of @code{uucico} would tell each other what they had to do and
        !           385: transfer the file from @samp{bantam} to @samp{airs}.  When the file
        !           386: transfer was complete the @code{uucico} on @samp{airs} would move it
        !           387: into the UUCP public directory.
        !           388: 
        !           389: UUCP is often used to transfer mail.  This is normally done
        !           390: automatically by mailer programs.  When @samp{bantam} has a mail message
        !           391: to send to @samp{ian} at @samp{airs}, it executes @samp{uux - airs!rmail
        !           392: ian} and writes the mail message to the @code{uux} process as standard
        !           393: input.  The @code{uux} program, running on @samp{bantam}, will read the
        !           394: standard input and store it, as well as the @code{rmail} request itself,
        !           395: on the work queue for @samp{airs}.  @code{uux} will then start the
        !           396: @code{uucico} daemon.  The @code{uucico} daemon will call up
        !           397: @samp{airs}, just as in the @code{uucp} example, and transfer the work
        !           398: request and the mail message.  The @code{uucico} daemon on @samp{airs}
        !           399: will put the files on a local work queue.  When the communication
        !           400: session is over, the @code{uucico} daemon on @samp{airs} will start the
        !           401: @code{uuxqt} daemon.  @code{uuxqt} will see the request to run, and will
        !           402: run @samp{rmail ian} with the mail message as standard input.  The
        !           403: @code{rmail} program, which is not part of the UUCP package, is then
        !           404: responsible for either putting the message in the right mailbox on
        !           405: @samp{airs} or forwarding the message on to another system.
        !           406: 
        !           407: Taylor UUCP comes with a few other programs that are useful when
        !           408: installing and configuring UUCP.
        !           409: 
        !           410: @table @code
        !           411: 
        !           412: @item uuchk
        !           413: 
        !           414: The @code{uuchk} program reads the UUCP configuration files and displays
        !           415: a rather lengthy description of what it finds.  This is useful when
        !           416: configuring UUCP to make certain that the UUCP package will do what you
        !           417: expect it to do.
        !           418: 
        !           419: @item uuconv
        !           420: 
        !           421: The @code{uuconv} program can be used to convert UUCP configuration
        !           422: files from one support format to another.  This can be useful for
        !           423: administrators converting from an older UUCP.  Taylor UUCP is able to
        !           424: read and use old configuration file formats, but some new features can
        !           425: not be selected using the old formats.
        !           426: 
        !           427: @item uusched
        !           428: 
        !           429: The @code{uusched} script is just provided for compatibility with older
        !           430: UUCP releases.  It starts @code{uucico} to call, one at a time, all the
        !           431: systems for which work has been queued.
        !           432: 
        !           433: @item tstuu
        !           434: 
        !           435: The @code{tstuu} program is a test harness for the UUCP package, which
        !           436: will help ensure that it has been configured and compiled correctly.  It
        !           437: does not test everything, however.  It only runs on Unix systems which
        !           438: support Berkeley style pseudo-terminals or STREAMS style
        !           439: pseudo-terminals.  It can be useful when initially installing Taylor
        !           440: UUCP.
        !           441: 
        !           442: @end table
        !           443: 
        !           444: @node Overall Installation, Configuration Files, Introduction, Top
        !           445: @chapter Taylor UUCP Overall Installation
        !           446: 
        !           447: These are the installation instructions for the Taylor UUCP package.
        !           448: 
        !           449: @menu
        !           450: * Configuration::               Configuring Taylor UUCP
        !           451: * Compilation::                 Compiling Taylor UUCP
        !           452: * Testing::                     Testing Taylor UUCP
        !           453: * Installation::                Installing Taylor UUCP
        !           454: * TCP::                         TCP together with Taylor UUCP
        !           455: @end menu
        !           456: 
        !           457: @node Configuration, Compilation, Overall Installation, Overall Installation
        !           458: @section Configuring Taylor UUCP
        !           459: 
        !           460: You will have to decide what types of configuration files you want to
        !           461: use.  This package supports a new sort of configuration file; see
        !           462: @ref{Configuration Files}.  It also supports V2 configuration files
        !           463: (@file{L.sys}, @file{L-devices}, etc.) and HDB configuration files
        !           464: (@file{Systems}, @file{Devices}, etc.).  No documentation is provided
        !           465: for V2 or HDB configuration files.  All types of configuration files can
        !           466: be used at once, if you are so inclined.  Currently using just V2
        !           467: configuration files is not really possible, because there is no way to
        !           468: specify a dialer (there are no built in dialers, and the program does
        !           469: not know how to read @file{acucap} or @file{modemcap}); however, V2
        !           470: configuration files can be used with a new style dialer file
        !           471: (@pxref{dial File}), or with a HDB @file{Dialers} file.
        !           472: 
        !           473: Use of HDB configuration files has two known bugs.  A blank line in the
        !           474: middle of an entry in the @file{Permissions} file will not be ignored as
        !           475: it should be.  Dialer programs, as found in some versions of HDB, are
        !           476: not recognized directly.  If you must use a dialer program, rather than
        !           477: an entry in @file{Devices}, you must use the @code{chat-program} command
        !           478: in a new style dialer file; see @ref{dial File}.  You will have to
        !           479: invoke the dialer program via a shell script, since an exit code of 0 is
        !           480: required to recognize success.
        !           481: 
        !           482: The @code{uuconv} program can be used to convert from V2 or HDB
        !           483: configuration files to the new style (it can also do the reverse
        !           484: translation, if you are so inclined).  It will not do all of the work,
        !           485: and the results should be carefully checked, but it can be quite useful.
        !           486: 
        !           487: If you are installing a new system, you will, of course, have to write
        !           488: the configuration files; see @ref{Configuration Files}.
        !           489: 
        !           490: You must also decide what sort of spool directory you want to use.  If
        !           491: you will only be using these programs, I recommend
        !           492: @samp{SPOOLDIR_TAYLOR}; otherwise select the spool directory
        !           493: corresponding to your existing UUCP package.  The details of the spool
        !           494: directory choices are described at somewhat tedious length in
        !           495: @file{unix/spool.c}.
        !           496: 
        !           497: @node Compilation, Testing, Configuration, Overall Installation
        !           498: @section Compiling Taylor UUCP
        !           499: 
        !           500: @enumerate
        !           501: 
        !           502: @item
        !           503: Take a look at the top of @file{Makefile.in} and set the appropriate
        !           504: values for your system.  These control where the programs are installed
        !           505: and which user on the system owns them (normally they will be owned by a
        !           506: special user @code{uucp} rather than a real person; they should probably
        !           507: not be owned by @code{root}).
        !           508: 
        !           509: @item
        !           510: Run the shell script @code{configure}.  This script was generated using
        !           511: the @code{autoconf} program written by David MacKenzie of the Free
        !           512: Software Foundation.  It takes a while to run.  It will generate the
        !           513: file @file{conf.h} based on @file{conf.h.in}, and, for each source code
        !           514: directory, will generate @file{Makefile} based on @file{Makefile.in}.
        !           515: 
        !           516: You can pass certain arguments to @code{configure} in the environment.
        !           517: Because @code{configure} will compile little test programs to see what
        !           518: is available on your system, you must tell it how to run your compiler.
        !           519: It recognizes the following environment variables:
        !           520: 
        !           521: @table @samp
        !           522: @item CC
        !           523: The C compiler.  If this is not set, then if @code{configure} can find
        !           524: @samp{gcc} it will use it, otherwise it will use @samp{cc}.
        !           525: @item CFLAGS
        !           526: Flags to pass to the C compiler when compiling the actual code.  If this
        !           527: is not set, @code{configure} will use @samp{-g}.
        !           528: @item LDFLAGS
        !           529: Flags to pass to the C compiler when only linking, not compiling.  If
        !           530: this is not set, @code{configure} will use the empty string.
        !           531: @item LIBS
        !           532: Libraries to pass to the C compiler.  If this is not set,
        !           533: @code{configure} will use the empty string.
        !           534: @item INSTALL
        !           535: The program to run to install UUCP in the binary directory.  If this is
        !           536: not set, then if @code{configure} finds the BSD @code{install} program,
        !           537: it will set this to @samp{install -c}; otherwise, it will use @samp{cp}.
        !           538: @item INSTALLDATA
        !           539: The program to run to install UUCP data files, such as the man pages and
        !           540: the info pages.  If this is not set, then if @code{configure} finds the
        !           541: BSD @code{install} program, it will set this to @samp{install -c -m
        !           542: 644}; otherwise, it will use @samp{cp}.
        !           543: @end table
        !           544: 
        !           545: Suppose you want to set the environment variable @samp{CC} to
        !           546: @samp{rcc}.  If you are using @code{sh} or @code{bash}, invoke
        !           547: @code{configure} as @samp{CC=rcc configure}.  If you are using
        !           548: @code{csh}, do @samp{setenv CC rcc; sh configure}.
        !           549: 
        !           550: On some systems you will want to use @samp{LIBS=-lmalloc}.  On Xenix
        !           551: derived versions of Unix do not use @samp{LIBS=-lx} because this will
        !           552: bring in the wrong versions of certain routines; if you want to use
        !           553: @samp{-lx} you must specify @samp{LIBS=-lc -lx}.
        !           554: 
        !           555: If @code{configure} fails for some reason, or if you have a very wierd
        !           556: system, you may have to configure the package by hand.  To do this, copy
        !           557: the file @file{conf.h.in} to @file{conf.h} and edit it for your system.
        !           558: Then for each source directory (the top directory, and the
        !           559: subdirectories @file{lib}, @file{unix}, and @file{uuconf}) copy
        !           560: @file{Makefile.in} to @file{Makefile}, find the words within @kbd{@@}
        !           561: characters, and set them correctly for your system.
        !           562: 
        !           563: @item
        !           564: Igor V. Semenyuk provided this (lightly edited) note about ISC Unix 3.0.
        !           565: The @code{configure} script will default to passing @samp{-posix} to
        !           566: @code{gcc}.  However, using @samp{-posix} changes the environment to
        !           567: POSIX, and on ISC 3.0, at least, the default for POSIX_NO_TRUNC is 1.
        !           568: This means nothing for uucp, but can lead to a problem when uuxqt
        !           569: executes rmail.  IDA sendmail has dbm configuration files named
        !           570: @file{mailertable.@{dir,pag@}}.  Notice these names are 15 characters
        !           571: long.  When uuxqt compiled with @samp{-posix} executes rmail, which in
        !           572: turn executes sendmail, the later is run under POSIX environment too!
        !           573: This leads to sendmail bombing out with @samp{'error opening 'M'
        !           574: database: name too long' (mailertable.dir)}.  It's rather obscure
        !           575: behaviour, and it took me a day to find out the cause.  I don't use
        !           576: @samp{-posix}, instead I run @code{gcc} with @samp{-D_POSIX_SOURCE}, and
        !           577: add @samp{-lcposix} to @samp{LIBS}.
        !           578: 
        !           579: @item
        !           580: You should verify that @code{configure} worked correctly by checking
        !           581: @file{conf.h} and the instances of @file{Makefile}.
        !           582: 
        !           583: @item
        !           584: Edit @file{policy.h} for your local system.  The comments should explain
        !           585: the various choices.  The default values are intended to be reasonable,
        !           586: so you may not have to make any changes.
        !           587: 
        !           588: @item
        !           589: Type @samp{make} to compile everything.  The @file{tstuu.c} file is not
        !           590: particularly portable; if you can't figure out how to compile it you can
        !           591: safely ignore it, as it is only used for testing (to use STREAMS
        !           592: pseudo-terminals, tstuu.c must be compiled with
        !           593: @samp{-DHAVE_STREAMS_PTYS}; this is not automatically determined at the
        !           594: moment).  If you have any other problems there is probably a bug in the
        !           595: @code{configure} script.
        !           596: 
        !           597: @item
        !           598: Please report any problems you have.  That is the only way they will get
        !           599: fixed for other people.  Supply a patch if you can (@pxref{Patches}), or
        !           600: just ask for help.
        !           601: 
        !           602: @end enumerate
        !           603: 
        !           604: @node Testing, Installation, Compilation, Overall Installation
        !           605: @section Testing Taylor UUCP
        !           606: 
        !           607: This package is in use at many sites, and has been running at
        !           608: @file{airs.com} for over a year.  However, it will doubtless fail in
        !           609: some situations.  Do not rely on this code until you have proven to
        !           610: yourself that it will work.
        !           611: 
        !           612: You can use the @code{uuchk} program to test your configuration files.
        !           613: It will read them and print out a verbose description.  This program
        !           614: should not be made setuid, because it will display passwords if it can
        !           615: read them.
        !           616: 
        !           617: If your system supports pseudo-terminals, and you compiled the code to
        !           618: support the new style of configuration files, you should be able to use
        !           619: the @code{tstuu} program to test the @code{uucico} daemon (if your
        !           620: system supports STREAMS based pseudo-terminals, you must compile tstuu.c
        !           621: with @samp{-DHAVE_STREAMS_PTYS}, at least at the moment; the STREAMS
        !           622: based code was contributed by Marc Boucher).
        !           623: 
        !           624: To run @code{tstuu}, just type @samp{tstuu} with no arguments while
        !           625: logged in to the compilation directory (since it runs @file{./uucp},
        !           626: @file{./uux} and @file{./uucico}).  It will run a lengthy series of
        !           627: tests (it takes over ten minutes on a slow VAX).  You will need a fair
        !           628: amount of space available in @file{/usr/tmp}.  You will probably want to
        !           629: put it in the background.  Do not use @kbd{^Z}, because the program
        !           630: traps on @code{SIGCHLD} and winds up dying.  It will create a directory
        !           631: @file{/usr/tmp/tstuu} and fill it with configuration files, and create
        !           632: spool directories @file{/usr/tmp/tstuu/spool1} and
        !           633: @file{/usr/tmp/tstuu/spool2}.
        !           634: 
        !           635: If your system does not support the @code{FIONREAD} call, the
        !           636: @samp{tstuu} program will run very slowly.  This may or may not get
        !           637: fixed in a later version.
        !           638: 
        !           639: The @samp{tstuu} program does not seem to work under SunOS 4.1.1.  This
        !           640: seems to be due to a bug in the implementation of ptys.
        !           641: 
        !           642: The program will finish with an execute file named
        !           643: @file{X.@var{something}} and a data file named @file{D.@var{something}}
        !           644: in the directory @file{/usr/tmp/tstuu/spool1} (or, more likely, in
        !           645: subdirectories, depending on the choice of @code{SPOOLDIR} in
        !           646: @file{policy.h}).  Two log files will be created in the directory
        !           647: @file{/usr/tmp/tstuu}.  They will be named @file{Log1} and @file{Log2},
        !           648: or, if you have selected @code{HAVE_HDB_LOGGING} in @file{policy.h},
        !           649: @file{Log1/uucico/test2} and @file{Log2/uucico/test1}.  You can test
        !           650: @code{uuxqt} by running the command @samp{./uuxqt -I
        !           651: /usr/tmp/tstuu/Config1}.  This should leave a command file
        !           652: @file{C.@var{something}} and a data file @file{D.@var{something}} in
        !           653: @file{/usr/tmp/tstuu/spool1} or in subdirectories.  Again, there should
        !           654: be no errors in the log file.
        !           655: 
        !           656: Assuming you compiled the code with debugging enabled, the @samp{-x}
        !           657: switch can be used to set debugging modes; see the @code{debug} command
        !           658: for details (@pxref{Debugging Levels}).  Use @samp{-x all} to turn on
        !           659: all debugging and generate far more output than you will ever want to
        !           660: see.  The @code{uucico} daemons will put debugging output in the files
        !           661: @file{Debug1} and @file{Debug2} in the directory @file{/usr/tmp/tstuu}.
        !           662: After that, you're pretty much on your own.
        !           663: 
        !           664: On some systems you can also use @code{tstuu} to test @code{uucico}
        !           665: against the system @code{uucico}, by using the @samp{-u} switch.  For
        !           666: this to work, change the definitions of @code{ZUUCICO_CMD} and
        !           667: @code{UUCICO_EXECL} at the top of @file{tstuu.c} to something
        !           668: appropriate for your system.  The definitions in @file{tstuu.c} are what
        !           669: I used for Ultrix 4.0, on which @file{/usr/lib/uucp/uucico} is
        !           670: particularly obstinate about being run as a child; I was only able to
        !           671: run it by creating a login name with no password whose shell was
        !           672: @file{/usr/lib/uucp/uucico}.  Calling login in this way will leave fake
        !           673: entries in @file{wtmp} and @file{utmp}; if you compile @file{tstout.c}
        !           674: (in the @file{contrib} directory) as a setuid @code{root} program,
        !           675: @code{tstuu} will run it to clear those entries out.  On most systems,
        !           676: such hackery should not be necessary, although on SCO I had to su to
        !           677: @code{root} (@code{uucp} might also have worked) before I could run
        !           678: @file{/usr/lib/uucp/uucico}.
        !           679: 
        !           680: You can test @code{uucp} and @code{uux} (give them the @samp{-r} switch
        !           681: to keep them from starting @code{uucico}) to make sure they create the
        !           682: right sorts of files.  Unfortunately, if you don't know what the right
        !           683: sorts of files are, I'm not going to tell you here.
        !           684: 
        !           685: If @code{tstuu} passes, or you can't run it for some reason or other,
        !           686: move on to testing with some other system.  Set up the configuration
        !           687: files (@pxref{Configuration Files}), or use an existing configuration.
        !           688: Tell @code{uucico} to dial out to the system by using the @samp{-s}
        !           689: system switch (e.g.  @samp{uucico -s uunet}).  The log file should tell
        !           690: you what happens.
        !           691: 
        !           692: If you compiled the code with debugging enabled, you can use debugging
        !           693: mode to get a great deal of information about what sort of data is
        !           694: flowing back and forth; the various possibilities are described under
        !           695: the @code{debug} command (@pxref{Debugging Levels}).  When initially
        !           696: setting up a connection @samp{-x chat} is probably the most useful (e.g.
        !           697: @samp{uucico -s uunet -x chat}); you may also want to use @samp{-x
        !           698: handshake,incoming,outgoing}.  You can use @samp{-x} multiple times on
        !           699: one command line, or you can give it comma separated arguments as in the
        !           700: last example.  Use @samp{-x all} to turn on all possible debugging
        !           701: information.  The debugging information is written to a file, normally
        !           702: @file{/usr/spool/uucp/Debug}, although the default can be changed in
        !           703: @file{policy.h} and the configuration file can override the name with
        !           704: the @code{debugfile} command.  The debugging file may contain passwords
        !           705: and some file contents as they are transmitted over the line, so the
        !           706: debugging file is only readable by the @code{uucp} user.
        !           707: 
        !           708: You can use the @samp{-f} switch to force @code{uucico} to call out even
        !           709: if the last call failed recently; using @samp{-S} when naming a system
        !           710: has the same effect.  Otherwise the status file (in the @file{.Status}
        !           711: subdirectory of the main spool directory, normally
        !           712: @file{/usr/spool/uucp}) will prevent too many attempts from occurring in
        !           713: rapid succession.
        !           714: 
        !           715: Again, please let me know about any problems you have and how you got
        !           716: around them.  If you do report a problem, please include the version
        !           717: number of the package you are using, and a sample of the debugging file
        !           718: showing the problem.  General questions such as ``why doesn't uucico
        !           719: dial out'' are impossible to answer without much more information.
        !           720: 
        !           721: @node Installation, TCP, Testing, Overall Installation
        !           722: @section Installing Taylor UUCP
        !           723: 
        !           724: You can install the executable files by becoming @code{root} and typing
        !           725: @samp{make install}.  Or you can look at what @samp{make install} does
        !           726: and do it by hand.  It tries to preserve your old programs, if any, but
        !           727: it only does this the first time Taylor UUCP is installed (so that if
        !           728: you install several versions of Taylor UUCP, you can still go back to
        !           729: your original UUCP programs).  You can retrieve the original programs by
        !           730: typing @samp{make uninstall}.
        !           731: 
        !           732: Simply installing the executable files is not enough, however.  You must
        !           733: also arrange for them to be used correctly.
        !           734: 
        !           735: @menu
        !           736: * Running uucico::              Running uucico
        !           737: * Using UUCP for mail and news::  Using UUCP for mail and news.
        !           738: * Trimming UUCP Log Files::     Trimming UUCP Log Files
        !           739: @end menu
        !           740: 
        !           741: @node Running uucico, Using UUCP for mail and news, Installation, Installation
        !           742: @subsection Running uucico
        !           743: 
        !           744: By default @code{uucp} and @code{uux} will automatically start up
        !           745: @code{uucico} to call another system whenever work is queued up.
        !           746: However, the call may fail, or there may be time restrictions which
        !           747: prevent the call at that time (perhaps because telephone rates are high)
        !           748: (@pxref{When to Call}).  Also, a remote system may have work queued up
        !           749: for your system, but may not be calling you for some reason (perhaps you
        !           750: have agreed that your system should always place the call).  To make
        !           751: sure that works get transferred between the systems withing a reasonable
        !           752: time period, you should arrange to periodically invoke @code{uucico}.
        !           753: 
        !           754: These periodic invocations are normally caused by entries in the
        !           755: @file{crontab} file.  The exact format of @file{crontab} files, and how
        !           756: new entries are added, varies from system to system; check your local
        !           757: documentation (try @samp{man cron}).
        !           758: 
        !           759: To attempt to call all systems with outstanding work, use the command
        !           760: @samp{uucico -r1}.  To attempt to call a particular system, use the
        !           761: command @samp{uucico -s SYSTEM}.
        !           762: 
        !           763: A common case is to want to try to call a system at a certain time, with
        !           764: periodic retries if the call fails.  A simple way to do this is to
        !           765: create an UUCP command file, known as a @dfn{poll file}.  If a poll
        !           766: file exists for a system, then @samp{uucico -r1} will place a call to
        !           767: it.  If the call succeeds, the poll file will be deleted.
        !           768: 
        !           769: The file can be easily created using the @samp{touch} command.  The name
        !           770: of a poll file currently depends on the type of spool directory you are
        !           771: using, as set in @file{policy.h}.  If you are using
        !           772: @code{SPOOLDIR_TAYLOR} (the default), put something like this in your
        !           773: @file{crontab} file:
        !           774: @example
        !           775: touch /usr/spool/uucp/@var{sys}/C./C.A0000
        !           776: @end example
        !           777: In this example @var{sys} is the system you wish to call, and
        !           778: @samp{/usr/spool/uucp} is your UUCP spool directory.
        !           779: If you are using @code{SPOOLDIR_HDB}, use
        !           780: @example
        !           781: touch /usr/spool/uucp/@var{sys}/C.@var{sys}A0000
        !           782: @end example
        !           783: 
        !           784: For example, I use the following crontab entries locally:
        !           785: 
        !           786: @example
        !           787: 45 * * * * /bin/echo /usr/lib/uucp/uucico -r1 | /bin/su uucpa
        !           788: 40 4,10,15 * * * touch /usr/spool/uucp/uunet/C./C.A0000
        !           789: @end example
        !           790: 
        !           791: Every hour, at 45 minutes past, this will check if there is any work to
        !           792: be done, and, if there is, will call the appropriate system.  Also, at
        !           793: 4:40am, 10:40am and 3:40pm this will create a poll file file for
        !           794: @samp{uunet}, forcing the next check to call @samp{uunet}.
        !           795: 
        !           796: @node Using UUCP for mail and news, Trimming UUCP Log Files, Running uucico, Installation
        !           797: @subsection Using UUCP for mail and news.
        !           798: 
        !           799: Taylor UUCP does not include a mail package.  All Unix systems come with
        !           800: some sort of mail delivery agent, typically @code{sendmail} or
        !           801: @code{MMDF}.  Source code is available for some mail delivery agents,
        !           802: such as @code{IDA sendmail} and @code{smail}.
        !           803: 
        !           804: Taylor UUCP also does not include a news package.  The two major Unix
        !           805: news packages are @code{C-news} and @code{INN}.  Both are available in
        !           806: source code form.
        !           807: 
        !           808: Configuring and using mail delivery agents is a notoriously complex
        !           809: topic, and I will not be discussing it here.  Configuring news systems
        !           810: is usually simpler, but I will not be discussing that either.  I will
        !           811: merely describe the interactions between the mail and news systems and
        !           812: UUCP.
        !           813: 
        !           814: A mail or news system interacts with UUCP in two ways.
        !           815: 
        !           816: @menu
        !           817: * Sending mail or news::        Sending mail or news via UUCP
        !           818: * Receiving mail or news::      Receiving mail or news via UUCP
        !           819: @end menu
        !           820: 
        !           821: @node Sending mail or news, Receiving mail or news, Using UUCP for mail and news, Using UUCP for mail and news
        !           822: @unnumberedsubsubsec Sending mail or news via UUCP
        !           823: 
        !           824: When mail is to be sent from your machine to another machine via UUCP,
        !           825: the mail delivery agent will invoke @code{uux}.  It will generally run a
        !           826: command such as @samp{uux - @var{system}!rmail}, where @var{system} is
        !           827: the remote system to which the mail is being sent.  It may pass other
        !           828: options to @code{uux}, such as @samp{-r} or @samp{-g}.
        !           829: 
        !           830: News also invokes @code{uux} in order to transfer articles to another
        !           831: system.  The only difference is that news will use @code{uux} to invoke
        !           832: @code{rnews} on the remote system, rather than @code{rmail}.
        !           833: 
        !           834: You should arrange for your mail and news systems to invoke the Taylor
        !           835: UUCP version of @code{uux} when sending mail via UUCP.  If you simply
        !           836: replace any existing version of @code{uux} with the Taylor UUCP version,
        !           837: this will probably happen automatically.  However, if both versions
        !           838: exist on your system, you will probably have to modify the mail and news
        !           839: configuration files in some way.
        !           840: 
        !           841: Actually, if both the system UUCP and Taylor UUCP are using the same
        !           842: spool directory format, the system @code{uux} will probably work fine
        !           843: with the Taylor @code{uucico} (the reverse is not the case: the Taylor
        !           844: @code{uux} requires the Taylor @code{uucico}).  However, data transfer
        !           845: will be somewhat more efficient if the Taylor @code{uux} is used.
        !           846: 
        !           847: @node Receiving mail or news,  , Sending mail or news, Using UUCP for mail and news
        !           848: @unnumberedsubsubsec Receiving mail or news via UUCP
        !           849: 
        !           850: As noted in @ref{Sending mail or news}, mail is sent by requesting a
        !           851: remote execution of @code{rmail}.  To receive mail, then, all that is
        !           852: necessary is for UUCP to invoke @code{rmail} itself.
        !           853: 
        !           854: Any mail delivery agent will provide an appropriate version of
        !           855: @code{rmail}; you must simply make sure that it is in the command path
        !           856: used by UUCP (it almost certainly already is).  The default command path
        !           857: is set in @file{policy.h}, and it may be overridden for a particular
        !           858: system by the @code{command-path} command (@pxref{Miscellaneous (sys)}).
        !           859: 
        !           860: Similarly, for news UUCP must be able to invoke @code{rnews}.  Any news
        !           861: system will provide a version of @code{rnews}, and you must ensure that
        !           862: is in a directory on the path that UUCP will search.
        !           863: 
        !           864: @node Trimming UUCP Log Files,  , Using UUCP for mail and news, Installation
        !           865: @subsection Trimming UUCP Log Files
        !           866: 
        !           867: You should also periodically trim the log files, as they will otherwise
        !           868: continue to grow without limit.  The names of the log files are set in
        !           869: @file{policy.h}, and may be overridden in the configuration file
        !           870: (@pxref{config File}).  By default they are are
        !           871: @file{/usr/spool/uucp/Log} and @file{/usr/spool/uucp/Stats}.
        !           872: 
        !           873: You may find the @code{savelog} program in the @file{contrib} directory
        !           874: may be of use.  There is a manual page for it in @file{contrib} as well.
        !           875: 
        !           876: @node TCP,  , Installation, Overall Installation
        !           877: @section TCP together with Taylor UUCP
        !           878: 
        !           879: If your system has a Berkeley style socket library, or a System V style
        !           880: TLI interface library, you can compile the code to permit making
        !           881: connections over TCP.  Specifying that a system should be reached via
        !           882: TCP is easy, but nonobvious.
        !           883: 
        !           884: If you are using the new style configuration files, see
        !           885: @ref{Configuration Files}.  Basically, you can just add the line
        !           886: @samp{port type tcp} to the entry in the system configuration file.  By
        !           887: default UUCP will get the port number by looking up @samp{uucp} in
        !           888: @file{/etc/services}; if @samp{uucp} is not found, port 540 will be
        !           889: used.  You can set the port number to use with the command @samp{port
        !           890: service @var{xxx}}, where @var{xxx} can be either a number or a name to
        !           891: look up in @file{/etc/services}.  You can specify the address of the
        !           892: remote host with @samp{address @var{a.b.c}}; if you don't give an
        !           893: address, the remote system name will be used.  You should give an
        !           894: explicit chat script for the system when you use TCP; the default chat
        !           895: script begins with a carriage return, which will not work with some UUCP
        !           896: TCP servers.
        !           897: 
        !           898: If you are using V2 configuration files, add a line like this to
        !           899: @file{L.sys}:
        !           900: 
        !           901: @example
        !           902: @var{sys} Any TCP uucp @var{host}.@var{domain} chat-script
        !           903: @end example
        !           904: 
        !           905: This will make an entry for system @var{sys}, to be called at any time,
        !           906: over TCP, using port number @samp{uucp} (as found in
        !           907: @file{/etc/services}; this may be specified as a number), using remote
        !           908: host @file{@var{host}.@var{domain}}, with some chat script.
        !           909: 
        !           910: If you are using HDB configuration files, add a line like this to
        !           911: Systems:
        !           912: 
        !           913: @example
        !           914: @var{sys} Any TCP - @var{host}.@var{domain} chat-script
        !           915: @end example
        !           916: 
        !           917: and a line like this to Devices:
        !           918: 
        !           919: @example
        !           920: TCP uucp - -
        !           921: @end example
        !           922: 
        !           923: You only need one line in Devices regardless of how many systems you
        !           924: contact over TCP.  This will make an entry for system @var{sys}, to be
        !           925: called at any time, over TCP, using port number @samp{uucp} (as found in
        !           926: @file{/etc/services}; this may be specified as a number), using remote
        !           927: host @file{@var{host}.@var{domain}}, with some chat script.
        !           928: 
        !           929: The @code{uucico} daemon can also be run as a TCP server.  To use the
        !           930: default port number, which is a reserved port, @code{uucico} must be
        !           931: invoked by root (or it must be set user ID to root, but I don't
        !           932: recommend doing that).
        !           933: 
        !           934: Basically, you must define a port, either using the port file
        !           935: (@pxref{port File}) if you are using the new configuration method or
        !           936: with an entry in Devices if you are using HDB; there is no way to define
        !           937: a port using V2.  If you are using HDB the port must be named
        !           938: @samp{TCP}; a line as shown above will suffice.  You can then start
        !           939: @code{uucico} as @samp{uucico -p TCP} (after the @samp{-p}, name the
        !           940: port; in HDB it must be @samp{TCP}).  This will wait for incoming
        !           941: connections, and fork off a child for each one.  Each connection will be
        !           942: prompted with @samp{login:} and @samp{Password:}; the results will be
        !           943: checked against the UUCP (not the system) password file
        !           944: (@pxref{Configuration File Names}).
        !           945: 
        !           946: Of course, you can get a similar effect by using the BSD @code{uucpd}
        !           947: program.
        !           948: 
        !           949: You can also have @code{inetd} start up @code{uucico} with the @samp{-l}
        !           950: switch, which will cause it to prompt with @samp{login:} and
        !           951: @samp{Password:} and check the results against the UUCP (not the system)
        !           952: password file.  This may be used in place of @code{uucpd}.
        !           953: 
        !           954: @node Configuration Files, Protocols, Overall Installation, Top
        !           955: @chapter Taylor UUCP Configuration Files
        !           956: 
        !           957: This chapter describes the configuration files accepted by the Taylor
        !           958: UUCP package if compiled with @code{HAVE_TAYLOR_CONFIG} defined in
        !           959: @file{policy.h}.
        !           960: 
        !           961: The configuration files are normally found in the directory
        !           962: @var{newconfigdir}, which is defined by the @file{Makefile} variable
        !           963: @file{newconfigdir}; by default @var{newconfigdir} is
        !           964: @file{/usr/local/conf/uucp}.  However, the main configuration file,
        !           965: @file{config}, is the only one which must be in that directory, since it
        !           966: may specify a different location for any or all of the other files.  You
        !           967: may run any of the UUCP programs with a different main configuration
        !           968: file by using the @samp{-I} option; this can be useful when testing a
        !           969: new configuration.  When you use the @samp{-I} option the programs will
        !           970: revoke any setuid privileges.
        !           971: 
        !           972: @menu
        !           973: * Configuration File Format::   Configuration file format
        !           974: * Configuration Examples::      Examples of configuration files
        !           975: * Time Strings::                How to write time strings
        !           976: * Chat Scripts::                How to write chat scripts
        !           977: * config File::                 The main configuration file
        !           978: * sys File::                    The system configuration file
        !           979: * port File::                   The port configuration files
        !           980: * dial File::                   The dialer configuration files
        !           981: * Security::                    Security issues
        !           982: @end menu
        !           983: 
        !           984: @node Configuration File Format, Configuration Examples, Configuration Files, Configuration Files
        !           985: @section Configuration File Format
        !           986: 
        !           987: All the configuration files follow a simple line-oriented
        !           988: @samp{@var{keyword} @var{value}} format.  Empty lines are ignored, as
        !           989: are leading spaces; unlike HDB, lines with leading spaces are read.  The
        !           990: first word on each line is a keyword.  The rest of the line is
        !           991: interpreted according to the keyword.  Most keywords are followed by
        !           992: numbers, boolean values or simple strings with no embedded spaces.
        !           993: 
        !           994: The @kbd{#} character is used for comments.  Everything from a @kbd{#}
        !           995: to the end of the line is ignored unless the @kbd{#} is preceded by a
        !           996: @kbd{\} (backslash); if the @kbd{#} is preceeded by a @kbd{\}, the
        !           997: @kbd{\} is removed but the @kbd{#} remains in the line.  This can be
        !           998: useful for a phone number containing a @kbd{#}.  To enter the sequence
        !           999: @samp{\#}, use @samp{\\#}.  
        !          1000: 
        !          1001: The backslash character may be used to continue lines.  If the last
        !          1002: character in a line is a backslash, the backslash is removed and the
        !          1003: line is continued by the next line.  The second line is attached to the
        !          1004: first with no intervening characters; if you want any whitespace between
        !          1005: the end of the first line and the start of the second line, you must
        !          1006: insert it yourself.
        !          1007: 
        !          1008: However, the backslash is not a general quoting character.  For example,
        !          1009: you cannot use it to get an embedded space in a string argument.
        !          1010: 
        !          1011: Everything after the keyword must be on the same line.  A @var{boolean}
        !          1012: may be specified as @kbd{y}, @kbd{Y}, @kbd{t}, or @kbd{T} for true and
        !          1013: @kbd{n}, @kbd{N}, @kbd{f}, or @kbd{F} for false; any trailing characters
        !          1014: are ignored, so @code{true}, @code{false}, etc., are also acceptable.
        !          1015: 
        !          1016: @node Configuration Examples, Time Strings, Configuration File Format, Configuration Files
        !          1017: @section Examples of Configuration Files
        !          1018: 
        !          1019: All the configuration commands are explained in the following sections.
        !          1020: However, I'll start by giving a few examples of configuration files.
        !          1021: For a more complete description of any of the commands used here see the
        !          1022: appropriate section of this chapter.  There are also sample
        !          1023: configuration files in the @file{sample} subdirectory of the
        !          1024: distribution.
        !          1025: 
        !          1026: @menu
        !          1027: * config File Examples::        Examples of the main configuration file
        !          1028: * Leaf Example::                Call a single remote site
        !          1029: * Gateway Example::             The gateway for several local systems
        !          1030: @end menu
        !          1031: 
        !          1032: @node config File Examples, Leaf Example, Configuration Examples, Configuration Examples
        !          1033: @subsection config File Examples
        !          1034: @cindex config file examples
        !          1035: 
        !          1036: To start with, here are some examples of uses of the main configuration
        !          1037: file, @file{config}.  For a complete description of the commands that
        !          1038: are permitted in @file{config}, see @ref{config File}.
        !          1039: 
        !          1040: In many cases you will not need to create a @file{config} file at all.
        !          1041: The most common reason to create one is to give your machine a special
        !          1042: UUCP name.  Other reasons might be to change the UUCP spool directory or
        !          1043: to permit any remote system to call in.
        !          1044: 
        !          1045: If you have an internal network of machines, then it is likely that the
        !          1046: internal name of your UUCP machine is not the name you want to use when
        !          1047: calling other systems.  For example, here at @file{airs.com} our
        !          1048: mail/news gateway machine is named @file{elmer.airs.com} (it is one of
        !          1049: several machines all named @file{@var{localname}.airs.com}).  If we did
        !          1050: not provide a @file{config} file, then our UUCP name would be
        !          1051: @file{elmer}; however, we actually want it to be @file{airs}.
        !          1052: Therefore, we use the following line in @file{config}:
        !          1053: 
        !          1054: @example
        !          1055: nodename airs
        !          1056: @end example
        !          1057: 
        !          1058: @cindex changing spool directory
        !          1059: @cindex spool directory (changing)
        !          1060: The UUCP spool directory name is set in @file{policy.h} when the code is
        !          1061: compiled.  You might at some point decide that it is appropriate to move
        !          1062: the spool directory, perhaps to put it on a different disk partition.
        !          1063: You would use the following commands in @file{config} to change to
        !          1064: directories on the partition @file{/uucp}:
        !          1065: 
        !          1066: @example
        !          1067: spool /uucp/spool
        !          1068: pubdir /uucp/uucppublic
        !          1069: logfile /uucp/spool/Log
        !          1070: debugfile /uucp/spool/Debug
        !          1071: @end example
        !          1072: 
        !          1073: You would then move the contents of the current spool directory to
        !          1074: @file{/uucp/spool}.  If you do this, make sure that no UUCP processes
        !          1075: are running while you change @file{config} and move the spool directory.
        !          1076: 
        !          1077: @cindex anonymous UUCP
        !          1078: Suppose you wanted to permit any system to call in to your system and
        !          1079: request files.  This is generally known as @dfn{anonymous UUCP}, since
        !          1080: the systems which call in are effectively anonymous.  By default,
        !          1081: unknown systems are not permitted to call in.  To permit this you must
        !          1082: use the @code{unknown} command in @file{config}.  The @code{unknown}
        !          1083: command is followed by any command that may appear in the system file;
        !          1084: for full details, see @ref{sys File}.
        !          1085: 
        !          1086: I will show two possible anonymous UUCP configurations.  The first will
        !          1087: let any system call in and download files, but will not permit them to
        !          1088: upload files to your system.
        !          1089: 
        !          1090: @example
        !          1091: # No files may be transferred to this system
        !          1092: unknown receive-request no
        !          1093: # The public directory is /usr/spool/anonymous
        !          1094: unknown pubdir /usr/spool/anonymous
        !          1095: # Only files in the public directory may be sent (the default anyhow)
        !          1096: unknown remote-send ~
        !          1097: @end example
        !          1098: 
        !          1099: @noindent
        !          1100: Setting the public directory is convenient for the systems which call
        !          1101: in.  It permits to request a file by prefixing it with @file{~/}.  For
        !          1102: example, assuming your system is known as @samp{server}, then to
        !          1103: retrieve the file @file{/usr/spool/anonymous/INDEX} a user on a remote
        !          1104: site could just enter @samp{uucp server!~/INDEX ~}; this would transfer
        !          1105: @file{INDEX} from @samp{server}'s public directory to the user's local
        !          1106: public directory.  Note that when using @samp{csh} or @samp{bash} the
        !          1107: @kbd{!} and the second @kbd{~} must be quoted.
        !          1108: 
        !          1109: The next example will permit remote systems to upload files to a special
        !          1110: directory named @file{/usr/spool/anonymous/upload}.  Permitting a remote
        !          1111: system to upload files permits it to send work requests as well; this
        !          1112: example is careful to prohibit commands from unknown systems.
        !          1113: 
        !          1114: @example
        !          1115: # No commands may be executed (the list of permitted commands is empty)
        !          1116: unknown commands
        !          1117: # The public directory is /usr/spool/anonymous
        !          1118: unknown pubdir /usr/spool/anonymous
        !          1119: # Only files in the public directory may be sent; users may not download
        !          1120: # files from the upload directory
        !          1121: unknown remote-send ~ !~/upload
        !          1122: # May only upload files into /usr/spool/anonymous/upload
        !          1123: unknown remote-receive ~/upload
        !          1124: @end example
        !          1125: 
        !          1126: @node Leaf Example, Gateway Example, config File Examples, Configuration Examples
        !          1127: @subsection Leaf Example
        !          1128: 
        !          1129: @cindex leaf site
        !          1130: @cindex sys file example (leaf)
        !          1131: A relatively common simple case is a @dfn{leaf site}, a system which
        !          1132: only calls or is called by a single remote site.  Here is a typical
        !          1133: @file{sys} file that might be used in such a case.  For full details on
        !          1134: what commands can appear in the @file{sys} file, see @ref{sys File}.
        !          1135: 
        !          1136: This is the @file{sys} file that is used at @file{airs.com}.  We use a
        !          1137: single modem to dial out to @file{uunet}.  This example shows how you
        !          1138: can specify the port and dialer information directly in the @file{sys}
        !          1139: file for simple cases.  It also shows the use of the following:
        !          1140: 
        !          1141: @table @code
        !          1142: 
        !          1143: @item call-login
        !          1144: Using @code{call-login} and @code{call-password} allows the default
        !          1145: login chat script to be used.  In this case, the login name is specified
        !          1146: in the call-out login file (@pxref{Configuration File Names}).
        !          1147: 
        !          1148: @item call-timegrade
        !          1149: @file{uunet} is requested to not send us news during the daytime.
        !          1150: 
        !          1151: @item chat-fail
        !          1152: If the modem returns @samp{BUSY} or @samp{NO CARRIER} the call is
        !          1153: immediately aborted.
        !          1154: 
        !          1155: @item protocol-parameter
        !          1156: Since @file{uunet} tends to be slow, the default timeout has been
        !          1157: increased.
        !          1158: 
        !          1159: @end table
        !          1160: 
        !          1161: This @file{sys} file relies on certain defaults.  It will allow
        !          1162: @file{uunet} to queue up @samp{rmail} and @samp{rnews} commands.  It
        !          1163: will allow users to request files from @file{uunet} into the UUCP public
        !          1164: directory.  It will also @file{uunet} to request files from the UUCP
        !          1165: public directory; in fact @file{uunet} never requests files, but for
        !          1166: additional security we could add the line @samp{request false}.
        !          1167: 
        !          1168: @example
        !          1169: # The following information is for uunet
        !          1170: system uunet
        !          1171: 
        !          1172: # The login name and password are kept in the callout password file
        !          1173: call-login *
        !          1174: call-password *
        !          1175: 
        !          1176: # We can send anything at any time.
        !          1177: time any
        !          1178: 
        !          1179: # During the day we only accept grade `Z' or above; at other times
        !          1180: # (not mentioned here) we accept all grades.  uunet queues up news
        !          1181: # at grade `d', which is lower than `Z'.
        !          1182: call-timegrade Z Wk0755-2305,Su1655-2305
        !          1183: 
        !          1184: # The phone number.
        !          1185: phone 7389449
        !          1186: 
        !          1187: # uunet tends to be slow, so we increase the timeout
        !          1188: chat-timeout 120
        !          1189: 
        !          1190: # We are using a preconfigured Telebit 2500.
        !          1191: port type modem
        !          1192: port device /dev/ttyd0
        !          1193: port baud 19200
        !          1194: port carrier true
        !          1195: port dialer chat "" ATZ\r\d\c OK ATDT\D CONNECT
        !          1196: port dialer chat-fail BUSY
        !          1197: port dialer chat-fail NO\sCARRIER
        !          1198: port dialer complete \d\d+++\d\dATH\r\c
        !          1199: port dialer abort \d\d+++\d\dATH\r\c
        !          1200: 
        !          1201: # Increase the timeout and the number of retries.
        !          1202: protocol-parameter g timeout 20
        !          1203: protocol-parameter g retries 10
        !          1204: @end example
        !          1205: 
        !          1206: @node Gateway Example,  , Leaf Example, Configuration Examples
        !          1207: @subsection Gateway Example
        !          1208: 
        !          1209: @cindex gateway
        !          1210: @cindex sys file example (gateway)
        !          1211: Many organizations have several local machines which are connected by
        !          1212: UUCP, and a single machine which connects to the outside world.  This
        !          1213: single machine is often referred to as a @dfn{gateway} machine.
        !          1214: 
        !          1215: For this example I will assume a fairly simple case.  It should still
        !          1216: provide a good general example.  There are three machines, @file{elmer},
        !          1217: @file{comton} and @file{bugs}.  @file{elmer} is the gateway machine for
        !          1218: which I will show the configuration file.  @file{elmer} calls out to
        !          1219: @file{uupsi}.  As an additional complication, @file{uupsi} knows
        !          1220: @file{elmer} as @file{airs}; this will show how a machine can have one
        !          1221: name on an internal network but a different name to the external world.
        !          1222: @file{elmer} has two modems.  It also has an TCP/IP connection to
        !          1223: @file{uupsi}, but since that is supposed to be reserved for interactive
        !          1224: work (it is, perhaps, only a 9600 baud SLIP line) it will only use it if
        !          1225: the modems are not available.
        !          1226: 
        !          1227: A network this small would normally use a single @file{sys} file.
        !          1228: However, for pedagogical purposes I will show two separate @file{sys}
        !          1229: files, one for the local systems and one for @file{uupsi}.  This is done
        !          1230: with the @code{sysfile} command in the @file{config} file.  Here is the
        !          1231: @file{config} file.
        !          1232: 
        !          1233: @example
        !          1234: # This is config
        !          1235: # The local sys file
        !          1236: sysfile /usr/local/lib/uucp/sys.local
        !          1237: # The remote sys file
        !          1238: sysfile /usr/local/lib/uucp/sys.remote
        !          1239: @end example
        !          1240: 
        !          1241: Using the defaults feature of the @file{sys} file can greatly simplify
        !          1242: the listing of local systems.  Here is @file{sys.local}.  Note that this
        !          1243: assumes that the local systems are trusted; they are permited to request
        !          1244: any world readable file and to write files into any world writable
        !          1245: directory.
        !          1246: 
        !          1247: @example
        !          1248: # This is sys.local
        !          1249: # Get the login name and password to use from the call-out file
        !          1250: call-login *
        !          1251: call-password *
        !          1252: 
        !          1253: # The systems must use a particular login
        !          1254: called-login Ulocal
        !          1255: 
        !          1256: # Permit sending any world readable file
        !          1257: local-send /
        !          1258: remote-send /
        !          1259: 
        !          1260: # Permit requesting into any world writable directory
        !          1261: local-receive /
        !          1262: remote-receive /
        !          1263: 
        !          1264: # Call at any time
        !          1265: time any
        !          1266: 
        !          1267: # Use port1, then port2
        !          1268: port port1
        !          1269: 
        !          1270: alternate
        !          1271: 
        !          1272: port port2
        !          1273: 
        !          1274: # Now define the systems themselves.  Because of all the defaults we
        !          1275: # used, there is very little to specify for the systems themselves.
        !          1276: 
        !          1277: system comton
        !          1278: phone 5551212
        !          1279: 
        !          1280: system bugs
        !          1281: phone 5552424
        !          1282: @end example
        !          1283: 
        !          1284: The @file{sys.remote} file describes the @file{uupsi} connection.  The
        !          1285: @code{myname} command is used to change the UUCP name to @file{airs}
        !          1286: when talking to @file{uupsi}.
        !          1287: 
        !          1288: @example
        !          1289: # This is sys.remote
        !          1290: # Define uupsi
        !          1291: system uupsi
        !          1292: 
        !          1293: # The login name and password are in the call-out file
        !          1294: call-login *
        !          1295: call-password *
        !          1296: 
        !          1297: # We can call out at any time
        !          1298: time any
        !          1299: 
        !          1300: # uupsi uses a special login name
        !          1301: called-login Uuupsi
        !          1302: 
        !          1303: # uuspi thinks of us as `airs'
        !          1304: myname airs
        !          1305: 
        !          1306: # The phone number
        !          1307: phone 5554848
        !          1308: 
        !          1309: # We use port2 first, then port1, then TCP
        !          1310: 
        !          1311: port port2
        !          1312: 
        !          1313: alternate
        !          1314: 
        !          1315: port port1
        !          1316: 
        !          1317: alternate
        !          1318: 
        !          1319: # We don't bother to make a special entry in the port file for TCP, we
        !          1320: # just describe the entire port right here.  We use a special chat
        !          1321: # script over TCP because the usual one confuses some TCP servers.
        !          1322: port type TCP
        !          1323: address uu.psi.com
        !          1324: chat ogin: \L word: \P
        !          1325: @end example
        !          1326: 
        !          1327: The ports are defined in the file @file{port} (@pxref{port File}).  For
        !          1328: this example they are both connected to the same type of 2400 baud
        !          1329: Hayes-compatible modem.
        !          1330: 
        !          1331: @example
        !          1332: # This is port
        !          1333: 
        !          1334: port port1
        !          1335: type modem
        !          1336: device /dev/ttyd0
        !          1337: dialer hayes
        !          1338: speed 2400
        !          1339: 
        !          1340: port port2
        !          1341: type modem
        !          1342: device /dev/ttyd1
        !          1343: dialer hayes
        !          1344: speed 2400
        !          1345: @end example
        !          1346: 
        !          1347: Dialers are described in the @file{dial} file (@pxref{dial File}).
        !          1348: 
        !          1349: @example
        !          1350: # This is dial
        !          1351: 
        !          1352: dialer hayes
        !          1353: 
        !          1354: # The chat script used to dial the phone.  \D is the phone number.
        !          1355: chat "" ATZ\r\d\c OK ATDT\D CONNECT
        !          1356: 
        !          1357: # If we get BUSY or NO CARRIER we abort the dial immediately
        !          1358: chat-fail BUSY
        !          1359: chat-fail NO\sCARRIER
        !          1360: 
        !          1361: # When the call is over we make sure we hangup the modem.
        !          1362: complete \d\d+++\d\dATH\r\c
        !          1363: abort \d\d+++\d\dATH\r\c
        !          1364: @end example
        !          1365: 
        !          1366: @node Time Strings, Chat Scripts, Configuration Examples, Configuration Files
        !          1367: @section Time Strings
        !          1368: @cindex time strings
        !          1369: 
        !          1370: Several commands use time strings to specify a range of times.  This
        !          1371: section describes how to write time strings.
        !          1372: 
        !          1373: A time string may be a list of simple time strings separated with a
        !          1374: vertical bar @kbd{|} or a comma @kbd{,}.
        !          1375: 
        !          1376: Each simple time string must begin with @samp{Su}, @samp{Mo}, @samp{Tu},
        !          1377: @samp{We}, @samp{Th}, @samp{Fr}, or @samp{Sa}, or @samp{Wk} for any
        !          1378: weekday, or @samp{Any} for any day.
        !          1379: 
        !          1380: Following the day may be a range of hours separated with a hyphen using
        !          1381: 24 hour time.  The range of hours may cross 0; for example
        !          1382: @samp{2300-0700} means any time except 7 AM to 11 PM.  If no time is
        !          1383: given, calls may be made at any time on the specified day(s).  
        !          1384: 
        !          1385: The time string may also consist of the single word @samp{Never}, which
        !          1386: does not match any time, or a single word with a name defined in a
        !          1387: previous @code{timetable} command (@pxref{Miscellaneous (config)}).
        !          1388: 
        !          1389: Here are a few sample time strings with an explanation of what they
        !          1390: mean.
        !          1391: 
        !          1392: @table @samp
        !          1393: 
        !          1394: @item Wk2305-0855,Sa,Su2305-1655
        !          1395: 
        !          1396: This means weekdays before 8:55 AM or after 11:05 PM, any time Saturday,
        !          1397: or Sunday before 4:55 PM or after 11:05 PM.  These are approximately the
        !          1398: times during which night rates apply to phone calls in the U.S.A.  Note
        !          1399: that this time string uses, for example, @samp{2305} rather than
        !          1400: @samp{2300}; this will ensure a cheap rate phone call even if the
        !          1401: computer clock is running up to five minutes ahead of the real time.
        !          1402: 
        !          1403: @item Wk0905-2255,Su1705-2255
        !          1404: 
        !          1405: This means weekdays from 9:05 AM to 10:55 PM, or Sunday from 5:05 PM to
        !          1406: 10:55 PM.  This is approximately the opposite of the previous example.
        !          1407: 
        !          1408: @item Any
        !          1409: 
        !          1410: This means any day.  Since no time is specified, it means any time on
        !          1411: any day.
        !          1412: 
        !          1413: @end table
        !          1414: 
        !          1415: @node Chat Scripts, config File, Time Strings, Configuration Files
        !          1416: @section Chat Scripts
        !          1417: @cindex chat scripts
        !          1418: 
        !          1419: Chat scripts are used in several different places, such as dialing out
        !          1420: on modems or logging in to remote systems.  Chat scripts are made up of
        !          1421: pairs of strings.  The program waits until it sees the first string,
        !          1422: known as the @dfn{expect} string, and then sends out the second string,
        !          1423: the @dfn{send} string.
        !          1424: 
        !          1425: Each chat script is defined using a set of commands.  These commands
        !          1426: always end in a string beginning with @code{chat}, but may start with
        !          1427: different strings.  For example, in the @file{sys} file there is one set
        !          1428: of commands beginning with @code{chat} and another set beginning with
        !          1429: @code{called-chat}.  The prefixes are only used to disambiguate
        !          1430: different types of chat scripts, and this section ignores the prefixes
        !          1431: when describing the commands.
        !          1432: 
        !          1433: @table @code
        !          1434: 
        !          1435: @item chat @var{strings}
        !          1436: @findex chat
        !          1437: 
        !          1438: Specify a chat script.  The arguments to the @code{chat} command are
        !          1439: pairs of strings separated by whitespace.  The first string of each pair
        !          1440: is an expect string, the second is a send string.  The program will wait
        !          1441: for the expect string to appear; when it does, the program will send the
        !          1442: send string.  If the expect string does not appear within a certain
        !          1443: number of seconds (as set by the @code{chat-timeout} command) the chat
        !          1444: script fails and, typically, the call is aborted.  If the final expect
        !          1445: string is seen (and the optional final send string has been sent), the
        !          1446: chat script is successful.
        !          1447: 
        !          1448: An expect string may contain additional subsend and subexpect strings,
        !          1449: separated by hyphens.  If the expect string is not seen, the subsend
        !          1450: string is sent and the chat script continues by waiting for the
        !          1451: subexpect string.  This means that a hyphen may not appear in an expect
        !          1452: string; on an ASCII system, use @samp{\055} instead.
        !          1453: 
        !          1454: An expect string may simply be @samp{""}, meaning to skip the expect
        !          1455: phase.  Otherwise, the following escape characters may appear in expect
        !          1456: strings:
        !          1457: 
        !          1458: @table @samp
        !          1459: @item \b
        !          1460: a backspace character
        !          1461: @item \n
        !          1462: a newline or line feed character
        !          1463: @item \N
        !          1464: a null character (for HDB compatibility)
        !          1465: @item \r
        !          1466: a carriage return character
        !          1467: @item \s
        !          1468: a space character
        !          1469: @item \t
        !          1470: a tab character
        !          1471: @item \\
        !          1472: a backslash character
        !          1473: @item \@var{ddd}
        !          1474: character @var{ddd}, where @var{ddd} are up to three octal digits
        !          1475: @item \x@var{ddd}
        !          1476: character @var{ddd}, where @var{ddd} are hexadecimal digits.
        !          1477: @end table
        !          1478: 
        !          1479: As in C, there may be up to three octal digits following a backslash,
        !          1480: but the hexadecimal escape sequence continues as far as possible.  To
        !          1481: follow a hexadecimal escape sequence with a hex digit, interpose a send
        !          1482: string of @samp{""}.
        !          1483: 
        !          1484: A send string may simply be @samp{""} to skip the send phase.
        !          1485: Otherwise, all of the escape characters legal for expect strings may be
        !          1486: used, and the following escape characters are also permitted:
        !          1487: 
        !          1488: @table @samp
        !          1489: @item EOT
        !          1490: send an end of transmission character (@kbd{^D})
        !          1491: @item BREAK
        !          1492: send a break character (may not work on all systems)
        !          1493: @item \c
        !          1494: suppress trailing carriage return at end of send string
        !          1495: @item \d
        !          1496: delay sending for 1 or 2 seconds
        !          1497: @item \e
        !          1498: disable echo checking
        !          1499: @item \E
        !          1500: enable echo checking
        !          1501: @item \K
        !          1502: same as @samp{BREAK} (for HDB compatibility)
        !          1503: @item \p
        !          1504: pause sending for a fraction of a second
        !          1505: @end table
        !          1506: 
        !          1507: Some specific types of chat scripts also define additional escape
        !          1508: sequences that may appear in the send string.  For example, the login
        !          1509: chat script defines @samp{\L} and @samp{\P} to send the login name and
        !          1510: password, respectively.
        !          1511: 
        !          1512: A carriage return will be sent at the end of each send string, unless
        !          1513: the @kbd{\c} escape sequence appears in the string.  Note that some UUCP
        !          1514: packages use @kbd{\b} for break, but here it means backspace.
        !          1515: 
        !          1516: Echo checking means that after writing each character the program will
        !          1517: wait until the character is echoed.  Echo checking must be turned on
        !          1518: separately for each send string for which it is desired; it will be
        !          1519: turned on for characters following @kbd{\E} and turned off for characters
        !          1520: following @kbd{\e}.
        !          1521: 
        !          1522: @item chat-timeout @var{number}
        !          1523: @findex chat-timeout
        !          1524: 
        !          1525: The number of seconds to wait for an expect string in the chat script
        !          1526: before timing out and sending the next subsend or failing the chat
        !          1527: script entirely.  The default value is 10 for a login chat or 60 for
        !          1528: any other type of chat.
        !          1529: 
        !          1530: @item chat-fail @var{string}
        !          1531: @findex chat-fail
        !          1532: 
        !          1533: If the @var{string} is seen at any time during a chat script, the chat
        !          1534: script is aborted.  The string may not contain any whitespace
        !          1535: characters; escape sequences must be used for them.  Multiple
        !          1536: @code{chat-fail} commands may appear in a single chat script.  The
        !          1537: default is to have none.
        !          1538: 
        !          1539: This permits a chat script to be quickly aborted if an error string is
        !          1540: seen.  For example, a script used to dial out on a modem might use the
        !          1541: command @samp{chat-fail BUSY} to stop the chat script immediately if the
        !          1542: string @samp{BUSY} was seen.
        !          1543: 
        !          1544: @item chat-seven-bit @var{boolean}
        !          1545: @findex chat-seven-bit
        !          1546: 
        !          1547: If the argument is true, all incoming characters are stripped to seven
        !          1548: bits when being compared to the expect string.  Otherwise all eight bits
        !          1549: are used in the comparison.  The default is true, because some Unix
        !          1550: systems generate parity bits during the login prompt which must be
        !          1551: ignored while running a chat script.  This has no effect on any
        !          1552: @code{chat-program}, which must ignore parity by itself if necessary.
        !          1553: 
        !          1554: @item chat-program @var{strings}
        !          1555: @findex chat-program
        !          1556: 
        !          1557: Specify a program to run before executing the chat script.  This program
        !          1558: could run its own version of a chat script, or it could do whatever it
        !          1559: wants.  If both @code{chat-program} and @code{chat} are specified, the
        !          1560: program is executed first followed by the chat script.
        !          1561: 
        !          1562: The first argument to the @code{chat-program} command is the program
        !          1563: name to run.  The remaining arguments are passed to the program.  The
        !          1564: following escape sequences are recognized in the arguments:
        !          1565: 
        !          1566: @table @kbd
        !          1567: @item \Y
        !          1568: port device name
        !          1569: @item \S
        !          1570: port speed
        !          1571: @item \\
        !          1572: backslash
        !          1573: @end table
        !          1574: 
        !          1575: Some specific uses of @code{chat-program} define additional escape
        !          1576: sequences.
        !          1577: 
        !          1578: Arguments other than escape sequences are passed exactly as they appear
        !          1579: in the configuration file, except that sequences of whitespace are
        !          1580: compressed to a single space character (this exception may be removed in
        !          1581: the future).
        !          1582: 
        !          1583: If the @code{chat-program} command is not used, no program is run.
        !          1584: 
        !          1585: On Unix, the standard input and standard output of the program will be
        !          1586: attached to the port in use.  Anything the program writes to standard
        !          1587: error will be written to the UUCP log file.  No other file descriptors
        !          1588: will be open.  If the program does not exit with a status of 0, it will
        !          1589: be assumed to have failed; this means that the dialing programs used by
        !          1590: some versions of HDB may not be used directly, although of course a
        !          1591: shell script could be used as an interface.
        !          1592: 
        !          1593: The program will be run as the @code{uucp} user, and the environment
        !          1594: will be that of the process that started @code{uucico}, so care must be
        !          1595: taken to maintain security.
        !          1596: 
        !          1597: No search path is used to find the program; a full path name must be
        !          1598: given.  If the program is an executable shell script, it will be passed
        !          1599: to @file{/bin/sh} even on systems which are unable to execute shell
        !          1600: scripts.  It is also easy to invoke @file{/bin/sh} directly.
        !          1601: 
        !          1602: @end table
        !          1603: 
        !          1604: Here is a simple example of a chat script that might be used to reset a
        !          1605: Hayes compatible modem.
        !          1606: 
        !          1607: @example
        !          1608: chat "" ATZ OK-ATZ-OK
        !          1609: @end example
        !          1610: 
        !          1611: The first expect string is @samp{""}, so it is ignored.  The chat script
        !          1612: then sends @samp{ATZ}.  If the modem responds with @samp{OK}, the chat
        !          1613: script finishes.  If 60 seconds (the default timeout) pass before seeing
        !          1614: @samp{OK}, the chat script sends another @samp{ATZ}.  If it then sees
        !          1615: @samp{OK}, the chat script succeeds.  Otherwise, the chat script fails.
        !          1616: 
        !          1617: For a more complex chat script example, see @ref{Logging In}.
        !          1618: 
        !          1619: @node config File, sys File, Chat Scripts, Configuration Files
        !          1620: @section The Main Configuration File
        !          1621: @cindex config file
        !          1622: @cindex main configuration file
        !          1623: @cindex configuration file (config)
        !          1624: 
        !          1625: The main configuration file is named @file{config}.
        !          1626: 
        !          1627: Since all the values that may be specified in the main configuration
        !          1628: file also have defaults, there need not be a main configuration file at
        !          1629: all.
        !          1630: 
        !          1631: @menu
        !          1632: * Miscellaneous (config)::      Miscellaneous config file commands
        !          1633: * Configuration File Names::    Using different configuration files
        !          1634: * Log File Names::              Using different log files
        !          1635: * Debugging Levels::            Debugging levels
        !          1636: @end menu
        !          1637: 
        !          1638: @node Miscellaneous (config), Configuration File Names, config File, config File
        !          1639: @subsection Miscellaneous config File Commands
        !          1640: 
        !          1641: @table @code
        !          1642: 
        !          1643: @item nodename @var{string}
        !          1644: @findex nodename
        !          1645: @itemx hostname @var{string}
        !          1646: @findex hostname
        !          1647: @itemx uuname @var{string}
        !          1648: @findex uuname
        !          1649: @cindex UUCP system name
        !          1650: @cindex system name
        !          1651: 
        !          1652: These keywords are equivalent.  They specify the UUCP name of the local
        !          1653: host.  If there is no configuration file, an appropriate system function
        !          1654: will be used to get the host name, if possible.
        !          1655: 
        !          1656: @item spool @var{string}
        !          1657: @findex spool
        !          1658: @cindex spool directory
        !          1659: @cindex /usr/spool/uucp
        !          1660: 
        !          1661: Specify the spool directory.  The default is from @file{policy.h}.  This
        !          1662: is where UUCP files are queued.  Status files and various sorts of
        !          1663: temporary files are also stored in this directory and subdirectories of
        !          1664: it.
        !          1665: 
        !          1666: @item pubdir @var{string}
        !          1667: @findex pubdir in config file
        !          1668: @cindex public directory
        !          1669: @cindex uucppublic
        !          1670: @cindex /usr/spool/uucppublic
        !          1671: 
        !          1672: Specify the public directory.  The default is from @file{policy.h}.
        !          1673: When a file is named using a leading @kbd{~/}, it is taken from or to
        !          1674: the public directory.  Each system may use a separate public directory
        !          1675: by using the @code{pubdir} command in the system configuration file; see
        !          1676: @ref{Miscellaneous (sys)}.
        !          1677: 
        !          1678: @item lockdir @var{string}
        !          1679: @findex lockdir
        !          1680: @cindex lock directory
        !          1681: 
        !          1682: Specify the directory to place lock files in.  The default is from
        !          1683: @file{policy.h}; see the information in that file.  Normally the lock
        !          1684: directory should be set correctly in @file{policy.h}, and not changed
        !          1685: here.  However, changing the lock directory is sometimes useful for
        !          1686: testing purposes.
        !          1687: 
        !          1688: @item unknown @var{string} @dots{}
        !          1689: @findex unknown
        !          1690: @cindex unknown systems
        !          1691: 
        !          1692: The @var{string} and subsequent arguments are treated as though they
        !          1693: appeared in the system file (@pxref{sys File}).  They are used to apply
        !          1694: to any unknown systems that may call in, probably to set file transfer
        !          1695: permissions and the like.  If the @code{unknown} command is not used,
        !          1696: unknown systems are not permitted to call in.
        !          1697: 
        !          1698: @item max-uuxqts @var{number}
        !          1699: @findex max-uuxqts
        !          1700: 
        !          1701: Specify the maximum number of @code{uuxqt} processes which may run at
        !          1702: the same time.  Having several @code{uuxqt} processes running at once
        !          1703: can significantly slow down a system, but since @code{uuxqt} is
        !          1704: automatically started by @code{uucico}, it can happen quite easily.  The
        !          1705: default for @code{max-uuxqts} is 0, which means that there is no limit.
        !          1706: If HDB configuration files are being read and the code was compiled
        !          1707: without @code{HAVE_TAYLOR_CONFIG}, then if the file @file{Maxuuxqts} in
        !          1708: the configuration directory contains a readable number it will be used as
        !          1709: the value for @code{max-uuxqts}.
        !          1710: 
        !          1711: @item timetable @var{string} @var{string}
        !          1712: @findex timetable
        !          1713: 
        !          1714: The @code{timetable} defines a timetable that may be used in
        !          1715: subsequently appearing time strings; @ref{Time Strings}.  The first
        !          1716: string names the timetable entry; the second is a time string.
        !          1717: 
        !          1718: The following @code{timetable} commands are predefined.  The NonPeak
        !          1719: timetable is included for compatibility.  It originally described the
        !          1720: offpeak hours of Tymnet and Telenet, but both have since changed their
        !          1721: schedules.
        !          1722: 
        !          1723: @example
        !          1724: timetable Evening Wk1705-0755,Sa,Su
        !          1725: timetable Night Wk2305-0755,Sa,Su2305-1655
        !          1726: timetable NonPeak Wk1805-0655,Sa,Su
        !          1727: @end example
        !          1728: 
        !          1729: If this command does not appear, then obviously no additional timetables
        !          1730: will be defined.
        !          1731: 
        !          1732: @item v2-files @var{boolean}
        !          1733: @findex v2-files
        !          1734: 
        !          1735: If the code was compiled to be able to read V2 configuration files, a
        !          1736: false argument to this command will prevent them from being read.
        !          1737: This can be useful while testing.  The default is true.
        !          1738: 
        !          1739: @item hdb-files @var{boolean}
        !          1740: @findex hdb-files
        !          1741: 
        !          1742: If the code was compiled to be able to read HDB configuration files, a
        !          1743: false argument to this command will prevent them from being read.
        !          1744: This can be useful while testing.  The default is true.
        !          1745: 
        !          1746: @end table
        !          1747: 
        !          1748: @node Configuration File Names, Log File Names, Miscellaneous (config), config File
        !          1749: @subsection Configuration File Names
        !          1750: 
        !          1751: @table @code
        !          1752: 
        !          1753: @item sysfile @var{strings}
        !          1754: @findex sysfile
        !          1755: 
        !          1756: Specify the system file(s).  The default is the file @file{sys} in the
        !          1757: directory @var{newconfigdir}.  These files hold information about other
        !          1758: systems with which this system communicates; see @ref{sys File}.
        !          1759: Multiple system files may be given on the line, and the @code{sysfile}
        !          1760: command may be repeated; each system file has its own set of defaults.
        !          1761: 
        !          1762: @item portfile @var{strings}
        !          1763: @findex portfile
        !          1764: 
        !          1765: Specify the port file(s).  The default is the file @file{port} in the
        !          1766: directory @var{newconfigdir}.  These files describe ports which are used
        !          1767: to call other systems and accept calls from other systems; see @ref{port
        !          1768: File}.  No port files need be named at all.  Multiple port files may be
        !          1769: given on the line, and the @code{portfile} command may be repeated.
        !          1770: 
        !          1771: @item dialfile @var{strings}
        !          1772: @findex dialfile
        !          1773: 
        !          1774: Specify the dial file(s).  The default is the file @file{dial} in the
        !          1775: directory @var{newconfigdir}.  These files describe dialing devices
        !          1776: (modems); @xref{dial File}.  No dial files need be named at all.
        !          1777: Multiple dial files may be given on the line, and the @code{dialfile}
        !          1778: command may be repeated.
        !          1779: 
        !          1780: @item dialcodefile @var{strings}
        !          1781: @findex dialcodefile
        !          1782: @cindex configuration file (dialcode)
        !          1783: @cindex dialcode file
        !          1784: @cindex dialcode configuration file
        !          1785: 
        !          1786: Specify the dialcode file(s).  The default is the file @file{dialcode}
        !          1787: in the directory @var{newconfigdir}.  These files specify dialcodes that
        !          1788: may be used when sending phone numbers to a modem.  This permits using
        !          1789: the same set of phone numbers in different area-codes or with different
        !          1790: phone systems, by using dialcodes to specify the calling sequence.  When
        !          1791: a phone number goes through dialcode translation, the leading alphabetic
        !          1792: characters are stripped off.  The dialcode files are read line by line,
        !          1793: just like any other configuration file, and when a line is found whose
        !          1794: first word is the same as the leading characters from the phone number,
        !          1795: the second word on the line (which would normally consist of numbers)
        !          1796: replaces the dialcode in the phone number.  No dialcode file need be
        !          1797: used.  Multiple dialcode files may be specified on the line, and the
        !          1798: @code{dialcodefile} command may be repeated; all the dialcode files will
        !          1799: be read in turn until a dialcode is located.
        !          1800: 
        !          1801: @item callfile @var{strings}
        !          1802: @findex callfile
        !          1803: @cindex call out file
        !          1804: @cindex call configuration file
        !          1805: @cindex call out login name
        !          1806: @cindex call out password
        !          1807: @cindex configuration file (call)
        !          1808: 
        !          1809: Specify the call out login name and password file(s).  The default is
        !          1810: the file @file{call} in the directory @var{newconfigdir}.  If the call
        !          1811: out login name or password for a system are given as @kbd{*}
        !          1812: (@pxref{Logging In}), these files are read to get the real login name or
        !          1813: password.  Each line in the file(s) has three words: the system name,
        !          1814: the login name, and the password.  This file is only used when placing
        !          1815: calls to remote systems; the password file described under
        !          1816: @code{passwdfile} below is used for incoming calls.  The intention of
        !          1817: the call out file is to permit the system file to be publically
        !          1818: readable; the call out files must obviously be kept secure.  These files
        !          1819: need not be used.  Multiple call out files may be specified on the line,
        !          1820: and the @code{callfile} command may be repeated; all the files will be
        !          1821: read in turn until the system is found.
        !          1822: 
        !          1823: @item passwdfile @var{strings}
        !          1824: @findex passwdfile
        !          1825: @cindex passwd file
        !          1826: @cindex passwd configuration file
        !          1827: @cindex configuration file (passwd)
        !          1828: @cindex call in login name
        !          1829: @cindex call in password
        !          1830: 
        !          1831: Specify the password file(s) to use for login names when @code{uucico}
        !          1832: is doing its own login prompting, which it does when given the
        !          1833: @samp{-e}, @samp{-l} or @samp{-w} switches.  The default is the file
        !          1834: @file{passwd} in the directory @var{newconfigdir}.  Each line in the
        !          1835: file(s) has two words: the login name and the password (e.g. @code{Ufoo
        !          1836: foopas}).  The login name is accepted before the system name is known,
        !          1837: so these are independent of which system is calling in; a particular
        !          1838: login may be required for a system by using the @code{called-login}
        !          1839: command in the system file (@pxref{Accepting a Call}).  These password
        !          1840: files are optional, although one must exist if @code{uucico} is to
        !          1841: present its own login prompts.  Multiple password files may be specified
        !          1842: on the line, and the @code{passwdfile} command may be repeated; all the
        !          1843: files will be read in turn until the login name is found.
        !          1844: 
        !          1845: @end table
        !          1846: 
        !          1847: @node Log File Names, Debugging Levels, Configuration File Names, config File
        !          1848: @subsection Log File Names
        !          1849: 
        !          1850: @table @code
        !          1851: 
        !          1852: @item logfile @var{string}
        !          1853: @findex logfile
        !          1854: @cindex log file
        !          1855: 
        !          1856: Name the log file.  The default is from @file{policy.h}.  Logging
        !          1857: information is written to this file.  If @code{HAVE_HDB_LOGGING} is
        !          1858: defined in @file{conf.h}, then by default a separate log file is used
        !          1859: for each system.  Using this command to name a log file will cause all
        !          1860: the systems to use it.
        !          1861: 
        !          1862: @item statfile @var{string}
        !          1863: @findex statfile
        !          1864: @cindex statistics file
        !          1865: 
        !          1866: Name the statistics file.  The default is from @file{policy.h}.
        !          1867: Statistical information about file transfers is written to this file.
        !          1868: 
        !          1869: @item debugfile @var{string}
        !          1870: @findex debugfile
        !          1871: @cindex debugging file
        !          1872: 
        !          1873: Name the file to which debugging information is written.  The default is
        !          1874: from @file{policy.h}.  This command is only effective if the code has
        !          1875: been compiled to include debugging (this is controlled by the
        !          1876: @code{DEBUG} variable in @file{policy.h}).  After the first debugging
        !          1877: message has been written, messages written to the log file are also
        !          1878: written to the debugging file to make it easier to keep the order of
        !          1879: actions straight.  The debugging file is different from the log file
        !          1880: because information such as passwords can appear in it, so it must be
        !          1881: not be publically readable.
        !          1882: 
        !          1883: @end table
        !          1884: 
        !          1885: @node Debugging Levels,  , Log File Names, config File
        !          1886: @subsection Debugging Levels
        !          1887: 
        !          1888: @table @code
        !          1889: 
        !          1890: @item debug @var{string} @dots{}
        !          1891: @findex debug in config file
        !          1892: 
        !          1893: Set the debugging level.  This command is only effective if the code has
        !          1894: been compiled to include debugging.  The default is to have no
        !          1895: debugging.  The arguments are strings which name the types of debugging
        !          1896: to be turned on.  The following types of debugging are defined:
        !          1897: 
        !          1898: @table @samp
        !          1899: @item abnormal
        !          1900: Output debugging messages for abnormal situations, such as recoverable errors.
        !          1901: @item chat
        !          1902: Output debugging messages for chat scripts.
        !          1903: @item handshake
        !          1904: Output debugging messages for the initial handshake.
        !          1905: @item uucp-proto
        !          1906: Output debugging messages for the UUCP session protocol.
        !          1907: @item proto
        !          1908: Output debugging messages for the individual link protocols.
        !          1909: @item port
        !          1910: Output debugging messages for actions on the communication port.
        !          1911: @item config
        !          1912: Output debugging messages while reading the configuration files.
        !          1913: @item spooldir
        !          1914: Output debugging messages for actions in the spool directory.
        !          1915: @item execute
        !          1916: Output debugging messages whenever another program is executed.
        !          1917: @item incoming
        !          1918: List all incoming data in the debugging file.
        !          1919: @item outgoing
        !          1920: List all outgoing data in the debugging file.
        !          1921: @item all
        !          1922: All of the above.
        !          1923: @end table
        !          1924: 
        !          1925: The debugging level may also be specified as a number.  A 1 will set
        !          1926: @samp{chat} debugging, a 2 will set both @samp{chat} and
        !          1927: @samp{handshake} debugging, and so on down the possibilities.  Currently
        !          1928: an 11 will turn on all possible debugging, since there are 11 types of
        !          1929: debugging messages listed above; more debugging types may be added in
        !          1930: the future.  The @code{debug} command may be used several times in the
        !          1931: configuration file; every debugging type named will be turned on.  When
        !          1932: running any of the programs, the @samp{-x} switch (actually, for
        !          1933: @code{uulog} it's the @samp{-X} switch) may be used to turn on
        !          1934: debugging.  The argument to the @samp{-x} switch is one of the strings
        !          1935: listed above, or a number as described above, or a comma separated list
        !          1936: of strings (e.g.  @samp{-x chat,handshake}).  The @samp{-x} switch may
        !          1937: also appear several times on the command line, in which case all named
        !          1938: debugging types will be turned on.  The @samp{-x} debugging is in
        !          1939: addition to any debugging specified by the @code{debug} command; there
        !          1940: is no way to cancel debugging information.  The debugging level may also
        !          1941: be set specifically for calls to or from a specific system with the
        !          1942: @code{debug} command in the system file (@pxref{Miscellaneous (sys)}).
        !          1943: 
        !          1944: The debugging messages are somewhat idiosyncratic; it may be necessary
        !          1945: to refer to the source code for additional information in some cases.
        !          1946: 
        !          1947: @end table
        !          1948: 
        !          1949: @node sys File, port File, config File, Configuration Files
        !          1950: @section The System Configuration File
        !          1951: @cindex sys file
        !          1952: @cindex system configuration file
        !          1953: @cindex configuration file (sys) 
        !          1954: 
        !          1955: By default there is a single system configuration, named @file{sys} in
        !          1956: the directory @var{newconfigdir}.  This may be overridden by the
        !          1957: @code{sysfile} command in the main configuration file; see
        !          1958: @ref{Configuration File Names}.
        !          1959: 
        !          1960: These files describe all remote systems known to the UUCP package.
        !          1961: 
        !          1962: @menu
        !          1963: * Defaults and Alternates::     Using defaults and alternates
        !          1964: * Naming the System::           Naming the system
        !          1965: * Calling Out::                 Calling out
        !          1966: * Accepting a Call::            Accepting a call
        !          1967: * Protocol Selection::          Protocol selection
        !          1968: * File Transfer Control::       File transfer control
        !          1969: * Miscellaneous (sys)::         Miscellaneous sys file commands
        !          1970: * Default sys File Values::     Default values
        !          1971: @end menu
        !          1972: 
        !          1973: @node Defaults and Alternates, Naming the System, sys File, sys File
        !          1974: @subsection Defaults and Alternates
        !          1975: 
        !          1976: The first set of commands in the file, up to the first @code{system}
        !          1977: command, specify defaults to be used for all systems in that file.  Each
        !          1978: system file uses a different set of defaults.
        !          1979: 
        !          1980: Subsequently, each set of commands from @code{system} up to the next
        !          1981: @code{system} command describe a particular system.  Default values may
        !          1982: be overridden for specific systems.
        !          1983: 
        !          1984: Each system may then have a series of alternate choices to use when
        !          1985: calling out or calling in.  The first set of commands for a particular
        !          1986: system, up to the first @code{alternate} command, provide the first
        !          1987: choice.  Subsequently, each set of commands from @code{alternate} up to
        !          1988: the next @code{alternate} command describe an alternate choice for
        !          1989: calling out or calling in.
        !          1990: 
        !          1991: When a system is called, the commands before the first @code{alternate}
        !          1992: are used to select a phone number, port, and so forth; if the call fails
        !          1993: for some reason, the commands between the first @code{alternate} and the
        !          1994: second are used, and so forth.  Well, not quite.  Actually, each
        !          1995: succeeding alternate will only be used if it is different in some
        !          1996: relevant way (different phone number, different chat script, etc.).  If
        !          1997: you want to force the same alternate to be used again (to retry a phone
        !          1998: call more than once, for example), enter the phone number (or any other
        !          1999: relevant field) again to make it appear different.
        !          2000: 
        !          2001: The alternates can also be used to give different permissions to an
        !          2002: incoming call based on the login name.  This will only be done if the
        !          2003: first set of commands, before the first @code{alternate} command, uses
        !          2004: the @code{called-login} command.  The list of alternates will be
        !          2005: searched, and the first alternate with a matching @code{called-login}
        !          2006: command will be used.  If no alternates match, the call will be
        !          2007: rejected.
        !          2008: 
        !          2009: The @code{alternate} command may also be used in the file-wide defaults
        !          2010: (the set of commands before the first @code{system} command).  This
        !          2011: might be used to specify a list of ports which are available for all
        !          2012: systems (for an example of this, see @ref{Gateway Example}) or to
        !          2013: specify permissions based on the login name used by the remote system
        !          2014: when it calls in.  The first alternate for each system will default to
        !          2015: the first alternate for the file-wide defaults (as modified by the
        !          2016: commands used before the first @code{alternate} command for this
        !          2017: system), the second alternate for each system to the second alternate
        !          2018: for the file-wide defaults (as modified the same way), and so forth.  If
        !          2019: a system specifies more alternates than the file-wide defaults, the
        !          2020: trailing ones will default to the last file-wide default alternate.  If
        !          2021: a system specifies fewer alternates than the file-wide defaults, the
        !          2022: trailing file-wide default alternates will be used unmodified.  The
        !          2023: @code{default-alternates} command may be used to modify this behaviour.
        !          2024: 
        !          2025: This can all get rather confusing, although it's easier to use than to
        !          2026: describe concisely; the @code{uuchk} program may be used to ensure that
        !          2027: you are getting what you want.
        !          2028: 
        !          2029: @node Naming the System, Calling Out, Defaults and Alternates, sys File
        !          2030: @subsection Naming the System
        !          2031: 
        !          2032: @table @code
        !          2033: 
        !          2034: @item system @var{string}
        !          2035: @findex system
        !          2036: 
        !          2037: Specify the remote system name.  Subsequent commands up to the next
        !          2038: @code{system} command refer to this system.
        !          2039: 
        !          2040: @item alternate [@var{string}]
        !          2041: @findex alternate
        !          2042: 
        !          2043: Start an alternate set of commands (@pxref{Defaults and Alternates}).
        !          2044: An optional argument may be used to name the alternate.  This name will
        !          2045: be put in the log file if the alternate is used to call the system.
        !          2046: There is no way to name the first alternate (the commands before the
        !          2047: first @code{alternate} command).
        !          2048: 
        !          2049: @item default-alternates @var{boolean}
        !          2050: @findex default-alternates
        !          2051: 
        !          2052: If the argument is false, any remaining default alternates (from the
        !          2053: defaults specified at the top of the current system file) will not be
        !          2054: used.  The default is true.
        !          2055: 
        !          2056: @item alias @var{string}
        !          2057: @findex alias
        !          2058: 
        !          2059: Specify an alias for the current system.  The alias may be used by local
        !          2060: @code{uucp} and @code{uux} commands, as well as by the remote system
        !          2061: (which can be convenient if a remote system changes its name).  The
        !          2062: default is to have no aliases.
        !          2063: 
        !          2064: @item myname @var{string}
        !          2065: @findex myname
        !          2066: 
        !          2067: Specifies a different system name to use when calling the remote system.
        !          2068: Also, if @code{called-login} is used and is not @samp{ANY}, then, when a
        !          2069: system logs in with that login name, @var{string} is used as the system
        !          2070: name.  Because the local system name must be determined before the
        !          2071: remote system has identified itself, using @code{myname} and
        !          2072: @code{called-login} together for any system will set the local name for
        !          2073: that login; this means that each locally used system name must have a
        !          2074: unique login name associated with it.  This allows a system to have
        !          2075: different names for an external and an internal network.  The default is
        !          2076: to not use a special local name.
        !          2077: 
        !          2078: @end table
        !          2079: 
        !          2080: @node Calling Out, Accepting a Call, Naming the System, sys File
        !          2081: @subsection Calling Out
        !          2082: 
        !          2083: This section describes commands used when placing a call to another
        !          2084: system.
        !          2085: 
        !          2086: @menu
        !          2087: * When to Call::                When to call
        !          2088: * Placing the Call::            Placing the call
        !          2089: * Logging In::                  Logging in
        !          2090: @end menu
        !          2091: 
        !          2092: @node When to Call, Placing the Call, Calling Out, Calling Out
        !          2093: @subsubsection When to Call
        !          2094: 
        !          2095: @table @code
        !          2096: 
        !          2097: @item time @var{string} [@var{number}]
        !          2098: @findex time
        !          2099: 
        !          2100: Specify when the system may be called.  The first argument is a time
        !          2101: string; see @ref{Time Strings}.  The optional second argument specifies
        !          2102: a retry time in minutes.  If a call made during a time that matches the
        !          2103: time string fails, no more calls are permitted until the retry time has
        !          2104: passed.  By default an exponentially increasing retry time is used:
        !          2105: after each failure the next retry period is longer.  A retry time
        !          2106: specified in the @code{time} command is always a fixed amount of time.
        !          2107: 
        !          2108: The @code{time} command may appear multiple times in a single alternate,
        !          2109: in which case if any time string matches the system may be called.  When
        !          2110: the @code{time} command is used for a particular system, any @code{time}
        !          2111: or @code{timegrade} commands that appeared in the system defaults are
        !          2112: ignored.
        !          2113: 
        !          2114: The default time string is @samp{Never}.
        !          2115: 
        !          2116: @item timegrade @var{character} @var{string} [@var{number}]
        !          2117: @findex timegrade
        !          2118: 
        !          2119: The @var{character} specifies a grade.  It must be a single letter or
        !          2120: digit.  The @var{string} is a time string (@pxref{Time Strings}).  All
        !          2121: jobs of grade @var{character} or higher (where @kbd{0} > @kbd{9} >
        !          2122: @kbd{A} > @kbd{Z} > @kbd{a} > @kbd{z}) may be run at the specified time.
        !          2123: An ordinary @code{time} command is equivalent to using @code{timegrade}
        !          2124: with a grade of @kbd{z}, permitting all jobs.  If there are no jobs of a
        !          2125: sufficiently high grade according to the time string, the system will
        !          2126: not be called.  Giving the @samp{-s} switch to @code{uucico} to force it
        !          2127: to call a system causes it to assume there is a job of grade @kbd{0}
        !          2128: waiting to be run.
        !          2129: 
        !          2130: The optional third argument specifies a retry time in minutes.  See the
        !          2131: @code{time} command, above, for more details.
        !          2132: 
        !          2133: Note that the @code{timegrade} command serves two purposes: 1) if there
        !          2134: is no job of sufficiently high grade the system will not be called, and
        !          2135: 2) if the system is called anyway (because the @samp{-s} switch was
        !          2136: given to @code{uucico}) only jobs of sufficiently high grade will be
        !          2137: transferred.  However, if the other system calls in, the
        !          2138: @code{timegrade} commands are ignored, and jobs of any grade may be
        !          2139: transferred (but see @code{call-timegrade} below).  Also, the
        !          2140: @code{timegrade} command will not prevent the other system from
        !          2141: transferring any job it chooses, regardless of who placed the call.
        !          2142: 
        !          2143: The @code{timegrade} command may appear multiple times without using
        !          2144: @code{alternate}.  When the @code{timegrade} command is used for a
        !          2145: particular system, any @code{time} or @code{timegrade} commands that
        !          2146: appeared in the system defaults are ignored.
        !          2147: 
        !          2148: If this command does not appear, there are no restrictions on what grade
        !          2149: of work may be done at what time.
        !          2150: 
        !          2151: @item max-retries @var{number}
        !          2152: @findex max-retries
        !          2153: 
        !          2154: Gives the maximum number of times this system may be retried.  If this
        !          2155: many calls to the system fail, it will be called at most once a day
        !          2156: whatever the retry time is.  The default is 26.
        !          2157: 
        !          2158: @item success-wait @var{number}
        !          2159: 
        !          2160: A retry time, in seconds, which applies after a successful call.  This
        !          2161: can be used to put a limit on how frequently the system is called.  For
        !          2162: example, an argument of 1800 means that the system will not be called
        !          2163: more than once every half hour.  The default is 0, which means that
        !          2164: there is no limit.
        !          2165: 
        !          2166: @item call-timegrade @var{character} @var{string}
        !          2167: @findex call-timegrade
        !          2168: 
        !          2169: The @var{character} is a single character @kbd{A} to @kbd{Z}, @kbd{a} to
        !          2170: @kbd{z}, or @kbd{0} to @kbd{9} and specifies a grade.  The @var{string}
        !          2171: is a time string as described under the @code{time} command.  If a call
        !          2172: is placed to the other system during a time which matches the time
        !          2173: string, the remote system will be requested to only run jobs of grade
        !          2174: @var{character} or higher.  Unfortunately, there is no way to guarantee
        !          2175: that the other system will obey the request (this UUCP package will, but
        !          2176: there are others which will not); moreover job grades are historically
        !          2177: somewhat arbitrary, so specifying a grade will only be meaningful if the
        !          2178: other system cooperates in assigning grades.  This grade restriction
        !          2179: only applies when the other system is called, not when the other system
        !          2180: calls in.
        !          2181: 
        !          2182: The @code{call-timegrade} command may appear multiple times without
        !          2183: using @code{alternate}.  If this command does not appear, or if none of
        !          2184: the time strings match, the remote system will be allowed to send
        !          2185: whatever grades of work it chooses.
        !          2186: 
        !          2187: @end table
        !          2188: 
        !          2189: @node Placing the Call, Logging In, When to Call, Calling Out
        !          2190: @subsubsection Placing the Call
        !          2191: 
        !          2192: @table @code
        !          2193: 
        !          2194: @item baud @var{number}
        !          2195: @findex baud in sys file
        !          2196: @itemx speed @var{number}
        !          2197: @findex speed in sys file
        !          2198: 
        !          2199: Specify the speed (the term @dfn{baud} is technically incorrect, but
        !          2200: widely understood) at which to call the system.  This will try all
        !          2201: available ports with that baud rate until an unlocked port is found.
        !          2202: The ports are defined in the port file.  If both @code{baud} and
        !          2203: @code{port} commands appear, both are used when selecting a port.  To
        !          2204: allow calls at more than one baud rate, the @code{alternate} command
        !          2205: must be used (@pxref{Defaults and Alternates}).  If this command does
        !          2206: not appear, there is no default; the baud rate may be specified in the
        !          2207: port file, but if it is not then the natural baud rate of the port will
        !          2208: be used (whatever that means on the system).  Specifying an explicit
        !          2209: baud rate of 0 will request the natural baud rate of the port,
        !          2210: overriding any default baud rate from the defaults at the top of the
        !          2211: file.
        !          2212: 
        !          2213: @item port @var{string}
        !          2214: @findex port in sys file
        !          2215: 
        !          2216: Name a particular port or type of port to use when calling the system.
        !          2217: The information for this port is obtained from the port file.  If this
        !          2218: command does not appear, there is no default; a port must somehow be
        !          2219: specified in order to call out (it may be specified implicitly using the
        !          2220: @code{baud} command or explicitly using the next version of
        !          2221: @code{port}).  There may be many ports with the same name; each will be
        !          2222: tried in turn until an unlocked one is found which matches the desired
        !          2223: baud rate.
        !          2224: 
        !          2225: @item port @var{string} @dots{}
        !          2226: 
        !          2227: If more than one string follows the @code{port} command, the strings are
        !          2228: treated as a command that might appear in the port file (@pxref{port
        !          2229: File}).  If a port is named (by using a single string following
        !          2230: @code{port}) these commands are ignored; their purpose is to permit
        !          2231: defining the port completely in the system file rather than always
        !          2232: requiring entries in two different files.  In order to call out, a port
        !          2233: must be specified using some version of the @code{port} command, or by
        !          2234: using the @code{baud} command to select ports from the port file.
        !          2235: 
        !          2236: @item phone @var{string}
        !          2237: @findex phone
        !          2238: @itemx address @var{string}
        !          2239: @findex address
        !          2240: 
        !          2241: Give a phone number to call (when using a modem port) or a remote host
        !          2242: to contact (when using a TCP or TLI port).  The commands @code{phone}
        !          2243: and @code{address} are equivalent; the duplication is intended to
        !          2244: provide a mnemonic choice depending on the type of port in use.
        !          2245: 
        !          2246: When used with a modem port, an @kbd{=} character in the phone number
        !          2247: means to wait for a secondary dial tone (although only some modems
        !          2248: support this); a @kbd{-} character means to pause while dialing for 1
        !          2249: second (again, only some modems support this).  If the system has more
        !          2250: than one phone number, each one must appear in a different alternate.
        !          2251: The @code{phone} command must appear in order to call out on a modem;
        !          2252: there is no default.
        !          2253: 
        !          2254: When used with a TCP port, the string names the host to contact.  It may
        !          2255: be a domain name or a numeric Internet address.  If no address is
        !          2256: specified, the system name is used.
        !          2257: 
        !          2258: When used with a TLI port, the string is treated as though it were an
        !          2259: expect string in a chat script, allowing the use of escape characters
        !          2260: (@pxref{Chat Scripts}).  The @code{dialer-sequence} command in the port
        !          2261: file may override this address (@pxref{port File}).
        !          2262: 
        !          2263: When used with a port that not a modem or TCP or TLI, this command is
        !          2264: ignored.
        !          2265: 
        !          2266: @end table
        !          2267: 
        !          2268: @node Logging In,  , Placing the Call, Calling Out
        !          2269: @subsubsection Logging In
        !          2270: @table @code
        !          2271: 
        !          2272: @item chat @var{strings}
        !          2273: @findex chat in sys file
        !          2274: @item chat-timeout @var{number}
        !          2275: @findex chat-timeout in sys file
        !          2276: @item chat-fail @var{string}
        !          2277: @findex chat-fail in sys file
        !          2278: @item chat-seven-bit @var{boolean}
        !          2279: @findex chat-seven-bit in sys file
        !          2280: @item chat-program @var{strings}
        !          2281: @findex chat-program in sys file
        !          2282: 
        !          2283: These commands describe a chat script to use when logging on to a remote
        !          2284: system.  Chat scripts are explained in @ref{Chat Scripts}.
        !          2285: 
        !          2286: Two additional escape sequences may be used in send strings.
        !          2287: 
        !          2288: @table @samp
        !          2289: @item \L
        !          2290: Send the login name, as set by the @code{call-login} command.
        !          2291: @item \P
        !          2292: Send the password, as set by the @code{call-password} command.
        !          2293: @end table
        !          2294: 
        !          2295: Three additional escape sequences may be used with the
        !          2296: @code{chat-program} command.  These are @samp{\L} and @samp{\P}, which
        !          2297: become the login name and password, respectively, and @samp{\Z}, which
        !          2298: becomes the name of the system of being called.
        !          2299: 
        !          2300: The default chat script is:
        !          2301: 
        !          2302: @example
        !          2303: chat "" \r\c ogin:-BREAK-ogin:-BREAK-ogin: \L word: \P
        !          2304: @end example
        !          2305: 
        !          2306: This will send a carriage return (the @kbd{\c} suppresses the additional
        !          2307: trailing carriage return that would otherwise be sent) and waits for the
        !          2308: string @samp{ogin:} (which would be the last part of the @samp{login:}
        !          2309: prompt supplied by a Unix system).  If it doesn't see @samp{ogin:}, it
        !          2310: sends a break and waits for @samp{ogin:} again.  If it still doesn't see
        !          2311: @samp{ogin:}, it sends another break and waits for @samp{ogin:} again.
        !          2312: If it still doesn't see @samp{ogin:}, the chat script aborts and hangs
        !          2313: up the phone.  If it does see @samp{ogin:} at some point, it sends the
        !          2314: login name (as specified by the @code{call-login} command) followed by a
        !          2315: carriage return (since all send strings are followed by a carriage
        !          2316: return unless @kbd{\c} is used) and waits for the string @samp{word:}
        !          2317: (which would be the last part of the @samp{Password:} prompt supplied by
        !          2318: a Unix system).  If it sees @samp{word:}, it sends the password and a
        !          2319: carriage return, completing the chat script.  The program will then
        !          2320: enter the handshake phase of the UUCP protocol.
        !          2321: 
        !          2322: This chat script will work for most systems, so you will only be
        !          2323: required to use the @code{call-login} and @code{call-password} commands.
        !          2324: In fact, in the file-wide defaults you could set defaults of
        !          2325: @samp{call-login *} and @samp{call-password *}; you would then just have
        !          2326: to make an entry for each system in the call-out login file.
        !          2327: 
        !          2328: Some systems seem to flush input after the @samp{login:} prompt, so they
        !          2329: may need a version of this chat script with a @kbd{\d} before the
        !          2330: @kbd{\L}.  When using UUCP over TCP, some servers will not be handle the
        !          2331: initial carriage return sent by this chat script; in this case you may
        !          2332: have to specify the simple chat script @samp{ogin: \L word: \P}.
        !          2333: 
        !          2334: @item call-login @var{string}
        !          2335: @findex call-login
        !          2336: 
        !          2337: Specify the login name to send with @kbd{\L} in the chat script.  If the
        !          2338: string is @samp{*} (e.g. @samp{call-login *}) the login name will be
        !          2339: fetched from the call out login name and password file
        !          2340: (@pxref{Configuration File Names}).  There is no default.
        !          2341: 
        !          2342: @item call-password @var{string}
        !          2343: @findex call-password
        !          2344: 
        !          2345: Specify the password to send with @kbd{\P} in the chat script.  If the
        !          2346: string is @samp{*} (e.g. @samp{call-password *}) the password will be
        !          2347: fetched from the call-out login name and password file
        !          2348: (@pxref{Configuration File Names}).  There is no default.
        !          2349: 
        !          2350: @end table
        !          2351: 
        !          2352: @node Accepting a Call, Protocol Selection, Calling Out, sys File
        !          2353: @subsection Accepting a Call
        !          2354: 
        !          2355: @table @code
        !          2356: 
        !          2357: @item called-login @var{strings}
        !          2358: @findex called-login
        !          2359: 
        !          2360: The first @var{string} specifies the login name that the system must use
        !          2361: when calling in.  If it is @samp{ANY} (e.g. @samp{called-login ANY}) any
        !          2362: login name may be used; this is useful to override a file-wide default
        !          2363: and to indicate that future alternates may have different login names.
        !          2364: Case is significant.  The default value is @samp{ANY}.  
        !          2365: 
        !          2366: Different alternates (@pxref{Defaults and Alternates}) may use different
        !          2367: @code{called-login} commands, in which case the login name will be used
        !          2368: to select which alternate is in effect; this will only work if the first
        !          2369: alternate (before the first @code{alternate} command) uses the
        !          2370: @code{called-login} command.
        !          2371: 
        !          2372: Additional strings may be specified after the login name; they are a
        !          2373: list of which systems are permitted to use this login name.  If this
        !          2374: feature is used, then normally the login name will only be given in a
        !          2375: single @code{called-login} command.  Only systems which appear on the
        !          2376: list, or which use an explicit @code{called-login} command, will be
        !          2377: permitted to use that login name.  If the same login name is used more
        !          2378: than once with a list of systems, all the lists are concatenated
        !          2379: together.  This feature permits you to restrict a login name to a
        !          2380: particular set of systems without requiring you to use the
        !          2381: @code{called-login} command for every single system; you can achieve a
        !          2382: similar effect by using a different system file for each permitted login
        !          2383: name with an appropriate @code{called-login} command in the file-wide
        !          2384: defaults.
        !          2385: 
        !          2386: @item callback @var{boolean}
        !          2387: @findex callback
        !          2388: 
        !          2389: If @var{boolean} is true, then when the remote system calls
        !          2390: @code{uucico} will hang up the connection and prepare to call it back.
        !          2391: The default is false.
        !          2392: 
        !          2393: @item called-chat @var{strings}
        !          2394: @findex called-chat
        !          2395: @item called-chat-timeout @var{number}
        !          2396: @findex called-chat-timeout
        !          2397: @item called-chat-fail @var{string}
        !          2398: @findex called-chat-fail
        !          2399: @item called-chat-seven-bit @var{boolean}
        !          2400: @findex called-chat-seven-bit
        !          2401: @item called-chat-program @var{strings}
        !          2402: @findex called-chat-program
        !          2403:   
        !          2404: These commands may be used to define a chat script (@pxref{Chat
        !          2405: Scripts}) that is run whenever the local system is called by the system
        !          2406: being defined.  The chat script defined by the @code{chat} command
        !          2407: (@pxref{Logging In}), on the other hand, is used when the remote system
        !          2408: is called.  This called chat script might be used to set special modem
        !          2409: parameters that are appropriate to a particular system.  It is run after
        !          2410: protocol negotiation is complete, but before the protocol has been
        !          2411: started.  See @ref{Logging In} for additional escape sequence which may
        !          2412: be used besides those defined for all chat scripts.  There is no default
        !          2413: called chat script.  If the called chat script fails, the incoming call
        !          2414: will be aborted.
        !          2415: 
        !          2416: @end table
        !          2417: 
        !          2418: @node Protocol Selection, File Transfer Control, Accepting a Call, sys File
        !          2419: @subsection Protocol Selection
        !          2420: 
        !          2421: @table @code
        !          2422: 
        !          2423: @item protocol @var{string}
        !          2424: @findex protocol in sys file
        !          2425: 
        !          2426: Specifies which protocols to use for the other system, and in which
        !          2427: order to use them.  This would not normally be used.  For example,
        !          2428: @samp{protocol tfg}.
        !          2429: 
        !          2430: The default depends on the characteristics of the port and the dialer,
        !          2431: as specified by the @code{seven-bit} and @code{reliable} commands.  If
        !          2432: neither the port nor the dialer use either of these commands, the
        !          2433: default is to assume an eight-bit reliable connection.  The commands
        !          2434: @samp{seven-bit true} or @samp{reliable false} might be used in either
        !          2435: the port or the dialer to change this.  Each protocol has particular
        !          2436: requirements that must be met before it will be considered during
        !          2437: negotiation with the remote side.
        !          2438: 
        !          2439: The @samp{t} and @samp{e} protocols are intended for use over TCP or
        !          2440: some other communication path with end to end reliability, as they do no
        !          2441: checking of the data at all.  They will only be considered on a TCP port
        !          2442: which is both reliable and eight bit.
        !          2443: 
        !          2444: The @samp{i} protocol is a bidirectional protocol.  It requires an
        !          2445: eight-bit connection.  It will run over a half-duplex link, such as
        !          2446: Telebit modems in PEP mode, but for efficient use of such a connection
        !          2447: you must use the @code{half-duplex} command (@pxref{port File}).
        !          2448: 
        !          2449: The @samp{g} protocol is robust, but requires an eight-bit connection.
        !          2450: 
        !          2451: The @samp{G} protocol is the System V Release 4 version of the @samp{g}
        !          2452: protocol.
        !          2453: 
        !          2454: The @samp{a} protocol is a Zmodem like protocol, contributed by Doug
        !          2455: Evans.  It requires an eight-bit connection, but unlike the @samp{g} or
        !          2456: @samp{i} protocol it will work if certain control characters may not be
        !          2457: transmitted.
        !          2458: 
        !          2459: The @samp{j} protocol is a variant of the @samp{i} protocol which can
        !          2460: avoid certain control characters.  The set of characters it avoids can
        !          2461: be set by a parameter.  While it technically does not require an eight
        !          2462: bit connection (it could be configured to avoid all characters with the
        !          2463: high bit set) it would be very inefficient to use it over one.  It is
        !          2464: useful over a eight-bit connection that will not transmit certain
        !          2465: control characters.
        !          2466: 
        !          2467: The @samp{f} protocol is intended for use with X.25 connections; it
        !          2468: checksums each file as a whole, so any error causes the entire file to
        !          2469: be retransmitted.  It requires a reliable connection, but only uses
        !          2470: seven-bit transmissions.  It is a streaming protocol, so, while it can
        !          2471: be used on a serial port, the port must be completely reliable and flow
        !          2472: controlled; many aren't.
        !          2473: 
        !          2474: The protocols will be considered in the order shown above.  This means
        !          2475: that if neither the @code{seven-bit} nor the @code{reliable} command are
        !          2476: used, the @samp{t} protocol will be used over a TCP connection and the
        !          2477: @samp{i} protocol will be used over any other type of connection
        !          2478: (subject, of course, to what is supported by the remote system; it may
        !          2479: be assumed that all systems support the @samp{g} protocol).
        !          2480: 
        !          2481: Note that currently specifying both @samp{seven-bit true} and
        !          2482: @samp{reliable false} will not match any protocol.  If this occurs
        !          2483: through a combination of port and dialer specifications, you will have
        !          2484: to use the @code{protocol} command for the system or no protocol will be
        !          2485: selected at all (the only reasonable choice would be @samp{protocol f}).
        !          2486: 
        !          2487: A protocol list may also be specified for a port (@pxref{port File}),
        !          2488: but if there is a list for the system the list for the port is ignored.
        !          2489: 
        !          2490: @item protocol-parameter @var{character} @var{string} @dots{}
        !          2491: @findex protocol-parameter in sys file
        !          2492: 
        !          2493: @var{character} is a single character specifying a protocol.  The
        !          2494: remaining strings are a command specific to that protocol which will be
        !          2495: executed if that protocol is used.  A typical command is something like
        !          2496: @samp{window 7}.  The particular commands are protocol specific.
        !          2497: 
        !          2498: The @samp{i} protocol supports the following commands, all of which take
        !          2499: numeric arguments:
        !          2500: 
        !          2501: @table @code
        !          2502: @item window
        !          2503: The window size to request the remote system to use.  This must be
        !          2504: between 1 and 31 inclusive.  The default is 16.
        !          2505: @item packet-size
        !          2506: The packet size to request the remote system to use.  This must be
        !          2507: between 1 and 4095 inclusive.  The default is 1024.
        !          2508: @item remote-window
        !          2509: If this is between 1 and 31 inclusive, the window size requested by the
        !          2510: remote system is ignored and this is used instead.  The default is 0,
        !          2511: which means that the remote system's request is honored.
        !          2512: @item remote-packet-size
        !          2513: If this is between 1 and 4095 inclusive, the packet size requested by
        !          2514: the remote system is ignored and this is used instead.  The default is
        !          2515: 0, which means that the remote system's request is honored.
        !          2516: @item sync-timeout
        !          2517: The length of time, in seconds, to wait for a SYNC packet from the remote
        !          2518: system.  SYNC packets are exchanged when the protocol is started.  The
        !          2519: default is 10.
        !          2520: @item sync-retries
        !          2521: The number of times to retry sending a SYNC packet before giving up.
        !          2522: The default is 6.
        !          2523: @item timeout
        !          2524: The length of time, in seconds, to wait for an incoming packet before
        !          2525: sending a negative acknowledgement.  The default is 10.
        !          2526: @item retries
        !          2527: The number of times to retry sending a packet or a negative
        !          2528: acknowledgement before giving up and closing the connection.  The
        !          2529: default is 6.
        !          2530: @item errors
        !          2531: The maximum number of errors to permit before closing the connection.
        !          2532: The default is 100.
        !          2533: @item error-decay
        !          2534: The rate at which to ignore errors.  Each time this many packets are
        !          2535: received, the error count is decreased by one, so that a long connection
        !          2536: with an occasional error will not exceed the limit set by @code{errors}.
        !          2537: The default is 10.
        !          2538: @end table
        !          2539: 
        !          2540: The @samp{g} and @samp{G} protocols support the following commands, all
        !          2541: of which take numeric arguments, except @code{short-packets} which takes
        !          2542: a boolean argument:
        !          2543: 
        !          2544: @table @code
        !          2545: @item window
        !          2546: The window size to request the remote system to use.  This must be
        !          2547: between 1 and 7 inclusive.  The default is 7.
        !          2548: @item packet-size
        !          2549: The packet size to request the remote system to use.  This must be a
        !          2550: power of 2 between 32 and 4096 inclusive.  The default is 64, which is
        !          2551: the only packet size supported by many older UUCP packages.  Some UUCP
        !          2552: packages will even dump core if a larger packet size is requested.
        !          2553: @item startup-retries
        !          2554: The number of times to retry the initialization sequence.  The default
        !          2555: is 8.
        !          2556: @item init-retries
        !          2557: The number of times to retry one phase of the initialization sequence
        !          2558: (there are three phases).  The default is 4.
        !          2559: @item init-timeout
        !          2560: The timeout in seconds for one phase of the initialization sequence.  The
        !          2561: default is 10.
        !          2562: @item retries
        !          2563: The number of times to retry sending either a data packet or a request
        !          2564: for the next packet.  The default is 6.
        !          2565: @item timeout
        !          2566: The timeout in seconds when waiting for either a data packet or an
        !          2567: acknowledgement.  The default is 10.
        !          2568: @item garbage
        !          2569: The number of unrecognized bytes to permit before dropping the
        !          2570: connection.  This must be larger than the packet size.  The default is
        !          2571: 10000.
        !          2572: @item errors
        !          2573: The number of errors (malformed packets, out of order packets, bad
        !          2574: checksums, or packets rejected by the remote system) to permit before
        !          2575: dropping the connection.  The default is 100.
        !          2576: @item error-decay
        !          2577: The rate at which to ignore errors.  Each time this many packets are
        !          2578: received, the error count is decreased by one, so that a long connection
        !          2579: with an occasional error will not exceed the limit set by @code{errors}.
        !          2580: The default is 10.
        !          2581: @item remote-window
        !          2582: If this is between 1 and 7 inclusive, the window size requested by the
        !          2583: remote system is ignored and this is used instead.  This can be useful
        !          2584: when dealing with some poor UUCP packages.  The default is 0, which
        !          2585: means that the remote system's request is honored.
        !          2586: @item remote-packet-size
        !          2587: If this is between 32 and 4096 inclusive the packet size requested by
        !          2588: the remote system is ignored and this is used instead.  There is
        !          2589: probably no good reason to use this.  The default is 0, which means that
        !          2590: the remote system's request is honored.
        !          2591: @item short-packets
        !          2592: If this is true, then the code will optimize by sending shorter packets
        !          2593: when there is less data to send.  This confuses some UUCP packages, such
        !          2594: as System V Release 4 (when using the @samp{G} protocol) and Waffle;
        !          2595: when connecting to such a package, this parameter must be set to false.
        !          2596: The default is true for the @samp{g} protocol and false for the @samp{G}
        !          2597: protocol.
        !          2598: @end table
        !          2599: 
        !          2600: The @samp{a} protocol is a Zmodem like protocol contributed by Doug
        !          2601: Evans.  It supports the following commands, all of which take numeric
        !          2602: arguments except for @code{escape-control}, which takes a boolean
        !          2603: argument:
        !          2604: 
        !          2605: @table @code
        !          2606: @item timeout
        !          2607: Number of seconds to wait for a packet to arrive.  The default is 10.
        !          2608: @item retries
        !          2609: The number of times to retry sending a packet.  The default is 10.
        !          2610: @item startup-retries
        !          2611: The number of times to retry sending the initialization packet.  The
        !          2612: default is 4.
        !          2613: @item garbage
        !          2614: The number of garbage characters to accept before closing the
        !          2615: connection.  The default is 2400.
        !          2616: @item send-window
        !          2617: The number of characters that may be sent before waiting for an
        !          2618: acknowledgement.  The default is 1024.
        !          2619: @item escape-control
        !          2620: Whether to escape control characters.  If this is true, the protocol may
        !          2621: be used over a connection which does not transmit certain control
        !          2622: characters, such as @code{XON} or @code{XOFF}.  The connection must
        !          2623: still transmit eight bit characters other than control characters.  The
        !          2624: default is false.
        !          2625: @end table
        !          2626: 
        !          2627: The @samp{j} protocol can be used over an eight bit connection that will
        !          2628: not transmit certain control characters.  It accepts the same protocol
        !          2629: parameters that the @samp{i} protocol accepts, as well as one more:
        !          2630: 
        !          2631: @table @code
        !          2632: @item avoid
        !          2633: A list of characters to avoid.  This is a string which is interpreted as
        !          2634: an escape sequence (@pxref{Chat Scripts}).  The protocol does not have a
        !          2635: way to avoid printable ASCII characters (byte values from 32 to 126,
        !          2636: inclusive); only ASCII control characters and eight-bit characters may
        !          2637: be avoided.  The default value is @samp{\021\023}; these are the
        !          2638: characters @code{XON} and @code{XOFF} which many connections use for
        !          2639: flow control.  If the package is configured to use @code{HAVE_BSD_TTY},
        !          2640: then on some versions of Unix you may have to avoid @samp{\377} as well,
        !          2641: due to the way some implementations of the BSD terminal driver handle
        !          2642: signals.
        !          2643: @end table
        !          2644: 
        !          2645: The @samp{f} protocol is intended for use with error-correcting modems
        !          2646: only; it checksums each file as a whole, so any error causes the entire
        !          2647: file to be retransmitted.  It supports the following commands, both of
        !          2648: which take numeric arguments:
        !          2649: 
        !          2650: @table @code
        !          2651: @item timeout
        !          2652: The timeout in seconds before giving up.  The default is 120.
        !          2653: @item retries
        !          2654: How many times to retry sending a file.  The default is 2.
        !          2655: @end table
        !          2656: 
        !          2657: The @samp{t} and @samp{e} protocols are intended for use over TCP or
        !          2658: some other communication path with end to end reliability, as they do no
        !          2659: checking of the data at all.  They both support a single command, which
        !          2660: takes a numeric argument:
        !          2661: 
        !          2662: @table @code
        !          2663: @item timeout
        !          2664: The timeout in seconds before giving up.  The default is 120.
        !          2665: @end table
        !          2666: 
        !          2667: The protocol parameters are reset to their default values after each
        !          2668: call.
        !          2669: 
        !          2670: @end table
        !          2671: 
        !          2672: @node File Transfer Control, Miscellaneous (sys), Protocol Selection, sys File
        !          2673: @subsection File Transfer Control
        !          2674: 
        !          2675: @table @code
        !          2676: 
        !          2677: @item send-request @var{boolean}
        !          2678: @findex send-request
        !          2679: 
        !          2680: The @var{boolean} determines whether the remote system is permitted to
        !          2681: request files from the local system.  The default is yes.
        !          2682: 
        !          2683: @item receive-request @var{boolean}
        !          2684: @findex receive-request
        !          2685: 
        !          2686: The @var{boolean} determines whether the remote system is permitted to
        !          2687: send files to the local system.  The default is yes.
        !          2688: 
        !          2689: @item request @var{boolean}
        !          2690: @findex request
        !          2691: 
        !          2692: A shorthand command, equivalent to specifying both @samp{send-request
        !          2693: @var{boolean}} and @samp{receive-request @var{boolean}}.
        !          2694: 
        !          2695: @item call-transfer @var{boolean}
        !          2696: @findex call-transfer
        !          2697: 
        !          2698: The @var{boolean} is checked when the local system places the call.  It
        !          2699: determines whether the local system may do file transfers queued up for
        !          2700: the remote system.  The default is yes.
        !          2701: 
        !          2702: @item called-transfer @var{boolean}
        !          2703: @findex called-transfer
        !          2704: 
        !          2705: The @var{boolean} is checked when the remote system calls in.  It
        !          2706: determines whether the local system may do file transfers queued up for
        !          2707: the remote system.  The default is yes.
        !          2708: 
        !          2709: @item transfer @var{boolean}
        !          2710: @findex transfer
        !          2711: 
        !          2712: Equivalent to specifying both @samp{call-transfer @var{boolean}}
        !          2713: @samp{called-transfer @var{boolean}}.
        !          2714: 
        !          2715: @item call-local-size @var{number} @var{string}
        !          2716: @findex call-local-size
        !          2717: 
        !          2718: The @var{string} is a time string (@pxref{Time Strings}).  The
        !          2719: @var{number} is the size in bytes of the largest file that should be
        !          2720: transferred at a time matching the time string if the local system
        !          2721: placed the call and the request was made by the local system.  This
        !          2722: command may appear multiple times in a single alternate.  If this
        !          2723: command does not appear, or if none of the time strings match, there are
        !          2724: no size restrictions.
        !          2725: 
        !          2726: With all the size control commands, the size of a file from the remote
        !          2727: system (as opposed to a file from the local system) will only be checked
        !          2728: if the other system is running this package; other UUCP packages will
        !          2729: not understand a maximum size request, nor will they inform this package
        !          2730: of the size of remote files.
        !          2731: 
        !          2732: @item call-remote-size @var{number} @var{string}
        !          2733: @findex call-remote-size
        !          2734: 
        !          2735: Specify the size in bytes of the largest file that should be
        !          2736: transferred at a given time by remote request when the local system
        !          2737: placed the call.  This command may appear multiple times in a single
        !          2738: alternate.  If this command does not appear, there are no size
        !          2739: restrictions.
        !          2740: 
        !          2741: @item called-local-size @var{number} @var{string}
        !          2742: @findex called-local-size
        !          2743: 
        !          2744: Specify the size in bytes of the largest file that should be transferred
        !          2745: at a given time by local request when the remote system placed the call.
        !          2746: This command may appear multiple times in a single alternate. If this
        !          2747: command does not appear, there are no size restrictions.
        !          2748: 
        !          2749: @item called-remote-size @var{number} @var{string}
        !          2750: @findex called-remote-size
        !          2751: 
        !          2752: Specify the size in bytes of the largest file that should be transferred
        !          2753: at a given time by remote request when the remote system placed the
        !          2754: call.  This command may appear multiple times in a single alternate. If
        !          2755: this command does not appear, there are no size restrictions.
        !          2756: 
        !          2757: @item local-send @var{strings}
        !          2758: @findex local-send
        !          2759: 
        !          2760: Specifies that files in the directories named by the @var{strings} may
        !          2761: be sent to the remote system when requested locally (using @code{uucp}
        !          2762: or @code{uux}).  The directories in the list should be separated by
        !          2763: whitespace.  A @kbd{~} may be used for the public directory.  On a Unix
        !          2764: system, this is typically @file{/usr/spool/uucppublic}; the public
        !          2765: directory may be set with the @code{pubdir} command.  Here is an example
        !          2766: of @code{local-send}:
        !          2767: 
        !          2768: @example
        !          2769: local-send ~ /usr/spool/ftp/pub
        !          2770: @end example
        !          2771: 
        !          2772: Listing a directory allows all files within the directory and all
        !          2773: subdirectories to be sent.  Directories may be excluded by preceding
        !          2774: them with an exclamation point.  For example:
        !          2775: 
        !          2776: @example
        !          2777: local-send /usr/ftp !/usr/ftp/private ~
        !          2778: @end example
        !          2779: 
        !          2780: @noindent
        !          2781: means that all files in @file{/usr/ftp} or the public directory may be
        !          2782: sent, except those files in @file{/usr/ftp/private}.  The list of
        !          2783: directories is read from left to right, and the last directory to apply
        !          2784: takes effect; this means that directories should be listed from top
        !          2785: down.  The default is the root directory (i.e., any file at all may be
        !          2786: sent by local request).
        !          2787: 
        !          2788: @item remote-send @var{strings}
        !          2789: @findex remote-send
        !          2790: 
        !          2791: Specifies that files in the named directories may be sent to the remote
        !          2792: system when requested by the remote system.  The default is @kbd{~}.
        !          2793: 
        !          2794: @item local-receive @var{strings}
        !          2795: @findex local-receive
        !          2796: 
        !          2797: Specifies that files may be received into the named directories when
        !          2798: requested by a local user.  The default is @kbd{~}.
        !          2799: 
        !          2800: @item remote-receive @var{strings}
        !          2801: @findex remote-receive
        !          2802: 
        !          2803: Specifies that files may be received into the named directories when
        !          2804: requested by the remote system.  The default is @kbd{~}.  On Unix, the
        !          2805: remote system may only request that files be received into directories
        !          2806: that are writeable by the world, regardless of how this is set.
        !          2807: 
        !          2808: @item forward-to @var{strings}
        !          2809: @findex forward-to
        !          2810: 
        !          2811: Specifies a list of systems to which files may be forwarded.  The remote
        !          2812: system may forward files through the local system on to any of the
        !          2813: systems in this list.  The string @samp{ANY} may be used to permit
        !          2814: forwarding to any system.  The default is to not permit forwarding to
        !          2815: other systems.  Note that if the remote system is permitted to execute
        !          2816: the @code{uucp} command, it effectively has the ability to forward to
        !          2817: any system.
        !          2818: 
        !          2819: @item forward-from @var{strings}
        !          2820: @findex forward-from
        !          2821: 
        !          2822: Specifies a list of systems from which files may be forwarded.  The
        !          2823: remote system may request files via the local system from any of the
        !          2824: systems in this list.  The string @samp{ANY} may be used to permit
        !          2825: forwarding to any system.  The default is to not permit forwarding from
        !          2826: other systems.  Note that if a remote system is permitted to execute the
        !          2827: @code{uucp} command, it effectively has the ability to request files
        !          2828: from any system.
        !          2829: 
        !          2830: @item forward @var{strings}
        !          2831: @findex forward
        !          2832: 
        !          2833: Equivalent to specifying both @samp{forward-to @var{strings}} and
        !          2834: @samp{forward-from @var{strings}}.  This would normally be used rather
        !          2835: than either of the more specific commands.
        !          2836: 
        !          2837: @end table
        !          2838: 
        !          2839: @node Miscellaneous (sys), Default sys File Values, File Transfer Control, sys File
        !          2840: @subsection Miscellaneous sys File Commands
        !          2841: 
        !          2842: @table @code
        !          2843: 
        !          2844: @item sequence @var{boolean}
        !          2845: @findex sequence
        !          2846: 
        !          2847: If @var{boolean} is true, then conversation sequencing is automatically
        !          2848: used for the remote system, so that if somebody manages to spoof as the
        !          2849: remote system, it will be detected the next time the remote system
        !          2850: actually calls.  This is false by default.
        !          2851: 
        !          2852: @item command-path @var{string}
        !          2853: @findex command-path
        !          2854: 
        !          2855: Specifies the path (a list of whitespace separated directories) to be
        !          2856: searched to locate commands to execute.  This is only used for commands
        !          2857: requested by @code{uux}, not for chat programs.  The default is from
        !          2858: @file{policy.h}.
        !          2859: 
        !          2860: @item commands @var{strings}
        !          2861: @findex commands
        !          2862: 
        !          2863: The list of commands which the remote system is permitted to execute
        !          2864: locally.  For example: @samp{commands rnews rmail}.  If the value is
        !          2865: @samp{ALL} (case significant), all commands may be executed.  The
        !          2866: default is @samp{rnews rmail}.
        !          2867: 
        !          2868: @item free-space @var{number}
        !          2869: @findex free-space
        !          2870: 
        !          2871: Specify the minimum amount of file system space (in bytes) to leave free
        !          2872: after receiving a file.  If the incoming file will not fit, it will be
        !          2873: rejected.  This initial rejection will only work when talking to another
        !          2874: instance of this package, since older UUCP packages do not provide the
        !          2875: file size of incoming files.  Also, while a file is being received,
        !          2876: @code{uucico} will periodically check the amount of free space.  If it
        !          2877: drops below the amount given by the @code{free-space} command, the file
        !          2878: transfer will be aborted.  The default amount of space to leave free is
        !          2879: from @file{policy.h}.  This file space checking may not work on all
        !          2880: systems.
        !          2881: 
        !          2882: @item pubdir @var{string}
        !          2883: @findex pubdir in sys file
        !          2884: 
        !          2885: Specifies the public directory that is used when @kbd{~} is specifed in
        !          2886: a file transfer or a list of directories.  This essentially overrides
        !          2887: the public directory specified in the main configuration file for this
        !          2888: system only.  The default is the public directory specified in the main
        !          2889: configuration file (which defaults to a value from @file{policy.h}).
        !          2890: 
        !          2891: @item debug @var{string} @dots{}
        !          2892: @findex debug in sys file
        !          2893: 
        !          2894: Set additional debugging for calls to or from the system.  This may be
        !          2895: used to debug a connection with a specific system.  It is particularly
        !          2896: useful when debugging incoming calls, since debugging information will
        !          2897: be generated whenever the call comes in.  See the @code{debug} command
        !          2898: in the main configuration file (@pxref{Debugging Levels}) for more
        !          2899: details.  The debugging information specified here is in addition to
        !          2900: that specified in the main configuration file or on the command line.
        !          2901: 
        !          2902: @item max-remote-debug @var{string} @dots{}
        !          2903: @findex max-remote-debug
        !          2904: 
        !          2905: When the system calls in, it may request that the debugging level be set
        !          2906: to a certain value.  This command may be used to put a limit on the
        !          2907: debugging level which the system may request, to avoid filling up the
        !          2908: disk with debugging information.  Only the debugging types named in the
        !          2909: @code{max-remote-debug} command may be turned on by the remote system.
        !          2910: To prohibit any debugging, use @samp{max-remote-debug none}.  The
        !          2911: default is @samp{abnormal,chat,handshake}; to turn off these default
        !          2912: entries, you must use @samp{max-remote-debug none} followed by other
        !          2913: @code{max-remote-debug} commands specifying the settings you want.
        !          2914: 
        !          2915: @end table
        !          2916: 
        !          2917: @node Default sys File Values,  , Miscellaneous (sys), sys File
        !          2918: @subsection Default sys File Values
        !          2919: 
        !          2920: The following are used as default values for all systems; they can be
        !          2921: considered as appearing before the start of the file.
        !          2922: 
        !          2923: @example
        !          2924: time Never
        !          2925: chat "" \r\c ogin:-BREAK-ogin:-BREAK-ogin: \L word: \P
        !          2926: chat-timeout 10
        !          2927: callback n
        !          2928: sequence n
        !          2929: request y
        !          2930: transfer y
        !          2931: local-send /
        !          2932: remote-send ~
        !          2933: local-receive ~
        !          2934: remove-receive ~
        !          2935: command-path [ from @file{policy.h} ]
        !          2936: commands rnews rmail
        !          2937: max-remote-debug abnormal,chat,handshake
        !          2938: @end example
        !          2939: 
        !          2940: @node port File, dial File, sys File, Configuration Files
        !          2941: @section The Port Configuration File
        !          2942: @cindex port file
        !          2943: @cindex port configuration file
        !          2944: @cindex configuration file (port)
        !          2945: 
        !          2946: The port files may be used to name and describe ports.  Any commands in
        !          2947: the file before the first @code{port} command specify defaults for all
        !          2948: ports in the file.  All commands after a @code{port} command up to the
        !          2949: next @code{port} command then describe that port.  There are different
        !          2950: types of ports; each type supports its own set of commands.  Each
        !          2951: command indicates which types of ports support it.  There may be many
        !          2952: ports with the same name; if a system requests a port by name then each
        !          2953: port with that name will be tried until an unlocked one is found.
        !          2954: 
        !          2955: @table @code
        !          2956: 
        !          2957: @item port @var{string}
        !          2958: @findex port in port file
        !          2959: 
        !          2960: Introduces and names a port.
        !          2961: 
        !          2962: @item type @var{string}
        !          2963: @findex type
        !          2964: 
        !          2965: Define the type of port.  The default is @samp{modem}.  If this command
        !          2966: appears, it must immediately follow the @code{port} command.  The type defines
        !          2967: what commands are subsequently allowed.  Currently the types are:
        !          2968: 
        !          2969: @table @samp
        !          2970: @item modem
        !          2971: For a modem hookup.
        !          2972: @item stdin
        !          2973: For a connection through standard input and standard output, as when
        !          2974: @code{uucico} is run as a login shell.
        !          2975: @item direct
        !          2976: For a direct connection to another system.
        !          2977: @item tcp
        !          2978: For a connection using TCP.
        !          2979: @item tli
        !          2980: For a connection using TLI.
        !          2981: @end table
        !          2982: 
        !          2983: @item protocol @var{string}
        !          2984: @findex protocol in port file
        !          2985: 
        !          2986: Specify a list of protocols to use for this port.  This is just like the
        !          2987: corresponding command for a system (@pxref{Protocol Selection}).  A
        !          2988: protocol list for a system takes precedence over a list for a port.
        !          2989: 
        !          2990: @item protocol-parameter @var{character} @var{strings} [ any type ]
        !          2991: @findex protocol-parameter in port file
        !          2992: 
        !          2993: The same command as the @code{protocol-parameter} command used for
        !          2994: systems (@pxref{Protocol Selection}).  This one takes precedence.
        !          2995: 
        !          2996: @item seven-bit @var{boolean} [ any type ]
        !          2997: @findex seven-bit in port file
        !          2998: 
        !          2999: This is only used during protocol negotiation; if the argument is true,
        !          3000: it forces the selection of a protocol which works across a seven-bit
        !          3001: link.  It does not prevent eight bit characters from being transmitted.
        !          3002: The default is false.
        !          3003: 
        !          3004: @item reliable @var{boolean} [ any type ]
        !          3005: @findex reliable in port file
        !          3006: 
        !          3007: This is only used during protocol negotiation; if the argument is
        !          3008: false, it forces the selection of a protocol which works across
        !          3009: an unreliable communication link.  The default is true.  It would
        !          3010: be more common to specify this for a dialer rather than a port.
        !          3011: 
        !          3012: @item half-duplex @var{boolean} [ any type ]
        !          3013: @findex half-duplex in port file
        !          3014: 
        !          3015: If the argument is true, it means that the port only supports
        !          3016: half-duplex connections.  This only affects bidirectional protocols, and
        !          3017: causes them to not do bidirectional transfers.
        !          3018: 
        !          3019: @item device @var{string} [ modem, direct and tli only ]
        !          3020: @findex device
        !          3021: 
        !          3022: Names the device associated with this port.  If the device is not named,
        !          3023: the port name is taken as the device.  Device names are system
        !          3024: dependent.  On Unix, a modem or direct connection might be something
        !          3025: like @file{/dev/ttyd0}; a TLI port might be @file{/dev/inet/tcp}.
        !          3026: 
        !          3027: @item baud @var{number} [ modem and direct only ]
        !          3028: @findex baud in port file
        !          3029: @itemx speed @var{number} [modem and direct only ]
        !          3030: @findex speed in port file
        !          3031: 
        !          3032: The speed this port runs at.  If a system specifies a speed but no port
        !          3033: name, then all ports which match the speed will be tried in order.  If
        !          3034: the speed is not specified here and is not specified by the system, the
        !          3035: natural speed of the port will be used by default.
        !          3036: 
        !          3037: @item baud-range @var{number} @var{number} [ modem only ]
        !          3038: @findex baud-range
        !          3039: @itemx speed-range @var{number} @var{number} [ modem only ]
        !          3040: @findex speed-range
        !          3041: 
        !          3042: Specify a range of speeds this port can run at.  The first number is the
        !          3043: minimum speed, the second number is the maximum speed.  These numbers
        !          3044: will be used when matching a system which specifies a desired speed.
        !          3045: The simple @code{speed} (or @code{baud}) command is still used to
        !          3046: determine the speed to run at if the system does not specify a speed.
        !          3047: For example, the command @samp{speed-range 300 19200} means that the
        !          3048: port will match any system which uses a speed from 300 to 19200 baud
        !          3049: (and will use the speed specified by the system); this could be combined
        !          3050: with @samp{speed 2400}, which means that when this port is used with a
        !          3051: system that does not specify a speed, the port will be used at 2400
        !          3052: baud.
        !          3053: 
        !          3054: @item carrier @var{boolean} [ modem only ]
        !          3055: @findex carrier in port file
        !          3056: 
        !          3057: The argument indicates whether the port supports carrier.  If it does
        !          3058: not, carrier will never be required on this port, regardless of what the
        !          3059: modem chat script indicates.  The default is true.
        !          3060: 
        !          3061: @item dial-device @var{string} [ modem only ]
        !          3062: @findex dial-device
        !          3063: 
        !          3064: Dialing instructions should be output to the named device, rather than
        !          3065: to the normal port device.  The default is to output to the normal port
        !          3066: device.
        !          3067: 
        !          3068: @item dialer @var{string} [ modem only ]
        !          3069: @findex dialer in port file
        !          3070: 
        !          3071: Name a dialer to use.  The information is looked up in the dialer file.
        !          3072: There is no default.  Some sort of dialer information must be specified
        !          3073: to call out on a modem.
        !          3074: 
        !          3075: @item dialer @var{string} @dots{} [ modem only ]
        !          3076: 
        !          3077: Execute a dialer command.  If a dialer is named (by using the first form
        !          3078: of this command, described just above), these commands are ignored.
        !          3079: They may be used to specify dialer information directly in simple
        !          3080: situations without needing to go to a separate file.  There is no
        !          3081: default.  Some sort of dialer information must be specified to call out
        !          3082: on a modem.
        !          3083: 
        !          3084: @item dialer-sequence @var{strings} [ modem or tli only ]
        !          3085: @findex dialer-sequence
        !          3086: 
        !          3087: Name a sequence of dialers and tokens (phone numbers) to use.  The first
        !          3088: argument names a dialer, and the second argument names a token.  The
        !          3089: third argument names another dialer, and so on.  If there are an odd
        !          3090: number of arguments, the phone number specified with a @code{phone}
        !          3091: command in the system file is used as the final token.  The token is
        !          3092: what is used for @kbd{\D} or @kbd{\T} in the dialer chat script.  If the
        !          3093: token in this string is @kbd{\D}, the system phone number will be used;
        !          3094: if it is @kbd{\T}, the system phone number will be used after undergoing
        !          3095: dialcodes translation.  A missing final token is taken as @kbd{\D}.
        !          3096: 
        !          3097: This command currently does not work if @code{dial-device} is specified;
        !          3098: to handle this correctly will require a more systematic notion of chat
        !          3099: scripts.  Moreover, only the @code{complete} and @code{abort} chat
        !          3100: scripts from the first dialer specified are used, and only the protocol
        !          3101: parameters from the first dialer are used.
        !          3102: 
        !          3103: This command basically lets you specify a sequence of chat scripts to
        !          3104: use.  For example, the first dialer might get you to a local network and
        !          3105: the second dialer might describe how to select a machine from the local
        !          3106: network.  This lets you break your dialing sequence into simple modules,
        !          3107: and may make it easier to share dialer entries between machines.
        !          3108: 
        !          3109: When this command is used with a TLI port, then if the first dialer is
        !          3110: @samp{TLI} or @samp{TLIS} the first token is used as the address to
        !          3111: connect to.  If the first dialer is something else, or if there is no
        !          3112: token, the address given by the @code{address} command is used
        !          3113: (@pxref{Placing the Call}).  Escape sequences in the address are
        !          3114: expanded as they are for chat script expect strings (@pxref{Chat
        !          3115: Scripts}).  The different between @samp{TLI} and @samp{TLIS} is that the
        !          3116: latter implies the command @samp{stream true}.  These contortions are
        !          3117: all for HDB compatibility.  Any subsequent dialers are treated as they
        !          3118: are for a modem.
        !          3119: 
        !          3120: @item lockname @var{string} [ modem and direct only ]
        !          3121: @findex lockname
        !          3122: 
        !          3123: Give the name to use when locking this port.  On Unix, this is the name
        !          3124: of the file that will be created in the lock directory.  It is used as
        !          3125: is, so on Unix it should generally start with @samp{LCK..}.  For
        !          3126: example, if a single port were named both @file{/dev/ttycu0} and
        !          3127: @file{/dev/tty0} (perhaps with different characteristics keyed on the
        !          3128: minor device number), then the command @code{lockname LCK..ttycu0} could
        !          3129: be used to force the latter to use the same lock file name as the
        !          3130: former.
        !          3131: 
        !          3132: @item service @var{string} [ tcp only ]
        !          3133: @findex service
        !          3134: 
        !          3135: Name the TCP port number to use.  This may be a number.  If not, it will
        !          3136: be looked up in @file{/etc/services}.  If this is not specified, the
        !          3137: string @samp{uucp} is looked up in @file{/etc/services}.  If it is not
        !          3138: found, port number 540 (the standard UUCP-over-TCP port number) will be
        !          3139: used.
        !          3140: 
        !          3141: @item push @var{strings} [ tli only ]
        !          3142: @findex push
        !          3143: 
        !          3144: Give a list of modules to push on to the TLI stream.
        !          3145: 
        !          3146: @item stream @var{boolean} [ tli only ]
        !          3147: @findex stream
        !          3148: 
        !          3149: If this is true, and the @code{push} command was not used, the
        !          3150: @samp{tirdwr} module is pushed on to the TLI stream.
        !          3151: 
        !          3152: @item server-address @var{string} [ tli only ]
        !          3153: 
        !          3154: Give the address to use when running as a TLI server.  Escape sequences
        !          3155: in the address are expanded as they are for chat script expect strings
        !          3156: (@pxref{Chat Scripts}).
        !          3157: 
        !          3158: @end table
        !          3159: 
        !          3160: @node dial File, Security, port File, Configuration Files
        !          3161: @section The Dialer Configuration File
        !          3162: @cindex dial file
        !          3163: @cindex dialer configuration file
        !          3164: @cindex configuration file (dial)
        !          3165: 
        !          3166: The dialer configuration files define dialers.  Any commands in the file
        !          3167: before the first @code{dialer} command specify defaults for all the
        !          3168: dialers in the file.  All commands after a @code{dialer} command up to
        !          3169: the next @code{dialer} command are associated with the named dialer.
        !          3170: 
        !          3171: @table @code
        !          3172: 
        !          3173: @item dialer @var{string}
        !          3174: @findex dialer in dial file
        !          3175: 
        !          3176: Introduces and names a dialer.
        !          3177: 
        !          3178: @item chat @var{strings}
        !          3179: @findex chat in dial file
        !          3180: @item chat-timeout @var{number}
        !          3181: @findex chat-timeout in dial file
        !          3182: @item chat-fail @var{string}
        !          3183: @findex chat-fail in dial file
        !          3184: @item chat-seven-bit @var{boolean}
        !          3185: @findex chat-seven-bit in dial file
        !          3186: @item chat-program @var{strings}
        !          3187: @findex chat-program in dial file
        !          3188: 
        !          3189: Specify a chat script to be used to dial the phone.  See @ref{Chat
        !          3190: Scripts} for full details on chat scripts.
        !          3191: 
        !          3192: Taylor UUCP will sleep for one second between attempts to dial out on a
        !          3193: modem.  If your modem requires a longer wait period, you must start your
        !          3194: chat script with delays (@samp{\d} in a send string).
        !          3195: 
        !          3196: The chat script will be read from and sent to the port specified by the
        !          3197: @code{dial-device} command for the port, if there is one.
        !          3198: 
        !          3199: The following escape addition escape sequences may appear in send
        !          3200: strings:
        !          3201: 
        !          3202: @table @kbd
        !          3203: @item \D
        !          3204: send phone number without dialcode translation
        !          3205: @item \T
        !          3206: send phone number with dialcode translation
        !          3207: @item \M
        !          3208: do not require carrier
        !          3209: @item \m
        !          3210: require carrier (fail if not present)
        !          3211: @end table
        !          3212: 
        !          3213: See the description of the dialcodes file (@pxref{Configuration File
        !          3214: Names}) for a description of dialcode translation.  If the port does not
        !          3215: support carrier (as set by the @code{carrier} command in the port file)
        !          3216: @kbd{\M} and @kbd{\m} are ignored.  If both the port and the dialer
        !          3217: support carrier (as set by the @code{carrier} command in the port file
        !          3218: and the @code{carrier} command in the dialer file), then every chat
        !          3219: script implicitly begins with @kbd{\M} and ends with @kbd{\m}.  There is
        !          3220: no default chat script for dialers.
        !          3221: 
        !          3222: The following additional escape sequences may be used in
        !          3223: @code{chat-program}:
        !          3224: 
        !          3225: @table @kbd
        !          3226: @item \D
        !          3227: phone number without dialcode translation
        !          3228: @item \T
        !          3229: phone number with dialcode translation
        !          3230: @end table
        !          3231: 
        !          3232: If the program changes the port in any way (e.g., sets parity) the
        !          3233: changes will be preserved during protocol negotiation, but once the
        !          3234: protocol is selected it will change the port settings.
        !          3235: 
        !          3236: @item dialtone @var{string}
        !          3237: @findex dialtone
        !          3238: 
        !          3239: A string to output when dialing the phone number which causes the modem
        !          3240: to wait for a secondary dial tone.  This is used to translate the
        !          3241: @kbd{=} character in a phone number.  The default is a comma.
        !          3242: 
        !          3243: @item pause @var{string}
        !          3244: @findex pause
        !          3245: 
        !          3246: A string to output when dialing the phone number which causes the modem
        !          3247: to wait for 1 second.  This is used to translate the @kbd{-} character
        !          3248: in a phone number.  The default is a comma.
        !          3249: 
        !          3250: @item carrier @var{boolean}
        !          3251: @findex carrier in dial file
        !          3252: 
        !          3253: If the argument is true, the dialer supports the modem carrier signal.
        !          3254: After the phone number is dialed, @code{uucico} will require that
        !          3255: carrier be on.  One some systems, it will be able to wait for it.  If
        !          3256: the argument is false, carrier will not be required.  The default is
        !          3257: true.
        !          3258: 
        !          3259: @item carrier-wait @var{number}
        !          3260: @findex carrier-wait
        !          3261: 
        !          3262: If the port is supposed to wait for carrier, this may be used to
        !          3263: indicate how many seconds to wait.  The default is 60 seconds.  Only
        !          3264: some systems support waiting for carrier.
        !          3265: 
        !          3266: @item dtr-toggle @var{boolean} @var{boolean}
        !          3267: @findex dtr-toggle
        !          3268: 
        !          3269: If the first argument is true, then DTR is toggled before using
        !          3270: the modem.  This is only supported on some systems and some ports.  The
        !          3271: second @var{boolean} need not be present; if it is, and it is
        !          3272: true, the program will sleep for 1 second after toggling DTR.
        !          3273: The default is not to toggle DTR.
        !          3274: 
        !          3275: @item complete-chat @var{strings}
        !          3276: @findex complete-chat
        !          3277: @item complete-chat-timeout @var{number}
        !          3278: @findex complete-chat-timeout
        !          3279: @item complete-chat-fail @var{string}
        !          3280: @findex complete-chat-fail
        !          3281: @item complete-chat-seven-bit @var{boolean}
        !          3282: @findex complete-chat-seven-bit
        !          3283: @item complete-chat-program @var{strings}
        !          3284: @findex complete-chat-program
        !          3285: 
        !          3286: These commands define a chat script (@pxref{Chat Scripts}) which is run
        !          3287: when a call is finished normally.  This allows the modem to be reset.
        !          3288: There is no default.  No additional escape sequences may be used.
        !          3289: 
        !          3290: @item complete @var{string}
        !          3291: @findex complete
        !          3292: 
        !          3293: This is a simple use of @code{complete-chat}.  It is equivalent to
        !          3294: @code{complete-chat "" @var{string}}; this has the effect of sending
        !          3295: @var{string} to the modem when a call finishes normally.
        !          3296: 
        !          3297: @item abort-chat @var{strings}
        !          3298: @findex abort-chat
        !          3299: @item abort-chat-timeout @var{number}
        !          3300: @findex abort-chat-timeout
        !          3301: @item abort-chat-fail @var{string}
        !          3302: @findex abort-chat-fail
        !          3303: @item abort-chat-seven-bit @var{boolean}
        !          3304: @findex abort-chat-seven-bit
        !          3305: @item abort-chat-program @var{strings}
        !          3306: @findex abort-chat-program
        !          3307: 
        !          3308: These commands define a chat script (@pxref{Chat Scripts}) to be run
        !          3309: when a call is aborted.  They may be used to interrupt and reset the
        !          3310: modem.  There is no default.  No additional escape sequences may be
        !          3311: used.
        !          3312: 
        !          3313: @item abort @var{string}
        !          3314: @findex abort
        !          3315: 
        !          3316: This is a simple use of @code{abort-chat}.  It is equivalent to
        !          3317: @code{abort-chat "" @var{string}}; this has the effect of sending
        !          3318: @var{string} to the modem when a call is aborted.
        !          3319: 
        !          3320: @item protocol-parameter @var{character} @var{strings}
        !          3321: @findex protocol-parameter in dial file
        !          3322: 
        !          3323: Set protocol parameters, just like the @code{protocol-parameter} command
        !          3324: in the system configuration file or the port configuration file; see
        !          3325: @ref{Protocol Selection}.  These parameters take precedence, then those
        !          3326: for the port, then those for the system.
        !          3327: 
        !          3328: @item seven-bit @var{boolean}
        !          3329: @findex seven-bit in dial file
        !          3330: 
        !          3331: This is only used during protocol negotiation; if it is true, it
        !          3332: forces selection of a protocol which works across a seven-bit link.  It
        !          3333: does not prevent eight bit characters from being transmitted.  The
        !          3334: default is false.  It would be more common to specify this for a
        !          3335: port than for a dialer.
        !          3336: 
        !          3337: @item reliable @var{boolean}
        !          3338: @findex reliable in dial file
        !          3339: 
        !          3340: This is only used during protocol negotiation; if it is false, it
        !          3341: forces selection of a protocol which works across an unreliable
        !          3342: communication link.  The default is true.
        !          3343: 
        !          3344: @item half-duplex @var{boolean} [ any type ]
        !          3345: @findex half-duplex in dial file
        !          3346: 
        !          3347: If the argument is true, it means that the dialer only supports
        !          3348: half-duplex connections.  This only affects bidirectional protocols, and
        !          3349: causes them to not do bidirectional transfers.
        !          3350: 
        !          3351: @end table
        !          3352: 
        !          3353: @node Security,  , dial File, Configuration Files
        !          3354: @section Security
        !          3355: 
        !          3356: This discussion of UUCP security applies only to Unix.  It is a bit
        !          3357: cursory; suggestions for improvement are solicited.
        !          3358: 
        !          3359: UUCP is traditionally not very secure.  Taylor UUCP addresses some
        !          3360: security issues, but is still far from being a secure system.
        !          3361: 
        !          3362: If security is very important to you, then you should not permit any
        !          3363: external access to your computer, including UUCP.  Any opening to the
        !          3364: outside world is a potential security risk.
        !          3365: 
        !          3366: By default Taylor UUCP provides few mechanisms to secure local users of
        !          3367: the system from each other.  You can allow increased security by putting
        !          3368: the owner of the UUCP programs (normally @code{uucp}) into a separate
        !          3369: group; the use of this is explained in the following paragraphs, which
        !          3370: refer to this separate group as @code{uucp-group}.
        !          3371: 
        !          3372: When the @code{uucp} program is invoked to copy a file to a remote
        !          3373: system, it will by default copy the file into the UUCP spool directory.
        !          3374: When the @code{uux} program is used, the @samp{-C} switch must be used
        !          3375: to copy the file into the UUCP spool directory.  In any case, once the
        !          3376: file has been copied into the spool directory, other local users will
        !          3377: not be able to access it.
        !          3378: 
        !          3379: When a file is requested from a remote system, UUCP will only permit it
        !          3380: to be placed in a directory which is writable by the requesting user.
        !          3381: The directory must also be writable by UUCP.  A local user can create a
        !          3382: directory with a group of @code{uucp-group} and set the mode to permit
        !          3383: group write access.  This will allow the file be requested without
        !          3384: permitting it to be viewed by any other user.
        !          3385: 
        !          3386: There is no provision for security for @code{uucp} requests (as opposed
        !          3387: to @code{uux} requests) made by a user on a remote system.  A file sent
        !          3388: over by a remote request may only be placed in a directory which is
        !          3389: world writable, and the file will be world readable and writable.  This
        !          3390: will permit any local user to destroy or replace the contents of the
        !          3391: file.  A file requested by a remote system must be world readable, and
        !          3392: the directory it is in must be world readable.  Any local user will be
        !          3393: able to examine, although not necessarily modify, the file before it is
        !          3394: sent.
        !          3395: 
        !          3396: There are some security holes and race conditions that apply to the
        !          3397: above discussion which I will not elaborate on.  They are not hidden
        !          3398: from anybody who reads the source code, but they are somewhat technical
        !          3399: and difficult (though scarcely impossible) to exploit.  Suffice it to
        !          3400: say that even under the best of conditions UUCP is not completely
        !          3401: secure.
        !          3402: 
        !          3403: For many sites, security from remote sites is a more important
        !          3404: consideration.  Fortunately, Taylor UUCP does provide some support in
        !          3405: this area.
        !          3406: 
        !          3407: The greatest security is provided by always dialing out to the other
        !          3408: site.  This prevents anybody from pretending to be the other site.  Of
        !          3409: course, only one side of the connection can do this.
        !          3410: 
        !          3411: If remote dialins must be permitted, then it is best if the dialin line
        !          3412: is used only for UUCP.  If this is the case, then you should create a
        !          3413: call-in password file (@pxref{Configuration File Names}) and let
        !          3414: @code{uucico} do its own login prompting.  For example, to let remote
        !          3415: sites log in on a port named @samp{entry} in the port file (@pxref{port
        !          3416: File}) you might invoke @samp{uucico -p entry}.  This would cause
        !          3417: @code{uucico} to enter an endless loop of login prompts and daemon
        !          3418: executions.  The advantage of this approach is that even if remote users
        !          3419: break into the system by guessing or learning the password, they will
        !          3420: only be able to do whatever @code{uucico} permits them to do.  They will
        !          3421: not be able to start a shell on your system.
        !          3422: 
        !          3423: If remote users can dial in and log on to your system, then you have a
        !          3424: security hazard more serious than that posed by UUCP.  But then, you
        !          3425: probably knew that already.
        !          3426: 
        !          3427: Once your system has connected with the remote UUCP, there is a fair
        !          3428: amount of control you can exercise.  You can use the @code{remote-send}
        !          3429: and @code{remote-receive} commands to control the directories the remote
        !          3430: UUCP can access.  You can use the @code{request} command to prevent the
        !          3431: remote UUCP from making any requests of your system at all; however, if
        !          3432: you do this it will not even be able to send you mail or news.  If you
        !          3433: do permit remote requests, you should be careful to restrict what
        !          3434: commands may be executed at the remote system's request.  The default is
        !          3435: @code{rmail} and @code{rnews}, which will suffice for most systems.
        !          3436: 
        !          3437: If different remote systems call in and they must be granted different
        !          3438: privileges (perhaps some systems are within the same organization and
        !          3439: some are not) then the @code{called-login} command should be used for
        !          3440: each system to require that they different login names.  Otherwise it
        !          3441: would be simple for a remote system to use the @code{myname} command and
        !          3442: pretend to be a different system.  The @code{sequence} command can be
        !          3443: used to detect when one system pretended to be another, but since the
        !          3444: sequence numbers must be reset manually after a failed handshake this
        !          3445: can sometimes be more trouble than it's worth.
        !          3446: 
        !          3447: @node Protocols, Hacking, Configuration Files, Top
        !          3448: @chapter UUCP protocol internals
        !          3449: 
        !          3450: This chapter describes how the various UUCP protocols work, and
        !          3451: discusses some other internal UUCP issues.
        !          3452: 
        !          3453: This chapter is quite technical.  You do not need to understand it, or
        !          3454: even read it, in order to use Taylor UUCP.  It is intended for people
        !          3455: who are interested in how UUCP code works.
        !          3456: 
        !          3457: This chapter is also, unfortunately, somewhat out of date, although I
        !          3458: believe that is incomplete rather than inaccurate.  I post this
        !          3459: information to the newsgroups @samp{comp.mail.uucp} and
        !          3460: @samp{news.answers} each month; if you want to write code based on this
        !          3461: information, please get the most recent copy.
        !          3462: 
        !          3463: Most of the discussion covers the protocols used by all UUCP packages,
        !          3464: not just Taylor UUCP.  Any information specific to Taylor UUCP is
        !          3465: indicated as such.  There are some pointers to the actual functions in
        !          3466: the Taylor UUCP source code, for those who are extremely interested in
        !          3467: actual UUCP implementation.
        !          3468: 
        !          3469: @menu
        !          3470: * Grades::                      UUCP grades
        !          3471: * Lock Files::                  UUCP lock file format
        !          3472: * UUCP Protocol::               The common UUCP protocol
        !          3473: * g Protocol::                  The UUCP @samp{g} protocol
        !          3474: * f Protocol::                  The UUCP @samp{f} protocol
        !          3475: * t Protocol::                  The UUCP @samp{t} protocol
        !          3476: * e Protocol::                  The UUCP @samp{e} protocol
        !          3477: * x Protocol::                  The UUCP @samp{x} protocol
        !          3478: * d Protocol::                  The UUCP @samp{d} protocol
        !          3479: * Capital G Protocol::          The UUCP @samp{G} protocol
        !          3480: * Documentation References::    Documentation references
        !          3481: @end menu
        !          3482: 
        !          3483: @node Grades, Lock Files, Protocols, Protocols
        !          3484: @section UUCP Grades
        !          3485: @cindex grades
        !          3486: 
        !          3487: Modern UUCP packages support grades for each command.  The grades
        !          3488: generally range from @samp{A} (the highest) to @samp{Z} followed by
        !          3489: @samp{a} to @samp{z}.  Taylor UUCP also supports @samp{0} to @samp{9}
        !          3490: before @samp{A}.  Some UUCP packages may permit any ASCII character as a
        !          3491: grade.
        !          3492: 
        !          3493: On Unix, these grades are encoded in the name of the command file.  A
        !          3494: command file name generally has the form
        !          3495: 
        !          3496: @example
        !          3497: C.nnnngssss
        !          3498: @end example
        !          3499: 
        !          3500: @noindent
        !          3501: where @var{nnnn} is the remote system name for which the command is
        !          3502: queued, @var{g} is a single character grade, and @var{ssss} is a four
        !          3503: character sequence number.  For example, a command file created for the
        !          3504: system @file{airs} at grade @samp{Z} might be named
        !          3505: 
        !          3506: @example
        !          3507: C.airsZ2551
        !          3508: @end example
        !          3509: 
        !          3510: The remote system name will be truncated to seven characters, to ensure
        !          3511: that the command file name will fit in the 14 character file name limit
        !          3512: of the traditional Unix file system.  UUCP packages which have no other
        !          3513: means of distinguishing which command files are intended for which
        !          3514: systems thus require all @emph{systems they connect to} to have names
        !          3515: that are unique in the first seven characters.  Some UUCP packages use a
        !          3516: variant of this format which truncates the system name to six
        !          3517: characters.  HDB uses a different spool directory format, which allows
        !          3518: up to fourteen characters to be used for each system name.  The Taylor
        !          3519: UUCP spool directory format is configurable.  The new Taylor spool
        !          3520: directory format permits system names to be as long as file names; the
        !          3521: maximum length of a file name depends on the particular Unix file system
        !          3522: being used.
        !          3523: 
        !          3524: The sequence number in the command file name may be a decimal integer,
        !          3525: or it may be a hexadecimal integer, or it may contain any alphanumeric
        !          3526: character.  Different UUCP packages are different.
        !          3527: 
        !          3528: Taylor UUCP creates command files in the function
        !          3529: @code{zsysdep_spool_commands}.  The file name is constructed by the
        !          3530: function @code{zsfile_name}, which knows about all the different types
        !          3531: of spool directories supported by Taylor UUCP.  The Taylor UUCP sequence
        !          3532: number can contain any alphanumeric character; the next sequence number
        !          3533: is determined by the function @code{fscmd_seq}.
        !          3534: 
        !          3535: I do not know how command grades are handled in non-Unix UUCP
        !          3536: packages.
        !          3537: 
        !          3538: Modern UUCP packages allow you to restrict file transfer by grade
        !          3539: depending on the time of day.  Typically this is done with a line in
        !          3540: the @file{Systems} (or @file{L.sys}) file like this:
        !          3541: 
        !          3542: @example
        !          3543: airs Any/Z,Any2305-0855 ...
        !          3544: @end example
        !          3545: 
        !          3546: This allows only grades @samp{Z} and above to be transferred at any
        !          3547: time.  Lower grades may only be transferred at night.  I believe that
        !          3548: this grade restriction applies to local commands as well as to remote
        !          3549: commands, but I am not sure.  It may only apply if the UUCP package
        !          3550: places the call, not if it is called by the remote system.  Taylor UUCP
        !          3551: can use the @code{timegrade} and @code{call-timegrade} commands
        !          3552: (@pxref{When to Call}) to achieve the same effect (and supports the
        !          3553: above format when reading @file{Systems} or @file{L.sys}).
        !          3554: 
        !          3555: This sort of grade restriction is most useful if you know what grades
        !          3556: are being used at the remote site.  The default grades used depend on
        !          3557: the UUCP package.  Generally @code{uucp} and @code{uux} have different
        !          3558: defaults.  A particular grade can be specified with the @samp{-g} option
        !          3559: to @code{uucp} or @code{uux}.  For example, to request execution of
        !          3560: rnews on airs with grade @samp{d}, you might use something like
        !          3561: 
        !          3562: @example
        !          3563: uux -gd - airs!rnews <article
        !          3564: @end example
        !          3565: 
        !          3566: @samp{uunet} queues up mail at grade @samp{Z} and news at grade
        !          3567: @samp{d}.  The example above would allow mail to be received at any
        !          3568: time, but would only permit news to be transferred at night.
        !          3569: 
        !          3570: @node Lock Files, UUCP Protocol, Grades, Protocols
        !          3571: @section UUCP Lock File Format
        !          3572: @cindex lock files
        !          3573: 
        !          3574: This discussion applies only to Unix.  I have no idea how UUCP locks
        !          3575: ports on other systems.
        !          3576: 
        !          3577: UUCP creates files to lock serial ports and systems.  On most (if not
        !          3578: all) systems, these same lock files are also used by cu to coordinate
        !          3579: access to serial ports.  On some systems getty also uses these lock
        !          3580: files.
        !          3581: 
        !          3582: The lock file normally contains the process ID of the locking process.
        !          3583: This makes it easy to determine whether a lock is still valid.  The
        !          3584: algorithm is to create a temporary file and then link it to the name
        !          3585: that must be locked.  If the link fails because a file with that name
        !          3586: already exists, the existing file is read to get the process ID.  If the
        !          3587: process still exists, the lock attempt fails.  Otherwise the lock file
        !          3588: is deleted and the locking algorithm is retried.
        !          3589: 
        !          3590: Older UUCP packages put the lock files in the main UUCP spool
        !          3591: directory, /usr/spool/uucp.  HDB UUCP generally puts the lock files in
        !          3592: a directory of their own, usually /usr/spool/locks or /etc/locks.
        !          3593: 
        !          3594: The original UUCP lock file format encoded the process ID as a four byte
        !          3595: binary number.  The order of the bytes was host-dependent.  HDB UUCP
        !          3596: stores the process ID as a ten byte ASCII decimal number, with a
        !          3597: trailing newline.  For example, if process 1570 holds a lock file, it
        !          3598: would contain the eleven characters space, space, space, space, space,
        !          3599: space, one, five, seven, zero, newline.  Some versions of UUCP add a
        !          3600: second line indicating which program created the lock (uucp, cu, or
        !          3601: getty).  I have also seen a third type of UUCP lock file which did not
        !          3602: contain the process ID at all.
        !          3603: 
        !          3604: The name of the lock file is generally "LCK.." followed by the base name
        !          3605: of the device.  For example, to lock /dev/ttyd0 the file LCK..ttyd0
        !          3606: would be created.  There are various exceptions.  On SCO Unix, the lock
        !          3607: file name is always forced to lower case even if the device name has
        !          3608: upper case letters.  System V Release 4 UUCP forms the lock file name
        !          3609: using the major and minor device numbers rather than the device name
        !          3610: (this is pretty sensible if you think about it).
        !          3611: 
        !          3612: Taylor UUCP can be configured to use various different types of locking.
        !          3613: The actual locking code is in the function @code{fsdo_lock}.
        !          3614: 
        !          3615: @node UUCP Protocol, g Protocol, Lock Files, Protocols
        !          3616: @section The Common UUCP Protocol
        !          3617: @cindex UUCP protocol
        !          3618: @cindex handshake
        !          3619: @cindex protocol (UUCP)
        !          3620: 
        !          3621: The UUCP protocol is a conversation between two UUCP packages.  A UUCP
        !          3622: conversation consists of three parts: an initial handshake, a series
        !          3623: of file transfer requests, and a final handshake.
        !          3624: 
        !          3625: Before the initial handshake, the caller will usually have logged in the
        !          3626: called machine and somehow started the UUCP package there.  On Unix this
        !          3627: is normally done by setting the shell of the login name used to
        !          3628: @file{uucico}.
        !          3629: 
        !          3630: @menu
        !          3631: * Initial Handshake::           Initial handshake
        !          3632: * File Requests::               File requests
        !          3633: * Final Handshake::             Final handshake
        !          3634: @end menu
        !          3635: 
        !          3636: @node Initial Handshake, File Requests, UUCP Protocol, UUCP Protocol
        !          3637: @subsection Initial Handshake
        !          3638: 
        !          3639: All messages in the initial handshake begin with a @samp{^P} (a byte
        !          3640: with the octal value \020) and end with a null byte (\000).
        !          3641: 
        !          3642: Taylor UUCP implements the initial handshake for the calling machine in
        !          3643: @code{fdo_call}, and for the called machine in @code{faccept_call}.
        !          3644: 
        !          3645: The initial handshake goes as follows.  It is begun by the called
        !          3646: machine.
        !          3647: 
        !          3648: @table @asis
        !          3649: 
        !          3650: @item called: @samp{\020Shere=@var{hostname}\000}
        !          3651: The @var{hostname} is the UUCP name of the called machine.  Older UUCP
        !          3652: packages do not output it, and simply send @samp{\020Shere\000}.
        !          3653: 
        !          3654: @item caller: @samp{\020S@var{hostname} @var{options}\000}
        !          3655: The @var{hostname} is the UUCP name of the calling machine.  The
        !          3656: following @var{options} may appear (or there may be none):
        !          3657: 
        !          3658: @table @samp
        !          3659: 
        !          3660: @item -Q@var{seq}
        !          3661: Report sequence number for this conversation.  The sequence number is
        !          3662: stored at both sites, and incremented after each call.  If there is a
        !          3663: sequence number mismatch, something has gone wrong (somebody may have
        !          3664: broken security by pretending to be one of the machines) and the call is
        !          3665: denied.  If the sequence number changes on one of the machines, perhaps
        !          3666: because of an attempted breakin or because a disk backup was restored,
        !          3667: the sequence numbers on the two machines must be reconciled manually.
        !          3668: 
        !          3669: @item -x@var{level}
        !          3670: Requests the called system to set its debugging level to the specified
        !          3671: value.  This is not supported by all systems.  Taylor UUCP currently
        !          3672: never generates this switch.  When it sees it, it restricts the value
        !          3673: according to @code{max-remote-debug} (@pxref{Miscellaneous (sys)}).
        !          3674: 
        !          3675: @item -p@var{grade}
        !          3676: @itemx -vgrade=@var{grade}
        !          3677: Requests the called system to only transfer files of the specified grade
        !          3678: or higher.  This is not supported by all systems.  Some systems support
        !          3679: @samp{-p}, some support @samp{-vgrade=}.  Taylor UUCP supports both.
        !          3680: 
        !          3681: @item -R
        !          3682: Indicates that the calling UUCP understands how to restart failed file
        !          3683: transmissions.  Supported only by System V Release 4 UUCP.
        !          3684: 
        !          3685: @item -U@var{limit}
        !          3686: Reports the @code{ulimit} value of the calling UUCP.  The limit is
        !          3687: specified as a base 16 number in C notation (e.g., @samp{-U0x1000000}).
        !          3688: This number is the number of 512 byte blocks in the largest file which
        !          3689: the calling UUCP can create.  The called UUCP may not transfer a file
        !          3690: larger than this.  Supported by System V Release 4 UUCP.  Taylor UUCP
        !          3691: understands this option, but never generates it.
        !          3692: 
        !          3693: @item -N
        !          3694: Indicates that the calling UUCP understands the Taylor UUCP size
        !          3695: limiting extensions.  Supported only by Taylor UUCP.
        !          3696: 
        !          3697: @end table
        !          3698: 
        !          3699: @item called: @samp{\020ROK\000}
        !          3700: There are actually several possible responses.
        !          3701: 
        !          3702: @table @samp
        !          3703: 
        !          3704: @item ROK
        !          3705: The calling UUCP is acceptable, and the handshake proceeds to the
        !          3706: protocol negotiation.  Some options may also appear; see below.
        !          3707: 
        !          3708: @item ROKN
        !          3709: The calling UUCP is acceptable, it specified @samp{-N}, and the called
        !          3710: UUCP also understands the Taylor UUCP size limiting extensions.
        !          3711: Supported only by Taylor UUCP.
        !          3712: 
        !          3713: @item RLCK
        !          3714: The called UUCP already has a lock for the calling UUCP, which normally
        !          3715: indicates the two machines are already communicating.
        !          3716: 
        !          3717: @item RCB
        !          3718: The called UUCP will call back.  This may be used to avoid impostors.
        !          3719: Note that only one machine out of each pair should call back, or no
        !          3720: conversation will ever begin.
        !          3721: 
        !          3722: @item RBADSEQ
        !          3723: The call sequence number is wrong (see the @samp{-Q} discussion above).
        !          3724: 
        !          3725: @item RLOGIN
        !          3726: The calling UUCP is using the wrong login name.
        !          3727: 
        !          3728: @item RYou are unknown to me
        !          3729: The calling UUCP is not known to the called UUCP, and the called UUCP
        !          3730: does not permit connections from unknown systems.
        !          3731: 
        !          3732: @end table
        !          3733: 
        !          3734: If the response is @samp{ROK}, the following options are supported by
        !          3735: System V Release 4 UUCP.
        !          3736: 
        !          3737: @table @samp
        !          3738: 
        !          3739: @item -R
        !          3740: The called UUCP knows how to restart failed file transmissions.
        !          3741: 
        !          3742: @item -U@var{limit}
        !          3743: Reports the ulimit value of the called UUCP.  The limit is specified as
        !          3744: a base 16 number in C notation.  This number is the number of 512 byte
        !          3745: blocks in the largest file which the called UUCP can create.  The
        !          3746: calling UUCP may not send a file larger than this.
        !          3747: 
        !          3748: @item -x@var{level}
        !          3749: I'm told that this is sometimes sent by SVR4 UUCP, but I'm not sure
        !          3750: exactly what it means.  It may request the calling UUCP to set its
        !          3751: debugging level to the specified value.
        !          3752: 
        !          3753: @end table
        !          3754: 
        !          3755: If the response is not @samp{ROK} (or @samp{ROKN}) both sides hang up
        !          3756: the phone, abandoning the call.
        !          3757: 
        !          3758: @item called: @samp{\020P@var{protocols}\000}
        !          3759: The @kbd{P} is a literal character.  Note that the called UUCP outputs
        !          3760: two strings in a row.  The @var{protocols} string is a list of UUCP
        !          3761: protocols supported by the caller.  Each UUCP protocol has a single
        !          3762: character name.  For example, the called UUCP might send
        !          3763: @samp{\020Pgf\000}.
        !          3764: 
        !          3765: @item caller: @samp{\020U@var{protocol}\000}
        !          3766: The @kbd{U} is a literal character.  The calling UUCP selects which
        !          3767: @var{protocol} to use out of the protocols offered by the called UUCP.
        !          3768: If there are no mutually supported protocols, the calling UUCP sends
        !          3769: @samp{\020UN\000} and both sides hang up the phone.  Otherwise the
        !          3770: calling UUCP sends something like @samp{\020Ug\000}.
        !          3771: 
        !          3772: @end table
        !          3773: 
        !          3774: Most UUCP packages will consider each locally supported protocol in turn
        !          3775: and select the first one supported by the called UUCP.  With some
        !          3776: versions of HDB UUCP, this can be modified by giving a list of protocols
        !          3777: after the device name in the Devices file or the @file{Systems} file.
        !          3778: Taylor UUCP provides the @code{protocol} command which may be used
        !          3779: either for a system (@pxref{Protocol Selection}) or a port (@pxref{port
        !          3780: File}).
        !          3781: 
        !          3782: After the protocol has been selected and the initial handshake has been
        !          3783: completed, both sides turn on the selected protocol.  For some protocols
        !          3784: (notably @samp{g}) a further handshake is done at this point.
        !          3785: 
        !          3786: Each protocol supports a method for sending a command to the remote
        !          3787: system.  This method is used to transmit a series of commands between
        !          3788: the two UUCP packages.  At all times, one package is the master and the
        !          3789: other is the slave.  Initially, the calling UUCP is the master.
        !          3790: 
        !          3791: If a protocol error occurs during the exchange of commands, both sides
        !          3792: move immediately to the final handshake.
        !          3793: 
        !          3794: @node File Requests, Final Handshake, Initial Handshake, UUCP Protocol
        !          3795: @subsection File Requests
        !          3796: 
        !          3797: The master will send one of four commands: @samp{S}, @samp{R}, @samp{X}
        !          3798: or @samp{H}.
        !          3799: 
        !          3800: Any file name referred to below is either an absolute pathname beginning
        !          3801: with @samp{/}, a public directory pathname beginning with @samp{~/}, a
        !          3802: pathname relative to a user's home directory beginning with
        !          3803: @samp{~@var{user}/}, or a spool directory file name.  File names in the
        !          3804: spool directory are not pathnames, but instead are converted to
        !          3805: pathnames within the spool directory by UUCP.  They always begin with
        !          3806: @samp{C.} (for a command file created by @code{uucp} or @code{uux}),
        !          3807: @samp{D.} (for a data file created by @code{uucp}, @code{uux} or by an
        !          3808: execution, or received from another system for an execution), or
        !          3809: @samp{X.} (for an execution file created by @code{uux} or received from
        !          3810: another system).
        !          3811: 
        !          3812: Taylor UUCP chooses which request to send next in the function
        !          3813: @code{fuucp}.  This is also where Taylor UUCP processes incoming
        !          3814: commands from the remote system.
        !          3815: 
        !          3816: @menu
        !          3817: * S Request::                   S request
        !          3818: * R Request::                   R request
        !          3819: * X Request::                   X request
        !          3820: * H Request::                   H request
        !          3821: @end menu
        !          3822: 
        !          3823: @node S Request, R Request, File Requests, File Requests
        !          3824: @subsubsection S Request
        !          3825: 
        !          3826: master: @samp{S @var{from} @var{to} @var{user} -@var{options} @var{temp}
        !          3827: @var{mode} @var{notify} @var{size}}
        !          3828: 
        !          3829: The @samp{S} and the @samp{-} are literal characters.  This is a request
        !          3830: by the master to send a file to the slave.  Taylor UUCP handles the
        !          3831: @samp{S} request in the file @file{send.c}.
        !          3832: 
        !          3833: @table @var
        !          3834: 
        !          3835: @item from
        !          3836: The name of the file to send.  If the @samp{C} option does not appear in
        !          3837: @var{options}, the master will actually open and send this file.
        !          3838: Otherwise the file has been copied to the spool directory, where it is
        !          3839: named @var{temp}.  The slave ignores this field unless @var{to} is a
        !          3840: directory, in which case the basename of @var{from} will be used as the
        !          3841: file name.  If @var{from} is a spool directory filename, it must be a
        !          3842: data file created for or by an execution, and must begin with @samp{D.}.
        !          3843: 
        !          3844: @item to
        !          3845: The name to give the file on the slave.  If this field names a directory
        !          3846: the file is placed within that directory with the basename of
        !          3847: @var{from}.  A name ending in @samp{/} is taken to be a directory even
        !          3848: if one does not already exist with that name.  If @var{to} begins with
        !          3849: @samp{X.}, an execution file will be created on the slave.  Otherwise,
        !          3850: if @var{to} begins with @samp{D.} it names a data file to be used by
        !          3851: some execution file.  Otherwise, @var{to} should not be in the spool
        !          3852: directory.
        !          3853: 
        !          3854: @item user
        !          3855: The name of the user who requested the transfer.
        !          3856: 
        !          3857: @item options
        !          3858: A list of options to control the transfer.  The following options are
        !          3859: defined (all options are single characters):
        !          3860: 
        !          3861: @table @samp
        !          3862: 
        !          3863: @item C
        !          3864: The file has been copied to the spool directory (the master should use
        !          3865: @var{temp} rather than @var{from}).
        !          3866: 
        !          3867: @item c
        !          3868: The file has not been copied to the spool directory (this is the
        !          3869: default).
        !          3870: 
        !          3871: @item d
        !          3872: The slave should create directories as necessary (this is the default).
        !          3873: 
        !          3874: @item f
        !          3875: The slave should not create directories if necessary, but should fail
        !          3876: the transfer instead.
        !          3877: 
        !          3878: @item m
        !          3879: The master should send mail to @var{user} when the transfer is complete.
        !          3880: 
        !          3881: @item n
        !          3882: The slave should send mail to @var{notify} when the transfer is
        !          3883: complete.
        !          3884: 
        !          3885: @end table
        !          3886: 
        !          3887: @item temp
        !          3888: If the @samp{C} option appears in @var{options}, this names the file to
        !          3889: be sent.  Otherwise if @var{from} is in the spool directory, @var{temp}
        !          3890: is the same as @var{from}.  Otherwise @var{temp} is a dummy string,
        !          3891: normally @samp{D.0}.  After the transfer has been succesfully completed,
        !          3892: the master will delete the file @var{temp}.
        !          3893: 
        !          3894: @item mode
        !          3895: This is an octal number giving the mode of the file on the master.  If
        !          3896: the file is not in the spool directory, the slave will always create it
        !          3897: with mode 0666, except that if (@var{mode} & 0111) is not zero (the file
        !          3898: is executable), the slave will create the file with mode 0777.  If the
        !          3899: file is in the spool directory, some UUCP packages will use the
        !          3900: algorithm above and some will always create the file with mode 0600
        !          3901: (Taylor UUCP does the latter).
        !          3902: 
        !          3903: @item notify
        !          3904: This field is only used if the @samp{n} option appears in @var{options}.
        !          3905: Otherwise, it may not appear, or it may be the string @samp{dummy}, or
        !          3906: it may simply be a pair of double quotes.  If the @samp{n} option is
        !          3907: specified, then when the transfer is successfully completed the slave
        !          3908: will send mail to @var{notify}, which must be a legal mailing address on
        !          3909: the slave.
        !          3910: 
        !          3911: @item size
        !          3912: This field is only present when doing size negotiation, either with
        !          3913: Taylor UUCP or SVR4 UUCP.  It is the size of the file in bytes.  SVR4
        !          3914: UUCP sends the size in base 16 as 0x@dots{} while Taylor UUCP sends the
        !          3915: size as a decimal integer (a later version of Taylor UUCP will probably
        !          3916: change to the SVR4 behaviour).
        !          3917: 
        !          3918: @end table
        !          3919: 
        !          3920: The slave then responds with an S command response.
        !          3921: 
        !          3922: @table @samp
        !          3923: 
        !          3924: @item SY @var{start}
        !          3925: The slave is willing to accept the file, and file transfer begins.  The
        !          3926: @var{start} field will only be present when using SVR4 file restart.  It
        !          3927: specifies the byte offset into the file at which to start sending.  If
        !          3928: this is a new file, @var{start} will be 0x0.
        !          3929: 
        !          3930: @item SN2
        !          3931: The slave denies permission to transfer the file.  This can mean that
        !          3932: the destination directory may not be accessed, or that no requests are
        !          3933: permitted.  It implies that the file transfer will never succeed.
        !          3934: 
        !          3935: @item SN4
        !          3936: The slave is unable to create the necessary temporary file.  This
        !          3937: implies that the file transfer might succeed later.
        !          3938: 
        !          3939: @item SN6
        !          3940: This is only used by Taylor UUCP size negotiation.  It means that the
        !          3941: slave considers the file too large to transfer at the moment, but it may
        !          3942: be possible to transfer it at some other time.
        !          3943: 
        !          3944: @item SN7
        !          3945: This is only used by Taylor UUCP size negotiation.  It means that the
        !          3946: slave considers the file too large to ever transfer.
        !          3947: 
        !          3948: @end table
        !          3949: 
        !          3950: If the slave responds with @samp{SY}, a file transfer begins.  When the
        !          3951: file transfer is complete, the slave sends a @samp{C} command response.
        !          3952: Taylor UUCP generates this confirmation in @code{fprecfile_confirm} and
        !          3953: checks it in @code{fpsendfile_confirm}.
        !          3954: 
        !          3955: @table @samp
        !          3956: 
        !          3957: @item CY
        !          3958: The file transfer was successful.
        !          3959: 
        !          3960: @item CN5
        !          3961: The temporary file could not be moved into the final location.  This
        !          3962: implies that the file transfer will never succeed.
        !          3963: 
        !          3964: @end table
        !          3965: 
        !          3966: After the @samp{C} command response has been received (in the @samp{SY}
        !          3967: case) or immediately (in an @samp{SN} case) the master will send another
        !          3968: command.
        !          3969: 
        !          3970: @node R Request, X Request, S Request, File Requests
        !          3971: @subsubsection R Request
        !          3972: 
        !          3973: master: @samp{R @var{from} @var{to} @var{user} -@var{options}
        !          3974: @var{size}}
        !          3975: 
        !          3976: The @samp{R} and the @samp{-} are literal characters.  This is a request
        !          3977: by the master to receive a file from the slave.  I do not know how SVR4
        !          3978: UUCP implements file transfer restart in this case.  Taylor UUCP
        !          3979: implements the @samp{R} request in the file @file{rec.c}.
        !          3980: 
        !          3981: @table @var
        !          3982: 
        !          3983: @item from
        !          3984: This is the name of the file on the slave which the master wishes to
        !          3985: receive.  It must not be in the spool directory, and it may not contain
        !          3986: any wildcards.
        !          3987: 
        !          3988: @item to
        !          3989: This is the name of the file to create on the master.  I do not believe
        !          3990: that it can be a directory.  It may only be in the spool directory if
        !          3991: this file is being requested to support an execution either on the
        !          3992: master or on some system other than the slave.
        !          3993: 
        !          3994: @item user
        !          3995: The name of the user who requested the transfer.
        !          3996: 
        !          3997: @item options
        !          3998: A list of options to control the transfer.  The following options are
        !          3999: defined (all options are single characters):
        !          4000: 
        !          4001: @table @samp
        !          4002: 
        !          4003: @item d
        !          4004: The master should create directories as necessary (this is the default).
        !          4005: 
        !          4006: @item f
        !          4007: The master should not create directories if necessary, but should fail
        !          4008: the transfer instead.
        !          4009: 
        !          4010: @item m
        !          4011: The master should send mail to @var{user} when the transfer is complete.
        !          4012: 
        !          4013: @end table
        !          4014: 
        !          4015: @item size
        !          4016: This only appears if Taylor UUCP size negotiation is being used.  It
        !          4017: specifies the largest file which the master is prepared to accept (when
        !          4018: using SVR4 UUCP, this was specified in the @samp{-U} option during the
        !          4019: initial handshake).
        !          4020: 
        !          4021: @end table
        !          4022: 
        !          4023: The slave then responds with an @samp{R} command response.
        !          4024: 
        !          4025: @table @samp
        !          4026: 
        !          4027: @item RY @var{mode}
        !          4028: The slave is willing to send the file, and file transfer begins.
        !          4029: @var{mode} is the octal mode of the file on the slave.  The master uses
        !          4030: this to set the mode of the file on the master's system just as the
        !          4031: slave does the @var{mode} argument in the send command (@pxref{S
        !          4032: Request}).
        !          4033: 
        !          4034: @item RN2
        !          4035: The slave is not willing to send the file, either because it is not
        !          4036: permitted or because the file does not exist.  This implies that the
        !          4037: file request will never succeed.
        !          4038: 
        !          4039: @item RN6
        !          4040: This is only used by Taylor UUCP size negotiation.  It means that the
        !          4041: file is too large to send, either because of the size limit specifies by
        !          4042: the master or because the slave considers it too large.  The file
        !          4043: transfer might succeed later, or it might not (this will be cleared up
        !          4044: in a later release of Taylor UUCP).
        !          4045: 
        !          4046: @end table
        !          4047: 
        !          4048: If the slave responds with @samp{RY}, a file transfer begins.  When the
        !          4049: file transfer is complete, the master sends a @samp{C} command.  The
        !          4050: slave pretty much ignores this, although it may log it.  Taylor UUCP
        !          4051: sends this confirmation in @code{fprecfile_confirm} and checks it in
        !          4052: @code{fpsendfile_confirm}.
        !          4053: 
        !          4054: @table @samp
        !          4055: 
        !          4056: @item CY
        !          4057: The file transfer was successful.
        !          4058: 
        !          4059: @item CN5
        !          4060: The temporary file could not be moved into the final
        !          4061: location.
        !          4062: 
        !          4063: @end table
        !          4064: 
        !          4065: After the @samp{C} command response has been sent (in the @samp{RY}
        !          4066: case) or immediately (in an @samp{RN} case) the master will send another
        !          4067: command.
        !          4068: 
        !          4069: @node X Request, H Request, R Request, File Requests
        !          4070: @subsubsection X Request
        !          4071: 
        !          4072: master: @samp{X @var{from} @var{to} @var{user} -@var{options}}
        !          4073: 
        !          4074: The @samp{X} and the @samp{-} are literal characters.  This is a request
        !          4075: by the master to, in essence, execute @code{uucp} on the slave.  The
        !          4076: slave should execute @samp{uucp @var{from} @var{to}}.  Taylor UUCP
        !          4077: handles the @samp{X} request in the file @file{xcmd.c}.
        !          4078: 
        !          4079: @table @var
        !          4080: 
        !          4081: @item from
        !          4082: This is the name of the file or files on the slave which the master
        !          4083: wishes to transfer.  Any wildcards are expanded on the slave.  If the
        !          4084: master is requesting that the files be transferred to itself, the
        !          4085: request would normally contain wildcard characters, since otherwise an
        !          4086: @samp{R} command would suffice.  The master can also use this command to
        !          4087: request that the slave transfer files to a third system.
        !          4088: 
        !          4089: @item to
        !          4090: This is the name of the file or directory to which the files should be
        !          4091: transferred.  This will normally use a UUCP name.  For example, if the
        !          4092: master wishes to receive the files itself, it would use
        !          4093: @file{@var{master}!@var{path}}.
        !          4094: 
        !          4095: @item user
        !          4096: The name of the user who requested the transfer.
        !          4097: 
        !          4098: @item options
        !          4099: A list of options to control the transfer.  It is not clear which, if
        !          4100: any, options are supported by most UUCP packages.  Taylor UUCP ignores
        !          4101: the options field.
        !          4102: 
        !          4103: @end table
        !          4104: 
        !          4105: The slave then responds with an X command response.
        !          4106: 
        !          4107: @table @samp
        !          4108: 
        !          4109: @item XY
        !          4110: The request was accepted, and the appropriate file transfer commands
        !          4111: have been queued up for later processing.
        !          4112: 
        !          4113: @item XN
        !          4114: The request was denied.  No particular reason is given.
        !          4115: 
        !          4116: @end table
        !          4117: 
        !          4118: In either case, the master will then send another command.
        !          4119: 
        !          4120: @node H Request,  , X Request, File Requests
        !          4121: @subsubsection H Request
        !          4122: 
        !          4123: master: @samp{H}
        !          4124: 
        !          4125: This is used by the master to hang up the connection.  The slave will
        !          4126: respond with an @samp{H} command response.
        !          4127: 
        !          4128: @table @samp
        !          4129: 
        !          4130: @item HY
        !          4131: The slave agrees to hang up the connection.  In this case the master
        !          4132: sends another @samp{HY} command.  In some UUCP packages, including
        !          4133: Taylor UUCP, the slave will then send a third @samp{HY} command.  At
        !          4134: this point the protocol is shut down, and the final handshake is begun.
        !          4135: 
        !          4136: @item HN
        !          4137: The slave does not agree to hang up.  In this case the master and the
        !          4138: slave exchange roles.  The next command will be sent by the former
        !          4139: slave, which is the new master.  The roles may be reversed several times
        !          4140: during a single connection.
        !          4141: 
        !          4142: @end table
        !          4143: 
        !          4144: @node Final Handshake,  , File Requests, UUCP Protocol
        !          4145: @subsection Final Handshake
        !          4146: 
        !          4147: After the protocol has been shut down, the final handshake is
        !          4148: performed.  This handshake has no real purpose, and some UUCP packages
        !          4149: simply drop the connection rather than do it (in fact, some will drop
        !          4150: the connection immediately after both sides agree to hangup, without
        !          4151: even closing down the protocol).
        !          4152: 
        !          4153: @table @asis
        !          4154: 
        !          4155: @item caller: @samp{\020OOOOOO\000}
        !          4156: 
        !          4157: @item called: @samp{\020OOOOOOO\000}
        !          4158: 
        !          4159: @end table
        !          4160: 
        !          4161: That is, the calling UUCP sends six letter O's and the called UUCP
        !          4162: replies with seven letter O's.  Some UUCP packages always send six O's.
        !          4163: 
        !          4164: @node g Protocol, f Protocol, UUCP Protocol, Protocols
        !          4165: @section The UUCP @samp{g} Protocol
        !          4166: @cindex g protocol
        !          4167: @cindex protocol (g)
        !          4168: 
        !          4169: The @samp{g} protocol is a packet based flow controlled error correcting
        !          4170: protocol that requires an eight bit clear connection.  It is the
        !          4171: original UUCP protocol, and is supported by all UUCP implementations.
        !          4172: Many implementations of it are only able to support small window and
        !          4173: packet sizes, specifically a window size of 3 and a packet size of 64
        !          4174: bytes, but the protocol itself can support up to a window size of 7 and
        !          4175: a packet size of 4096 bytes.  Complaints about the inefficiency of the
        !          4176: @samp{g} protocol generally refer to specific implementations, rather
        !          4177: than the correctly implemented protocol.
        !          4178: 
        !          4179: The @samp{g} protocol was originally designed for general packet drivers,
        !          4180: and thus contains some features that are not used by UUCP, including
        !          4181: an alternate data channel and the ability to renegotiate packet and
        !          4182: window sizes during the communication session.
        !          4183: 
        !          4184: The @samp{g} protocol is spoofed by many Telebit modems.  When spoofing is
        !          4185: in effect, each Telebit modem uses the @samp{g} protocol to communicate
        !          4186: with the attached computer, but the data between the modems is sent
        !          4187: using a Telebit proprietary error correcting protocol.  This allows
        !          4188: for very high throughput over the Telebit connection, which, because
        !          4189: it is half-duplex, would not normally be able to handle the @samp{g}
        !          4190: protocol very well at all.
        !          4191: 
        !          4192: This discussion of the @samp{g} protocol explains how it works, but does
        !          4193: not discuss useful error handling techniques.  Some discussion of this
        !          4194: can be found in Jamie E. Hanrahan's paper (@pxref{Documentation
        !          4195: References}).  A detailed examination of the source code would also be
        !          4196: profitable.
        !          4197: 
        !          4198: The Taylor UUCP code to handle the @samp{g} protocol is in the file
        !          4199: @file{protg.c}.  There are a number of functions; the most important
        !          4200: ones are @code{fgstart}, @code{fgsend_control}, @code{fgsenddata}, and
        !          4201: @code{fgprocess_data}.
        !          4202: 
        !          4203: All @samp{g} protocol communication is done with packets.  Each packet
        !          4204: begins with a six byte header.  Control packets consist only of the
        !          4205: header.  Data packets contain additional data.
        !          4206: 
        !          4207: The header is as follows:
        !          4208: 
        !          4209: @table @asis
        !          4210: 
        !          4211: @item @samp{\020}
        !          4212: Every packet begins with a @samp{^P}.
        !          4213: 
        !          4214: @item @var{k} (1 <= @var{k} <= 9)
        !          4215: @ifinfo
        !          4216: The @var{k} value is always 9 for a control packet.  For a data packet,
        !          4217: the @var{k} value indicates how must data follows the six byte header.
        !          4218: The amount of data is 2 ** (@var{k} + 4), where ** indicates
        !          4219: exponentiation.  Thus a @var{k} value of 1 means 32 data bytes and a
        !          4220: @var{k} value of 8 means 4096 data bytes.  The @var{k} value for a data
        !          4221: packet must be between 1 and 8 inclusive.
        !          4222: @end ifinfo
        !          4223: @iftex
        !          4224: The @var{k} value is always 9 for a control packet.  For a data packet,
        !          4225: the @var{k} value indicates how must data follows the six byte header.
        !          4226: The amount of data is @math{2^{@var{k} + 4}}.  Thus a @var{k} value of 1
        !          4227: means 32 data bytes and a @var{k} value of 8 means 4096 data bytes.  The
        !          4228: @var{k} value for a data packet must be between 1 and 8 inclusive.
        !          4229: @end iftex
        !          4230: 
        !          4231: @item checksum low byte
        !          4232: @itemx checksum high byte
        !          4233: The checksum value is described below.
        !          4234: 
        !          4235: @item control byte
        !          4236: The control packet indicates the type of packet, and is described below.
        !          4237: 
        !          4238: @item xor byte
        !          4239: This byte is the xor of @var{k}, the checksum low byte, the checksum
        !          4240: high byte and the control byte (i.e. the second, third, fourth and fifth
        !          4241: header bytes).  It is used to ensure that the header data is valid.
        !          4242: 
        !          4243: @end table
        !          4244: 
        !          4245: The control byte in the header is composed of three bit fields, referred
        !          4246: to here as @var{tt} (two bits), @var{xxx} (three bits) and @var{yyy}
        !          4247: (three bits).  The complete byte is @var{ttxxxyyy}, or (@var{tt} << 6) +
        !          4248: (@var{xxx} << 3) + @var{yyy}.
        !          4249: 
        !          4250: The @var{tt} field takes on the following values:
        !          4251: 
        !          4252: @table @asis
        !          4253: 
        !          4254: @item 0
        !          4255: This is a control packet.  In this case the @var{k} byte in the header
        !          4256: must be 9.  The @var{xxx} field indicates the type of control packet;
        !          4257: the types are described below.
        !          4258: 
        !          4259: @item 1
        !          4260: This is an alternate data channel packet.  This is not used by UUCP.
        !          4261: 
        !          4262: @item 2
        !          4263: This is a data packet, and the entire contents of the attached data
        !          4264: field (whose length is given by the @var{k} byte in the header) are
        !          4265: valid.  The @var{xxx} and @var{yyy} fields are described below.
        !          4266: 
        !          4267: @item 3
        !          4268: This is a short data packet.  Let the length of the data field (as given
        !          4269: by the @var{k} byte in the header) be @code{l}.  Let the first byte in
        !          4270: the data field be @code{b1}.  If @code{b1} is less than 128 (if the most
        !          4271: significant bit of @code{b1} is 0), then there are @code{l - b1} valid
        !          4272: bytes of data in the data field, beginning with the second byte.  If
        !          4273: @code{b1 >= 128}, let @code{b2} be the second byte in the data field.
        !          4274: Then there are @code{l - ((b1 & 0x7f) + (b2 << 7))} valid bytes of data
        !          4275: in the data field, beginning with the third byte.  In all cases @code{l}
        !          4276: bytes of data are sent (and all data bytes participate in the checksum
        !          4277: calculation) but some of the trailing bytes may be dropped by the
        !          4278: receiver.  The @var{xxx} and @var{yyy} fields are described below.
        !          4279: 
        !          4280: @end table
        !          4281: 
        !          4282: In a data packet (short or not) the @var{xxx} field gives the sequence
        !          4283: number of the packet.  Thus sequence numbers can range from 0 to 7,
        !          4284: inclusive.  The @var{yyy} field gives the sequence number of the last
        !          4285: correctly received packet.
        !          4286: 
        !          4287: Each communication direction uses a window which indicates how many
        !          4288: unacknowledged packets may be transmitted before waiting for an
        !          4289: acknowledgement.  The window may range from 1 to 7 packets, and may be
        !          4290: different in each direction. For example, if the window is 3 and the
        !          4291: last packet acknowledged was packet number 6, packet numbers 7, 0 and 1
        !          4292: may be sent but the sender must wait for an acknowledgement before
        !          4293: sending packet number 2.  This acknowledgement could come as the
        !          4294: @var{yyy} field of a data packet or as the @var{yyy} field of a
        !          4295: @code{RJ} or @code{RR} control packet (described below).
        !          4296: 
        !          4297: Each packet must be transmitted in order (the sender may not skip
        !          4298: sequence numbers).  Each packet must be acknowledged, and each packet
        !          4299: must be acknowledged in order.
        !          4300: 
        !          4301: In a control packet, the @var{xxx} field takes on the following values:
        !          4302: 
        !          4303: @table @asis
        !          4304: 
        !          4305: @item 1 @code{CLOSE}
        !          4306: The connection should be closed immediately.  This is typically sent
        !          4307: when one side has seen too many errors and wants to give up.  It is also
        !          4308: sent when shutting down the protocol.  If an unexpected @code{CLOSE}
        !          4309: packet is received, a @code{CLOSE} packet should be sent in reply and
        !          4310: the @samp{g} protocol should halt, causing UUCP to enter the final
        !          4311: handshake.
        !          4312: 
        !          4313: @item 2 @code{RJ} or @code{NAK}
        !          4314: The last packet was not received correctly.  The @var{yyy} field
        !          4315: contains the sequence number of the last correctly received packet.
        !          4316: 
        !          4317: @item 3 @code{SRJ}
        !          4318: Selective reject.  The @var{yyy} field contains the sequence number of a
        !          4319: packet that was not received correctly, and should be retransmitted.
        !          4320: This is not used by UUCP, and most implementations will not recognize
        !          4321: it.  Taylor UUCP will recognize it but not generate it.
        !          4322: 
        !          4323: @item 4 @code{RR} or @code{ACK}
        !          4324: Packet acknowledgement.  The @var{yyy} field contains the sequence
        !          4325: number of the last correctly received packet.
        !          4326: 
        !          4327: @item 5 @code{INITC}
        !          4328: Third initialization packet.  The @var{yyy} field contains the maximum
        !          4329: window size to use.
        !          4330: 
        !          4331: @item 6 @code{INITB}
        !          4332: @ifinfo
        !          4333: Second initialization packet.  The @var{yyy} field contains the packet
        !          4334: size to use.  It requests a size of 2 ** (@var{yyy} + 5).  Note that
        !          4335: this is not the same coding used for the @var{k} byte in the packet
        !          4336: header (it is 1 less).  Some UUCP implementations can handle any packet
        !          4337: size up to that specified; some can only handled exactly the size
        !          4338: specified.  Taylor UUCP will always accept any packet size.
        !          4339: @end ifinfo
        !          4340: @iftex
        !          4341: Second initialization packet.  The @var{yyy} field contains the packet
        !          4342: size to use.  It requests a size of @math{2^{@var{yyy}+5}}.  Note that
        !          4343: this is not the same coding used for the @var{k} byte in the packet
        !          4344: header (it is 1 less).  Some UUCP implementations can handle any packet
        !          4345: size up to that specified; some can only handled exactly the size
        !          4346: specified.  Taylor UUCP will always accept any packet size.
        !          4347: @end iftex
        !          4348: 
        !          4349: @item 7 @code{INITA}
        !          4350: First initialization packet.  The @var{yyy} field contains the maximum
        !          4351: window size to use.
        !          4352: 
        !          4353: @end table
        !          4354: 
        !          4355: To compute the checksum, call the control byte (the fifth byte in the
        !          4356: header) @code{c}.
        !          4357: 
        !          4358: The checksum of a control packet is simply @code{0xaaaa - c}.
        !          4359: 
        !          4360: The checksum of a data packet is @code{0xaaaa - (@var{check} ^ c)}
        !          4361: (@code{^} denotes exclusive or, as in C), and @code{@var{check}} is the
        !          4362: result of the following routine run on the contents of the data field
        !          4363: (every byte in the data field participates in the checksum, even for a
        !          4364: short data packet).  Below is the routine used by Taylor UUCP; it is a
        !          4365: slightly modified version of a routine which John Gilmore patched from
        !          4366: G.L.  Chesson's original paper.  The @code{z} argument points to the
        !          4367: data and the @code{c} argument indicates how much data there is.
        !          4368: 
        !          4369: @example
        !          4370: int
        !          4371: igchecksum (z, c)
        !          4372:      register const char *z;
        !          4373:      register int c;
        !          4374: @{
        !          4375:   register unsigned int ichk1, ichk2;
        !          4376: 
        !          4377:   ichk1 = 0xffff;
        !          4378:   ichk2 = 0;
        !          4379: 
        !          4380:   do
        !          4381:     @{
        !          4382:       register unsigned int b;
        !          4383: 
        !          4384:       /* Rotate ichk1 left.  */
        !          4385:       if ((ichk1 & 0x8000) == 0)
        !          4386:         ichk1 <<= 1;
        !          4387:       else
        !          4388:         @{
        !          4389:           ichk1 <<= 1;
        !          4390:           ++ichk1;
        !          4391:         @}
        !          4392: 
        !          4393:       /* Add the next character to ichk1.  */
        !          4394:       b = *z++ & 0xff;
        !          4395:       ichk1 += b;
        !          4396: 
        !          4397:       /* Add ichk1 xor the character position in the buffer
        !          4398:          counting from the back to ichk2.  */
        !          4399:       ichk2 += ichk1 ^ c;
        !          4400: 
        !          4401:       /* If the character was zero, or adding it to ichk1
        !          4402:          caused an overflow, xor ichk2 to ichk1.  */
        !          4403:       if (b == 0 || (ichk1 & 0xffff) < b)
        !          4404:         ichk1 ^= ichk2;
        !          4405:     @}
        !          4406:   while (--c > 0);
        !          4407: 
        !          4408:   return ichk1 & 0xffff;
        !          4409: @}
        !          4410: @end example
        !          4411: 
        !          4412: When the @samp{g} protocol is started, the calling UUCP sends an INITA
        !          4413: control packet with the window size it wishes the called UUCP to use.
        !          4414: The called UUCP responds with an INITA packet with the window size it
        !          4415: wishes the calling UUCP to use.  Pairs of INITB and INITC packets are
        !          4416: then similarly exchanged.  When these exchanges are completed, the
        !          4417: protocol is considered to have been started.  The window size is sent
        !          4418: twice, with both the INITA and the INITC packets.
        !          4419: 
        !          4420: When a UUCP package transmits a command, it sends one or more data
        !          4421: packets.  All the data packets will normally be complete, although some
        !          4422: UUCP packages may send the last one as a short packet.  The command
        !          4423: string is sent with a trailing null byte, to let the receiving package
        !          4424: know when the command is finished.  Some UUCP packages require the last
        !          4425: byte of the last packet sent to be null, even if the command ends
        !          4426: earlier in the packet.  Some packages may require all the trailing bytes
        !          4427: in the last packet to be null, but I have not confirmed this.
        !          4428: 
        !          4429: When a UUCP package sends a file, it will send a sequence of data
        !          4430: packets.  The end of the file is signalled by a short data packet
        !          4431: containing zero valid bytes (it will normally be preceeded by a short
        !          4432: data packet containing the last few bytes in the file).
        !          4433: 
        !          4434: Note that the sequence numbers cover the entire communication session,
        !          4435: including both command and file data.
        !          4436: 
        !          4437: When the protocol is shut down, each UUCP package sends a @code{CLOSE}
        !          4438: control packet.
        !          4439: 
        !          4440: @node f Protocol, t Protocol, g Protocol, Protocols
        !          4441: @section The UUCP @samp{f} Protocol
        !          4442: @cindex f protocol
        !          4443: @cindex protocol (f)
        !          4444: 
        !          4445: The @samp{f} protocol is a seven bit protocol which checksums an entire
        !          4446: file at a time.  It only uses the characters between \040 and \176
        !          4447: (ASCII space and @samp{~}) inclusive as well as the carriage return
        !          4448: character.  It can be very efficient for transferring text only data,
        !          4449: but it is very inefficient at transferring eight bit data (such as
        !          4450: compressed news).  It is not flow controlled, and the checksum is fairly
        !          4451: insecure over large files, so using it over a serial connection requires
        !          4452: handshaking (@code{XON}/@code{XOFF} can be used) and error correcting
        !          4453: modems.  Some people think it should not be used even under those
        !          4454: circumstances.
        !          4455: 
        !          4456: I believe the @samp{f} protocol originated in BSD versions of UUCP.  It was
        !          4457: originally intended for transmission over X.25 PAD links.
        !          4458: 
        !          4459: The Taylor UUCP code for the @samp{f} protocol is in @file{protf.c}.
        !          4460: 
        !          4461: The @samp{f} protocol has no startup or finish protocol.  However, both
        !          4462: sides typically sleep for a couple of seconds before starting up,
        !          4463: because they switch the terminal into @code{XON}/@code{XOFF} mode and
        !          4464: want to allow the changes to settle before beginning transmission.
        !          4465: 
        !          4466: When a UUCP package transmits a command, it simply sends a string
        !          4467: terminated by a carriage return.
        !          4468: 
        !          4469: When a UUCP package transmits a file, each byte b of the file is
        !          4470: translated according to the following table:
        !          4471: 
        !          4472: @example
        !          4473:        0 <= b <=  037: 0172, b + 0100 (0100 to 0137)
        !          4474:      040 <= b <= 0171:       b        ( 040 to 0171)
        !          4475:     0172 <= b <= 0177: 0173, b - 0100 ( 072 to  077)
        !          4476:     0200 <= b <= 0237: 0174, b - 0100 (0100 to 0137)
        !          4477:     0240 <= b <= 0371: 0175, b - 0200 ( 040 to 0171)
        !          4478:     0372 <= b <= 0377: 0176, b - 0300 ( 072 to  077)
        !          4479: @end example
        !          4480: 
        !          4481: That is, a byte between \040 and \171 inclusive is transmitted as is,
        !          4482: and all other bytes are prefixed and modified as shown.
        !          4483: 
        !          4484: When all the file data is sent, a seven byte sequence is sent: two bytes
        !          4485: of \176 followed by four ASCII bytes of the checksum as printed in base
        !          4486: 16 followed by a carriage return.  For example, if the checksum was
        !          4487: 0x1234, this would be sent: "\176\1761234\r".
        !          4488: 
        !          4489: The checksum is initialized to 0xffff.  For each byte that is sent it is
        !          4490: modified as follows (where @code{b} is the byte before it has been
        !          4491: transformed as described above):
        !          4492: 
        !          4493: @example
        !          4494: /* Rotate the checksum left.  */
        !          4495: if ((ichk & 0x8000) == 0)
        !          4496:   ichk <<= 1;
        !          4497: else
        !          4498:   @{
        !          4499:     ichk <<= 1;
        !          4500:     ++ichk;
        !          4501:   @}
        !          4502: 
        !          4503: /* Add the next byte into the checksum.  */
        !          4504: ichk += b;
        !          4505: @end example
        !          4506: 
        !          4507: When the receiving UUCP sees the checksum, it compares it against its
        !          4508: own calculated checksum and replies with a single character followed
        !          4509: by a carriage return.
        !          4510: 
        !          4511: @table @samp
        !          4512: 
        !          4513: @item G
        !          4514: The file was received correctly.
        !          4515: 
        !          4516: @item R
        !          4517: The checksum did not match, and the file should be resent from the
        !          4518: beginning.
        !          4519: 
        !          4520: @item Q
        !          4521: The checksum did not match, but too many retries have occurred and the
        !          4522: communication session should be abandoned.
        !          4523: 
        !          4524: @end table
        !          4525: 
        !          4526: The sending UUCP checks the returned character and acts accordingly.
        !          4527: 
        !          4528: @node t Protocol, e Protocol, f Protocol, Protocols
        !          4529: @section The UUCP @samp{t} Protocol
        !          4530: @cindex t protocol
        !          4531: @cindex protocol (t)
        !          4532: 
        !          4533: The @samp{t} protocol is intended for TCP links.  It does no error
        !          4534: checking or flow control, and requires an eight bit clear channel.
        !          4535: 
        !          4536: I believe the @samp{t} protocol originated in BSD versions of UUCP.
        !          4537: 
        !          4538: The Taylor UUCP code for the @samp{t} protocol is in @file{prott.c}.
        !          4539: 
        !          4540: When a UUCP package transmits a command, it first gets the length of the
        !          4541: command string, @var{c}.  It then sends ((@var{c} / 512) + 1) * 512
        !          4542: bytes (the smallest multiple of 512 which can hold @var{c} bytes plus a
        !          4543: null byte) consisting of the command string itself followed by trailing
        !          4544: null bytes.
        !          4545: 
        !          4546: When a UUCP package sends a file, it sends it in blocks.  Each block
        !          4547: contains at most 1024 bytes of data.  Each block consists of four bytes
        !          4548: containing the amount of data in binary (most significant byte first,
        !          4549: the same format as used by the Unix function @code{htonl}) followed by
        !          4550: that amount of data.  The end of the file is signalled by a block
        !          4551: containing zero bytes of data.
        !          4552: 
        !          4553: @node e Protocol, x Protocol, t Protocol, Protocols
        !          4554: @section The UUCP @samp{e} Protocol
        !          4555: @cindex e protocol
        !          4556: @cindex protocol (e)
        !          4557: 
        !          4558: The @samp{e} protocol is similar to the @samp{t} protocol.  It does no
        !          4559: flow control or error checking and is intended for use over TCP.
        !          4560: 
        !          4561: The @samp{e} protocol originated in versions of HDB UUCP.
        !          4562: 
        !          4563: The Taylor UUCP code for the @samp{e} protocol is in @file{prote.c}.
        !          4564: 
        !          4565: When a UUCP package transmits a command, it simply sends the command as
        !          4566: an ASCII string terminated by a null byte.
        !          4567: 
        !          4568: When a UUCP package transmits a file, it sends the complete size of the
        !          4569: file as an ASCII decimal number.  The ASCII string is padded out to 20
        !          4570: bytes with null bytes (i.e., if the file is 1000 bytes long, it sends
        !          4571: @samp{1000\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0}).  It then sends the entire
        !          4572: file.
        !          4573: 
        !          4574: @node x Protocol, d Protocol, e Protocol, Protocols
        !          4575: @section The UUCP @samp{x} Protocol
        !          4576: 
        !          4577: I believe that the @samp{x} protocol was intended for use over X.25
        !          4578: virtual circuits.  It relies on a write of zero bytes being read as zero
        !          4579: bytes without stopping communication.  I have heard that it does not
        !          4580: work correctly.  If someone would care to fill this in more, I would be
        !          4581: grateful.  Taylor UUCP does not implement the @samp{x} protocol.
        !          4582: 
        !          4583: @node d Protocol, Capital G Protocol, x Protocol, Protocols
        !          4584: @section The UUCP @samp{d} Protocol
        !          4585: 
        !          4586: This is apparently used for DataKit connections, and relies on a write
        !          4587: of zero bytes being read as zero bytes, much as the @samp{x} protocol
        !          4588: does.  I don't really know anything else about it.  Taylor UUCP does not
        !          4589: implement the @samp{d} protocol.
        !          4590: 
        !          4591: @node Capital G Protocol, Documentation References, d Protocol, Protocols
        !          4592: @section The UUCP @samp{G} Protocol
        !          4593: 
        !          4594: The @samp{G} protocol is apparently simply the @samp{g} protocol, except
        !          4595: that it is known to support all possible window and packet sizes.  It
        !          4596: was introduced by SVR4 UUCP; the SVR4 implementation of the @samp{g}
        !          4597: protocol is apparently fixed at a packet size of 64 and a window size of
        !          4598: 7.  Taylor UUCP does not recognize the @samp{G} protocol.  It does
        !          4599: support all window and packet sizes for the @samp{g} protocol.
        !          4600: 
        !          4601: @node Documentation References,  , Capital G Protocol, Protocols
        !          4602: @section Documentation References
        !          4603: 
        !          4604: I took a lot of the information from Jamie E. Hanrahan's paper in the
        !          4605: Fall 1990 DECUS Symposium, and from Managing UUCP and Usenet by Tim
        !          4606: O'Reilly and Grace Todino (with contributions by several other people).
        !          4607: The latter includes most of the former, and is published by O'Reilly &
        !          4608: Associates, Inc.
        !          4609: 
        !          4610: Some information is originally due to a Usenet article by Chuck Wegrzyn.
        !          4611: The information on the @samp{g} protocol comes partially from a paper by
        !          4612: G.L. Chesson of Bell Laboratories, partially from Jamie E. Hanrahan's
        !          4613: paper, and partially from source code by John Gilmore.  The information
        !          4614: on the @samp{f} protocol comes from the source code by Piet Berteema.
        !          4615: The information on the @samp{t} protocol comes from the source code by
        !          4616: Rick Adams.  The information on the @samp{e} protocol comes from a
        !          4617: Usenet article by Matthias Urlichs.
        !          4618: 
        !          4619: @node Hacking, Acknowledgements, Protocols, Top
        !          4620: @chapter Hacking Taylor UUCP
        !          4621: 
        !          4622: This chapter provides the briefest of guides to the Taylor UUCP source
        !          4623: code itself.
        !          4624: 
        !          4625: @menu
        !          4626: * System Dependence::           System Dependence
        !          4627: * Naming Conventions::          Naming Conventions
        !          4628: * Patches::                     Patches
        !          4629: @end menu
        !          4630: 
        !          4631: @node System Dependence, Naming Conventions, Hacking, Hacking
        !          4632: @section System Dependence
        !          4633: 
        !          4634: The code is carefully segregated into a system independent portion and a
        !          4635: system dependent portion.  The system dependent code is in the
        !          4636: @file{unix} subdirectory, and also in the files @file{tcp.c},
        !          4637: @file{tli.c} and @file{sysh.unx} (also known as @file{sysdep.h}).
        !          4638: 
        !          4639: With the right configuration parameters, the system independent code
        !          4640: calls only ANSI C functions.  Some of the less common ANSI C functions
        !          4641: are also provided in the @file{lib} directory.  The replacement function
        !          4642: @code{strtol} in @file{lib/strtol.c} assumes that the characters @kbd{A}
        !          4643: to @kbd{F} and @kbd{a} to @kbd{f} appear in strictly sequential order.
        !          4644: The function @code{igradecmp} in @file{uuconf/grdcmp.c} assumes that the
        !          4645: upper and lower case letters appear in order.  Both assumptions are true
        !          4646: for ASCII and EBCDIC, but neither is guaranteed by ANSI C.  Disregarding
        !          4647: these caveats, I believe that the system independent portion of the code
        !          4648: is strictly conforming.
        !          4649: 
        !          4650: That's not too exciting, since all the work is done in the system
        !          4651: dependent code.  I think that this code can conform to POSIX 1003.1,
        !          4652: given the right compilation parameters.  I'm a bit less certain about
        !          4653: this, though.
        !          4654: 
        !          4655: The code is in use on a 16 bit segmented system with no function
        !          4656: prototypes, so I'm certain that all casts to long and pointers are done
        !          4657: when necessary.
        !          4658: 
        !          4659: @node Naming Conventions, Patches, System Dependence, Hacking
        !          4660: @section Naming Conventions
        !          4661: 
        !          4662: I use a modified Hungarian naming convention for my variables and
        !          4663: functions.  As with all naming conventions, the code is rather opaque if
        !          4664: you are not familiar with it, but becomes clear and easy to use with
        !          4665: time.
        !          4666: 
        !          4667: The first character indicates the type of the variable (or function
        !          4668: return value).  Sometimes additional characters are used.  I use the
        !          4669: following type prefixes:
        !          4670: 
        !          4671: @table @samp
        !          4672: @item a
        !          4673: array; the next character is the type of an element
        !          4674: @item b
        !          4675: byte or character
        !          4676: @item c
        !          4677: count of something
        !          4678: @item e
        !          4679: stdio FILE *
        !          4680: @item f
        !          4681: boolean
        !          4682: @item i
        !          4683: generic integer
        !          4684: @item l
        !          4685: double
        !          4686: @item o
        !          4687: file descriptor (as returned by open, creat, etc.)
        !          4688: @item p
        !          4689: generic pointer
        !          4690: @item q
        !          4691: pointer to structure
        !          4692: @item s
        !          4693: structure
        !          4694: @item u
        !          4695: void (function return values only)
        !          4696: @item z
        !          4697: character string
        !          4698: @end table
        !          4699: 
        !          4700: A generic pointer ('p') is sometimes a @code{void *}, sometimes a
        !          4701: function pointer in which case the prefix is pf, and sometimes a pointer
        !          4702: to another type, in which case the next character is the type to which
        !          4703: it points (pf is overloaded).
        !          4704: 
        !          4705: An array of strings (@code{char *[]}) would be named @code{az} (array of
        !          4706: string).  If this array were passed to a function, the function
        !          4707: parameter would be named @code{paz} (pointer to array of string).
        !          4708: 
        !          4709: Note that the variable name prefixes do not necessarily indicate the
        !          4710: type of the variable.  For example, a variable prefixed with i may be
        !          4711: int, long or short.  Similarly, a variable prefixed with b may be a char
        !          4712: or an int; for example, the return value of getchar would be caught in
        !          4713: an int variable prefixed with b.
        !          4714: 
        !          4715: For a non-local variable (extern or file static), the first character
        !          4716: after the type prefix is capitalized.
        !          4717: 
        !          4718: Most static variables and functions use another letter after the type
        !          4719: prefix to indicate which module they come from.  This is to help
        !          4720: distinguish different names in the debugger.  For example, all static
        !          4721: functions in @file{protg.c}, the @samp{g} protocol source code, use a
        !          4722: module prefix of @samp{g}.  This isn't too useful, as a number of
        !          4723: modules use a module prefix of @samp{s}.
        !          4724: 
        !          4725: @node Patches,  , Naming Conventions, Hacking
        !          4726: @section Patches
        !          4727: 
        !          4728: I am always grateful for any patches sent in.  Much of the flexibility
        !          4729: and portability of the code is due to other people.  Please do not
        !          4730: hesitate to send me any changes you have found necessary or useful.
        !          4731: 
        !          4732: When sending a patch, please send the output of the Unix @code{diff}
        !          4733: program invoked with the @samp{-c} option (if you have the GNU version
        !          4734: of @code{diff}, use the @samp{-p} option).  Always invoke @code{diff}
        !          4735: with the original file first and the modified file second.
        !          4736: 
        !          4737: If your @code{diff} does not support @samp{-c} (or you don't have
        !          4738: @code{diff}), send a complete copy of the modified file (if you have
        !          4739: just changed a single function, you can just send the new version of the
        !          4740: function).  In particular, please do not send @code{diff} output without
        !          4741: the @samp{-c} option, as it is useless.
        !          4742: 
        !          4743: If you have made a number of changes, it is very convenient for me if
        !          4744: you send each change as a separate mail message.  Sometimes I will think
        !          4745: that one change is useful but another one is not.  If they are in
        !          4746: different messages it is much easier for me to apply one but not the
        !          4747: other.
        !          4748: 
        !          4749: I rarely apply the patches directly.  Instead I work my way through the
        !          4750: hunks and apply each one separately.  This ensures that the naming
        !          4751: remains consistent, and that I understand all the code.
        !          4752: 
        !          4753: If you can not follow all these rules, then don't.  But if you do, it
        !          4754: makes it more likely that I will incorporate your changes.  I am not
        !          4755: paid for my UUCP work, and my available time is unfortunately very
        !          4756: restricted.  The package is important to me, and I do what I can, but I
        !          4757: can not do all that I would like, much less all that everybody else
        !          4758: would like.
        !          4759: 
        !          4760: Finally, please do not be offended if I do not reply to messages for
        !          4761: some time, even a few weeks.  I am often behind on my mail, and if I
        !          4762: think your message deserves a considered reply I will often put it aside
        !          4763: until I have time to deal with it.
        !          4764: 
        !          4765: @node Acknowledgements, Index (concepts), Hacking, Top
        !          4766: @chapter Acknowledgements
        !          4767: 
        !          4768: This is a list of people who gave help or suggestions while I was
        !          4769: working on the Taylor UUCP project.  Appearance on this list does not
        !          4770: constitute endorsement of the program, particularly since some of the
        !          4771: comments were criticisms.  I've probably left some people off, and I
        !          4772: apologize for any oversight; it does not mean your contribution was
        !          4773: unappreciated.
        !          4774: 
        !          4775: @ifinfo
        !          4776: First of all, I would like to thank the people at Infinity Development
        !          4777: Systems (formerly AIRS, which lives on in the domain name, at least for
        !          4778: now) for permitting me to use their computers and @file{uunet} access.
        !          4779: I would also like to thank Richard Stallman @code{<rms@@gnu.ai.mit.edu>}
        !          4780: for founding the Free Software Foundation and John Gilmore
        !          4781: @code{<gnu@@cygnus.com>} for writing the initial version of gnuucp which
        !          4782: was a direct inspiration for this somewhat larger project.  Chip
        !          4783: Salzenberg @code{<chip@@tct.com>} has contributed many patches.
        !          4784: Franc,ois Pinard @code{<pinard@@iro.umontreal.ca>} tirelessly tested the
        !          4785: code and suggested many improvements.  He also put together the initial
        !          4786: version of this document.  Doug Evans contributed the zmodem protocol.
        !          4787: Finally, Verbus M. Counts @code{<verbus@@westmark.com>} and Centel
        !          4788: Federal Systems, Inc. deserve special thanks, since they actually paid
        !          4789: me money to port this code to System III.
        !          4790: @end ifinfo
        !          4791: @iftex
        !          4792: First of all, I would like to thank the people at Infinity Development
        !          4793: Systems (formerly AIRS, which lives on in the domain name, at least for
        !          4794: now) for permitting me to use their computers and @file{uunet} access.
        !          4795: I would also like to thank Richard Stallman @code{<rms@@gnu.ai.mit.edu>}
        !          4796: for founding the Free Software Foundation and John Gilmore
        !          4797: @code{<gnu@@cygnus.com>} for writing the initial version of gnuucp which
        !          4798: was a direct inspiration for this somewhat larger project.  Chip
        !          4799: Salzenberg @code{<chip@@tct.com>} has contributed many patches.
        !          4800: @tex
        !          4801: Fran\c cois Pinard
        !          4802: @end tex
        !          4803: @code{<pinard@@iro.umontreal.ca>} tirelessly tested the code and
        !          4804: suggested many improvements.  He also put together the initial version
        !          4805: of this document.  Doug Evans contributed the zmodem protocol.  Finally,
        !          4806: Verbus M. Counts @code{<verbus@@westmark.com>} and Centel Federal
        !          4807: Systems, Inc. deserve special thanks, since they actually paid me money
        !          4808: to port this code to System III.
        !          4809: @end iftex
        !          4810: 
        !          4811: In alphabetical order:
        !          4812: 
        !          4813: @example
        !          4814: "Earle F. Ake - SAIC" @code{<ake@@Dayton.SAIC.COM>}
        !          4815: @code{mra@@searchtech.com} (Michael Almond)
        !          4816: @code{cambler@@zeus.calpoly.edu} (Christopher J. Ambler)
        !          4817: Brian W. Antoine @code{<briana@@tau-ceti.isc-br.com>}
        !          4818: @code{jantypas@@soft21.s21.com} (John Antypas)
        !          4819: @code{nba@@sysware.DK} (Niels Baggesen)
        !          4820: @code{uunet!hotmomma!sdb} (Scott Ballantyne)
        !          4821: Zacharias Beckman @code{<zac@@dolphin.com>}
        !          4822: @code{mike@@mbsun.ann-arbor.mi.us} (Mike Bernson)
        !          4823: @code{bob@@usixth.sublink.org} (Roberto Biancardi)
        !          4824: @code{statsci!scott@@coco.ms.washington.edu} (Scott Blachowicz)
        !          4825: @code{bag%wood2.cs.kiev.ua@@relay.ussr.eu.net} (Andrey G Blochintsev)
        !          4826: Gregory Bond @code{<gnb@@bby.com.au>}
        !          4827: Marc Boucher @code{<marc@@CAM.ORG>}
        !          4828: @code{dean@@coplex.com} (Dean Brooks)
        !          4829: @code{dave@@dlb.com} (Dave Buck)
        !          4830: @code{gordon@@sneaky.lonestar.org} (Gordon Burditt)
        !          4831: @code{mib@@gnu.ai.mit.edu} (Michael I Bushnell)
        !          4832: Brian Campbell @code{<brianc@@quantum.on.ca>}
        !          4833: Andrew A. Chernov @code{<ache@@astral.msk.su>}
        !          4834: @code{mafc!frank@@bach.helios.de} (Frank Conrad)
        !          4835: Ed Carp @code{<erc@@apple.com>}
        !          4836: @code{verbus@@westmark.westmark.com} (Verbus M. Counts)
        !          4837: @code{cbmvax!snark.thyrsus.com!cowan} (John Cowan)
        !          4838: Bob Cunningham @code{<bob@@soest.hawaii.edu>}
        !          4839: @code{hubert@@arakis.fdn.org} (Hubert Delahaye)
        !          4840: @code{denny@@dakota.alisa.com} (Bob Denny)
        !          4841: @code{ssd@@nevets.oau.org} (Steven S. Dick)
        !          4842: @code{gert@@greenie.gold.sub.org} (Gert Doering)
        !          4843: Hans-Dieter Doll @code{<hd2@@Insel.DE>}
        !          4844: Andrew Evans @code{<andrew@@airs.com>}
        !          4845: @code{dje@@cygnus.com} (Doug Evans)
        !          4846: Marc Evans @code{<marc@@synergytics.com>}
        !          4847: @code{kksys!kegworks!lfahnoe@@cs.umn.edu} (Larry Fahnoe)
        !          4848: @code{fenner@@jazz.psu.edu} (Bill Fenner)
        !          4849: "David J. Fiander" @code{<golem!david@@news.lsuc.on.ca>}
        !          4850: Thomas Fischer @code{<batman@@olorin.dark.sub.org>}
        !          4851: @code{erik@@eab.retix.com} (Erik Forsberg)
        !          4852: Lele Gaifax @code{<piggy@@idea.sublink.org>}
        !          4853: @code{Peter.Galbavy@@micromuse.co.uk}
        !          4854: @code{hunter@@phoenix.pub.uu.oz.au} (James Gardiner [hunter])
        !          4855: Terry Gardner @code{<cphpcom!tjg01>}
        !          4856: @code{ol@@infopro.spb.su} (Oleg Girko)
        !          4857: @code{jimmy@@tokyo07.info.com} (Jim Gottlieb)
        !          4858: @code{ryan@@cs.umb.edu} (Daniel R. Guilderson)
        !          4859: @code{greg@@gagme.chi.il.us} (Gregory Gulik)
        !          4860: Richard H. Gumpertz @code{<rhg@@cps.com>}
        !          4861: Michael Haberler @code{<mah@@parrot.prv.univie.ac.at>}
        !          4862: @code{jh@@moon.nbn.com} (John Harkin)
        !          4863: @code{guy@@auspex.auspex.com} (Guy Harris)
        !          4864: Petri Helenius @code{<pete@@fidata.fi>}
        !          4865: Bob Hemedinger @code{<bob@@dalek.mwc.com>}
        !          4866: Andrew Herbert @code{<andrew@@werple.pub.uu.oz.au>}
        !          4867: Peter Honeyman @code{<honey@@citi.umich.edu>}
        !          4868: @code{pmcgw!personal-media.co.jp!ishikawa} (Chiaki Ishikawa)
        !          4869: @code{bei@@dogface.austin.tx.us} (Bob Izenberg)
        !          4870: Rob Janssen @code{<cmgit!rob@@relay.nluug.nl>}
        !          4871: @code{harvee!esj} (Eric S Johansson)
        !          4872: Alan Judge @code{<aj@@dec4ie.IEunet.ie>}
        !          4873: @code{chris@@cj_net.in-berlin.de} (Christof Junge)
        !          4874: @code{tron@@Veritas.COM} (Ronald S. Karr)
        !          4875: Brendan Kehoe @code{<brendan@@cs.widener.edu>}
        !          4876: @code{kersing@@nlmug.nl.mugnet.org} (Jac Kersing)
        !          4877: @code{rob@@pact.nl} (Rob Kurver)
        !          4878: @code{kent@@sparky.IMD.Sterling.COM} (Kent Landfield)
        !          4879: @code{lebaron@@inrs-telecom.uquebec.ca}  (Gregory LeBaron)
        !          4880: @code{karl@@sugar.NeoSoft.Com} (Karl Lehenbauer)
        !          4881: @code{merlyn@@digibd.com} (Merlyn LeRoy)
        !          4882: @code{clewis@@ferret.ocunix.on.ca} (Chris Lewis)
        !          4883: @code{gdonl@@ssi1.com} (Don Lewis)
        !          4884: @code{libove@@libove.det.dec.com} (Jay Vassos-Libove)
        !          4885: @code{bruce%blilly@@Broadcast.Sony.COM} (Bruce Lilly)
        !          4886: Ted Lindgreen @code{<tlindgreen@@encore.nl>}
        !          4887: @code{andrew@@cubetech.com} (Andrew Loewenstern)
        !          4888: "Arne Ludwig" @code{<arne@@rrzbu.hanse.de>}
        !          4889: Matthew Lyle @code{<matt@@mips.mitek.com>}
        !          4890: @code{djm@@eng.umd.edu} (David J. MacKenzie)
        !          4891: John R MacMillan @code{<chance!john@@sq.sq.com>}
        !          4892: Giles D Malet @code{<shrdlu!gdm@@provar.kwnet.on.ca>}
        !          4893: @code{mem@@mv.MV.COM} (Mark E. Mallett)
        !          4894: @code{pepe@@dit.upm.es} (Jose A. Manas)
        !          4895: @code{martelli@@cadlab.sublink.org} (Alex Martelli)
        !          4896: Yanek Martinson @code{<yanek@@mthvax.cs.miami.edu>}
        !          4897: @code{jm@@aristote.univ-paris8.fr} (Jean Mehat)
        !          4898: @code{les@@chinet.chi.il.us} (Leslie Mikesell)
        !          4899: @code{mmitchel@@digi.lonestar.org} (Mitch Mitchell)
        !          4900: @code{rmohr@@infoac.rmi.de} (Rupert Mohr)
        !          4901: @code{ianm@@icsbelf.co.uk} (Ian Moran)
        !          4902: @code{brian@@ilinx.wimsey.bc.ca} (Brian J. Murrell)
        !          4903: @code{service@@infohh.rmi.de} (Dirk Musstopf)
        !          4904: @code{lyndon@@cs.athabascau.ca} (Lyndon Nerenberg)
        !          4905: @code{rolf@@saans.north.de} (Rolf Nerstheimer)
        !          4906: @code{tom@@smart.bo.open.de} (Thomas Neumann)
        !          4907: @code{mnichols@@pacesetter.com}
        !          4908: @code{nolan@@helios.unl.edu} (Michael Nolan)
        !          4909: david nugent @code{<david@@csource.oz.au>}
        !          4910: Petri Ojala @code{<ojala@@funet.fi>}
        !          4911: @code{abekas!dragoman!mikep@@decwrl.dec.com} (Mike Park)
        !          4912: Tim Peiffer @code{peiffer@@cs.umn.edu}
        !          4913: @code{don@@blkhole.resun.com} (Don Phillips)
        !          4914: "Mark Pizzolato 415-369-9366" @code{<mark@@infocomm.com>}
        !          4915: @code{dplatt@@ntg.com} (Dave Platt)
        !          4916: @code{eldorado@@tharr.UUCP} (Mark Powell)
        !          4917: Mark Powell @code{<mark@@inet-uk.co.uk>}
        !          4918: @code{pozar@@kumr.lns.com} (Tim Pozar)
        !          4919: @code{putsch@@uicc.com} (Jeff Putsch)
        !          4920: Jarmo Raiha @code{<jarmo@@ksvltd.FI>}
        !          4921: Scott Reynolds @code{<scott@@clmqt.marquette.Mi.US>}
        !          4922: @code{mcr@@Sandelman.OCUnix.On.Ca} (Michael Richardson)
        !          4923: @code{arnold@@cc.gatech.edu} (Arnold Robbins)
        !          4924: @code{ross@@sun490.fdu.edu} (Jeff Ross)
        !          4925: Aleksey P. Rudnev @code{<alex@@kiae.su>}
        !          4926: "Heiko W.Rupp" @code{<hwr@@pilhuhn.ka.sub.org>}
        !          4927: @code{wolfgang@@wsrcc.com} (Wolfgang S. Rupprecht)
        !          4928: @code{tbr@@tfic.bc.ca} (Tom Rushworth)
        !          4929: @code{rsalz@@bbn.com} (Rich Salz)
        !          4930: @code{sojurn!mike@@hobbes.cert.sei.cmu.edu} (Mike Sangrey)
        !          4931: Nickolay Saukh @code{<nms@@ussr.EU.net>}
        !          4932: Eric Schnoebelen @code{<eric@@cirr.com>}
        !          4933: @code{scott@@geom.umn.edu}
        !          4934: Igor V. Semenyuk @code{<iga@@argrd0.argonaut.su>}
        !          4935: @code{uunet!gold.sub.org!root} (Christian Seyb)
        !          4936: @code{s4mjs!mjs@@nirvo.nirvonics.com} (M. J. Shannon Jr.)
        !          4937: @code{peter@@ficc.ferranti.com} (Peter da Silva)
        !          4938: @code{frumious!pat} (Patrick Smith)
        !          4939: @code{roscom!monty@@bu.edu} (Monty Solomon)
        !          4940: Harlan Stenn @code{<harlan@@mumps.pfcs.com>}
        !          4941: Ralf Stephan @code{<ralf@@ark.abg.sub.org>}
        !          4942: @code{chs@@antic.apu.fi} (Hannu Strang)
        !          4943: @code{ralf@@reswi.ruhr.de} (Ralf E. Stranzenbach)
        !          4944: Shigeya Suzuki @code{<shigeya@@dink.foretune.co.jp>}
        !          4945: @code{swiers@@plains.NoDak.edu}
        !          4946: Oleg Tabarovsky @code{<olg@@olghome.pccentre.msk.su>}
        !          4947: John Theus @code{<john@@theus.rain.com>}
        !          4948: Karsten Thygesen @code{<karthy@@dannug.dk>}
        !          4949: Graham Toal @code{<gtoal@@pizzabox.demon.co.uk>}
        !          4950: @code{rmtodd@@servalan.servalan.com} (Richard Todd)
        !          4951: Len Tower @code{<tower-prep@@ai.mit.edu>}
        !          4952: Mark Towfiq @code{<justice!towfiq@@Eingedi.Newton.MA.US>}
        !          4953: @code{mju@@mudos.ann-arbor.mi.us} (Marc Unangst)
        !          4954: Tomi Vainio @code{<tomppa@@fidata.fi>}
        !          4955: @code{vogel@@omega.ssw.de} (Andreas Vogel)
        !          4956: @code{jv@@mh.nl} (Johan Vromans)
        !          4957: @code{steve@@nshore.org} (Stephen J. Walick)
        !          4958: @code{gerben@@rna.indiv.nluug.nl} (Gerben Wierda)
        !          4959: @code{frnkmth!twwells.com!bill} (T. William Wells)
        !          4960: Peter Wemm @code{<Peter_Wemm@@zeus.dialix.oz.au>}
        !          4961: @code{mauxci!eci386!woods@@apple.com} (Greg A. Woods)
        !          4962: Michael Yu.Yaroslavtsev @code{<mike@@yaranga.ipmce.su>}
        !          4963: @code{jon@@console.ais.org} (Jon Zeeff)
        !          4964: Matthias Zepf @code{<agnus@@amylnd.stgt.sub.org>}
        !          4965: Eric Ziegast @code{<uunet!ziegast>}
        !          4966: @end example
        !          4967: 
        !          4968: @node Index (concepts), Index (configuration file), Acknowledgements, Top
        !          4969: @unnumbered Concept Index
        !          4970: 
        !          4971: @printindex cp
        !          4972: 
        !          4973: @node Index (configuration file),  , Index (concepts), Top
        !          4974: @unnumbered Configuration File Index
        !          4975: 
        !          4976: @printindex fn
        !          4977: 
        !          4978: @contents
        !          4979: @bye

unix.superglobalmegacorp.com

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