changeset 5395:3ed7914080a9 draft

dhcpcd: improve prior to log to another fd This allows stderr and stdout to be redirected to /dev/null.
author Roy Marples <roy@marples.name>
date Tue, 30 Jun 2020 22:06:00 +0100
parents b7f0ddd5d9bd
children 541348d5a5a9
files src/dhcpcd.c src/logerr.c src/logerr.h
diffstat 3 files changed, 61 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/dhcpcd.c	Tue Jun 30 21:33:24 2020 +0100
+++ b/src/dhcpcd.c	Tue Jun 30 22:06:00 2020 +0100
@@ -371,9 +371,10 @@
 	close(ctx->fork_fd);
 	ctx->fork_fd = -1;
 
-	if (isatty(STDERR_FILENO)) {
+	if (isatty(loggeterrfd())) {
 		logopts &= ~LOGERR_ERR;
 		logsetopts(logopts);
+		logseterrfd(-1);
 	}
 #endif
 }
@@ -2201,7 +2202,8 @@
 
 	loginfox(PACKAGE "-" VERSION " starting");
 	if (freopen(_PATH_DEVNULL, "r", stdin) == NULL)
-		logerr("%s: freopen", __func__);
+		logerr("%s: freopen stdin", __func__);
+
 
 #ifdef PRIVSEP
 	ps_init(&ctx);
@@ -2260,6 +2262,22 @@
 	}
 #endif
 
+	if (isatty(STDOUT_FILENO) &&
+	    freopen(_PATH_DEVNULL, "r", stdout) == NULL)
+		logerr("%s: freopen stdout", __func__);
+	if (isatty(STDERR_FILENO)) {
+		int fd = dup(STDERR_FILENO);
+
+		if (fd == -1)
+			logerr("%s: dup", __func__);
+		else if (logseterrfd(fd) == -1)
+			logerr("%s: logseterrfd", __func__);
+		else if (freopen(_PATH_DEVNULL, "r", stderr) == NULL) {
+			logseterrfd(-1);
+			logerr("%s: freopen stderr", __func__);
+		}
+	}
+
 #if defined(BSD) && defined(INET6)
 	/* Disable the kernel RTADV sysctl as early as possible. */
 	if (ctx.options & DHCPCD_IPV6 && ctx.options & DHCPCD_IPV6RS)
--- a/src/logerr.c	Tue Jun 30 21:33:24 2020 +0100
+++ b/src/logerr.c	Tue Jun 30 22:06:00 2020 +0100
@@ -52,6 +52,7 @@
 struct logctx {
 	char		 log_buf[BUFSIZ];
 	unsigned int	 log_opts;
+	FILE		*log_err;
 #ifndef SMALL
 	FILE		*log_file;
 #ifdef LOGERR_TAG
@@ -116,6 +117,7 @@
 __printflike(3, 0) static int
 vlogprintf_r(struct logctx *ctx, FILE *stream, const char *fmt, va_list args)
 {
+	FILE *err;
 	int len = 0, e;
 	va_list a;
 #ifndef SMALL
@@ -124,8 +126,9 @@
 	bool log_tag;
 #endif
 
-	if ((stream == stderr && ctx->log_opts & LOGERR_ERR_DATE) ||
-	    (stream != stderr && ctx->log_opts & LOGERR_LOG_DATE))
+	err = ctx->log_err == NULL ? stderr : ctx->log_err;
+	if ((stream == err && ctx->log_opts & LOGERR_ERR_DATE) ||
+	    (stream != err && ctx->log_opts & LOGERR_LOG_DATE))
 	{
 		if ((e = logprintdate(stream)) == -1)
 			return -1;
@@ -133,8 +136,8 @@
 	}
 
 #ifdef LOGERR_TAG
-	log_tag = ((stream == stderr && ctx->log_opts & LOGERR_ERR_TAG) ||
-	    (stream != stderr && ctx->log_opts & LOGERR_LOG_TAG));
+	log_tag = ((stream == err && ctx->log_opts & LOGERR_ERR_TAG) ||
+	    (stream != err && ctx->log_opts & LOGERR_LOG_TAG));
 	if (log_tag) {
 		if (ctx->log_tag == NULL)
 			ctx->log_tag = getprogname();
@@ -144,8 +147,8 @@
 	}
 #endif
 
-	log_pid = ((stream == stderr && ctx->log_opts & LOGERR_ERR_PID) ||
-	    (stream != stderr && ctx->log_opts & LOGERR_LOG_PID));
+	log_pid = ((stream == err && ctx->log_opts & LOGERR_ERR_PID) ||
+	    (stream != err && ctx->log_opts & LOGERR_LOG_PID));
 	if (log_pid) {
 		if ((e = fprintf(stream, "[%d]", getpid())) == -1)
 			return -1;
@@ -202,7 +205,12 @@
 	    (pri <= LOG_ERR ||
 	    (!(ctx->log_opts & LOGERR_QUIET) && pri <= LOG_INFO) ||
 	    (ctx->log_opts & LOGERR_DEBUG && pri <= LOG_DEBUG)))
-		len = vlogprintf_r(ctx, stderr, fmt, args);
+	{
+		FILE *err;
+
+		err = ctx->log_err == NULL ? stderr : ctx->log_err;
+		len = vlogprintf_r(ctx, err, fmt, args);
+	}
 
 	if (!(ctx->log_opts & LOGERR_LOG))
 		return len;
@@ -363,6 +371,30 @@
 #endif
 
 int
+loggeterrfd(void)
+{
+	struct logctx *ctx = &_logctx;
+	FILE *err = ctx->log_err == NULL ? stderr : ctx->log_err;
+
+	return fileno(err);
+}
+
+int
+logseterrfd(int fd)
+{
+	struct logctx *ctx = &_logctx;
+
+	if (ctx->log_err != NULL)
+		fclose(ctx->log_err);
+	if (fd == -1) {
+		ctx->log_err = NULL;
+		return 0;
+	}
+	ctx->log_err = fdopen(fd, "a");
+	return ctx->log_err == NULL ? -1 : 0;
+}
+
+int
 logopen(const char *path)
 {
 	struct logctx *ctx = &_logctx;
--- a/src/logerr.h	Tue Jun 30 21:33:24 2020 +0100
+++ b/src/logerr.h	Tue Jun 30 22:06:00 2020 +0100
@@ -97,6 +97,8 @@
 void logsettag(const char *);
 #endif
 
+int loggeterrfd(void);
+int logseterrfd(int);
 int logopen(const char *);
 void logclose(void);
 int logreopen(void);