<html lang='en'>
<head>
<meta content='text/html; charset=utf-8' http-equiv='Content-Type'>
<title>
GitLab
</title>
</meta>
</head>
<style>
  img {
    max-width: 100%;
    height: auto;
  }
  p.details {
    font-style:italic;
    color:#777
  }
  .footer p {
    font-size:small;
    color:#777
  }
  pre.commit-message {
    white-space: pre-wrap;
  }
  .file-stats a {
    text-decoration: none;
  }
  .file-stats .new-file {
    color: #090;
  }
  .file-stats .deleted-file {
    color: #B00;
  }
</style>
<body>
<div class='content'>
<h3>
Hal Murray pushed to branch master
at <a href="https://gitlab.com/NTPsec/ntpsec">NTPsec / ntpsec</a>
</h3>
<h4>
Commits:
</h4>
<ul>
<li>
<strong><a href="https://gitlab.com/NTPsec/ntpsec/commit/daa3a36abe9a4e087b2007a293cbbae3af18cb2c">daa3a36a</a></strong>
<div>
<span>by Hal Murray</span>
<i>at 2015-12-18T20:18:09Z</i>
</div>
<pre class='commit-message'>Nuke libisc/log and libisc/unit/time (and headers)</pre>
</li>
</ul>
<h4>8 changed files:</h4>
<ul>
<li class='file-stats'>
<a href='#diff-0'>
<span class='deleted-file'>

libisc/include/isc/log.h
</span>
</a>
</li>
<li class='file-stats'>
<a href='#diff-1'>
<span class='deleted-file'>

libisc/log.c
</span>
</a>
</li>
<li class='file-stats'>
<a href='#diff-2'>
libisc/unix/ifiter_getifaddrs.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-3'>
<span class='deleted-file'>

libisc/unix/include/isc/time.h
</span>
</a>
</li>
<li class='file-stats'>
<a href='#diff-4'>
libisc/unix/interfaceiter.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-5'>
libisc/unix/net.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-6'>
<span class='deleted-file'>

