From ceb01fb33a039d4f315c9aa9217320be44cefa2d Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Sun, 18 Oct 2015 17:19:55 +0200 Subject: Move io and logging functionality into separate namespaces --- io.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 io.h (limited to 'io.h') diff --git a/io.h b/io.h new file mode 100644 index 0000000..c9ce30e --- /dev/null +++ b/io.h @@ -0,0 +1,54 @@ +#ifndef CHANGE_IO_H_ +#define CHANGE_IO_H_ + +#include +#include +#include +#include + +#include + +namespace io { + +struct FileDescriptorGuard { + FileDescriptorGuard(const std::string& path) { + this->fd = open(path.c_str(), O_WRONLY | O_APPEND); + + if ( !this->fd ) { + this->fd = STDERR_FILENO; + } + } + + ~FileDescriptorGuard() { + close(this->fd); + } + + int fd; +}; + +std::string get_file_name(int fd) { + char proc_link[20]; + char file_name[256]; + + snprintf(proc_link, sizeof(proc_link), "/proc/self/fd/%d", fd); + const ssize_t name_size = readlink(proc_link, file_name, sizeof(file_name)); + + if ( name_size > 0 ) { + file_name[name_size] = '\0'; + + return std::string(file_name); + } else { + return std::string(); + } +} + +bool is_regular_file(int fd) { + struct stat fd_stat; + fstat(fd, &fd_stat); + + return S_ISREG(fd_stat.st_mode); +} + +} + +#endif // CHANGE_IO_H_ -- cgit v1.2.3