summaryrefslogtreecommitdiffstats
path: root/server/util
diff options
context:
space:
mode:
Diffstat (limited to 'server/util')
-rw-r--r--server/util/debug.c37
-rw-r--r--server/util/server.c26
-rw-r--r--server/util/util.h5
3 files changed, 66 insertions, 2 deletions
diff --git a/server/util/debug.c b/server/util/debug.c
index a7b3a0916..c6aa27c92 100644
--- a/server/util/debug.c
+++ b/server/util/debug.c
@@ -24,12 +24,19 @@
#include <stdarg.h>
#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
#include "util/util.h"
const char *debug_prg_name = "sssd";
int debug_level = 0;
int debug_timestamps = 0;
+int debug_to_file = 0;
+const char *debug_log_file = "sssd";
+FILE *debug_file = NULL;
+
void debug_fn(const char *format, ...)
{
va_list ap;
@@ -47,7 +54,8 @@ void debug_fn(const char *format, ...)
va_end(ap);
/*write(state.fd, s, strlen(s));*/
- fprintf(stderr, s);
+ fprintf(debug_file ? debug_file : stderr, s);
+ fflush(debug_file ? debug_file : stderr);
free(s);
}
@@ -90,3 +98,30 @@ void ldb_debug_messages(void *context, enum ldb_debug_level level,
}
free(message);
}
+
+int open_debug_file()
+{
+ FILE *f = NULL;
+ char *logpath;
+ mode_t old_umask;
+ int ret;
+
+ ret = asprintf(&logpath, "%s/%s.log", LOG_PATH, debug_log_file);
+ if (ret == -1) {
+ return ENOMEM;
+ }
+
+ if (debug_file) fclose(debug_file);
+
+ old_umask = umask(0177);
+ f = fopen(logpath, "a");
+ if (f == NULL) {
+ free(logpath);
+ return EIO;
+ }
+ umask(old_umask);
+
+ debug_file = f;
+ free(logpath);
+ return EOK;
+}
diff --git a/server/util/server.c b/server/util/server.c
index a8c502409..e8daf87cb 100644
--- a/server/util/server.c
+++ b/server/util/server.c
@@ -298,6 +298,7 @@ int server_setup(const char *name, int flags,
char *conf_db;
int ret = EOK;
bool dt;
+ bool dl;
debug_prg_name = strdup(name);
if (!debug_prg_name) {
@@ -352,7 +353,6 @@ int server_setup(const char *name, int flags,
DEBUG(0,("Out of memory, aborting!\n"));
return ENOMEM;
}
- DEBUG(3, ("CONFDB: %s\n", conf_db));
ret = confdb_init(ctx, &ctx->confdb_ctx, conf_db);
if (ret != EOK) {
@@ -382,6 +382,30 @@ int server_setup(const char *name, int flags,
}
if (dt) debug_timestamps = 1;
+ /* same for debug to file */
+ dl = (debug_to_file != 0);
+ ret = confdb_get_bool(ctx->confdb_ctx, ctx, conf_entry,
+ CONFDB_SERVICE_DEBUG_TO_FILES,
+ dl, &dl);
+ if (ret != EOK) {
+ DEBUG(0, ("Error reading from confdb (%d) [%s]\n",
+ ret, strerror(ret)));
+ return ret;
+ }
+ if (dl) debug_to_file = 1;
+
+ /* open log file if told so */
+ if (debug_to_file) {
+ ret = open_debug_file();
+ if (ret != EOK) {
+ DEBUG(0, ("Error setting up logging (%d) [%s]\n",
+ ret, strerror(ret)));
+ return ret;
+ }
+ }
+
+ DEBUG(3, ("CONFDB: %s\n", conf_db));
+
if (flags & FLAGS_INTERACTIVE) {
/* terminate when stdin goes away */
stdin_event_flags = TEVENT_FD_READ;
diff --git a/server/util/util.h b/server/util/util.h
index ea7f44e83..0212df062 100644
--- a/server/util/util.h
+++ b/server/util/util.h
@@ -43,11 +43,15 @@ typedef int errno_t;
extern const char *debug_prg_name;
extern int debug_level;
extern int debug_timestamps;
+extern int debug_to_file;
+extern const char *debug_log_file;
void debug_fn(const char *format, ...);
#define SSSD_DEBUG_OPTS \
{"debug-level", 'd', POPT_ARG_INT, &debug_level, 0, \
"Debug level", NULL}, \
+ {"debug-to-files", 'f', POPT_ARG_NONE, &debug_to_file, 0, \
+ "Send the debug output to files instead of stderr", NULL }, \
{"debug-timestamps", 0, POPT_ARG_NONE, &debug_timestamps, 0, \
"Add debug timestamps", NULL},
@@ -133,6 +137,7 @@ void debug_fn(const char *format, ...);
/* From debug.c */
void ldb_debug_messages(void *context, enum ldb_debug_level level,
const char *fmt, va_list ap);
+int open_debug_file(void);
/* from server.c */
struct main_context {