From 06a0f3480e42e1f06531772d338f15cf182185f1 Mon Sep 17 00:00:00 2001 From: Tomasz Buchert Date: Wed, 12 Aug 2015 20:05:10 +0200 Subject: [PATCH] nghttpx: better handle /dev/stderr and /dev/stdout --- src/shrpx_log.cc | 31 +++++++++++-------------------- src/util.cc | 16 +++++++++++++++- src/util.h | 7 ++++++- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/shrpx_log.cc b/src/shrpx_log.cc index d31fa023..5c853e9b 100644 --- a/src/shrpx_log.cc +++ b/src/shrpx_log.cc @@ -326,31 +326,25 @@ void upstream_accesslog(const std::vector &lfv, int reopen_log_files() { int res = 0; + int new_accesslog_fd = -1; + int new_errorlog_fd = -1; auto lgconf = log_config(); - if (lgconf->accesslog_fd != -1) { - close(lgconf->accesslog_fd); - lgconf->accesslog_fd = -1; - } - if (!get_config()->accesslog_syslog && get_config()->accesslog_file) { - lgconf->accesslog_fd = - util::reopen_log_file(get_config()->accesslog_file.get()); + new_accesslog_fd = util::open_log_file(get_config()->accesslog_file.get()); - if (lgconf->accesslog_fd == -1) { + if (new_accesslog_fd == -1) { LOG(ERROR) << "Failed to open accesslog file " << get_config()->accesslog_file.get(); res = -1; } } - int new_errorlog_fd = -1; - if (!get_config()->errorlog_syslog && get_config()->errorlog_file) { - new_errorlog_fd = util::reopen_log_file(get_config()->errorlog_file.get()); + new_errorlog_fd = util::open_log_file(get_config()->errorlog_file.get()); if (new_errorlog_fd == -1) { if (lgconf->errorlog_fd != -1) { @@ -365,16 +359,13 @@ int reopen_log_files() { } } - if (lgconf->errorlog_fd != -1) { - close(lgconf->errorlog_fd); - lgconf->errorlog_fd = -1; - lgconf->errorlog_tty = false; - } + util::close_log_file(lgconf->accesslog_fd); + util::close_log_file(lgconf->errorlog_fd); - if (new_errorlog_fd != -1) { - lgconf->errorlog_fd = new_errorlog_fd; - lgconf->errorlog_tty = isatty(lgconf->errorlog_fd); - } + lgconf->accesslog_fd = new_accesslog_fd; + lgconf->errorlog_fd = new_errorlog_fd; + lgconf->errorlog_tty = (new_errorlog_fd == -1) ? + false : isatty(new_errorlog_fd); return res; } diff --git a/src/util.cc b/src/util.cc index a5865606..6f72366f 100644 --- a/src/util.cc +++ b/src/util.cc @@ -657,7 +657,21 @@ std::string numeric_name(const struct sockaddr *sa, socklen_t salen) { return host.data(); } -int reopen_log_file(const char *path) { + +void close_log_file(int &fd) { + if (fd != STDERR_FILENO && fd != STDOUT_FILENO && fd != -1) { + close(fd); + } + fd = -1; +} + +int open_log_file(const char *path) { + if (strcmp(path, "/dev/stdout") == 0) { + return STDOUT_FILENO; + } + if (strcmp(path, "/dev/stderr") == 0) { + return STDERR_FILENO; + } #if defined(__ANDROID__) || defined(ANDROID) int fd; diff --git a/src/util.h b/src/util.h index b945e9f2..b6860a07 100644 --- a/src/util.h +++ b/src/util.h @@ -516,10 +516,15 @@ bool numeric_host(const char *hostname); // failed, "unknown" is returned. std::string numeric_name(const struct sockaddr *sa, socklen_t salen); +// Closes |fd| which was returned by open_log_file (see below) +// and sets it to -1. In the case that |fd| points to stdout or +// stderr, or is -1, the descriptor is not closed (but still set to -1). +void close_log_file(int &fd); + // Opens |path| with O_APPEND enabled. If file does not exist, it is // created first. This function returns file descriptor referring the // opened file if it succeeds, or -1. -int reopen_log_file(const char *path); +int open_log_file(const char *path); // Returns ASCII dump of |data| of length |len|. Only ASCII printable // characters are preserved. Other characters are replaced with ".".