[ldm-users] LDM 6.9.6 now available

Greetings,

Version 6.9.6 of the LDM is now available. The LDM homepage is
<http://www.unidata.ucar.edu/software/ldm>.

This version fixes a bug in pqact(1). The bug manifests itself if
pqact(1) is explicitly given the pathname of its configuration-file as
an argument and then sent a SIGHUP (such as by "ldmadmin pqactHUP", for
example) in order to make it re-read its configuration file. The bug
causes the pqact(1) process to not find the configuration-file and then
error-exit.

The complete change-log is attached.

Regards,
Steve Emmerson
6.9.6   2011-01-25
        pqact(1):
            Now converts a relative specification of its configuration-file to
            an absolute one so that the file can be (re)read even if the
            current working directory changes (which is the default in LDM
            6.9).

        ldmd(1):
            Add check for empty product-identifier patterns in the LDM
            configuration-file. ldmd(1) will now emit a good error message and
            error-exit if it encounters one.

6.9.5   2011-01-20
        Installation:
            Correct determination by the configure(1) script of the pathname
            of the LDM log file for setting in the configuration-file of the
            system logging daemon.

6.9.4   2011-01-10
        Installation:
            Correct the configure(1) script's adjusting of the "sysconfdir" and
            "localstatedir" variables in order to get the "--syscondir=" and
            "--localstatedir=" options working.

            Correct a bug in the makefile rule that adds the LDM to the list
            of facilities that don't log to any system log files.
            
            Generalize the makefile rule that ensures the LDM doesn't log to
            any system log files.

6.9.3   2011-01-04
        Installation:
            Correct a bug in the configure(1) script's test for the c89(1) or
            c99(1) compiler that prevents building with support for large files
            on 32-bit systems.

            Generalize the makefile rule that adds the LDM to the list of
            facilities that don't log to the system log file.

        ldmadmin(1):
            Modify "newlog" command so that it no longer prevents other
            ldmadmin(1) scripts from executing simultaneously.

        pqact(1):
            Add the SIGXFSZ (file size limit exceeded) signal to the set of
            ignored signals in order to prevent the FILE action from crashing a
            running LDM system if the output file gets too big.

        Documentation:
             Remove "bin/" prefix from crontab(1) entry examples. It's
             unnecessary because the entries' "bash -l" beginning should obtain
             the correct LDM user's PATH environment variable.

6.9.2   2010-12-30
        Improve HTML documentation:
            Correct crontab(1) example for "ldmadmin check".

6.9.1   2010-12-29
        Enhance installation:
            Modify configure(1) script so that it attempts to build in as large
            a programming environment as possible (as it did in versions 6.2
            through 6.8) in order to support product-queues larger than 2^31
            bytes. The configure option "--disable-max-size" disables this
            feature.

        Modify ldmadmin(1):
            * Correct ldmadmin(1) lock-file locking (IMPORTANT!).
            * Improve queue-deletion logic.

        Improve pqcreate(1):
            Check for overflow of size specification due to suffix ("M", "G",
            etc.).

        Document wasReceived(1):
            Add printing of usage message; create man(1)-page; and add to list
            of programs in HTML documentation.

6.9.0   2010-12-23
        SUMMARY: Dragged the kicking and screaming LDM package into the late
            20th century.  :-)

        Installation:
            Upgraded the package-installation mechanism from one based on
            autoconf(1) and ad-hoc makefiles to one based on automake(1).  THIS
            IS A BIG DEAL WITH RAMIFICATIONS: BOTH THE INSTALLATION PROCEDURE
            AND LAYOUT ARE DIFFERENT.  FORGET EVERYTHING YOU KNOW ABOUT
            INSTALLING THE LDM AND FOLLOW THE NEW WEB-PAGE INSTRUCTIONS.

            Incorporated documentation into the package.

        Registry:
            Created a registry for the LDM similar to the Windows registry,
            Gnome's GCONF, and Java's preferences.  The registry can be
            accessed both from scripts and programatically.  A new utility,
            regutil(1), can access the registry from the command-line.
            
            The registry is implemented as an XML file (etc/registry.xml) -- so
            it can be manually edited if no other process is writing to it.

            As a consequence of the creation and use of the registry, the
            following environment variables no longer work:
                LDMHOSTNAME
                LDMPQFNAME

        Portability:
            Added checks for netstat(1) and top(1) to configure(1) script and
            appropriately modified ldmadmin(1).  Among other things, this
            ported the "ldmadmin printmetrics" command to Mac OS X (note,
            however, that a bug in Mac OS X prevents the LDM from working
            reliably on that system).

        ldmadmin(1):
            Added "vetqueuesize" command to reconcile the maximum latency
            parameter with the observed minimum virtual residence time of the
            queue. THIS IS A BIG DEAL BECAUSE IT MEANS THE LDM SYSTEM CAN NOW
            *AUTOMATICALLY* RECREATE THE PRODUCT-QUEUE -- ADJUSTING ITS SIZE AS
            NECESSARY -- TO PREVENT DUPLICATE PRODUCTS FROM BEING TRANSMITTED.
            See the web-page on configuring the LDM for details.

            Added "check" command to check the LDM system via crontab(1). This
            command will adjust the size of the product-queue if necessary
            and configured to do so.

            Made decoding of invocation-arguments command-specific so that
            the "-f" option could be used in both the "mkqueue" and "watch"
            commands.

            Improved support for concurrent ldmadmin(1) processes: replaced
            test for lock-file existence with non-blocking call to flock().

            Modified "clean" command so that it no longer emits a warning and
            error exits if the LDM server pid-file (~/ldmd.pid) doesn't exist.

            Modified "log" command so that it uses the PAGER environment
            variable instead of more(1).

            Made "usage" the default command.

            Cleaned-up "usage" message.

            Enhanced output of "config" command.

            Improved some error-messages.

        LDM server (ldmd(1)):
            Renamed the LDM server from "rpc.ldmd" to just "ldmd".
            APPROPRIATELY ADJUST ANYTHING YOU HAVE THAT DEPENDS ON THIS NAME.

            Added logging to some failed pq_close() calls in an attempt to
            debug the Mac OS X 10.5 fcntl() problem.

        regutil(1):
            New utility for accessing the LDM registry from the command-line.

        pqmon(1):
            Added "-S" option to print various "size" parameters to the 
            standard output stream.

        pqutil(1):
            Added "-C" option to clear the minimum virtual residence time
            metric.

        ulogger(1):
            Made the LDM logging facility (default: LOG_LOCAL0) the default
            facility for the "-p" option.

        pqsend(1):
            Modified to use LDM-6 protocol and added option to decouple its
            total time-out and time-offset parameters.

            Improved filtering of sent data-products.  If the downstream LDM
            replied to the HIYA with a RECLASS response, then the offered
            product-class specification was replaced with the one in the reply.
            This would prevent the originating site from restricting the class
            of products sent to the LDM. Now, the product-class specification
            in the RECLASS response from the LDM is used in series with the
            originating site's specification: products must now pass both
            filters.

        ldmsend(1):
            Modified to ensure that it can send a zero-length file on any
            system.

            Improved filtering of sent data-products.  If the downstream LDM
            replied to the HIYA with a RECLASS response, then the offered
            product-class specification was replaced with the one in the reply.
            This would prevent the originating site from restricting the class
            of products sent to the LDM. Now, the product-class specification
            in the RECLASS response from the LDM is used in series with the
            originating site's specification: products must now pass both
            filters.

        pq(3) library:
            Corrected ability to build without mmap(2) support via the NO_MMAP
            C macro.

            Added the ability to track the minimum virtual residence time.

            Added logging of data-product metadata when the associated
            data-product is deleted from the product-queue and it was created
            in the future.

        plotMetrics(1):
            Added test for non-existent data-files.

        Misc:
            Corrected pat_clone() if the source is the trivial pattern ".*".

            Upgraded the version-control mechanism from CVS to git(1).

            Corrected FNEXRAD webpages: removed "floater" link and corrected 
            "how to" link.

            Replaced defunct hyperlinks to list of WMO headers with hyperlink
            to WMO Tables from Manual 386.

            Added (undocumented) wasReceived(1) script.

            Added "config.h" to installed headers.