libisc/unix/time.c
</span>
</a>
</li>
<li class='file-stats'>
<a href='#diff-7'>
libisc/wscript
</a>
</li>
</ul>
<h4>Changes:</h4>
<li id='diff-0'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/daa3a36abe9a4e087b2007a293cbbae3af18cb2c#diff-0'>
<strong>
libisc/include/isc/log.h
</strong>
deleted
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/libisc/include/isc/log.h
</span><span style="color: #000000;background-color: #ddffdd">+++ /dev/null
</span><span style="color: #aaaaaa">@@ -1,857 +0,0 @@
</span><span style="color: #000000;background-color: #ffdddd">-/*
- * Copyright (C) 2004-2007, 2009  Internet Systems Consortium, Inc. ("ISC")
- * Copyright (C) 1999-2002  Internet Software Consortium.
- * Copyright 2015 by the NTPsec project contributors
- * SPDX-License-Identifier: ISC
- */
-
-#ifndef GUARD_ISC_LOG_H
-#define GUARD_ISC_LOG_H 1
-
-/*! \file isc/log.h */
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <sys/types.h>
-#include <syslog.h> /* XXXDCL NT */
-
-#include <isc/formatcheck.h>
-#include <isc/lang.h>
-#include <isc/types.h>
-
-/*@{*/
-/*!
- * \brief Severity levels, patterned after Unix's syslog levels.
- *
- */
-#define ISC_LOG_DEBUG(level)   (level)
-/*!
- * #ISC_LOG_DYNAMIC can only be used for defining channels with
- * isc_log_createchannel(), not to specify a level in isc_log_write().
- */
-#define ISC_LOG_DYNAMIC                  0
-#define ISC_LOG_INFO           (-1)
-#define ISC_LOG_NOTICE         (-2)
-#define ISC_LOG_WARNING        (-3)
-#define ISC_LOG_ERROR          (-4)
-#define ISC_LOG_CRITICAL       (-5)
-/*@}*/
-
-/*@{*/
-/*!
- * \brief Destinations.
- */
-#define ISC_LOG_TONULL         1
-#define ISC_LOG_TOSYSLOG       2
-#define ISC_LOG_TOFILE         3
-#define ISC_LOG_TOFILEDESC     4
-/*@}*/
-
-/*@{*/
-/*%
- * Channel flags.
- */
-#define ISC_LOG_PRINTTIME      0x0001
-#define ISC_LOG_PRINTLEVEL     0x0002
-#define ISC_LOG_PRINTCATEGORY  0x0004
-#define ISC_LOG_PRINTMODULE    0x0008
-#define ISC_LOG_PRINTTAG       0x0010
-#define ISC_LOG_PRINTALL       0x001F
-#define ISC_LOG_DEBUGONLY      0x1000
-#define ISC_LOG_OPENERR                0x8000          /* internal */
-/*@}*/
-
-/*@{*/
-/*!
- * \brief Other options.
- *
- * XXXDCL INFINITE doesn't yet work.  Arguably it isn't needed, but
- *   since I am intend to make large number of versions work efficiently,
- *   INFINITE is going to be trivial to add to that.
- */
-#define ISC_LOG_ROLLINFINITE   (-1)
-#define ISC_LOG_ROLLNEVER      (-2)
-/*@}*/
-
-/*!
- * \brief Used to name the categories used by a library.
- *
- * An array of isc_logcategory
- * structures names each category, and the id value is initialized by calling
- * isc_log_registercategories.
- */
-struct isc_logcategory {
-       const char *name;
-       unsigned int id;
-};
-
-/*%
- * Similar to isc_logcategory, but for all the modules a library defines.
- */
-struct isc_logmodule {
-       const char *name;
-       unsigned int id;
-};
-
-/*%
- * The isc_logfile structure is initialized as part of an isc_logdestination
- * before calling isc_log_createchannel().
- *
- * When defining an #ISC_LOG_TOFILE
- * channel the name, versions and maximum_size should be set before calling
- * isc_log_createchannel().  To define an #ISC_LOG_TOFILEDESC channel set only
- * the stream before the call.
- *
- * Setting maximum_size to zero implies no maximum.
- */
-typedef struct isc_logfile {
-       FILE *stream;           /*%< Initialized to NULL for #ISC_LOG_TOFILE. */
-       const char *name;       /*%< NULL for #ISC_LOG_TOFILEDESC. */
-       int versions;   /* >= 0, #ISC_LOG_ROLLNEVER, #ISC_LOG_ROLLINFINITE. */
-       /*%
-        * stdio's ftell is standardized to return a long, which may well not
-        * be big enough for the largest file supportable by the operating
-        * system (though it is _probably_ big enough for the largest log
-        * anyone would want).  st_size returned by fstat should be typedef'd
-        * to a size large enough for the largest possible file on a system.
-        */
-       off_t maximum_size;
-       bool maximum_reached; /*%< Private. */
-} isc_logfile_t;
-
-/*%
- * Passed to isc_log_createchannel to define the attributes of either
- * a stdio or a syslog log.
- */
-typedef union isc_logdestination {
-       isc_logfile_t file;
-       int facility;           /* XXXDCL NT */
-} isc_logdestination_t;
-
-/*@{*/
-/*%
- * The built-in categories of libisc.
- *
- * Each library registering categories should provide library_LOGCATEGORY_name
- * definitions with indexes into its isc_logcategory structure corresponding to
- * the order of the names.
- */
-/* All that's left of isc/platform.h */
-#define LIBISC_EXTERNAL_DATA
-LIBISC_EXTERNAL_DATA extern isc_logcategory_t isc_categories[];
-LIBISC_EXTERNAL_DATA extern isc_log_t *isc_lctx;
-LIBISC_EXTERNAL_DATA extern isc_logmodule_t isc_modules[];
-/*@}*/
-
-/*@{*/
-/*%
- * Do not log directly to DEFAULT.  Use another category.  When in doubt,
- * use GENERAL.
- */
-#define ISC_LOGCATEGORY_DEFAULT        (&isc_categories[0])
-#define ISC_LOGCATEGORY_GENERAL        (&isc_categories[1])
-/*@}*/
-
-#define ISC_LOGMODULE_SOCKET (&isc_modules[0])
-#define ISC_LOGMODULE_TIME (&isc_modules[1])
-#define ISC_LOGMODULE_INTERFACE (&isc_modules[2])
-#define ISC_LOGMODULE_TIMER (&isc_modules[3])
-#define ISC_LOGMODULE_FILE (&isc_modules[4])
-
-ISC_LANG_BEGINDECLS
-
-isc_result_t
-isc_log_create(isc_mem_t *mctx, isc_log_t **lctxp, isc_logconfig_t **lcfgp);
-/*%<
- * Establish a new logging context, with default channels.
- *
- * Notes:
- *\li  isc_log_create() calls isc_logconfig_create(), so see its comment
- *     below for more information.
- *
- * Requires:
- *\li  mctx is a valid memory context.
- *\li  lctxp is not null and *lctxp is null.
- *\li  lcfgp is null or lcfgp is not null and *lcfgp is null.
- *
- * Ensures:
- *\li  *lctxp will point to a valid logging context if all of the necessary
- *     memory was allocated, or NULL otherwise.
- *\li  *lcfgp will point to a valid logging configuration if all of the
- *     necessary memory was allocated, or NULL otherwise.
- *\li  On failure, no additional memory is allocated.
- *
- * Returns:
- *\li  #ISC_R_SUCCESS          Success
- *\li  #ISC_R_NOMEMORY         Resource limit: Out of memory
- */
-
-isc_result_t
-isc_logconfig_create(isc_log_t *lctx, isc_logconfig_t **lcfgp);
-/*%<
- * Create the data structure that holds all of the configurable information
- * about where messages are actually supposed to be sent -- the information
- * that could changed based on some configuration file, as opposed to the
- * the category/module specification of isc_log_[v]write[1] that is compiled
- * into a program, or the debug_level which is dynamic state information.
- *
- * Notes:
- *\li  It is necessary to specify the logging context the configuration
- *     will be used with because the number of categories and modules
- *     needs to be known in order to set the configuration.  However,
- *     the configuration is not used by the logging context until the
- *     isc_logconfig_use function is called.
- *
- *\li  The memory context used for operations that allocate memory for
- *     the configuration is that of the logging context, as specified
- *     in the isc_log_create call.
- *
- *\li  Four default channels are established:
- *\verbatim
- *             default_syslog
- *              - log to syslog's daemon facility #ISC_LOG_INFO or higher
- *             default_stderr
- *              - log to stderr #ISC_LOG_INFO or higher
- *             default_debug
- *              - log to stderr #ISC_LOG_DEBUG dynamically
- *             null
- *              - log nothing
- *\endverbatim
- *
- * Requires:
- *\li  lctx is a valid logging context.
- *\li  lcftp is not null and *lcfgp is null.
- *
- * Ensures:
- *\li  *lcfgp will point to a valid logging context if all of the necessary
- *     memory was allocated, or NULL otherwise.
- *\li  On failure, no additional memory is allocated.
- *
- * Returns:
- *\li  #ISC_R_SUCCESS          Success
- *\li  #ISC_R_NOMEMORY         Resource limit: Out of memory
- */
-
-isc_logconfig_t *
-isc_logconfig_get(isc_log_t *lctx);
-/*%<
- * Returns a pointer to the configuration currently in use by the log context.
- *
- * Requires:
- *\li  lctx is a valid context.
- *
- * Ensures:
- *\li  The configuration pointer is non-null.
- *
- * Returns:
- *\li  The configuration pointer.
- */
-
-isc_result_t
-isc_logconfig_use(isc_log_t *lctx, isc_logconfig_t *lcfg);
-/*%<
- * Associate a new configuration with a logging context.
- *
- * Notes:
- *\li  This is thread safe.  The logging context will lock a mutex
- *     before attempting to swap in the new configuration, and isc_log_doit
- *     (the internal function used by all of isc_log_[v]write[1]) locks
- *     the same lock for the duration of its use of the configuration.
- *
- * Requires:
- *\li  lctx is a valid logging context.
- *\li  lcfg is a valid logging configuration.
- *\li  lctx is the same configuration given to isc_logconfig_create
- *             when the configuration was created.
- *
- * Ensures:
- *\li  Future calls to isc_log_write will use the new configuration.
- *
- * Returns:
- *\li  #ISC_R_SUCCESS          Success
- *\li  #ISC_R_NOMEMORY         Resource limit: Out of memory
- */
-
-void
-isc_log_destroy(isc_log_t **lctxp);
-/*%<
- * Deallocate the memory associated with a logging context.
- *
- * Requires:
- *\li  *lctx is a valid logging context.
- *
- * Ensures:
- *\li  All of the memory associated with the logging context is returned
- *     to the free memory pool.
- *
- *\li  Any open files are closed.
- *
- *\li  The logging context is marked as invalid.
- */
-
-void
-isc_logconfig_destroy(isc_logconfig_t **lcfgp);
-/*%<
- * Destroy a logging configuration.
- *
- * Notes:
- *\li  This function cannot be used directly with the return value of
- *     isc_logconfig_get, because a logging context must always have
- *     a valid configuration associated with it.
- *
- * Requires:
- *\li  lcfgp is not null and *lcfgp is a valid logging configuration.
- *\li  The logging configuration is not in use by an existing logging context.
- *
- * Ensures:
- *\li  All memory allocated for the configuration is freed.
- *
- *\li  The configuration is marked as invalid.
- */
-
-void
-isc_log_registercategories(isc_log_t *lctx, isc_logcategory_t categories[]);
-/*%<
- * Identify logging categories a library will use.
- *
- * Notes:
- *\li  A category should only be registered once, but no mechanism enforces
- *     this rule.
- *
- *\li  The end of the categories array is identified by a NULL name.
- *
- *\li  Because the name is used by #ISC_LOG_PRINTCATEGORY, it should not
- *     be altered or destroyed after isc_log_registercategories().
- *
- *\li  Because each element of the categories array is used by
- *     isc_log_categorybyname, it should not be altered or destroyed
- *     after registration.
- *
- *\li  The value of the id integer in each structure is overwritten
- *     by this function, and so id need not be initialized to any particular
- *     value prior to the function call.
- *
- *\li  A subsequent call to isc_log_registercategories with the same
- *     logging context (but new categories) will cause the last
- *     element of the categories array from the prior call to have
- *     its "name" member changed from NULL to point to the new
- *     categories array, and its "id" member set to UINT_MAX.
- *
- * Requires:
- *\li  lctx is a valid logging context.
- *\li  categories != NULL.
- *\li  categories[0].name != NULL.
- *
- * Ensures:
- * \li There are references to each category in the logging context,
- *     so they can be used with isc_log_usechannel() and isc_log_write().
- */
-
-void
-isc_log_registermodules(isc_log_t *lctx, isc_logmodule_t modules[]);
-/*%<
- * Identify logging categories a library will use.
- *
- * Notes:
- *\li  A module should only be registered once, but no mechanism enforces
- *     this rule.
- *
- *\li  The end of the modules array is identified by a NULL name.
- *
- *\li  Because the name is used by #ISC_LOG_PRINTMODULE, it should not
- *     be altered or destroyed after isc_log_registermodules().
- *
- *\li  Because each element of the modules array is used by
- *     isc_log_modulebyname, it should not be altered or destroyed
- *     after registration.
- *
- *\li  The value of the id integer in each structure is overwritten
- *     by this function, and so id need not be initialized to any particular
- *     value prior to the function call.
- *
- *\li  A subsequent call to isc_log_registermodules with the same
- *     logging context (but new modules) will cause the last
- *     element of the modules array from the prior call to have
- *     its "name" member changed from NULL to point to the new
- *     modules array, and its "id" member set to UINT_MAX.
- *
- * Requires:
- *\li  lctx is a valid logging context.
- *\li  modules != NULL.
- *\li  modules[0].name != NULL;
- *
- * Ensures:
- *\li  Each module has a reference in the logging context, so they can be
- *     used with isc_log_usechannel() and isc_log_write().
- */
-
-isc_result_t
-isc_log_createchannel(isc_logconfig_t *lcfg, const char *name,
-                     unsigned int type, int level,
-                     const isc_logdestination_t *destination,
-                     unsigned int flags);
-/*%<
- * Specify the parameters of a logging channel.
- *
- * Notes:
- *\li  The name argument is copied to memory in the logging context, so
- *     it can be altered or destroyed after isc_log_createchannel().
- *
- *\li  Defining a very large number of channels will have a performance
- *     impact on isc_log_usechannel(), since the names are searched
- *     linearly until a match is made.  This same issue does not affect
- *     isc_log_write, however.
- *
- *\li  Channel names can be redefined; this is primarily useful for programs
- *     that want their own definition of default_syslog, default_debug
- *     and default_stderr.
- *
- *\li  Any channel that is redefined will not affect logging that was
- *     already directed to its original definition, _except_ for the
- *     default_stderr channel.  This case is handled specially so that
- *     the default logging category can be changed by redefining
- *     default_stderr.  (XXXDCL Though now that I think of it, the default
- *     logging category can be changed with only one additional function
- *     call by defining a new channel and then calling isc_log_usechannel()
- *     for #ISC_LOGCATEGORY_DEFAULT.)
- *
- *\li  Specifying #ISC_LOG_PRINTTIME or #ISC_LOG_PRINTTAG for syslog is allowed,
- *     but probably not what you wanted to do.
- *
- *     #ISC_LOG_DEBUGONLY will mark the channel as usable only when the
- *     debug level of the logging context (see isc_log_setdebuglevel)
- *     is non-zero.
- *
- * Requires:
- *\li  lcfg is a valid logging configuration.
- *
- *\li  name is not NULL.
- *
- *\li  type is #ISC_LOG_TOSYSLOG, #ISC_LOG_TOFILE, #ISC_LOG_TOFILEDESC or
- *             #ISC_LOG_TONULL.
- *
- *\li  destination is not NULL unless type is #ISC_LOG_TONULL.
- *
- *\li  level is >= #ISC_LOG_CRITICAL (the most negative logging level).
- *
- *\li  flags does not include any bits aside from the ISC_LOG_PRINT* bits
- *     or #ISC_LOG_DEBUGONLY.
- *
- * Ensures:
- *\li  #ISC_R_SUCCESS
- *             A channel with the given name is usable with
- *             isc_log_usechannel().
- *
- *\li  #ISC_R_NOMEMORY or #ISC_R_UNEXPECTED
- *             No additional memory is being used by the logging context.
- *             Any channel that previously existed with the given name
- *             is not redefined.
- *
- * Returns:
- *\li  #ISC_R_SUCCESS          Success
- *\li  #ISC_R_NOMEMORY         Resource limit: Out of memory
- *\li  #ISC_R_UNEXPECTED       type was out of range and REQUIRE()
- *                                     was disabled.
- */
-
-isc_result_t
-isc_log_usechannel(isc_logconfig_t *lcfg, const char *name,
-                  const isc_logcategory_t *category,
-                  const isc_logmodule_t *module);
-/*%<
- * Associate a named logging channel with a category and module that
- * will use it.
- *
- * Notes:
- *\li  The name is searched for linearly in the set of known channel names
- *     until a match is found.  (Note the performance impact of a very large
- *     number of named channels.)  When multiple channels of the same
- *     name are defined, the most recent definition is found.
- *
- *\li  Specifying a very large number of channels for a category will have
- *     a moderate impact on performance in isc_log_write(), as each
- *     call looks up the category for the start of a linked list, which
- *     it follows all the way to the end to find matching modules.  The
- *     test for matching modules is  integral, though.
- *
- *\li  If category is NULL, then the channel is associated with the indicated
- *     module for all known categories (including the "default" category).
- *
- *\li  If module is NULL, then the channel is associated with every module
- *     that uses that category.
- *
- *\li  Passing both category and module as NULL would make every log message
- *     use the indicated channel.
- *
- * \li Specifying a channel that is #ISC_LOG_TONULL for a category/module pair
- *     has no effect on any other channels associated with that pair,
- *     regardless of ordering.  Thus you cannot use it to "mask out" one
- *     category/module pair when you have specified some other channel that
- *     is also used by that category/module pair.
- *
- * Requires:
- *\li  lcfg is a valid logging configuration.
- *
- *\li  category is NULL or has an id that is in the range of known ids.
- *
- *     module is NULL or has an id that is in the range of known ids.
- *
- * Ensures:
- *\li  #ISC_R_SUCCESS
- *             The channel will be used by the indicated category/module
- *             arguments.
- *
- *\li  #ISC_R_NOMEMORY
- *             If assignment for a specific category has been requested,
- *             the channel has not been associated with the indicated
- *             category/module arguments and no additional memory is
- *             used by the logging context.
- *             If assignment for all categories has been requested
- *             then _some_ may have succeeded (starting with category
- *             "default" and progressing through the order of categories
- *             passed to isc_log_registercategories()) and additional memory
- *             is being used by whatever assignments succeeded.
- *
- * Returns:
- *\li  #ISC_R_SUCCESS  Success
- *\li  #ISC_R_NOMEMORY Resource limit: Out of memory
- */
-
-/* Attention: next four comments PRECEED code */
-/*!
- *   \brief
- * Write a message to the log channels.
- *
- * Notes:
- *\li  lctx can be NULL; this is allowed so that programs which use
- *     libraries that use the ISC logging system are not required to
- *     also use it.
- *
- *\li  The format argument is a printf(3) string, with additional arguments
- *     as necessary.
- *
- * Requires:
- *\li  lctx is a valid logging context.
- *
- *\li  The category and module arguments must have ids that are in the
- *     range of known ids, as established by isc_log_registercategories()
- *     and isc_log_registermodules().
- *
- *\li  level != #ISC_LOG_DYNAMIC.  ISC_LOG_DYNAMIC is used only to define
- *     channels, and explicit debugging level must be identified for
- *     isc_log_write() via ISC_LOG_DEBUG(level).
- *
- *\li  format != NULL.
- *
- * Ensures:
- *\li  The log message is written to every channel associated with the
- *     indicated category/module pair.
- *
- * Returns:
- *\li  Nothing.  Failure to log a message is not construed as a
- *     meaningful error.
- */
-void
-isc_log_write(isc_log_t *lctx, isc_logcategory_t *category,
-              isc_logmodule_t *module, int level,
-             const char *format, ...)
-
-ISC_FORMAT_PRINTF(5, 6);
-
-/*%
- * Write a message to the log channels.
- *
- * Notes:
- *\li  lctx can be NULL; this is allowed so that programs which use
- *     libraries that use the ISC logging system are not required to
- *     also use it.
- *
- *\li  The format argument is a printf(3) string, with additional arguments
- *     as necessary.
- *
- * Requires:
- *\li  lctx is a valid logging context.
- *
- *\li  The category and module arguments must have ids that are in the
- *     range of known ids, as established by isc_log_registercategories()
- *     and isc_log_registermodules().
- *
- *\li  level != #ISC_LOG_DYNAMIC.  ISC_LOG_DYNAMIC is used only to define
- *     channels, and explicit debugging level must be identified for
- *     isc_log_write() via ISC_LOG_DEBUG(level).
- *
- *\li  format != NULL.
- *
- * Ensures:
- *\li  The log message is written to every channel associated with the
- *     indicated category/module pair.
- *
- * Returns:
- *\li  Nothing.  Failure to log a message is not construed as a
- *     meaningful error.
- */
-void
-isc_log_vwrite(isc_log_t *lctx, isc_logcategory_t *category,
-              isc_logmodule_t *module, int level,
-              const char *format, va_list args)
-
-ISC_FORMAT_PRINTF(5, 0);
-
-/*%
- * Write a message to the log channels, pruning duplicates that occur within
- * a configurable amount of seconds (see isc_log_[sg]etduplicateinterval).
- * This function is otherwise identical to isc_log_write().
- */
-void
-isc_log_write1(isc_log_t *lctx, isc_logcategory_t *category,
-              isc_logmodule_t *module, int level, const char *format, ...)
-
-ISC_FORMAT_PRINTF(5, 6);
-
-/*%
- * Write a message to the log channels, pruning duplicates that occur within
- * a configurable amount of seconds (see isc_log_[sg]etduplicateinterval).
- * This function is otherwise identical to isc_log_vwrite().
- */
-void
-isc_log_vwrite1(isc_log_t *lctx, isc_logcategory_t *category,
-               isc_logmodule_t *module, int level, const char *format,
-               va_list args)
-
-ISC_FORMAT_PRINTF(5, 0);
-
-void
-isc_log_setdebuglevel(isc_log_t *lctx, unsigned int level);
-/*%<
- * Set the debugging level used for logging.
- *
- * Notes:
- *\li  Setting the debugging level to 0 disables debugging log messages.
- *
- * Requires:
- *\li  lctx is a valid logging context.
- *
- * Ensures:
- *\li  The debugging level is set to the requested value.
- */
-
-unsigned int
-isc_log_getdebuglevel(isc_log_t *lctx);
-/*%<
- * Get the current debugging level.
- *
- * Notes:
- *\li  This is provided so that a program can have a notion of
- *     "increment debugging level" or "decrement debugging level"
- *     without needing to keep track of what the current level is.
- *
- *\li  A return value of 0 indicates that debugging messages are disabled.
- *
- * Requires:
- *\li  lctx is a valid logging context.
- *
- * Ensures:
- *\li  The current logging debugging level is returned.
- */
-
-bool
-isc_log_wouldlog(isc_log_t *lctx, int level);
-/*%<
- * Determine whether logging something to 'lctx' at 'level' would
- * actually cause something to be logged somewhere.
- *
- * If #false is returned, it is guaranteed that nothing would
- * be logged, allowing the caller to omit unnecessary
- * isc_log_write() calls and possible message preformatting.
- */
-
-void
-isc_log_setduplicateinterval(isc_logconfig_t *lcfg, unsigned int interval);
-/*%<
- * Set the interval over which duplicate log messages will be ignored
- * by isc_log_[v]write1(), in seconds.
- *
- * Notes:
- *\li  Increasing the duplicate interval from X to Y will not necessarily
- *     filter out duplicates of messages logged in Y - X seconds since the
- *     increase.  (Example: Message1 is logged at midnight.  Message2
- *     is logged at 00:01:00, when the interval is only 30 seconds, causing
- *     Message1 to be expired from the log message history.  Then the interval
- *     is increased to 3000 (five minutes) and at 00:04:00 Message1 is logged
- *     again.  It will appear the second time even though less than five
- *     passed since the first occurrence.
- *
- * Requires:
- *\li  lctx is a valid logging context.
- */
-
-unsigned int
-isc_log_getduplicateinterval(isc_logconfig_t *lcfg);
-/*%<
- * Get the current duplicate filtering interval.
- *
- * Requires:
- *\li  lctx is a valid logging context.
- *
- * Returns:
- *\li  The current duplicate filtering interval.
- */
-
-isc_result_t
-isc_log_settag(isc_logconfig_t *lcfg, const char *tag);
-/*%<
- * Set the program name or other identifier for #ISC_LOG_PRINTTAG.
- *
- * Requires:
- *\li  lcfg is a valid logging configuration.
- *
- * Notes:
- *\li  If this function has not set the tag to a non-NULL, non-empty value,
- *     then the #ISC_LOG_PRINTTAG channel flag will not print anything.
- *     Unlike some implementations of syslog on Unix systems, you *must* set
- *     the tag in order to get it logged.  It is not implicitly derived from
- *     the program name (which is pretty impossible to infer portably).
- *
- *\li  Setting the tag to NULL or the empty string will also cause the
- *     #ISC_LOG_PRINTTAG channel flag to not print anything.  If tag equals the
- *     empty string, calls to isc_log_gettag will return NULL.
- *
- * Returns:
- *\li  #ISC_R_SUCCESS  Success
- *\li  #ISC_R_NOMEMORY  Resource Limit: Out of memory
- *
- * XXXDCL when creating a new isc_logconfig_t, it might be nice if the tag
- * of the currently active isc_logconfig_t was inherited.  this does not
- * currently happen.
- */
-
-char *
-isc_log_gettag(isc_logconfig_t *lcfg);
-/*%<
- * Get the current identifier printed with #ISC_LOG_PRINTTAG.
- *
- * Requires:
- *\li  lcfg is a valid logging configuration.
- *
- * Notes:
- *\li  Since isc_log_settag() will not associate a zero-length string
- *     with the logging configuration, attempts to do so will cause
- *     this function to return NULL.  However, a determined programmer
- *     will observe that (currently) a tag of length greater than zero
- *     could be set, and then modified to be zero length.
- *
- * Returns:
- *\li  A pointer to the current identifier, or NULL if none has been set.
- */
-
-void
-isc_log_opensyslog(const char *tag, int options, int facility);
-/*%<
- * Initialize syslog logging.
- *
- * Notes:
- *\li  XXXDCL NT
- *     This is currently equivalent to openlog(), but is not going to remain
- *     that way.  In the meantime, the arguments are all identical to
- *     those used by openlog(3), as follows:
- *
- * \code
- *             tag: The string to use in the position of the program
- *                     name in syslog messages.  Most (all?) syslogs
- *                     will use basename(argv[0]) if tag is NULL.
- *
- *             options: LOG_CONS, LOG_PID, LOG_NDELAY ... whatever your
- *                     syslog supports.
- *
- *             facility: The default syslog facility.  This is irrelevant
- *                     since isc_log_write will ALWAYS use the channel's
- *                     declared facility.
- * \endcode
- *
- *\li  Zero effort has been made (yet) to accommodate systems with openlog()
- *     that only takes two arguments, or to identify valid syslog
- *     facilities or options for any given architecture.
- *
- *\li  It is necessary to call isc_log_opensyslog() to initialize
- *     syslogging on machines which do not support network connections to
- *     syslogd because they require a Unix domain socket to be used.  Since
- *     this is a chore to determine at run-time, it is suggested that it
- *     always be called by programs using the ISC logging system.
- *
- * Requires:
- *\li  Nothing.
- *
- * Ensures:
- *\li  openlog() is called to initialize the syslog system.
- */
-
-void
-isc_log_closefilelogs(isc_log_t *lctx);
-/*%<
- * Close all open files used by #ISC_LOG_TOFILE channels.
- *
- * Notes:
- *\li  This function is provided for programs that want to use their own
- *     log rolling mechanism rather than the one provided internally.
- *     For example, a program that wanted to keep daily logs would define
- *     a channel which used #ISC_LOG_ROLLNEVER, then once a day would
- *     rename the log file and call isc_log_closefilelogs().
- *
- *\li  #ISC_LOG_TOFILEDESC channels are unaffected.
- *
- * Requires:
- *\li  lctx is a valid context.
- *
- * Ensures:
- *\li  The open files are closed and will be reopened when they are
- *     next needed.
- */
-
-isc_logcategory_t *
-isc_log_categorybyname(isc_log_t *lctx, const char *name);
-/*%<
- * Find a category by its name.
- *
- * Notes:
- *\li  The string name of a category is not required to be unique.
- *
- * Requires:
- *\li  lctx is a valid context.
- *\li  name is not NULL.
- *
- * Returns:
- *\li  A pointer to the _first_ isc_logcategory_t structure used by "name".
- *
- *\li  NULL if no category exists by that name.
- */
-
-isc_logmodule_t *
-isc_log_modulebyname(isc_log_t *lctx, const char *name);
-/*%<
- * Find a module by its name.
- *
- * Notes:
- *\li  The string name of a module is not required to be unique.
- *
- * Requires:
- *\li  lctx is a valid context.
- *\li  name is not NULL.
- *
- * Returns:
- *\li  A pointer to the _first_ isc_logmodule_t structure used by "name".
- *
- *\li  NULL if no module exists by that name.
- */
-
-void
-isc_log_setcontext(isc_log_t *lctx);
-/*%<
- * Sets the context used by the libisc for logging.
- *
- * Requires:
- *\li  lctx be a valid context.
- */
-
-ISC_LANG_ENDDECLS
-
-#endif /* GUARD_ISC_LOG_H */
</span></code></pre>

