chiark / gitweb /
manager: dump to usual debug channel on SIGUSR2, don't rely on stdin
authorLennart Poettering <lennart@poettering.net>
Fri, 4 Jun 2010 17:45:53 +0000 (19:45 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 4 Jun 2010 17:45:53 +0000 (19:45 +0200)
src/log.c
src/log.h
src/manager.c

index 04ffb62..bf2382d 100644 (file)
--- a/src/log.c
+++ b/src/log.c
@@ -357,6 +357,27 @@ static int log_dispatch(
         return r;
 }
 
+int log_dump_internal(
+        int level,
+        const char*file,
+        int line,
+        const char *func,
+        char *buffer) {
+
+        int saved_errno, r;
+
+        /* This modifies the buffer... */
+
+        if (_likely_(LOG_PRI(level) > log_max_level))
+                return 0;
+
+        saved_errno = errno;
+        r = log_dispatch(level, file, line, func, buffer);
+        errno = saved_errno;
+
+        return r;
+}
+
 int log_meta(
         int level,
         const char*file,
index 0370cb9..9d141dc 100644 (file)
--- a/src/log.h
+++ b/src/log.h
@@ -67,12 +67,23 @@ _noreturn_ void log_assert(
         const char *func,
         const char *format, ...) _printf_attr_(4,5);
 
+/* This modifies the buffer passed! */
+int log_dump_internal(
+        int level,
+        const char*file,
+        int line,
+        const char *func,
+        char *buffer);
+
 #define log_debug(...)   log_meta(LOG_DEBUG,   __FILE__, __LINE__, __func__, __VA_ARGS__)
 #define log_info(...)    log_meta(LOG_INFO,    __FILE__, __LINE__, __func__, __VA_ARGS__)
 #define log_notice(...)  log_meta(LOG_NOTICE,  __FILE__, __LINE__, __func__, __VA_ARGS__)
 #define log_warning(...) log_meta(LOG_WARNING, __FILE__, __LINE__, __func__, __VA_ARGS__)
 #define log_error(...)   log_meta(LOG_ERR,     __FILE__, __LINE__, __func__, __VA_ARGS__)
 
+/* This modifies the buffer passed! */
+#define log_dump(level, buffer) log_dump_internal(level, __FILE__, __LINE__, __func__, buffer)
+
 const char *log_target_to_string(LogTarget target);
 LogTarget log_target_from_string(const char *s);
 
index 28bc4c3..735a1aa 100644 (file)
@@ -1891,10 +1891,32 @@ static int manager_process_signal_fd(Manager *m) {
                         break;
                 }
 
-                case SIGUSR2:
-                        manager_dump_units(m, stdout, "\t");
-                        manager_dump_jobs(m, stdout, "\t");
+                case SIGUSR2: {
+                        FILE *f;
+                        char *dump = NULL;
+                        size_t size;
+
+                        if (!(f = open_memstream(&dump, &size))) {
+                                log_warning("Failed to allocate memory stream.");
+                                break;
+                        }
+
+                        manager_dump_units(m, f, "\t");
+                        manager_dump_jobs(m, f, "\t");
+
+                        if (ferror(f)) {
+                                fclose(f);
+                                free(dump);
+                                log_warning("Failed to write status stream");
+                                break;
+                        }
+
+                        fclose(f);
+                        log_dump(LOG_INFO, dump);
+                        free(dump);
+
                         break;
+                }
 
                 case SIGHUP:
                         m->exit_code = MANAGER_RELOAD;