If conntrackd is running in console mode (i.e. in foreground)
then we can print the log messages to stdout/stderr.

This eases the workflow for admins, since we condensate more info into
the same terminal output.

Example:

% sudo conntrackd -C /etc/conntrackd.conf
WARNING: XXXX is an invalid interface
[Thu Oct 27 13:57:09 2016] (pid=7581) [notice] disabling internal cache
[Thu Oct 27 13:57:09 2016] (pid=7581) [notice] disabling external cache
[Thu Oct 27 13:57:09 2016] (pid=7581) [ERROR] can't open channel socket: No 
such device
[Thu Oct 27 13:57:09 2016] (pid=7581) [ERROR] initialization failed
ERROR: conntrackd cannot start, please check the logfile for more info

Signed-off-by: Arturo Borrero Gonzalez <[email protected]>
---

v2: fix va_list arguments usage by using pointers where needed.

 include/conntrackd.h |    1 +
 src/log.c            |   67 +++++++++++++++++++++++++++++++++++---------------
 src/main.c           |    1 +
 3 files changed, 49 insertions(+), 20 deletions(-)

diff --git a/include/conntrackd.h b/include/conntrackd.h
index f8b11a7..8406c54 100644
--- a/include/conntrackd.h
+++ b/include/conntrackd.h
@@ -110,6 +110,7 @@ struct ct_conf {
        int filter_from_kernelspace;
        int event_iterations_limit;
        int systemd;
+       int running_mode;
        struct {
                int error_queue_length;
        } channelc;
diff --git a/src/log.c b/src/log.c
index d4de111..0796ba9 100644
--- a/src/log.c
+++ b/src/log.c
@@ -60,41 +60,68 @@ int init_log(void)
        return 0;
 }
 
-void dlog(int priority, const char *format, ...)
- {
-       FILE *fd = STATE(log);
+static void logline_put(FILE *fd, int priority, const char *format,
+                       va_list *args)
+{
        time_t t;
        char *buf;
        const char *prio;
+
+       t = time(NULL);
+       buf = ctime(&t);
+       buf[strlen(buf)-1]='\0';
+
+       switch (priority) {
+       case LOG_INFO:
+               prio = "info";
+               break;
+       case LOG_NOTICE:
+               prio = "notice";
+               break;
+       case LOG_WARNING:
+               prio = "warning";
+               break;
+       case LOG_ERR:
+               prio = "ERROR";
+               break;
+       default:
+               prio = "?";
+               break;
+       }
+
+       fprintf(fd, "[%s] (pid=%d) [%s] ", buf, getpid(), prio);
+       vfprintf(fd, format, *args);
+       fprintf(fd, "\n");
+       fflush(fd);
+}
+
+void dlog(int priority, const char *format, ...)
+{
+       FILE *fd = STATE(log);
+       FILE *console_out;
        va_list args;
- 
-       if (fd) {
-               t = time(NULL);
-               buf = ctime(&t);
-               buf[strlen(buf)-1]='\0';
+
+       if (CONFIG(running_mode) != DAEMON) {
                switch (priority) {
                case LOG_INFO:
-                       prio = "info";
-                       break;
                case LOG_NOTICE:
-                       prio = "notice";
+                       console_out = stdout;
                        break;
                case LOG_WARNING:
-                       prio = "warning";
-                       break;
                case LOG_ERR:
-                       prio = "ERROR";
-                       break;
                default:
-                       prio = "?";
+                       console_out = stderr;
                        break;
                }
                va_start(args, format);
-               fprintf(fd, "[%s] (pid=%d) [%s] ", buf, getpid(), prio);
-               vfprintf(fd, format, args);
+               logline_put(console_out, priority, format, &args);
+               va_end(args);
+       }
+
+       if (fd) {
+               va_start(args, format);
+               logline_put(fd, priority, format, &args);
                va_end(args);
-               fprintf(fd, "\n");
-               fflush(fd);
        }
 
        if (CONFIG(syslog_facility) != -1) {
diff --git a/src/main.c b/src/main.c
index 2be9b2f..0319b5c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -150,6 +150,7 @@ int main(int argc, char *argv[])
                switch(argv[i][1]) {
                case 'd':
                        set_operation_mode(&type, DAEMON, argv);
+                       CONFIG(running_mode) = DAEMON;
                        break;
                case 'c':
                        set_operation_mode(&type, REQUEST, argv);

--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to