<br>
</li>
<li id='diff-1'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/daa3a36abe9a4e087b2007a293cbbae3af18cb2c#diff-1'>
<strong>
libisc/log.c
</strong>
deleted
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/libisc/log.c
</span><span style="color: #000000;background-color: #ddffdd">+++ /dev/null
</span><span style="color: #aaaaaa">@@ -1,1693 +0,0 @@
</span><span style="color: #000000;background-color: #ffdddd">-/*
- * Copyright (C) 2004-2007, 2009, 2011, 2012  Internet Systems Consortium, Inc. ("ISC")
- * Copyright (C) 1999-2003  Internet Software Consortium.
- * Copyright 2015 by the NTPsec project contributors
- * SPDX-License-Identifier: ISC
- */
-
-/*! \file
- * \author  Principal Authors: DCL */
-
-#include <config.h>
-
-#include <errno.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <time.h>
-#include <dirent.h>
-#include <stdio.h>
-#include <pthread.h>
-
-#include <sys/types.h>   /* dev_t FreeBSD 2.1 */
-#include <sys/stat.h>
-
-#include <isc/log.h>
-#include <isc/magic.h>
-#include <isc/mem.h>
-#include <isc/time.h>
-#include <isc/util.h>
-
-#include "ntp_stdlib.h"              /* NTP change for strlcpy, strlcat */
-
-#define LCTX_MAGIC             ISC_MAGIC('L', 'c', 't', 'x')
-#define VALID_CONTEXT(lctx)    ISC_MAGIC_VALID(lctx, LCTX_MAGIC)
-
-#define LCFG_MAGIC             ISC_MAGIC('L', 'c', 'f', 'g')
-#define VALID_CONFIG(lcfg)     ISC_MAGIC_VALID(lcfg, LCFG_MAGIC)
-
-#include "unix/errno2result.h"
-
-#define ISC_TF(x) ((x) ? true : false)
-
-/*
- * XXXDCL make dynamic?
- */
-#define LOG_BUFFER_SIZE        (8 * 1024)
-
-#ifndef PATH_MAX
-#define PATH_MAX 1024  /* AIX and others don't define this. */
-#endif
-
-/*!
- * This is the structure that holds each named channel.  A simple linked
- * list chains all of the channels together, so an individual channel is
- * found by doing strcmp()s with the names down the list.  Their should
- * be no performance penalty from this as it is expected that the number
- * of named channels will be no more than a dozen or so, and name lookups
- * from the head of the list are only done when isc_log_usechannel() is
- * called, which should also be very infrequent.
- */
-typedef struct isc_logchannel isc_logchannel_t;
-
-struct isc_logchannel {
-       char *                          name;
-       unsigned int                    type;
-       int                             level;
-       unsigned int                    flags;
-       isc_logdestination_t            destination;
-       ISC_LINK(isc_logchannel_t)      link;
-};
-
-/*!
- * The logchannellist structure associates categories and modules with
- * channels.  First the appropriate channellist is found based on the
- * category, and then each structure in the linked list is checked for
- * a matching module.  It is expected that the number of channels
- * associated with any given category will be very short, no more than
- * three or four in the more unusual cases.
- */
-typedef struct isc_logchannellist isc_logchannellist_t;
-
-struct isc_logchannellist {
-       const isc_logmodule_t *         module;
-       isc_logchannel_t *              channel;
-       ISC_LINK(isc_logchannellist_t)  link;
-};
-
-/*!
- * This structure is used to remember messages for pruning via
- * isc_log_[v]write1().
- */
-typedef struct isc_logmessage isc_logmessage_t;
-
-struct isc_logmessage {
-       char *                          text;
-       isc_time_t                      time;
-       ISC_LINK(isc_logmessage_t)      link;
-};
-
-/*!
- * The isc_logconfig structure is used to store the configurable information
- * about where messages are actually supposed to be sent -- the information
- * that could changed based on some configuration file, as opposed to the
- * the category/module specification of isc_log_[v]write[1] that is compiled
- * into a program, or the debug_level which is dynamic state information.
- */
-struct isc_logconfig {
-       unsigned int                    magic;
-       isc_log_t *                     lctx;
-       ISC_LIST(isc_logchannel_t)      channels;
-       ISC_LIST(isc_logchannellist_t) *channellists;
-       unsigned int                    channellist_count;
-       unsigned int                    duplicate_interval;
-       int                             highest_level;
-       char *                          tag;
-       bool                    dynamic;
-};
-
-/*!
- * This isc_log structure provides the context for the isc_log functions.
- * The log context locks itself in isc_log_doit, the internal backend to
- * isc_log_write.  The locking is necessary both to provide exclusive access
- * to the buffer into which the message is formatted and to guard against
- * competing threads trying to write to the same syslog resource.  (On
- * some systems, such as BSD/OS, stdio is thread safe but syslog is not.)
- * Unfortunately, the lock cannot guard against a _different_ logging
- * context in the same program competing for syslog's attention.  Thus
- * There Can Be Only One, but this is not enforced.
- * XXXDCL enforce it?
- *
- * Note that the category and module information is not locked.
- * This is because in the usual case, only one isc_log_t is ever created
- * in a program, and the category/module registration happens only once.
- * XXXDCL it might be wise to add more locking overall.
- */
-struct isc_log {
-       /* Not locked. */
-       unsigned int                    magic;
-       isc_mem_t *                     mctx;
-       isc_logcategory_t *             categories;
-       unsigned int                    category_count;
-       isc_logmodule_t *               modules;
-       unsigned int                    module_count;
-       int                             debug_level;
-       pthread_mutex_t                 lock;
-       /* Locked by isc_log lock. */
-       isc_logconfig_t *               logconfig;
-       char                            buffer[LOG_BUFFER_SIZE];
-       ISC_LIST(isc_logmessage_t)      messages;
-};
-
-/*!
- * Used when ISC_LOG_PRINTLEVEL is enabled for a channel.
- */
-static const char *log_level_strings[] = {
-       "debug",
-       "info",
-       "notice",
-       "warning",
-       "error",
-       "critical"
-};
-
-/*!
- * Used to convert ISC_LOG_* priorities into syslog priorities.
- * XXXDCL This will need modification for NT.
- */
-static const int syslog_map[] = {
-       LOG_DEBUG,
-       LOG_INFO,
-       LOG_NOTICE,
-       LOG_WARNING,
-       LOG_ERR,
-       LOG_CRIT
-};
-
-/*!
- * When adding new categories, a corresponding ISC_LOGCATEGORY_foo
- * definition needs to be added to <isc/log.h>.
- *
- * The default category is provided so that the internal default can
- * be overridden.  Since the default is always looked up as the first
- * channellist in the log context, it must come first in isc_categories[].
- */
-LIBISC_EXTERNAL_DATA isc_logcategory_t isc_categories[] = {
-       { "default", 0 },     /* "default" must come first. */
-       { "general", 0 },
-       { NULL, 0 }
-};
-
-/*!
- * See above comment for categories on LIBISC_EXTERNAL_DATA, and apply it to modules.
- */
-LIBISC_EXTERNAL_DATA isc_logmodule_t isc_modules[] = {
-       { "socket", 0 },
-       { "time", 0 },
-       { "interface", 0 },
-       { "timer", 0 },
-       { "file", 0 },
-       { NULL, 0 }
-};
-
-/*!
- * This essentially constant structure must be filled in at run time,
- * because its channel member is pointed to a channel that is created
- * dynamically with isc_log_createchannel.
- */
-static isc_logchannellist_t default_channel;
-
-/*!
- * libisc logs to this context.
- */
-LIBISC_EXTERNAL_DATA isc_log_t *isc_lctx = NULL;
-
-/*!
- * Forward declarations.
- */
-static isc_result_t
-assignchannel(isc_logconfig_t *lcfg, unsigned int category_id,
-             const isc_logmodule_t *module, isc_logchannel_t *channel);
-
-static isc_result_t
-sync_channellist(isc_logconfig_t *lcfg);
-
-static isc_result_t
-greatest_version(isc_logchannel_t *channel, int *greatest);
-
-static isc_result_t
-roll_log(isc_logchannel_t *channel);
-
-static void
-isc_log_doit(isc_log_t *lctx, isc_logcategory_t *category,
-            isc_logmodule_t *module, int level, bool write_once,
-            int msgset, int msg,
-            const char *format, va_list args)
-     ISC_FORMAT_PRINTF(8, 0);
-
-/*@{*/
-/*!
- * Convenience macros.
- */
-
-#define FACILITY(channel)       (channel->destination.facility)
-#define FILE_NAME(channel)      (channel->destination.file.name)
-#define FILE_STREAM(channel)    (channel->destination.file.stream)
-#define FILE_VERSIONS(channel)  (channel->destination.file.versions)
-#define FILE_MAXSIZE(channel)   (channel->destination.file.maximum_size)
-#define FILE_MAXREACHED(channel) (channel->destination.file.maximum_reached)
-
-/*@}*/
-/****
- **** Public interfaces.
- ****/
-
-/*
- * Establish a new logging context, with default channels.
- */
-isc_result_t
-isc_log_create(isc_mem_t *mctx, isc_log_t **lctxp, isc_logconfig_t **lcfgp) {
-       isc_log_t *lctx;
-       isc_logconfig_t *lcfg = NULL;
-       int result;
-
-       REQUIRE(mctx != NULL);
-       REQUIRE(lctxp != NULL && *lctxp == NULL);
-       REQUIRE(lcfgp == NULL || *lcfgp == NULL);
-
-       lctx = isc_mem_get(mctx, sizeof(*lctx));
-       if (lctx != NULL) {
-               lctx->mctx = mctx;
-               lctx->categories = NULL;
-               lctx->category_count = 0;
-               lctx->modules = NULL;
-               lctx->module_count = 0;
-               lctx->debug_level = 0;
-
-               ISC_LIST_INIT(lctx->messages);
-
-               result = pthread_mutex_init(&lctx->lock, NULL);
-               if (result != 0) {
-                       isc_mem_put(mctx, lctx, sizeof(*lctx));
-                       return (result);
-               }
-
-               /*
-                * Normally setting the magic number is the last step done
-                * in a creation function, but a valid log context is needed
-                * by isc_log_registercategories and isc_logconfig_create.
-                * If either fails, the lctx is destroyed and not returned
-                * to the caller.
-                */
-               lctx->magic = LCTX_MAGIC;
-
-               isc_log_registercategories(lctx, isc_categories);
-               isc_log_registermodules(lctx, isc_modules);
-               result = isc_logconfig_create(lctx, &lcfg);
-
-       } else
-               result = ISC_R_NOMEMORY;
-
-       if (result == ISC_R_SUCCESS)
-               result = sync_channellist(lcfg);
-
-       if (result == ISC_R_SUCCESS) {
-               lctx->logconfig = lcfg;
-
-               *lctxp = lctx;
-               if (lcfgp != NULL)
-                       *lcfgp = lcfg;
-
-       } else {
-               if (lcfg != NULL)
-                       isc_logconfig_destroy(&lcfg);
-               if (lctx != NULL)
-                       isc_log_destroy(&lctx);
-       }
-
-       return (result);
-}
-
-isc_result_t
-isc_logconfig_create(isc_log_t *lctx, isc_logconfig_t **lcfgp) {
-       isc_logconfig_t *lcfg;
-       isc_logdestination_t destination;
-       isc_result_t result = ISC_R_SUCCESS;
-       int level = ISC_LOG_INFO;
-
-       REQUIRE(lcfgp != NULL && *lcfgp == NULL);
-       REQUIRE(VALID_CONTEXT(lctx));
-
-       lcfg = isc_mem_get(lctx->mctx, sizeof(*lcfg));
-
-       if (lcfg != NULL) {
-               lcfg->lctx = lctx;
-               lcfg->channellists = NULL;
-               lcfg->channellist_count = 0;
-               lcfg->duplicate_interval = 0;
-               lcfg->highest_level = level;
-               lcfg->tag = NULL;
-               lcfg->dynamic = false;
-
-               ISC_LIST_INIT(lcfg->channels);
-
-               /*
-                * Normally the magic number is the last thing set in the
-                * structure, but isc_log_createchannel() needs a valid
-                * config.  If the channel creation fails, the lcfg is not
-                * returned to the caller.
-                */
-               lcfg->magic = LCFG_MAGIC;
-
-       } else
-               result = ISC_R_NOMEMORY;
-
-       /*
-        * Create the default channels:
-        *      default_syslog, default_stderr, default_debug and null.
-        */
-       if (result == ISC_R_SUCCESS) {
-               destination.facility = LOG_DAEMON;
-               result = isc_log_createchannel(lcfg, "default_syslog",
-                                              ISC_LOG_TOSYSLOG, level,
-                                              &destination, 0);
-       }
-
-       if (result == ISC_R_SUCCESS) {
-               destination.file.stream = stderr;
-               destination.file.name = NULL;
-               destination.file.versions = ISC_LOG_ROLLNEVER;
-               destination.file.maximum_size = 0;
-               result = isc_log_createchannel(lcfg, "default_stderr",
-                                              ISC_LOG_TOFILEDESC,
-                                              level,
-                                              &destination,
-                                              ISC_LOG_PRINTTIME);
-       }
-
-       if (result == ISC_R_SUCCESS) {
-               /*
-                * Set the default category's channel to default_stderr,
-                * which is at the head of the channels list because it was
-                * just created.
-                */
-               default_channel.channel = ISC_LIST_HEAD(lcfg->channels);
-
-               destination.file.stream = stderr;
-               destination.file.name = NULL;
-               destination.file.versions = ISC_LOG_ROLLNEVER;
-               destination.file.maximum_size = 0;
-               result = isc_log_createchannel(lcfg, "default_debug",
-                                              ISC_LOG_TOFILEDESC,
-                                              ISC_LOG_DYNAMIC,
-                                              &destination,
-                                              ISC_LOG_PRINTTIME);
-       }
-
-       if (result == ISC_R_SUCCESS)
-               result = isc_log_createchannel(lcfg, "null",
-                                              ISC_LOG_TONULL,
-                                              ISC_LOG_DYNAMIC,
-                                              NULL, 0);
-
-       if (result == ISC_R_SUCCESS)
-               *lcfgp = lcfg;
-
-       else
-               if (lcfg != NULL)
-                       isc_logconfig_destroy(&lcfg);
-
-       return (result);
-}
-
-isc_logconfig_t *
-isc_logconfig_get(isc_log_t *lctx) {
-       REQUIRE(VALID_CONTEXT(lctx));
-
-       ENSURE(lctx->logconfig != NULL);
-
-       return (lctx->logconfig);
-}
-
-isc_result_t
-isc_logconfig_use(isc_log_t *lctx, isc_logconfig_t *lcfg) {
-       isc_logconfig_t *old_cfg;
-       isc_result_t result;
-
-       REQUIRE(VALID_CONTEXT(lctx));
-       REQUIRE(VALID_CONFIG(lcfg));
-       REQUIRE(lcfg->lctx == lctx);
-
-       /*
-        * Ensure that lcfg->channellist_count == lctx->category_count.
-        * They won't be equal if isc_log_usechannel has not been called
-        * since any call to isc_log_registercategories.
-        */
-       result = sync_channellist(lcfg);
-       if (result != ISC_R_SUCCESS)
-               return (result);
-
-       LOCK(&lctx->lock);
-
-       old_cfg = lctx->logconfig;
-       lctx->logconfig = lcfg;
-
-       UNLOCK(&lctx->lock);
-
-       isc_logconfig_destroy(&old_cfg);
-
-       return (ISC_R_SUCCESS);
-}
-
-void
-isc_log_destroy(isc_log_t **lctxp) {
-       isc_log_t *lctx;
-       isc_logconfig_t *lcfg;
-       isc_mem_t *mctx;
-       isc_logmessage_t *message;
-
-       REQUIRE(lctxp != NULL && VALID_CONTEXT(*lctxp));
-
-       lctx = *lctxp;
-       mctx = lctx->mctx;
-
-       if (lctx->logconfig != NULL) {
-               lcfg = lctx->logconfig;
-               lctx->logconfig = NULL;
-               isc_logconfig_destroy(&lcfg);
-       }
-
-       DESTROYLOCK(&lctx->lock);
-
-       while ((message = ISC_LIST_HEAD(lctx->messages)) != NULL) {
-               ISC_LIST_UNLINK(lctx->messages, message, link);
-
-               isc_mem_put(mctx, message,
-                           sizeof(*message) + strlen(message->text) + 1);
-       }
-
-       lctx->buffer[0] = '\0';
-       lctx->debug_level = 0;
-       lctx->categories = NULL;
-       lctx->category_count = 0;
-       lctx->modules = NULL;
-       lctx->module_count = 0;
-       lctx->mctx = NULL;
-       lctx->magic = 0;
-
-       isc_mem_put(mctx, lctx, sizeof(*lctx));
-
-       *lctxp = NULL;
-}
-
-void
-isc_logconfig_destroy(isc_logconfig_t **lcfgp) {
-       isc_logconfig_t *lcfg;
-       isc_mem_t *mctx;
-       isc_logchannel_t *channel;
-       isc_logchannellist_t *item;
-       char *filename;
-       unsigned int i;
-
-       REQUIRE(lcfgp != NULL && VALID_CONFIG(*lcfgp));
-
-       lcfg = *lcfgp;
-
-       /*
-        * This function cannot be called with a logconfig that is in
-        * use by a log context.
-        */
-       REQUIRE(lcfg->lctx != NULL && lcfg->lctx->logconfig != lcfg);
-
-       mctx = lcfg->lctx->mctx;
-
-       while ((channel = ISC_LIST_HEAD(lcfg->channels)) != NULL) {
-               ISC_LIST_UNLINK(lcfg->channels, channel, link);
-
-               if (channel->type == ISC_LOG_TOFILE) {
-                       /*
-                        * The filename for the channel may have ultimately
-                        * started its life in user-land as a const string,
-                        * but in isc_log_createchannel it gets copied
-                        * into writable memory and is not longer truly const.
-                        */
-                       DE_CONST(FILE_NAME(channel), filename);
-                       isc_mem_free(mctx, filename);
-
-                       if (FILE_STREAM(channel) != NULL)
-                               (void)fclose(FILE_STREAM(channel));
-               }
-
-               isc_mem_free(mctx, channel->name);
-               isc_mem_put(mctx, channel, sizeof(*channel));
-       }
-
-       for (i = 0; i < lcfg->channellist_count; i++)
-               while ((item = ISC_LIST_HEAD(lcfg->channellists[i])) != NULL) {
-                       ISC_LIST_UNLINK(lcfg->channellists[i], item, link);
-                       isc_mem_put(mctx, item, sizeof(*item));
-               }
-
-       if (lcfg->channellist_count > 0)
-               isc_mem_put(mctx, lcfg->channellists,
-                           lcfg->channellist_count *
-                           sizeof(ISC_LIST(isc_logchannellist_t)));
-
-       lcfg->dynamic = false;
-       if (lcfg->tag != NULL)
-               isc_mem_free(lcfg->lctx->mctx, lcfg->tag);
-       lcfg->tag = NULL;
-       lcfg->highest_level = 0;
-       lcfg->duplicate_interval = 0;
-       lcfg->magic = 0;
-
-       isc_mem_put(mctx, lcfg, sizeof(*lcfg));
-
-       *lcfgp = NULL;
-}
-
-void
-isc_log_registercategories(isc_log_t *lctx, isc_logcategory_t categories[]) {
-       isc_logcategory_t *catp;
-
-       REQUIRE(VALID_CONTEXT(lctx));
-       REQUIRE(categories != NULL && categories[0].name != NULL);
-
-       /*
-        * XXXDCL This somewhat sleazy situation of using the last pointer
-        * in one category array to point to the next array exists because
-        * this registration function returns void and I didn't want to have
-        * change everything that used it by making it return an isc_result_t.
-        * It would need to do that if it had to allocate memory to store
-        * pointers to each array passed in.
-        */
-       if (lctx->categories == NULL)
-               lctx->categories = categories;
-
-       else {
-               /*
-                * Adjust the last (NULL) pointer of the already registered
-                * categories to point to the incoming array.
-                */
-               for (catp = lctx->categories; catp->name != NULL; )
-                       if (catp->id == UINT_MAX)
-                               /*
-                                * The name pointer points to the next array.
-                                * Ick.
-                                */
-                               DE_CONST(catp->name, catp);
-                       else
-                               catp++;
-
-               catp->name = (void *)categories;
-               catp->id = UINT_MAX;
-       }
-
-       /*
-        * Update the id number of the category with its new global id.
-        */
-       for (catp = categories; catp->name != NULL; catp++)
-               catp->id = lctx->category_count++;
-}
-
-isc_logcategory_t *
-isc_log_categorybyname(isc_log_t *lctx, const char *name) {
-       isc_logcategory_t *catp;
-
-       REQUIRE(VALID_CONTEXT(lctx));
-       REQUIRE(name != NULL);
-
-       for (catp = lctx->categories; catp->name != NULL; )
-               if (catp->id == UINT_MAX)
-                       /*
-                        * catp is neither modified nor returned to the
-                        * caller, so removing its const qualifier is ok.
-                        */
-                       DE_CONST(catp->name, catp);
-               else {
-                       if (strcmp(catp->name, name) == 0)
-                               return (catp);
-                       catp++;
-               }
-
-       return (NULL);
-}
-
-void
-isc_log_registermodules(isc_log_t *lctx, isc_logmodule_t modules[]) {
-       isc_logmodule_t *modp;
-
-       REQUIRE(VALID_CONTEXT(lctx));
-       REQUIRE(modules != NULL && modules[0].name != NULL);
-
-       /*
-        * XXXDCL This somewhat sleazy situation of using the last pointer
-        * in one category array to point to the next array exists because
-        * this registration function returns void and I didn't want to have
-        * change everything that used it by making it return an isc_result_t.
-        * It would need to do that if it had to allocate memory to store
-        * pointers to each array passed in.
-        */
-       if (lctx->modules == NULL)
-               lctx->modules = modules;
-
-       else {
-               /*
-                * Adjust the last (NULL) pointer of the already registered
-                * modules to point to the incoming array.
-                */
-               for (modp = lctx->modules; modp->name != NULL; )
-                       if (modp->id == UINT_MAX)
-                               /*
-                                * The name pointer points to the next array.
-                                * Ick.
-                                */
-                               DE_CONST(modp->name, modp);
-                       else
-                               modp++;
-
-               modp->name = (void *)modules;
-               modp->id = UINT_MAX;
-       }
-
-       /*
-        * Update the id number of the module with its new global id.
-        */
-       for (modp = modules; modp->name != NULL; modp++)
-               modp->id = lctx->module_count++;
-}
-
-isc_logmodule_t *
-isc_log_modulebyname(isc_log_t *lctx, const char *name) {
-       isc_logmodule_t *modp;
-
-       REQUIRE(VALID_CONTEXT(lctx));
-       REQUIRE(name != NULL);
-
-       for (modp = lctx->modules; modp->name != NULL; )
-               if (modp->id == UINT_MAX)
-                       /*
-                        * modp is neither modified nor returned to the
-                        * caller, so removing its const qualifier is ok.
-                        */
-                       DE_CONST(modp->name, modp);
-               else {
-                       if (strcmp(modp->name, name) == 0)
-                               return (modp);
-                       modp++;
-               }
-
-       return (NULL);
-}
-
-isc_result_t
-isc_log_createchannel(isc_logconfig_t *lcfg, const char *name,
-                     unsigned int type, int level,
-                     const isc_logdestination_t *destination,
-                     unsigned int flags)
-{
-       isc_logchannel_t *channel;
-       isc_mem_t *mctx;
-
-       REQUIRE(VALID_CONFIG(lcfg));
-       REQUIRE(name != NULL);
-       REQUIRE(type == ISC_LOG_TOSYSLOG   || type == ISC_LOG_TOFILE ||
-               type == ISC_LOG_TOFILEDESC || type == ISC_LOG_TONULL);
-       REQUIRE(destination != NULL || type == ISC_LOG_TONULL);
-       REQUIRE(level >= ISC_LOG_CRITICAL);
-       REQUIRE((flags &
-                (unsigned int)~(ISC_LOG_PRINTALL | ISC_LOG_DEBUGONLY)) == 0);
-
-       /* XXXDCL find duplicate names? */
-
-       mctx = lcfg->lctx->mctx;
-
-       channel = isc_mem_get(mctx, sizeof(*channel));
-       if (channel == NULL)
-               return (ISC_R_NOMEMORY);
-
-       channel->name = isc_mem_strdup(mctx, name);
-       if (channel->name == NULL) {
-               isc_mem_put(mctx, channel, sizeof(*channel));
-               return (ISC_R_NOMEMORY);
-       }
-
-       channel->type = type;
-       channel->level = level;
-       channel->flags = flags;
-       ISC_LINK_INIT(channel, link);
-
-       switch (type) {
-       case ISC_LOG_TOSYSLOG:
-               FACILITY(channel) = destination->facility;
-               break;
-
-       case ISC_LOG_TOFILE:
-               /*
-                * The file name is copied because greatest_version wants
-                * to scribble on it, so it needs to be definitely in
-                * writable memory.
-                */
-               FILE_NAME(channel) =
-                       isc_mem_strdup(mctx, destination->file.name);
-               FILE_STREAM(channel) = NULL;
-               FILE_VERSIONS(channel) = destination->file.versions;
-               FILE_MAXSIZE(channel) = destination->file.maximum_size;
-               FILE_MAXREACHED(channel) = false;
-               break;
-
-       case ISC_LOG_TOFILEDESC:
-               FILE_NAME(channel) = NULL;
-               FILE_STREAM(channel) = destination->file.stream;
-               FILE_MAXSIZE(channel) = 0;
-               FILE_VERSIONS(channel) = ISC_LOG_ROLLNEVER;
-               break;
-
-       case ISC_LOG_TONULL:
-               /* Nothing. */
-               break;
-
-       default:
-               isc_mem_put(mctx, channel->name, strlen(channel->name) + 1);
-               isc_mem_put(mctx, channel, sizeof(*channel));
-               return (ISC_R_UNEXPECTED);
-       }
-
-       ISC_LIST_PREPEND(lcfg->channels, channel, link);
-
-       /*
-        * If default_stderr was redefined, make the default category
-        * point to the new default_stderr.
-        */
-       if (strcmp(name, "default_stderr") == 0)
-               default_channel.channel = channel;
-
-       return (ISC_R_SUCCESS);
-}
-
-isc_result_t
-isc_log_usechannel(isc_logconfig_t *lcfg, const char *name,
-                  const isc_logcategory_t *category,
-                  const isc_logmodule_t *module)
-{
-       isc_log_t *lctx;
-       isc_logchannel_t *channel;
-       isc_result_t result = ISC_R_SUCCESS;
-       unsigned int i;
-
-       REQUIRE(VALID_CONFIG(lcfg));
-       REQUIRE(name != NULL);
-
-       lctx = lcfg->lctx;
-
-       REQUIRE(category == NULL || category->id < lctx->category_count);
-       REQUIRE(module == NULL || module->id < lctx->module_count);
-
-       for (channel = ISC_LIST_HEAD(lcfg->channels); channel != NULL;
-            channel = ISC_LIST_NEXT(channel, link))
-               if (strcmp(name, channel->name) == 0)
-                       break;
-
-       if (channel == NULL)
-               return (ISC_R_NOTFOUND);
-
-       if (category != NULL)
-               result = assignchannel(lcfg, category->id, module, channel);
-
-       else
-               /*
-                * Assign to all categories.  Note that this includes
-                * the default channel.
-                */
-               for (i = 0; i < lctx->category_count; i++) {
-                       result = assignchannel(lcfg, i, module, channel);
-                       if (result != ISC_R_SUCCESS)
-                               break;
-               }
-
-       return (result);
-}
-
-void
-isc_log_write(isc_log_t *lctx, isc_logcategory_t *category,
-             isc_logmodule_t *module, int level, const char *format, ...)
-{
-       va_list args;
-
-       /*
-        * Contract checking is done in isc_log_doit().
-        */
-
-       va_start(args, format);
-       isc_log_doit(lctx, category, module, level, false,
-                    0, 0, format, args);
-       va_end(args);
-}
-
-void
-isc_log_vwrite(isc_log_t *lctx, isc_logcategory_t *category,
-              isc_logmodule_t *module, int level,
-              const char *format, va_list args)
-{
-       /*
-        * Contract checking is done in isc_log_doit().
-        */
-       isc_log_doit(lctx, category, module, level, false,
-                    0, 0, format, args);
-}
-
-void
-isc_log_write1(isc_log_t *lctx, isc_logcategory_t *category,
-              isc_logmodule_t *module, int level, const char *format, ...)
-{
-       va_list args;
-
-       /*
-        * Contract checking is done in isc_log_doit().
-        */
-
-       va_start(args, format);
-       isc_log_doit(lctx, category, module, level, true,
-                    0, 0, format, args);
-       va_end(args);
-}
-
-void
-isc_log_vwrite1(isc_log_t *lctx, isc_logcategory_t *category,
-               isc_logmodule_t *module, int level,
-               const char *format, va_list args)
-{
-       /*
-        * Contract checking is done in isc_log_doit().
-        */
-       isc_log_doit(lctx, category, module, level, true,
-                    0, 0, format, args);
-}
-
-void
-isc_log_setcontext(isc_log_t *lctx) {
-       isc_lctx = lctx;
-}
-
-void
-isc_log_setdebuglevel(isc_log_t *lctx, unsigned int level) {
-       isc_logchannel_t *channel;
-
-       REQUIRE(VALID_CONTEXT(lctx));
-
-       LOCK(&lctx->lock);
-
-       lctx->debug_level = level;
-       /*
-        * Close ISC_LOG_DEBUGONLY channels if level is zero.
-        */
-       if (lctx->debug_level == 0)
-               for (channel = ISC_LIST_HEAD(lctx->logconfig->channels);
-                    channel != NULL;
-                    channel = ISC_LIST_NEXT(channel, link))
-                       if (channel->type == ISC_LOG_TOFILE &&
-                           (channel->flags & ISC_LOG_DEBUGONLY) != 0 &&
-                           FILE_STREAM(channel) != NULL) {
-                               (void)fclose(FILE_STREAM(channel));
-                               FILE_STREAM(channel) = NULL;
-                       }
-       UNLOCK(&lctx->lock);
-}
-
-unsigned int
-isc_log_getdebuglevel(isc_log_t *lctx) {
-       REQUIRE(VALID_CONTEXT(lctx));
-
-       return (lctx->debug_level);
-}
-
-void
-isc_log_setduplicateinterval(isc_logconfig_t *lcfg, unsigned int interval) {
-       REQUIRE(VALID_CONFIG(lcfg));
-
-       lcfg->duplicate_interval = interval;
-}
-
-unsigned int
-isc_log_getduplicateinterval(isc_logconfig_t *lcfg) {
-       REQUIRE(VALID_CONTEXT(lcfg));
-
-       return (lcfg->duplicate_interval);
-}
-
-isc_result_t
-isc_log_settag(isc_logconfig_t *lcfg, const char *tag) {
-       REQUIRE(VALID_CONFIG(lcfg));
-
-       if (tag != NULL && *tag != '\0') {
-               if (lcfg->tag != NULL)
-                       isc_mem_free(lcfg->lctx->mctx, lcfg->tag);
-               lcfg->tag = isc_mem_strdup(lcfg->lctx->mctx, tag);
-               if (lcfg->tag == NULL)
-                       return (ISC_R_NOMEMORY);
-
-       } else {
-               if (lcfg->tag != NULL)
-                       isc_mem_free(lcfg->lctx->mctx, lcfg->tag);
-               lcfg->tag = NULL;
-       }
-
-       return (ISC_R_SUCCESS);
-}
-
-char *
-isc_log_gettag(isc_logconfig_t *lcfg) {
-       REQUIRE(VALID_CONFIG(lcfg));
-
-       return (lcfg->tag);
-}
-
-/* XXXDCL NT  -- This interface will assuredly be changing. */
-void
-isc_log_opensyslog(const char *tag, int options, int facility) {
-       (void)openlog(tag, options, facility);
-}
-
-void
-isc_log_closefilelogs(isc_log_t *lctx) {
-       isc_logchannel_t *channel;
-
-       REQUIRE(VALID_CONTEXT(lctx));
-
-       LOCK(&lctx->lock);
-       for (channel = ISC_LIST_HEAD(lctx->logconfig->channels);
-            channel != NULL;
-            channel = ISC_LIST_NEXT(channel, link))
-
-               if (channel->type == ISC_LOG_TOFILE &&
-                   FILE_STREAM(channel) != NULL) {
-                       (void)fclose(FILE_STREAM(channel));
-                       FILE_STREAM(channel) = NULL;
-               }
-       UNLOCK(&lctx->lock);
-}
-
-/****
- **** Internal functions
- ****/
-
-static isc_result_t
-assignchannel(isc_logconfig_t *lcfg, unsigned int category_id,
-             const isc_logmodule_t *module, isc_logchannel_t *channel)
-{
-       isc_logchannellist_t *new_item;
-       isc_log_t *lctx;
-       isc_result_t result;
-
-       REQUIRE(VALID_CONFIG(lcfg));
-
-       lctx = lcfg->lctx;
-
-       REQUIRE(category_id < lctx->category_count);
-       REQUIRE(module == NULL || module->id < lctx->module_count);
-       REQUIRE(channel != NULL);
-
-       /*
-        * Ensure lcfg->channellist_count == lctx->category_count.
-        */
-       result = sync_channellist(lcfg);
-       if (result != ISC_R_SUCCESS)
-               return (result);
-
-       new_item = isc_mem_get(lctx->mctx, sizeof(*new_item));
-       if (new_item == NULL)
-               return (ISC_R_NOMEMORY);
-
-       new_item->channel = channel;
-       new_item->module = module;
-       ISC_LIST_INITANDPREPEND(lcfg->channellists[category_id],
-                              new_item, link);
-
-       /*
-        * Remember the highest logging level set by any channel in the
-        * logging config, so isc_log_doit() can quickly return if the
-        * message is too high to be logged by any channel.
-        */
-       if (channel->type != ISC_LOG_TONULL) {
-               if (lcfg->highest_level < channel->level)
-                       lcfg->highest_level = channel->level;
-               if (channel->level == ISC_LOG_DYNAMIC)
-                       lcfg->dynamic = true;
-       }
-
-       return (ISC_R_SUCCESS);
-}
-
-/*
- * This would ideally be part of isc_log_registercategories(), except then
- * that function would have to return isc_result_t instead of void.
- */
-static isc_result_t
-sync_channellist(isc_logconfig_t *lcfg) {
-       unsigned int bytes;
-       isc_log_t *lctx;
-       void *lists;
-
-       REQUIRE(VALID_CONFIG(lcfg));
-
-       lctx = lcfg->lctx;
-
-       REQUIRE(lctx->category_count != 0);
-
-       if (lctx->category_count == lcfg->channellist_count)
-               return (ISC_R_SUCCESS);
-
-       bytes = lctx->category_count * sizeof(ISC_LIST(isc_logchannellist_t));
-
-       lists = isc_mem_get(lctx->mctx, bytes);
-
-       if (lists == NULL)
-               return (ISC_R_NOMEMORY);
-
-       memset(lists, 0, bytes);
-
-       if (lcfg->channellist_count != 0) {
-               bytes = lcfg->channellist_count *
-                       sizeof(ISC_LIST(isc_logchannellist_t));
-               memcpy(lists, lcfg->channellists, bytes);
-               isc_mem_put(lctx->mctx, lcfg->channellists, bytes);
-       }
-
-       lcfg->channellists = lists;
-       lcfg->channellist_count = lctx->category_count;
-
-       return (ISC_R_SUCCESS);
-}
-
-static isc_result_t
-greatest_version(isc_logchannel_t *channel, int *greatestp) {
-       /* XXXDCL HIGHLY NT */
-       char *basenam, *digit_end;
-       const char *dirname;
-       int version, greatest = -1;
-       unsigned int basenamelen;
-       DIR *dir;
-       struct dirent *entry;
-       char sep = '/';
-#ifdef _WIN32
-       char *basename2;
-#endif
-
-       REQUIRE(channel->type == ISC_LOG_TOFILE);
-
-       /*
-        * It is safe to DE_CONST the file.name because it was copied
-        * with isc_mem_strdup in isc_log_createchannel.
-        */
-       basenam = strrchr(FILE_NAME(channel), sep);
-#ifdef _WIN32
-       basename2 = strrchr(FILE_NAME(channel), '\\');
-       if ((basenam != NULL && basename2 != NULL && basename2 > basenam) ||
-           (basenam == NULL && basename2 != NULL)) {
-               basenam = basename2;
-               sep = '\\';
-       }
-#endif
-       if (basenam != NULL) {
-               *basenam++ = '\0';
-               dirname = FILE_NAME(channel);
-       } else {
-               DE_CONST(FILE_NAME(channel), basenam);
-               dirname = ".";
-       }
-       basenamelen = strlen(basenam);
-
-       dir = opendir(dirname);
-
-       /*
-        * Replace the file separator if it was taken out.
-        */
-       if (basenam != FILE_NAME(channel))
-               *(basenam - 1) = sep;
-
-       /*
-        * Return if the directory open failed.
-        */
-       if (dir == NULL) {
-               return ISC_R_FAILURE;
-       }
-
-       while ((entry = readdir(dir)) != NULL) {
-               if (strlen(entry->d_name) > basenamelen &&
-                   strncmp(entry->d_name, basenam, basenamelen) == 0 &&
-                   entry->d_name[basenamelen] == '.') {
-
-                       version = strtol(&entry->d_name[basenamelen + 1],
-                                        &digit_end, 10);
-                       if (*digit_end == '\0' && version > greatest)
-                               greatest = version;
-               }
-       }
-       closedir(dir);
-
-       *greatestp = ++greatest;
-
-       return (ISC_R_SUCCESS);
-}
-
-static isc_result_t
-roll_log(isc_logchannel_t *channel) {
-       int i, n, greatest;
-       char current[PATH_MAX + 1];
-       char new[PATH_MAX + 1];
-       const char *path;
-       isc_result_t result;
-
-       /*
-        * Do nothing (not even excess version trimming) if ISC_LOG_ROLLNEVER
-        * is specified.  Apparently complete external control over the log
-        * files is desired.
-        */
-       if (FILE_VERSIONS(channel) == ISC_LOG_ROLLNEVER)
-               return (ISC_R_SUCCESS);
-
-       path = FILE_NAME(channel);
-
-       /*
-        * Set greatest_version to the greatest existing version
-        * (not the maximum requested version).  This is 1 based even
-        * though the file names are 0 based, so an oldest log of log.1
-        * is a greatest_version of 2.
-        */
-       result = greatest_version(channel, &greatest);
-       if (result != ISC_R_SUCCESS)
-               return (result);
-
-       /*
-        * Now greatest should be set to the highest version number desired.
-        * Since the highest number is one less than FILE_VERSIONS(channel)
-        * when not doing infinite log rolling, greatest will need to be
-        * decremented when it is equal to -- or greater than --
-        * FILE_VERSIONS(channel).  When greatest is less than
-        * FILE_VERSIONS(channel), it is already suitable for use as
-        * the maximum version number.
-        */
-
-       if (FILE_VERSIONS(channel) == ISC_LOG_ROLLINFINITE ||
-           FILE_VERSIONS(channel) > greatest)
-               ;               /* Do nothing. */
-       else
-               /*
-                * When greatest is >= FILE_VERSIONS(channel), it needs to
-                * be reduced until it is FILE_VERSIONS(channel) - 1.
-                * Remove any excess logs on the way to that value.
-                */
-               while (--greatest >= FILE_VERSIONS(channel)) {
-                       n = snprintf(current, sizeof(current), "%s.%d",
-                                    path, greatest);
-                       if (n >= (int)sizeof(current) || n < 0)
-                               result = ISC_R_NOSPACE;
-                       else
-                               result = isc__errno2result(remove(current));
-                       if (result != ISC_R_SUCCESS &&
-                           result != ISC_R_FILENOTFOUND)
-                               syslog(LOG_ERR,
-                                      "unable to remove log file '%s.%d': %s",
-                                      path, greatest,
-                                      isc_result_totext(result));
-               }
-
-       for (i = greatest; i > 0; i--) {
-               result = ISC_R_SUCCESS;
-               n = snprintf(current, sizeof(current), "%s.%d", path, i - 1);
-               if (n >= (int)sizeof(current) || n < 0)
-                       result = ISC_R_NOSPACE;
-               if (result == ISC_R_SUCCESS) {
-                       n = snprintf(new, sizeof(new), "%s.%d", path, i);
-                       if (n >= (int)sizeof(new) || n < 0)
-                               result = ISC_R_NOSPACE;
-               }
-               if (result == ISC_R_SUCCESS)
-                   result = isc__errno2result(rename(current, new));
-               if (result != ISC_R_SUCCESS &&
-                   result != ISC_R_FILENOTFOUND)
-                       syslog(LOG_ERR,
-                              "unable to rename log file '%s.%d' to "
-                              "'%s.%d': %s", path, i - 1, path, i,
-                              isc_result_totext(result));
-       }
-
-       if (FILE_VERSIONS(channel) != 0) {
-               n = snprintf(new, sizeof(new), "%s.0", path);
-               if (n >= (int)sizeof(new) || n < 0)
-                       result = ISC_R_NOSPACE;
-               else
-                       result = isc__errno2result(rename(path, new));
-               if (result != ISC_R_SUCCESS &&
-                   result != ISC_R_FILENOTFOUND)
-                       syslog(LOG_ERR,
-                              "unable to rename log file '%s' to '%s.0': %s",
-                              path, path, isc_result_totext(result));
-       } else {
-           result = isc__errno2result(remove(path));
-               if (result != ISC_R_SUCCESS &&
-                   result != ISC_R_FILENOTFOUND)
-                       syslog(LOG_ERR, "unable to remove log file '%s': %s",
-                              path, isc_result_totext(result));
-       }
-
-       return (ISC_R_SUCCESS);
-}
-
-static isc_result_t
-isc_log_open(isc_logchannel_t *channel) {
-       struct stat statbuf;
-       bool regular_file;
-       bool roll = false;
-       isc_result_t result = ISC_R_SUCCESS;
-       const char *path;
-
-       REQUIRE(channel->type == ISC_LOG_TOFILE);
-       REQUIRE(FILE_STREAM(channel) == NULL);
-
-       path = FILE_NAME(channel);
-
-       REQUIRE(path != NULL && *path != '\0');
-
-       /*
-        * Determine type of file; only regular files will be
-        * version renamed, and only if the base file exists
-        * and either has no size limit or has reached its size limit.
-        */
-       /* coverity[fs_check_call] */
-       if (stat(path, &statbuf) == 0) {
-               regular_file = S_ISREG(statbuf.st_mode) ? true : false;
-               /* XXXDCL if not regular_file complain? */
-               if ((FILE_MAXSIZE(channel) == 0 &&
-                    FILE_VERSIONS(channel) != ISC_LOG_ROLLNEVER) ||
-                   (FILE_MAXSIZE(channel) > 0 &&
-                    statbuf.st_size >= FILE_MAXSIZE(channel)))
-                       roll = regular_file;
-       } else if (errno == ENOENT) {
-               regular_file = true;
-               POST(regular_file);
-       } else
-               result = ISC_R_INVALIDFILE;
-
-       /*
-        * Version control.
-        */
-       if (result == ISC_R_SUCCESS && roll) {
-               if (FILE_VERSIONS(channel) == ISC_LOG_ROLLNEVER)
-                       return (ISC_R_MAXSIZE);
-               result = roll_log(channel);
-               if (result != ISC_R_SUCCESS) {
-                       if ((channel->flags & ISC_LOG_OPENERR) == 0) {
-                               syslog(LOG_ERR,
-                                      "isc_log_open: roll_log '%s' "
-                                      "failed: %s",
-                                      FILE_NAME(channel),
-                                      isc_result_totext(result));
-                               channel->flags |= ISC_LOG_OPENERR;
-                       }
-                       return (result);
-               }
-       }
-
-       /* assumes we have POSIX underneath */
-       FILE_STREAM(channel) = fopen(path, "a");
-       if (FILE_STREAM(channel) == NULL)
-               return (isc__errno2result(errno));
-       return (ISC_R_SUCCESS);
-}
-
-bool
-isc_log_wouldlog(isc_log_t *lctx, int level) {
-       /*
-        * Try to avoid locking the mutex for messages which can't
-        * possibly be logged to any channels -- primarily debugging
-        * messages that the debug level is not high enough to print.
-        *
-        * If the level is (mathematically) less than or equal to the
-        * highest_level, or if there is a dynamic channel and the level is
-        * less than or equal to the debug level, the main loop must be
-        * entered to see if the message should really be output.
-        *
-        * NOTE: this is UNLOCKED access to the logconfig.  However,
-        * the worst thing that can happen is that a bad decision is made
-        * about returning without logging, and that's not a big concern,
-        * because that's a risk anyway if the logconfig is being
-        * dynamically changed.
-        */
-
-       if (lctx == NULL || lctx->logconfig == NULL)
-               return (false);
-
-       return (ISC_TF(level <= lctx->logconfig->highest_level ||
-                      (lctx->logconfig->dynamic &&
-                       level <= lctx->debug_level)));
-}
-
-static void
-isc_log_doit(isc_log_t *lctx, isc_logcategory_t *category,
-            isc_logmodule_t *module, int level, bool write_once,
-            int msgset, int msg,
-            const char *format, va_list args)
-{
-       int syslog_level;
-       char time_string[64];
-       char level_string[24];
-       size_t octets;
-       const char *iformat;
-       struct stat statbuf;
-       bool matched = false;
-       bool printtime, printtag;
-       bool printcategory, printmodule, printlevel;
-       isc_logconfig_t *lcfg;
-       isc_logchannel_t *channel;
-       isc_logchannellist_t *category_channels;
-       isc_result_t result;
-
-       UNUSED_ARG(msgset);
-       UNUSED_ARG(msg);
-
-       REQUIRE(lctx == NULL || VALID_CONTEXT(lctx));
-       REQUIRE(category != NULL);
-       REQUIRE(module != NULL);
-       REQUIRE(level != ISC_LOG_DYNAMIC);
-       REQUIRE(format != NULL);
-
-       /*
-        * Programs can use libraries that use this logging code without
-        * wanting to do any logging, thus the log context is allowed to
-        * be non-existent.
-        */
-       if (lctx == NULL)
-               return;
-
-       REQUIRE(category->id < lctx->category_count);
-       REQUIRE(module->id < lctx->module_count);
-
-       if (! isc_log_wouldlog(lctx, level))
-               return;
-
-       iformat = format;
-
-       time_string[0]  = '\0';
-       level_string[0] = '\0';
-
-       LOCK(&lctx->lock);
-
-       lctx->buffer[0] = '\0';
-
-       lcfg = lctx->logconfig;
-
-       category_channels = ISC_LIST_HEAD(lcfg->channellists[category->id]);
-
-       /*
-        * XXXDCL add duplicate filtering? (To not write multiple times to
-        * the same source via various channels).
-        */
-       do {
-               /*
-                * If the channel list end was reached and a match was made,
-                * everything is finished.
-                */
-               if (category_channels == NULL && matched)
-                       break;
-
-               if (category_channels == NULL && ! matched &&
-                   category_channels != ISC_LIST_HEAD(lcfg->channellists[0]))
-                       /*
-                        * No category/module pair was explicitly configured.
-                        * Try the category named "default".
-                        */
-                       category_channels =
-                               ISC_LIST_HEAD(lcfg->channellists[0]);
-
-               if (category_channels == NULL && ! matched)
-                       /*
-                        * No matching module was explicitly configured
-                        * for the category named "default".  Use the internal
-                        * default channel.
-                        */
-                       category_channels = &default_channel;
-
-               if (category_channels->module != NULL &&
-                   category_channels->module != module) {
-                       category_channels = ISC_LIST_NEXT(category_channels,
-                                                         link);
-                       continue;
-               }
-
-               matched = true;
-
-               channel = category_channels->channel;
-               category_channels = ISC_LIST_NEXT(category_channels, link);
-
-               if (((channel->flags & ISC_LOG_DEBUGONLY) != 0) &&
-                   lctx->debug_level == 0)
-                       continue;
-
-               if (channel->level == ISC_LOG_DYNAMIC) {
-                       if (lctx->debug_level < level)
-                               continue;
-               } else if (channel->level < level)
-                       continue;
-
-               if ((channel->flags & ISC_LOG_PRINTTIME) != 0 &&
-                   time_string[0] == '\0') {
-                       isc_time_t isctime;
-
-                       TIME_NOW(&isctime);
-                       isc_time_formattimestamp(&isctime, time_string,
-                                                sizeof(time_string));
-               }
-
-               if ((channel->flags & ISC_LOG_PRINTLEVEL) != 0 &&
-                   level_string[0] == '\0') {
-                       if (level < ISC_LOG_CRITICAL)
-                               snprintf(level_string, sizeof(level_string),
-                                        "level %d: ", level);
-                       else if (level > ISC_LOG_DYNAMIC)
-                               snprintf(level_string, sizeof(level_string),
-                                        "%s %d: ", log_level_strings[0],
-                                        level);
-                       else
-                               snprintf(level_string, sizeof(level_string),
-                                        "%s: ", log_level_strings[-level]);
-               }
-
-               /*
-                * Only format the message once.
-                */
-               if (lctx->buffer[0] == '\0') {
-                       (void)vsnprintf(lctx->buffer, sizeof(lctx->buffer),
-                                       iformat, args);
-
-                       /*
-                        * Check for duplicates.
-                        */
-                       if (write_once) {
-                               isc_logmessage_t *message, *new;
-                               isc_time_t oldest;
-                               isc_interval_t interval;
-
-                               isc_interval_set(&interval,
-                                                lcfg->duplicate_interval, 0);
-
-                               /*
-                                * 'oldest' is the age of the oldest messages
-                                * which fall within the duplicate_interval
-                                * range.
-                                */
-                               TIME_NOW(&oldest);
-                               if (isc_time_subtract(&oldest, &interval, &oldest)
-                                   != ISC_R_SUCCESS)
-                                       /*
-                                        * Can't effectively do the checking
-                                        * without having a valid time.
-                                        */
-                                       message = NULL;
-                               else
-                                       message =ISC_LIST_HEAD(lctx->messages);
-
-                               while (message != NULL) {
-                                       if (isc_time_compare(&message->time,
-                                                            &oldest) < 0) {
-                                               /*
-                                                * This message is older
-                                                * than the duplicate_interval,
-                                                * so it should be dropped from
-                                                * the history.
-                                                *
-                                                * Setting the interval to be
-                                                * to be longer will obviously
-                                                * not cause the expired
-                                                * message to spring back into
-                                                * existence.
-                                                */
-                                               new = ISC_LIST_NEXT(message,
-                                                                   link);
-
-                                               ISC_LIST_UNLINK(lctx->messages,
-                                                               message, link);
-
-                                               isc_mem_put(lctx->mctx,
-                                                       message,
-                                                       sizeof(*message) + 1 +
-                                                       strlen(message->text));
-
-                                               message = new;
-                                               continue;
-                                       }
-
-                                       /*
-                                        * This message is in the duplicate
-                                        * filtering interval ...
-                                        */
-                                       if (strcmp(lctx->buffer, message->text)
-                                           == 0) {
-                                               /*
-                                                * ... and it is a duplicate.
-                                                * Unlock the mutex and
-                                                * get the hell out of Dodge.
-                                                */
-                                               UNLOCK(&lctx->lock);
-                                               return;
-                                       }
-
-                                       message = ISC_LIST_NEXT(message, link);
-                               }
-
-                               /*
-                                * It wasn't in the duplicate interval,
-                                * so add it to the message list.
-                                */
-                               octets = strlen(lctx->buffer) + 1;
-                               new = isc_mem_get(lctx->mctx,
-                                                 sizeof(isc_logmessage_t) +
-                                                 octets);
-                               if (new != NULL) {
-                                       /*
-                                        * Put the text immediately after
-                                        * the struct.
-                                        */
-                                       new->text = (char *)(new + 1);
-                                       strlcpy(new->text, lctx->buffer, octets);
-
-                                       TIME_NOW(&new->time);
-
-                                       ISC_LIST_APPEND(lctx->messages,
-                                                       new, link);
-                               }
-                       }
-               }
-
-               printtime     = ISC_TF((channel->flags & ISC_LOG_PRINTTIME)
-                                      != 0);
-               printtag      = ISC_TF((channel->flags & ISC_LOG_PRINTTAG)
-                                      != 0 && lcfg->tag != NULL);
-               printcategory = ISC_TF((channel->flags & ISC_LOG_PRINTCATEGORY)
-                                      != 0);
-               printmodule   = ISC_TF((channel->flags & ISC_LOG_PRINTMODULE)
-                                      != 0);
-               printlevel    = ISC_TF((channel->flags & ISC_LOG_PRINTLEVEL)
-                                      != 0);
-
-               switch (channel->type) {
-               case ISC_LOG_TOFILE:
-                       if (FILE_MAXREACHED(channel)) {
-                               /*
-                                * If the file can be rolled, OR
-                                * If the file no longer exists, OR
-                                * If the file is less than the maximum size,
-                                *    (such as if it had been renamed and
-                                *     a new one touched, or it was truncated
-                                *     in place)
-                                * ... then close it to trigger reopening.
-                                */
-                               if (FILE_VERSIONS(channel) !=
-                                   ISC_LOG_ROLLNEVER ||
-                                   (stat(FILE_NAME(channel), &statbuf) != 0 &&
-                                    errno == ENOENT) ||
-                                   statbuf.st_size < FILE_MAXSIZE(channel)) {
-                                       (void)fclose(FILE_STREAM(channel));
-                                       FILE_STREAM(channel) = NULL;
-                                       FILE_MAXREACHED(channel) = false;
-                               } else
-                                       /*
-                                        * Eh, skip it.
-                                        */
-                                       break;
-                       }
-
-                       if (FILE_STREAM(channel) == NULL) {
-                               result = isc_log_open(channel);
-                               if (result != ISC_R_SUCCESS &&
-                                   result != ISC_R_MAXSIZE &&
-                                   (channel->flags & ISC_LOG_OPENERR) == 0) {
-                                       syslog(LOG_ERR,
-                                              "isc_log_open '%s' failed: %s",
-                                              FILE_NAME(channel),
-                                              isc_result_totext(result));
-                                       channel->flags |= ISC_LOG_OPENERR;
-                               }
-                               if (result != ISC_R_SUCCESS)
-                                       break;
-                               channel->flags &= ~ISC_LOG_OPENERR;
-                       }
-                       /* FALLTHROUGH */
-
-               case ISC_LOG_TOFILEDESC:
-                       fprintf(FILE_STREAM(channel), "%s%s%s%s%s%s%s%s%s%s\n",
-                               printtime     ? time_string     : "",
-                               printtime     ? " "           : "",
-                               printtag      ? lcfg->tag    : "",
-                               printtag      ? ": "          : "",
-                               printcategory ? category->name       : "",
-                               printcategory ? ": "          : "",
-                               printmodule   ? (module != NULL ? module->name
-                                                               : "no_module")
-                                                               : "",
-                               printmodule   ? ": "          : "",
-                               printlevel    ? level_string    : "",
-                               lctx->buffer);
-
-                       fflush(FILE_STREAM(channel));
-
-                       /*
-                        * If the file now exceeds its maximum size
-                        * threshold, note it so that it will not be logged
-                        * to any more.
-                        */
-                       if (FILE_MAXSIZE(channel) > 0) {
-                               INSIST(channel->type == ISC_LOG_TOFILE);
-
-                               /* XXXDCL NT fstat/fileno */
-                               /* XXXDCL complain if fstat fails? */
-                               if (fstat(fileno(FILE_STREAM(channel)),
-                                         &statbuf) >= 0 &&
-                                   statbuf.st_size > FILE_MAXSIZE(channel))
-                                       FILE_MAXREACHED(channel) = true;
-                       }
-
-                       break;
-
-               case ISC_LOG_TOSYSLOG:
-                       if (level > 0)
-                               syslog_level = LOG_DEBUG;
-                       else if (level < ISC_LOG_CRITICAL)
-                               syslog_level = LOG_CRIT;
-                       else
-                               syslog_level = syslog_map[-level];
-
-                       (void)syslog(FACILITY(channel) | syslog_level,
-                              "%s%s%s%s%s%s%s%s%s%s",
-                              printtime     ? time_string      : "",
-                              printtime     ? " "            : "",
-                              printtag      ? lcfg->tag     : "",
-                              printtag      ? ": "           : "",
-                              printcategory ? category->name        : "",
-                              printcategory ? ": "           : "",
-                              printmodule   ? (module != NULL  ? module->name
-                                                               : "no_module")
-                                                               : "",
-                              printmodule   ? ": "           : "",
-                              printlevel    ? level_string     : "",
-                              lctx->buffer);
-                       break;
-
-               case ISC_LOG_TONULL:
-                       break;
-
-               }
-
-       } while (1);
-
-       UNLOCK(&lctx->lock);
-}
</span></code></pre>

