From 50f2ef4ba33b540fa5a8e324996fa639500765f4 Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Wed, 17 Feb 2016 22:06:36 +0100 Subject: Move io utilities into separate compilation unit --- src/utility/io.cc | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/utility/io.cc (limited to 'src/utility/io.cc') diff --git a/src/utility/io.cc b/src/utility/io.cc new file mode 100644 index 0000000..3f54c6f --- /dev/null +++ b/src/utility/io.cc @@ -0,0 +1,56 @@ +#include "io.h" + +#include +#include +#include +#include + +namespace utility { + +FileDescriptorGuard::FileDescriptorGuard(const std::string& path) { + this->fd_ = open(path.c_str(), O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR); + + if ( !this->fd_ ) { + this->fd_ = STDERR_FILENO; + } +} + +FileDescriptorGuard::~FileDescriptorGuard() { + close(this->fd_); +} + +FileDescriptorGuard::operator int() { + return this->fd_; +} + +std::string get_file_path(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); +} + +bool is_regular_file(const char* path) { + struct stat fd_stat; + lstat(path, &fd_stat); + + return S_ISREG(fd_stat.st_mode); +} + +} -- cgit v1.2.3