List of Changes to UUCP This is a list of changes made to the base version of uucp. An attempt is made to justify the changes made. This list may be useful to those implementing yet better versions. Tom Truscott anlwrk.c: lots of changes. See the comments at the top. Main efficiency improvement: eliminate stat(II)s. Main bug fix: avoid sending files to wrong system. Uses Berkeley 4.2bsd directory reading subroutines. Useful if someone wants to run this uucp under 4.2bsd. Added uucp subdirectories. See 'README' or 'INSTALL' for details. Subdirectories are enabled by #define-ing UUDIR in uucp.h. No more assembler code needed. grep UUDIR *.[hc] to see how it is implemented. Times of form 'hh:mm' are uniformly printf-ed with "%d:%02d". The %02d guarantees a 2 digit number w/ leading zero if needed. uucp work files (e.g. spool files) are created with umask==WFMASK (uucp.h). WFMASK can disable reading by 'others'. In fact that is the default, which might be annoying, but you can change it. LOG files (LOGFILE, SYSLOG, ERRLOG) are created with umask=LOGMASK (uucp.h), which as distributed permits general read access to avoid loud user screams. User files are created with mode (not umask!) at least BASEMODE (uucp.h) and possibly with more permissions if the user so specified. To avoid loud user screams, BASEMODE should probably be 666 since uucp-created files are owned by uucp. chkpth.c: uses dynamic allocation due to Doug Kingston. chkpth() and chkperm() are no longer called for vanilla Spool area requests, so they can be made 'tougher'. These routines, and how they are used, is a bleak area of uucp that should be scrapped and redone coherently. #define for SYSIII added. The idea is to have code that runs on SYSIII etc. as well as v7, 32V, 4.1bsd, etc. However it has never been tested and surely won't work. cntrl.c: lots off changes here. Mostly performance enhancements. Bypasses chkpth/chkperm/anyread checks for vanilla spool files. No longer logs 'COPY SUCCEEDED' in LOGFILE, only failures. (Still logs request data. And SYSLOG still logs file transfers.) Has 'PATIENCE' when shipping huge files (this partially works, the huge file gets over okay, and is signed off, but the next attempted transfer fails. Not catastrophic, but not nice.) Cranks up a uuxqt each time ten 'X' files have gone past (to avoid collecting 100+ X files before uuxqt starts!) ultouch() is called only rarely. A missing chmod after an 'xmv' has been added. Due to the extra diligence in chkperm, etc. the old 'put files in /usr/spool/uucppublic' may no longer work "right". Sorry, but I am not sure how it is supposed to work. I will look into this someday, sooner if it is an actual problem. vectors/buffers for L.sys lines increased in versys.c and conn.c to permit 1000 char lines and 100 'fields' on a line. conn.c: obscure changes here, mostly in the send/expect sequence. File descriptor prediction implemented (not tested!), extremely obscure problem apparently first noted by Steve Bellovin. Default end of 'send' string is \r, not \n. PAUSE5 pauses 5 seconds. \d pauses 1 second (\d\d\d\d\d pauses 5). foo\c sends 'foo' with no ending \r. \05 sends control-e. \s sends a space (so does \40). CR sends a \r, LF sends \n. "" sends a \r. Output is in even parity, changable with send strings P_ZERO, P_EVEN, P_ODD, P_ONE. BREAK sends a break (or simulates one). And expect string of "" expects nothing, just returns, so to send an initial \r one can just do "" "" ogin:--ogin: to poke the remote site into sending a login message. Send strings are only printed in debug if uid <= PRIV_UIDS (uucp.h). Alan Watt's date changes were in decvax, but should mentioned here. Except I am not sure how they work. Look near the end of conn.c. expfile() returns 0 if the expanded file is a vanilla spool file. That way chkpth/chkperm can be bypassed, and those routines can have several huge loopholes removed. gename.c has Alan Watt's (a) base 62 sequence numbering and (b) greatly reduced locking rate. The comments at the top describe it fairly well. It looks awful, but just use it. It works. gio.c: ultouch() is called occasionally (kludge!) IO errors are checked for. gnsys.c calls each system only once in a uucico session. Also, calls callok() only once for each system. I forget how that works. imsg.c: strips parity bits, in case the incoming chars have some. logent.c: greatly simplified! Justs opens LOGFILE for append and then seeks to end and writes each new entry. Can cause scrambling on systems w/o guaranteed append-to-end, but is too good a speedup to pass up. pk.c: check-summing is done correctly on machines which do not sign-extend characters. Time-outs made more generous. lint: The code has been de-linted as best I could. uucp.h contains lots of declarations of functions which return non-int, like strcpy(), etc. uucplock.c: ultouch() changed to be done only occasionally. Only changes st_ctime, not atime or mtime, so programs can be written to display time spent locked. uucp: uucp x foo!y causes a uucico to call only system foo, not a uucico to try to call everyone with spooled work. uucp.h: unused #defines have been removed. uulog.c: greatly simplied, since logent.c is greatly simplied. Only used in forms 'uulog -u user' and 'uulog -s system'. Also, 'uulog -uuser' and 'uulog -ssystem' are permitted. And both options may be specifed. None is an error. uux: -g option added to specify priority grade. -c option does not copy. -l is a synonym. 'X' files use local system name to avoid possible name conflict. uucico cranked up calls only target system, not everyone. uuxqt: reads commands from /usr/lib/uucp/L.cmds. A line of form 'PATH=...' changes the command search path. uucpname.c: A real kludge went here. On some UNIX systems, a program's set-user-id bit is ignored if the invoker is root. But then uucp would create files owned by root, and if not generally writable uucp would later be unable to write on them (e.g. LOGFILE). So uucpname, since it is called at the start of every relevant uucp program, checks for getuid()==geteuid()==0 in which case it changes its uid/gid to that of the owner of the file /usr/lib/uucp/uucico. Debugging mode is permitted only to invokers with uid <= PRIV_UIDS. dialout.c routine has dialend() routine which is called to hang up. Tue Mar 29 16:25:01 EST 1983 Makefile: GROUP variable added so file OWNER and GROUP are both set correctly. uuxqt/uucico/uuclean are no longer executable by 'others'. uucp.h: PRIV_UIDS reduced to 3 to reduce security danger. cico.c: cleanup() ioctl(II)s changed to avoid hang-up on Gould/SEL machine. anlwrk.c: Infinite loop check was buggy, causing occasional, sometimes persistent, 'NO WORK' messages. Simpler method now used. conn.c: dialout() argument format changed to support variant dialers. Also, #defines added to support different UNIX-es understanding of different baud rates. Compatibility mods: #include in dialout.c now deleted. ncsu!mcm (Mike Mitchell) System V compatibility mods. burl!lda, Larry Auton PATH=... in Makefile changed to APATH=... . FIOCLEX added to prevent ACU/communication files being inherited by children. Files cleaned up (register variables added) by Mike Mitchell (ncsu!mcm). u[bs]_sst.c, us_rrs.c: "a+" fopen mode changed to "r+". NOTE: uusub, uustat are not claimed to work in this version. Further, "r+" does not work in 4.1bsd or 32V. cntrl.c calls wait(II) after uuxqt()s are started, to avoid filling the proc table with zombies. uuxqt now sorts "X" files to keep execution in order. setline.c: fixes for 'system III' sites. NOT TESTED. gwd.c: The pwd(I) is run with effective uid reverted to the real uid. logent also prints to stderr if debugging is on UNET channel added. Still running slowly, though. Changed XQTDIR from /usr/lib/uucp/.XQTDIR to /usr/spool/uucp/XTMP. Add gethostname(). Add SYSFILECR. sysexits.h added