6.8.1   2009-08-14
        Installation:
            Improved configure(1) script:
                Added checks for ar(1), rpcgen(1), netstat(1), ntpdate(8),
                and version 5 of perl(1).

                Documented more significant environment variables listed
                by "configure --help".

            Replaced use of $(INSTALL) in makefiles with cp(1) because
            that was always the value of the macro.

        ldmadmin(1):
            Improved responsiveness by changing default ntpdate(1)
            timeout from 20 seconds to 5.

            Improved printmetrics":
                Fixed bug that caused the command on some systems to
                terminate prematurely due to a close() error.

                Set default values for product-queue metrics to -1
                (missing).

                Ported command to more environments.

                Modified command to honor value of variable $pq_path.

        Added internal documentation to file pqact/state.c.

6.8.0   2009-07-31
        Installation:
            The ldmadmin(1) configuration-file is copied, read, and
            rewritten with additional user-configurable parameters.

        LDM Server (rpc.ldmd):
            Improved vetting (i.e., access-checking) of a client to
            prevent delays due to a time-out on the reverse DNS lookup,
            which is used to convert the client IP address into a
            hostname:
                Moved vetting from the LDM server before fork(2)ing a
                child process to the fork(2)ed child process.

                Made vetting a two-phase procedure: first with the
                client IP address and then, if and only if that fails,
                with the client hostname.

            Added the new option "-M max_clients" (default: 256).

        ldmadmin(1):
            Program:
                Added the ability to check the accuracy of the system
                clock.  This new ability is highly user-configurable.
                The defaults are to check the clock but not to abort if
                it's off by too much.

                Added removal of product-information (~/.*.info) files
                to the "delqueue" command if "$deleteInfoFiles" is true
                in the ldmadmin(1) configuration-file.

                Added the new option "-M max_clients".

                Added the new commands "printmetrics", "addmetrics", and
                "plotmetrics".

                Moved variables "$os" and "$release" to the
                configuration-file.

                Added the error message "Uknown command: ".

                Removed printing of "ldmadmin" from "ldmadmin usage" output.

            Configuration-file (ldmadmin-pl.conf):
                Improved internal documentation and layout.

                Added many new variables.

            Manual-Page:
                Documented LDM configuration-file argument.

                Added "-C" and "-x" options.

                Rearranged options alphabetically.

        scour(1):
            Added the prefix "scour: " to log messages.

        scripts/plotMetrics:
            Created this script for plotting the accumulated output of
            "ldmadmin addmetrics".

6.7.1   (was 6.7.1.1) 2009-06-19
        Installation:
            Modified the rule for making the RPC library so that it
            always adds the object modules because they weren't always
            added to the LDM library on a very fast Linux
            2.6.26.6-79.fc9.x86_64 system.

            Added printing of system logging daemon PID file to
            configure(1) script output.

            Improved configure(1) help message.

        ldmadmin(1):
            Modified "ldmadmin pqactHUP".  In general, it now restricts
            its search for pqact(1) processes to those owned by the
            user.  This should only affect sites running multiple
            pqact(1)-using LDMs on the same host.

        rpc.ldmd(1) (LDM server):
            Improved handling of "EXEC pqact..." entries in the LDM
            configuration-file that have trailing whitespace by the
            ldmadmin(1) script.

            Improved ldmd(1) manual-page.

        Downstream LDM:
            Fixed bug in downstream-LDM code when it receives a
            data-product that is larger than the largest data-product
            that the product-queue can hold.  Before, the downstream-LDM
            process would terminate; now it emits an error-level log
            message and continues.  (Thanks AWC).

        pqact(1):
            Fixed a bug in pqact(1) that caused it to receive a
            segmentation fault (SIGSEGV) when an action-entry matched
            the dummy "_BEGIN_" data-product.  Thanks Chuck.

            Promoted "timed-out" message from pqact(1) PIPE action from
            WARN to ERROR.

        pqinsert(1):
            Added "-i" option to synopsis section of pqinsert(1)
            man(1)-page.

        Misc:
            Modified manual-pages to automatically indicate the time of
            last modification and put options in alphabetical order.

6.7.0   (was 6.7.0.7) 2008-10-09
        Installation:
            Added rpcgen(1) output to distribution (e.g., ldm6_clnt.c,
            ldm_xdr.c) and removed unconditional use of rpcgen(1) from
            makefiles.  This was done because rpcgen(1) on a Mac OS/X
            10.5.1 (Darwin 9.1.1) system generates output that's
            incompatible with the "rpc" subpackage.

            Slightly modified the configure(1) script to work around
            non-standard tr(1) utilities.

            Added the typedef "prod_class_t" to the header-file "ldm.h"
            and changed all code and documentation to use it instead of
            the typedef "prod_class".  This was done to allow "ldm.h" to
            be processed by a C++ compiler.  The typedef "prod_class"
            still exists for backward compatibility -- though it is no
            longer used in the code.  Both C and C++ programmers should
            now use "prod_class_t" instead of "prod_class".

            Added "typedef" for "rpc_inline_t" to "rpc/types.h" to
            support output of rpcgen(1) on SunOS 5.11 systems.

            Ported to Fedora 8.  The log file of the system log daemon
            is "/var/run/rsyslogd.pid".

            Ported to Darwin 9: corrected misdefinition of OPEN_MAX as
            10240 by ensuring that the XOPEN_SOURCE and
            XOPEN_SOURCE_EXTENDED macros are defined on that platform.

        Feedtypes:
            Changed the primary name of the FT27 feedtype from "NNEXRAD"
            to "NEXRAD3" to accomodate such data regardless of source.
            "NNEXRAD" is an understood alias for that feedtype.

        ldmadmin(1):
            Added checking of LDM configuration-file syntax to "start"
            command.

            Modified the "pqactcheck" command.  By default, it now
            checks the syntax of every pqact(1) configuration-file that
            is associated with an EXEC entry for pqact(1) in the LDM
            configuration-file.  LDM configuration-file entries like
            "EXEC pqact -f CONDUIT" (i.e., with options but with no
            explicit configuration-file) are correctly handled.

            Changed the default size of the product-queue from 400
            megabytes to 500 megabytes.

            Changed setting of PATH environment variable in ldmadmin(1)
            script to use $bin_path and $PATH only.

            Added initialization of local variables to functions in the
            ldmadmin(1) script to accomodate Perl interpreters that no
            longer perform default initialization.

        rpc.ldmd(1) (LDM server): 
            Adapted parsing of timestamps in .*.info files to Darwin 9.1.1: 
            replaced use of strptime() with sscanf() (strptime() conversion
            specification must be separated by non-alphanumeric characters).

        pqact(1):
            Made each decoder its own process-group leader.  This should
            improve the performance of decoders like GEMPAK's
            dcgrib2(1).

            Added "-metadata" and "-nodata" options to the PIPE action
            of pqact(1).

            Changed behavior if a corrupt state-file is read.  Before,
            the process would exit.  Now, it continues with the most
            recent data-product (same as if the state-file didn't
            exist).

            Adapted pqsurf(1) to handle multiple BOYC reports in
            composite SHIP bulletins.

            Added code to the parser of feedtype expressions to prevent
            an infinite loop upon encountering two consecutive UNION (|)
            operators.

        pq(3):
            Removed retry attempt from write-locking fcntl() call in
            file "pq/pq.c" because only fatal signals could occur.

        Misc:
            Improved some log messages.

            Slightly improved rtstats(1) man-page.

