iu9-ca-web-chat/src/http_server/engine_engine_number_9/os_utils.cpp

77 lines
2.3 KiB
C++

#include "os_utils.h"
#include <utility>
#include "baza_inter.h"
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/socket.h>
namespace een9 {
UniqueFdWrapper::UniqueFdWrapper(int fd_): fd(fd_) {}
UniqueFdWrapper::UniqueFdWrapper(UniqueFdWrapper &&formerOwner) noexcept {
fd = formerOwner.fd;
formerOwner.fd = -1;
}
UniqueFdWrapper& UniqueFdWrapper::operator=(UniqueFdWrapper &&formerOwner) noexcept {
std::swap(fd, formerOwner.fd);
return *this;
}
int UniqueFdWrapper::operator()() const {
return fd;
}
UniqueFdWrapper::~UniqueFdWrapper() {
// printf("DEBUG!!! Closing fd = %d\n", fd);
if (fd >= 0)
close(fd);
}
bool isNeededFsEntity(const std::string &path, mode_t t_mode) {
struct stat info;
errno = 0;
int ret = stat(path.c_str(), &info);
if (errno == 0) {
return (info.st_mode & S_IFMT) == t_mode;
} if (errno == ENOENT)
return false;
THROW_on_errno("stat\"" + path + "\"");
}
bool isRegularFile(const std::string &path) {
return isNeededFsEntity(path, S_IFREG);
}
bool isDirectory(const std::string &path) {
return isNeededFsEntity(path, S_IFDIR);
}
void readFromFileDescriptor(int fd, std::string &result, const std::string &description) {
int ret;
char buf[2048];
while ((ret = (int)read(fd, buf, 2048)) > 0) {
size_t oldN = result.size();
result.resize(oldN + ret);
memcpy((void*)&result.c_str()[oldN], buf, ret);
}
ASSERT_on_iret(ret, "Reading from " + description);
}
void readFile(const std::string &path, std::string &result) {
int fd = open(path.c_str(), O_RDONLY);
ASSERT_on_iret(fd, "Opening \"" + path + "\"");
UniqueFdWrapper fdw(fd);
readFromFileDescriptor(fdw(), result, "file \"" + path + "\"");
}
void configure_socket_rcvsndtimeo(int fd, timeval tv) {
int ret;
ret = setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(timeval));
ASSERT_on_iret_pl(ret);
ret = setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(timeval));
ASSERT_on_iret_pl(ret);
}
}