[SCM] Samba Shared Repository - branch master updated
Martin Schwenke
martins at samba.org
Mon Dec 5 11:00:04 UTC 2016
The branch, master has been updated
via 41c964f ctdb-recovery: Start recovery helper with ctdb_vfork_exec
via 1b7f0a7 ctdb-locking: Start locking helper using ctdb_vfork_exec
via c438563 ctdb-daemon: Add ctdb_vfork_exec()
via ecf3f56 ctdb-daemon: Log to stderr when running in interactive mode
via d53dbd0 ctdb-daemon: Initialize logging in recovery daemon
via 74ccc72 ctdb-recoverd: Log a message when terminating
via e2413a0 ctdb-logging: Get rid of debug_extra
via aaeef14 ctdb-daemon: Remove setting of debug_extra
via 3d6860b ctdb-daemon: Remove setting of debug_extra from switch_from_server_to_client()
via ca55652 ctdb-daemon: Remove setting of debug_extra via ctdb_set_child_info()
via 9ae62f1 ctdb-daemon: Don't depend on debug_extra in exit handler
via 4108f47 ctdb-daemon: Fix debug messages
via 28b6a90 ctdb-daemon: Consolidate initialization of logging and debug level
via 02aa65c ctdb-logging: Remove duplicate logging code
via c9124a0 ctdb-logging: Refactor logging code
via c54943f ctdb-logging: Use Samba's debug levels
via 657f2c6 ctdb-scripts: Update CTDB_SCRIPT_DEBUGLEVEL to be symbolic
via 4f9d50e ctdb-tests: Use symbolic debug levels in tool tests
via 5abc994 ctdb-tests: Use symbolic debug levels in eventscript tests
via 8eaa0d8 ctdb-tests: Use symbolic debug level for local daemons
via 3a395b6 ctdb-tests: Use symbolic debug levels in takeover tests
via ccbd559 ctdb-tests: Support symbolic debug level in takeover tests
via dbc6cf7 ctdb-doc: Don't advertise numeric debug levels
via 2650f37 ctdb-logging: Drop enum debug_level
via 9b7308b ctdb-daemon: Remove tevent debug logging
from 3de13cb debug: Add minimalist D_* macros
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 41c964fdbca552b045568967a2bb5dae0e878b7c
Author: Amitay Isaacs <amitay at gmail.com>
Date: Wed Nov 30 12:23:04 2016 +1100
ctdb-recovery: Start recovery helper with ctdb_vfork_exec
The recovery helper does it's own logging, so there is no need to
pass logfd.
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
Autobuild-User(master): Martin Schwenke <martins at samba.org>
Autobuild-Date(master): Mon Dec 5 11:59:42 CET 2016 on sn-devel-144
commit 1b7f0a7bbbf52cc1e4f6539934f5dc0b1c12fba6
Author: Amitay Isaacs <amitay at gmail.com>
Date: Wed Nov 30 12:22:02 2016 +1100
ctdb-locking: Start locking helper using ctdb_vfork_exec
This avoids the extra argument of logfd to ctdb_lock_helper. The log
messages from lock helper are captured by ctdbd.
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
commit c43856342f3780ef5cf748606bc3179ffcd5873f
Author: Amitay Isaacs <amitay at gmail.com>
Date: Wed Nov 30 12:15:11 2016 +1100
ctdb-daemon: Add ctdb_vfork_exec()
This will replace ctdb_vfork_with_logging().
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
commit ecf3f56138b903ac37dc6d2ff18bb7a64f8337fe
Author: Amitay Isaacs <amitay at gmail.com>
Date: Tue Nov 29 17:52:00 2016 +1100
ctdb-daemon: Log to stderr when running in interactive mode
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
commit d53dbd0dcc6c3d65012d1309c45b5f78077162e3
Author: Amitay Isaacs <amitay at gmail.com>
Date: Tue Nov 29 16:49:41 2016 +1100
ctdb-daemon: Initialize logging in recovery daemon
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
commit 74ccc7280a83e1073f9bb0e5cd355f86a5f08f1e
Author: Amitay Isaacs <amitay at gmail.com>
Date: Fri Nov 25 14:57:30 2016 +1100
ctdb-recoverd: Log a message when terminating
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
commit e2413a0567ae0952d086ec4f79da43ca4bf6c214
Author: Amitay Isaacs <amitay at gmail.com>
Date: Tue Nov 29 17:59:32 2016 +1100
ctdb-logging: Get rid of debug_extra
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
commit aaeef14ae5bba159f5527b96306f4d818ff91714
Author: Amitay Isaacs <amitay at gmail.com>
Date: Fri Nov 25 14:50:01 2016 +1100
ctdb-daemon: Remove setting of debug_extra
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
commit 3d6860b2753b0c4e76c042fab42562dd2dbc46ef
Author: Amitay Isaacs <amitay at gmail.com>
Date: Fri Nov 25 14:44:10 2016 +1100
ctdb-daemon: Remove setting of debug_extra from switch_from_server_to_client()
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
commit ca5565257531cc5e41aea84666bdd5b354c5138f
Author: Amitay Isaacs <amitay at gmail.com>
Date: Fri Nov 25 14:37:17 2016 +1100
ctdb-daemon: Remove setting of debug_extra via ctdb_set_child_info()
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
commit 9ae62f15322fecd05cd9d925c5f359334155aed0
Author: Amitay Isaacs <amitay at gmail.com>
Date: Fri Nov 25 14:54:07 2016 +1100
ctdb-daemon: Don't depend on debug_extra in exit handler
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
commit 4108f47bcfc91812f6ca064fee774771270fc27b
Author: Amitay Isaacs <amitay at gmail.com>
Date: Wed Nov 30 17:04:54 2016 +1100
ctdb-daemon: Fix debug messages
- Use fprintf() before logging is initialized
- replace DEBUG_ALERT with DEBUG_ERR
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
commit 28b6a90a159f78abb37dba04ee4f178cc5dde647
Author: Amitay Isaacs <amitay at gmail.com>
Date: Wed Nov 30 16:46:19 2016 +1100
ctdb-daemon: Consolidate initialization of logging and debug level
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
commit 02aa65cede61da7d53087bc3c836c6c101d5bf36
Author: Amitay Isaacs <amitay at gmail.com>
Date: Tue Nov 29 16:36:57 2016 +1100
ctdb-logging: Remove duplicate logging code
ctdb_logging_init() now uses logging_init().
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
commit c9124a001f5abf7bb577a8f5341da4cc7411ed22
Author: Amitay Isaacs <amitay at gmail.com>
Date: Tue Nov 29 16:17:23 2016 +1100
ctdb-logging: Refactor logging code
This extracts the code from following files:
- server/ctdb_logging.c
- server/ctdb_logging_file.c
- server/ctdb_logging_syslog.c
This is in preparation for each daemon (and some processes) doing
their own loging instead of relying on CTDB.
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
commit c54943f8bb1e5d23502cb594d1b16f253cddf722
Author: Martin Schwenke <martin at meltin.net>
Date: Wed Nov 23 19:03:23 2016 +1100
ctdb-logging: Use Samba's debug levels
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 657f2c687c60af18ba32a7612da354109cb6e400
Author: Martin Schwenke <martin at meltin.net>
Date: Wed Nov 23 21:36:36 2016 +1100
ctdb-scripts: Update CTDB_SCRIPT_DEBUGLEVEL to be symbolic
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 4f9d50e2e3d1ad075cc79bf2128fb68b395dbc72
Author: Martin Schwenke <martin at meltin.net>
Date: Wed Nov 23 21:38:14 2016 +1100
ctdb-tests: Use symbolic debug levels in tool tests
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 5abc9942e224b87287b34fef2772b1afa7b71ad7
Author: Martin Schwenke <martin at meltin.net>
Date: Wed Nov 23 21:37:45 2016 +1100
ctdb-tests: Use symbolic debug levels in eventscript tests
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 8eaa0d80fffb6d60b8d6c64275cad065c356d573
Author: Martin Schwenke <martin at meltin.net>
Date: Wed Nov 23 17:01:54 2016 +1100
ctdb-tests: Use symbolic debug level for local daemons
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 3a395b67a3915e97a88ac0668eac51a167207df9
Author: Martin Schwenke <martin at meltin.net>
Date: Wed Nov 23 20:40:50 2016 +1100
ctdb-tests: Use symbolic debug levels in takeover tests
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit ccbd55986a3ae179aa3195eda731e9b767bcd279
Author: Martin Schwenke <martin at meltin.net>
Date: Wed Nov 23 19:16:56 2016 +1100
ctdb-tests: Support symbolic debug level in takeover tests
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit dbc6cf7a5583310a2ddb451930e188379a601291
Author: Martin Schwenke <martin at meltin.net>
Date: Wed Nov 23 16:51:53 2016 +1100
ctdb-doc: Don't advertise numeric debug levels
The plan is to switch to Samba's (incompatible) debug levels, so just
expect CTDB users to use the symbolic name for the debug level.
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 2650f37018e36a9d59046098e519a662d394950e
Author: Martin Schwenke <martin at meltin.net>
Date: Fri Nov 25 13:23:11 2016 +1100
ctdb-logging: Drop enum debug_level
We are switching to Samba-style integer debug levels.
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 9b7308b20295f1670c40d46aa087763698a3c1fa
Author: Amitay Isaacs <amitay at gmail.com>
Date: Mon Oct 24 16:53:12 2016 +1100
ctdb-daemon: Remove tevent debug logging
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
-----------------------------------------------------------------------
Summary of changes:
ctdb/client/client.h | 4 +-
ctdb/client/client_control_sync.c | 4 +-
ctdb/common/logging.c | 466 +++++++++++++++++++++++-
ctdb/common/logging.h | 26 +-
ctdb/config/functions | 2 +-
ctdb/doc/ctdb.1.xml | 2 +-
ctdb/doc/ctdb.7.xml | 10 +-
ctdb/doc/ctdbd.1.xml | 2 +-
ctdb/doc/ctdbd.conf.5.xml | 12 +-
ctdb/include/ctdb_private.h | 21 +-
ctdb/protocol/protocol_api.h | 4 +-
ctdb/protocol/protocol_client.c | 8 +-
ctdb/server/ctdb_call.c | 3 +-
ctdb/server/ctdb_daemon.c | 24 +-
ctdb/server/ctdb_fork.c | 62 +++-
ctdb/server/ctdb_lock.c | 6 +-
ctdb/server/ctdb_lock_helper.c | 53 ++-
ctdb/server/ctdb_logging.c | 107 +-----
ctdb/server/ctdb_logging_file.c | 120 ------
ctdb/server/ctdb_logging_syslog.c | 328 -----------------
ctdb/server/ctdb_monitor.c | 1 -
ctdb/server/ctdb_recoverd.c | 13 +-
ctdb/server/ctdb_recovery_helper.c | 44 +--
ctdb/server/ctdb_takeover.c | 3 +-
ctdb/server/ctdb_traverse.c | 3 +-
ctdb/server/ctdb_update_record.c | 1 -
ctdb/server/ctdb_vacuum.c | 2 +-
ctdb/server/ctdbd.c | 39 +-
ctdb/tests/eventscripts/50.samba.monitor.107.sh | 2 +-
ctdb/tests/eventscripts/stubs/ctdb | 2 +-
ctdb/tests/simple/13_ctdb_setdebug.sh | 18 +-
ctdb/tests/simple/scripts/local_daemons.bash | 2 +-
ctdb/tests/src/ctdb_takeover_tests.c | 11 +-
ctdb/tests/src/fake_ctdbd.c | 12 +-
ctdb/tests/src/test_options.c | 4 +-
ctdb/tests/takeover/lcp2.001.sh | 2 +-
ctdb/tests/takeover/lcp2.002.sh | 2 +-
ctdb/tests/takeover/lcp2.003.sh | 2 +-
ctdb/tests/takeover/lcp2.004.sh | 2 +-
ctdb/tests/takeover/lcp2.005.sh | 2 +-
ctdb/tests/takeover/lcp2.006.sh | 2 +-
ctdb/tests/takeover/lcp2.007.sh | 2 +-
ctdb/tests/takeover/lcp2.008.sh | 2 +-
ctdb/tests/takeover/lcp2.009.sh | 2 +-
ctdb/tests/takeover/lcp2.010.sh | 2 +-
ctdb/tests/takeover/lcp2.011.sh | 2 +-
ctdb/tests/takeover/lcp2.012.sh | 2 +-
ctdb/tests/takeover/lcp2.013.sh | 2 +-
ctdb/tests/takeover/lcp2.014.sh | 2 +-
ctdb/tests/takeover/lcp2.015.sh | 2 +-
ctdb/tests/takeover/lcp2.016.sh | 2 +-
ctdb/tests/takeover/lcp2.017.sh | 2 +-
ctdb/tests/takeover/lcp2.018.sh | 2 +-
ctdb/tests/takeover/lcp2.019.sh | 2 +-
ctdb/tests/takeover/lcp2.020.sh | 2 +-
ctdb/tests/takeover/lcp2.021.sh | 2 +-
ctdb/tests/takeover/lcp2.022.sh | 2 +-
ctdb/tests/takeover/lcp2.023.sh | 2 +-
ctdb/tests/takeover/lcp2.024.sh | 2 +-
ctdb/tests/takeover/lcp2.025.sh | 2 +-
ctdb/tests/takeover/lcp2.026.sh | 2 +-
ctdb/tests/takeover/lcp2.027.sh | 2 +-
ctdb/tests/takeover/lcp2.028.sh | 2 +-
ctdb/tests/takeover/lcp2.029.sh | 2 +-
ctdb/tests/takeover/lcp2.030.sh | 2 +-
ctdb/tests/takeover/lcp2.031.sh | 2 +-
ctdb/tests/takeover/lcp2.032.sh | 2 +-
ctdb/tests/takeover/lcp2.033.sh | 2 +-
ctdb/tests/tool/ctdb.setdebug.003.sh | 10 +-
ctdb/tests/tool/scripts/local.sh | 2 +-
ctdb/tools/ctdb.c | 6 +-
ctdb/tools/ctdb_killtcp.c | 6 +-
ctdb/wscript | 4 +-
73 files changed, 711 insertions(+), 804 deletions(-)
delete mode 100644 ctdb/server/ctdb_logging_file.c
delete mode 100644 ctdb/server/ctdb_logging_syslog.c
Changeset truncated at 500 lines:
diff --git a/ctdb/client/client.h b/ctdb/client/client.h
index 3d6292c..ea41cbe 100644
--- a/ctdb/client/client.h
+++ b/ctdb/client/client.h
@@ -240,12 +240,12 @@ int ctdb_ctrl_getvnnmap(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
int ctdb_ctrl_getdebug(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
struct ctdb_client_context *client,
int destnode, struct timeval timeout,
- uint32_t *loglevel);
+ int *loglevel);
int ctdb_ctrl_setdebug(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
struct ctdb_client_context *client,
int destnode, struct timeval timeout,
- uint32_t loglevel);
+ int loglevel);
int ctdb_ctrl_get_dbmap(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
struct ctdb_client_context *client,
diff --git a/ctdb/client/client_control_sync.c b/ctdb/client/client_control_sync.c
index 07f23bf..ac453b0 100644
--- a/ctdb/client/client_control_sync.c
+++ b/ctdb/client/client_control_sync.c
@@ -183,7 +183,7 @@ int ctdb_ctrl_getvnnmap(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
int ctdb_ctrl_getdebug(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
struct ctdb_client_context *client,
int destnode, struct timeval timeout,
- uint32_t *loglevel)
+ int *loglevel)
{
struct ctdb_req_control request;
struct ctdb_reply_control *reply;
@@ -212,7 +212,7 @@ int ctdb_ctrl_getdebug(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
int ctdb_ctrl_setdebug(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
struct ctdb_client_context *client,
int destnode, struct timeval timeout,
- uint32_t loglevel)
+ int loglevel)
{
struct ctdb_req_control request;
struct ctdb_reply_control *reply;
diff --git a/ctdb/common/logging.c b/ctdb/common/logging.c
index 4b7b4e5..3d586bf 100644
--- a/ctdb/common/logging.c
+++ b/ctdb/common/logging.c
@@ -1,6 +1,8 @@
/*
Logging utilities
+ Copyright (C) Andrew Tridgell 2008
+ Copyright (C) Martin Schwenke 2014
Copyright (C) Amitay Isaacs 2015
This program is free software; you can redistribute it and/or modify
@@ -17,23 +19,39 @@
along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
-#include <replace.h>
-#include <system/locale.h>
+#include "replace.h"
+#include "system/network.h"
+#include "system/locale.h"
+#include "system/time.h"
+#include "system/filesys.h"
+#include "system/syslog.h"
+
+#include "lib/util/time_basic.h"
+#include "lib/util/sys_rw.h"
+#include "lib/util/debug.h"
+#include "lib/util/blocking.h"
+#include "lib/util/samba_util.h" /* get_myname() */
#include "common/logging.h"
struct {
- enum debug_level log_level;
+ int log_level;
const char *log_string;
} log_string_map[] = {
{ DEBUG_ERR, "ERROR" },
{ DEBUG_WARNING, "WARNING" },
+ { 2, "WARNING" },
{ DEBUG_NOTICE, "NOTICE" },
+ { 4, "NOTICE" },
{ DEBUG_INFO, "INFO" },
+ { 6, "INFO" },
+ { 7, "INFO" },
+ { 8, "INFO" },
+ { 9, "INFO" },
{ DEBUG_DEBUG, "DEBUG" },
};
-bool debug_level_parse(const char *log_string, enum debug_level *log_level)
+bool debug_level_parse(const char *log_string, int *log_level)
{
int i;
@@ -45,7 +63,7 @@ bool debug_level_parse(const char *log_string, enum debug_level *log_level)
int level = atoi(log_string);
if (level >= 0 && level < ARRAY_SIZE(log_string_map)) {
- *log_level = debug_level_from_int(level);
+ *log_level = level;
return true;
}
return false;
@@ -62,7 +80,7 @@ bool debug_level_parse(const char *log_string, enum debug_level *log_level)
return false;
}
-const char *debug_level_to_string(enum debug_level log_level)
+const char *debug_level_to_string(int log_level)
{
int i;
@@ -74,10 +92,10 @@ const char *debug_level_to_string(enum debug_level log_level)
return "UNKNOWN";
}
-enum debug_level debug_level_from_string(const char *log_string)
+int debug_level_from_string(const char *log_string)
{
bool found;
- enum debug_level log_level;
+ int log_level;
found = debug_level_parse(log_string, &log_level);
if (found) {
@@ -88,20 +106,436 @@ enum debug_level debug_level_from_string(const char *log_string)
return DEBUG_ERR;
}
-int debug_level_to_int(enum debug_level log_level)
+/*
+ * file logging backend
+ */
+
+struct file_log_state {
+ const char *app_name;
+ int fd;
+ char buffer[1024];
+};
+
+static void file_log(void *private_data, int level, const char *msg)
+{
+ struct file_log_state *state = talloc_get_type_abort(
+ private_data, struct file_log_state);
+ struct timeval tv;
+ struct timeval_buf tvbuf;
+ int ret;
+
+ if (state->fd == STDERR_FILENO) {
+ ret = snprintf(state->buffer, sizeof(state->buffer),
+ "%s[%u]: %s\n",
+ state->app_name, (unsigned)getpid(), msg);
+ } else {
+ GetTimeOfDay(&tv);
+ timeval_str_buf(&tv, false, true, &tvbuf);
+
+ ret = snprintf(state->buffer, sizeof(state->buffer),
+ "%s %s[%u]: %s\n", tvbuf.buf,
+ state->app_name, (unsigned)getpid(), msg);
+ }
+ if (ret < 0) {
+ return;
+ }
+
+ state->buffer[sizeof(state->buffer)-1] = '\0';
+
+ sys_write_v(state->fd, state->buffer, strlen(state->buffer));
+}
+
+static int file_log_state_destructor(struct file_log_state *state)
+{
+ if (state->fd != -1 && state->fd != STDERR_FILENO) {
+ close(state->fd);
+ state->fd = -1;
+ }
+ return 0;
+}
+
+static int file_log_setup(TALLOC_CTX *mem_ctx, const char *option,
+ const char *app_name)
+{
+ struct file_log_state *state;
+
+ state = talloc_zero(mem_ctx, struct file_log_state);
+ if (state == NULL) {
+ return ENOMEM;
+ }
+
+ state->app_name = app_name;
+
+ if (option == NULL || strcmp(option, "-") == 0) {
+ int ret;
+
+ state->fd = STDERR_FILENO;
+ ret = dup2(STDERR_FILENO, STDOUT_FILENO);
+ if (ret == -1) {
+ int save_errno = errno;
+ talloc_free(state);
+ return save_errno;
+ }
+
+ } else {
+ state->fd = open(option, O_WRONLY|O_APPEND|O_CREAT, 0644);
+ if (state->fd == -1) {
+ int save_errno = errno;
+ talloc_free(state);
+ return save_errno;
+ }
+
+ if (! set_close_on_exec(state->fd)) {
+ int save_errno = errno;
+ talloc_free(state);
+ return save_errno;
+ }
+ }
+
+ talloc_set_destructor(state, file_log_state_destructor);
+ debug_set_callback(state, file_log);
+
+ return 0;
+}
+
+/*
+ * syslog logging backend
+ */
+
+/* Copied from lib/util/debug.c */
+static int debug_level_to_priority(int level)
+{
+ /*
+ * map debug levels to syslog() priorities
+ */
+ static const int priority_map[] = {
+ LOG_ERR, /* 0 */
+ LOG_WARNING, /* 1 */
+ LOG_NOTICE, /* 2 */
+ LOG_NOTICE, /* 3 */
+ LOG_NOTICE, /* 4 */
+ LOG_NOTICE, /* 5 */
+ LOG_INFO, /* 6 */
+ LOG_INFO, /* 7 */
+ LOG_INFO, /* 8 */
+ LOG_INFO, /* 9 */
+ };
+ int priority;
+
+ if( level >= ARRAY_SIZE(priority_map) || level < 0)
+ priority = LOG_DEBUG;
+ else
+ priority = priority_map[level];
+
+ return priority;
+}
+
+struct syslog_log_state {
+ int fd;
+ const char *app_name;
+ const char *hostname;
+ int (*format)(int dbglevel, struct syslog_log_state *state,
+ const char *str, char *buf, int bsize);
+ /* RFC3164 says: The total length of the packet MUST be 1024
+ bytes or less. */
+ char buffer[1024];
+};
+
+/* Format messages as per RFC3164
+ *
+ * It appears that some syslog daemon implementations do not allow a
+ * hostname when messages are sent via a Unix domain socket, so omit
+ * it. Similarly, syslogd on FreeBSD does not understand the hostname
+ * part of the header, even when logging via UDP. Note that most
+ * implementations will log messages against "localhost" when logging
+ * via UDP. A timestamp could be sent but rsyslogd on Linux limits
+ * the timestamp logged to the precision that was received on
+ * /dev/log. It seems sane to send degenerate RFC3164 messages
+ * without a header at all, so that the daemon will generate high
+ * resolution timestamps if configured.
+ */
+static int format_rfc3164(int dbglevel, struct syslog_log_state *state,
+ const char *str, char *buf, int bsize)
+{
+ int pri;
+ int len;
+
+ pri = LOG_DAEMON | debug_level_to_priority(dbglevel);
+ len = snprintf(buf, bsize, "<%d>%s[%u]: %s",
+ pri, state->app_name, getpid(), str);
+ buf[bsize-1] = '\0';
+ len = MIN(len, bsize - 1);
+
+ return len;
+}
+
+/* Format messages as per RFC5424
+ *
+ * <165>1 2003-08-24T05:14:15.000003-07:00 192.0.2.1
+ * myproc 8710 - - %% It's time to make the do-nuts.
+ */
+static int format_rfc5424(int dbglevel, struct syslog_log_state *state,
+ const char *str, char *buf, int bsize)
+{
+ int pri;
+ struct timeval tv;
+ struct timeval_buf tvbuf;
+ int len, s;
+
+ /* Header */
+ pri = LOG_DAEMON | debug_level_to_priority(dbglevel);
+ GetTimeOfDay(&tv);
+ len = snprintf(buf, bsize,
+ "<%d>1 %s %s %s %u - - ",
+ pri, timeval_str_buf(&tv, true, true, &tvbuf),
+ state->hostname, state->app_name, getpid());
+ /* A truncated header is not useful... */
+ if (len >= bsize) {
+ return -1;
+ }
+
+ /* Message */
+ s = snprintf(&buf[len], bsize - len, "%s", str);
+ buf[bsize-1] = '\0';
+ len = MIN(len + s, bsize - 1);
+
+ return len;
+}
+
+static void syslog_log(void *private_data, int level, const char *msg)
+{
+ syslog(debug_level_to_priority(level), "%s", msg);
+}
+
+static void syslog_log_sock(void *private_data, int level, const char *msg)
+{
+ struct syslog_log_state *state = talloc_get_type_abort(
+ private_data, struct syslog_log_state);
+ int n;
+
+ n = state->format(level, state, msg, state->buffer,
+ sizeof(state->buffer));
+ if (n == -1) {
+ return;
+ }
+
+ sys_write_v(state->fd, state->buffer, n);
+}
+
+static int syslog_log_setup_syslog(TALLOC_CTX *mem_ctx, const char *app_name)
+{
+ openlog(app_name, LOG_PID, LOG_DAEMON);
+
+ debug_set_callback(NULL, syslog_log);
+
+ return 0;
+}
+
+static int syslog_log_state_destructor(struct syslog_log_state *state)
+{
+ if (state->fd != -1) {
+ close(state->fd);
+ state->fd = -1;
+ }
+ return 0;
+}
+
+static int syslog_log_setup_common(TALLOC_CTX *mem_ctx, const char *app_name,
+ struct syslog_log_state **result)
+{
+ struct syslog_log_state *state;
+
+ state = talloc_zero(mem_ctx, struct syslog_log_state);
+ if (state == NULL) {
+ return ENOMEM;
+ }
+
+ state->fd = -1;
+ state->app_name = app_name;
+ talloc_set_destructor(state, syslog_log_state_destructor);
+
+ return 0;
+}
+
+#ifdef _PATH_LOG
+static int syslog_log_setup_nonblocking(TALLOC_CTX *mem_ctx,
+ const char *app_name)
{
- return (int)log_level;
+ struct syslog_log_state *state = NULL;
+ struct sockaddr_un dest;
+ int ret;
+
+ ret = syslog_log_setup_common(mem_ctx, app_name, &state);
+ if (ret != 0) {
+ return ret;
+ }
+
+ state->fd = socket(AF_UNIX, SOCK_DGRAM, 0);
+ if (state->fd == -1) {
+ int save_errno = errno;
+ talloc_free(state);
+ return save_errno;
+ }
+
+ dest.sun_family = AF_UNIX;
+ strncpy(dest.sun_path, _PATH_LOG, sizeof(dest.sun_path)-1);
+ ret = connect(state->fd,
+ (struct sockaddr *)&dest, sizeof(dest));
+ if (ret == -1) {
+ int save_errno = errno;
+ talloc_free(state);
+ return save_errno;
+ }
+
+ ret = set_blocking(state->fd, false);
+ if (ret != 0) {
+ int save_errno = errno;
+ talloc_free(state);
+ return save_errno;
+ }
+
+ if (! set_close_on_exec(state->fd)) {
+ int save_errno = errno;
+ talloc_free(state);
+ return save_errno;
+ }
+
+ state->hostname = NULL; /* Make this explicit */
+ state->format = format_rfc3164;
+
+ debug_set_callback(state, syslog_log_sock);
+
+ return 0;
}
+#endif /* _PATH_LOG */
-enum debug_level debug_level_from_int(int level)
+static int syslog_log_setup_udp(TALLOC_CTX *mem_ctx, const char *app_name,
+ bool rfc5424)
{
- enum debug_level log_level;
+ struct syslog_log_state *state = NULL;
+ struct sockaddr_in dest;
+ int ret;
+
+ ret = syslog_log_setup_common(mem_ctx, app_name, &state);
+ if (ret != 0) {
+ return ret;
+ }
+
+ state->fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ if (state->fd == -1) {
+ int save_errno = errno;
+ talloc_free(state);
+ return save_errno;
+ }
+
+ dest.sin_family = AF_INET;
+ dest.sin_port = htons(514);
+ dest.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ ret = connect(state->fd,
+ (struct sockaddr *)&dest, sizeof(dest));
+ if (ret == -1) {
+ int save_errno = errno;
+ talloc_free(state);
+ return save_errno;
+ }
+
+ if (! set_close_on_exec(state->fd)) {
+ int save_errno = errno;
+ talloc_free(state);
+ return save_errno;
+ }
- if (level >= 0 && level < ARRAY_SIZE(log_string_map)) {
- log_level = log_string_map[level].log_level;
+ state->hostname = get_myname(state);
+ if (state->hostname == NULL) {
+ /* Use a fallback instead of failing initialisation */
+ state->hostname = "localhost";
+ }
+ if (rfc5424) {
+ state->format = format_rfc5424;
} else {
- log_level = DEBUG_ERR;
+ state->format = format_rfc3164;
+ }
+
+ debug_set_callback(state, syslog_log_sock);
+
+ return 0;
+}
+
+static int syslog_log_setup(TALLOC_CTX *mem_ctx, const char *option,
+ const char *app_name)
+{
+ if (option == NULL) {
+ return syslog_log_setup_syslog(mem_ctx, app_name);
--
Samba Shared Repository
More information about the samba-cvs
mailing list