mirror of
https://github.com/nghttp2/nghttp2.git
synced 2025-12-08 02:58:53 +08:00
src: Move log related functions from util.cc to shrpx_log.cc
This commit is contained in:
@@ -487,7 +487,7 @@ void exec_binary() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// restores original stderr
|
// restores original stderr
|
||||||
util::restore_original_fds();
|
restore_original_fds();
|
||||||
|
|
||||||
if (execve(argv[0], argv.get(), envp.get()) == -1) {
|
if (execve(argv[0], argv.get(), envp.get()) == -1) {
|
||||||
auto error = errno;
|
auto error = errno;
|
||||||
@@ -2878,7 +2878,7 @@ int main(int argc, char **argv) {
|
|||||||
fill_default_config(mod_config());
|
fill_default_config(mod_config());
|
||||||
|
|
||||||
// make copy of stderr
|
// make copy of stderr
|
||||||
util::store_original_fds();
|
store_original_fds();
|
||||||
|
|
||||||
// First open log files with default configuration, so that we can
|
// First open log files with default configuration, so that we can
|
||||||
// log errors/warnings while reading configuration files.
|
// log errors/warnings while reading configuration files.
|
||||||
|
|||||||
@@ -33,7 +33,11 @@
|
|||||||
#ifdef HAVE_INTTYPES_H
|
#ifdef HAVE_INTTYPES_H
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#endif // HAVE_INTTYPES_H
|
#endif // HAVE_INTTYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#ifdef HAVE_FCNTL_H
|
||||||
|
#include <fcntl.h>
|
||||||
|
#endif // HAVE_FCNTL_H
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
@@ -410,7 +414,7 @@ int reopen_log_files() {
|
|||||||
auto &errorconf = config->logging.error;
|
auto &errorconf = config->logging.error;
|
||||||
|
|
||||||
if (!accessconf.syslog && !accessconf.file.empty()) {
|
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) {
|
if (new_accesslog_fd == -1) {
|
||||||
LOG(ERROR) << "Failed to open accesslog file " << accessconf.file;
|
LOG(ERROR) << "Failed to open accesslog file " << accessconf.file;
|
||||||
@@ -419,7 +423,7 @@ int reopen_log_files() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!errorconf.syslog && !errorconf.file.empty()) {
|
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 (new_errorlog_fd == -1) {
|
||||||
if (lgconf->errorlog_fd != -1) {
|
if (lgconf->errorlog_fd != -1) {
|
||||||
@@ -433,8 +437,8 @@ int reopen_log_files() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
util::close_log_file(lgconf->accesslog_fd);
|
close_log_file(lgconf->accesslog_fd);
|
||||||
util::close_log_file(lgconf->errorlog_fd);
|
close_log_file(lgconf->errorlog_fd);
|
||||||
|
|
||||||
lgconf->accesslog_fd = new_accesslog_fd;
|
lgconf->accesslog_fd = new_accesslog_fd;
|
||||||
lgconf->errorlog_fd = new_errorlog_fd;
|
lgconf->errorlog_fd = new_errorlog_fd;
|
||||||
@@ -478,4 +482,60 @@ void redirect_stderr_to_errorlog() {
|
|||||||
dup2(lgconf->errorlog_fd, STDERR_FILENO);
|
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
|
} // namespace shrpx
|
||||||
|
|||||||
@@ -173,6 +173,24 @@ void log_chld(pid_t pid, int rstatus, const char *msg);
|
|||||||
|
|
||||||
void redirect_stderr_to_errorlog();
|
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
|
} // namespace shrpx
|
||||||
|
|
||||||
#endif // SHRPX_LOG_H
|
#endif // SHRPX_LOG_H
|
||||||
|
|||||||
54
src/util.cc
54
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 ascii_dump(const uint8_t *data, size_t len) {
|
||||||
std::string res;
|
std::string res;
|
||||||
|
|
||||||
|
|||||||
18
src/util.h
18
src/util.h
@@ -489,24 +489,6 @@ std::string to_numeric_addr(const Address *addr);
|
|||||||
// Sets |port| to |addr|.
|
// Sets |port| to |addr|.
|
||||||
void set_port(Address &addr, uint16_t port);
|
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
|
// Returns ASCII dump of |data| of length |len|. Only ASCII printable
|
||||||
// characters are preserved. Other characters are replaced with ".".
|
// characters are preserved. Other characters are replaced with ".".
|
||||||
std::string ascii_dump(const uint8_t *data, size_t len);
|
std::string ascii_dump(const uint8_t *data, size_t len);
|
||||||
|
|||||||
Reference in New Issue
Block a user