<br>
</li>
<li id='diff-2'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/daa3a36abe9a4e087b2007a293cbbae3af18cb2c#diff-2'>
<strong>
libisc/unix/ifiter_getifaddrs.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/libisc/unix/ifiter_getifaddrs.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/libisc/unix/ifiter_getifaddrs.c
</span><span style="color: #aaaaaa">@@ -68,9 +68,10 @@ isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp) {
</span>           iter->proc = fopen("/proc/net/if_inet6", "r");
                if (iter->proc == NULL) {
                        ISC_IGNORE(strerror_r(errno, strbuf, sizeof(strbuf)));
<span style="color: #000000;background-color: #ffdddd">-                        isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
</span><span style="color: #000000;background-color: #ddffdd">+/*                 isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
</span>                                 ISC_LOGMODULE_SOCKET, ISC_LOG_WARNING,
                                      "failed to open /proc/net/if_inet6");
<span style="color: #000000;background-color: #ddffdd">+*/
</span>           }
        } else
                iter->proc = NULL;
</code></pre>

<br>
</li>
<li id='diff-3'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/daa3a36abe9a4e087b2007a293cbbae3af18cb2c#diff-3'>
<strong>
libisc/unix/include/isc/time.h
</strong>
deleted
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/libisc/unix/include/isc/time.h
</span><span style="color: #000000;background-color: #ddffdd">+++ /dev/null
</span><span style="color: #aaaaaa">@@ -1,324 +0,0 @@
</span><span style="color: #000000;background-color: #ffdddd">-/*
- * Copyright (C) 2004-2009  Internet Systems Consortium, Inc. ("ISC")
- * Copyright (C) 1998-2001  Internet Software Consortium.
- * Copyright 2015 by the NTPsec project contributors
- * SPDX-License-Identifier: ISC
- */
-
-#ifndef GUARD_ISC_TIME_H
-#define GUARD_ISC_TIME_H 1
-
-/*! \file */
-
-#include <time.h>
-
-#include <isc/lang.h>
-#include <isc/types.h>
-
-/***
- *** Intervals
- ***/
-
-/*!
- *  \brief
- * The contents of this structure are private, and MUST NOT be accessed
- * directly by callers.
- *
- * The contents are exposed only to allow callers to avoid dynamic allocation.
- */
-struct isc_interval {
-       unsigned int seconds;
-       unsigned int nanoseconds;
-};
-
-extern isc_interval_t *isc_interval_zero;
-
-ISC_LANG_BEGINDECLS
-
-void
-isc_interval_set(isc_interval_t *i,
-                unsigned int seconds, unsigned int nanoseconds);
-/*%<
- * Set 'i' to a value representing an interval of 'seconds' seconds and
- * 'nanoseconds' nanoseconds, suitable for use in isc_time_add() and
- * isc_time_subtract().
- *
- * Requires:
- *
- *\li  't' is a valid pointer.
- *\li  nanoseconds < 1000000000.
- */
-
-bool
-isc_interval_iszero(const isc_interval_t *i);
-/*%<
- * Returns true iff. 'i' is the zero interval.
- *
- * Requires:
- *
- *\li  'i' is a valid pointer.
- */
-
-/***
- *** Absolute Times
- ***/
-
-/*%
- * The contents of this structure are private, and MUST NOT be accessed
- * directly by callers.
- *
- * The contents are exposed only to allow callers to avoid dynamic allocation.
- */
-
-struct isc_time {
-       unsigned int    seconds;
-       unsigned int    nanoseconds;
-};
-
-extern isc_time_t *isc_time_epoch;
-
-void
-isc_time_set(isc_time_t *t, unsigned int seconds, unsigned int nanoseconds);
-/*%<
- * Set 't' to a value which represents the given number of seconds and
- * nanoseconds since 00:00:00 January 1, 1970, UTC.
- *
- * Notes:
- *\li  The Unix version of this call is equivalent to:
- *\code
- *     isc_time_settoepoch(t);
- *     isc_interval_set(i, seconds, nanoseconds);
- *     isc_time_add(t, i, t);
- *\endcode
- *
- * Requires:
- *\li  't' is a valid pointer.
- *\li  nanoseconds < 1000000000.
- */
-
-void
-isc_time_settoepoch(isc_time_t *t);
-/*%<
- * Set 't' to the time of the epoch.
- *
- * Notes:
- *\li  The date of the epoch is platform-dependent.
- *
- * Requires:
- *
- *\li  't' is a valid pointer.
- */
-
-bool
-isc_time_isepoch(const isc_time_t *t);
-/*%<
- * Returns true iff. 't' is the epoch ("time zero").
- *
- * Requires:
- *
- *\li  't' is a valid pointer.
- */
-
-isc_result_t
-isc_time_now(isc_time_t *t);
-/*%<
- * Set 't' to the current absolute time.
- *
- * Requires:
- *
- *\li  't' is a valid pointer.
- *
- * Returns:
- *
- *\li  Success
- *\li  Unexpected error
- *             Getting the time from the system failed.
- *\li  Out of range
- *             The time from the system is too large to be represented
- *             in the current definition of isc_time_t.
- */
-
-isc_result_t
-isc_time_nowplusinterval(isc_time_t *t, const isc_interval_t *i);
-/*%<
- * Set *t to the current absolute time + i.
- *
- * Note:
- *\li  This call is equivalent to:
- *
- *\code
- *             isc_time_now(t);
- *             isc_time_add(t, i, t);
- *\endcode
- *
- * Requires:
- *
- *\li  't' and 'i' are valid pointers.
- *
- * Returns:
- *
- *\li  Success
- *\li  Unexpected error
- *             Getting the time from the system failed.
- *\li  Out of range
- *             The interval added to the time from the system is too large to
- *             be represented in the current definition of isc_time_t.
- */
-
-int
-isc_time_compare(const isc_time_t *t1, const isc_time_t *t2);
-/*%<
- * Compare the times referenced by 't1' and 't2'
- *
- * Requires:
- *
- *\li  't1' and 't2' are valid pointers.
- *
- * Returns:
- *
- *\li  -1              t1 < t2              (comparing times, not pointers)
- *\li  0               t1 = t2
- *\li  1               t1 > t2
- */
-
-isc_result_t
-isc_time_add(const isc_time_t *t, const isc_interval_t *i, isc_time_t *result);
-/*%<
- * Add 'i' to 't', storing the result in 'result'.
- *
- * Requires:
- *
- *\li  't', 'i', and 'result' are valid pointers.
- *
- * Returns:
- *\li  Success
- *\li  Out of range
- *             The interval added to the time is too large to
- *             be represented in the current definition of isc_time_t.
- */
-
-isc_result_t
-isc_time_subtract(const isc_time_t *t, const isc_interval_t *i,
-                 isc_time_t *result);
-/*%<
- * Subtract 'i' from 't', storing the result in 'result'.
- *
- * Requires:
- *
- *\li  't', 'i', and 'result' are valid pointers.
- *
- * Returns:
- *\li  Success
- *\li  Out of range
- *             The interval is larger than the time since the epoch.
- */
-
-uint64_t
-isc_time_microdiff(const isc_time_t *t1, const isc_time_t *t2);
-/*%<
- * Find the difference in microseconds between time t1 and time t2.
- * t2 is the subtrahend of t1; ie, difference = t1 - t2.
- *
- * Requires:
- *
- *\li  't1' and 't2' are valid pointers.
- *
- * Returns:
- *\li  The difference of t1 - t2, or 0 if t1 <= t2.
- */
-
-uint32_t
-isc_time_seconds(const isc_time_t *t);
-/*%<
- * Return the number of seconds since the epoch stored in a time structure.
- *
- * Requires:
- *
- *\li  't' is a valid pointer.
- */
-
-isc_result_t
-isc_time_secondsastimet(const isc_time_t *t, time_t *secondsp);
-/*%<
- * Ensure the number of seconds in an isc_time_t is representable by a time_t.
- *
- * Notes:
- *\li  The number of seconds stored in an isc_time_t might be larger
- *     than the number of seconds a time_t is able to handle.  Since
- *     time_t is mostly opaque according to the ANSI/ISO standard
- *     (essentially, all you can be sure of is that it is an arithmetic type,
- *     not even necessarily integral), it can be tricky to ensure that
- *     the isc_time_t is in the range a time_t can handle.  Use this
- *     function in place of isc_time_seconds() any time you need to set a
- *     time_t from an isc_time_t.
- *
- * Requires:
- *\li  't' is a valid pointer.
- *
- * Returns:
- *\li  Success
- *\li  Out of range
- */
-
-uint32_t
-isc_time_nanoseconds(const isc_time_t *t);
-/*%<
- * Return the number of nanoseconds stored in a time structure.
- *
- * Notes:
- *\li  This is the number of nanoseconds in excess of the number
- *     of seconds since the epoch; it will always be less than one
- *     full second.
- *
- * Requires:
- *\li  't' is a valid pointer.
- *
- * Ensures:
- *\li  The returned value is less than 1*10^9.
- */
-
-void
-isc_time_formattimestamp(const isc_time_t *t, char *buf, unsigned int len);
-/*%<
- * Format the time 't' into the buffer 'buf' of length 'len',
- * using a format like "30-Aug-2000 04:06:47.997" and the local time zone.
- * If the text does not fit in the buffer, the result is indeterminate,
- * but is always guaranteed to be null terminated.
- *
- *  Requires:
- *\li      'len' > 0
- *\li      'buf' points to an array of at least len chars
- *
- */
-
-void
-isc_time_formathttptimestamp(const isc_time_t *t, char *buf, unsigned int len);
-/*%<
- * Format the time 't' into the buffer 'buf' of length 'len',
- * using a format like "Mon, 30 Aug 2000 04:06:47 GMT"
- * If the text does not fit in the buffer, the result is indeterminate,
- * but is always guaranteed to be null terminated.
- *
- *  Requires:
- *\li      'len' > 0
- *\li      'buf' points to an array of at least len chars
- *
- */
-
-void
-isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len);
-/*%<
- * Format the time 't' into the buffer 'buf' of length 'len',
- * using the ISO8601 format: "yyyy-mm-ddThh:mm:ssZ"
- * If the text does not fit in the buffer, the result is indeterminate,
- * but is always guaranteed to be null terminated.
- *
- *  Requires:
- *\li      'len' > 0
- *\li      'buf' points to an array of at least len chars
- *
- */
-
-ISC_LANG_ENDDECLS
-
-#endif /* GUARD_ISC_TIME_H */
</span></code></pre>

