polybar-dwm/src/utils/file.cpp
2016-11-03 12:54:32 +01:00

88 lines
1.8 KiB
C++

#include "utils/file.hpp"
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <fstream>
#include "utils/scope.hpp"
LEMONBUDDY_NS
namespace file_util {
/**
* Destructor: close file handler
*/
file_ptr::~file_ptr() {
if (m_ptr != nullptr)
fclose(m_ptr);
}
/**
* Logical operator testing if the file handler was created
*/
file_ptr::operator bool() {
return m_ptr != nullptr;
}
/**
* Call operator returning a pointer to the file handler
*/
FILE* file_ptr::operator()() {
return m_ptr;
}
/**
* Checks if the given file exist
*/
bool exists(string filename) {
struct stat buffer;
return stat(filename.c_str(), &buffer) == 0;
}
/**
* Gets the contents of the given file
*/
string get_contents(string filename) {
try {
std::ifstream ifs(filename);
string contents((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
return contents;
} catch (std::ios_base::failure& e) {
return string{""};
}
}
/**
* Puts the given file descriptor into blocking mode
*/
void set_block(int fd) {
int flags = fcntl(fd, F_GETFL, 0);
flags &= ~O_NONBLOCK;
if (fcntl(fd, F_SETFL, flags) == -1)
throw system_error("Failed to unset O_NONBLOCK");
}
/**
* Puts the given file descriptor into non-blocking mode
*/
void set_nonblock(int fd) {
int flags = fcntl(fd, F_GETFL, 0);
flags |= O_NONBLOCK;
if (fcntl(fd, F_SETFL, flags) == -1)
throw system_error("Failed to set O_NONBLOCK");
}
/**
* Checks if the given file is a named pipe
*/
bool is_fifo(string filename) {
auto fileptr = make_unique<file_ptr>(filename);
int fd = fileno((*fileptr)());
struct stat statbuf;
fstat(fd, &statbuf);
return S_ISFIFO(statbuf.st_mode);
}
}
LEMONBUDDY_NS_END