From: Roy Marples Date: Tue, 30 Jun 2020 21:06:00 +0000 (+0100) Subject: dhcpcd: improve prior to log to another fd X-Git-Tag: v9.1.3~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=070bd2aef3b4e8f9ad3a9b8de6242846cf3cf5be;p=thirdparty%2Fdhcpcd.git dhcpcd: improve prior to log to another fd This allows stderr and stdout to be redirected to /dev/null. --- diff --git a/src/dhcpcd.c b/src/dhcpcd.c index 67f5a9ed..891f62f2 100644 --- a/src/dhcpcd.c +++ b/src/dhcpcd.c @@ -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) diff --git a/src/logerr.c b/src/logerr.c index 817c53ca..8a219b02 100644 --- a/src/logerr.c +++ b/src/logerr.c @@ -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) { diff --git a/src/logerr.h b/src/logerr.h index 4b4d6dc4..82368d1f 100644 --- a/src/logerr.h +++ b/src/logerr.h @@ -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);