Notable changes in development snapshot 16.1h: Implemented some fixes necessary to build and operate under glibc-2.3.2. You will most likely need to use the new version 1.1 of Ezm3 to build CVSup on platforms using glibc-2.3.2. Notable changes in development snapshot 16.1g: Fixed a bug that caused the client to crash sometimes when updating the KDE sources. The crashes were caused by thread stack overflow, triggered by the unusually large "refuse" files that are often used in the KDE project. Added support for preserving access lists in RCS files. Access lists are rarely used in CVS repositories, and until now CVSup simply discarded them. However, the KDE project makes extensive use of access lists, and the lack of support for them caused many fixups when updating. The support added in this release is only partial. It does not transfer access lists during an update, but it preserves any access lists which are already present in the user's files. Many thanks to Martin Birgmeier for contributing this fix. Added a new "-f" option to cvsupd which makes it remain in the foreground rather than becoming a daemon. This makes it possible to control cvsupd using the "daemontools" package. Many thanks to Andrew J. Korty for implementing this option. Fixed an obscure bug in which NFS-related lstat() failures could cause cvsupd to die with a segmentation violation. The error is almost impossible to reproduce, and may depend on NFS bugs. Added a portability fix submitted by Olaf Wagner, which fixed a bug in the handling of filenames when using the CM3 Modula-3 compiler. Changed the font of the GUI's "messages" pane to make it legible on more systems. Notable changes in development snapshot 16.1f: Fixed a bug in the updating of setuid/setgid files for some versions of Linux. The symptom was that the setuid/setgid bits were not preserved, and CVSup transferred each setuid/setgid file on every run. This was caused by changes in the Linux kernel which caused chown() to clear the setuid/setgid bits even when performed by root. Fixed a portability bug that broke the build on some versions of Linux. Removed some obsolete backward-compatibility code. Updated some documentation. Notable changes in development snapshot 16.1e: Added code in both the client and the server to detect whether the peer is an old version with the S1G bug. The server will refuse to serve such clients, and the client will refuse updates from such a server. In each case, an error message is printed with a URL that describes the bug and the upgrade procedure. Fixed a bug in suplib/src/m3makefile which caused the build of cvpasswd to die with the message, "unable to find interface (CText)". This occurred with the SRC compiler, but not with the PM3 compiler. Notable changes in development snapshot 16.1d: Fixed a terrible bug which caused CVSup to decode file attribute values of 10 or more digits incorrectly. This caused file modtimes to come out wrong once the date passed 1000000000 seconds past the epoch. This occurred on Sun Sep 9 01:46:40 UTC 2001. Notable changes in development snapshot 16.1c: Corrected the fix to handle ECONNABORTED properly. Also expanded it so that the master server process survives some additional possible temporary errors (too many open files in the system; out of buffer space). Notable changes in development snapshot 16.1b: Made it a warning rather than a fatal error if the client is unable to delete a file that it wants to delete. This works around certain problems in checkout mode where the CVS repository has been manually altered to change an RCS file into a directory with the same (checked-out) name. Fixed the server to stay alive if accept() returns ECONNABORTED. Traditionally this error was not returned by accept() in most Unix systems. But in recent versions of FreeBSD this error can be returned. Notable changes in development snapshot 16.1a: Added a new "client class" feature which allows the server to hide collections or individual branches from specific groups of clients. Access is controlled by a new "cvsupd.class" file. This feature is still in flux. If you use it in its current form you must be prepared to deal with incompatible changes in the future. Many thanks to Olaf Wagner and Elego Software Solutions GmbH for developing and contributing this feature. Made the necessary changes so that CVSup can be built using the Critical Mass compiler "cm3" (see http://www.m3.org/). To do this add "M3=cm3" to the "make" command. Added "cvsuplog2html" by John Reynolds, a new and improved script for converting CVSup client logs into HTML pages. It can be found in the "contrib" subdirectory. Fixed a bug which sometimes caused hard links to be updated as separate files when the server was operating in mirror mode ("-s scanDir" option). Fixed a bug on Digital Unix and Tru64 Unix systems, where updating a 0-length file in some cases produced the error "Updater failed: foo: Cannot open: No such device or address". Fixed a bug which could cause revision 1.1.1.1 to be checked out when really revision 1.1 should have been gotten. This occurred with OpenBSD's "src/gnu/egcs/libiberty/hashtab.c" and possibly other files which were originally created by "cvs add" and then subsequently had a "cvs import" done on them. Fixed a bug which caused the server to quit if it encountered an unreadable directory. Now the server logs a warning and continues as if the directory were empty. Fixed a client bug involving symbolic links and checkout mode. If a directory in the client's tree was actually a symbolic link to a directory, the client would under certain circumstances delete the link, replace it with a directory, and populate it with a new copy of the collection. Fixed a client bug that sometimes resulted in a segmentation violation or an ASSERT failure if the filesystem containing the "base" directory became full during an update. Fixed a set of related bugs which caused the last line of certain client and server configuration files to be ignored if its terminating newline was missing. The files which were affected by the bug were supfiles and refuse files on the client, and releases files, list files, and the "${CVSROOT}/CVSROOT/options" file on the server. Fixed a bug which could cause the client or server to die if an existing configuration, including the checkouts files, was moved from one operating system to a different one. Added a work-around for an apparent Modula-3 threads package bug which on extremely rare occasions could cause the master server to fail to reap a child process. Notable changes in release 16.1: Fixed a couple of long-standing bugs in the rsync code which caused it to miss many compression opportunities. This mode is actually useful now. Fixed a server bug that caused the inactivity timeout to fail in certain situations. If the network connection to a client vanished just after start-up, the inactivity timer wasn't able to kill the server process. It would then have to be killed manually. Now the inactivity timeout should work reliably. Fixed a bug that affected some versions of Solaris, e.g., Solaris 2.5.1. The server would loop after serving the first client. Fixed a bug that would kill the client or server after 2 GB of data (before compression) had gone through the network. Fixed bug: if the server tried to follow a circular symbolic link, it was a fatal error. Added new "norsync" and "rnorsync" commands for the server's list files, to allow better control over when the rsync algorithm is used. The use of "norsync" in the releases file is now deprecated; it should be specified in the list file instead. Added a command-line option "-A ipaddr" for both client and server. It causes the sockets to be bound to a specific IP address on the local host. The option is useful for controlling which network interface is used. Added Dom Mitchell's handy "cvsup2html" script to the contrib directory. It converts cvsup's log output into a web page for conveniently browsing log messages and diffs. Each filename becomes a link to the corresponding cvsweb page. Changed the GUI so that pressing the enter key in the "Filter" type-in has the same effect as clicking the start button. Refuse files are explained in better detail in the cvsup(1) manual page, thanks to some changes submitted by Mark Ovens. Notable changes in release 16.0: Implemented strong authentication to control access to the server when desired. It uses a challenge-response protocol which is immune to packet sniffing and replay attacks. No passwords are sent over the network in either direction. Both the client and the server can independently verify the identities of each other. A new "-a" option on the client allows it to force the server to prove its identity. There is a new "cvpasswd" utility which is used for creating scrambled passwords for the server's authentication database. Extended the update algorithm for RCS files to handle arbitrary "newphrases" attached to deltas. (See rcsfile(5) if you don't know what "newphrases" means.) Newer versions of CVS use them when the "PreservePermissions" feature is turned on. This caused previous versions of CVSup to get checksum mismatches and perform time-consuming fixups. Note, checkout mode doesn't actually honor these newphrases yet; but CVS mode mirrors them properly now. Added a "umask=nnn" option in cvsupfiles to specify the umask to use when updating a collection. It can be different for each collection if desired. Made CVSup preserve file permissions more strictly. It used to ignore the mode bits masked off by the umask. That was wrong. Now it enforces (client mode) == ((server mode) & ~(client umask)) exactly. As a result, you may see a few zillion "SetAttrs" messages the first time you update using this version of CVSup. This is nothing to be alarmed about. Note: if "preserve" is in your cvsupfile, the effective umask is forced to 0. That causes the client's file permissions to be set exactly equal to those on the server. Fixed a bug that caused the client to loop if a collection contained a top-level directory with a one-character name. Fixed a bug that could cause the client to die if its version of an RCS file was in fact completely unrelated to the one on the server even though they had the same name. Now that situation is detected, and CVSup simply replaces the file wholesale rather than attempting to edit it. Fixed the client to clean up better if it is killed by a signal. Added Joseph Koshy's "cvsupchk" script, which finds extra unwanted files that may be littering your source tree. Look for it in the new "contrib" subdirectory of the release. Added Wolfram Schneider's "cvsup2httplog" script. It converts a cvsupd log file to standard httpd log file format, so that it can be analyzed by tools such as webalizer. You'll find it in the new "contrib" subdirectory. Added a "cvsupwho" script, inspired by Garrett Wollman, to list the currently active clients of a CVSup server. Look for it in the new "contrib" subdirectory. Changed the default connection mode to multiplexed, since it can handle all situations that the other modes can handle. Deprecated active mode, passive mode, and SOCKS mode. Added a setsockopt(... SO_REUSEADDR ...) call in the server just before the point where it tries to bind the listen socket on start-up. This allows the server to be re-started immediately after you have killed it, even if some of the old connections are still lingering. Formerly, a "Port in use" error would be reported, and you would have no choice but to wait until the old connections timed out. Added network I/O statistics to the server's final log message for each client. Also added logging of I/O statistics on a per-collection basis. The per-collection messages are at "info" priority, while the others are at "notice" level. Made some portability fixes for Linux and Digital Unix. The software now builds and runs whether using SRC Modula-3 or the newer PM3 release. Added pre-formatted manual pages to the source distribution. They are named "*.cat". Notable changes in release 15.5 (not a public release): Added a new "-s" client option to greatly reduce the client's disk load, at significant cost in safety. The option suppresses the usual stat(2) calls that check the status of each file against what is recorded in the list (checkouts) file. It makes updates run quite a bit faster, but it is not safe if there is any possibility that the client's files might be modified locally in between CVSup updates. See the caveats in cvsup(1) for more details. Added a new "-D" client option to skip all updates except file deletions. This is useful if the client's disk space is very limited. You can make one run with "-D" to free up as much space as possible. Then make another run without "-D" to update the remaining files. If files or directories have been renamed on the server, this ensures that all of the old versions are deleted before any of the new ones are created. NOTE: This option is not implemented yet for checkout mode. Fixed a signal race in the server. Under extremely rare conditions, the race caused the master server to hang in an infinite loop. Fixed the client so that it no longer dies if it fails to delete a directory. The usual cause is that the user has put an extraneous file in the directory, making it non-empty even though CVSup thinks it should be empty. Now the client issues a warning but continues on. Made the necessary changes so that CVSup can be compiled by the PM3 release of Modula-3. The SRC release still works too. Added some portability fixes from Adam Richter. Notable changes in release 15.4.2: Implemented an improved bugfix for the same server bug that 15.4.1 had addressed. Sorry, but I just wasn't happy with the original fix. The original bug was: If a client connection was lost during a particular narrow time window, it could cause the master server to die. Manual intervention would then be required in order to restore service. Fixed a client bug that showed up if cvsup got a transient failure and tried again automatically after a delay. The "Inactivity Timeout" timer from the first connection was still running, and would kill off the process if it took more than 15 minutes after the original transient error. It produced log output similar to this: Connected to freefall.freebsd.org Rejected by server: Server is going down for maintenance Will retry at 04:25:13 Retrying Connected to freefall.freebsd.org Rejected by server: Server is going down for maintenance Will retry at 04:34:53 Retrying Connected to freefall.freebsd.org Updating collection cvs-all/cvs Append to CVSROOT/commitlogs/ports Interrupted Added references to the CVSup web page in a various places. Notable changes in release 15.4.1: This is a bugfix release to correct a problem in the server. Prior to this release, if a client connection was lost during a particular narrow time window, it could cause the master server to die. Manual intervention would then be required in order to restore service. No changes were made to the client in this release. Notable changes in release 15.4: Implemented a "loose" checksumming algorithm for verifying updated RCS files. The algorithm is still basically MD5, but it carefully ignores harmless differences (and only harmless differences) in white space. Thus two RCS files which are logically the same will have identical checksums, even if they have meaningless differences in white space. This change was made necessary by recent new versions of CVS, which introduced some gratuitous changes in the white space conventions for RCS files. Since CVSup updates RCS files by disassembling them on the server and putting them together again on the client, the changes in the conventions for white space led to spurious checksum mismatches under the old, strict checksum. Note: Loose checksums require both the client and server to be at version 15.4 or later. If either is older, then strict checksums are still used. Added a "strictrcs" supfile keyword, for those who don't trust the loose checksums. It causes strict byte-by-byte checksums to be used for RCS files, as was the default in older versions of CVSup. Implemented a "nocheckrcs" keyword for client supfiles and server "releases" files, to suppress the comparison of MD5 checksums for updated RCS files entirely. Given the new loose checksumming algorithm, this option is probably not very useful. Implemented a "norcs" keyword for client supfiles and server "releases" files, to disable the usual algorithm for updating RCS files. If this keyword is specified, RCS files are treated the same as other kinds of files. You can use this to force RCS files to be updated using the rsync algorithm, for instance. Fixed things up so that file names containing white space or other obnoxious characters no longer cause problems. Also, when a release 15.4 or later server or client is connected to an older peer, it is careful not to mention any files whose names contain white space. Notable changes in release 15.3: Implemented a much more flexible access control scheme in the server. It still uses the "cvsupd.access" file, and the syntax is backward compatible with the previous versions. But it adds a lot of capability, supporting both permit and deny rules with per-host and per-network connection limits. See cvsupd(8) for details. NOTE: The one incompatibility is that _all_ clients are now subject to the limit imposed by the server's "-C maxClients" command line option. If you have been using "-C 0" in conjunction with the "cvsupd.access" file, you will need to increase the number. Implemented a new "mirror mode" for servers that are mirroring files from a master site. It reduces the disk load by orders of magnitude. Mirror mode is enabled by a new "-s" option to cvsupd. See cvsupd(8) for full details. Restructured a recursive function which could cause a thread stack to overflow in pathological cases involving RCS files with zillions of deltas. If you have ever seen illegal instruction faults, segmentation violations, or infinite looping (especially when updating CVSROOT/modules,v), this is the fix for it. Fixed the protocol engine so that a lost network connection no longer can cause a misleading error message. This also fixed a rare problem (I've only seen it once) in which a lost connection at exactly the wrong time could abort the server due to an assert failure. Made the server processes display pertinent information about what they are doing in the Unix "ps" listing. [Supported only under FreeBSD.] Fixed the server so that the whole thing doesn't die if a fork() fails. Improved the error message when a collection is temporarily unavailable because an NFS server is not responding. Fixed the Makefiles so that they are much more portable. You should be able to use them on any Unix system worthy of the name. Beefed up the "-v" version messages so that the client indicates whether it is the GUI version, and both the client and server mention the e-mail address for bug reports. Added the bug reporting address to the info window in the client's GUI. Removed the obsolete "supconv" utility. Fixed lots of minor bugs. Notable changes in release 15.2: Changed the expansion of the "CVSHeader" RCS keyword so that it deletes "Attic/" from the pathname if it is present. This prevents the expansion from changing on a branch simply because the file was killed or brought back to life on the main branch. A similar change has been made to FreeBSD's RCS and CVS systems. Fixed the handling of file permissions in checkout mode. Now each checked out file's execute bits are set based on the permissions of the corresponding RCS file and the client's umask setting. This means that checked out shell scripts and similar files will be executable as they should be. Fixed the general policy for dealing with file permissions when "preserve" is not set in the supfile. Formerly, the permissions were set when CVSup first created each file, and then ignored after that. Now, CVSup checks the permissions on each update, and sets them properly within the restrictions imposed by the client's umask setting. Made checkout-mode updates more robust against evil manipulations of RCS files by CVS repository administrators. The client now records the revision date as well as the revision number for each checkout-mode file. If the CVS administrator replaces an RCS file with a completely different RCS file, CVSup will notice that the dates of corresponding revision numbers are different and realize that the client's revision m.n doesn't correspond to the server's idea of what revision m.n is. It will do a full checkout of the affected file instead of trying to edit it based on bad information. Formerly, this sort of thing could cause assertion failures and other embarrassments. Fixed a bug in the negotiation of file attribute support which could cause an assertion failure if "preserve" mode was used between a server [or client] running under FreeBSD and a client [or server] running under a non-FreeBSD OS such as Linux. Eliminated this server warning message: "Could not generate edits for foo,v 1.1.2.1 -> 1.1.1.1.2.1: 36: Non-existent revision number 1.1.2.1 -- attempting full checkout". The message was too scary, and it typically didn't represent a situation that required human intervention. Fixed several portability problems, based on experiences with HP-UX 10.20, Linux, Digital Unix, and SunOS. Improved the error messages emitted by the client when a corrupted or truncated "checkouts" file is detected. They now suggest what to do about it. Also eliminated an assertion failure that could arise in this situation. Added extra validity checks for the deltas received from the server, to ensure that the edits will apply cleanly to the client's file before attempting to apply them. This eliminates a few potential assertion failures. Notable changes in release 15.1: Implemented a new "multiplexed" mode of operation which should eliminate all of the obstacles to using CVSup behind a firewall. In multiplexed mode, only a single TCP connection from the client to the server is used. A built-in packet layer multiplexes the four data streams over the single connection. This mode is enabled by specifying "-P m" on the cvsup command line. It works with or without SOCKS. Fixed a potential security problem: In certain circumstances it was possible for the client to create a setuid file with the wrong owner. Made the client and server deal better with files such as log files which often grow on the server while they are being transferred. The fix is duplicated in both the client and server, so that a current version of either is sufficient to get the improved behavior. Made the client and the server log the software version of the other, if it is known. Of course, it is only known if it is this version or later. Fixed a GUI bug: The "other" statistics weren't reset properly when starting a new update. In checkout mode, made the system deal better with broken CVS repositories that have file deaths recorded on the vendor branch. Fixed a bug in the handling of the client's "-i pattern" options and the equivalent "filter" type-in when in checkout mode. Specifying a directory did not cause an update of all files under it when in checkout mode; it was necessary to specify a pattern like "dir/*". Added a new server option "-e" to suppress the usual redirection of the standard output and standard error to "/dev/null". This really helps to diagnose crashes when they happen. Please use it! Notable changes in release 15.0: Added the ability to update only selected files from a collection, by specifying file name patterns with a new "-i " command line option on the client. The GUI also has a type-in field where patterns can be entered, separated by spaces. Added the ability to update all kinds of files, including symbolic links, hard links, and device nodes. Added support for mirroring directories exactly. I.e., empty directories on the server are now preserved on the client. Added the ability to preseve all file attributes, including owner, group, modes, and flags. This is under control of a new "preserve" keyword in the supfile. Changed the client's default verbosity level from "-L 0" to "-L 1". Added support for the "symlink" and "rsymlink" directives on the server, to control which symbolic links are followed and which are updated as links. Added support for specifying patterns and/or non-directory files in the server's "upgrade" and "always" directives. Added support for multiple patterns on the server's "upgrade", "always", and "omitany" directives, as well as on the new "symlink" and "rsymlink" directives. Enhanced server's "-c" option to accept a colon-separated list of directories for searching for collections, so that the collections no longer all need to be in the same place. Eliminated the client's "-d" and "-D" command line options. They were never very useful, and I had other purposes in mind for those letters. (See the next item.) Added a new "-d delLimit" option for specifying the maximum number of files that may be deleted by the client before it decides that something is seriously wrong. The "-d" conflicts with older versions' uses of "-d". But there should be little confusion, because the new version requires a numeric argument while the old one accepted no arguments. Significantly sped up the processing of the client's "checkouts" file. This eliminates a long delay that had been observed between updating the last collection and shutting down. Added support for the non-standard RCS keyword "CVSHeader". It expands the same as "Header", except that the pathname comes out as relative to the prefix rather than as absolute. Assuming the prefix is the root of the CVS repository, this gives relative pathnames within the repository. Added support for defining aliases for existing RCS keywords, and for enabling and disabling the recognition of individual keywords. This is controlled on a repository-wide basis by directives in a file "/CVSROOT/options" on the server. Added checking of file sizes in addition to modtimes during the initial culling phase. This adds some network traffic, but it also adds a degree of safety. It doesn't seem to slow things down much for typical updates. Added the "fnmatch" sources to the distribution, so that CVSup can be built on platforms that lack a full-featured version of it. The static binaries for FreeBSD now include a distribution of the client built without the GUI. It is much smaller, and may be preferred by people who never use the GUI. Notable changes in release 14.1.4 (a beta release): Added an inactivity timeout to the client, enabled only in non-GUI mode. If 15 minutes pass without any network I/O, the update is terminated with a transient error (so that it will be retried). This is useful when the client is run from cron. Added a new "-r maxRetries" command line option for the client, to cause it to give up after the specified number of retries. This is a generalization of the old "-1" option, which is equivalent to "-r 0". Added checking to ensure that the client-side "checkouts*" file is sorted properly. CVSup always keeps this file in sorted order. But if it gets corrupted such that it is no longer sorted, mass deletions can result. This actually happened on a system that had faulty RAM. A 1-bit error changed a "/" to something else. Added checksumming and fixups for all kinds of file updates. Formerly, this was done only for updates that modified (edited) existing files. Now, even files that are sent verbatim are checked. Fixed a bug in searching for the revision in effect on a certain date. Example: Searching on the trunk. The head is 2.2. The selected revision is 1.7. Because the first components were different, the code erroneously considered the file to be dead on the given date. The fix treats the trunk as a special case. The bug affected just a few files, and only when checkout mode was used on the main branch with "date=yy.mm.dd.hh.mm.ss". Added support for the "execute" keyword, for executing server-specified commands on the client when certain files are updated. Added new client options "-e" and "-E", to enable and disable the "execute" feature. Fixed the server's logging so that it now works to specify "-l /dev/stdout" on the command line. Added the necessary "libmd" sources to the distribution, so it is no longer necessary to get them separately and install them. Changed the server so that it will let you run it as root again. Notable changes in release 14.1.1: This release was made solely to fix a server bug that was imminently going to cause problems for the FreeBSD mirror sites. The bug showed itself in checkout mode. If an RCS file in the repository had the client's delta _deleted_ from it (i.e., "rcs -o1.15 file.c"), then the server would do a null pointer dereference and die. Deltas are "never" supposed to be deleted from a repository, but it may happen in the case of manual repairs. (Unamusingly, the null pointer dereference happened in the code that was simply trying to warn about the strange situation.) There were _no_ client changes between release 14.1 and 14.1.1. Notable changes in release 14.1: For both the client and the server, there is now a "-c collDir" command line option for overriding the name of the subdirectory where the collection information is maintained. The name used to be hard-wired to "sup", and that is still the default. If the client's prefix directory for a collection doesn't exist, it is no longer a fatal error. A warning is produced and the offending collection is skipped, but the others are still processed normally. If the prefix is a symbolic link pointing to "SKIP", the warning is suppressed. Fixed a server problem that caused certain pathological updates in checkout mode to take damned near forever. Fixed a problem that caused fixups to be performed for certain RCS files that were corrupted to begin with. The files had incorrect dates on some revisions, because they had been hacked up by hand. That caused the client to write out the delta texts in the wrong order. Since there was a way to work around this dubious situation, I implemented it. Changed the logic surrounding the time stamp comparisons between files on the client and files on the server, eliminating a miniscule possibility of missed updates. Now, the system can detect it if a file happens to have been modified independently on both the client and the server at exactly the same time. The file is recognized as possibly needing an update, even though its time stamp is the same on the client and the server. Fixed the client's lock file handling ("-l" option) so that the lock remains held during the intervals between retries. Formerly, the lock was released during those intervals, rendering it fairly useless for avoiding multiple stacked up processes from cron jobs. Added a check to make sure it is possible to get the client host's own IP address before starting up the GUI. Formerly, misconfigured hosts (e.g., incorrect host name) would result in a baffling "IP.FatalError" message. Changed the priorities for syslog messages from the server so that messages associated with individual client connections are logged at "info" level rather than "notice". For simple syslog.conf setups, that takes these mostly informational messages out of /var/log/messages, where they caused a lot of clutter. The logging still isn't perfect, as a few more serious messages now also come out at "info" level. Nevertheless, the new situation is an improvement. Added a new "-k" command line option for the client, intended for debugging. This option causes the bad temporary files to be saved for files requiring fixups due to incorrect edits. The fixups are still performed, regardless. Further improved the server's handling of corrupted RCS files. In virtually all circumstances, the server should now be able to issue warnings for corrupted RCS files and carry on with the remaining updates. Beefed up the semantic checking of RCS files, to detect some more pernicious kinds of corruption. Added a "norsync" option which can be specified in the server's "releases" files. It allows the server to disable the use of the rsync algorithm for selected collections and releases. This is beneficial for CVS repositories, where CVSup's "append" updates work better and more efficiently than the rsync algorithm. Added additional server checks of the filenames received from the client, to ensure that the server cannot be spoofed into delivering files from outside its collections. Notable changes in release 14.0: CVSup now uses Tridgell & Mackerras' "rsync" algorithm for updating non-RCS files. It is enabled by default, though it can be turned off for individual collections by specifying the "norysnc" keyword. The supfile can now have special collections named "*default" to specify default parameters for subsequent collections. The "base" and "host" supfile settings can now be overridden on the client's command line. The client now supports multiple "refuse" files: a global one which applies to all collections; a per-collection one; and one that is specific to a release+tag within its collection. There is now a client option to specify a lock file, to prevent multiple cvsup processes from interfering with each other. It is useful when the client is run periodically from cron, to avoid trouble if a job runs unusually long because of network problems. The client now refuses to create the "base" or "prefix" directory for any collection. Instead, it emits a diagnostic if either directory doesn't exist. As a special case, if the "prefix" is a symbolic link pointing to a nonexistent file named "SKIP", the associated collection will be skipped without complaint. The default "base" for the client is now "/usr/local/etc/cvsup". Both the server's and client's "prefix" directories are now interpreted relative to their base directories, if they are not absolute pathnames. The client now silently refuses to set the setuid, setgid, and sticky bits in files that it creates or updates. The client now does a better job of cleaning up its temporary files when it is killed by a signal. The client now tries harder to look up the IP address of the server host. There is a new "keywordprefix" keyword for the server's "releases" file. It specifies a prefix that is used when constructing the pathnames generated by the Header and Source RCS keywords. This allows the actual repositories to be in different places on different machines, while still producing identical expansions of the RCS keywords. The server will now accept connections from certain "friends" listed in a configuration file, regardless of whether the maximum number of simultaneous connections has been exceeded. The server can now do its logging via syslog. The server log messages have been cleaned up quite a bit. The server now logs any repository problems that it notices, e.g., unparsable RCS files, non-RCS files in the Attic, and so forth. The server now ignores any "hostbase" specified in the client's supfile. A new server argument "-b base" specifies the base directory. The default is now "/usr/local/etc/cvsup". The server now validates all collection names to make sure they contain no slashes and are not equal to "." or "..". The server now checks for certain errors earlier, before becoming a daemon. All of the programs except the server now install into "/usr/local/bin". The server still installs into "/usr/local/sbin". Fixed a bug in the ordering of the "branches" list in the RCS file, which on very rare occasions caused a "fixup" to be required. Fixed a bug which could cause the client to hang trying to flush its network buffers after the user pressed the "stop" button in the GUI. Fixed a bug that caused the client to complain "file exists" when trying to create directories leading up to a new file, if the pathname contained a "." (current directory) component in it. This prevented "upgrade ." from being used in the server collection list files. Unfortunately, since it's a client-side bug, such lines still should not be used for a while, until older releases of the client have evaporated away. Fixed a bug which produced a misleading error message when a failure occurred in making the directories leading up to the temporary file that is used for the list file in the client. When bad tokens or protocol errors are encountered, the offending text is no longer included in the error message. Sometimes it contained voluminous amounts of garbage. Messages reporting errors in the client-side list files are accompanied by line numbers now. Notable changes in release 13.5: Support SOCKS, using a new add-on library in ports/lang/modula-3-socks. Add command line options "-z" and "-Z" for directly controlling the "compress" option, overriding what is in the supfile. Likewise, add "-d" and "-D" for overriding the "delete" option. Make the client retry automatically when transient failures occur. This is done only in batch (non-GUI) mode. Retries use randomized exponential backoff. The retry delay starts out at about 5 minutes, and increases to a maximum of about 2 hours. Programs are now built fully dynamically linked by default. If "-DSTATIC" is in the "M3FLAGS" environment variable, then they are linked fully static. If "-DM3STATIC" is present, then the Modula-3 libraries are linked statically, and the system libraries are linked dynamically. (This used to be the default.) It is now possible to build the client without the GUI, by adding "-DNOGUI" to the "M3FLAGS" environment variable. Notable changes in release 13.4: Detect and send changes to the RCS keyword expansion mode. Formerly, these (rare) changes were ignored. That caused checksum mismatches, which slowed down updates because the whole files had to be sent as fixups. Report 0-byte appends as what they really are, i.e., touches. Add a new statistics line for them. Make the command line option handling comply better with POSIX. Fix supconv to handle recent changes to the example "ports-supfile" in FreeBSD-current. Add a timeout to kill a server process when it has been inactive too long (15 minutes). This replaces the TCP keepalives that were added in the previous release. Add a hack to the server to make it easier to shut it down in a controlled manner. If a file "cvsupd-HALT" exists in the directory from which the server was started, and if it is newer than the time when the server was started, then the server will reject all new incoming connection requests. Make some changes to the zlib interface to eliminate the potential for an unsafe interaction with the garbage collector. FreeBSD binary releases are now built with a new version of the Modula-3 runtime that has a thread-safe version of malloc built into it. This cures some vexing core dumps that had been happening from time to time. Add work-arounds for the worst of the problems associated with malloc packages that are not thread-safe. These are not complete, however. I will probably incorporate a (hopefully portable) thread-safe malloc in the next release. Eliminate several FreeBSD-specific constructs that caused portability problems on other platforms. There is a good chance now that this software will compile and run out-of-the-box on most POSIX systems with standard SRC Modula-3 installations. Notable changes in release 13.3: Implement a passive mode for establishing the data connection, to help people who live behind firewalls. Passive mode is similar to ftp's passive mode: all TCP connections are initiated from the client. See the "-P -" option in cvsup(1). Make the system much more resiliant in the face of errors in the server's CVS repository, such as unreadable files and garbled RCS files. Almost all such situations now lead to simple warnings, rather than fatal errors. Make it a warning rather than a fatal error when the client specifies an invalid collection. Fix the broken "refuse" file handling. Make the server refuse to run as root, for security reasons. Fix a bug that could cause a fatal error to occur in certain situations involving local check-ins to RCS files in the CVS repository. Fix a server bug encountered during SOCKS testing. Note: This release of CVSup still does not work with SOCKS. Enable TCP keepalives on the server. Notable changes in release 13.2: Fix a bug that caused the server to give up when an RCS file in the repository got really out of whack. This happened only when it was trying to update a client file in checkout mode. Now the server falls back upon checking out a fresh copy of the file. Notable changes in release 13.1: Fix a bug that caused the server to leave zombie processes under FreeBSD-current. Fix a bug that caused the build to fail on a manual page problem under FreeBSD-current. Permit more control over which TCP ports are used, making it more convenient to use the client behind a firewall. See the new "-P" option in cvsup(1). Support building static, dynamic, or partly dynamic executables. "Partly dynamic" means the system libraries are dynamic, but the Modula-3 runtime libraries are static. See "Install" for details. For now, I am still putting fully static executables in the binary distributions. Respond more quickly to the interrupt button on the client GUI. Fix the supconv utility to handle the ports collection better. Make supconv install properly, and add a manual page for it. Add various enhancements to the manual pages. Release 13.0: Initial public release.