Mercurial > hg > dhcpcd
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;
