diff mbox

[conntrack-tools] log: print messages to stdout/sderr if running in console mode

Message ID 147756970023.18643.10864550353652488496.stgit@nfdev2.cica.es
State Changes Requested
Delegated to: Pablo Neira
Headers show

Commit Message

Arturo Borrero Gonzalez Oct. 27, 2016, 12:01 p.m. UTC
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 <arturo@debian.org>
---
 include/conntrackd.h |    1 +
 src/log.c            |   67 +++++++++++++++++++++++++++++++++++---------------
 src/main.c           |    1 +
 3 files changed, 49 insertions(+), 20 deletions(-)


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

Comments

Pablo Neira Ayuso Oct. 27, 2016, 7:53 p.m. UTC | #1
On Thu, Oct 27, 2016 at 02:01:40PM +0200, Arturo Borrero Gonzalez wrote:
> 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

I'm fine with this. But I'm hitting compilation warnings here:

log.c: In function `logline_put':
log.c:93:23: warning: passing argument 3 of `vfprintf' from incompatible pointer type
  vfprintf(fd, format, args);
                       ^
In file included from ../include/log.h:4:0,
                 from log.c:21:
/usr/include/stdio.h:371:12: note: expected `struct __va_list_tag *'
but argument is of type `struct __va_list_tag (*)[1]'
 extern int vfprintf (FILE *__restrict __s, const char *__restrict __format,
            ^
log.c: In function `dlog':
log.c:117:46: warning: passing argument 4 of `logline_put' from incompatible pointer type
   logline_put(console_out, priority, format, args);
                                              ^
log.c:63:13: note: expected `struct __va_list_tag (*)[1]' but argument is of type `struct __va_list_tag *'
 static void logline_put(FILE *fd, int priority, const char *format,
             ^
log.c:123:37: warning: passing argument 4 of `logline_put' from incompatible pointer type
   logline_put(fd, priority, format, args);
                                     ^
log.c:63:13: note: expected `struct __va_list_tag (*)[1]' but argument is of type `struct __va_list_tag *'
 static void logline_put(FILE *fd, int priority, const char *format,

$ gcc -v
[...]
gcc version 4.9.2 (Debian 4.9.2-10) 
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

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..a3629db 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);