nghttpx: better handle /dev/stderr and /dev/stdout

This commit is contained in:
Tomasz Buchert 2015-08-12 20:05:10 +02:00
parent b384b76f66
commit 06a0f3480e
3 changed files with 32 additions and 22 deletions

View File

@ -326,31 +326,25 @@ void upstream_accesslog(const std::vector<LogFragment> &lfv,
int reopen_log_files() { int reopen_log_files() {
int res = 0; int res = 0;
int new_accesslog_fd = -1;
int new_errorlog_fd = -1;
auto lgconf = log_config(); 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) { if (!get_config()->accesslog_syslog && get_config()->accesslog_file) {
lgconf->accesslog_fd = new_accesslog_fd = util::open_log_file(get_config()->accesslog_file.get());
util::reopen_log_file(get_config()->accesslog_file.get());
if (lgconf->accesslog_fd == -1) { if (new_accesslog_fd == -1) {
LOG(ERROR) << "Failed to open accesslog file " LOG(ERROR) << "Failed to open accesslog file "
<< get_config()->accesslog_file.get(); << get_config()->accesslog_file.get();
res = -1; res = -1;
} }
} }
int new_errorlog_fd = -1;
if (!get_config()->errorlog_syslog && get_config()->errorlog_file) { 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 (new_errorlog_fd == -1) {
if (lgconf->errorlog_fd != -1) { if (lgconf->errorlog_fd != -1) {
@ -365,16 +359,13 @@ int reopen_log_files() {
} }
} }
if (lgconf->errorlog_fd != -1) { util::close_log_file(lgconf->accesslog_fd);
close(lgconf->errorlog_fd); util::close_log_file(lgconf->errorlog_fd);
lgconf->errorlog_fd = -1;
lgconf->errorlog_tty = false;
}
if (new_errorlog_fd != -1) { lgconf->accesslog_fd = new_accesslog_fd;
lgconf->errorlog_fd = new_errorlog_fd; lgconf->errorlog_fd = new_errorlog_fd;
lgconf->errorlog_tty = isatty(lgconf->errorlog_fd); lgconf->errorlog_tty = (new_errorlog_fd == -1) ?
} false : isatty(new_errorlog_fd);
return res; return res;
} }

View File

@ -657,7 +657,21 @@ std::string numeric_name(const struct sockaddr *sa, socklen_t salen) {
return host.data(); 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) #if defined(__ANDROID__) || defined(ANDROID)
int fd; int fd;

View File

@ -516,10 +516,15 @@ bool numeric_host(const char *hostname);
// failed, "unknown" is returned. // failed, "unknown" is returned.
std::string numeric_name(const struct sockaddr *sa, socklen_t salen); 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 // Opens |path| with O_APPEND enabled. If file does not exist, it is
// created first. This function returns file descriptor referring the // created first. This function returns file descriptor referring the
// opened file if it succeeds, or -1. // 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 // 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 ".".