<br>
</li>
<li id='diff-4'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/daa3a36abe9a4e087b2007a293cbbae3af18cb2c#diff-4'>
<strong>
libisc/unix/interfaceiter.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/libisc/unix/interfaceiter.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/libisc/unix/interfaceiter.c
</span><span style="color: #aaaaaa">@@ -21,7 +21,6 @@
</span> #include <errno.h>
 
 #include <isc/interfaceiter.h>
<span style="color: #000000;background-color: #ffdddd">-#include <isc/log.h>
</span> #include <isc/magic.h>
 #include <isc/mem.h>
 #include <isc/net.h>
<span style="color: #aaaaaa">@@ -182,25 +181,28 @@ linux_if_inet6_current(isc_interfaceiter_t *iter) {
</span>   if (iter->valid != ISC_R_SUCCESS)
                return (iter->valid);
        if (iter->proc == NULL) {
<span style="color: #000000;background-color: #ffdddd">-                isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
</span><span style="color: #000000;background-color: #ddffdd">+/*         isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
</span>                         ISC_LOGMODULE_INTERFACE, ISC_LOG_ERROR,
                              "/proc/net/if_inet6:iter->proc == NULL");
<span style="color: #000000;background-color: #ddffdd">+*/
</span>           return (ISC_R_FAILURE);
        }
 
        res = sscanf(iter->entry, "%32[a-f0-9] %x %x %x %x %16s\n",
                     address, &ifindex, &prefix, &scope, &flags, name);
        if (res != 6) {
<span style="color: #000000;background-color: #ffdddd">-                isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
</span><span style="color: #000000;background-color: #ddffdd">+/*         isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
</span>                         ISC_LOGMODULE_INTERFACE, ISC_LOG_ERROR,
                              "/proc/net/if_inet6:sscanf() -> %d (expected 6)",
                              res);
<span style="color: #000000;background-color: #ddffdd">+*/
</span>           return (ISC_R_FAILURE);
        }
        if (strlen(address) != 32) {
<span style="color: #000000;background-color: #ffdddd">-                isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
</span><span style="color: #000000;background-color: #ddffdd">+/*         isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
</span>                         ISC_LOGMODULE_INTERFACE, ISC_LOG_ERROR,
                              "/proc/net/if_inet6:strlen(%s) != 32", address);
<span style="color: #000000;background-color: #ddffdd">+*/
</span>           return (ISC_R_FAILURE);
        }
        /*
</code></pre>

<br>
</li>
<li id='diff-5'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/daa3a36abe9a4e087b2007a293cbbae3af18cb2c#diff-5'>
<strong>
libisc/unix/net.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/libisc/unix/net.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/libisc/unix/net.c
</span><span style="color: #aaaaaa">@@ -7,6 +7,7 @@
</span> 
 #include <config.h>
 
<span style="color: #000000;background-color: #ddffdd">+#include <stdio.h>
</span> #include <sys/types.h>
 
 #if defined(HAVE_SYS_SYSCTL_H)
<span style="color: #aaaaaa">@@ -17,7 +18,6 @@
</span> #include <unistd.h>
 #include <string.h>
 
<span style="color: #000000;background-color: #ffdddd">-#include <isc/log.h>
</span> #include <isc/net.h>
 #include <isc/once.h>
 #include <isc/util.h>
<span style="color: #aaaaaa">@@ -133,19 +133,20 @@ try_proto(int domain) {
</span>           len = sizeof(sin6);
                if (getsockname(s, (struct sockaddr *)&sin6, &len) < 0)
                {
<span style="color: #000000;background-color: #ffdddd">-                        isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
</span><span style="color: #000000;background-color: #ddffdd">+/*                 isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
</span>                                 ISC_LOGMODULE_SOCKET, ISC_LOG_ERROR,
                                      "retrieving the address of an IPv6 "
                                      "socket from the kernel failed.");
                        isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
                                      ISC_LOGMODULE_SOCKET, ISC_LOG_ERROR,
                                      "IPv6 is not supported.");
<span style="color: #000000;background-color: #ddffdd">+*/
</span>                   result = ISC_R_NOTFOUND;
                } else {
                        if (len == sizeof(struct sockaddr_in6))
                                result = ISC_R_SUCCESS;
                        else {
<span style="color: #000000;background-color: #ffdddd">-                                isc_log_write(isc_lctx,
</span><span style="color: #000000;background-color: #ddffdd">+/*                         isc_log_write(isc_lctx,
</span>                                         ISC_LOGCATEGORY_GENERAL,
                                              ISC_LOGMODULE_SOCKET,
                                              ISC_LOG_ERROR,
<span style="color: #aaaaaa">@@ -156,6 +157,7 @@ try_proto(int domain) {
</span>                                         ISC_LOGMODULE_SOCKET,
                                              ISC_LOG_ERROR,
                                              "IPv6 is not supported.");
<span style="color: #000000;background-color: #ddffdd">+*/
</span>                           result = ISC_R_NOTFOUND;
                        }
                }
</code></pre>

<br>
</li>
<li id='diff-6'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/daa3a36abe9a4e087b2007a293cbbae3af18cb2c#diff-6'>
<strong>
libisc/unix/time.c
</strong>
deleted
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/libisc/unix/time.c
</span><span style="color: #000000;background-color: #ddffdd">+++ /dev/null
</span><span style="color: #aaaaaa">@@ -1,413 +0,0 @@
</span><span style="color: #000000;background-color: #ffdddd">-/*
- * Copyright (C) 2004-2008, 2011, 2012  Internet Systems Consortium, Inc. ("ISC")
- * Copyright (C) 1998-2001, 2003  Internet Software Consortium.
- *
- * Copyright 2015 by the NTPsec project contributors
- * SPDX-License-Identifier: ISC
- */
-
-/* $Id$ */
-
-/*! \file */
-
-#include <config.h>
-
-#include <errno.h>
-#include <limits.h>
-#include <syslog.h>
-#include <time.h>
-#include <string.h>
-
-#include <sys/time.h>    /* Required for struct timeval on some platforms. */
-
-#include <isc/log.h>
-#include <isc/time.h>
-#include <isc/util.h>
-
-#define NS_PER_S       1000000000      /*%< Nanoseconds per second. */
-#define NS_PER_US      1000            /*%< Nanoseconds per microsecond. */
-#define US_PER_S       1000000         /*%< Microseconds per second. */
-
-/*
- * All of the INSIST()s checks of nanoseconds < NS_PER_S are for
- * consistency checking of the type. In lieu of magic numbers, it
- * is the best we've got.  The check is only performed on functions which
- * need an initialized type.
- */
-
-#ifndef ISC_FIX_TV_USEC
-#define ISC_FIX_TV_USEC 1
-#endif
-
-/*%
- *** Intervals
- ***/
-
-static isc_interval_t zero_interval = { 0, 0 };
-isc_interval_t *isc_interval_zero = &zero_interval;
-
-#if ISC_FIX_TV_USEC
-static inline void
-fix_tv_usec(struct timeval *tv) {
-       bool fixed = false;
-
-       if (tv->tv_usec < 0) {
-               fixed = true;
-               do {
-                       tv->tv_sec -= 1;
-                       tv->tv_usec += US_PER_S;
-               } while (tv->tv_usec < 0);
-       } else if (tv->tv_usec >= US_PER_S) {
-               fixed = true;
-               do {
-                       tv->tv_sec += 1;
-                       tv->tv_usec -= US_PER_S;
-               } while (tv->tv_usec >=US_PER_S);
-       }
-       /*
-        * Call syslog directly as was are called from the logging functions.
-        */
-       if (fixed)
-               (void)syslog(LOG_ERR, "gettimeofday returned bad tv_usec: corrected");
-}
-#endif
-
-void
-isc_interval_set(isc_interval_t *i,
-                unsigned int seconds, unsigned int nanoseconds)
-{
-       REQUIRE(i != NULL);
-       REQUIRE(nanoseconds < NS_PER_S);
-
-       i->seconds = seconds;
-       i->nanoseconds = nanoseconds;
-}
-
-bool
-isc_interval_iszero(const isc_interval_t *i) {
-       REQUIRE(i != NULL);
-       INSIST(i->nanoseconds < NS_PER_S);
-
-       if (i->seconds == 0 && i->nanoseconds == 0)
-               return (true);
-
-       return (false);
-}
-
-
-/***
- *** Absolute Times
- ***/
-
-static isc_time_t epoch = { 0, 0 };
-isc_time_t *isc_time_epoch = &epoch;
-
-void
-isc_time_set(isc_time_t *t, unsigned int seconds, unsigned int nanoseconds) {
-       REQUIRE(t != NULL);
-       REQUIRE(nanoseconds < NS_PER_S);
-
-       t->seconds = seconds;
-       t->nanoseconds = nanoseconds;
-}
-
-void
-isc_time_settoepoch(isc_time_t *t) {
-       REQUIRE(t != NULL);
-
-       t->seconds = 0;
-       t->nanoseconds = 0;
-}
-
-bool
-isc_time_isepoch(const isc_time_t *t) {
-       REQUIRE(t != NULL);
-       INSIST(t->nanoseconds < NS_PER_S);
-
-       if (t->seconds == 0 && t->nanoseconds == 0)
-               return (true);
-
-       return (false);
-}
-
-
-isc_result_t
-isc_time_now(isc_time_t *t) {
-       struct timeval tv;
-       char strbuf[BUFSIZ];
-
-       REQUIRE(t != NULL);
-
-       if (gettimeofday(&tv, NULL) == -1) {
-               ISC_IGNORE(strerror_r(errno, strbuf, sizeof(strbuf)));
-               UNEXPECTED_ERROR(__FILE__, __LINE__, "%s", strbuf);
-               return (ISC_R_UNEXPECTED);
-       }
-
-       /*
-        * Does POSIX guarantee the signedness of tv_sec and tv_usec?  If not,
-        * then this test will generate warnings for platforms on which it is
-        * unsigned.  In any event, the chances of any of these problems
-        * happening are pretty much zero, but since the libisc library ensures
-        * certain things to be true ...
-        */
-#if ISC_FIX_TV_USEC
-       fix_tv_usec(&tv);
-       if (tv.tv_sec < 0)
-               return (ISC_R_UNEXPECTED);
-#else
-       if (tv.tv_sec < 0 || tv.tv_usec < 0 || tv.tv_usec >= US_PER_S)
-               return (ISC_R_UNEXPECTED);
-#endif
-
-       /*
-        * Ensure the tv_sec value fits in t->seconds.
-        */
-       if (sizeof(tv.tv_sec) > sizeof(t->seconds) &&
-           ((tv.tv_sec | (unsigned int)-1) ^ (unsigned int)-1) != 0U)
-               return (ISC_R_RANGE);
-
-       t->seconds = tv.tv_sec;
-       t->nanoseconds = tv.tv_usec * NS_PER_US;
-
-       return (ISC_R_SUCCESS);
-}
-
-isc_result_t
-isc_time_nowplusinterval(isc_time_t *t, const isc_interval_t *i) {
-       struct timeval tv;
-       char strbuf[BUFSIZ];
-
-       REQUIRE(t != NULL);
-       REQUIRE(i != NULL);
-       INSIST(i->nanoseconds < NS_PER_S);
-
-       if (gettimeofday(&tv, NULL) == -1) {
-               ISC_IGNORE(strerror_r(errno, strbuf, sizeof(strbuf)));
-               UNEXPECTED_ERROR(__FILE__, __LINE__, "%s", strbuf);
-               return (ISC_R_UNEXPECTED);
-       }
-
-       /*
-        * Does POSIX guarantee the signedness of tv_sec and tv_usec?  If not,
-        * then this test will generate warnings for platforms on which it is
-        * unsigned.  In any event, the chances of any of these problems
-        * happening are pretty much zero, but since the libisc library ensures
-        * certain things to be true ...
-        */
-#if ISC_FIX_TV_USEC
-       fix_tv_usec(&tv);
-       if (tv.tv_sec < 0)
-               return (ISC_R_UNEXPECTED);
-#else
-       if (tv.tv_sec < 0 || tv.tv_usec < 0 || tv.tv_usec >= US_PER_S)
-               return (ISC_R_UNEXPECTED);
-#endif
-
-       /*
-        * Ensure the resulting seconds value fits in the size of an
-        * unsigned int.  (It is written this way as a slight optimization;
-        * note that even if both values == INT_MAX, then when added
-        * and getting another 1 added below the result is UINT_MAX.)
-        */
-       if ((tv.tv_sec > INT_MAX || i->seconds > INT_MAX) &&
-           ((long long)tv.tv_sec + i->seconds > UINT_MAX))
-               return (ISC_R_RANGE);
-
-       t->seconds = tv.tv_sec + i->seconds;
-       t->nanoseconds = tv.tv_usec * NS_PER_US + i->nanoseconds;
-       if (t->nanoseconds >= NS_PER_S) {
-               t->seconds++;
-               t->nanoseconds -= NS_PER_S;
-       }
-
-       return (ISC_R_SUCCESS);
-}
-
-int
-isc_time_compare(const isc_time_t *t1, const isc_time_t *t2) {
-       REQUIRE(t1 != NULL && t2 != NULL);
-       INSIST(t1->nanoseconds < NS_PER_S && t2->nanoseconds < NS_PER_S);
-
-       if (t1->seconds < t2->seconds)
-               return (-1);
-       if (t1->seconds > t2->seconds)
-               return (1);
-       if (t1->nanoseconds < t2->nanoseconds)
-               return (-1);
-       if (t1->nanoseconds > t2->nanoseconds)
-               return (1);
-       return (0);
-}
-
-isc_result_t
-isc_time_add(const isc_time_t *t, const isc_interval_t *i, isc_time_t *result)
-{
-       REQUIRE(t != NULL && i != NULL && result != NULL);
-       INSIST(t->nanoseconds < NS_PER_S && i->nanoseconds < NS_PER_S);
-
-       /*
-        * Ensure the resulting seconds value fits in the size of an
-        * unsigned int.  (It is written this way as a slight optimization;
-        * note that even if both values == INT_MAX, then when added
-        * and getting another 1 added below the result is UINT_MAX.)
-        */
-       if ((t->seconds > INT_MAX || i->seconds > INT_MAX) &&
-           ((long long)t->seconds + i->seconds > UINT_MAX))
-               return (ISC_R_RANGE);
-
-       result->seconds = t->seconds + i->seconds;
-       result->nanoseconds = t->nanoseconds + i->nanoseconds;
-       if (result->nanoseconds >= NS_PER_S) {
-               result->seconds++;
-               result->nanoseconds -= NS_PER_S;
-       }
-
-       return (ISC_R_SUCCESS);
-}
-
-isc_result_t
-isc_time_subtract(const isc_time_t *t, const isc_interval_t *i,
-                 isc_time_t *result)
-{
-       REQUIRE(t != NULL && i != NULL && result != NULL);
-       INSIST(t->nanoseconds < NS_PER_S && i->nanoseconds < NS_PER_S);
-
-       if ((unsigned int)t->seconds < i->seconds ||
-           ((unsigned int)t->seconds == i->seconds &&
-            t->nanoseconds < i->nanoseconds))
-           return (ISC_R_RANGE);
-
-       result->seconds = t->seconds - i->seconds;
-       if (t->nanoseconds >= i->nanoseconds)
-               result->nanoseconds = t->nanoseconds - i->nanoseconds;
-       else {
-               result->nanoseconds = NS_PER_S - i->nanoseconds +
-                       t->nanoseconds;
-               result->seconds--;
-       }
-
-       return (ISC_R_SUCCESS);
-}
-
-uint64_t
-isc_time_microdiff(const isc_time_t *t1, const isc_time_t *t2) {
-       uint64_t i1, i2, i3;
-
-       REQUIRE(t1 != NULL && t2 != NULL);
-       INSIST(t1->nanoseconds < NS_PER_S && t2->nanoseconds < NS_PER_S);
-
-       i1 = (uint64_t)t1->seconds * NS_PER_S + t1->nanoseconds;
-       i2 = (uint64_t)t2->seconds * NS_PER_S + t2->nanoseconds;
-
-       if (i1 <= i2)
-               return (0);
-
-       i3 = i1 - i2;
-
-       /*
-        * Convert to microseconds.
-        */
-       i3 /= NS_PER_US;
-
-       return (i3);
-}
-
-uint32_t
-isc_time_seconds(const isc_time_t *t) {
-       REQUIRE(t != NULL);
-       INSIST(t->nanoseconds < NS_PER_S);
-
-       return ((uint32_t)t->seconds);
-}
-
-isc_result_t
-isc_time_secondsastimet(const isc_time_t *t, time_t *secondsp) {
-       time_t seconds;
-
-       REQUIRE(t != NULL);
-       INSIST(t->nanoseconds < NS_PER_S);
-
-       /*
-        * Ensure that the number of seconds represented by t->seconds
-        * can be represented by a time_t.  Since t->seconds is an unsigned
-        * int and since time_t is mostly opaque, this is trickier than
-        * it seems.  (This standardized opaqueness of time_t is *very*
-        * frustrating; time_t is not even limited to being an integral
-        * type.)
-        *
-        * The mission, then, is to avoid generating any kind of warning
-        * about "signed versus unsigned" while trying to determine if the
-        * the unsigned int t->seconds is out range for tv_sec, which is
-        * pretty much only true if time_t is a signed integer of the same
-        * size as the return value of isc_time_seconds.
-        *
-        * If the paradox in the if clause below is true, t->seconds is out
-        * of range for time_t.
-        */
-       seconds = (time_t)t->seconds;
-
-       INSIST(sizeof(unsigned int) == sizeof(uint32_t));
-       INSIST(sizeof(time_t) >= sizeof(uint32_t));
-
-       if (t->seconds > (~0U>>1) && seconds <= (time_t)(~0U>>1))
-               return (ISC_R_RANGE);
-
-       *secondsp = seconds;
-
-       return (ISC_R_SUCCESS);
-}
-
-uint32_t
-isc_time_nanoseconds(const isc_time_t *t) {
-       REQUIRE(t != NULL);
-
-       ENSURE(t->nanoseconds < NS_PER_S);
-
-       return ((uint32_t)t->nanoseconds);
-}
-
-void
-isc_time_formattimestamp(const isc_time_t *t, char *buf, unsigned int len) {
-       time_t now;
-       unsigned int flen;
-       struct tm tmbuf;
-
-       REQUIRE(len > 0);
-
-       now = (time_t) t->seconds;
-       flen = strftime(buf, len, "%d-%b-%Y %X", localtime_r(&now, &tmbuf));
-       INSIST(flen < len);
-       if (flen != 0)
-               snprintf(buf + flen, len - flen,
-                        ".%03u", t->nanoseconds / 1000000);
-       else
-               snprintf(buf, len, "99-Bad-9999 99:99:99.999");
-}
-
-void
-isc_time_formathttptimestamp(const isc_time_t *t, char *buf, unsigned int len) {
-       time_t now;
-       unsigned int flen;
-       struct tm tmbuf;
-
-       REQUIRE(len > 0);
-
-       now = (time_t)t->seconds;
-       flen = strftime(buf, len, "%a, %d %b %Y %H:%M:%S GMT",
-                       gmtime_r(&now, &tmbuf));
-       INSIST(flen < len);
-}
-
-void
-isc_time_formatISO8601(const isc_time_t *t, char *buf, unsigned int len) {
-       time_t now;
-       unsigned int flen;
-       struct tm tmbuf;
-
-       REQUIRE(len > 0);
-
-       now = (time_t)t->seconds;
-       flen = strftime(buf, len, "%Y-%m-%dT%H:%M:%SZ", gmtime_r(&now, &tmbuf));
-       INSIST(flen < len);
-}
</span></code></pre>

<br>
</li>
<li id='diff-7'>
<a href='https://gitlab.com/NTPsec/ntpsec/commit/daa3a36abe9a4e087b2007a293cbbae3af18cb2c#diff-7'>
<strong>
libisc/wscript
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/libisc/wscript
</span><span style="color: #000000;background-color: #ddffdd">+++ b/libisc/wscript
</span><span style="color: #aaaaaa">@@ -6,15 +6,13 @@ def build(ctx):
</span>           "backtrace-emptytbl.c",
                "backtrace.c",
                "error.c",
<span style="color: #000000;background-color: #ffdddd">-                "log.c",
</span>           "md5.c",
                "netaddr.c",
                "result.c",
                "sha1.c",
                "unix/errno2result.c",
                "unix/interfaceiter.c",
<span style="color: #000000;background-color: #ffdddd">-                "unix/net.c",
-               "unix/time.c"
</span><span style="color: #000000;background-color: #ddffdd">+           "unix/net.c"
</span>   ]
 
        ctx(
</code></pre>

<br>
</li>

</div>
<div class='footer' style='margin-top: 10px;'>
<p>

<br>
<a href="https://gitlab.com/NTPsec/ntpsec/commit/daa3a36abe9a4e087b2007a293cbbae3af18cb2c">View it on GitLab</a>.
<br>
You're receiving this email because of your account on gitlab.com.
If you'd like to receive fewer emails, you can adjust your notification settings.
<script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","action":{"@type":"ViewAction","name":"View Commit","url":"https://gitlab.com/NTPsec/ntpsec/commit/daa3a36abe9a4e087b2007a293cbbae3af18cb2c"}}</script>
</p>
</div>
</body>
</html>