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