6.6.5   (was 6.6.5.11)  2007-06-19
        Corrected the "pqact" utility's determination of the month
        associated with a data-product from the creation-time of the
        data-product and the day-of-the-month field in the
        product-identifier.  This modification is tested extensively by
        executing the command "make check" in the pqact/ subdirectory.

        Removed extraneous carriage returns from file
        pqact/wmo_header.c.

6.6.4   (was 6.6.4.2)   2007-05-17
        Modified the function surf_split() in the "pqsurf" program so
        that it uses a dynamically allocated buffer instead of a
        statically allocated one.  This means that "pqsurf" can now
        handle arbitrarily large composite bulletins.

        Fixed (for the last time!) the "pqact" utility's determination
        of the month associated with a data-product from the
        creation-time of the data-product and the day-of-the-month field
        in the product-identifier.

        Changed the behavior of a downstream LDM upon reception of a
        COMINGSOON message whose data-product has zero length.  Before,
        this would cause the downstream LDM to exit; now the
        data-product is simply rejected.  Both LDM-6 and LDM-5 code were
        modified.

        Improved the performance of the "scour" utility.

        Added a call to exitIfDone() after the call to pq_sequence() in
        file "up6.c".

6.6.3   (was 6.6.3.1)   2007-04-06
        Corrected command that removes old ".*.info" files from the LDM
        user's home-directory in the "ldmadmin" script.  The "-prune"
        option wasn't preventing the "find" process from descending into
        subdirectories.

        Modified algorithm that determines when an upstream LDM should
        flush the connection to its downstream LDM.  The modification of
        the algorithm introduced in version 6.6.1 appears to not flush
        the connection often enough --- resulting in bursts of data
        which can cause problems (e.g., the ORPG apparently has problems
        keeping up with bursts of NEXRAD Level II data).  The modified
        algorithm will flush the connection the first time the end of
        the queue is hit and every 30 seconds thereafter if no relevant
        data is added to the queue.

6.6.2   (was 6.6.2.2)   2007-03-22
        Corrected (again) the "pqact" utility's determination of the
        month associated with a data-product from the creation-time of
        the data-product and the day-of-the-month field in the
        product-identifier.  This is the primary reason for this
        release.

        Added "-prune" option to execution of "find" in "ldmadmin" when
        removing old ".*.info" files from the LDM user's home directory.

        Corrected the logic behind an upstream LDM sending something (at
        least a NULLPROC) every 30 seconds.

6.6.1   (was 6.6.1.0) 2007-03-13
        Demoted the "Exiting" message from "rpc.ldmd" from log-level
        NOTE to log-level INFO unless it's in response to a TERM signal
        (such as by "ldmadmin stop").

        Modified the "flushing" algorithm of an upstream LDM.  It used
        to flush the connection more often than every 30 seconds; now it
        flushes the connection no more often than every 30 seconds.

6.6.0   2007-03-07
        Added a persistent-state file for a downstream LDM.  This file
        saves the metadata of the last, successfully-received
        data-product so that the next downstream LDM process that
        requests the same data from the same source can start where the
        previous process stopped.  The files reside in the LDM user's
        home-directory and have the pattern ".*.info".  This increases
        the startup performance of a downstream LDM and will greatly
        benefit LDM's with many REQUEST entries.

        Changed format of distribution file from ".tar.Z" to ".tar.gz"
        because the "compress" utility is not available on my
        development workstation (due to IP restrictions) and the (now
        necessary) "gunzip" utility appears to be ubiquitous.

        Corrected the "pqact" utility's determination of the month
        associated with a data-product from the creation-time of
        the data-product and the day-of-the-month field in the
        product-identifier.

6.5.1   (was 6.5.1.5) 2007-02-23
        Improved LDM performance:
            Of downstream process during startup by changing product-queue
            access-mode from writing to readonly when searching backwards
            for matching product to avoid file write-locking contention.

            Of upstream process during termination by
                Adding potential termination point to each data-product
                during initial backward search of the product-queue.

                Closing downstream connection upon receipt of SIGTERM.

            Of downstream process during termination by closing downstream
            connection upon receipt of SIGTERM.

        Modified the "pqact" utility:
            Corrected behavior of the "-overwrite" option of the FILE
            and STDIOFILE actions.

            Ensured proper behavior of the "-log" option of the FILE
            and STDIOFILE actions regardless of operating-system.

6.5.0   (was 6.5.0.4)
        Modified top-level LDM server:
            1.  Replaced sending of SIGINT to process-group with sending
                of SIGTERM because that allows for a cleaner shutdown of
                pqact(1) processes.  This *shouldn't* affect decoders
                because they've always been required to terminate upon
                reception of either a SIGTERM or SIGINT.  You might
                check your decoders, however.

            2.  Added the ability for the configuration-file to have
                "include" statements.

        Made all LDM programs safer in the face of asynchronous
        termination signals (SIGTERM) by eliminating calls to unsafe
        functions by signal handlers and correcting responses to
        SIGTERM.  The LDM server and its child processes will now
        respond synchronously to a SIGTERM rather than in an unsafe,
        asynchronous manner.  This makes termination of a running LDM
        system take longer (have patience), but greatly reduces the risk
        of mysterious crashes.

        Modified pqact(1) utility:
            1.  Added saving of the insertion-time of the last
                successfully-processed data-product in a file
                whose pathname is that of the configuration-file
                with ".state" appended.  This allows the pqact(1)
                process in a subsequent LDM session that uses the same
                configuration-file to start processing where the previous
                one left-off (it logs this fact).

                This means that one pqact(1) process, at most, should
                execute any pqact(1) configuration-file.

            2.  Added "-log" option to FILE and STDIOFILE actions.
                This option will cause the pathname and product-
                identifier to be logged at the NOTICE level.

            3.  Added logging of warning message when the oldest product
                in the product-queue is processed.

            4.  Modified error-message logged with a child process
                terminates.  If the child process was stated via an EXEC
                entry in the LDM configuration-file, then the command-line
                is appended to the error-message to identify the entry.

            5.  Added printing of the command-line of decoders that do not
                read from standard input quickly enough to log message.
                This should ease the identification of slow decoders.

            6.  Increased the number of arguments in a PIPE command from
                15 to _POSIX_ARG_MAX/2 (2048).

            7.  Modified algorithm for determining the canonical time of
                a WMO data-product from the day-of-month component in the
                product-identifier.  It now assigns the data-product to
                the previous month if and only if the canonical time of
                the data-product is one or more days in the future (as
                determined by the creation-time of the data-product and
                the day-of-month component in the product-identifier).
                This should eliminate the problem of old, retransmitted
                WMO data-products being assigned to a future time.

        Added "-i" option to pqinsert(1).  This option causes the MD5
        signature to be computed from the product-identifier rather than
        from the product's data.  This will greatly increase the rate
        at which large data-products can be inserted but requires that
        the product-identifier be unique.

        Modified behavior of product-queue module:
            Modified pq_setCursorFromSignature(3) in file "pq/pq.c".
            It used to find the data-product with the given signature
            by searching forward in the time-map from just before the
            creation-time of the target data-product until it either
            found a time-map entry whose signature matched or until
            the data-products appeared to come from the same source but
            were created one minute later.  Now it searches forward in
            the time-map from the same starting point until it finds
            an entry whose offset to the data region equals that of
            the signature-map entry.  If no entry is found, then a
            second search is made starting from the beginning of the
            product-queue up to the starting point of the first search.
            This second search is much more time-consuming but will find
            data-products whose creation-time is, otherwise, too far in
            the future (relative to the local system clock).  This should
            fix Art Person's problem of not finding the "signature"
            data-product during a reconnection by a downstream LDM
            (JIG-686458).

            Added warning-level log message to pq_insert(3) about
            data-products that are created sufficiently far in the
            future (see the previous paragraph) to cause problems during
            reconnection.  Only one such message will be logged per hour
            per ingest host.  In this day and age, any computer that's
            connected to the Internet can easily have an accurate system
            clock -- and that's been an explicit requirement for proper
            operation of the LDM from the beginning.

        Fixed bug in upstream LDM that could cause it to skip over
        data-products.  The bug was due to the way an upstream LDM
        processed a request with an encoded signature.  The LDM would
        adjust the "from" time of the request to the insertion time of
        the associated product, if found.  Under sufficient latency
        conditions, the insertion time would be after the creation-
        time of the next products that should be sent and the products
        would be filtered-out.  The correction involves removing the
        adjustment but still setting the product-queue cursor based on
        the signature product.

        Improved downstream LDM.  Removed from a reconnection attempt
        the setting of the metadata of the last successfully-received
        data-product from a search of the product-queue if the number of
        downstream LDM was two or more.  This was mistakenly introduced
        in version 6.4.5.

        Modified "log_log(3)" and "err_log(3)" so that they print error-
        messages using a "%s" format instead of passing them directly to
        ulog(3) because the messages might contain formatting characters
        (e.g., "%" from, for example, a product-identifier).  This will
        prevent upstream and downsteam LDM-s from crashing when printing
        a product-identifier that contains a "%".  (Thanks Harry.)

