diff options
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/utility/io.cc | 56 | ||||
-rw-r--r-- | src/utility/io.h | 55 |
3 files changed, 64 insertions, 48 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index e67c827..a7cfb5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,7 @@ add_library( src/main.cc src/bootstrap.cc src/init/alloc.cc + src/utility/io.cc src/utility/logger.cc src/tracking/path_matcher.cc src/tracking/change_tracker.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 <unistd.h> +#include <dlfcn.h> +#include <fcntl.h> +#include <sys/stat.h> + +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); +} + +} diff --git a/src/utility/io.h b/src/utility/io.h index 4c09b30..1015ddb 100644 --- a/src/utility/io.h +++ b/src/utility/io.h @@ -1,67 +1,26 @@ #ifndef CHANGE_SRC_UTILITY_IO_H_ #define CHANGE_SRC_UTILITY_IO_H_ -#include <unistd.h> -#include <dlfcn.h> -#include <fcntl.h> -#include <sys/stat.h> - -#include <cstring> +#include <string> namespace utility { class FileDescriptorGuard { public: - 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() { - close(this->fd_); - } + FileDescriptorGuard(const std::string& path); + ~FileDescriptorGuard(); - operator int() { - return this->fd_; - } + operator int(); private: int 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); +std::string get_file_path(int fd); - return S_ISREG(fd_stat.st_mode); -} +bool is_regular_file(int fd); +bool is_regular_file(const char* path); } |