From 4be5de1163e8cf782620001b08cc95d76169c08d Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Mon, 9 Jan 2017 19:34:40 +0900 Subject: [PATCH] src: Move log related functions from util.cc to shrpx_log.cc --- src/shrpx.cc | 4 +-- src/shrpx_log.cc | 70 ++++++++++++++++++++++++++++++++++++++++++++---- src/shrpx_log.h | 18 +++++++++++++ src/util.cc | 54 ------------------------------------- src/util.h | 18 ------------- 5 files changed, 85 insertions(+), 79 deletions(-) diff --git a/src/shrpx.cc b/src/shrpx.cc index eaa9afc6..56e2ba09 100644 --- a/src/shrpx.cc +++ b/src/shrpx.cc @@ -487,7 +487,7 @@ void exec_binary() { } // restores original stderr - util::restore_original_fds(); + restore_original_fds(); if (execve(argv[0], argv.get(), envp.get()) == -1) { auto error = errno; @@ -2878,7 +2878,7 @@ int main(int argc, char **argv) { fill_default_config(mod_config()); // make copy of stderr - util::store_original_fds(); + store_original_fds(); // First open log files with default configuration, so that we can // log errors/warnings while reading configuration files. diff --git a/src/shrpx_log.cc b/src/shrpx_log.cc index 330d539b..25353861 100644 --- a/src/shrpx_log.cc +++ b/src/shrpx_log.cc @@ -33,7 +33,11 @@ #ifdef HAVE_INTTYPES_H #include #endif // HAVE_INTTYPES_H - +#include +#include +#ifdef HAVE_FCNTL_H +#include +#endif // HAVE_FCNTL_H #include #include @@ -410,7 +414,7 @@ int reopen_log_files() { auto &errorconf = config->logging.error; if (!accessconf.syslog && !accessconf.file.empty()) { - new_accesslog_fd = util::open_log_file(accessconf.file.c_str()); + new_accesslog_fd = open_log_file(accessconf.file.c_str()); if (new_accesslog_fd == -1) { LOG(ERROR) << "Failed to open accesslog file " << accessconf.file; @@ -419,7 +423,7 @@ int reopen_log_files() { } if (!errorconf.syslog && !errorconf.file.empty()) { - new_errorlog_fd = util::open_log_file(errorconf.file.c_str()); + new_errorlog_fd = open_log_file(errorconf.file.c_str()); if (new_errorlog_fd == -1) { if (lgconf->errorlog_fd != -1) { @@ -433,8 +437,8 @@ int reopen_log_files() { } } - util::close_log_file(lgconf->accesslog_fd); - util::close_log_file(lgconf->errorlog_fd); + close_log_file(lgconf->accesslog_fd); + close_log_file(lgconf->errorlog_fd); lgconf->accesslog_fd = new_accesslog_fd; lgconf->errorlog_fd = new_errorlog_fd; @@ -478,4 +482,60 @@ void redirect_stderr_to_errorlog() { dup2(lgconf->errorlog_fd, STDERR_FILENO); } +namespace { +int STDERR_COPY = -1; +int STDOUT_COPY = -1; +} // namespace + +void store_original_fds() { + // consider dup'ing stdout too + STDERR_COPY = dup(STDERR_FILENO); + STDOUT_COPY = STDOUT_FILENO; + // no race here, since it is called early + util::make_socket_closeonexec(STDERR_COPY); +} + +void restore_original_fds() { dup2(STDERR_COPY, STDERR_FILENO); } + +void close_log_file(int &fd) { + if (fd != STDERR_COPY && fd != STDOUT_COPY && fd != -1) { + close(fd); + } + fd = -1; +} + +int open_log_file(const char *path) { + + if (strcmp(path, "/dev/stdout") == 0 || + strcmp(path, "/proc/self/fd/1") == 0) { + return STDOUT_COPY; + } + + if (strcmp(path, "/dev/stderr") == 0 || + strcmp(path, "/proc/self/fd/2") == 0) { + return STDERR_COPY; + } +#if defined O_CLOEXEC + + auto fd = open(path, O_WRONLY | O_APPEND | O_CREAT | O_CLOEXEC, + S_IRUSR | S_IWUSR | S_IRGRP); +#else // !O_CLOEXEC + + auto fd = + open(path, O_WRONLY | O_APPEND | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP); + + // We get race condition if execve is called at the same time. + if (fd != -1) { + util::make_socket_closeonexec(fd); + } + +#endif // !O_CLOEXEC + + if (fd == -1) { + return -1; + } + + return fd; +} + } // namespace shrpx diff --git a/src/shrpx_log.h b/src/shrpx_log.h index 85aeea72..d93d49c8 100644 --- a/src/shrpx_log.h +++ b/src/shrpx_log.h @@ -173,6 +173,24 @@ void log_chld(pid_t pid, int rstatus, const char *msg); void redirect_stderr_to_errorlog(); +// Makes internal copy of stderr (and possibly stdout in the future), +// which is then used as pointer to /dev/stderr or /proc/self/fd/2 +void store_original_fds(); + +// Restores the original stderr that was stored with copy_original_fds +// Used just before execv +void restore_original_fds(); + +// 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 open_log_file(const char *path); + } // namespace shrpx #endif // SHRPX_LOG_H diff --git a/src/util.cc b/src/util.cc index 6f9b59cb..587fee51 100644 --- a/src/util.cc +++ b/src/util.cc @@ -678,60 +678,6 @@ void set_port(Address &addr, uint16_t port) { } } -static int STDERR_COPY = -1; -static int STDOUT_COPY = -1; - -void store_original_fds() { - // consider dup'ing stdout too - STDERR_COPY = dup(STDERR_FILENO); - STDOUT_COPY = STDOUT_FILENO; - // no race here, since it is called early - make_socket_closeonexec(STDERR_COPY); -} - -void restore_original_fds() { dup2(STDERR_COPY, STDERR_FILENO); } - -void close_log_file(int &fd) { - if (fd != STDERR_COPY && fd != STDOUT_COPY && fd != -1) { - close(fd); - } - fd = -1; -} - -int open_log_file(const char *path) { - - if (strcmp(path, "/dev/stdout") == 0 || - strcmp(path, "/proc/self/fd/1") == 0) { - return STDOUT_COPY; - } - - if (strcmp(path, "/dev/stderr") == 0 || - strcmp(path, "/proc/self/fd/2") == 0) { - return STDERR_COPY; - } -#if defined O_CLOEXEC - - auto fd = open(path, O_WRONLY | O_APPEND | O_CREAT | O_CLOEXEC, - S_IRUSR | S_IWUSR | S_IRGRP); -#else // !O_CLOEXEC - - auto fd = - open(path, O_WRONLY | O_APPEND | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP); - - // We get race condition if execve is called at the same time. - if (fd != -1) { - make_socket_closeonexec(fd); - } - -#endif // !O_CLOEXEC - - if (fd == -1) { - return -1; - } - - return fd; -} - std::string ascii_dump(const uint8_t *data, size_t len) { std::string res; diff --git a/src/util.h b/src/util.h index cda97a05..3bf5ff92 100644 --- a/src/util.h +++ b/src/util.h @@ -489,24 +489,6 @@ std::string to_numeric_addr(const Address *addr); // Sets |port| to |addr|. void set_port(Address &addr, uint16_t port); -// Makes internal copy of stderr (and possibly stdout in the future), -// which is then used as pointer to /dev/stderr or /proc/self/fd/2 -void store_original_fds(); - -// Restores the original stderr that was stored with copy_original_fds -// Used just before execv -void restore_original_fds(); - -// 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 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 ".". std::string ascii_dump(const uint8_t *data, size_t len);