From 6a66bd864b9b95258a198e65849fa693f88032aa Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Sun, 18 Oct 2015 17:27:50 +0200 Subject: Prevent external changes to `FileDescriptorGuard`'s fd member --- change_log.cc | 2 +- io.h | 27 +++++++++++++++++---------- utility.h | 1 + 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/change_log.cc b/change_log.cc index dc245da..5ca0e8e 100644 --- a/change_log.cc +++ b/change_log.cc @@ -33,7 +33,7 @@ void init() { fd_guard = std::make_unique( getenv("CHANGE_LOG_TARGET") ); - log = std::make_unique(fd_guard->fd); + log = std::make_unique(*fd_guard); } else { log = std::make_unique(STDERR_FILENO); } diff --git a/io.h b/io.h index c9ce30e..87778ec 100644 --- a/io.h +++ b/io.h @@ -10,20 +10,27 @@ namespace io { -struct FileDescriptorGuard { - FileDescriptorGuard(const std::string& path) { - this->fd = open(path.c_str(), O_WRONLY | O_APPEND); +class FileDescriptorGuard { + public: + FileDescriptorGuard(const std::string& path) { + this->fd = open(path.c_str(), O_WRONLY | O_APPEND); + + if ( !this->fd ) { + this->fd = STDERR_FILENO; + } + } - if ( !this->fd ) { - this->fd = STDERR_FILENO; + ~FileDescriptorGuard() { + close(this->fd); } - } - ~FileDescriptorGuard() { - close(this->fd); - } + operator int() { + return this->fd; + } + + private: + int fd; - int fd; }; std::string get_file_name(int fd) { diff --git a/utility.h b/utility.h index ec4529e..27ce8e9 100644 --- a/utility.h +++ b/utility.h @@ -20,6 +20,7 @@ class Logger { private: __gnu_cxx::stdio_filebuf buffer; std::ostream stream; + }; } -- cgit v1.2.3