6.4.6   (was 6.4.6.5)   2006-10-19
        Improved error-message from readtcp() in the svc_tcp module
        when a select() on the socket times-out.

        Modified ldmadmin(1) script to allow a zero argument to the
        offset option (-o).

        Corrected behavior of the "-overwrite" option in pqact(1)'s FILE
        and STDIOFILE actions.  Before, data-products would always be
        appended unless the file was closed -- either explicitly via the
        "close" option or implicitly (and unpredictably) if pqact(1) ran
        out of file descriptors.  Now, both those actions always start
        writing from the beginning of the file.

        Corrected "-P port" option for ldmsend(1).  The option affected
        an LDM 6 connection but not an LDM 5 connection.  Now it does.

        Renamed the type "error_t" to "ErrorObj" to avoid a legitimate 
        name-conflict with system headers.

        Modified pq_del_oldest(3)) function so that it releases the data
        region if the signature isn't found in the signature-list.  This
        should have little, practical effect because the result of not
        finding the signature entry is, ultimately, to terminate the
        downstream LDM (once the queue is corrupt, it's a little late to
        ensure consistency -- still, the code is better).

        Modified vulog(3) function.  Because it calls functions that are
        unsafe in the presence of asynchronous signals (e.g., SIGCHLD),
        it now blocks most signals during its execution.  This should 
        prevent a SIGSEGV from occuring when inside the strftime(3) 
        function when a SIGCHLD is received.

        Changed error-message "Terminating due to LDM failure..." to 
        "Disconnecting due to LDM failure..." to improve accuracy.

        Moved initialization of autoshift module to accomodate incoming 
        HIYA connections that start sending data-products regardless of
        a RECLASS reply.  This solves a problem receiving data from WSI.

        Corrected ulog/log module (it only printed the first message).

        Cosmetic changes to "ulog/log" module.

        Committed previous-version changes to RPC library so that 
        they will actually appear in a distribution.

        pqexpire:
            Enabled "make tags".
            Added internal commentary to code.

        In an attempt to solve Robert Mullenax's problem of the upstream
        connection being closed for no apparent reason (see AET-991057)
        the "ulog/log" module was created to accumulate log-messages
        and some logging was added to the "rpc/svc_tcp" module.  This
        modification might have the added benefit of preventing a
        downstream LDM from receiving a SIGSEGV under very rare
        circumstances when the RPC layer closes the connection due to a
        fault (basically, svc_destroy(SVCXPRT*) was being called twice
        on the same transport).

6.4.5   (was 6.4.5.5)   2006-03-03
        Corrected behavior of downstream LDM when upstream host no
        longer is has the IP address that was used to establish the
        connection.  The downstream LDM now first verifies that
        the IP address of the upstream host has not changed when
        verifying that the upstream LDM is still alive after not
        receiving anything for 60 seconds.  This detects problems
        arising from the upstream host being assigned a different IP
        address by its Internet Service Provider upon reconnection
        to the Internet by the upstream host (e.g., the UCAR HAIPER
        airplane).  Added misc/inetutil/hostHasIpAddress() and modified
        server/requester6/is_upstream_alive() to use it.

        Rationalized forward and reverse hostname resolution:
        modified most code to use one of misc/inetutil/hostbyaddr(),
        misc/inetutil/addrbyhost(), or misc/inetutil/hostHasIpAddress.
        Added logging of excessive time-usage to those functions to
        notify user of, for example, an LDM server that's hanging trying
        to resolve an IP address into a hostname.  This is particularly
        important for LDM-s to which many rstats(1) connect.

        Modified the downstream LDM code so that it closes any
        connection to the network host database after an unsuccessful
        connection attempt.  This allows DNS updates to have an effect
        on a running downstream LDM.

        Modified when a downstream LDM process searches backwards
        through the product-queue for the most recent data-product that
        matches the product-class.  It now does it only once if it's the
        only downstream LDM process that will request the data.  This
        greatly reduces the load that a downstream LDM puts on the CPU
        when it can't connect to the upstream LDM.

        Corrected checking of saved product-information by a downstream
        LDM if the number of hosts sending the same products is two or
        more.  This should decrease the rate of transfer-mode switching.

        Changed the identifier used in ulog(3) messages: the remote
        hostname portion is no longer truncated after the first
        component of the fully-qualified hostname.  The maximum length
        of the identifier is still 32 characters.  This should make
        interpretation of log messages easier.

        Stopped ldmping(1) and pqcheck(1) from writing into log file
        when executing "ldmadmin start" and "ldmadmin stop".

        Modified rtstats(1) so that it can report more than 2^32 bytes
        of received data.

        Fixed "ldmadmin pqactHUP" for Mac OS X by adding "Darwin" to
        known operating-systems for executing ps(1) in order to find the
        pqact(1) PIDs (thanks to Dave Dempsey).

        Modified mkdirs_open() so that it doesn't error-return if the
        directory to be created exists (it might just have been created
        by another pqact(1) process).  This eliminates a race condition
        between two pqact(1) processes trying to write to the same
        output directory.

        Removed an assert(n > 0) call in pq/pq.c that was responsible
        for an upstream LDM crashing in the unlikely event that the
        first four bytes of a data-product's signature were all zero
        (2^32 to 1, against).

        Demoted "feed or notify failure; ..." message from level ERROR
        to level NOTICE because it's now expected for an autoshifting
        downstream LDM.

        Corrected test of strdup() result in parser for LDM 
        configuration-file.

        Modified pqinsert(1) so that it exits with a non-zero status if
        something went wrong inserting a file into the product-queue.

        Corrected ldmping(1).  It now correctly interprests hostnames
        that start with a digit (e.g., "600644362.tssmob.net") rather
        than assuming the hostname is an IP address in "dotted-quad"
        format.

6.4.4   (was 6.4.4.0)   2005-12-01

        Eliminated ERROR-level logging by the pqact(1) utility of
        the extraneous messages that start with "pbuf_flush (fd)
        write: Broken pipe" by returning removal of the relevant
        file-list entry to the reap() function, when appropriate.  This
        bug was introduced by the modification to pqact(1)'s logging in
        version 6.4.3.

