From 9e4fc3e194be70c641a8acc09dbe08998ff9c86a Mon Sep 17 00:00:00 2001 From: Arne Juul Date: Fri, 13 Jan 2023 10:10:50 +0000 Subject: make a duplicate of the file descriptor in target * lets us log a little more if stderr is later redirected to /dev/null --- vespalog/src/vespa/log/log-target-fd.cpp | 8 ++++---- vespalog/src/vespa/log/log-target-fd.h | 8 ++++---- vespalog/src/vespa/log/log-target.cpp | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/vespalog/src/vespa/log/log-target-fd.cpp b/vespalog/src/vespa/log/log-target-fd.cpp index cb1b2e792b4..a740d3fef06 100644 --- a/vespalog/src/vespa/log/log-target-fd.cpp +++ b/vespalog/src/vespa/log/log-target-fd.cpp @@ -11,14 +11,14 @@ LOG_SETUP(".log"); namespace ns_log { -LogTargetFd::LogTargetFd(const char *target) +LogTargetFd::LogTargetFd(int fd_spec, const char *target) : LogTarget(target), _fd(-1), _istty(false) { - if (strncmp(target, "fd:", 3) != 0) { + _fd = dup(fd_spec); + if (_fd == -1) { throwInvalid("Bad target for LogTargetFd: '%s'", target); } - _fd = strtol(target + 3, NULL, 0); if (isatty(_fd) == 1) { _istty = true; } @@ -26,7 +26,7 @@ LogTargetFd::LogTargetFd(const char *target) LogTargetFd::~LogTargetFd() { - // Must not close _fd, we did not open it! + close(_fd); } diff --git a/vespalog/src/vespa/log/log-target-fd.h b/vespalog/src/vespa/log/log-target-fd.h index fa8df8ce8ed..85857c206b5 100644 --- a/vespalog/src/vespa/log/log-target-fd.h +++ b/vespalog/src/vespa/log/log-target-fd.h @@ -9,12 +9,12 @@ class LogTargetFd : public LogTarget { private: int _fd; bool _istty; - LogTargetFd(); - LogTargetFd(const LogTargetFd&); - LogTargetFd& operator = (const LogTargetFd); + LogTargetFd() = delete; + LogTargetFd(const LogTargetFd&) = delete; + LogTargetFd& operator= (const LogTargetFd) = delete; public: - explicit LogTargetFd(const char *target); + LogTargetFd(int fd_spec, const char *target); int write(const char *buf, int len) override; ~LogTargetFd(); bool makeHumanReadable() const override { return _istty; } diff --git a/vespalog/src/vespa/log/log-target.cpp b/vespalog/src/vespa/log/log-target.cpp index 4ac037354e1..26f064634ca 100644 --- a/vespalog/src/vespa/log/log-target.cpp +++ b/vespalog/src/vespa/log/log-target.cpp @@ -25,21 +25,21 @@ LogTarget * LogTarget::defaultTarget() { // Note! This function cannot LOG(). - return new LogTargetFd("fd:2"); + return new LogTargetFd(2, "fd:2"); } LogTarget * LogTarget::makeTarget(const char *const target) { - LogTarget *res = NULL; if (strncmp(target, "fd:", 3) == 0) { - res = new LogTargetFd(target); + int fd_spec = strtol(target + 3, NULL, 0); + if (fd_spec > 0) { + return new LogTargetFd(fd_spec, target); + } } else if (strncmp(target, "file:", 5) == 0) { - res = new LogTargetFile(target); - } else { - throwInvalid("Log target '%s' is invalid.", target); + return new LogTargetFile(target); } - return res; + throwInvalid("Log target '%s' is invalid.", target); } -- cgit v1.2.3 From 1a7839b48ecc3d87f71123756653969c2f9bfa5f Mon Sep 17 00:00:00 2001 From: Arne Juul Date: Fri, 13 Jan 2023 13:14:40 +0000 Subject: set close-on-exec flag on duplicated file descriptor --- vespalog/src/vespa/log/log-target-fd.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vespalog/src/vespa/log/log-target-fd.cpp b/vespalog/src/vespa/log/log-target-fd.cpp index a740d3fef06..bb7590a9908 100644 --- a/vespalog/src/vespa/log/log-target-fd.cpp +++ b/vespalog/src/vespa/log/log-target-fd.cpp @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include #include +#include #include #include @@ -22,6 +23,7 @@ LogTargetFd::LogTargetFd(int fd_spec, const char *target) if (isatty(_fd) == 1) { _istty = true; } + fcntl(_fd, F_SETFD, FD_CLOEXEC); } LogTargetFd::~LogTargetFd() -- cgit v1.2.3