Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Aug 2010 17:03:06 +0000 (UTC)
From:      Attilio Rao <attilio@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r211708 - projects/sv/usr.sbin/netdumpsrv
Message-ID:  <201008231703.o7NH36GD046903@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: attilio
Date: Mon Aug 23 17:03:06 2010
New Revision: 211708
URL: http://svn.freebsd.org/changeset/base/211708

Log:
  Add a -D flag that runs the tool in 'debugging mode', avoiding
  daemonization and having output on console instead.

Modified:
  projects/sv/usr.sbin/netdumpsrv/netdump_server.c

Modified: projects/sv/usr.sbin/netdumpsrv/netdump_server.c
==============================================================================
--- projects/sv/usr.sbin/netdumpsrv/netdump_server.c	Mon Aug 23 16:47:29 2010	(r211707)
+++ projects/sv/usr.sbin/netdumpsrv/netdump_server.c	Mon Aug 23 17:03:06 2010	(r211708)
@@ -44,6 +44,7 @@
 #include <assert.h>
 #include <inttypes.h>
 #include <signal.h>
+#include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -54,16 +55,17 @@
 
 #define	PFLAGS_ABIND	0x01
 #define	PFLAGS_DDIR	0x02
-#define	PFLAGS_SCRIPT	0x04
+#define	PFLAGS_DEBUG	0x04
+#define	PFLAGS_SCRIPT	0x08
 
 #define	LOGERR(m, ...)							\
-	syslog(LOG_ERR | LOG_DAEMON, (m), ## __VA_ARGS__)
+	(*phook)(LOG_ERR | LOG_DAEMON, (m), ## __VA_ARGS__)
 #define	LOGERR_PERROR(m)						\
-	syslog(LOG_ERR | LOG_DAEMON, "%s: %s\n", m, strerror(errno))
+	(*phook)(LOG_ERR | LOG_DAEMON, "%s: %s\n", m, strerror(errno))
 #define	LOGINFO(m, ...)							\
-	syslog(LOG_INFO | LOG_DAEMON, (m), ## __VA_ARGS__)
+	(*phook)(LOG_INFO | LOG_DAEMON, (m), ## __VA_ARGS__)
 #define	LOGWARN(m, ...)							\
-	syslog(LOG_WARNING | LOG_DAEMON, (m), ## __VA_ARGS__)
+	(*phook)(LOG_WARNING | LOG_DAEMON, (m), ## __VA_ARGS__)
 
 #define	client_ntoa(cl)							\
 	inet_ntoa((cl)->ip)
@@ -100,6 +102,9 @@ static time_t last_timeout_check;
 static int do_shutdown;
 static int sock;
 
+/* Daemon print functions hook. */
+static void (*phook)(int, const char *, ...);
+
 static struct netdump_client	*alloc_client(struct sockaddr_in *sip);
 static void		 eventloop(void);
 static void		 exec_handler(struct netdump_client *client,
@@ -118,6 +123,9 @@ static void		 handle_packet(struct netdu
 static void		 handle_timeout(struct netdump_client *client);
 static void		 handle_vmcore(struct netdump_client *client,
 			    struct netdump_msg *msg);
+static void		 phook_printf(int priority __unused,
+			    const char *message, ...);
+static void		 phook_syslog(int priority, const char *message, ...);
 static int		 receive_message(int isock, struct sockaddr_in *from,
 			    char *fromstr, size_t fromstrlen,
 			    struct netdump_msg *msg);
@@ -135,6 +143,24 @@ usage(const char *cmd)
 	    cmd);
 }
 
+static void
+phook_printf(int priority __unused, const char *message, ...)
+{
+	va_list ap;
+
+	va_start(ap, message);
+	vprintf(message, ap);
+}
+
+static void
+phook_syslog(int priority, const char *message, ...)
+{
+	va_list ap;
+
+	va_start(ap, message);
+	vsyslog(priority, message, ap);
+}
+
 static struct netdump_client *
 alloc_client(struct sockaddr_in *sip)
 {
@@ -744,7 +770,7 @@ main(int argc, char **argv)
 		exit(1);
 	}
 
-	while ((ch = getopt(argc, argv, "a:d:i:")) != -1) {
+	while ((ch = getopt(argc, argv, "a:Dd:i:")) != -1) {
 		switch (ch) {
 		case 'a':
 			pflags |= PFLAGS_ABIND;
@@ -755,6 +781,9 @@ main(int argc, char **argv)
 			}
 			printf("Listening on IP %s\n", optarg);
 			break;
+		case 'D':
+			pflags |= PFLAGS_DEBUG;
+			break;
 		case 'd':
 			pflags |= PFLAGS_DDIR;
 			assert(dumpdir[0] == '\0');
@@ -798,6 +827,10 @@ main(int argc, char **argv)
 		strcpy(dumpdir, "/var/crash");
 		printf("Default: dumping on /var/crash/\n");
 	}
+	if ((pflags & PFLAGS_DEBUG) == 0)
+		phook = phook_syslog;
+	else
+		phook = phook_printf;
 
 	/* Further sanity checks on dump location. */
 	if (stat(dumpdir, &statbuf)) {
@@ -817,7 +850,7 @@ main(int argc, char **argv)
 		    strerror(errno));
 	}
 
-	if (daemon(0, 0) == -1) {
+	if ((pflags & PFLAGS_DEBUG) == 0 && daemon(0, 0) == -1) {
 		pidfile_remove(pfh);
 		perror("daemon()");
 		fprintf(stderr, "Impossible to demonize the process\n");



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008231703.o7NH36GD046903>