6.4.3   (was 6.4.3.2)   2005-11-08
        Added support for 4 GB product-queues on 32-bit systems running
        Free BSD 4.

        Modfied product-queue module: it now memory-maps the entire 
        product-queue if possible and allowed based on a runtime 
        determination (rather than a configuration-time one).

        Modified pqact(1): it will now print the command-string of a
        PIPE child process (if available) when the child process is
        stopped or terminated by a signal or when the child terminates
        normally but with an error status.  The command-string won't
        be available if the child process terminates due to pqact(1)'s
        closing of the pipe.

        Modified logging module, ulog(3):
            Replaced use of vsprintf(3) with vsnprintf(3) to eliminate
            risk of buffer overflow.

            Rewrote vulog():
                Eliminated fork()ing in writing to console when regular
                logging fails because of reports of hanging, downstream
                LDM.  See 
<http://www.unidata.ucar.edu/support/help/MailArchives/ldm/msg04324.html>.

                Restructured code, removed superfluous code, and
                combined common code.

            Removed some lint(1).

        Corrected use of PATH_MAX in pqact/filel.c, which incorrectly
        assumed that the terminating NUL wasn't counted.

        Removed superfluous set_abbr_ident() from "up6" module.

        Changed URL "my.unidata.ucar.edu/content" to 
        "www.unidata.ucar.edu" wherever found.

6.4.2   (was 6.4.2.5)
    Bug Fixes:

        Downstream LDM:

            Fixed bug in "DownHelp" module that caused a downstream LDM
            5 resulting from a HIYA message to terminate normally with
            an error status when it received the first data-product.

        pqact(1):

            Fixed bug described in

                
http://www.unidata.ucar.edu/support/help/MailArchives/ldm/msg04238.html.

            by improving how pqact(1) manages its file descriptors.
            File descriptors are now reserved for stdin, stdout,
            stderr, the configuration-file, the product-queue, and
            (possibly) logging.  Stdin and stdout are redirected to
            /dev/null at startup to prevent problems with miscoded child
            programs.  Stderr is redirected to /dev/null if logging
            isn't to stderr.  Most other file descriptors are set to
            close-on-exec.

        scour(1):

            Fixed a bug in scour(1) that caused it to output extraneous
            error-messages about not being able to read (irrelevant)
            directories.  The fix involved simplifying the use of the
            find(1) command.

        feedme(1):

            Fixed program feedme(1) -- which didn't work -- by adding
            use of module xdr_data.

    Non-Bug-Fix Improvements:

        General:

            Modified module xdr_data.  Changed implementation and API to
            allow programs like feedme(1) to allocate less memory.

            Removed some lint(1).

        rpc.ldmd(1):

            Added calls to prctl() on Linux systems to allow the LDM
            program (rpc.ldmd) to dump a core-file.

            Modified LDM server to use new "xdr_data" API.

        Downstream LDM:

            Cleaned-up code for determining the acceptable class of
            products from the product-class of a HIYA message and the
            ACCEPT entries in the LDM configuration-file.

            Modified "down6" module of downstream LDM system.  Renamed
            down6_new() to down6_init() and made it callable multiple
            times.  Changed handling of uninitialized module from
            assert()ion failure to error-code return.  Modified clients
            of down6 module accordingly.

        pqact(1):

            Improved efficiency of writing to a pipe by increasing the
            size of the pipe-buffer from _POSIX_PIPE_BUF (512) bytes to
            PIPE_BUF bytes on systems that define PIPE_BUF.

            Modified message logged when it takes longer than one second
            to flush a pipe: improved wording and reduced logging-level
            from ERROR to WARNING.

6.4.1
        Installation:

            Bracketed _XOPEN_SOURCE and _XOPEN_SOURCE_EXTENDED
            in "config/ldmconfig.h" with "#ifndef" to accomodate
            compilation environments that define those macros (contrary
            to the standard).

        Downsteam LDM 6:

            Fixed bug in handling of ACCEPT connections that caused
            the downstream LDM to crash by adding initialization of
            autoshift module in response to HIYA message.

6.4.0
        rpc.ldmd:

            Server:

                Added ability to use different port than well-known LDM
                port, 388:

                    Default LDM port can be set when package is built.

                    LDM port on which server will listen can be set when
                    server is executed.

                    Upstream port to which downstream LDM connects can
                    be set in associated REQUEST entry.

            Downstream LDM 6:

                Behavior:

                    Reject every data-product that is older than
                    "max_latency" seconds -- regardless of arrival mode
                    (HEREIS or COMINGSOON/BLKDATA).

                    Added ability to encode MD5 signature of last,
                    successfully-received data-product in FEEDME
                    product-class specification when connecting to
                    upstream LDM-6.  Should prevent skipping of
                    data-products that arrive at upstream LDM-6 out of
                    temporal order.

                    Added the ability of downstream LDM to automatically
                    adjust transfer-mode of feed (primary vs. secondary)
                    based on success of inserting data-products into
                    product-queue.

                    Replaced adjustment of product-class
                    specification in FEEDME request based on last
                    successfully-received data-product with similar
                    adjustment based on most recent data-product in
                    queue that matches specification.  Allows input from
                    other downstream LDM-s.

                    Changed way data-products are accumulated when
                    received via COMINSOON and BLKDATA messages.  They
                    are now fully received before any attempt is made to
                    insert them into product-queue.

                Performance:

                    Reduced CPU utilization by about 75 percent by
                    creating new RPC library function, svc_getreqsock(3)
                    and using it.

                    Increased size of queue for connection requests
                    in LDM server from 2 to 32.  Should ameliorate
                    connection problems that occur due to large number
                    of connection attempts in short time.

            Upstream LDM 6:

                Added "upstream" filtering.  An upstream LDM can now
                filter data-products based the product-identifier and
                regular-expression in the LDM configuration-file.

        pqact(1):

            Added ability to "back reference" more than nine
            subexpressions in string-replacement section of pqact(1)
            actions.  Now, for example, string "\(12)" in that section
            references twelfth subexpression of regular-expression.

        scour(1):

            Added blank line to top of scour(1) script to allow user's
            with non-conforming shell to execute script directly.

        rtstats(1):

            Default feedtype returned to ANY from ANY-EXP.

            Pseudo-random amount of time added to reporting interval to
            prevent convergence of TCP connections.

        Logging:

            Removed "<file>@<line>" field from "error" module log
            messages unless logging-level is DEBUG.

            Log messages are now prefixed with priority-level
            (e.g., NOTE, INFO).

            Slightly modified some log messages.

        Portability:

            Replaced use of non-standard C macro EPFNOSUPPORT in rpc(3)
            subpackage with EAFNOSUPPORT and EPROTONOSUPPORT.  Necessary
            to support building under Tiger version of MAC OS X.

            Replaced use of non-standard "h_addr" member of "hostent"
            structure with use of "h_addr_list[0]" to increase
            portability.

            Added "-lxnet" to LIBS on HP-UX 11 systems when in 64-bit
            mode.

6.3.1.0
        Removed the ldmprods(1) utility from the package because it 
        uses the *.stats files produced by the (now nonexistant)
        pqbinstats(1) utility.  User's should use the rtstats(1) utility
        for reporting statistics.

        *Really* removed pqbinstats(1) directory from the distribution.

        Fixed bug in pqact(1) that prevented decoders from writing to the
        logfile specified by the "-l" option.

