Annotation of researchv10dc/vol2/uucp/history.ms, revision 1.1.1.1

1.1       root        1: .so ../ADM/mac
                      2: .XX 45 649 "UUCP \(em The Program That Wouldn't Go Away"
                      3: .nr dP 2
                      4: .nr dV 3p
                      5: .EQ
                      6: delim @@
                      7: .EN
                      8: .TL
                      9: UUCP \(em The Program That Wouldn't Go Away
                     10: .AU
                     11: Peter Honeyman
                     12: .AI
                     13: Princeton University
                     14: Princeton, New Jersey 08544
                     15: .AU
                     16: Dave Nowitz
                     17: .AI
                     18: AT&T Bell Laboratories
                     19: Murray Hill, New Jersey 07974
                     20: .AU
                     21: Brian E. Redman
                     22: .AI
                     23: Bell Communications Research
                     24: Whippany, New Jersey 07981
                     25: .AB
                     26: .PP
                     27: The
                     28: .UX
                     29: to
                     30: .UX
                     31: Copy Program (\fIUUCP\fP) embodies many good ideas for
                     32: an inexpensive file transfer and remote execution network;
                     33: however, the current implementation is over five years
                     34: old and is troubled by many problems.
                     35: .PP
                     36: This paper describes a new implementation.
                     37: The main goals were to
                     38: make UUCP more robust, secure, powerful, and
                     39: maintainable.
                     40: The major activities were:
                     41: .RS
                     42: .RS
                     43: .IP \(bu
                     44: A massive code reduction.
                     45: Four core programs comprise the system:
                     46: .I
                     47: uucp, uucico, uux,
                     48: .R
                     49: and
                     50: .I
                     51: uuxqt.
                     52: .R
                     53: Code that did not directly implement the
                     54: purpose of these programs was excised.
                     55: .IP \(bu
                     56: The connection algorithm was rewritten to persevere in the face of
                     57: adversity and to provide a mechanism that enables the administrator
                     58: to incorporate new calling devices easily.
                     59: .IP \(bu
                     60: The spooling mechanism was replaced with one that hashes the queued
                     61: files by remote system name.
                     62: .IP \(bu
                     63: The USERFILE syntax was discarded and replaced by an extremely flexible
                     64: and intelligible mechanism with practical (secure) defaults.
                     65: .IP \(bu
                     66: The code was reviewed and modified
                     67: to meet the authors' standards for programming style, robustness, and
                     68: maintainability.
                     69: .RE
                     70: .RE
                     71: .AE
                     72: .2C
                     73: .NH
                     74: History
                     75: .PP
                     76: UUCP was invented by Mike Lesk
                     77: in 1976.
                     78: He required a transport mechanism to build an automated software distribution
                     79: package|reference(lesk proposal 1977)|reference(lesk cohen 1977)|reference(asd koenig)
                     80: upon.  However it became
                     81: clear that UUCP required (and deserved) considerable follow-up
                     82: activity and it, the tool, became the focus of attention rather than
                     83: the original job for which it was designed.
                     84: .PP
                     85: The first version of UUCP was approximately 4000 lines of code.
                     86: It was limited to transferring files, although in fact it included
                     87: a remote execution facility to invoke \fIuucp\fR on remote systems in
                     88: some syntactically special cases.
                     89: Its major failing (even for its time) was that its access mechanism was too
                     90: simplistic.  It would connect to a remote system and login
                     91: with a standard interactive shell.  It would then issue commands
                     92: on the remote system such as \fIcopyin\fR and \fIcopyout\fR to effect
                     93: transfers.
                     94: Although an attempt to hide the remote system's phone number, login and
                     95: password was
                     96: provided in the code, anyone
                     97: who installed UUCP was privy to such information, and a careless
                     98: administrator could easily make it public.
                     99: .PP
                    100: The second version of
                    101: UUCP|reference(v7man nowitz lesk)|reference(nowitz v7man implementation)|reference(nowitz lesk unix network 1982)
                    102: readdressed the security
                    103: concerns. It also provided new features including a general
                    104: remote execution facility, a packet driver, and administrative aids.
                    105: This version (@approx@ 6800 lines) was distributed with Seventh Edition
                    106: .nr FL 4i
                    107: .UX
                    108: and instantly
                    109: became invaluable to the
                    110: .nr FL 5.5i
                    111: .UX
                    112: user community.  The second version
                    113: of UUCP is the version in use today with minor differences
                    114: among various flavors of
                    115: .UX .
                    116: .PP
                    117: Lots of
                    118: .UX
                    119: systems means lots of UUCP nodes sending lots of
                    120: data  (mail, netnews|reference(usenet byte), and other information)
                    121: to lots of other
                    122: .UX
                    123: systems.
                    124: The sheer volume of work that
                    125: UUCP was required to handle taxed its engineered limits
                    126: beyond its capabilities.  Stu Feldman has compared it to a bicycle bridge
                    127: over which tanks must now cross.
                    128: .NH
                    129: Introduction
                    130: .PP
                    131: Here we present a brief description of how UUCP works from a
                    132: functional point of view.  Those familiar with UUCP's internals
                    133: might skip this section. 
                    134: .PP
                    135: UUCP is a system composed of four principal programs and
                    136: several administrative support programs.  The core programs
                    137: are \fIuucp\fR, \fIuucico\fR, \fIuux\fR, and \fIuuxqt\fR*.
                    138: .FS
                    139: *The names are pronounced by sounding the name of each letter.
                    140: .FE
                    141: Administrative programs
                    142: include \fIuuclean\fR, \fIuulog\fR, \fIuustat\fR and possibly others depending
                    143: upon which strain of the second version you look at.
                    144: The system provides a mechanism to
                    145: move data among computers and optionally to invoke commands remotely
                    146: upon the transferred data.
                    147: .PP
                    148: The \fIuucp\fR command behaves much like the standard
                    149: .UX
                    150: copy command, \fIcp\fR.
                    151: While \fIcp\fR will only copy files on the same machine,
                    152: \fIuucp\fR will copy files
                    153: among machines.  \fIUucp\fR is a batch mode command that
                    154: queues requests for copying.
                    155: The \fIuucp\fR command
                    156: creates files in the \fIuucp spool directory\fR that specify the
                    157: user's request.
                    158: \fIUucp\fR generates two types of files:
                    159: \fIcommand file\fRs (whose names are prefixed with \fIC.\fR) and
                    160: the \fIdata file\fRs
                    161: (prefixed with \fID\fR.).
                    162: Each \fIuucp\fR command will generate as few as one
                    163: command file and a data file for each file that
                    164: the user has requested to be transferred.
                    165: The command file
                    166: specifies whether this is a request to send files to a remote system
                    167: or to receive them and contains information regarding the
                    168: name of the target files, the user and various options.
                    169: The data file contains the information to be transferred.
                    170: .PP
                    171: The \fIuux\fR command also
                    172: queues requests in the spool directory.
                    173: It
                    174: generates an additional type of file, the \fIexecution
                    175: file\fR.
                    176: This file contains information required for
                    177: remote command execution,
                    178: and includes the name of the command,
                    179: input and output specifications, and other information relevant to
                    180: the treatment of the remotely executed command's status.
                    181: On the local system, it is treated as a data file.
                    182: \fIUux\fR also creates
                    183: data files containing information required by the commands
                    184: to be executed remotely
                    185: and a command file to specify the transfer of the data files
                    186: described.
                    187: .PP
                    188: The \fIuucico\fR program is the workhorse of UUCP.
                    189: While \fIuux\fR and \fIuucp\fR
                    190: merely queue work into the spool directory, \fIuucico\fR
                    191: examines the spool directory and enacts the transfer of data
                    192: as dictated by the command files.  A simplistic view of \fIuucico\fR is:
                    193: .IP
                    194: Connect to remote system.
                    195: .IP
                    196: Cycle through command files and send or receive data as prescribed.
                    197: .IP
                    198: Allow remote system to send or receive files if it has command files
                    199: for the local system.
                    200: .IP
                    201: Hang up.
                    202: .IP
                    203: Invoke \fIuuxqt\fR to process execution files that have been received.
                    204: .PP
                    205: The \fIuuxqt\fR program performs the execution of remotely specified
                    206: commands.
                    207: We noted that \fIuux\fR creates data files to be transferred
                    208: to the remote.
                    209: The special data file that specifies the command to be executed
                    210: is renamed when it is copied to the remote to indicate that it is an
                    211: execution file. 
                    212: \fIUuxqt\fR searches
                    213: the spool directory for execution files
                    214: (whose names begin with
                    215: .CW X. )
                    216: and operates upon them.
                    217: These files contain the command to be executed, indicate which
                    218: other files are to be used in conjunction with the command, and
                    219: determine the fate of the output of said command.
                    220: .NH
                    221: Problems
                    222: .PP
                    223: The second version of UUCP served mostly as a base upon which
                    224: many many variations were built.
                    225: The multiplicity
                    226: was in response to the problems associated with the second version.
                    227: Its extraordinary use caused many bugs and design flaws to surface.
                    228: We will discuss these problems and some earlier attempts
                    229: to rectify them.  The section after will describe the solutions
                    230: implemented in our (the third) version of UUCP.
                    231: .NH 2
                    232: Performance
                    233: .PP
                    234: The major issue here revolves around a problem of positive feedback.
                    235: UUCP depends heavily upon the
                    236: .UX
                    237: file system.  The location of data within
                    238: the file system and the names of the files containing data impart
                    239: specific knowledge to UUCP.  The second version of UUCP uses a
                    240: single directory to store its command files, data files, execution
                    241: files, lock files, temporary files, etc.  On a smoothly running
                    242: heavily trafficked system, the numbers of these files will typically
                    243: range in the hundreds.  The searching of large directories is performed
                    244: inefficiently in
                    245: .UX *.
                    246: .FS
                    247: *This is representative of some of
                    248: .UX `s
                    249: controversial
                    250: design decisions.  It does the job in a straightforward manner which
                    251: is usually quite suitable.
                    252: Although there are admittedly pathological cases
                    253: which are problematic, the operating system was not contorted
                    254: to handle them specially.
                    255: Usually reevaluation of their design will indicate a more
                    256: appropriate solution.
                    257: .FE
                    258: Accessing data files or information relevant to such files involved
                    259: locating the name of the file (a directory search) and then checking
                    260: the status of the file (another directory search).
                    261: The time to perform these operations is then
                    262: quadratic in the number of directory entries.
                    263: The performance degradation due to manipulating files in very large
                    264: directories results in the following common scenario.
                    265: .IP
                    266: UUCP connects to a remote system.
                    267: .IP
                    268: It then begins to search the spool directory for work files relevant
                    269: to this session.  This takes an inordinate amount of time.
                    270: .IP
                    271: The remote system times out waiting for UUCP to indicate its intentions.
                    272: It disconnects.
                    273: .IP
                    274: UUCP finally completes its task, finds that the remote is no longer
                    275: connected and hangs up.
                    276: .IP
                    277: Some time later the cycle is repeated.
                    278: .PP
                    279: This positive feedback loop consumes large amounts of resources
                    280: yet produces no work.
                    281: The problem becomes worse as more and more
                    282: requests are placed in the spool directory.
                    283: This then fatally cripples
                    284: UUCP.  In order to get the system working again, the administrator
                    285: chooses between time-consuming, tedious, error-prone manipulations (create a new
                    286: spool directory and slowly feed data and work files into it at
                    287: a rate no greater than they are processed) and merely
                    288: deleting all the queued files (with the obvious effects of lost data).
                    289: .PP
                    290: There are several reasons why the spool directory may become very large.
                    291: A remote system may be unavailable for an extended period of time while
                    292: work continues to be spooled for it.
                    293: A site may act as a central distribution point for large volumes of information
                    294: to many other systems.
                    295: The addition of more nodes may provide the straw that breaks UUCP.
                    296: A system may find itself short on cycles on a given day and the extended
                    297: time required to process work may provide the stimulus to begin a positive
                    298: feedback cycle.
                    299: Once the syndrome is displayed, the situation deteriorates.
                    300: As the number of UUCP sites grows and the amount of information transferred
                    301: increases this effect becomes more probable.
                    302: .PP
                    303: There have been various attacks on this problem.  Some address only the
                    304: symptoms, others merely postpone its onset.
                    305: They include:
                    306: .IP
                    307: The initial approach:  To increase the amount of time a system will
                    308: wait until it decides to give up.  This does just that.
                    309: .IP
                    310: The automatic recovery approach:
                    311: A set of programs to move the spool directory, recreate it, and
                    312: add the files back in the correct order for processing.  It typically takes
                    313: several days to set things right again (until the next time).
                    314: .IP
                    315: The approach in 4.2bsd (credited to Tom Truscott):  Separate the spool
                    316: directory into subdirectories, one each for command files, data files,
                    317: and execution files.  This reduces the probability of a blockage or
                    318: postpones its occurrence because each directory is somewhat smaller.
                    319: However potential for problems remains as great.
                    320: .IP
                    321: A method we used on a major information distribution hub:
                    322: We recompiled the
                    323: UUCP programs with different spool directories for each of the
                    324: sites to which we distribute.
                    325: The distribution software used the appropriate version
                    326: of \fIuucico\fR.
                    327: The \fIlogin shell\fR for each of the affected systems was
                    328: determined likewise.  The major drawback was the number of copies of
                    329: UUCP programs required.
                    330: Also, some work was spooled in special directories
                    331: and other jobs were spooled in the main spool directory because
                    332: of the desire not to change the programs that use UUCP.
                    333: Although this might seem advantageous (netnews in one directory, mail
                    334: in another) when the remote system called us, we only processed the work in
                    335: the special spool directory.  Both spool directories were used when we called out.
                    336: .NH 2
                    337: Security
                    338: .PP
                    339: The second version of UUCP presented mechanisms that enabled
                    340: the system to be secure, but they were poorly understood
                    341: and were usually ignored.
                    342: These mechanisms  were also not flexible enough
                    343: to enforce security where it was needed and omit it from where it
                    344: wasn't.
                    345: .PP
                    346: The second version dealt with security on three fronts.
                    347: .PP
                    348: 1)
                    349: The login shell for UUCP was not a general purpose shell, and
                    350: only a complex program (i.e., UUCP) could make use of this access.
                    351: .PP
                    352: 2)
                    353: By previous arrangement any
                    354: communicating systems could share a sequence number which was incremented for
                    355: each session.
                    356: This required that an imposter not only know the login
                    357: and password, but the sequence number as well.
                    358: A penetration would be discovered as the legitimate system would now be
                    359: out of synch.
                    360: .PP
                    361: 3)
                    362: The USERFILE was not administrator
                    363: friendly.
                    364: It provided four types of constraint.
                    365: .IP [1]
                    366: Files accessible by a normal user of the local system.
                    367: .IP [2]
                    368: Which files can be accessed from a remote system.
                    369: .IP [3]
                    370: Login name used by a remote system.
                    371: .IP [4]
                    372: Whether a remote system should be called back in order to confirm
                    373: its identity.
                    374: .PP
                    375: The special login shell was the most important development.
                    376: That allowed
                    377: access restricted to and by the UUCP programs.
                    378: The sequence file facility, to the best of our
                    379: knowledge, has never been used other than to test its capabilities.
                    380: Its lack of use must be blamed on inadequate documentation.
                    381: We considered removing it from our rewrite but
                    382: felt that it may still prove valuable.
                    383: The USERFILE concept provided a good base but was not flexible enough
                    384: for the various environments in which it would be used.
                    385: It could not grant
                    386: different access to files depending
                    387: upon whether they were to be read or written (many systems are not willing
                    388: to allow data to escape, but eagerly accept contributions).  It lacked
                    389: an ``all but'' syntax.
                    390: It vainly attempted to restrict local users' access.
                    391: Normal
                    392: .UX
                    393: file access
                    394: mechanisms were satisfactory in this regard.
                    395: We provide new semantics
                    396: and a significantly improved syntax which is discussed later on.
                    397: .PP
                    398: Recently another version of UUCP* was developed at AT&T Bell Labs|reference(morris try uucp)|reference(morris maintaining uucp)
                    399: whose main thrust was to address the security aspects.
                    400: .FS
                    401: * It is not our purpose to completely describe it but to point to
                    402: some examples of alternate approaches.
                    403: .FE
                    404: Systems may not request files nor can files be received at destinations
                    405: other than a public directory and an additional directory provided as a
                    406: sort of secured receiving dock.
                    407: Although it does well in its attempt to tighten up security, it takes a
                    408: rather severe approach that can get in the way of users in a casual
                    409: environment.
                    410: .NH 2
                    411: Obsolescence
                    412: .PP
                    413: The second version of UUCP was designed for two types
                    414: of communications media,
                    415: the Bell 801C/212A type Automatic Calling Unit (ACU) and modem hardware,
                    416: and direct hardwired lines.
                    417: The code was simply implemented as:
                    418: .P1 0
                    419: if (ACU)
                    420:    call(flds); /* use the 801/212 */
                    421: else
                    422:    direct(flds); /* just open the device */
                    423: .P2
                    424: .PP
                    425: Code was later added for some special network apparatus
                    426: (DATAKIT).
                    427: This was patched in with conditional compilation.
                    428: Incorporation of new calling hardware was messy
                    429: and error-prone.
                    430: .PP
                    431: The mechanism that UUCP provided
                    432: for negotiating a connection with a remote system (expect this, send that, ...)
                    433: was not general enough.
                    434: For example, each token sent out was terminated by a newline character.
                    435: As port selectors of various
                    436: flavors became more prevalent, their idiosyncrasies became more
                    437: troublesome.
                    438: It was not uncommon to be required to present them
                    439: with arbitrary characters, delays of varying duration,
                    440: or tokens that did not end in newline.
                    441: One accepted only an even parity carriage return.
                    442: These capabilities were
                    443: difficult or impossible to provide without changing the code.
                    444: Therefore new syntaxes and special tokens were invented as the
                    445: need arose that led to a variety of incompatible connection descriptions.
                    446: Even if the hardware worked properly, there was a significant
                    447: probability that the connection would fail to be completed.
                    448: .PP
                    449: Most recent fixes to UUCP addressed the token problem, though
                    450: few used the same conventions and many were lacking
                    451: some key capability or another.  The addition of new hardware was generally
                    452: handled with conditional compilations and new keywords were invented as
                    453: needed.
                    454: Several systems implemented connection routines
                    455: as a general library function, isolating, but not resolving, the problems.
                    456: .NH 2
                    457: Limitations
                    458: .PP
                    459: When UUCP was designed several decisions had to be made based on
                    460: anticipated usage.
                    461: Many of the practical limits imposed have been exceeded.
                    462: The greatest problems occur in the area of array sizes.
                    463: UUCP handles all sorts of arrays that represent
                    464: commands, users, files and systems.
                    465: At a time when most sites could be easily connected with all others
                    466: the limit of 64 characters easily accommodated an electronic mail
                    467: address.
                    468: But the network has grown quite wide and such addresses often
                    469: exceed two hundred characters.
                    470: Some versions of
                    471: .UX
                    472: permit login names that exceed the standard restrictions on the number
                    473: of characters.
                    474: These developments require changes to the limits imposed by UUCP.
                    475: .PP
                    476: Some limits were imposed due to system design constraints.
                    477: The name of a site was restricted to seven characters because
                    478: it was encoded into file names along with a two character type
                    479: prefix, a grade consisting of one character and four characters making
                    480: up a sequence number.
                    481: It is becoming increasingly difficult, with thousands of sites,
                    482: to select mnemonic names with this limitation.
                    483: The problem is becoming more severe as
                    484: .UX ,
                    485: and therefore UUCP, usage grows explosively.
                    486: .NH 2
                    487: Error Handling
                    488: .PP
                    489: UUCP often becomes totally frustrated when erroneous data is
                    490: presented to it.
                    491: It is common that a command file will be created with invalid
                    492: fields and \fIuucico\fR will unexpectedly abort in an attempt
                    493: to process it.
                    494: All subsequent invocations of \fIuucico\fR exhibit the same
                    495: behavior until the bad file is manually removed.
                    496: Such files are created in the first place because UUCP fails to
                    497: check the return status of critical \fIwrite\fR system calls.
                    498: They are allowed to impede the system because there is seldom
                    499: any attention paid to the values returned from \fIread\fR.
                    500: When a system runs out of disk space
                    501: (which systems very often do),
                    502: failing \fIwrite\fRs go unnoticed yet files appear to be transferred
                    503: successfully.
                    504: Data is lost with no error indication whatsoever.
                    505: .NH 2
                    506: Inconsistency
                    507: .PP
                    508: Because of the problems described above UUCP has been modified
                    509: by many systems maintainers.
                    510: Modifications include necessary bug fixes required for normal use,
                    511: enhancements required by users with special needs, and changes
                    512: to make the system more robust.
                    513: Significant work has been 
                    514: done at Rand, AT&T Bell Labs,
                    515: ITT, UC Berkeley, Duke and many others.
                    516: Unfortunately the various
                    517: versions represent different solutions to the same problems and
                    518: they are sometimes incompatible.
                    519: For example the syntaxes used to specify
                    520: scripts for connections have been vastly different.
                    521: Since few versions are alike, enhancements
                    522: and fixes
                    523: won't apply to another version and
                    524: will be of limited value to the overall community.
                    525: This is especially frustrating when good solutions are presented
                    526: but not widely accepted because of the cost of providing a different
                    527: implementation.
                    528: .NH 2
                    529: Administration
                    530: .PP
                    531: The second version of UUCP is difficult to administer.
                    532: It introduced two administrative tools, \fIuuclean\fR and \fIuulog\fR,
                    533: and others have come about since.
                    534: But these programs are not sufficient and there are problems with them.
                    535: .PP
                    536: \fIUuclean\fR was introduced to aid the administrator by
                    537: cleaning up after UUCP.
                    538: It would find old files (temporaries, spooled
                    539: requests, etc.), remove them and optionally notify a user.
                    540: However, deleting old files is not always the best approach.
                    541: Often such files represented precious data that could not be regenerated.
                    542: The algorithm for notification would often inform an inappropriate
                    543: user of the deletion.
                    544: Even if the appropriate
                    545: person was notified, the information contained in the notification was
                    546: cryptic and unuseful.  For example:
                    547: .P1 0
                    548: file D.fooAD1234 removed after two weeks.
                    549: Could not contact remote.
                    550: .P2
                    551: .PP
                    552: UUCP kept log information in a single file.
                    553: If that file was busy, a process would use a temporary log file instead.
                    554: The access modes of the temporaries indicated whether or not the
                    555: process that owned them was still active.
                    556: If they were not active, then \fIuulog\fR consolidated them into the main
                    557: log file.
                    558: However its purpose was often defeated because UUCP processes that terminated
                    559: abnormally did not mark the temporaries for consolidation.
                    560: \fIUuclean\fR would then come along and eradicate information
                    561: that would have been useful for debugging.
                    562: \fIUulog\fR also had options to find log information about a system or a user.
                    563: This function is more easily performed by \fIgrep\fR and \fIsed\fR.
                    564: With the enhanced second version of UUCP introduced with
                    565: .UX
                    566: 3.0
                    567: (System III) came the \fIuustat\fR command.  This was a good attempt at a program to
                    568: aid administration and enhance the user's capabilities for control and
                    569: access.  Unfortunately its implementation was weak, requiring many
                    570: hooks into UUCP and acting as another fragile link in the
                    571: increasingly unstable system.
                    572: .NH 2
                    573: Code Maintenance
                    574: .PP
                    575: One of the problems associated with any large system is maintaining
                    576: the source code.  This problem is aggravated in UUCP because it has
                    577: been an extremely dynamic system (as measured by the number of Modification
                    578: Requests entered for it).
                    579: The coding responsibility is no longer with
                    580: the designers, but has been assigned to programmers (over the past
                    581: several years) with differing experience levels.  The source code is scarred
                    582: by the many hands that have operated on it.  As early as 1980,
                    583: individuals responsible
                    584: for UUCP 
                    585: were hesitant to make any changes because
                    586: it had become ``too big a mess and was too difficult to maintain''.  Despite
                    587: this attitude, UUCP continued to be fixed, enhanced,
                    588: and otherwise modified, and grew ever more unmaintainable.
                    589: .NH
                    590: The Solutions
                    591: .PP
                    592: .NH 2
                    593: Site Name Hashing
                    594: .PP
                    595: The rationale for reorganizing UUCP's data into separate directories
                    596: has been described.
                    597: However it later became apparent that this
                    598: technique was not necessary to deal with the intended problem.
                    599: Some technical understanding of
                    600: .UX
                    601: is required to fully appreciate the following.
                    602: The culprit that caused the quadratic behavior in the second version
                    603: of UUCP was a gratuitous \fIstat\fR system call placed in a procedure
                    604: that searched for command files.
                    605: This function read the name of each file from the spool directory.
                    606: It checked that the file had the proper prefix and
                    607: then used \fIstat\fR to determine if it was publicly readable.
                    608: UUCP created command files write-only (mode 0200) by the uucp login and
                    609: changed them to be publicly readable when they were complete.
                    610: This prevented the system from using partially written files.
                    611: Since the file was \fIwrite-only\fR, an open for reading by the
                    612: search function would fail.
                    613: The use of \fIstat\fR was presumably an additional check to back up
                    614: the normal system access mechanism.
                    615: As the code was revised, the \fIstat\fR became an \fIaccess\fR, and that
                    616: eventually disappeared without fanfare.
                    617: Directory searching within UUCP became virtually linear with respect
                    618: to the size of the directory.
                    619: (Multiple processes encountered directory locking phenomena.)
                    620: In retrospect it
                    621: appears obvious that that was the
                    622: solution to the critical performance problem.
                    623: But before that was realized separate spool directories had been
                    624: implemented.  The other benefits of such a design justify its existence.
                    625: .PP
                    626: Data files representing a particular remote system are now
                    627: placed in a directory with the same name as the remote system.
                    628: This name is stored in a global variable.
                    629: The UUCP programs that access these files change
                    630: their working directory into the directory associated with
                    631: the remote system and perform their operations there.
                    632: This is in effect a simple hashing algorithm.
                    633: It improves access time, especially for heavily loaded systems.
                    634: It also provides a convenient structure for data storage that
                    635: is taken advantage of by programs and by people.  For example if you want
                    636: to know how many files are destined for a system named \fIsfwoo\fR,
                    637: you could:
                    638: .P1 0
                    639: wc -c /usr/spool/uucp/sfwoo/C*
                    640: .P2
                    641: It is also advantageous to know that
                    642: files in a system's directory were put there either by the given system or by
                    643: the local UUCP.  This bit of knowledge will be exploited later
                    644: in the discussion of security mechanisms.
                    645: .PP
                    646: Another outgrowth of separate spool directories is the notion
                    647: of parallel remote execution processing.
                    648: The process that executes commands on behalf of remote systems (\fIuuxqt\fR)
                    649: finds work in separate directories.
                    650: Multiple \fIuuxqt\fRs
                    651: can execute simultaneously, one per remote.
                    652: This is a reasonable compromise
                    653: between the limit of one invocation of \fIuuxqt\fR per local system and
                    654: the possibility of one per X. file.
                    655: We provide
                    656: optional limiting so that a machine can support useful work in addition to
                    657: handling mail and netnews.
                    658: .NH 2
                    659: Site Name Limitations
                    660: .PP
                    661: The name of a site is no longer encoded in the file name.
                    662: The location of the file in the directory structure implies the site.
                    663: All C. files in
                    664: .CW /usr/spool/uucp/fugit
                    665: are work files for the system named \fIfugit\fR,
                    666: all X. files in
                    667: .CW /usr/spool/uucp/gummo
                    668: are remote
                    669: execution requests from the system named \fIgummo\fR, etc.
                    670: This means that site names need no
                    671: longer be limited by seven (or six in some versions) characters.
                    672: Since the directory name is the limiting factor, site names of
                    673: up to fourteen characters are permitted.
                    674: We have tried to isolate this limitation to a single manifest constant.
                    675: Thus systems which support longer file names may allow site names of greater
                    676: length.
                    677: Perhaps future versions will use the directory name as a pointer
                    678: to the real site name.
                    679: Even conservative use of the character set would allow over
                    680: @ 64 sup 14 @ different names.
                    681: This added flexibility (increasing
                    682: the name space) has some controversial ramifications which are discussed
                    683: further on.
                    684: .NH 2
                    685: Security
                    686: .PP
                    687: Our goal with respect to UUCP security was to make the mechanisms robust,
                    688: flexible and usable.
                    689: Robustness was achieved by fixing bugs, plugging holes,
                    690: being careful in designing and coding our revisions,
                    691: and thorough testing under a variety of operating conditions.
                    692: Flexibility and usability came together in what is known as the
                    693: \fIPermissions\fR file.
                    694: .PP
                    695: The \fIPermissions\fR file replaces the \fIUSERFILE\fR of the second version of
                    696: UUCP.
                    697: Its purpose is to support a mechanism for clearly and flexibly
                    698: stating what restrictions apply to or what permissions are granted to
                    699: the sites with which the local UUCP system communicates.
                    700: It is located in the UUCP library directory and
                    701: contains statements which customize the behavior of UUCP for any or all
                    702: systems by identifying them with the login name they use or their site name.
                    703: The statements described are
                    704: used in conjunction with two basic types of entries which
                    705: are
                    706: .P1
                    707: LOGNAME=
                    708: .P2
                    709: for remotely initiated connections and
                    710: .P1
                    711: MACHINE=
                    712: .P2
                    713: for locally initiated connections.
                    714: There must be a LOGNAME= statement for each login that might be used
                    715: by a remote system.
                    716: The minimal contents of the
                    717: \fIPermissions\fR file is:
                    718: .P1 0
                    719: LOGNAME=uucp
                    720: .P2
                    721: This specifies that a remote system may login as \fIuucp\fR and will be
                    722: restricted by the defaults.
                    723: .PP
                    724: The permissions fall into three basic categories:
                    725: file system access,
                    726: command execution,
                    727: and identity verification.
                    728: .PP
                    729: File system access permissions dictate which directories a remote system
                    730: may access for reading, and, separately, which may be accessed for writing.
                    731: This is done by specifying any combination of the keywords
                    732: .CW READ ,
                    733: .CW WRITE ,
                    734: .CW NOREAD ,
                    735: and
                    736: .CW NOWRITE
                    737: followed by a
                    738: .CW :
                    739: separated list of directories.
                    740: In the example:
                    741: .P1 0
                    742: READ=/usr/ber:/usr/honey:/usr/dan \e
                    743:    WRITE=/tmp NOREAD=/usr/ber/secret
                    744: .P2
                    745: a system can read any files
                    746: that the UUCP login can access
                    747: in the directories
                    748: .CW /usr/ber ,
                    749: .CW /usr/honey ,
                    750: and
                    751: .CW /usr/dan
                    752: except those files in
                    753: .CW /usr/ber/secret .
                    754: It can also write into any file in
                    755: .CW /tmp .
                    756: .PP
                    757: The command execution permissions specify commands that can be invoked.
                    758: .P1 0
                    759: COMMANDS=rnews:lpr:opr:rmail
                    760: .P2
                    761: shows that the site associated with this line can execute any of the
                    762: listed commands and no others.
                    763: If a path name is specified then it
                    764: must match the command requested by the remote system exactly.
                    765: .PP
                    766: Identity verification is accomplished in a variety of ways.
                    767: .CW CALLBACK=yes
                    768: is most restrictive.
                    769: It requires that when the remote system calls, it
                    770: must hang up and wait for the local system to return the call.
                    771: This provides 
                    772: the greatest assurance that we are communicating with the correct party.
                    773: .PP
                    774: .CW SENDFILES=no
                    775: prevents the \fImaster/slave\fR protocol from being
                    776: reversed when the remote system calls.
                    777: The result is that although the local site may
                    778: have data queued for the remote site, it will not transmit it if the
                    779: remote system originates the call.
                    780: This is slightly less restrictive
                    781: than
                    782: .CW CALLBACK=yes .
                    783: .PP
                    784: .CW REQUEST=no
                    785: indicates that the remote site may not request files from us under
                    786: any circumstance.
                    787: In order to receive files the remote user must
                    788: have an agent on the local site to initiate the transfer.
                    789: This restriction applies no matter who calls whom.
                    790: .PP
                    791: Finally, when
                    792: .CW VALIDATE=
                    793: appears, the specified systems must have
                    794: logged in using one of the associated logins indicated.
                    795: For example:
                    796: .P1 0
                    797: LOGNAME=Umarx VALIDATE=chico:harpo:zeppo
                    798: .P2
                    799: will cause UUCP to terminate the conversation if \fIchico\fR, \fIharpo\fR or
                    800: \fIzeppo\fR log in with a name other than \fIUmarx\fR.
                    801: .PP
                    802: The default permissions are:
                    803: .P1 0
                    804: LOGNAME=uucp \e
                    805:   WRITE=/usr/spool/uucppublic \e
                    806:   REQUEST=no SENDFILES=no \e
                    807:   COMMANDS=rmail:rnews
                    808: .P2
                    809: Note that the statement must appear as a single record.  Lengthy statements
                    810: may be continued with
                    811: .CW \e .
                    812: Appendix I is a sample \fIPermissions\fR file,
                    813: Appendix II is the description emitted from a program that checks the
                    814: \fIPermissions\fR file (described later).
                    815: .PP
                    816: These mechanisms allow a site to implement secure features where
                    817: they are needed while still allowing considerable flexibility in the
                    818: treatment of sites based on knowledge attributed to the login method
                    819: and remote name.
                    820: This concept allows UUCP to be useful
                    821: both with tightly coupled well-trusted machines and the loosely
                    822: coupled less secure dialup network environment.
                    823: .NH 2
                    824: A Rational Connection Function
                    825: .PP
                    826: The third general area of revision is that of the connection function.
                    827: The \fIconn\fR of UUCP is a beautiful abstraction that subsumes all the
                    828: knowledge of setting up a connection to a remote system.
                    829: It takes as its
                    830: argument the name of the remote system and returns a file descriptor open for
                    831: reading and writing to communicate with it.
                    832: .I conn
                    833: accounts for
                    834: over ten percent of the UUCP code.
                    835: Its function is applicable to
                    836: any utility that connects to a remote system or resource.
                    837: Several
                    838: developers have extracted
                    839: .I conn
                    840: from UUCP and provided it as
                    841: a stand alone facility (\fIdial\fR(3) in System V and \fIdialout\fR(3)
                    842: in Eighth Edition
                    843: .UX ).
                    844: Our implementation is suited to that purpose as well, though
                    845: .I conn
                    846: remains bundled with UUCP.
                    847: .PP
                    848: The goals in revising
                    849: .I conn
                    850: were to bolster its robustness,
                    851: handle more types of connecting hardware and to provide a
                    852: mechanism for easily utilizing new hardware.
                    853: This was done by splitting the hardware-dependent operations from
                    854: .I conn
                    855: into two routines.
                    856: One understands the needs of
                    857: \fIcallers\fR (e.g., how to interpret the fields in the \fISystems\fR file to them)
                    858: and deals with locking and bookkeeping.
                    859: The other understands how to manipulate the hardware to connect to a remote
                    860: resource (parochially known as dialing).
                    861: .I Conn
                    862: uses a table containing the name of each
                    863: caller (ACU, Micom, TCP, Sytek, etc.) and a pointer to the function
                    864: that manipulates it.
                    865: The caller function uses a table of \fIdialers\fR which contains their
                    866: names (212, Penril, Vadic, etc.), and pointers to the
                    867: functions that perform dialing.
                    868: Not all callers have associated dialers.
                    869: Another way to describe it is that the caller specifies the nature of the
                    870: network and the dialer dictates the mechanism to access such a network.
                    871: Thus we find currently that there are many dialers for the ACU caller
                    872: because there is a variety of hardware to access the Direct Distance Dialing
                    873: network.
                    874: But we have only one interface to the DATAKIT network so the calling
                    875: routine for it may as well (and indeed does) include the dialing function.
                    876: If alternate interfaces become available then the dialing function will
                    877: be split out and the caller will be able to choose among them.
                    878: The enhancement procedure for hardware unknown to us at the time of
                    879: this writing then entails supplying a new caller and
                    880: dialer function, updating the tables, and recompiling.
                    881: .PP
                    882: Given these tables which contain identifiers, we provide a new
                    883: syntax for the \fIDevices\fR file (formerly called \fIL-devices\fR) in which the
                    884: caller hardware and dialer function are specified.  Appendix III, is a sample
                    885: \fIDevices\fR file, Appendix IV is a sample
                    886: \fISystems\fR file (formerly \fIL.sys\fR).
                    887: (\fIL-dialcodes\fR has been renamed \fIDialcodes\fR but is unchanged from previous
                    888: versions.)
                    889: Note the existence of a \fIchat\fR script in the \fIDevices\fR file.
                    890: This is a syntactic convenience used to isolate the differences in various
                    891: switches so their similarities can be exploited in a
                    892: generic caller routine.  This helps to clean up the \fISystems\fR file.
                    893: .PP
                    894: .I Conn
                    895: is called with the name of the remote system and
                    896: behaves as follows:
                    897: .P1 0
                    898: .ps -1
                    899: .vs -1p
                    900: for each entry in \fISystems\fP that matches the argument
                    901:     for each caller in \fIDevices\fP that matches this entry
                    902:         if this caller doesn't need a dialer
                    903:             attempt to connect
                    904:             if successful
                    905:                 return file descriptor
                    906:         else
                    907:             for each dialer that can be used with this caller
                    908:                 attempt a connection using the dialer function
                    909:                 if successful
                    910:                     return file descriptor
                    911: try again later
                    912: .ps
                    913: .vs
                    914: .P2
                    915: .PP
                    916: This mechanism allows us to exploit all the alternative
                    917: hardware at our disposal in an attempt to make a connection.
                    918: The priorities of the various alternatives are expressed in the
                    919: ordering of the entries in the \fISystems\fR and \fIDevices\fR files.
                    920: A subtlety of interest is the use of the \f(CWANY\fR keyword in the \fIclass\fR
                    921: fields of the \fIDevices\fR file.  This affords more flexibility
                    922: in determining which connection hardware to use.  For example one may
                    923: wish to connect to some systems at lower speeds than the hardware is
                    924: capable of to counteract deficiencies in their terminal drivers.
                    925: .PP
                    926: UUCP selects a protocol used to communicate with a remote system.
                    927: Typically this is the `g' protocol which is a variant of X.25.
                    928: It uses 64 byte packets and is quite resilient in error-rich environs
                    929: such as the DDD network.
                    930: There were also the `x' and `d' protocols for use over
                    931: X.25 and DATAKIT lines.
                    932: We have added the
                    933: `e' protocol (ostensibly for Ethernet),
                    934: which is suitable for error
                    935: free transmission media.
                    936: The packet size is in fact the file size,
                    937: so the overhead becomes almost negligible.
                    938: The \fISystems\fR file has been enhanced to provide the ability
                    939: to specify a preferred protocol depending on the hardware used to initiate
                    940: the connection.  (We attribute this idea to R. T. Morris|reference(morris maintaining uucp).)
                    941: .PP
                    942: A problem with the coding of
                    943: .I conn
                    944: is that it nests very deeply in order to
                    945: establish a connection.
                    946: The handling of error-returns through intermediate functions
                    947: was clumsy and not generalized.
                    948: The use of a single error-indicating variable (\fIUerror\fR)
                    949: has allowed us to implement the function more cleanly.
                    950: .NH 2
                    951: Coping With Bad Data and Inadequate Environments
                    952: .PP
                    953: Although the new implementation of UUCP is laudably robust in the creation
                    954: and transmission of data, it will still have to deal with improperly formatted
                    955: files that are the result of lesser versions or system errors.
                    956: When UUCP evaluates a command or execution file it checks that the contents are
                    957: plausible.
                    958: When corrupt files are identified, they are moved to a special directory.
                    959: The administrative daemon checks this directory (\fI.Corrupt\fR)
                    960: periodically and informs the administrator of its contents.
                    961: .PP
                    962: Previous behavior with respect to handling conditions where a system
                    963: did not have adequate disk space was unacceptable and quite frustrating to
                    964: the anonymous users who had their data silently lost.
                    965: The new UUCP checks the level of the file system using the \fIustat\fR system call
                    966: (an equivalent user level routine is provided for systems lacking \fIustat\fR).
                    967: A special error code is transmitted to the remote system if there is
                    968: insufficient space.
                    969: The event is logged and the conversation is terminated.
                    970: If UUCP receives this error indication from a system, it will disengage
                    971: from the conversation assuming that the remote is in trouble.
                    972: Scans of the log files will reveal these situations and the local administrator
                    973: may wish to inform the remote counterpart.
                    974: There has been considerable discussion among the authors about
                    975: ways to improve the above scenarios.  It is generally agreed that
                    976: when a system runs out of space it ought to reverse its role and attempt
                    977: to send data.  If it had run out of space as master it ought to continue
                    978: scanning work files performing sends and deferring receives.
                    979: If the system notes that the remote has run out of space, then it ought
                    980: to scan the command files looking for receives and reverse roles when
                    981: they are completed.
                    982: Unfortunately, implementing these actions would be quite
                    983: complex.  They have been deferred to the wish list.
                    984: .NH
                    985: Getting It Up and Keeping It Running
                    986: .NH 2
                    987: Configuration
                    988: .PP
                    989: This system has been described as a tribute to the C preprocessor.
                    990: Because our goal was to produce a sound system to which
                    991: changes would inevitably be applied,
                    992: compile-time parameterization is ubiquitous.
                    993: It had to run on a variety of
                    994: .UX
                    995: versions and processors.
                    996: We also found the need for extensive options to express varied
                    997: preferences.
                    998: .PP
                    999: For instance, to compile a system for machines constrained by memory limitations
                   1000: we have provided a parameter that allows only the most critical debugging
                   1001: facilities to be included.  This idea of conditional compilation may be
                   1002: extended to the general case of time/speed tradeoffs.   Many algorithms
                   1003: are chosen in consideration of the environment in which they will be applied.
                   1004: But UUCP is used on many different processors by users with varying needs.
                   1005: Dynamic memory allocation, although costly in time and complexity, may
                   1006: be appropriate in order to drastically reduce the memory requirements.
                   1007: Systems running on machines with lots of memory ought to be able to have
                   1008: larger caches and faster hashing schemes.
                   1009: .PP
                   1010: It was also necessary to be able to configure it
                   1011: to interface with various user programs.
                   1012: For example,
                   1013: even though lock files don't belong in UUCP's spool directory, 
                   1014: in reality some people won't change the other programs that
                   1015: are affected.
                   1016: We provided the option for compatibility.
                   1017: .PP
                   1018: Another set of problems relegated to the preprocessor concerned opinion and taste.
                   1019: As the system was developed, there arose
                   1020: many situations where a new idea was not immediately embraced by all.
                   1021: Often it was not clear what the correct behavior
                   1022: should be, as `correctness' was sometimes subjective.
                   1023: Rather than throw out good (albeit minority opinion) ideas,
                   1024: or force them on others,
                   1025: they were compiled in optionally.
                   1026: Many of these eventually found enough favor to be included unconditionally.
                   1027: Others were blessed as the default, while some remain debatable.
                   1028: Parameters likely to be changed out of necessity or preference
                   1029: have been gathered in one place
                   1030: (\fIparms.h\fR) for easy identification and manipulation.
                   1031: .NH 2
                   1032: Installation
                   1033: .PP
                   1034: UUCP has become less straightforward in its use of the file system and
                   1035: more dependent upon various files to enhance its flexibility.
                   1036: It is more important than ever to aid the user in the installation
                   1037: process.
                   1038: Although the programs have been designed to fall back
                   1039: on sensible defaults if some files are not present (such as \fIMaxuuqts\fR
                   1040: which potentially limits the number of simultaneous \fIuuxqt\fRs),
                   1041: other files
                   1042: and directories are too critical to do without (e.g., \fISystems\fR).
                   1043: And for many the modes are quite important (imagine a spool directory only writable
                   1044: by root).
                   1045: Since this version is significantly different,
                   1046: current working data must be converted to conform to the required
                   1047: formats.  A comprehensive \fImakefile\fR provides the basis
                   1048: for installation (we thank those who were then 6.0 developers).
                   1049: A conversion shell script is provided as well as a program
                   1050: (\fIuucheck\fR) that verifies the installation and the integrity of the various
                   1051: files used by UUCP as well as optionally interpreting their contents
                   1052: to the user in very descriptive terms (i.e., system so-and-so can do
                   1053: such-and-such and is restricted from this-and-that).
                   1054: See Appendix II.
                   1055: Ideally a recipient of this package will be able to edit the
                   1056: parameter file, and type
                   1057: ``make install'' to generate a working system.
                   1058: .NH 2
                   1059: Maintenance
                   1060: .PP
                   1061: Although we have provided tools to get the system
                   1062: up and running, it's at least as important to help keep
                   1063: the system running smoothly.
                   1064: Due to the anarchic and volatile nature of the network that UUCP supports,
                   1065: not all requests that are generated are completed.  For one reason
                   1066: or another data files will become orphaned, command and execution files
                   1067: widowed, temporary files will strive for immortality, \fIcore\fR files
                   1068: will be born (not by UUCP of course) and \fIdead.letters\fR will litter
                   1069: directories.
                   1070: Only a program can expend the time and effort required to manage
                   1071: a busy system routinely.
                   1072: .PP
                   1073: One of the first programs we threw away was \fIuuclean\fR.
                   1074: This left us without an automated mechanism to sweep all of UUCP's
                   1075: litter under the rug.
                   1076: Over a period of several weeks we noted our actions and our
                   1077: thoughts as we manually handled the situations described above
                   1078: in the most considerate manner.
                   1079: From these observations a set of heuristics
                   1080: was compiled that effectively deal with the deficiencies of
                   1081: an imperfect system.
                   1082: They are represented by a program (\fIuucleanup\fR) that
                   1083: deals handily with the
                   1084: typical cases.
                   1085: Unanticipated problems are dealt with inelegantly
                   1086: in the style of \fIuuclean\fR, but are recorded to facilitate the
                   1087: incorporation of additional knowledge as it becomes necessary.
                   1088: Appendix V shows examples of the various situations encountered
                   1089: and how they are handled.
                   1090: This ``expert'' program along with expanded \fIdaemon shells\fR that
                   1091: monitor activity and generate reports provides enormous assistance
                   1092: in maintaining UUCP.
                   1093: .NH 2
                   1094: Accounting
                   1095: .PP
                   1096: All the core programs
                   1097: (\fIuucp\fR, \fIuucico\fR, \fIuuxqt\fR and \fIuux\fR) append accounting data
                   1098: to log files, but they do not operate on the data.
                   1099: Separate programs such as \fIuustat\fR are provided
                   1100: that examine the files and operate on their contents.
                   1101: Maintenance functions are also delegated to separate programs as
                   1102: discussed.  
                   1103: These separations
                   1104: have significantly reduced the complexity of the core programs.
                   1105: \fIUucp\fR spools requests to copy files.  \fIUux\fR spools remote
                   1106: command executions.  \fIUucico\fR performs the actual transfer of files and
                   1107: \fIuuxqt\fR executes remotely specified commands.
                   1108: .NH 1
                   1109: Things The Users Will Notice
                   1110: .NH 2
                   1111: Reporting Remote Execution Status
                   1112: .PP
                   1113: Specific knowledge of the commands invoked by \fIuuxqt\fR has been removed.
                   1114: All commands are handled in a uniform manner.
                   1115: .PP
                   1116: In previous versions of \fIuuxqt\fR, the \fImail\fR command was handled specially.
                   1117: Except for \fImail\fR, the return status of all commands was
                   1118: unconditionally reported to the invoker.
                   1119: For \fImail\fR however, no status was returned if the
                   1120: command succeeded.
                   1121: But, if the \fImail\fR command failed, \fIuuxqt\fR would
                   1122: return the standard input as well as the status.
                   1123: This was justified by the fact that \fIuuxqt\fR was principally used for
                   1124: remote mailing.
                   1125: When netnews became widely used, it too was a logical
                   1126: candidate for exceptional handling within \fIuuxqt\fR.
                   1127: Two approaches had been
                   1128: taken.  The first was to treat the \fIrnews\fR command specially and ignore the
                   1129: return status.
                   1130: The second, more elegant solution appeared in the version
                   1131: distributed with
                   1132: .UX
                   1133: 4.0.  That was to enhance \fIuux\fR
                   1134: (and \fIuuxqt\fR) with an option
                   1135: .CW -n ) (
                   1136: to specify that command return status was not
                   1137: to be sent back to the invoker.  This was a step in the right direction
                   1138: but was not sufficient.
                   1139: Another option was added locally to return status if and only if it was
                   1140: not zero
                   1141: .CW -z ). (
                   1142: This was still not good enough.  More flexibility
                   1143: was needed if we were to remove the builtin knowledge of what to do
                   1144: with \fImail\fR.
                   1145: Our solution is to provide three options to \fIuux\fR that modify
                   1146: \fIuuxqt\fR's behavior.  They are:
                   1147: .TS
                   1148: cFCW l.
                   1149: -n     do not request error notification
                   1150: -z     request success notification
                   1151: -b     return standard input on failure
                   1152: .TE
                   1153: Each option overrides the default behavior which is the opposite action.
                   1154: In all cases of a failure, the standard error output is mailed to the originator.
                   1155: Appendix VI is a sample message from UUCP resulting from a failed \fIrnews\fR
                   1156: command.
                   1157: Reporting error output is a significant enhancement.
                   1158: Now the user is provided with all available information regarding remotely
                   1159: executed commands with a general mechanism that handles all commands
                   1160: equally well.
                   1161: .NH 2
                   1162: Forwarding
                   1163: .PP
                   1164: Users have always been confused by the lack of a forwarding mechanism
                   1165: in UUCP.  Typically they assume that the syntax used by \fImail\fR
                   1166: is correct for \fIuucp\fR.
                   1167: For example,
                   1168: .P1
                   1169: mail harpo!allegra!princeton!honey
                   1170: uucp file harpo!princeton!/usr/honey/uucp/file
                   1171: .P2
                   1172: Until very recently \fIuucp\fR could
                   1173: not handle
                   1174: such a request.  In response to this Mark Horton wrote a command (\fIuusend\fR)
                   1175: which was distributed with 4.1bsd.  The \fIuusend\fR command accepted the
                   1176: mail-like syntax and used the identical mechanism.  The way it worked was that
                   1177: a \fIuux\fR command was issued to execute \fIuusend\fR on the next site in the
                   1178: path.
                   1179: There the \fIuusend\fR command issued another \fIuux\fR for the next site until
                   1180: the
                   1181: destination was reached.  The catch was that the \fIuusend\fR command must be
                   1182: permitted to be remotely executed on each intermediate site.
                   1183: In the version
                   1184: of UUCP that we used as a base a forwarding mechanism was incorporated into
                   1185: the code.  Unfortunately it appeared as a special case requiring additional
                   1186: semantics for \fIuuxqt\fR on the remote system.  This code was immediately excised
                   1187: (over 500 lines).
                   1188: .PP
                   1189: The \fIuusend\fR model was correct.
                   1190: But it was argued that it was desirable for
                   1191: \fIuucp\fR
                   1192: to accept
                   1193: the forwarding syntax rather than a separate command.  The other side of the
                   1194: argument was that a user could generate the \fIuux\fR command and \fIuucp\fR
                   1195: need know
                   1196: nothing of it.  It was further argued that \fIuucp\fR itself is merely a special
                   1197: case of the \fIuux\fR command (where the remotely executed command is \fIcp\fR)
                   1198: and ought
                   1199: to done away with (perhaps a shell procedure could take its place for
                   1200: convenience's sake).  The makers of the first argument prevailed and forwarding
                   1201: was put back into \fIuucp\fR.  However, rather than treat it as a special case
                   1202: on the remote end, \fIuucp\fR generates the appropriate \fIuux\fR command.
                   1203: This has the
                   1204: advantage that it is simpler and it will work with any version.
                   1205: The catch remains that the remote systems must allow the \fIuucp\fR command to
                   1206: be executed by \fIuuxqt\fR.  It's interesting to note that the very first
                   1207: version of
                   1208: UUCP used this same mechanism to implement ``uucp tilt!file whuxlb!file''.
                   1209: The
                   1210: local system effectively sent a \fIuux\fR request to execute \fIuucp\fR on
                   1211: \fItilt\fR to \fIwhuxlb\fR.
                   1212: This was the only remote execution done by the
                   1213: original (1976) version.
                   1214: Thus at that time one could accomplish forwarding by a succession of \fIuucp\fR
                   1215: commands.  I.e.,
                   1216: .P1
                   1217: uucp file ima!ist!file
                   1218: .P2
                   1219: could have been
                   1220: accomplished by
                   1221: .P1
                   1222: uucp file ima!file;
                   1223: sleep \fIn\fP
                   1224: uucp ima!file ist!file
                   1225: .P2
                   1226: The only problem was knowing the correct value for \fIn\fR.
                   1227: .NH 1
                   1228: Priorities
                   1229: .PP
                   1230: Versions of UUCP since the second have had the capability to
                   1231: grade file transfers by use of the
                   1232: .CW -g
                   1233: option.
                   1234: However it's not clear
                   1235: that there was an effect other than modifying the name of the command file.
                   1236: In our version, the grade option does something useful.
                   1237: When command files
                   1238: are gathered up, they are sorted, so the grade serves to order the
                   1239: processing of command files.
                   1240: When used with \fIuux\fR, the grade option is
                   1241: bound to the
                   1242: execution file as well.
                   1243: Thus upon receiving execution files, they are similarly
                   1244: gathered and sorted and the grade again dictates their execution order.
                   1245: The grade option could be used, for example, to provide mail with a higher
                   1246: priority than netnews.
                   1247: .NH 2
                   1248: Sending Files That Uucp Cannot Read
                   1249: .PP
                   1250: For reasons of security and convenience UUCP must run under a user id
                   1251: of its own.  The system would probably be more straightforward, more secure
                   1252: and functionally superior if UUCP were to run as \fIroot\fR.
                   1253: But that change seems drastic and would undoubtedly be unpopular.
                   1254: So UUCP stands on its head
                   1255: while bending over backwards to provide services and security
                   1256: without a privileged user id.
                   1257: There are two problems that users commonly complain about.
                   1258: The first is that files received via UUCP are owned by the uucp
                   1259: login and not their own.
                   1260: This is more of an administrative problem than a technical one.
                   1261: Although some versions of
                   1262: .UX
                   1263: allow users to arbitrarily change the ownership of their
                   1264: files, it is clearly less desirable to allow users to do this remotely.
                   1265: The problem is easy to get around on the receiving end by copying the files
                   1266: and removing the originals.
                   1267: The second problem is more serious.
                   1268: Users sending files often find that
                   1269: the request fails because \fIuucp\fR could not read their data due to stringent
                   1270: protections.
                   1271: This however can be dealt with since \fIuucp\fR is invoked by the
                   1272: user who does have permission to access said files.
                   1273: By default \fIuucp\fR does
                   1274: not
                   1275: copy the source files to its spool directory.
                   1276: Rather, it transfers the data
                   1277: directly from the specified file.
                   1278: However if the file is not readable by
                   1279: \fIuucp\fR,
                   1280: then it makes a copy using the invoker's access privileges but owned by the uucp
                   1281: login.
                   1282: The file remains secure with respect to the user population because its mode
                   1283: is changed to be readable only by the uucp login, after the data is copied in.
                   1284: This obviates the undesirable requirement that the user make a public copy or
                   1285: change the modes on the original file.
                   1286: .NH 2
                   1287: Documentation
                   1288: .PP
                   1289: Real programmers don't need auxiliary documentation, they read the
                   1290: source code.  In deference to those programmers we have put
                   1291: considerable effort into making the source code readable.
                   1292: But the UUCP user population will include many more who don't want
                   1293: to read the code (their loss).  For them we have revised the manual
                   1294: pages to reflect the system more accurately.  Many new manual pages
                   1295: are included covering the utilities mentioned.  Even manual pages
                   1296: for the embedded programs \fIuucico\fR and \fIuuxqt\fR have been written.
                   1297: Other documents have been published
                   1298: by the authors|reference(uucp security)|reference(honey danber nijmegen).
                   1299: A comprehensive administration guide will be included with
                   1300: the ``Basic Networking Utilities, UNIX System V''.
                   1301: .NH 1
                   1302: Things The Administrator Will Appreciate
                   1303: .NH 2
                   1304: New Semantics to Support Gateways
                   1305: .PP
                   1306: Two options used with the \fIPermissions\fR file
                   1307: allow users of UUCP to deal with some unresolved networking problems.
                   1308: They are the \fIMYNAME\fR and \fIPUBDIR\fR options.
                   1309: .PP
                   1310: As described previously, the \fIPermissions\fR file allows the system to behave
                   1311: differently depending upon the remote site it is communicating with.
                   1312: The \f(CWMYNAME=\fInewname\fR option instructs UUCP to behave as if the local system
                   1313: were
                   1314: named \fInewname\fR.  The \f(CWPUBDIR=\fI/newdir\fR causes the local system to use
                   1315: \fInewdir\fR
                   1316: rather than the standard spool directory for the remote system.
                   1317: Initially this was seen as a convenient mechanism for debugging.
                   1318: UUCP transactions
                   1319: could be made to take place within a single machine.
                   1320: However some more interesting possibilities arise.
                   1321: .PP
                   1322: One can set up a gateway machine for a group of others.  By instructing remote
                   1323: systems
                   1324: to connect to the same physical machine using different logins, data destined
                   1325: to the satellites will be transferred unwittingly to the gateway.  The data
                   1326: accumulated in the special spool directories for the satellites can be transferred
                   1327: to them and their UUCP systems can act upon it as if it had come directly from
                   1328: the originating system.  Similarly data destined for a remote
                   1329: system from one of the
                   1330: satellites
                   1331: can be redirected, using the \fIPUBDIR\fR option, to a special directory which is
                   1332: then
                   1333: transferred to the gateway for actual transmission to the remote system.
                   1334: The beauty
                   1335: of this scheme is that it is well confined and invisible to the users both
                   1336: locally and remotely.
                   1337: .PP
                   1338: Another application might be to provide increased bandwidth among machines.
                   1339: Let's say machines \fItempus\fR and \fIfugit\fR have a great deal of traffic
                   1340: between them and
                   1341: their communications link is not sufficient to dispose of all the data.
                   1342: Then \fItempus\fR can think of \fIfugit\fR as two machines, \fIfugit1\fR and
                   1343: \fIfugit2\fR.
                   1344: Likewise
                   1345: \fIfugit\fR will know of \fItempus1\fR and \fItempus2\fR.
                   1346: Then it is a simple matter for traffic
                   1347: between these two machines to utilize two separate routes.
                   1348: UUCP will have
                   1349: two simultaneous non-interfering connections between \fItempus\fR and
                   1350: \fIfugit\fR, thereby
                   1351: doubling the traffic capacity.  A similar use would be to have high priority
                   1352: traffic sent to a machine using one name and other data sent using another.
                   1353: Thus for example mail could be sent upon demand using a more
                   1354: dear resource (like prime time Direct Distance Dialing), while netnews was
                   1355: sent only over less expensive (but perhaps not as timely) facilities.
                   1356: .PP
                   1357: The possibilities for customization and cost reduction are vast.
                   1358: These features will undoubtedly be used for applications that haven't
                   1359: been considered, which is why they are so interesting.
                   1360: .NH 2
                   1361: Sequence Numbers
                   1362: .PP
                   1363: These numbers are used to provide unique file names for spooled
                   1364: data.  Their purpose was often defeated on heavily loaded systems
                   1365: and there has been a fair probability of conflict under certain pathological
                   1366: conditions.  The implementation of sequence numbers in the second
                   1367: version of UUCP was simple.  When a command or
                   1368: data file was required, a sequence lock was created, the sequence number
                   1369: file was read, the number incremented and written and the lock file
                   1370: was removed.  The sequence number was four decimal digits.
                   1371: The C. or D. file was formed from the appropriate one-character prefix, a `.', a
                   1372: system name  up to seven characters (the remote's for command files,
                   1373: either the remote or the local name for data files), and the sequence number.
                   1374: The length of the sequence number was constrained to four characters
                   1375: because the composite file name was limited to fourteen.
                   1376: .PP
                   1377: There are some specific problems identified with this technique.
                   1378: The file system access required for locking, reading, writing, and
                   1379: unlocking was expensive, especially when many data files were required.
                   1380: .PP
                   1381: For a given system there were @10 sup 4@ unique names
                   1382: for command files and data files.
                   1383: Ten thousand names were quickly used up on a very active system.
                   1384: Typically, they were consumed at the
                   1385: rate of three for each \fIuux\fR command and two for each \fIuucp\fR command.
                   1386: Therefore if a system were to spool data for four thousand such commands before it
                   1387: had transferred initial ones, the sequence number would wrap around and
                   1388: there would be a high probability (1/3) of a name clash.
                   1389: This
                   1390: is not farfetched considering that a site distributing netnews to four others
                   1391: (at 250 articles per day) will go through 1000 sequence numbers daily.
                   1392: .PP
                   1393: Because \fIuux\fR had named its data input files as D.remote\fInnnn\fR, a system
                   1394: may receive files named identically from different remotes.
                   1395: The likelihood
                   1396: of this event was also proportional to the number of systems for which
                   1397: jobs are remotely executed.  If a system receives netnews from
                   1398: four others, but for some reason can't process the requests because of
                   1399: the positive
                   1400: feedback discussed earlier, the probability of a name clash is at least
                   1401: one in ten after a day.  In fact it may be much greater because the sites
                   1402: sending data are not likely to have mutually exclusive sequence numbers.
                   1403: .PP
                   1404: A solution to these problems was first introduced by Alan Watt of ITT.
                   1405: He generated sequence numbers from the set of alphanumeric characters.
                   1406: This extended the name space from @10 sup 4@ to @62 sup 4@.
                   1407: (He also cached sequence numbers on each access to the sequence file.)
                   1408: Although this deals with
                   1409: locally generated names it provides no defense from receiving name
                   1410: clashes.  There is also the aesthetically unpleasant aspect of creating
                   1411: garbage names which may randomly turn out to be offensive.
                   1412: .PP
                   1413: Our version of UUCP deals handily with these problems.
                   1414: The sequence number is seven hex digits.
                   1415: Four of these digits are derived from a sequence number file.
                   1416: The remaining three digits represent a cache of sub-job numbers
                   1417: that modify the base number.
                   1418: Thus a command will require only one access to the
                   1419: file for up to @16 sup 3@ sequence numbers.
                   1420: Since we use separate spool directories for each remote site, name
                   1421: clashes will not occur when different systems send us the same file
                   1422: names.
                   1423: The initial base number is selected randomly, reducing the
                   1424: possibility that we would generate names that clash 
                   1425: on a remote site running an old version of UUCP.
                   1426: The use of seven hex digits and the fact that a different number sequence
                   1427: is maintained for each remote site allows us to avoid the use of alphabetic
                   1428: sequences.
                   1429: .NH 2
                   1430: A New Locking Mechanism
                   1431: .PP
                   1432: Previous versions of UUCP relied on the modification time of a lock file.
                   1433: It was assumed a file
                   1434: older than some threshold was invalid.  This led to problems
                   1435: when UUCP (or other programs sharing resources with UUCP) executed
                   1436: for extended periods of time.  One awkward solution was to have programs
                   1437: periodically touch the lock file.  Our solution relies on a property of
                   1438: System V that enables a process to determine if it can kill another without
                   1439: actually disturbing it.  The identifier of the process using a resource
                   1440: is recorded in the lock file.  When another process examines the lock file
                   1441: it issues a \fIkill\fR(0) to the identifier contained within.
                   1442: If the \fIkill\fR succeeds
                   1443: this indicates that the specified process is still running.  If it fails
                   1444: \fIerrno\fR indicates if it was due to lack of permission (cu processes
                   1445: will have different user ids).
                   1446: If the process no longer exists,
                   1447: the lock file is assumed to be invalid.  The code to add this function
                   1448: to other versions of
                   1449: .UX
                   1450: is slight and straightforward and is included with the source distribution.
                   1451: Alternatively a routine could be written that uses
                   1452: \fIps\fR to glean
                   1453: the same information, though this would be considerably less efficient.
                   1454: For systems that don't implement this property of \fIkill\fR, UUCP may be
                   1455: configured to use the old mechanism.
                   1456: .NH 2
                   1457: Giving Up
                   1458: .PP
                   1459: ``RETRY TIME NOT REACHED'' or ``CONNECT FAILED MAXRECALLS'' messages
                   1460: indicate
                   1461: that UUCP has given up trying to connect to a remote system.
                   1462: If a connection fails, when do you try again?
                   1463: Historically UUCP tried again every 55 minutes. After nine hours
                   1464: and ten minutes it gave up for good.
                   1465: This algorithm is clearly inadequate.  If a system was down for
                   1466: more than ten hours, manual intervention was required.
                   1467: On the other hand, perhaps 55 minutes was too long to wait between
                   1468: attempts, but to lower that would mean it would give up after an even
                   1469: shorter period.
                   1470: We have replaced the \fIRETRYTIME/MAXRECALLS\fR concept with an exponential
                   1471: backoff algorithm.
                   1472: The early attempts are frequent and continue to
                   1473: be spaced out in time until an attempt is made once every 23 hours.
                   1474: UUCP will continue trying daily forever.
                   1475: Optionally the \fISystems\fR
                   1476: file may indicate that a given system should be treated differently
                   1477: and attempts will be made continually at the specified interval.
                   1478: One can of course easily compile in a custom algorithm.
                   1479: .NH 2
                   1480: Sharing Modules
                   1481: .PP
                   1482: As noted previously UUCP incorporates several functions that
                   1483: are of value to other applications.  The locking routines can be used
                   1484: by any facility, which is why lock files were placed in a more generic
                   1485: location.
                   1486: The connection function is being used by the \fIcu\fR and
                   1487: \fIct\fR programs as
                   1488: well as the various spoolers for line printers, typesetters, etc.
                   1489: Any utility that needs to establish a bidirectional connection to a shared
                   1490: resource can make use of these facilities.
                   1491: The packet driver which was once part of the
                   1492: .UX
                   1493: kernel could be
                   1494: more useful to other communications programs if it were returned there.
                   1495: .NH 1
                   1496: Roadmap
                   1497: .NH 2
                   1498: Utilities
                   1499: .PP
                   1500: The new version of UUCP comes with programs
                   1501: to assist in setup, administration and debugging.  They are:
                   1502: .IP "\fICvt\fR\ \ " 8
                   1503: converts existing data, command and execution files from the old format.
                   1504: .IP "\fIInstall\fR\ \ "
                   1505: puts programs in the right place with the right modes.
                   1506: .IP "\fIUutry\fR\ \ "
                   1507: starts a \fIuucico\fR to a remote system.  It places debugging output
                   1508: in a file and tails it.  It optionally causes the status file to be ignored.
                   1509: .IP "\fISetUp\fR\ \ "
                   1510: creates all the necessary UUCP system files and renames as necessary
                   1511: (e.g., \fIL.sys\fR @->@ \fISystems\fR).
                   1512: .IP "\fIremote.unknown\fR\ \ "
                   1513: optionally invoked by \fIuucico\fR if an unknown system calls.
                   1514: This procedure logs the caller and time.
                   1515: .IP "\fIuudemon.admin\fR\ \ "
                   1516: sends status information to the administrator.
                   1517: .IP "\fIuudemon.clean\fR\ \ "
                   1518: does routine maintenance of log files and invokes the
                   1519: \fIuucleanup\fR program (previously described).
                   1520: .IP "\fIuudemon.hour\fR\ \ "
                   1521: invokes \fIuusched\fR and \fIuuxqt\fR.
                   1522: .IP "\fIuudemon.poll\fR\ \ "
                   1523: implements polling utilizing a file that describes which systems are to
                   1524: be polled at what times.
                   1525: .IP "\fIuukick\fR\ \ "
                   1526: starts a \fIuucico\fR for a system, no debugging.
                   1527: .IP "\fIuulog\fR\ \ "
                   1528: examines or monitors log files
                   1529: .IP "\fIuuto\fR\ \ "
                   1530: sends files and/or directories to a remote user.
                   1531: .IP "\fIuupick\fR\ \ "
                   1532: retrieves data sent via \fIuuto\fR and interactively relocates it.
                   1533: .IP "\fIuucheck\fR\ \ "
                   1534: verifies that required files and directories are present.
                   1535: .IP "\fIuucleanup\fR\ \ "
                   1536: disposes of defunct files in an \fIintelligent\fR manner.
                   1537: .IP "\fIuustat\fR\ \ "
                   1538: displays the status of or cancels previously specified UUCP commands
                   1539: or provides general status on connections to other systems.
                   1540: It's worth noting that this version of \fIuustat\fR does its job by examining
                   1541: the log files.  It requires no hooks in the core programs.
                   1542: .IP "\fIuusched\fR\ \ "
                   1543: deals with all the scheduling aspects of UUCP.
                   1544: In a move to reduce the complexity of the core programs \fIuusched\fR was
                   1545: invented.  
                   1546: It determines which systems have work and if it's the right time to call (by
                   1547: examining the \fISystems\fR file).  It optionally limits the number of
                   1548: \fIuucico\fR
                   1549: processes
                   1550: that can be executing at once.
                   1551: This program relieves \fIuucico\fR of the need to
                   1552: search through all the system subdirectories for work.
                   1553: \fIUucico\fR then is always
                   1554: invoked with the name of the system to which it will connect.
                   1555: .IP "\fIuugetty\fR\ \ "
                   1556: may be used instead of the standard \fIgetty\fR to
                   1557: allow lines to act both as inbound (normal login) and outbound ports for
                   1558: \fIuucico\fR, \fIcu\fR, and \fIct\fR.
                   1559: \fIUugetty\fR only works with System V versions of
                   1560: .UX .
                   1561: .KF
                   1562: .PS 2.5i
                   1563: box invis ht 352 wid 328 with .sw at 0,0
                   1564: "\fR\s10\&Figure 2.  \f(CW/usr/spool/uucp\f1\s0" at 184,-10
                   1565: "\f(CW\s10\&harpo\f1\s0" at 336,306
                   1566: "\f(CW\s10\&chico\f1\s0" at 332,274
                   1567: "\f(CW\s10\&zeppo\f1\s0" at 292,250
                   1568: "\f(CW\s10\&.Corrupt\f1\s0" at 268,202
                   1569: "\f(CW\s10\&.Admin\f1\s0" at 228,170
                   1570: line  from 256,80 to 256,56 
                   1571: line  from 256,80 to 240,64 
                   1572: line  from 256,80 to 272,64 
                   1573: line  from 208,64 to 208,40 
                   1574: line  from 208,64 to 192,48 
                   1575: line  from 208,64 to 224,48 
                   1576: line  from 160,64 to 160,40 
                   1577: line  from 160,64 to 144,48 
                   1578: line  from 160,64 to 176,48 
                   1579: line  from 120,80 to 104,64 
                   1580: line  from 120,80 to 120,56 
                   1581: line  from 120,80 to 136,64 
                   1582: "\fI\s10\&uucico\f1\s0" at 256,86
                   1583: "\fI\s10\&uuxqt\f1\s0" at 208,70
                   1584: "\fI\s10\&uux\f1\s0" at 160,70
                   1585: "\fI\s10\&uucp\f1\s0" at 120,86
                   1586: line  from 184,352 to 144,184 
                   1587: "\f(CW\s10\&.Log\f1\s0" at 184,138
                   1588: line  from 184,352 to 184,152 
                   1589: "\f(CW\s10\&.Status\f1\s0" at 144,170
                   1590: "\f(CW\s10\&.Workspace\f1\s0" at 104,202
                   1591: line  from 184,128 to 248,96 
                   1592: line  from 184,128 to 208,80 
                   1593: line  from 184,128 to 160,80 
                   1594: line  from 184,128 to 120,96 
                   1595: line  from 184,352 to 328,320 
                   1596: line  from 184,352 to 328,288 
                   1597: line  from 184,352 to 288,264 
                   1598: line  from 184,352 to 264,216 
                   1599: line  from 184,352 to 224,184 
                   1600: "\f(CW\s10\&.Xqtdir\f1\s0" at 76,242
                   1601: line  from 184,352 to 104,216 
                   1602: line  from 184,352 to 80,256 
                   1603: line  from 40,264 to 40,240 
                   1604: line  from 40,264 to 24,240 
                   1605: line  from 40,264 to 0,248 
                   1606: "\f(CW\s10\&.Sequence\f1\s0" at 44,274
                   1607: line  from 184,352 to 48,288 
                   1608: "\f(CW\s10\&exodus\f1\s0" at 40,306
                   1609: line  from 184,352 to 48,320 
                   1610: .PE
                   1611: .KE
                   1612: .NH 2
                   1613: Subdirectory Mania
                   1614: .PP
                   1615: In rearranging the data associated with UUCP, there is some concern
                   1616: that we may have gone overboard.  See Figure 2.  On the other hand
                   1617: our structure may not be complete in that perhaps lock files should
                   1618: be stored hierarchically under \fIsystems\fR, \fIdevices\fR, and
                   1619: \fIprocesses\fR directories.
                   1620: (As it now stands \fIuuxqt\fR cannot make lock files incorporating fourteen
                   1621: character system names.)
                   1622: The directories are:
                   1623: .IP "\f(CW.Status\fR\ \ " 8
                   1624: a status file for each system.
                   1625: .IP "\f(CW.Log\fR\ \ "
                   1626: contains subdirectories for each core program which in turn contain
                   1627: log files for each system.
                   1628: .IP "\f(CW.Admin\fR\ \ "
                   1629: This directory contains a miscellaneous collection of files including:
                   1630: .RS
                   1631: .PP
                   1632: an audit file that is appended to when
                   1633: a remote system invokes \fIuucico\fR with a debugging option,
                   1634: .PP
                   1635: a file in which assert errors are logged,
                   1636: .PP
                   1637: the file transfer statistics which
                   1638: include the system, role, time of day, process id, device, direction of transfer,
                   1639: number of bytes, and time in milliseconds for each transfer,
                   1640: .PP
                   1641: and log files created by the \fIuucleanup\fR program telling about
                   1642: deletions and such.
                   1643: .RE
                   1644: .IP "\f(CW.Corrupt\fR\ \ "
                   1645: where corrupt command and execution files are placed.
                   1646: .IP "\f(CW.Old\fR -
                   1647: for old log files being rotated out.
                   1648: .IP "\f(CW.Sequence\fR\ \ "
                   1649: files for each system containing the current sequence number.
                   1650: .IP "\f(CW.Workspace\fR\ \ "
                   1651: where command and data files are formed before being committed
                   1652: to their final directory.
                   1653: .IP "\f(CW.Xqtdir\fR\ \ "
                   1654: where remotely generated executions take place.
                   1655: .NH 1
                   1656: Esoterica
                   1657: .NH 2
                   1658: Software Engineering or Hacking by Committee?
                   1659: .PP
                   1660: In late April of 1983 a diverse group of people from Bell Labs
                   1661: met to discuss the state of UUCP and how to improve it.  These
                   1662: people came from many different geographical and technical areas.
                   1663: It was an informal gathering of interested parties who for the most
                   1664: part were working on various projects not related to UUCP. However they
                   1665: all had intimate dealings with UUCP and wanted to see a system that
                   1666: was common among them so their efforts could
                   1667: be combined towards a single improved version.  The notes from that meeting
                   1668: are reproduced in Appendix VII.
                   1669: .PP
                   1670: The meeting provided the incentive and the mandate to do something
                   1671: about UUCP.  Although several activities were in progress, none
                   1672: seemed to address all the problems comprehensively.  The effort began
                   1673: in individual stages.  The most current version of UUCP from the
                   1674: .UX
                   1675: Development Lab was delivered to Redman in late April.  The first step
                   1676: was to add the appropriate code using \fIifdefs\fR so that it could be
                   1677: compiled under 4.1bsd (Redman's base system).
                   1678: This was done within a week.
                   1679: Next, Redman modified the system to use separate spool directories.
                   1680: The first version was complete towards the end of May.  In the beginning
                   1681: of June
                   1682: Honeyman became active and his \fIrational connection functions\fR were incorporated.
                   1683: Midway through July Nowitz contributed the \fIpermissions\fR code.  At this point
                   1684: the effort became totally collaborative among the authors.  By the end of July
                   1685: UUCP was being distributed among those at the April meeting for comments and
                   1686: enhancements.  Through this process many valuable contributions were received
                   1687: from the community and the system was soaked in many environments including
                   1688: all modern versions of
                   1689: .UX
                   1690: (4.0, System V, 4.1 bsd, 4.1c bsd, 4.2 bsd and Eighth
                   1691: Edition) representing systems heavily
                   1692: loaded with mail forwarding, netnews and software distributions.
                   1693: .PP
                   1694: In late September we began reviewing all modules and refining them to
                   1695: meet standards of style and function.
                   1696: This phase of our work
                   1697: was quite useful: as the code was thoughtfully reworked,
                   1698: design problems became apparent.  Following stylistic conventions
                   1699: consistently improved the readability.  Its complexities were ironed out
                   1700: resulting in more comprehensible code which tended to be more efficient.
                   1701: .PP
                   1702: From the start SCCS was used to document changes.  Figure 3 shows the
                   1703: activity over time in lines of code changed.
                   1704: The version we started with as a base comprised about 13,000 lines of code.
                   1705: The current system is 14,000 lines.  These numbers represent the removal
                   1706: of approximately 3,000 lines of code from the delivered system and the
                   1707: subsequent addition of 4,000 lines.  Although it would have been
                   1708: gratifying to show a net reduction in the size of the system, the additional
                   1709: strengths and capabilities justify the growth.
                   1710: The inclusion of 5,000 lines of documentation
                   1711: and installation and conversion scripts is also compensation.
                   1712: (While we're throwing numbers around, it's interesting to note that
                   1713: the communication among the authors during this development was primarily
                   1714: via electronic mail.  Approximately 2,000 messages were sent, totaling
                   1715: on the order of 50,000 lines.  It was truly an Information Age effort.)
                   1716: This was software engineering rather than hacking because a lot of
                   1717: people spent a lot of time on it.
                   1718: .KF
                   1719: .ps -2
                   1720: .G1 2.5i
                   1721: frame invis ht 2 wid 3.5 left solid bot solid
                   1722: label left "lines" "of code" left .2
                   1723: label bot "Figure 3.  SCCS Activity"
                   1724: coord x 3,10 y 0,4096
                   1725: ticks left in at 0, 256, 512, 768, 1024 "1K", 1280, 1536, 1792, 2048 "2K", 2304, 2560, 2816, 3072 "3K", 3328, 3584, 3840, 4096 "4K"
                   1726: ticks bot out at 4 "Apr", 5 "May", 6 "Jun", 7 "Jul", 8 "Aug", 9 "Sep"
                   1727: draw solid
                   1728: 4 170
                   1729: 5 1010
                   1730: 6 1435
                   1731: 7 4000
                   1732: 8 3275
                   1733: 9 1530
                   1734: new dotted
                   1735: 4 85
                   1736: 5 550
                   1737: 6 2560
                   1738: 7 3480
                   1739: 8 2760
                   1740: 9 1125
                   1741: "Insertions" size -3 at 9.5, 2100
                   1742: "Deletions" size -3 at 8, 1600
                   1743: .G2
                   1744: .KE
                   1745: .PP
                   1746: One of the problems we described earlier was the entropic forces on the
                   1747: UUCP software.  We know of no solution to the problem that won't result
                   1748: in stagnancy.  We have invested considerable effort
                   1749: to produce a system that is better understood and more modular with
                   1750: the prospect of easing the implementation of changes.  Our best effort then
                   1751: to deal with change is to recognize that it is inevitable, make allowances
                   1752: so it is less destructive, and to provide a fresh system for fodder.
                   1753: .NH 2
                   1754: Controversy
                   1755: .PP
                   1756: No program of this complexity and with such widespread use can be redesigned
                   1757: without having to make many controversial decisions.
                   1758: Sometimes there
                   1759: is no ``right'' way to do a thing.
                   1760: Sometimes the right way is unpopular
                   1761: because conventions embrace the ``wrong'' way.
                   1762: Like most implementors we have been
                   1763: somewhat stubborn about providing functionality that is orthogonal to our
                   1764: purpose of correctness.
                   1765: .PP
                   1766: A good example is the issue surrounding the length of site names.
                   1767: We support system names up to a practical limit of fourteen characters
                   1768: (although a greater number is possible).  The original version of UUCP
                   1769: only allowed seven characters due to limitations that have been described.
                   1770: Recently a version of UUCP has been introduced that only permits six
                   1771: character site names.  Here are the problems.
                   1772: .PP
                   1773: It is common for a system to call itself by a name that is greater than
                   1774: seven characters (e.g., \fIresearch\fR).
                   1775: In previous versions of UUCP such
                   1776: a system would have an effective seven character name (i.e., \fIresearc\fR).
                   1777: There was no problem because the site name was truncated immediately before
                   1778: any table lookups.  Now we have extended the limit.
                   1779: We have a system called
                   1780: \fIresearch\fR in our \fISystems\fR file.
                   1781: When a system calls us and purports to
                   1782: be \fIresearc\fR we have a problem.
                   1783: Is \fIresearc\fR equivalent to \fIresearch\fR?
                   1784: If we treat it as such, then we have effectively limited names to seven
                   1785: characters.  Our purpose was to extend the name space.  Therefore we
                   1786: treat \fIresearc\fR and \fIresearch\fR as two different systems.  In order that
                   1787: this enhancement not be incompatible with other systems, they are required
                   1788: to identify themselves with their full name.  To change any version
                   1789: of UUCP to do this is quite trivial, (both in source and binary versions),
                   1790: yet it does require a change.  The dilemma is whether to make use of the
                   1791: flexibility provided or to restrict it on behalf of those that for some
                   1792: reason or another cannot cope with the changed behavior.
                   1793: .PP
                   1794: Lauren Weinstein has proposed an enhancement that addresses the problem.
                   1795: He has suggested that UUCP be given the knowledge of which systems are
                   1796: compatible and which are not and change its behavior accordingly.
                   1797: Given that this can be implemented, a new question arises.  Does the additional
                   1798: complexity and inconsistent behavior serve our purposes or is it a vain attempt
                   1799: to please all people all of the time?
                   1800: This issue is still open.
                   1801: .PP
                   1802: A different issue was resolved more quickly because of the mass hysteria
                   1803: which ensued.  \fIUux\fR keeps a record of the system and user for which
                   1804: requests are generated and passes it to the \fIuuxqt\fR program on the remote
                   1805: system via the execution file.
                   1806: This is the \fIU line\fR.
                   1807: Unfortunately a fresh
                   1808: U line is generated by each invocation of \fIuux\fR.
                   1809: Therefore when mail is
                   1810: sent from \fIrob\fR on \fIdagaboh\fR to \fIdecvax!mcvax!bellcore!psl\fR, the U line on
                   1811: \fIdecvax\fR is indicated as
                   1812: \fIdagaboh!rob\fR.
                   1813: When \fIdecvax\fR processes the request,
                   1814: it creates a new U line
                   1815: containing \fIdecvax!uucp\fR.
                   1816: When the
                   1817: request arrives on \fImcvax\fR and for one reason or another cannot be
                   1818: executed, an indication is sent to \fIdecvax!uucp\fR rather than
                   1819: \fIdecvax!dagaboh!rob\fR.
                   1820: The solution was clear!
                   1821: Build the U line from the previous one.  A new
                   1822: flag was added to \fIuux\fR to facilitate this.  This solution quickly became
                   1823: a problem.  Most versions of \fIuuxqt\fR read the U line into a buffer limited
                   1824: by sixteen characters in length.  The result of processing our more informative
                   1825: U line caused versions of \fIuuxqt\fR to dump core on most sites throughout
                   1826: the network.  This caused their systems to cease processing remote
                   1827: executions because they could never get past our execution file.  The
                   1828: network was backed up for days.
                   1829: When confronted with these implications
                   1830: our response was one of cool headed reason.
                   1831: We suggested that everyone
                   1832: increase the buffer allocation.
                   1833: After all, sixteen was too small anyway because,
                   1834: as had been pointed out in previous bug reports, some systems had increased
                   1835: the maximum number of characters for a login name from eight to sixteen.
                   1836: Our reason did not prevail.
                   1837: We knuckled under, left the U line alone, and
                   1838: now add this information via a new record (the R line) which although
                   1839: less elegant, is less hazardous.
                   1840: .PP
                   1841: Finally, there is a problem that is of no great philosophical importance.
                   1842: \fIUucp\fR (and now \fIuux\fR) either copies its source files to the spool
                   1843: directory
                   1844: or it transfers them from their original locations.  The former method
                   1845: ensures that the user encounters no surprises.  The latter is vastly more
                   1846: efficient.  Either is an acceptable default provided it can be
                   1847: overridden.  The problem is that all versions of UUCP that descended from
                   1848: the V7 line (notably 4.xbsd) use the former mechanism.  All versions that
                   1849: came from PWB (notably System V) use the latter.  Although the default
                   1850: can be readily changed at compilation time, it would be useful for a standard
                   1851: behavior to evolve.
                   1852: We have chosen the PWB default.
                   1853: Some people are already unhappy.
                   1854: .NH 2
                   1855: Global Problems Requiring Further Investigation
                   1856: .PP
                   1857: The issue of backward compatibility is a thorn in the
                   1858: side of advanced developments.  Technology often provides us with wonderful
                   1859: solutions that cannot be effectively deployed because they are incompatible
                   1860: with other systems.  An extreme position is to ignore the problem, cite that
                   1861: the new way is the right way and other systems must change or die off.  This
                   1862: spurs evolution but spurns practicality.  It is a position often taken in
                   1863: research (and rightly so).
                   1864: The other extreme is to use technology to provide the same old
                   1865: capabilities more cheaply.
                   1866: This does not support the ability to use resources in
                   1867: new ways for different purposes.
                   1868: Unfortunately the compromise solution has two
                   1869: drawbacks: it is expensive to provide multiple functionality supporting
                   1870: both the past and the future, and by maintaining outmoded
                   1871: technology, you are encouraging it.
                   1872: .PP
                   1873: Another issue concerning development and maintenance is perhaps
                   1874: more amenable to compromise.
                   1875: This is the consideration of the type of working environment imposed.
                   1876: On the one hand there is the advantage of a tight control.
                   1877: Some problems are avoided because designs are proposed, reviewed,
                   1878: tested and scrutinized before they are unleashed.
                   1879: This is in contrast to an environment where ideas
                   1880: are quickly implemented and distributed without an overburdening bureaucracy.
                   1881: The appropriate environment depends as much on the individuals involved as
                   1882: the requirements.  Too often one approach or the other is taken as a matter
                   1883: of policy.
                   1884: .NH 2
                   1885: Future Work
                   1886: .PP
                   1887: We had planned for this to be the perfection of software art.
                   1888: It has been approaching that asymptotically.
                   1889: However, in order that it be made
                   1890: available for its intended use, there are several things left undone
                   1891: (although development continues for future releases).
                   1892: It should be run with controlled conditions in
                   1893: various environments and systematically tuned.  Different algorithms should
                   1894: be available for use in different circumstances (e.g., memory rich vs. low budget
                   1895: computers).  A non-spooling system is desired for use with very fast networks
                   1896: that provide immediate response.
                   1897: Also, encrypting of data files may be a useful enhancement.
                   1898: .NH 1
                   1899: Conclusion
                   1900: .PP
                   1901: This work may serve as a good example of a small team development
                   1902: of a modestly large program.  We have retained the data which
                   1903: describes our efforts in the form of electronic mail and SCCS versions.
                   1904: From these it can be seen how the work was partitioned, how decisions were
                   1905: made, where the difficulties arose, where we got in each other's way and
                   1906: where we stood on each other's shoulders.  All in all, what we set out to do,
                   1907: how we approached it, what we did and why is fairly accurately chronicled.
                   1908: .PP
                   1909: Uucp has been rewritten for the third time.  The new system is healthier
                   1910: and more versatile than its predecessors.  We have attempted to provide a system
                   1911: that is useful for all sorts of networking applications.  We also hope that
                   1912: this version may be used to bring UUCP maintainers back to a common system so
                   1913: that their future developments may be shared more vigorously. 
                   1914: .SH
                   1915: Acknowledgements
                   1916: .PP
                   1917: We thank the following for their substantive work and comments:
                   1918: adiron!bob, axiom!smk, cbosgd!mark, masscomp!trb, 
                   1919: ihnp4!gjm, ittvax!swatt, mouton!karn, ncsu!mcm, rti!trt, 
                   1920: sun!shannon, watmath!arwhite, icarus!alb,
                   1921: watmath!dmmartindale, whuxlb!eric.
                   1922: For moral support, thanks to
                   1923: decvax!larry, exodus!dvw, gummo!mmp, parsec!kolstad, rabbit!ark,
                   1924: research!dmr, research!doug, utzoo!henry, vax135!martin, watmath!bstempleton.
                   1925: .PP
                   1926: Thanks to  allegra!jpl who reviewed the code with us and contributed
                   1927: some of his own.  Our appreciation goes to down!pep who can spot a bug on a post
                   1928: at 100 yards.  To research!rtm for some fine ideas taken from his rewrite.
                   1929: To teklabs!stevenm for compiling the buglist.  To vortex!lauren for always
                   1930: being able to see the other side of an issue.  To ulysses!smb for doing most
                   1931: of the work involving 4.1c/4.2bsd.  A special note of appreciation to bellcore!mel
                   1932: for dreaming up such a system that would keep so many people busy for so long
                   1933: improving it.  And an extra acknowledgement to sfwoo!dan for hacking UUCP
                   1934: with such enthusiasm after these many years and for being able to tell the
                   1935: rest of us what the variable names meant.
                   1936: .SH
                   1937: References
                   1938: .PP
                   1939: |reference_placement
                   1940: .FC
                   1941: .1C
                   1942: .BP
                   1943: .SH
                   1944: Appendix I - Sample Permissions File
                   1945: .P1 0
                   1946: # This entry for public login
                   1947: # Use default permissions
                   1948: LOGNAME=nuucp
                   1949: 
                   1950: # This for some friendly outside sites when they call us
                   1951: # They each have a separate login.
                   1952: # When they call, we will send queued files
                   1953: LOGNAME=harpo:gummo:allegra:mhtsa:mhuxt \e
                   1954:   SENDFILES=yes \e
                   1955:   WRITE=/usr/spool/uucppublic:/usr/RNEWS
                   1956: 
                   1957: # This entry for when we call these people.
                   1958: # They also can execute a couple of additional commands.
                   1959: # The commands are safe, so VALIDATE is not necessary on the LOGNAME entry
                   1960: MACHINE=mh3bs:harpo:gummo:allegra:mhtsa:mhuxt:pwbqq \e
                   1961:   WRITE=/usr/spool/uucppublic:/usr/RNEWS \e
                   1962:   COMMANDS=rnews:rmail:xp:lp
                   1963: 
                   1964: # This entry for machines in our room (when they call us)
                   1965: # The sites that login with these login-ids have extra command
                   1966: # privileges, so VALIDATE name vs login-id
                   1967: # (See next entry--the MACHINE values are related to these VALIDATE values)
                   1968: LOGNAME=uucp:uucpl \e
                   1969:   VALIDATE=raven:owl:hawk:dove \e
                   1970:   REQUEST=yes SENDFILES=yes \e
                   1971:   READ=/ WRITE=/
                   1972: 
                   1973: # This entry for machines in our room -- when we call them
                   1974: # It also specifies the commands they can execute locally.
                   1975: # (The uucp command in COMMANDS option permits forwarding.)
                   1976: MACHINE=owl:raven:hawk:dove \e
                   1977:   REQUEST=yes \e
                   1978:   COMMANDS=rnews:rmail:xp:lp:uucp \e
                   1979:   READ=/  WRITE=/
                   1980: 
                   1981: # This entry to call back on our faster link
                   1982: LOGNAME=uucpm MACHINE=mhwpf \e
                   1983:   COMMANDS=rnews:rmail:xp:lp \e
                   1984:   CALLBACK=yes
                   1985: .P2
                   1986: .SH
                   1987: Appendix II - Output From \f(CWuucheck -v\fP
                   1988: .P1 0
                   1989: *** uucheck:  Check Required Files and Directories
                   1990: *** uucheck:  Directories Check Complete
                   1991: 
                   1992: *** uucheck:  Check /usr/lib/uucp/Permissions file
                   1993: ** LOGNAME PHASE (when they call us) 
                   1994: 
                   1995: When a system logs in as: (nuucp) 
                   1996:        We DO NOT allow them to request files.
                   1997:        We WILL NOT send files queued for them on this call.
                   1998:        They can send files to
                   1999:            /usr/spool/uucppublic (DEFAULT)
                   2000:        Myname for the conversation will be yquem.
                   2001:        PUBDIR for the conversation will be /usr/spool/uucppublic.
                   2002: 
                   2003: .P3
                   2004: When a system logs in as: (harpo) (gummo) (allegra) (mhtsa) (mhuxt) 
                   2005:        We DO NOT allow them to request files.
                   2006:        We WILL send files queued for them on this call.
                   2007:        They can send files to
                   2008:            /usr/spool/uucppublic
                   2009:            /usr/RNEWS
                   2010:        Myname for the conversation will be yquem.
                   2011:        PUBDIR for the conversation will be /usr/spool/uucppublic.
                   2012: .P3
                   2013: When a system logs in as: (uucp) (uucpl) 
                   2014:        We DO allow them to request files.
                   2015:        We WILL send files queued for them on this call.
                   2016:        They can send files to
                   2017:            /
                   2018:        They can request files from
                   2019:            /
                   2020:        Myname for the conversation will be yquem.
                   2021:        PUBDIR for the conversation will be /usr/spool/uucppublic.
                   2022: 
                   2023: When a system logs in as: (uucpm) 
                   2024:        We will call them back.
                   2025: 
                   2026: 
                   2027: ** MACHINE PHASE (when we call or execute their uux requests) 
                   2028: 
                   2029: When we call system(s): (mh3bs) (harpo) (gummo) (allegra) (mhtsa) (mhuxt) (pwbqq) 
                   2030:        We DO NOT allow them to request files.
                   2031:        They can send files to
                   2032:            /usr/spool/uucppublic
                   2033:            /usr/RNEWS
                   2034:        Myname for the conversation will be yquem.
                   2035:        PUBDIR for the conversation will be /usr/spool/uucppublic.
                   2036: 
                   2037: Machine(s): (mh3bs) (harpo) (gummo) (allegra) (mhtsa) (mhuxt) (pwbqq) 
                   2038: CAN execute the following commands:
                   2039: command (rnews), fullname (rnews)
                   2040: command (rmail), fullname (rmail)
                   2041: command (xp), fullname (xp)
                   2042: command (lp), fullname (lp)
                   2043: 
                   2044: When we call system(s): (owl) (raven) (hawk) (dove) 
                   2045:        We DO allow them to request files.
                   2046:        They can send files to
                   2047:            /
                   2048:        They can request files from
                   2049:            /
                   2050:        Myname for the conversation will be yquem.
                   2051:        PUBDIR for the conversation will be /usr/spool/uucppublic.
                   2052: 
                   2053: Machine(s): (owl) (raven) (hawk) (dove) 
                   2054: CAN execute the following commands:
                   2055: command (rnews), fullname (rnews)
                   2056: command (rmail), fullname (rmail)
                   2057: command (xp), fullname (xp)
                   2058: command (lp), fullname (lp)
                   2059: command (uucp), fullname (uucp)
                   2060: 
                   2061: When we call system(s): (mhwpf) 
                   2062:        We DO NOT allow them to request files.
                   2063:        They can send files to
                   2064:            /usr/spool/uucppublic (DEFAULT)
                   2065:        Myname for the conversation will be yquem.
                   2066:        PUBDIR for the conversation will be /usr/spool/uucppublic.
                   2067: 
                   2068: Machine(s): (mhwpf) 
                   2069: CAN execute the following commands:
                   2070: command (rnews), fullname (rnews)
                   2071: command (rmail), fullname (rmail)
                   2072: command (xp), fullname (xp)
                   2073: command (lp), fullname (lp)
                   2074: 
                   2075: 
                   2076: *** uucheck:  /usr/lib/uucp/Permissions Check Complete
                   2077: .P2
                   2078: .BP
                   2079: .SH
                   2080: Appendix III - Sample Devices File
                   2081: .LP
                   2082: .KS
                   2083: .TS
                   2084: l l l l l l.
                   2085: CALLER LINE    USEFUL  CLASS   DIALER  CHAT SCRIPT
                   2086: =
                   2087: .T&
                   2088: l s s s s s.
                   2089: # the ACU's
                   2090: #
                   2091: # 212/801 dialers
                   2092: .T&
                   2093: lFCW lFCW lFCW lFCW lFCW lFCW.
                   2094: ACU    cul0    cua0    1200    212     unused
                   2095: ACU    cul1    cua1    1200    212     unused
                   2096: .T&
                   2097: l s s s s s.
                   2098: # VenTel dialer
                   2099: .T&
                   2100: lFCW lFCW lFCW lFCW lFCW lFCW.
                   2101: ACU    vn0     unused  1200    ventel  unused (for now)
                   2102: ACU    vn0     unused  300     ventel  unused (for now)
                   2103: .T&
                   2104: l s s s s s.
                   2105: # Vadic dialer
                   2106: .T&
                   2107: lFCW lFCW lFCW lFCW lFCW lFCW.
                   2108: ACU    vd0     unused  1200    vadic   unused (for now)
                   2109: .T&
                   2110: l s s s s s.
                   2111: # special entry for Vadic only systems
                   2112: .T&
                   2113: lFCW lFCW lFCW lFCW lFCW lFCW.
                   2114: ACU    vd0     unused  V1200   vadic   unused (for now)
                   2115: .T&
                   2116: l s s s s s.
                   2117: #
                   2118: # the Micom also has some VenTels
                   2119: .T&
                   2120: lFCW lFCW lFCW lFCW lFCW lFCW.
                   2121: ACU    Micom   secret  1200    micomventel     unused (for now)
                   2122: ACU    Micom   secret  300     micomventel     unused (for now)
                   2123: .T&
                   2124: l s s s s s.
                   2125: #
                   2126: #
                   2127: # the switches
                   2128: #
                   2129: # Micom pbx
                   2130: # 4800 baud is funny ...
                   2131: .T&
                   2132: lFCW lFCW lFCW lFCW lFCW lFCW.
                   2133: Micom  mc0     unused  4800    unused  \`\`\'\' \es\ec NAME? %s GO \ec
                   2134: Micom  mc0     unused  Any     unused  \`\`\'\' \`\`\'\' NAME? %s GO \ec
                   2135: Micom  mc1     unused  4800    unused  \`\`\'\' \es\ec NAME? %s GO \ec
                   2136: Micom  mc1     unused  Any     unused  \`\`\'\' \`\`\'\' NAME? %s GO \ec
                   2137: .T&
                   2138: l s s s s s.
                   2139: # Develcon pbx
                   2140: .T&
                   2141: lFCW lFCW lFCW lFCW lFCW lFCW.
                   2142: Develcon       dv0     unused  Any     unused  \`\`\'\' \`\`\'\' Request: %s \e007 \ec
                   2143: Develcon       dv1     unused  Any     unused  \`\`\'\' \`\`\'\' Request: %s \e007 \ec
                   2144: .T&
                   2145: l s s s s s.
                   2146: # DATAKIT PS
                   2147: .T&
                   2148: lFCW lFCW lFCW lFCW lFCW lFCW.
                   2149: Datakit        dk0     unused  Any     unused  \`\`\'\' \ed%s
                   2150: Datakit        dk1     unused  Any     unused  \`\`\'\' \ed%s
                   2151: .T&
                   2152: l s s s s s.
                   2153: # gandalf
                   2154: .T&
                   2155: lFCW lFCW lFCW lFCW lFCW lFCW.
                   2156: Gandalf        gd0     unused  Any     unused  \`\`\'\' \`\`\'\' class %s start \ec
                   2157: Gandalf        gd1     unused  Any     unused  \`\`\'\' \`\`\'\' class %s start \ec
                   2158: .TE
                   2159: .KE
                   2160: .SH
                   2161: Appendix IV - Sample Systems File
                   2162: .LP
                   2163: .KS
                   2164: .TS
                   2165: l l l l l l.
                   2166: SITE   WHEN    CALLER  CLASS   CALLCODE        LOGIN
                   2167: =
                   2168: .T&
                   2169: lFCW lFCW lFCW lFCW lFCW lFCW.
                   2170: fonzie Any     ACU     D1200   MHd1234 ...
                   2171: fonzie Any0631-0444    ACU     C1200   MH5678  ...
                   2172: fonzie Any0631-0444;5  Micom   Any     fonz    ...
                   2173: fonzie Wk1800-0600,Sa  Datakit,dg      unused  fonzie  ...
                   2174: fonzie MoWeFr1300-1445 Ethernet,eg     unused  09      ...
                   2175: fonzie Any     Direct  9600    tty42   ...
                   2176: .TE
                   2177: .KE
                   2178: .BP
                   2179: .SH
                   2180: Appendix V - Heuristics Used by Uucleanup
                   2181: .PP
                   2182: At present, this is what is done:
                   2183: .PP
                   2184: For WARNING messages:
                   2185: .IP
                   2186: C. files of the age specified are read, looking for either user
                   2187: files to be sent or received, or mail to be sent.  (Other
                   2188: remote execution that does not involve sending user files
                   2189: is not checked for now.)  In either of the cases, the user
                   2190: is informed by mail that the request is not being processed
                   2191: due to lack of communications with the remote system, and
                   2192: the request will be deleted in the future if it the condition
                   2193: remains for several more days.
                   2194: .LP
                   2195: For DELETIONS:
                   2196: .IP "C. files -" 10
                   2197: If they reference only D. files, the C. is merely deleted,
                   2198: because the D. files are usually mail or news, and the later
                   2199: D. processing will take care of them.
                   2200: If they reference files from the file system,
                   2201: a message is constructed that will contain lines like:
                   2202: .P1 10n
                   2203: We can't contact the remote.
                   2204: 
                   2205: local!file -> remote!otherfile
                   2206: 
                   2207: can't be executed.
                   2208: .P2
                   2209: .IP "X. files -"
                   2210: These are merely deleted at present - D.s will be taken care of later.
                   2211: Besides, some of the D.s are missing or else the X. wouldn't be
                   2212: left around.
                   2213: .IP "D. files -"
                   2214: mail type data is sent to a local person if that is where it
                   2215: was destined.  If not, it is returned to the sender -- assumed
                   2216: to be from the first From line.  If a sender can't be determed,
                   2217: the file is merely deleted.
                   2218: .IP ""
                   2219: netnews: if locally generated, just delete.  If remote, the X.
                   2220: got lost, so execute rnews.
                   2221: .IP "Other files -"
                   2222: Just delete them.
                   2223: .PP
                   2224: Deletions and executions are logged.
                   2225: .SH
                   2226: Appendix VI - Example of a Uuxqt Error Report
                   2227: .P1 0
                   2228: remote execution       [uucp job allegraA60f1 (6/6-2:50:32)]
                   2229:        rnews 
                   2230: exited with status 1
                   2231: 
                   2232: 
                   2233:        ===== stderr was =====
                   2234: rnews: Cannot open /usr/spool/news/.sys (r) (From: harpo!decvax!pur-ee!iuvax!dcm).
                   2235:        perror: No such file or directory
                   2236: 
                   2237: 
                   2238:        ===== stdin was =====
                   2239: From: harpo!decvax!pur-ee!iuvax!dcm
                   2240: Newsgroups: net.unix-wizards
                   2241: Title: uucp trap 9 ever fixed?
                   2242: Article-I.D.: iuvax.119
                   2243: Posted: Fri Jul  2 11:48:26 1982
                   2244: Received: Sat Jul  3 00:54:31 1982
                   2245: 
                   2246: We (a VAX 4.1) are getting alot of trap 9s, probably from 
                   2247: the bug mentioned in rv(4); has anyone ever fixed this?
                   2248:                                pur-ee!iuvax!dcm
                   2249: .P2
                   2250: .BP
                   2251: .SH
                   2252: Appendix VII - Notes From Uucp Lovers Meeting
                   2253: .FC
                   2254: .2C
                   2255: .PP
                   2256: The first (and last) meeting of the uucp-lovers interest group
                   2257: took place on 20 April 1983.
                   2258: Invited were
                   2259: allegra!honey, vax135!martin, eagle!karn, rabbit!ark, mhb5b!smb,
                   2260: harpo!ber, cbosgd!mark, floyd!trb, research!rtm, and eagle!dan.
                   2261: Others who showed up were representatives from USG,
                   2262: mhtsa!lsc and mhtsa!brad,
                   2263: whuxlb!pep and gummo!mmp.
                   2264: The unexpurgated minutes follow.
                   2265: .PP
                   2266: .nf
                   2267: From honey Wed Apr 20 00:46:26 1983
                   2268: To: uucplovers
                   2269: Subject: minutes
                   2270: Cc: dmr doug
                   2271: .PP
                   2272: .ad l
                   2273: pardon my editorial asides in what follows, the minutes of a meeting
                   2274: called by levy to discuss uucp concerns.  attendants at today's
                   2275: gathering of the clan were
                   2276: .PP
                   2277: .in +5n
                   2278: eagle!dan, vax135!martin, ihnp4!gjm, gummo!ber, mhtsa!lsc,
                   2279: mhb5b!smb, mhtsa!brad, eagle!karn, whuxlb!pep, and
                   2280: allegra!honey
                   2281: .PP
                   2282: .in -5n
                   2283: the first topic of discussion was the corporate electronic mail project
                   2284: and its sidekick, network action central.  action appears to be jointly
                   2285: administered through 452 (staff) and 774 (equipment and organizational
                   2286: support).  murakami lent the impression that this was the beginning of
                   2287: a permanent fixture w/in the labs and that any startup problems are
                   2288: temporary.  the L.sys database is gradually falling together as new
                   2289: data are collected and standards are promulgated.  discussion about the
                   2290: means for handling the monthly L.sys produced a consensus that sites
                   2291: should continue to maintain a local L.sys and that the local file should be
                   2292: searched first, a la koenig, honeyman, and apparently everyone.
                   2293: .PP
                   2294: a lively discussion on uucp hacking consumed the major part of the
                   2295: meeting.  there are as many versions of uucp as there are sites, with
                   2296: the major contenders being usg 6.0, the new code by morris, and tom
                   2297: truscott's hacks.  cohen grimly cautioned on the difficulty of getting
                   2298: good stuff into 6.0, nonetheless, the company flag was raised, all
                   2299: saluted, and we agreed to use the organizational heavy as a starting
                   2300: point for producing a version that would satisfy all (and ourselves, in
                   2301: particular).
                   2302: .PP
                   2303: the major enhancement proposed was a hashing scheme for the spool
                   2304: directory.  while truscott uses separate directories for the C and D
                   2305: files (as well as other files, i imagine), redman and others use the
                   2306: names of the remote sites as the subdirectories.  lively discussion
                   2307: ensued, during which a consensus was reached that the latter scheme was
                   2308: more robust.  a proposal by levy that the hash function be based on a
                   2309: short prefix of the machine name was met with interest.  while there
                   2310: appears to be a problem with mkdir by setuid processes in usg, bellovin
                   2311: patiently explained techniques to subvert this feature; after the third
                   2312: or fourth go 'round, the meeting got back on track.  the feeling is
                   2313: that cico or some daemon should do occasional rmdir's in the spooling
                   2314: directory; ultimately there was not total agreement on all of the
                   2315: mechanics of the hashing scheme, and i imagine the issue will be
                   2316: discussed further in a manner fit for the information age.
                   2317: .PP
                   2318: a separate directory for the lock files was also proposed, a point on
                   2319: which all were agreed, as this admits some gestures toward privacy made
                   2320: impossible at present due to cu's use of lock files.  in addition,
                   2321: nowitz and karn muttered about lock file aging.
                   2322: .PP
                   2323: while alan watt's code produces wild and amusing sequence numbers,
                   2324: several people feel uncomfortable with his hacks.  a proposal for a
                   2325: sequence file per system was propounded, but the necessity to shelter
                   2326: several hundred seq files was judged problematic.  nowitz finally
                   2327: suggested maintaining a single file with a separate sequence number for
                   2328: each machine.  there were murmurs of assent over that, as well as the
                   2329: suggestion that logging info be maintained per system, which everyone
                   2330: wants to see reduced.  there was some agreement that morris's command
                   2331: file per system is also a good idea, but out of its time.
                   2332: .PP
                   2333: there were several pleas for some sort of indexing scheme on L.sys.
                   2334: karn has built weinberger's btrees on L.sys (but i predict problems
                   2335: putting pjw's apparently top secret, company private hacks into system
                   2336: VI), honeyman suggested dbm, while levy suggested a version of look.
                   2337: it's too early to tell which way this one will go.
                   2338: .PP
                   2339: cohen reports that 6.0 incorporates all of the "known" bug fixes
                   2340: (mcgeady's list, other netnoise reports), although honeyman, nowitz,
                   2341: and redman immediately popped up with some "unknown" bugs.  (i remind
                   2342: you all to #define NPLINES to 20 or so).  horton's recent note on
                   2343: delays in the packet driver was discussed and duly deprecated.
                   2344: .PP
                   2345: a proposal to upgrade the DEBUG information was thrown out for
                   2346: consideration whereupon it was thrown out for lack of interest.
                   2347: .PP
                   2348: finally, we agreed to take the most recent version of 6.0 uucp and hack
                   2349: it into an unrecognizable state (i.e. remove the bugs, and make it work
                   2350: well).  honeyman commandeered conn.c, redman got the spooling hacks,
                   2351: levy was volunteered to write an L.sys editor and help murakami
                   2352: standardize the action L.sys, and bellovin accepted the responsibility
                   2353: for putting the spool directory mods into uuxqt.  cohen pointed out
                   2354: that usg is unlikely to appreciate anything that falls under the ucb
                   2355: umbrella, while nowitz argued against reliance on ifdefs.  the feeling
                   2356: was that we can hide the idiosyncrasies in a single file and mask our
                   2357: efforts as a gesture toward version 7 compatibility, a transparent
                   2358: but innocent falsehood.  in any case, this issue is peripheral.
                   2359: .PP
                   2360: the final topic on the agenda was the corporate attempt at security
                   2361: consciousness raising; a shouting match ensued, in the course of which
                   2362: several and various reputations were sullied, certain paranoid
                   2363: reactions were taken less than seriously, and no great meeting of the
                   2364: minds was met.  honeyman argued in favor of mcilroy's position against
                   2365: allowing remote machines to pull files, falling back on a position that
                   2366: denied this capacity to all but a local cluster, falling further back
                   2367: on a suggestion that permits files to be pulled from a directory other
                   2368: than uucppublic (so that one remote site can't pull a file that another
                   2369: remote site has sent).  redman pointed out that the only information
                   2370: worth protecting in L.sys is the phone number (certainly the least
                   2371: secure piece of data).  redman solicits opinions on the forthcoming GEI
                   2372: regulations.
                   2373: .PP
                   2374: upon notable growlings of empty stomachs, a decision was made to
                   2375: adjourn to a local chinese restaurant, in the time honored tradition of
                   2376: uucp hackers everywhere.  this decision was subsequently rescinded in
                   2377: favor of the oak room (constituting an unpropitious omen).
                   2378: .in -5n
                   2379: .ad b

unix.superglobalmegacorp.com

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