summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/bind/lib/isc/include/isc/log.h5
-rw-r--r--usr.sbin/bind/lib/isc/log.c354
2 files changed, 4 insertions, 355 deletions
diff --git a/usr.sbin/bind/lib/isc/include/isc/log.h b/usr.sbin/bind/lib/isc/include/isc/log.h
index 918e5566632..56c141acdb8 100644
--- a/usr.sbin/bind/lib/isc/include/isc/log.h
+++ b/usr.sbin/bind/lib/isc/include/isc/log.h
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.h,v 1.10 2020/01/22 13:02:10 florian Exp $ */
+/* $Id: log.h,v 1.11 2020/01/26 11:21:58 florian Exp $ */
#ifndef ISC_LOG_H
#define ISC_LOG_H 1
@@ -54,8 +54,7 @@
*/
#define ISC_LOG_TONULL 1
#define ISC_LOG_TOSYSLOG 2
-#define ISC_LOG_TOFILE 3
-#define ISC_LOG_TOFILEDESC 4
+#define ISC_LOG_TOFILEDESC 3
/*@}*/
/*@{*/
diff --git a/usr.sbin/bind/lib/isc/log.c b/usr.sbin/bind/lib/isc/log.c
index d2e8b6b2ed2..9485104809e 100644
--- a/usr.sbin/bind/lib/isc/log.c
+++ b/usr.sbin/bind/lib/isc/log.c
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.c,v 1.20 2020/01/22 13:02:10 florian Exp $ */
+/* $Id: log.c,v 1.21 2020/01/26 11:21:58 florian Exp $ */
/*! \file
* \author Principal Authors: DCL */
@@ -227,12 +227,6 @@ assignchannel(isc_logconfig_t *lcfg, unsigned int category_id,
static isc_result_t
sync_channellist(isc_logconfig_t *lcfg);
-static isc_result_t
-greatest_version(isc_logchannel_t *channel, int versions, 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, isc_boolean_t write_once,
@@ -480,7 +474,6 @@ isc_logconfig_destroy(isc_logconfig_t **lcfgp) {
isc_logconfig_t *lcfg;
isc_logchannel_t *channel;
isc_logchannellist_t *item;
- char *filename;
unsigned int i;
REQUIRE(lcfgp != NULL && VALID_CONFIG(*lcfgp));
@@ -496,20 +489,6 @@ isc_logconfig_destroy(isc_logconfig_t **lcfgp) {
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);
- free(filename);
-
- if (FILE_STREAM(channel) != NULL)
- (void)fclose(FILE_STREAM(channel));
- }
-
free(channel->name);
free(channel);
}
@@ -680,7 +659,7 @@ isc_log_createchannel(isc_logconfig_t *lcfg, const char *name,
REQUIRE(VALID_CONFIG(lcfg));
REQUIRE(name != NULL);
- REQUIRE(type == ISC_LOG_TOSYSLOG || type == ISC_LOG_TOFILE ||
+ REQUIRE(type == ISC_LOG_TOSYSLOG ||
type == ISC_LOG_TOFILEDESC || type == ISC_LOG_TONULL);
REQUIRE(destination != NULL || type == ISC_LOG_TONULL);
REQUIRE(level >= ISC_LOG_CRITICAL);
@@ -709,19 +688,6 @@ isc_log_createchannel(isc_logconfig_t *lcfg, const char *name,
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) = strdup(destination->file.name);
- FILE_STREAM(channel) = NULL;
- FILE_VERSIONS(channel) = destination->file.versions;
- FILE_MAXSIZE(channel) = destination->file.maximum_size;
- FILE_MAXREACHED(channel) = ISC_FALSE;
- break;
-
case ISC_LOG_TOFILEDESC:
FILE_NAME(channel) = NULL;
FILE_STREAM(channel) = destination->file.stream;
@@ -853,24 +819,9 @@ isc_log_setcontext(isc_log_t *lctx) {
void
isc_log_setdebuglevel(isc_log_t *lctx, unsigned int level) {
- isc_logchannel_t *channel;
-
REQUIRE(VALID_CONTEXT(lctx));
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;
- }
}
unsigned int
@@ -927,23 +878,6 @@ 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));
-
- 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;
- }
-}
-
/****
**** Internal functions
****/
@@ -1036,228 +970,6 @@ sync_channellist(isc_logconfig_t *lcfg) {
return (ISC_R_SUCCESS);
}
-static isc_result_t
-greatest_version(isc_logchannel_t *channel, int versions, int *greatestp) {
- /* XXXDCL HIGHLY NT */
- char *bname, *digit_end;
- const char *dirname;
- int version, greatest = -1;
- size_t bnamelen;
- isc_dir_t dir;
- isc_result_t result;
- char sep = '/';
-
- REQUIRE(channel->type == ISC_LOG_TOFILE);
-
- /*
- * It is safe to DE_CONST the file.name because it was copied
- * with strdup in isc_log_createchannel.
- */
- bname = strrchr(FILE_NAME(channel), sep);
- if (bname != NULL) {
- *bname++ = '\0';
- dirname = FILE_NAME(channel);
- } else {
- DE_CONST(FILE_NAME(channel), bname);
- dirname = ".";
- }
- bnamelen = strlen(bname);
-
- isc_dir_init(&dir);
- result = isc_dir_open(&dir, dirname);
-
- /*
- * Replace the file separator if it was taken out.
- */
- if (bname != FILE_NAME(channel))
- *(bname - 1) = sep;
-
- /*
- * Return if the directory open failed.
- */
- if (result != ISC_R_SUCCESS)
- return (result);
-
- while (isc_dir_read(&dir) == ISC_R_SUCCESS) {
- if (dir.entry.length > bnamelen &&
- strncmp(dir.entry.name, bname, bnamelen) == 0 &&
- dir.entry.name[bnamelen] == '.') {
-
- version = strtol(&dir.entry.name[bnamelen + 1],
- &digit_end, 10);
- /*
- * Remove any backup files that exceed versions.
- */
- if (*digit_end == '\0' && version >= versions) {
- result = isc_file_remove(dir.entry.name);
- if (result != ISC_R_SUCCESS &&
- result != ISC_R_FILENOTFOUND)
- syslog(LOG_ERR, "unable to remove "
- "log file '%s': %s",
- dir.entry.name,
- isc_result_totext(result));
- } else if (*digit_end == '\0' && version > greatest)
- greatest = version;
- }
- }
- isc_dir_close(&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 newpath[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);
-
- if (FILE_VERSIONS(channel) == ISC_LOG_ROLLINFINITE) {
- /*
- * Find the first missing entry in the log file sequence.
- */
- for (greatest = 0; greatest < INT_MAX; greatest++) {
- n = snprintf(current, sizeof(current),
- "%s.%u", path, (unsigned)greatest) ;
- if (n >= (int)sizeof(current) || n < 0 ||
- !isc_file_exists(current))
- break;
- }
- } else {
- /*
- * Get the largest existing version and remove any
- * version greater than the permitted version.
- */
- result = greatest_version(channel, FILE_VERSIONS(channel),
- &greatest);
- if (result != ISC_R_SUCCESS)
- return (result);
-
- /*
- * Increment if greatest is not the actual maximum value.
- */
- if (greatest < FILE_VERSIONS(channel) - 1)
- greatest++;
- }
-
- for (i = greatest; i > 0; i--) {
- result = ISC_R_SUCCESS;
- n = snprintf(current, sizeof(current), "%s.%u", path,
- (unsigned)(i - 1));
- if (n >= (int)sizeof(current) || n < 0) {
- result = ISC_R_NOSPACE;
- }
- if (result == ISC_R_SUCCESS) {
- n = snprintf(newpath, sizeof(newpath), "%s.%u",
- path, (unsigned)i);
- if (n >= (int)sizeof(newpath) || n < 0) {
- result = ISC_R_NOSPACE;
- }
- }
- if (result == ISC_R_SUCCESS)
- result = isc_file_rename(current, newpath);
- if (result != ISC_R_SUCCESS &&
- result != ISC_R_FILENOTFOUND)
- syslog(LOG_ERR,
- "unable to rename log file '%s.%u' to "
- "'%s.%u': %s", path, i - 1, path, i,
- isc_result_totext(result));
- }
-
- if (FILE_VERSIONS(channel) != 0) {
- n = snprintf(newpath, sizeof(newpath), "%s.0", path);
- if (n >= (int)sizeof(newpath) || n < 0)
- result = ISC_R_NOSPACE;
- else
- result = isc_file_rename(path, newpath);
- 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_file_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;
- isc_boolean_t regular_file;
- isc_boolean_t roll = ISC_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.
- */
- if (stat(path, &statbuf) == 0) {
- regular_file = S_ISREG(statbuf.st_mode) ? ISC_TRUE : ISC_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 = ISC_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);
- }
- }
-
- result = isc_stdio_open(path, "a", &FILE_STREAM(channel));
-
- return (result);
-}
-
isc_boolean_t
isc_log_wouldlog(isc_log_t *lctx, int level) {
/*
@@ -1290,14 +1002,12 @@ isc_log_doit(isc_log_t *lctx, isc_logcategory_t *category,
char time_string[64];
char level_string[24];
const char *iformat;
- struct stat statbuf;
isc_boolean_t matched = ISC_FALSE;
isc_boolean_t printtime, printtag, printcolon;
isc_boolean_t printcategory, printmodule, printlevel;
isc_logconfig_t *lcfg;
isc_logchannel_t *channel;
isc_logchannellist_t *category_channels;
- isc_result_t result;
REQUIRE(lctx == NULL || VALID_CONTEXT(lctx));
REQUIRE(category != NULL);
@@ -1523,49 +1233,6 @@ isc_log_doit(isc_log_t *lctx, isc_logcategory_t *category,
!= 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) = ISC_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",
@@ -1583,23 +1250,6 @@ isc_log_doit(isc_log_t *lctx, isc_logcategory_t *category,
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) = ISC_TRUE;
- }
-
break;
case ISC_LOG_TOSYSLOG: