|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.