The branch, master has been updated via 1b263ed631c s3-vfs-streams_xattr: add close call via 5c928d7cd1d lib/audit_logging: actually create talloc via 35349fecbd0 docs-xml: document "log level" changes via 08d37b4a44b debug: enable per debug-class logfiles via 3dbda63284c debug: remove fd and debugf from state, use dbgc_config[DBGC_ALL] via 781f5a95edd debug: update logsize checking for per debug-class logfiles via d792f15ff14 debug: update need_to_check_log_size() for per debug-class logfiles via 249bdd93783 debug: add support for per debug-class logfiles via abfb3c6bbf5 debug: add resource cleanup for per debug-class logfiles via 43c693511d9 debug: add logfile and fd to struct debug_class via 7369674787d debug: factor out logfile size check via 4341f24069f debug: add a call to debug_parse_levels() to reopen_logs() via 2bc7e254a62 debug: add an empty line via 240b08c414c debug: factor out a function that opens and closes the new and old logfile via e6655f08873 debug: track current debug message class via 63f330761e7 debug: convert dbgc_config to an array of struct debug_class via d346cf94a44 debug: README.Coding fixes via 3b293c66902 debug: rename DEBUGLEVEL_CLASS variable to dbgc_config via 7a2562fd2b4 debug: move some definitions around from 357fe04bd47 s4: Add kerberos tracing
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 1b263ed631c86bf4117c9388fce3fa1f24cea4c9 Author: Günther Deschner <g...@samba.org> Date: Tue Dec 18 17:20:29 2018 +0100 s3-vfs-streams_xattr: add close call https://bugzilla.samba.org/show_bug.cgi?id=13725 We cannot always rely on vfs_default to close the fake fds. This mostly is relevant when used with another non-local VFS filesystem module such as gluster. Guenther Signed-off-by: Günther Deschner <g...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Thu Dec 20 07:18:20 CET 2018 on sn-devel-144 commit 5c928d7cd1d0ac994fe95892eec235b939ad2ec9 Author: Philipp Gesang <philipp.ges...@intra2net.com> Date: Tue Dec 18 16:09:19 2018 +0100 lib/audit_logging: actually create talloc Heal damage of 79f494e51e.. That context is being passed around and freed but is never actually allocated on that stack. Signed-off-by: Philipp Gesang <philipp.ges...@intra2net.com> Reviewed-by: Gary Lockyer <g...@catalyst.net.nz> Reviewed-by: Jeremy Allison <j...@samba.org> commit 35349fecbd075a5e5dd4c87be465d61c5104fb21 Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 21:04:42 2018 +0100 docs-xml: document "log level" changes "log level" now takes an optional per debug-class logfile: log level = 1 full_audit:1@/var/log/audit.log winbind:2 Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 08d37b4a44bc7daed3c1c5774a3d7e796de582ef Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 22:46:49 2018 +0100 debug: enable per debug-class logfiles This finally enables per debug-class logfiles by hooking into reopen_logs_internal() calls to reopen_one_log() per configured debug-class. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 3dbda63284cdeb2f060931c85388842627c955a1 Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 22:49:15 2018 +0100 debug: remove fd and debugf from state, use dbgc_config[DBGC_ALL] Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 781f5a95edde4cd27627515869bfe2fc626fbb3a Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 14:43:22 2018 +0100 debug: update logsize checking for per debug-class logfiles Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit d792f15ff1406cde7f38ddc5febb08a8b39b90e8 Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 14:54:41 2018 +0100 debug: update need_to_check_log_size() for per debug-class logfiles Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 249bdd9378306c146dca0eec6711e2c6b8eae29a Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 13:11:26 2018 +0100 debug: add support for per debug-class logfiles This adds support for per debug-class logfiles to the function parsing the "log level" option. The enhanced syntax is: log level = CLASS:LEVEL[@PATH] [CLASS:LEVEL[@PATH] ... ] Eg log level = full_audit:1@/var/log/audit.logfile While the option is already parsed and stored in in the dbgc_config[] array, the feature is still effectively disabled, as reopen_logs_internal() still doesn't open the per debug-class logfiles. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit abfb3c6bbf5d3d27ca61cd973ffb15c3d8e2be4f Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 13:09:03 2018 +0100 debug: add resource cleanup for per debug-class logfiles Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 43c693511d971210107535644b975a465b012373 Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 12:51:16 2018 +0100 debug: add logfile and fd to struct debug_class Initialized to -1. Already checked in debug_file_log() without affecting behaviour until subsequent commits set per-debug-class fds. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 7369674787d91c40f8eff7bc71f6d73dab341315 Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 12:45:11 2018 +0100 debug: factor out logfile size check The new function will also be used for upcoming per-debug-class logfiles. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 4341f24069f991dc7119093e418aac392e0a1b50 Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 12:43:47 2018 +0100 debug: add a call to debug_parse_levels() to reopen_logs() This allows correct refresh of the "log level" setting when reloading config. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 2bc7e254a62cfc6a60ecff425fc71173c6d21a10 Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 08:48:35 2018 +0100 debug: add an empty line Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 240b08c414c375c16ad0b1524202f1337b7e9e6d Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 12:35:42 2018 +0100 debug: factor out a function that opens and closes the new and old logfile The new function reopen_one_log() will also be used for per-class logfiles in subsequent commmits. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit e6655f0887313a9ad99406a89a66c6950ba970bb Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 22:22:44 2018 +0100 debug: track current debug message class This is analog to current_msg_level. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 63f330761e7bebf9ee9200a9e1302c373519d226 Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 22:21:57 2018 +0100 debug: convert dbgc_config to an array of struct debug_class Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit d346cf94a44a7a4fd45b33d9369dbbc404e0ebb0 Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 11:57:05 2018 +0100 debug: README.Coding fixes Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 3b293c669024e55d2c5343e85f1f43a03682b478 Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 22:19:06 2018 +0100 debug: rename DEBUGLEVEL_CLASS variable to dbgc_config Variable names should not be given in uppercase. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 7a2562fd2b426ec25131f5fd83d4f835ad604847 Author: Ralph Boehme <s...@samba.org> Date: Wed Dec 12 08:57:28 2018 +0100 debug: move some definitions around They will be needed by some function in a subsequent commit. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: docs-xml/smbdotconf/logging/loglevel.xml | 11 +- lib/audit_logging/audit_logging.c | 6 + lib/util/debug.c | 417 +++++++++++++++++++++---------- lib/util/debug_s3.c | 2 + source3/modules/vfs_streams_xattr.c | 26 ++ 5 files changed, 324 insertions(+), 138 deletions(-) Changeset truncated at 500 lines: diff --git a/docs-xml/smbdotconf/logging/loglevel.xml b/docs-xml/smbdotconf/logging/loglevel.xml index 42912720655..1bc4146dac9 100644 --- a/docs-xml/smbdotconf/logging/loglevel.xml +++ b/docs-xml/smbdotconf/logging/loglevel.xml @@ -12,8 +12,9 @@ <para>This parameter has been extended since the 2.2.x series, now it allows one to specify the debug level for multiple - debug classes. This is to give greater flexibility in the configuration - of the system. The following debug classes are currently implemented: + debug classes and distinct logfiles for debug classes. This is to give + greater flexibility in the configuration of the system. The following + debug classes are currently implemented: </para> <itemizedlist> @@ -54,6 +55,11 @@ <listitem><para><parameter moreinfo="none">dsdb_transaction_json_audit</parameter></para></listitem> </itemizedlist> + <para>To configure the logging for specific classes to go into a different + file then <smbconfoption name="log file"/>, you can append + <emphasis>@PATH</emphasis> to the class, eg <parameter>log level = 1 + full_audit:1@/var/log/audit.log</parameter>.</para> + <para>Authentication and authorization audit information is logged under the auth_audit, and if Samba was not compiled with --without-json, a JSON representation is logged under @@ -91,4 +97,5 @@ </description> <value type="default">0</value> <value type="example">3 passdb:5 auth:10 winbind:2</value> +<value type="example">1 full_audit:1@/var/log/audit.log winbind:2</value> </samba:parameter> diff --git a/lib/audit_logging/audit_logging.c b/lib/audit_logging/audit_logging.c index 42b93137c07..6944da7f872 100644 --- a/lib/audit_logging/audit_logging.c +++ b/lib/audit_logging/audit_logging.c @@ -245,6 +245,12 @@ void audit_message_send( return; } + ctx = talloc_new(NULL); + if (ctx == NULL) { + DBG_ERR("Out of memory creating temporary context\n"); + return; + } + /* Need to refetch the address each time as the destination server may * have disconnected and reconnected in the interim, in which case * messages may get lost diff --git a/lib/util/debug.c b/lib/util/debug.c index b5f120bb3a4..30e5a28a233 100644 --- a/lib/util/debug.c +++ b/lib/util/debug.c @@ -86,23 +86,89 @@ /* state variables for the debug system */ static struct { bool initialized; - int fd; /* The log file handle */ enum debug_logtype logtype; /* The type of logging we are doing: eg stdout, file, stderr */ const char *prog_name; bool reopening_logs; bool schedule_reopen_logs; struct debug_settings settings; - char *debugf; debug_callback_fn callback; void *callback_private; } state = { .settings = { .timestamp_logs = true }, - .fd = 2 /* stderr by default */ }; +struct debug_class { + /* + * The debug loglevel of the class. + */ + int loglevel; + + /* + * An optional class specific logfile, may be NULL in which case the + * "global" logfile is used and fd is -1. + */ + char *logfile; + int fd; +}; + +static const char *default_classname_table[] = { + [DBGC_ALL] = "all", + [DBGC_TDB] = "tdb", + [DBGC_PRINTDRIVERS] = "printdrivers", + [DBGC_LANMAN] = "lanman", + [DBGC_SMB] = "smb", + [DBGC_RPC_PARSE] = "rpc_parse", + [DBGC_RPC_SRV] = "rpc_srv", + [DBGC_RPC_CLI] = "rpc_cli", + [DBGC_PASSDB] = "passdb", + [DBGC_SAM] = "sam", + [DBGC_AUTH] = "auth", + [DBGC_WINBIND] = "winbind", + [DBGC_VFS] = "vfs", + [DBGC_IDMAP] = "idmap", + [DBGC_QUOTA] = "quota", + [DBGC_ACLS] = "acls", + [DBGC_LOCKING] = "locking", + [DBGC_MSDFS] = "msdfs", + [DBGC_DMAPI] = "dmapi", + [DBGC_REGISTRY] = "registry", + [DBGC_SCAVENGER] = "scavenger", + [DBGC_DNS] = "dns", + [DBGC_LDB] = "ldb", + [DBGC_TEVENT] = "tevent", + [DBGC_AUTH_AUDIT] = "auth_audit", + [DBGC_AUTH_AUDIT_JSON] = "auth_json_audit", + [DBGC_KERBEROS] = "kerberos", + [DBGC_DRS_REPL] = "drs_repl", + [DBGC_SMB2] = "smb2", + [DBGC_SMB2_CREDITS] = "smb2_credits", + [DBGC_DSDB_AUDIT] = "dsdb_audit", + [DBGC_DSDB_AUDIT_JSON] = "dsdb_json_audit", + [DBGC_DSDB_PWD_AUDIT] = "dsdb_password_audit", + [DBGC_DSDB_PWD_AUDIT_JSON] = "dsdb_password_json_audit", + [DBGC_DSDB_TXN_AUDIT] = "dsdb_transaction_audit", + [DBGC_DSDB_TXN_AUDIT_JSON] = "dsdb_transaction_json_audit", + [DBGC_DSDB_GROUP_AUDIT] = "dsdb_group_audit", + [DBGC_DSDB_GROUP_AUDIT_JSON] = "dsdb_group_json_audit", +}; + +/* + * This is to allow reading of dbgc_config before the debug + * system has been initialized. + */ +static struct debug_class debug_class_list_initial[ARRAY_SIZE(default_classname_table)] = { + [DBGC_ALL] = (struct debug_class) { .fd = 2 }, +}; + +static size_t debug_num_classes = 0; +static struct debug_class *dbgc_config = debug_class_list_initial; + +static int current_msg_level = 0; +static int current_msg_class = 0; + #if defined(WITH_SYSLOG) || defined(HAVE_LIBSYSTEMD_JOURNAL) || defined(HAVE_LIBSYSTEMD) static int debug_level_to_priority(int level) { @@ -141,10 +207,18 @@ static void debug_file_log(int msg_level, const char *msg, const char *msg_no_nl) { ssize_t ret; + int fd; check_log_size(); + + if (dbgc_config[current_msg_class].fd != -1) { + fd = dbgc_config[current_msg_class].fd; + } else { + fd = dbgc_config[DBGC_ALL].fd; + } + do { - ret = write(state.fd, msg, strlen(msg)); + ret = write(fd, msg, strlen(msg)); } while (ret == -1 && errno == EINTR); } @@ -512,64 +586,14 @@ static void debug_backends_log(const char *msg, int msg_level) */ bool override_logfile; -static const char *default_classname_table[] = { - [DBGC_ALL] = "all", - [DBGC_TDB] = "tdb", - [DBGC_PRINTDRIVERS] = "printdrivers", - [DBGC_LANMAN] = "lanman", - [DBGC_SMB] = "smb", - [DBGC_RPC_PARSE] = "rpc_parse", - [DBGC_RPC_SRV] = "rpc_srv", - [DBGC_RPC_CLI] = "rpc_cli", - [DBGC_PASSDB] = "passdb", - [DBGC_SAM] = "sam", - [DBGC_AUTH] = "auth", - [DBGC_WINBIND] = "winbind", - [DBGC_VFS] = "vfs", - [DBGC_IDMAP] = "idmap", - [DBGC_QUOTA] = "quota", - [DBGC_ACLS] = "acls", - [DBGC_LOCKING] = "locking", - [DBGC_MSDFS] = "msdfs", - [DBGC_DMAPI] = "dmapi", - [DBGC_REGISTRY] = "registry", - [DBGC_SCAVENGER] = "scavenger", - [DBGC_DNS] = "dns", - [DBGC_LDB] = "ldb", - [DBGC_TEVENT] = "tevent", - [DBGC_AUTH_AUDIT] = "auth_audit", - [DBGC_AUTH_AUDIT_JSON] = "auth_json_audit", - [DBGC_KERBEROS] = "kerberos", - [DBGC_DRS_REPL] = "drs_repl", - [DBGC_SMB2] = "smb2", - [DBGC_SMB2_CREDITS] = "smb2_credits", - [DBGC_DSDB_AUDIT] = "dsdb_audit", - [DBGC_DSDB_AUDIT_JSON] = "dsdb_json_audit", - [DBGC_DSDB_PWD_AUDIT] = "dsdb_password_audit", - [DBGC_DSDB_PWD_AUDIT_JSON] = "dsdb_password_json_audit", - [DBGC_DSDB_TXN_AUDIT] = "dsdb_transaction_audit", - [DBGC_DSDB_TXN_AUDIT_JSON] = "dsdb_transaction_json_audit", - [DBGC_DSDB_GROUP_AUDIT] = "dsdb_group_audit", - [DBGC_DSDB_GROUP_AUDIT_JSON] = "dsdb_group_json_audit", -}; - -/* - * This is to allow reading of DEBUGLEVEL_CLASS before the debug - * system has been initialized. - */ -static int debug_class_list_initial[ARRAY_SIZE(default_classname_table)]; - -static size_t debug_num_classes = 0; -static int *DEBUGLEVEL_CLASS = debug_class_list_initial; - int debuglevel_get_class(size_t idx) { - return DEBUGLEVEL_CLASS[idx]; + return dbgc_config[idx].loglevel; } void debuglevel_set_class(size_t idx, int level) { - DEBUGLEVEL_CLASS[idx] = level; + dbgc_config[idx].loglevel = level; } @@ -597,7 +621,6 @@ void debuglevel_set_class(size_t idx, int level) */ static int debug_count = 0; -static int current_msg_level = 0; static char format_bufr[FORMAT_BUFR_SIZE]; static size_t format_pos = 0; static bool log_overflow = false; @@ -627,9 +650,10 @@ void gfree_debugsyms(void) TALLOC_FREE(classname_table); - if ( DEBUGLEVEL_CLASS != debug_class_list_initial ) { - TALLOC_FREE( DEBUGLEVEL_CLASS ); - DEBUGLEVEL_CLASS = discard_const_p(int, debug_class_list_initial); + if ( dbgc_config != debug_class_list_initial ) { + TALLOC_FREE( dbgc_config ); + dbgc_config = discard_const_p(struct debug_class, + debug_class_list_initial); } debug_num_classes = 0; @@ -654,7 +678,7 @@ char *debug_list_class_names_and_levels(void) buf = talloc_asprintf_append(buf, "%s:%d%s", classname_table[i], - DEBUGLEVEL_CLASS[i], + dbgc_config[i].loglevel, i == (debug_num_classes - 1) ? "\n" : " "); if (buf == NULL) { return NULL; @@ -687,45 +711,57 @@ static int debug_lookup_classname_int(const char* classname) int debug_add_class(const char *classname) { int ndx; - int *new_class_list; + struct debug_class *new_class_list = NULL; char **new_name_list; int default_level; - if (!classname) + if (classname == NULL) { return -1; + } /* check the init has yet been called */ debug_init(); ndx = debug_lookup_classname_int(classname); - if (ndx >= 0) + if (ndx >= 0) { return ndx; + } ndx = debug_num_classes; - if (DEBUGLEVEL_CLASS == debug_class_list_initial) { + if (dbgc_config == debug_class_list_initial) { /* Initial loading... */ new_class_list = NULL; } else { - new_class_list = DEBUGLEVEL_CLASS; + new_class_list = dbgc_config; } - default_level = DEBUGLEVEL_CLASS[DBGC_ALL]; + default_level = dbgc_config[DBGC_ALL].loglevel; - new_class_list = talloc_realloc(NULL, new_class_list, int, ndx + 1); - if (!new_class_list) + new_class_list = talloc_realloc(NULL, + new_class_list, + struct debug_class, + ndx + 1); + if (new_class_list == NULL) { return -1; - DEBUGLEVEL_CLASS = new_class_list; + } + + dbgc_config = new_class_list; - DEBUGLEVEL_CLASS[ndx] = default_level; + dbgc_config[ndx] = (struct debug_class) { + .loglevel = default_level, + .fd = -1, + }; new_name_list = talloc_realloc(NULL, classname_table, char *, ndx + 1); - if (!new_name_list) + if (new_name_list == NULL) { return -1; + } classname_table = new_name_list; classname_table[ndx] = talloc_strdup(classname_table, classname); - if (! classname_table[ndx]) + if (classname_table[ndx] == NULL) { return -1; + } debug_num_classes = ndx + 1; @@ -766,13 +802,14 @@ static void debug_dump_status(int level) const char *classname = classname_table[q]; DEBUGADD(level, (" %s: %d\n", classname, - DEBUGLEVEL_CLASS[q])); + dbgc_config[q].loglevel)); } } static bool debug_parse_param(char *param) { char *class_name; + char *class_file = NULL; char *class_level; char *saveptr = NULL; int ndx; @@ -782,18 +819,30 @@ static bool debug_parse_param(char *param) return false; } - class_level = strtok_r(NULL, "\0", &saveptr); + class_level = strtok_r(NULL, "@\0", &saveptr); if (class_level == NULL) { return false; } + class_file = strtok_r(NULL, "\0", &saveptr); + ndx = debug_lookup_classname(class_name); if (ndx == -1) { return false; } - DEBUGLEVEL_CLASS[ndx] = atoi(class_level); + dbgc_config[ndx].loglevel = atoi(class_level); + + if (class_file == NULL) { + return true; + } + + TALLOC_FREE(dbgc_config[ndx].logfile); + dbgc_config[ndx].logfile = talloc_strdup(NULL, class_file); + if (dbgc_config[ndx].logfile == NULL) { + return false; + } return true; } @@ -824,15 +873,16 @@ bool debug_parse_levels(const char *params_str) * v.s. "all:10", this is the traditional way to set DEBUGLEVEL */ if (isdigit(tok[0])) { - DEBUGLEVEL_CLASS[DBGC_ALL] = atoi(tok); + dbgc_config[DBGC_ALL].loglevel = atoi(tok); tok = strtok_r(NULL, LIST_SEP, &saveptr); } else { - DEBUGLEVEL_CLASS[DBGC_ALL] = 0; + dbgc_config[DBGC_ALL].loglevel = 0; } /* Array is debug_num_classes long */ for (i = DBGC_ALL+1; i < debug_num_classes; i++) { - DEBUGLEVEL_CLASS[i] = DEBUGLEVEL_CLASS[DBGC_ALL]; + dbgc_config[i].loglevel = dbgc_config[DBGC_ALL].loglevel; + TALLOC_FREE(dbgc_config[i].logfile); } while (tok != NULL) { @@ -883,6 +933,7 @@ static void debug_init(void) for (i = 0; i < ARRAY_SIZE(default_classname_table); i++) { debug_add_class(default_classname_table[i]); } + dbgc_config[DBGC_ALL].fd = 2; for (i = 0; i < ARRAY_SIZE(debug_backends); i++) { debug_backends[i].log_level = -1; @@ -965,8 +1016,8 @@ void debug_set_logfile(const char *name) /* this copes with calls when smb.conf is not loaded yet */ return; } - TALLOC_FREE(state.debugf); - state.debugf = talloc_strdup(NULL, name); + TALLOC_FREE(dbgc_config[DBGC_ALL].logfile); + dbgc_config[DBGC_ALL].logfile = talloc_strdup(NULL, name); } static void debug_close_fd(int fd) @@ -1022,6 +1073,33 @@ static void debug_callback_log(const char *msg, int msg_level) Fix from dgib...@linuxcare.com. **************************************************************************/ +static bool reopen_one_log(int *fd, const char *logfile) +{ + int old_fd = *fd; + int new_fd; + + if (logfile == NULL) { + debug_close_fd(old_fd); + *fd = -1; + return true; + } + + new_fd = open(logfile, O_WRONLY|O_APPEND|O_CREAT, 0644); + if (new_fd == -1) { + log_overflow = true; + DBG_ERR("Unable to open new log file '%s': %s\n", + logfile, strerror(errno)); + log_overflow = false; + return false; + } + + debug_close_fd(old_fd); + smb_set_close_on_exec(new_fd); + *fd = new_fd; + + return true; +} + /** reopen the log file (usually called because the log file name might have changed) */ @@ -1029,8 +1107,8 @@ bool reopen_logs_internal(void) { mode_t oldumask; int new_fd = 0; - int old_fd = 0; - bool ret = true; + size_t i; + bool ok; if (state.reopening_logs) { return true; @@ -1044,14 +1122,14 @@ bool reopen_logs_internal(void) return true; case DEBUG_STDOUT: case DEBUG_DEFAULT_STDOUT: - debug_close_fd(state.fd); - state.fd = 1; + debug_close_fd(dbgc_config[DBGC_ALL].fd); + dbgc_config[DBGC_ALL].fd = 1; return true; case DEBUG_DEFAULT_STDERR: case DEBUG_STDERR: - debug_close_fd(state.fd); - state.fd = 2; + debug_close_fd(dbgc_config[DBGC_ALL].fd); + dbgc_config[DBGC_ALL].fd = 2; return true; case DEBUG_FILE: @@ -1060,24 +1138,23 @@ bool reopen_logs_internal(void) oldumask = umask( 022 ); - if (!state.debugf) { + for (i = DBGC_ALL; i < debug_num_classes; i++) { + if (dbgc_config[DBGC_ALL].logfile != NULL) { + break; + } + } + if (i == debug_num_classes) { return false; -- Samba Shared Repository