_ _ _ __| |o ___ __| |__ ___ __ _ ___| |__ ___ distcache / _` |_/ __|__ __/ __|/ _` |/ __| '_ \ / , \ Distributed session caching | (_| | \__ \ | | | (__| (_| | (__| | | | __/ www.distcache.org \__,_|_|___/ |_| \___|\__,_|\___|_| |_|\___| distcache.sourceforge.net ------------------------------------------------------------------------------- ``It is not necessary to change. Survival is not mandatory.'' -- W. Edwards Deming Current version: 1.4.5 [CVS branch: BRANCH_1_4] ---------------------- Changes between 1.4.4 and 1.4.5 ------------------------------- *) The memory functions used in the case SYS_DEBUG_LEVEL is set high were violating the linker rules I'd put in place, so I'm ditching this needless indirection. I've also removed the debug stream functions - the current use of macros allows indirection later if we need it. [Geoff Thorpe] *) A somewhat serious race bug has been uncovered in the 'dc_client' utility used to proxy distcache operations between applications and a remote server. The multiplexing code that handles rewriting request uids was horribly broken when cleaning up after a disconnected client, and would cause all requests on other client connections to be orphaned. The fact this hasn't been discovered before is largely due to lucky timing, but would almost certainly cause instabilities long term in any real-world deployment. Upgrading is highly recommended, and apologies that such a wild bug has managed to slip through my testing this long, I'm somewhat stunned myself! [Geoff Thorpe] *) Created CVS branch "BRANCH_1_4". This branch is solely to maintain stable releases with bug-fixes and documentation enhancements, as certain things will be overhauled, changed, and made quite incompatible in the head of CVS. It is hoped this branch will receive enough testing to become the "stable" branch so that 0.4 can be deprecated. [Geoff Thorpe] *) Minor restructuring in NAL_SELECTOR to more cleanly separate between the API and the underlying details. [Geoff Thorpe] Changes between 1.4.3 and 1.4.4 ------------------------------- *) Replace configure.ac with configure.ac.template in the ssl/ subdirectory so that the bootstrap.sh script can (re)create the autoconf script more easily. This is to ensure the version information from the top-level configure.ac script is replicated into the sub-directory's script. [Geoff Thorpe] *) Ensure that the default behaviour is to built static libs and no shared libs. Specifying --disable-static and/or --enable-shared to the configure script can override this behaviour. Reword the help strings in the configure script to be "--disable-..." when the feature in question is on by default. Also, use autoconf to define (or not, as the case may be) optional sub-directories to the Makefile.in->Makefile conversion rather than using automake conditionals in the Makefile.am->Makefile.in process. This fixes a build error in 1.4.3 that would configure ssl targets but not build or install them. [Geoff Thorpe] *) Minor documentation improvements. [Geoff Thorpe] *) Add a new switch "-sslmeth " to the 'sslswamp' tool to allow the user to stipulate the record and handshake layer version required. Apart from fixing the record layer version in advance, this switch is also the easiest way of avoiding the use of SSLv2-compatible ClientHello records. The values for "" are "normal", "sslv2", "sslv3", and "tlsv1". [Geoff Thorpe] Changes between 1.4.2 and 1.4.3 ------------------------------- *) Fix a bug that can cause non-blocking connects to jam. If a non-blocking connect begins, the appropriate way to spot completion (or failure) is by selecting for writability, but this was not necessarily happening. Worse still, the application can go into an infinite loop with select() breaking because of readability despite the fact that the read IO logic was not checking for nb-connect completions (this happens only in the send IO logic). The cleanest way is to not select for readability until the connect is complete, though an alternative would be to duplicate the completion checking code for the read case too - I'll stick with this one for now. [Geoff Thorpe] *) Add "-sockowner", "-sockgroup", and "-sockperms" command-line switches to dc_server and dc_client to allow ownership and permission controls when listening on unix domain sockets. On most systems, these would only succeed when starting programs as root (in which case, the "-user" switch would be wise too). If autoconf is unable to build support for these options, they will always emit failure warnings at run-time before continuing. [Geoff Thorpe, based on an idea/patch from Joe Orton ] *) Add chown/chmod support to libnal listener objects via two new API functions; NAL_LISTENER_set_fs_owner(); NAL_LISTENER_set_fs_perms(); When creating listener objects over unix domain sockets, the ownership and permissions can be altered to control connection access. (Note, this usually requires root permissions.) This functionality uses two new handlers added to the listener vtable type, and listener types that do not support this functionality (TCP/IP, "FD:" pipes, [etc]) supply NULL handlers and the API will return errors on their behalf. [Geoff Thorpe, based on code from Joe Orton ] *) Add setuid support to libsys as SYS_setuid(), corresponding tests in configure.ac, and add a corresponding "-user " command-line switch to dc_server and dc_client. [Joe Orton ] *) In the last release, certain functions operating on selectors and connections or listeners were changed from being NAL_SELECTOR_*** functions to NAL_[CONNECTION|LISTENER]_*** equivalents. Unfortunately, this change lost the ability to add connections to listeners with a bitwise flag allowing the caller to stipulate which events (s)he wants selected (or more accurately, which events (s)he does *not* want selected). This has been reinserted in the underlying libnal vtable layouts, and the new API function NAL_CONNECTION_add_to_selector_ex() exposes this extension. [Geoff Thorpe] Changes between 1.4.1 and 1.4.2 ------------------------------- *) Add a new shell tool called "piper" to help support and test file-descriptor based addresses. This code is in a new directory, "util/". 'piper' lets you start two commands as child-processes with arbitrary pipes between them. The default pipe, "--", is equivalent to "--1>0,0<1" which means to bind stdin/stdout to each other between the two commands (a bidirectional version of the traditional pipe '|'). The code is ugly, and it could probably benefit with being overhauled and generalised (eg. chaining more than two commands, allowing pipes from the last command to the first, etc). However, right now it works and lets you do things like; piper dc_test -connect FD:0:1 -persistent -- dc_server -listen FD:0:1 [Geoff Thorpe] *) Reinstate the NAL_CONNECTION_create_pair() function in the new vtable code (as its an API function to the socket-specific vtables). [Geoff Thorpe] *) Add a new address/listener/connection family based on arbitrary file-descriptors. The syntax for these types are FD: for a single descriptor for reads and writes, or FD:: for different read and write descriptors. The semantics are that connections work immediately without opening anything, but close the corresponding descriptors when cleaning up (this should be configurable in the syntax at some point). Listeners of this form accept a connection on the first given chance, but thereafter are marked "finished", as noticed by NAL_LISTENER_finished(). Also that read-only or write-only connections can be created using -1 as a file-descriptor in one half of the syntax. [Geoff Thorpe] *) To support a more general class of network abstractions, is makes sense to consider the possibility of a listener terminating. The pressing example that I'm working on is a file-descriptor address type that would support, for example, specifying stdin/stdout as an address for use in pipes and what-not. In such a case, "listening" on stdin/stdout amounts to accepting a single connection - and the most logical way to phrase this in the API is to consider that the listener is "finished" once it has accepted a single connection object (which it will gladly do at the first given chance). So NAL_LISTENER_finished() has been added, with the appropriate vtable wiring in libnal. [Geoff Thorpe] *) Add a NAL_BUFFER_transfer() function for automatically moving as much data as possible from one buffer to another. [Geoff Thorpe] *) Adjust the vtable design in libnal to make things more orthogonal. As part of this, each vtable has a parameterless constructor that is used in advance of any other "create" handlers. From the libnal API, these are usually seen as a single function, but separating them internally allows the "reset" logic to work better. This also exposes a consistent set of vtable functions in nal_devel.h to let vtable implementations manipulate libnal objects directly. [Geoff Thorpe] *) Created a new exported header, , containing elements split out from libnal's own nal_internal.h header. This header can be used to implement additional network abstraction types. [Geoff Thorpe] *) Allow NAL_ADDRESS_vtable implementations to register themeselves with the libnal core so they become automatically available to applications via their string syntax. As with the builtin (IPv4/UNIX) vtable implementation, this provides the single point of entry to any associated implementations of listener and connection types. [Geoff Thorpe] *) Compact the AC_CHECK_*** macros so we save space in the generated configure scripts. [Joe Orton] *) Adjusted the NAL_[ADDRESS|LISTENER|CONNECTION] vtable handling in libnal so that the API instantiates contexts on behalf of implementations. Apart from simplifying implementation code (their contexts are always there so, there's no allocation and error handling required), this will also make it easier to introduce object reuse. [Geoff Thorpe] *) Added the beginnings of a benchmarking and self-testing libnal program, nal_test. [Geoff Thorpe] *) Modularisation of libnal (sequel to the earlier overhaul) - the major libnal types are now abstract classes implemented via vtables with interfaces defined in nal_internal.h. - the IPv4 and UNIX transports are handled by the same vtable implementation, in proto_std.c, by developing and making more use of the nal_sockaddr wrapper in util_socket.c. - The libnal API functions are implemented independantly of the vtable implementations they defer to, and are separated into the following C files; nal_address.c, nal_buffer.c, nal_connection.c, nal_listener.c, and nal_selector.c. nal_codec.c contains the primitives-serialisation functionality that used to be in bincoding.c. This new code seems to break nothing but it may (of course) have introduced bugs. It may also have introduced some slow-downs due to the more abstracted and formal approach - I've deliberately put off a bunch of optimisations until I get this working. I will be committing some libnal testing code shortly. The overhauling of the API is not finished yet - some generalisation of NAL_BUFFER is required (it is currently not abstracted like the other types), and once the code settles down again I will look at some header reorganisations so that the necessary "internal" elements of the libnal headers can be exposed to facilitate external plugin implementations. [Geoff Thorpe] *) Add a "-killable" switch to dc_server and dc_client so that SIGUSR1 or SIGUSR2 cause a clean shutdown, for memory leak checking mainly. However to make this sane from a user/admin point of view, we make them *ignore* either signal if the switch is not specified (rather than the default behaviour which is to automatically terminate the process). [Geoff Thorpe] *) Added a SYS_sigusr_interrupt() function to the libsys API for use by executables (can't be added to libraries). The normal response to a SIGUSR1 or SIGUSR2 signal is to kill the process immediately, but by handling this signal with a callback the effect is that any NAL_SELECTOR_select() operation is interrupted with a negative return value. NB: If the signals are SIG_IGN'd instead, the select doesn't break (on linux at least), so a handler callback is required. To handle the case that the signal arrives while we're not sleeping, a pointer (int *) is passed that will be set to non-zero from the signal handler. [Geoff Thorpe] *) Improved cleanup code in dc_test (for memory leaks). [Geoff Thorpe] *) Major overhaul of libnal - NAL_BUFFER implementation separated out into buffer.c - NAL_SELECTOR implementation separated out into selector.c - addition of NAL_LISTENER_get_fd() - addition of const versions of NAL_CONNECTION_get_[read|send] - converted NAL_SELECTOR_[add|del]_[conn|listener] functions into NAL_LISTENER_*** and NAL_CONNECTION_*** equivalents. - converted NAL_LISTENER_accept() to NAL_CONNECTION_accept() as this makes more OO sense. Also removed NAL_LISTENER_accept_block() which was unused (and trivial for the caller to manufacture if they need it). - removed NAL_[CONNECTION|LISTENER]_get_fd() functions as these don't help me to preserve opacity and weren't used (except to work around the problem now solved by the previous change in this list). - removed unused "mask"ing from the libnal-internal "unset/clear" functions - unecessary complexity. - updated documentation for the above changes and tried to improve clarity in the process. - NAL_CONNECTION now dynamically allocates its NAL_BUFFER buffers. - file-descriptor work is now handled in util_fd.c, and functions are called nal_fd_*** instead of int_***. - socket work is now handled in util_socket.c, and functions are called nal_sock_*** instead of int_***. - int_check_buffer_size() is now nal_check_buffer_size. - libnal's internal sockaddr_safe type is now nal_sockaddr. - nal_sock_sockaddr_from_ipv4() now handles name resolution and other aspects of address parsing, removing complexity from NAL_ADDRESS code. - NAL_LISTENER and NAL_CONNECTION no longer keep an internal copy of their parent NAL_ADDRESS structures. This makes encapsulation hard, has never been used, and can be managed by the caller if they so wish (ie. if they want to keep a copy of the address, they can). - NAL_config_set_nagle() needs no return type, so it's now void. - NAL_ADDRESS_source_string() has been removed as this is as unnecessary as keeping a NAL_ADDRESS copy inside NAL_LISTENER and NAL_CONNECTION was - the caller can take care of such "caching" if they want/need it. - specialised functions (NAL_CONNECTION_create_[pair|dummy], NAL_SELECTOR_stdin_[add|readable], and NAL_stdin_set_non_blocking) have been "#if 0"'d out for the moment as they're unused and will (initially) complicate modularisation of the libnal implementations. I'll put these back in as/when I get round to it after I'm done with the current overhauls. - minor tidy-ups and bug-fixes [Geoff Thorpe] *) Put libtool in charge of compilation and linking again and, by default, build shared libraries again. For development purposes, the bootstrap script uses "--disable-shared" when PRECONF is being used. [Geoff Thorpe] *) Update copyright dates to 2003. [Geoff Thorpe] *) Some minor bug fixes in sslswamp. [Geoff Thorpe] Changes between 0.4 and 1.4.1 ----------------------------- *) Bundle CA.pem and A-client.pem into the sslswamp directory (and RPM). These are also installed in the appropriate location and the sslswamp executable is compiled to find CA.pem automatically. [Geoff Thorpe, with some Makefile.am hints from Steve Robb] *) Modifications to the RPM spec file; - Build sslswamp and package it in its own RPM file (distcache-sslswamp). - Use the "%configure" RPM macro rather than calling "./configure" directly. This ensures that per-platform optimisations and/or compilation preferences are honoured. - Pre-define $INSTALL_PROGRAM to automatically strip installed executables. I don't personally care about "GNU Coding Standards" that result in installed programs that are consistently 10 times bigger than they need to be, simple to add debugging information that would never be used by people who aren't capable of building programs themselves. Disk space and RAM are resources, and should not be abused. - Include instructions for building redistributable RPMs for various CPUs. [Geoff Thorpe] *) Change the top-level configuration such that the ssl/ tree is configured and built by default unless --disable-ssl is specified. Likewise, swamp is built by default unless --disable-swamp is specified. [Geoff Thorpe] *) Used AC_CONFIG_SUBDIRS to (conditionally) run the configure script in the ssl/ sub-tree. This is a more robust method for hooking up the build system, and solves the issue of automatically passing command-line flags to the other script (including appropriate changes for --srcdir, etc). [Geoff Thorpe, based on some salient wisdom from Steve Robb] *) Rename "swamp" to "sslswamp". This is to reduce the chances of name collisions with other non-ssl utilities, and to help the chances of sslswamp turning up on searches for ssl utilities. [Geoff Thorpe] *) An "ssl/" sub-tree has been created that includes its own autotools framework for building openssl-based utilities. The top-level build system handles; - selectively enabling the sub-tree's participation depending on the "--enable-ssl" switch. - synchronising the autoconf version number in ssl/ with that in the top-level distcache code. - Passing any ssl-specific configure switches through to the ssl/ sub-tree's own configure script. - (un)bootstrapping the ssl/ sub-tree together with the top-level. Additionally, the latest release of swamp has been ported to use libnal and is included in the ssl/ sub-tree. Building of this ssl/tls benchmarking tool can be activated by specifying "--enable-swamp". [Geoff Thorpe] *) I will be creating a sub-tree for building SSL/TLS-dependant applications and this will start with the import of "swamp", a benchmarking program I want to unify with libnal. As part of this move, I'm bumping up the versioning system so that the next release will be 1.5 instead of 0.5. The reason for this is that swamp is currently at 1.1 and I want to avoid the inevitable confusion had swamp's version gone *down*. With this in mind, I've changed the autoconf script to set the version at 1.4.1dev and any pre-releases of 1.5 will be of the form 1.4.x (without the "dev" suffix). [Geoff Thorpe] *) I discovered a rather annoying bug in the 0.4 release just as I was updating apache-2 support. The s/NAL_/SYS_/ changes I made leading up to the 0.4 release caused some linker dependencies in our installed libraries upon libsys which is *internal-only*. The solution I have put in is that libsys/pre.h requires the C file to have declared SYS_LOCAL, SYS_GENERATING_EXE, or SYS_GENERATING_LIB. In the instance of SYS_GENERATING_LIB, libsys/post.h will not declare any functions implemented in libsys. Using this change, the offending dependencies were found and have been converted to macros. [Geoff Thorpe] Changes between 0.4pre2 and 0.4 ------------------------------- *) Added the ASCII-art from README.TOOLS to the FAQ so that README.API and README.TOOLS can been removed. [Geoff Thorpe] *) The headers have been re-organised to better guard against the possibility of API headers dependending on internal headers. To this end, the libsys header has been split in two - one header to include system headers based on autoconf findings (pre.h) and one to declare internal functions and macros used in the source code (post.h). API headers can depend on pre.h but not post.h. Likewise, distcache's internal header (dc_enc.h) has been renamed to dc_internal.h. Finally, all the C files have been checked to make sure they include headers in the correct order; (a) pre.h, (b) API headers, (c) miscellaneous internal headers, then (c) post.h. [Geoff Thorpe] *) The non-networking stuff in libnal (the daemon/sigpipe/etc wrappers as well as the mem and streams debugging cruft) has been separated out into a new library, libsys.a, that is not installed but is linked into the distcache executables. The names for these macros and functions have also been renamed from "nal" or "NAL" prefixes to "sys" and "SYS" respectively. Similarly, the source code has been moved out of the libnal/ directory into a new directory, libsys/, and the libnal/common.h header has been moved to libsys/sys.h. [Geoff Thorpe] *) Remove unnused stream-hacking functions from libnal, this should have been done when libnal first became a separately-installed library. I've also defined the NAL_fprintf and NAL_std[in|out|err] symbols directly to their stdio.h counterparts - they are only implemented when running debug builds, and this is so that we can undefine the raw stdio.h versions to verify our code isn't using them directly. [Geoff Thorpe] *) Force the use of alternative wrappers for strncpy and strdup because these may be defined as macros by the system that use memcpy and malloc and our debugging code shuts those off. As an added check, our strncpy wrapper macro null-terminates all strings unlike the normal version which can leave cropped strings without any terminator. [Geoff Thorpe] *) Fixed the NAL_CONNECTION_is_established() logic. Non-blocking connects are now handled and their eventual completion (or failure) will now break NAL_SELECTOR_select() operations. NAL_CONNECTION_is_established() and NAL_CONNECTION_io() now generate logical results for this scenario. [Geoff Thorpe] *) Re-organised the "devel/test.sh" script. Output is now cleaner and the script is easier to modify for customised mid-hacking tests. [Geoff Thorpe] Changes between 0.4pre1 and 0.4pre2 ----------------------------------- *) Replaced the "distcache.spec" RPM spec with "mandrake.spec.in". To work on non-Mandrake distributions probably requires changes anyway (as per the comments in the spec file). The use of autoconf to generate the spec file from mandrake.spec.in allows the appropriate version to be substituted automatically. [Geoff Thorpe] *) Forced "VERSION" to be defined by autoconf/automake by hacking inside configure.ac, and in such a way that "@VERSION@" is usable by Makefile.am files (eg. for pod2man, etc). This previously only worked reliably for the particular combination of autotool versions on my system. [Geoff Thorpe] *) The "targetgroup" replacement trick in the RPM spec was broken, so it has been ironed out and header comments have been expanded to note how to customise this for non-Mandrake RPM systems. [Geoff Thorpe] *) Produce conventional static-libraries directly rather than libtool archives. This is the easiest way to prevent the installation of "*.la" files and as we're already disabling building of shared-libraries (AC_DISABLE_SHARED in configure.ac), there's nothing to be gained from libtool libraries. [Geoff Thorpe] *) Allow CVS users to pass settings to bootstrap.sh for use in ./configure if it will be automatically run because of PRECONF. These settings can be specified by the PREFLAGS environment variable. [Geoff Thorpe] *) Documentation no longer builds or installs HTML files by default. These seem to have grief with cross-links and aren't much use. If someone decides to work on that at some point, we can always link it back in - but for the mean time the man pages provide the better format. [Geoff Thorpe] *) Many libnal functions had a return value merely to allow soft failure if a required parameter was NULL. This policy has been changed as a hard failure is guaranteed in such circumstances anyway and easier to diagnose at run-time. To simplify code and remove these unnecessary tests, the soft parameter checks have been removed and where appropriate, return types converted to void. These changes have propogated back through various dependant parts of the code and where appropriate, other functions have lost their return type if they are now guaranteed to succeed. Documents have also been changed where necessary. [Geoff Thorpe] *) The type-safe wrappers for malloc/realloc/free and memset/memcpy/memmove, as well as their replacement functions (only created during debug builds to verify that the raw functions aren't called), have been re-organised and consolidated. This results in one less function call each time for the malloc stuff in the non-debugging case, and more readable code. [Geoff Thorpe] *) Removed the unnecessary NAL_BUFFER_read_ptr() function as it is equivalent to NAL_BUFFER_data() except the latter (correctly) returns a const pointer. This function was apparently written when I was too distracted to realise that NAL_BUFFER is a FIFO and the read pointer is invariant. Also, remove the NAL_BUFFER_takedata() function and consolidate its slightly additional functionality into NAL_BUFFER_read() (namely that a NULL pointer can be used to turn the "read" into a "discard"). [Geoff Thorpe] *) Add more API documents; - NAL_LISTENER_new.pod (all NAL_LISTENER functions) - NAL_SELECTOR_new.pod (all NAL_SELECTOR functions) - NAL_BUFFER_new.pod (all NAL_BUFFER functions) - NAL_decode_uint32.pod (all NAL_encode_*** and NAL_decode_*** functions) - DC_SERVER_new.pod (all DC_SERVER functions) [Geoff Thorpe] Changes between 0.3 and 0.4pre1 ------------------------------- *) Remove mention of README.API and README.TOOLS from the README, because they are not bundled into source distributions. Instead mention the documents contained in the doc/ directory. [Geoff Thorpe] *) More fixes to improve the usefulness of "make dist[-bzip2]"; - a Makefile for ./devel/ to install useful files, - pod files in ./doc/ should be installed too, - BUGS note to remind us that README.API and README.TOOLS won't be installed and need to migrated to the man pages, - install extra files from the top-level directory (ANNOUNCE, BUGS, CHANGES, etc), - Update the top-level configure.ac to modern automake syntax and support for bzip2 tarballs, - use EXTRA_DIST in the includes/ directory for headers that aren't listed for installation. [Geoff Thorpe] *) Added a BUGS file, with an initial list of the bugs I'm aware of. [Geoff Thorpe] *) autoconf/automake-generated sludge files are now left in the top-level directory rather than having them in a config directory created and destroyed by (un)bootstrap.sh. This is because "make dist" is broken in at least one version of the tools and this is the only safe solution I can see. [Geoff Thorpe] *) Add more API documents, now for libnal; - NAL_ADDRESS_new.pod (all NAL_ADDRESS functions) - NAL_CONNECTION_new.pod (all NAL_CONNECTION functions) [Geoff Thorpe] *) Rename all libnal allocation functions to NAL_***_new() rather than NAL_***_malloc(). [Geoff Thorpe] *) A top-level "include" directory has been created with sub-directories matching the format in which we install API headers. All header files that need to be used outside their own source directory have been moved into this tree, and the automake support has been added so that only those we wish to be treated as API will be installed. Eg. libdistcache/dc_enc.h needs to be used in a few directories but is not an API header so it has moved to include/distcache/ but will not be installed by automake. Ditto for libnal/common.h. A consequence of this is that our own source code now uses the same include paths as we document for users of the API, which is a "Good Thing". Also, we can refine the INCLUDES settings during building to be less loose than before. Previously the top-level directory would be available as an include path and so would the build directory. The latter was only needed to get to the autoconf-generated config/config.h file when building outside the source tree, and the former was to allow paths like libdistcache/ to be visible. For include paths, the top-level directory is now replaced by it include/" sub-directory, and the build directory is now replaced by its "config/ sub-directory. [Geoff Thorpe] *) dc_enc.h has been made an internal-only header and the parts of it we want exported have been moved to a new exported header, dc_plug.h. This hides DC_MSG and other protocol details from the API, which reduces the hassle involved in changing any of them later. [Geoff Thorpe] *) Start adding API section 2 man pages, currently documenting the libdistcache APIs; - DC_CTX_new.pod (all DC_CTX functions) - DC_PLUG_new.pod (DC_PLUG_[new|free|to_select|io] functions) - DC_PLUG_read.pod (all other DC_PLUG functions) [Geoff Thorpe] *) Fix the libdistcache Makefile to not list a header as a source file and to also install dc_enc.h as an exported API header. [Geoff Thorpe] *) Commit an initial version of a ".spec" file for building distcache RPMs. [Geoff Thorpe] *) Comment out openssl probes and configuration from our autoconf support so that (in-progress) work on RPM scripts and what-not do not automatically create package dependencies on openssl. [Geoff Thorpe] *) Flesh out the existing man pages to be (a little) more complete, and add more man pages to supplement them. The man pages available are now; - distcache(8) - dc_server(1) - dc_client(1) - dc_snoop(1) - dc_test(1) [Geoff Thorpe] *) Make "-connect" and "-server" aliases in dc_snoop for consistency with the syntax used by dc_client. [Geoff Thorpe] *) Started creating 'pod' documentation. This work is incomple [Geoff Thorpe] *) Pre-empty failure on HPUX by testing for "-ldld" as needed by OpenSSL's DSO code. [Geoff Thorpe] Changes between 0.2 and 0.3 --------------------------- *) Rename "test_session" to "dc_test" to keep with the naming convention for all utilities. [Geoff Thorpe] *) Tidy up the "bootstrap.sh" script and add support for two built-in gcc configurations. If the PRECONF environment variable is set, then the bootstrap script will automatically invoke "./configure" with preset CFLAGS. The two built-in options are PRECONF=[gcc-RELEASE|gcc-DEBUG]. [Geoff Thorpe] *) Add two switches to test_session to allow controlling the size of session data when generating sample sessions manually. This doesn't apply in the OpenSSL case, but I have disabled the use of OpenSSL in test_session too as it wasn't terribly useful and adds complexity to the build system. [Geoff Thorpe] *) Fix a "flushing" bug in libdistcache that would occasionally not fully advance the state-machine of a "plug" in either the read or write direction. This occurred when a connection's read or write buffer contained data for more than one fragment of message - sometimes a subsequent fragment would not be pulled (or pushed) through, leading to occasional hangs in a select() waiting for traffic that has already been received. This should finally mark the end of the "works for a while then hangs" problems we were seeing. [Geoff Thorpe] *) Add a helper program, "dc_snoop", to act as a transparent proxy. When a client connects, a corresponding peer connection is set up to the configured back-end server and data is transparently proxied back and forth - meanwhile it is analysed and various information can be displayed to the console. [Geoff Thorpe] *) Correct some comments, and make sure *all* code agrees on a fragmentation size of 2048 for messages broken into fragments. This affects binary compatibility with 0.2, but 0.2 was (in some cases) broken in this respect anyway. In any case, the protocol version is bumped to ensure subsequent versions don't try to talk to older versions. [Geoff Thorpe] *) A variety of changes to libnal - get rid of unused (and horrible) NAL_***_move() functions, - change a miniscule helper function to a more readable macro, - re-organise the helper macros into their own section of code, - Consolidate the malloc/free code with the init/finish code as malloc/free is the only mechanism declared in the libnal API, - improve parameter checking, - improve some logic such that a structure's elements are only changed if success of the function is guaranteed - makes error-handling easier, - regard accepted connections as automatically "established" even if they are non-blocking. [Geoff Thorpe] *) Avoid more "statement will never be executed" and signed/unsigned warnings. Use "do { ... } while(0)" bracings in the libnal typesafe macros. [Geoff Thorpe] *) Fixed two nasty bugs caused by uninitialised structure elements in sessclient. Thanks to valgrind. [Geoff Thorpe] *) Make some macros in libnal/common.h more robust against semi-colons, or expressions being used as parameters. Also, clarify and simplify some timeval handling in libnal/sys.c. [Geoff Thorpe] *) Fixed some "cached_idx" nastiness found in libdistcacheserver where -1, which was used to indicate "nothing cached", was not being checked and instead populated into an unsigned integer as a valid index. Also fixed some weird-looking code found during the bug-hunt. [Geoff Thorpe] *) Fix the "ISO C89 compiler" warnings about string constants longer than 509 characters by re-declaring them as arrays of strings. This means the utility programs display their usage messages by displaying each string in the array separated by newlines. [Geoff Thorpe] *) Remove unexecutable code, and correct some more signed/unsigned mismatches. [Geoff Thorpe] *) Indent #error directives (so "traditional" C pre-compilers ignore them) and unindent any #define directives (so the same pre-compilers don't ignore them). [Geoff Thorpe] *) Some signed/unsigned mismatches were causing integer variables, that use -1 as a special case, to be munged and not treated as negative. This was causing some array smashing and other weirdness. [Geoff Thorpe] *) Fixed include paths in automake so that any build directory, different to the source-tree itself, can be used by running; /path/to/distcache/configure --srcdir=/path/to/distcache ... [Joe Orton ] *) If the build system contains pkg-config, use that to establish compiler and linker flags for building against OpenSSL. [Joe Orton ] *) Re-order some autoconf checks, eg. check library/linkage first so that additional linker flags (such as "-lnsl -lsocket" on Solaris) are available before we check for specific functions. [Steve Robb] *) Extend NAL_daemon() for platforms that don't provide the daemon(3) function (eg. Solaris) by implementing our own fallback version. [John Milton and Steve Robb] *) Upgrade the mod_ssl (apache 1.3.*) support to mod_ssl-2.8.12 [Steve Robb] *) Change the name of the executables "sclient" and "sserver" to "dc_client" and "dc_server" to avoid name-clashes with the Kerberos distribution. [John Milton and Geoff Thorpe] *) Add a demo client certificate (taken from my "tunala" demo in OpenSSL) for use in "test_session" when generating sample sessions containing peer- certificates. [Geoff Thorpe] Changes between 0.1-seed and 0.2 -------------------------------- *) Altered the binary protocol used by distcache to begin each message with a 32-bit protocol level. The top 16-bit word of this is a "protocol value" which must be identical for peers to interoperate (though a server with a higher value could respond to the first request by adopting the peer's protocol). The lower 16-bit word is a "patch level" which allows the more recent of two peers to decide if it should accept communications or not with the peer (and work around older bugs if necessary). [Geoff Thorpe] *) Added DISTCACHE_CLIENT_API and DISTCACHE_CLIENT_BINARY version defines to dc_client.h so that apache/mod_ssl plugins can run sanity checks on the version of distcache. [Geoff Thorpe] *) Allow building without OpenSSL support (only affects test_session which can generate garbage sessions to test with rather than OpenSSL-compatible ones). [Geoff Thorpe, Steve Robb] *) Add "-pidfile" and "-daemon" switches to the 'sserver' utility. [Geoff Thorpe] *) Added a self-test script to test sserver and sclient with test_session. [Geoff Thorpe] *) Removed various things from 0.1-seed that aren't relevant; - IN_MAKEDEPEND hacks no longer needed as autoconf/automake handle dependencies. - wrapper functions removed for unneeded stuff, fork(), waitpid(), etc. - NAL_SELECTOR_create() removed too. - NAL types are always dynamic now, so init() functions aren't needed to initialise static versions. - Get rid of some unnecessary types and use just DC_ERR where possible (this altered the protocol slightly). [Geoff Thorpe] *) Use the autoconf-generated config.h to control #includes. [Geoff Thorpe] *) Add the first part of autoconf/automake/libtool support to distcache including numerous followup tweaks. [Steve Robb]