diff options
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/debug.c | 52 | ||||
-rw-r--r-- | src/util/sss_ldap.c | 82 | ||||
-rw-r--r-- | src/util/sss_ldap.h | 3 | ||||
-rw-r--r-- | src/util/util.h | 3 |
4 files changed, 140 insertions, 0 deletions
diff --git a/src/util/debug.c b/src/util/debug.c index 54fb8011b..305799bdc 100644 --- a/src/util/debug.c +++ b/src/util/debug.c @@ -274,3 +274,55 @@ void talloc_log_fn(const char *message) { DEBUG(SSSDBG_FATAL_FAILURE, (message)); } + +int reopen_stderr_for_libldap(const char *filename) +{ + int ret; + char *logpath; + const char *log_file; + FILE *new_stderr; + TALLOC_CTX *tmp_ctx; + + if (!debug_to_file) return EOK; + + tmp_ctx = talloc_new(NULL); + if (!tmp_ctx) return ENOMEM; + + log_file = filename ? filename : debug_log_file; + + logpath = talloc_asprintf(tmp_ctx, "%s/%s.log", LOG_PATH, log_file); + if (logpath == NULL) { + ret = ENOMEM; + goto done; + } + + fclose(stderr); + new_stderr = freopen(logpath, "a", stderr); + if (!new_stderr) { + ret = errno; + DEBUG(SSSDBG_OP_FAILURE, ("Couldn't reopen stderr to logfile\n")); + goto done; + } + + ret = EOK; +done: + talloc_free(tmp_ctx); + return ret; +} + +int reopen_stderr_after_libldap(void) +{ + FILE *new_stderr; + int ret; + + if (!debug_to_file) return EOK; + + new_stderr = freopen("/dev/null", "a", stderr); + if (!new_stderr) { + ret = errno; + DEBUG(SSSDBG_OP_FAILURE, ("Couldn't reopen stderr to logfile\n")); + return ret; + } + + return EOK; +} diff --git a/src/util/sss_ldap.c b/src/util/sss_ldap.c index 060aacf9e..878ed4a63 100644 --- a/src/util/sss_ldap.c +++ b/src/util/sss_ldap.c @@ -590,3 +590,85 @@ done: talloc_free(filter); return ret; } + +int sss_ldap_set_debug(int *old_debug) +{ + const char *dbg; + static const char dbg_var[] = "SSSD_DEBUG_LDAP_SEARCH"; + int ret; + int new_debug; + int ldap_old_debug; + char *endptr; + + dbg = getenv(dbg_var); + if (!dbg){ + DEBUG(SSSDBG_TRACE_LIBS, ("No extra LDAP debugging set\n")); + return EOK; + } + + errno = 0; + new_debug = strtol(dbg, &endptr, 0); + if (errno != 0) { + ret = errno; + DEBUG(SSSDBG_OP_FAILURE, + ("strtol failed on [%s]: [%d][%s].\n", dbg, ret, strerror(ret))); + return ret; + } + + if (*endptr != '\0') { + DEBUG(SSSDBG_OP_FAILURE, + ("Found additional characters [%s] in debug level [%s].\n", + endptr, dbg)); + return EINVAL; + } + + ret = reopen_stderr_for_libldap(NULL); + if (ret != EOK) { + DEBUG(SSSDBG_OP_FAILURE, ("Could not redirect stderr to log file\n")); + return ret; + } + + ret = ldap_get_option(NULL, LDAP_OPT_DEBUG_LEVEL, + &ldap_old_debug); + if (ret != LDAP_OPT_SUCCESS) { + DEBUG(SSSDBG_OP_FAILURE, ("Could not save old LDAP debug level\n")); + return EIO; + } + + DEBUG(8, ("LDAP debug level was %#X setting to %#X\n", + ldap_old_debug, new_debug)); + + ret = ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, + &new_debug); + if (ret != LDAP_OPT_SUCCESS) { + DEBUG(SSSDBG_OP_FAILURE, ("Could not set LDAP debugging\n")); + return EIO; + } + + if (old_debug) *old_debug = ldap_old_debug; + + return EOK; +} + +int sss_ldap_reset_debug(int ldap_old_debug) +{ + int ret; + + ret = reopen_stderr_after_libldap(); + if (ret != EOK) { + DEBUG(SSSDBG_OP_FAILURE, + ("Could not redirect stderr back to /dev/null\n")); + return ret; + } + + ret = ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, + &ldap_old_debug); + if (ret != LDAP_SUCCESS) { + DEBUG(SSSDBG_OP_FAILURE, ("Could not reset LDAP debugging\n")); + return EIO; + } + + DEBUG(SSSDBG_TRACE_LIBS, + ("Resetting LDAP debug level to %#X\n", ldap_old_debug)); + return EOK; +} diff --git a/src/util/sss_ldap.h b/src/util/sss_ldap.h index 46829259a..de1cf6a48 100644 --- a/src/util/sss_ldap.h +++ b/src/util/sss_ldap.h @@ -76,4 +76,7 @@ bool sss_ldap_dn_in_search_bases(TALLOC_CTX *mem_ctx, struct sdap_search_base **search_bases, char **_filter); +int sss_ldap_set_debug(int *old_debug); +int sss_ldap_reset_debug(int ldap_old_debug); + #endif /* __SSS_LDAP_H__ */ diff --git a/src/util/util.h b/src/util/util.h index df1ee3b08..1f269e595 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -67,6 +67,9 @@ int debug_get_level(int old_level); int debug_convert_old_level(int old_level); errno_t set_debug_file_from_fd(const int fd); +int reopen_stderr_for_libldap(const char *filename); +int reopen_stderr_after_libldap(void); + #define SSSDBG_FATAL_FAILURE 0x0010 /* level 0 */ #define SSSDBG_CRIT_FAILURE 0x0020 /* level 1 */ #define SSSDBG_OP_FAILURE 0x0040 /* level 2 */ |