]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
dhcpcd: improve prior to log to another fd
authorRoy Marples <roy@marples.name>
Tue, 30 Jun 2020 21:06:00 +0000 (22:06 +0100)
committerRoy Marples <roy@marples.name>
Tue, 30 Jun 2020 21:06:00 +0000 (22:06 +0100)
This allows stderr and stdout to be redirected to /dev/null.

src/dhcpcd.c
src/logerr.c
src/logerr.h

index 67f5a9eda567f782b27fdf80fd86db2c9df1296c..891f62f2dc93504e2338aa8042d57daadcf27696 100644 (file)
@@ -371,9 +371,10 @@ dhcpcd_daemonise(struct dhcpcd_ctx *ctx)
        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 @@ printpidfile:
 
        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 @@ printpidfile:
        }
 #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)
index 817c53ca4d1bd76868f96e7e00e2b02594273b5f..8a219b02147681b208b836177ba1371e78486d6d 100644 (file)
@@ -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 @@ logprintdate(FILE *stream)
 __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 @@ vlogprintf_r(struct logctx *ctx, FILE *stream, const char *fmt, va_list args)
        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 @@ vlogprintf_r(struct logctx *ctx, FILE *stream, const char *fmt, va_list args)
        }
 
 #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 @@ vlogprintf_r(struct logctx *ctx, FILE *stream, const char *fmt, va_list args)
        }
 #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 @@ vlogmessage(int pri, const char *fmt, va_list args)
            (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;
@@ -362,6 +370,30 @@ logsettag(const char *tag)
 }
 #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)
 {
index 4b4d6dc42566418e531b4eceff52594eed5d3e8e..82368d1f5b473568ad0ea1f56ff96a82734540fa 100644 (file)
@@ -97,6 +97,8 @@ void logsetopts(unsigned int);
 void logsettag(const char *);
 #endif
 
+int loggeterrfd(void);
+int logseterrfd(int);
 int logopen(const char *);
 void logclose(void);
 int logreopen(void);