6.3.0           2005-03-18
        Added "-I ip_addr" option to LDM server.  This allows the
        user to specify what network interface the server should use
        and enables

            1.  Construction of director/server clusters.

            2.  Running two LDM servers on the same host simultaneously.

        Added $ip_addr variable to ldmadmin(1) configuration-file,
        ldmadmin-pl.conf, and modified ldmadmin(1) accordingly.

        Added "--enable-logging=localn" option to configure(1) script to
        support the use of a different logging facility and permit the
        running of two LDM-s simultaneously.

        Removed sending of final statistics from rtstats(1)'s cleanup
        handler to avoid hanging the program if the remote host is
        unavailable.

        Added printing of IP address to "ldmadmin config" command.

        Removed "pqbinstats" directory from distribution and eliminated
        "ldmadmin dostats" command.

        Added "-P port" option to pqing(1) manual-page.

        Added "ulogger" to GARBAGE macro in ulog/Makefile so that the
        program will be removed by a "make clean" or "make distclean".

        Corrected misspelling in ldmadmin-pl.conf.

        The standard error stream of child processes executed by
        pqact(1) PIPE actions is directed to "/dev/null" in the child
        processes if it was closed in the pqact(1) process.

6.2.1           2005-02-18
        Added "1;" to the end of the ldmadmin(1) configuration-file,
        ldmadmin-pl.conf, so that setting $log_rotate to zero wouldn't
        cause the "require" statement in ldmadmin(1) to abort.

        Added RELEASE_NOTES to the source-distribution.

        Modified LDM configuration-file parser to prevent invalid
        entries like

            REQUEST IDS/DDPLUS .* host.domain

        from being misinterpreted as requesting data-products of
        feedtype "IDS" that match the regular-expression "/DDPLUS".
        Such entries are now detected as being invalid.

        Fixed the (deprecated) command "ldmadmin dostats" by correcting
        the invocation of the "mailpqstats" utility.

        Fixed extraneous memory-freeing in rtstats(1) that caused
        SIGABRT on Linux 2.6.10 system if the receiving LDM didn't want
        the data-products.

6.2.0           2005-02-01
        Added "rpc" subpackage -- replacing use of the native RPC
        library -- to work-around a bug in the AIX 5.1 ONC RPC 4.0
        implementation, which fails when receiving large (~10 MB)
        RPC messages (i.e., most NIMAGE data wasn't being received).

        Modified product-queue (pq) module:

            Corrected bug in pq(3) module when inserting a data-product
            that has the same insertion-time as an already existing
            data-product.  The insertion-time in now incremented by
            one microsecond to ensure unique keys in the time-map
            rather than using the byte-offset of the data-product.
            Hopefully, this will eliminate the rare occurrence in which
            a data-product is missed by a product-queue reader because
            it has the same insertion-time as the previous data-product
            in the product-queue but has a smaller byte-offset.

            Corrected fClr() and fMask() macros in file "pq/fbits.h"
            so that they correctly handle the case where the "flag"
            variable is smaller than the variable in question.  This
            removes a problem creating product-queues with data-sections
            larger than (2^32)-1 bytes on systems where sizeof(size_t)
            == 8 and sizeof(unsigned) == 4.

        Made all programs that use regular-expressions convert all
        externally-specified pathological regular-expressions into
        non-pathological ones.

        Modified top-level LDM server:

            Removed latent bug that caused file-descriptor table to
            fill-up -- preventing additional connections -- if fork(2)s
            failed for a while.

            Corrected bug in LDM configuration-file parser.  The LDM
            will now log an error-message and terminate if it encounters
            an invalid feedtype expression.

        Modified downstream (i.e., receiving) LDM:

            Changed the way the "last" data-product creation-time is
            saved.  Before, the creation-time of the most recently
            received data-product was used.  Now, that time is used
            only if it is more recent than the saved time.  This
            should reduce problems caused by the sequential arrival of
            data-products with creation-times that are non-monotonic.

            Modified down6_get_last_arrival() to accomodate Gilda's
            c89(1).

            Improved error-messages when the LDM can't connect to an
            upstream LDM.

        Modified programs to reduce artificially-induced latencies:

            Modified the toClients() function in the "pqing" module so
            that the "arrival" argument is ignored and the creation-time
            of the data-product is set within the function itself.
            This should reduce the (apparent) latency on systems doing
            data-product ingestion.

            Modified the pqinsert(1) utility so that the data-product
            creation- time is set just prior to inserting the
            data-product into the product-queue.  This should reduce any
            (apparent) latency.

        Modified pqact(1).  A configuration-file with no entries is now
        logged as such rather than as having a syntax error.

        Modified rtstats(1):

            A warning-level error-message is logged if it can't connect
            to the remote LDM.

            The latency field in the data-product it creates is now
            formatted "%g" from a floating-point value.

        Modified pqcheck(1).  Added support for logging debug-level
        messages (-x option).

        Modified scour(1) utility to work-around bug in OSF1's find(1)
        utility.

        Ensured that all utilities log messages of level LOG_WARNING.

        Modified ldmadmin(1) script:

            Moved the configuration section of ldmadmin(1) into a
            separate file (etc/ldmadmin-pl.conf).  A consequence of this
            is that if the environment variable LDMHOME is not set, then
            $HOME is used.

            Removed setting of UDUNITS_PATH because it doesn't have
            anything to do with running the LDM.  User's who need this
            environment variable set in order for the gribtonc(1)
            decoder to work properly should set it in the profile-file
            of the LDM user's user-shell.

            Corrected default value of $surf_size variable.  Previous
            value of "2M" caused command "ldmadmin mksurfqueue" to hang.

            Fixed bug in ldmadmin(1) so that "ldmadmin watch -f
            'IDS|DDPLUS'" now works.

            Made "ldmadmin clean" abort if the LDM system is running.

            Corrected use of "$?".

            Corrected some error-messages.

        Added scouring of ~ldm/logs/*.stats files to example scour(1)
        configuration-file.

        Ported package to
            
                Darwin (alias Mac OS X)
                SunOS 5.10 (alias Solaris 10)

            The package has poor performance under SunOS 5.10.  Sun is 
            investigating.

        Modified configure(1) script:

            Made the script try to create an LDM system that supports
            product-queue sizes up to (2^32)-1 bytes.

            Added "--disable-max-size" option so that the user can
            ensure that the resulting LDM only supports smaller
            product-queue sizes (in order to use a previously-existing
            product-queue, for example).

            Corrected test for non-socket /dev/log.

            Now augments, rather than replaces, a user-specified
            CPPFLAGS.

        Modified makefiles:

            Modified top-level makefile to get libldm.a(ldm_version.o)
            updated when VERSION is modified.

            "make clean" no longer removes *.log files; "make distclean"
            does.

        Removed files INSTALL and INSTALL.bin from distribution
        after moving their information to file README.

        Renamed this file (HISTORY) to CHANGE_LOG.

6.1.0           2004-08-25
        Modified the product-queue module (pq):

            Made available 4 data-product slots that were, otherwise,
            unvailable.  This means that the minimum number of empty
            slots can now go to 0.

            Added a writer-counter variable to the product-queue file.
            Opening the product-queue for writing increments the on-disk
            value and closing the product-queue decrements it.  This
            allows for a fast determination of whether the product-queue
            was properly closed and, consequently, self-consistent.  As
            a consequence, the script for starting the LDM system at
            boot-time has changed significantly (see the pqcheck(1)
            utility).  Furthermore, ALL INGESTERS MUST BE RELINKED
            AGAINST THE NEW LDM LIBRARY FOR THE NEW CONSISTENCY-TEST TO
            BE RELIABLE.

            Creation of a product-queue file now fails if the requested
            size of the file (which is contained in an "off_t") is too
            large to be represented by variables of type "size_t".

        Modified the LDM server (rpc.ldmd):

            Modified setting of "from" time in downstream LDM for the
            data-product selection criteria.  Now, it will not ever
            request any products that are older than the "time offset"
            argument of the "-o" option if it was specified or the
            "maximum latency" argument of the the "-m" option (default 1
            hour) otherwise.  Before this change, a downstream LDM could
            request data-products that were much older than this if the
            upstream LDM was unavailable for a long time.

            Added a 1 second pause before an upstream LDM first starts
            sending data-products or notifications to a downstream
            LDM.  This prevents, for example, a HEREIS packet arriving
            contiguously with a FEEDME reply and works around the poor
            RPC implementations of some operating systems.

        Modified the pqact(1) utility:

            Added a work-around for the non-conformance of OSF/1
            regarding the SA_RESTART option of sigaction().  On such
            an operating-system, a write to a pipe by pqact(1) could
            be terminated by a signal (e.g., SIGCHLD) causing the
            data-product to be incompletely processed.

            Increased the maximum number of file descriptors that can
            be simultaneously open from "32" to something based on the
            output of "getconf OPEN_MAX".

            Corrected examples in configuration-file (pqact.conf).

        Modified the pqcreate(1) utility: it now interprets the
        specification of the size of the product-queue by pqcreate(1)
        differently. Previously, a "K", "M", or "G" suffix would mean
        "kibi", "mibi", or "gibi" (powers of two nearest 1e3, 1e6, or
        1e9); now it means "kilo", "mega", or "giga".  This now makes
        "4000M" equal to "4G", whereas before they were different.

        Modified the ldmadmin(1) script:

            Added the command "restart".

            Added the options "-m maxLatency" and "-o offset" to the
            "start" command (the "restart" command also has these
            options).

            Added the variable $pq_slots.  This variable sets the number
            of data-product slots in the LDM product-queue.

            Modified the interpretation of the specification of the size
            of the product-queue to be consistent with the pqcreate(1)
            modification, above.

            Greatly increased the performance of the "ldmadmin
            queuecheck" command by switching from use of pqcat(1) to use
            of pqcheck(1).

            Removed the "ps" command because there are just too many
            ps(1) implementations out there that differ from the UNIX
            standard and from each other (and the same computer can have
            incompatible versions).

            The "watch" and "queuecheck" commands now first check that
            the LDM system is running.

            Added printing of $numlogs and $log_rotate to the "ldmadmin
            config" command.

        Modified the scour(1) utility:

            Greatly improved performance -- mostly by using xargs(1).

            Removed package-specificity from examples in
            configuration-file (scour.conf).

        Modified the ulog(3) module: it no longer appends an ASCII NUL
        to messages when logging to a file.

        Changed the feedtype-string that is printed for NEXRAD Level
        II data-products from CRAFT to NEXRAD2.  The strings CRAFT,
        NEXRD2, and NEXRAD2 can all be used to specify this feedtype in
        configuration-files, however.

        Increased the maximum number of statistical-reporting bins
        in the "binstats" module (which is used by rtstats(1) and
        pqbinstats(1)) from 96 to 4000 to eliminate underreporting
        problem now that more than 96 CRAFT radars exist.

        Corrected manual pages.  Removed all references to the
        LDM 5 "Site Manager's Guide".  Replaced references
        to "http://www.unidata.ucar.edu"; with references to
        "http://www.unidata.ucar.edu/software/ldm/";

6.0.15          2004-03-31
        Added code to work-around TCP bug introduced by patch APAR
        IY38541 for the AIX operating-system.  This patch is included
        in maintenance-level 11 of AIX 4.3 and maintenance-level 5 of
        AIX 5.1.  The bug makes TCP connection non-blocking, causing
        upstream LDM to exit due to "resource temporarily unavailable".
        With this work-around, LDM6-s running on the above AIX systems
        will be able to send data-products to requesting downstream
        LDM6-s.  They will not, however, be able to satisfy requests
        by downstream LDM5-s.  Also, the same O/S upgrades introduced
        an, apparently, related bug in the TCP layer that causes the
        connection from a downstream LDM running on the upgraded O/S to
        an upstream LDM to episodically dissapear.  The upstream LDM
        reports a "broken pipe" and the downstream LDM reports that the
        connection to the upstream LDM "closed".  This problem will be
        reported to IBM.

        The above bug also causes a connection from a downstream LDM
        running on the upgraded AIX system to episodically close for no
        apparent reason.  Consequently, the reconnection strategy of a
        downstream LDM-6 has been modified to be more aggressive (i.e.,
        to try to reconnect earlier) but with an exponential backoff to
        the default maximum of 30 seconds.

6.0.14          2003-07-21

6.0.14.7
        Made test of pqact(1) configuration-file upon LDM startup 
        conditional upon its existance.

6.0.14.6
        Fixed bug in downstream LDM 6 introduced in version 6.0.4: under
        some circumstances, a failed FEEDME or NOTIFY request wouldn't
        cause the connection to be closed and, consequently, the socket
        and client-handle resources to be released -- leading to a
        blocked, upstream LDM process with a read-lock on a product.

        Fixed latent bug in module "up6".  Too few arguments passed to 
        udebug(3) when a product-queue lock is encountered.

6.0.14.5
        Fixed error-reporting bug.  Receiving LDM-s will no longer
        attempt to unregister from the portmapper -- eliminating the
        possibility of disconcerting (but harmless) "pmap_unset()"
        failure messages.

        Modified the LDM so that a SIGUSR1 causes the pseudo-random 
        number generator in the product-queue module to be reset.

        Improved robustness of the rtstats(1) utility in the face of bad
        clock times (e.g., CRAFT data).  This should prevent rtstats(1)
        from opening multiple connections in the same minute.  THIS IS A
        BIG DEAL.

6.0.14.4
        Ported package to HP-UX B.11.11 U.

        Changed the effect of a SIGTERM to the top-level LDM process: it
        now sends a SIGINT to all child processes in order to exit in a
        more timely manner.

        Eliminated use of the word "class" as a variable name to
        accomodate C++.

        Modified LDM 6 product-sending code so that it checks the
        connection if it hasn't sent anything for 30 seconds.  This
        should help prevent the buildup of upstream processes.

        Added a check of the syntactic validity of the pqact(1)
        configuration-file to the "ldmadmin start" command to help the
        user who changes the configuration-file without checking it.

6.0.14.3
        Partially ported package to HP-UX B.11.11 U.

        Added observance of "done" flag to module ldm_clnt -- resulting
        in more responsive termination of an LDM system that is
        attempting to connect to an upstream LDM.  Modified module acl
        accordingly.

6.0.14.2
        Made the IS_ALIVE check on the upstream LDM more tolerant of 
        connection failures.  This should reduce the number of
        unnecessary reconnections.

        Improved error-logging of LDM 6 connection attempts.  If an
        attempt fails, a error-message will be logged at the ERROR
        level.  The reason or reasons behind the failures of the port
        388 and portmapper attempts are logged at the INFO level.

6.0.14.1
        Fixed memory-leak in receiving LDM process.  When receiving from
        a sending LDM 6, the memory-usage of the receiving process
        would sometimes jump by about 250 kilobytes if the connection
        was broken and then re-established.

6.0.13
        Fixed a small memory-leak bug in the utility rtstats(1).  If the
        destination LDM was version 5, then it would leak about 37 bytes
        per transmission.

        Modified the file-existance tests in ldmadmin script so that
        they will work on systems (e.g., Linux) that would, otherwise,
        require a perl utility with compiled-in support for large-files.

6.0.12
        Modified strategy for determining which program version is
        used when connecting to an upstream LDM (version 5 or 6): a
        downstream LDM will now connect using version 5 if and only
        if a previous version 6 connection attempt receives a program
        version mismatch indication (RPC_PROGVERSMISMATCH).  This should
        eliminate the possibility of a downstream LDM-6 connecting to
        an upstream LDM-6 using LDM-5 protocols during the "window of
        vulnerability" that exists when the upstream LDM system is
        started.

        Changed downstream LDM code so that it doesn't sleep before
        reconnecting to the upstream LDM when the connection is closed
        due to a timeout.  This will reduce the magnitude of product
        latencies due to connection timeouts at the cost of more log
        messages.

        Synchronous checks have been added in several places to make the
        LDM more responsive to a termination request (such as from an
        "ldmadmin stop").

        To work around a bug in Unisys ingest systems, the program
        pqing(1) has been modified to allow an extraneous newline
        between the end-of-product and beginning-of-product delimiters.

6.0.11
        Requesting LDM process will no longer terminate if the
        connection to the upstream host is so bad that it can't connect
        in any fashion or if an LDM isn't running on that host.
        Instead, it will continue to retry.

6.0.10
        Corrected bug in make_request() in module requester that caused
        "wanted" and "allowed" product-class specifications in diagnostic 
        RECLASS message to be the same.

        Corrected bug in feed_or_notify() in module ldm6_server that caused
        "wanted" and "allowed" product-class specifications in diagnostic
        "Restricting request" message to be the same.

        Demoted logging-level of rtstats(1) "couldn't connect" message from
        ERR_FAILURE, to ERR_WARNING to lessen user anxiety.

6.0.9
        Corrected bug in make_request() that caused assertion failure in
        xdr_timestampt() because the timestamp was part of the RECLASS
        reply and the product-class of the reply had been XDR freed
        (setting its timstamps to TV_NONE).

6.0.8
        Replaced premature return from ldm_clnt_create_vers() use of
        NULLPROC for RPC error-code not being a program version 
        mismatch to being a time-out.

6.0.7
        Fixed SIGSEGV bug in ldm_clnttcp_create_vers() and improved 
        error messages.

6.0.6
        Reimplemented ldm_clnt() to solve rtstats(1) connection problem.

6.0.5
        Fixed slight memory-leak bug in rtstats(1) and ldmsend(1).

6.0.4
        Corrected use of hereis_6() and comingsoon_6() by programs
        rtstats(1) and ldmsend(1).  They should now be able to send to
        an LDM 6.

6.0.3
        Improved diagnostic messages in which_version().

        Made "ldmadmin pqactcheck" return a failure exit-status if the
        configuration file contains a syntax error.

        Generalized receiving LDM: now accepts multiple BLKDATA messages
        for a product.

        A downstream LDM no longer adjusts the time-interval of acceptible
        data products when replying to a HIYA.  Duplicate product detection
        is still in effect.  This prevents rejection of data products sent
        using ldmsend(1) by a host with an inaccurate clock.  It also
        places the burden of knowing what to send on the upstream HIYA-
        initiating LDM.

        Fixed bug that prevented the maximum hereis size field of ACCEPT
        entries in the LDM configuration-file from having an effect.

        Ported the ldmsend(1) and rtstats(1) utilities to LDM-6
        protocols: they can now send to a version 6 LDM.

        Added HTML documentation as a separate distribution.

6.0.2
        Restored use of "done" flag and removed atexit() registration of
        down6_destroy().
        
        Removed child-process-termination loop from ldmd.c in attempt to
        keep product-queue consistent (pqcat -s).

        Eliminated excessive delay caused by portmapper-access functions on
        a FreeBSD system than isn't running a portmapper.

        Fixed bug due to copying HEREIS product identifier to garbage 
        pointer in down6 module.

6.0.1
        Ensured release of COMINGSOON_6-reserved space in product-queue
        upon normal termination by modifying down6 module: 1) made
        down6_destroy() idempotent; and 2) registered down6_destroy()
        with atexit().  Hopefully, this will fix the "pqcat -s" failures.

6.0
        Changed default CFLAGS from "-g" to "-O".

        Reworked build procedure.  No more Makefile.in-s.

        Added commentary about pathological regular expressions to template
        "ldmd.conf" file.

        Added sync(1) invocation to "ldmadmin stop".

        Regularized compiler-command word-order.

        Made module child_process_set a singleton and made free(3)ing of
        pid_t element more robust (it might have been causing a SIGSEGV
        under Linux).

        Have duplicate products update the most-recent-product time 
        of a connection in both LDM-6 and LDM-5 receivers.

6.0.0.18
        Fixed incorporation of regex/ subdirectory into build
        procedure.

6.0.0.17
        Added regex(1) utility.

        Rearranged blocked-signals reversion steps in pq::ctl_get() to
        maintain invariants.

        Changed RPC timeout from default 25 s to 60 s.

6.0.0.16
        Added warning message if flushing NULLPROC-6 fails in "up6"
        module.

6.0.0.15
        Added "tags" target to pq/Makefile.in.

        Replaced 7 d timeout of non-batched (i.e., blocking) LDM-6
        RPC messages with default, 25 s timeout to avoid situation in
        which a sending LDM is trying to read the reply of a flushing
        NULLPROC call and the receiving LDM is in select() waiting for
        an incoming RPC message.  This "netlock" situation was seen on
        2003-02-7 between two sending LDMs on Jackie and two receiving
        LDMs on Thelma for the IDS|DDPLUS and NNEXRAD feeds.  (Bad RPC!
        No doughnut!)

6.0.0.14
        Ported to OSF/1.

        Added an additional criterium to the function
        is_upstream_alive() for assuming that the sending LDM is still
        alive: if the client-side handle can't be created due to a
        time-out of the connection attempt (RPC error == RPC_SYSTEMERROR
        && system error == ETIMEDOUT).

6.0.0.13
        Simplified xdr_data module and its use based on assumption of
        valid client-usage.  It was this or find every error-condition
        where xd_free() or xd_unset_buf() wouldn't be invoked.

        Corrected use of xdr_data module.

6.0.0.12
        Corrected use of "xdr_data" module.

        Problem.

6.0.0.11
        Increased use of "xdr_data" module:
            Modified modules "down6" and "svc5" to use "xdr_data" module
            for COMINGSOON/BLKDATA messages.

            Modified file "ldm.x": replaced generation of xdr_dbuf() by
            rpcgen(1) with explicit definition that uses the "xdr_data"
            module.

        Problem.

6.0.0.10
        Added module "xdr_data" and modified xdr_product() to use it.

6.0.0.9
        Made SIGTERM handling the same as SIGINT.

6.0.0.8
        Made updating of timestamp of most recently received HEREIS
        product by LDM-5 subsystem not depend on whether logging level
        is verbose.

6.0.0.7
        Tried to reduce backward searches through product queue when 
        connecting to upstream LDM:

            Added tracking of last-received product to both LDM-5 and
            LDM-6 receiving subsystems and the use of this information
            when requesting data from an upstream LDM.

            Moved backward search through product queue, looking for
            most recent matching product -- from inside connection-loop
            of acl::prog_requester() to before connection-loop.

        Added dummy feedTime module and invocations.

        Changed connection strategy to favor port LDM_PORT over the
        portmapper.

        Corrected ldmsend(1) and LDM-6 HIYA behavior.

6.0.0.6
        Removed indictment of upstream LDM from LDM-6 ECONNRESET error-message.

        Added debug-printing of time from product-creation to insertion
        into the product-queue to pq_sequence(...).

6.0.0.5
        Reduced logging-level of initial and final messages of upstream
        LDM.

6.0.0.4
        Added "CRAFT" and "CONDUIT" to the list of feedtypes and made
        them the default string specifications for output.

6.0.0.3
        Changed SIGTERM logging-level from udebug() to unotice()
        to reveal cause of "Terminating process group"
        messages.

6.0.0.2
        Corrected setting of _mode in down6 regarding IGNORE_BLKDATA.