X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=util.cpp;h=8159e3821ccb1071efa8801ae8a63b90b65d2db4;hp=c8e26d26aa65e5f36a6fa0b64692e767e176c006;hb=0d72f384a1de672824298262ba5c427ec0aee2d6;hpb=7ddd07eb95bb3216fad47aa6d3eb76a8b2648579 diff --git a/util.cpp b/util.cpp index c8e26d2..8159e38 100644 --- a/util.cpp +++ b/util.cpp @@ -1,8 +1,10 @@ +#include +#include #include #include #include -#include +#include "log.h" #include "util.h" using namespace std; @@ -12,12 +14,12 @@ int make_tempfile(const std::string &contents) char filename[] = "/tmp/cubemap.XXXXXX"; int fd = mkstemp(filename); if (fd == -1) { - perror("mkstemp"); + log_perror("mkstemp"); return -1; } if (unlink(filename) == -1) { - perror("unlink"); + log_perror("unlink"); // Can still continue; } @@ -26,7 +28,7 @@ int make_tempfile(const std::string &contents) while (to_write > 0) { ssize_t ret = write(fd, ptr, to_write); if (ret == -1) { - perror("write"); + log_perror("write"); close(fd); return -1; } @@ -40,35 +42,49 @@ int make_tempfile(const std::string &contents) bool read_tempfile(int fd, std::string *contents) { + bool ok = true; + ssize_t ret, has_read; + + off_t len = lseek(fd, 0, SEEK_END); + if (len == -1) { + log_perror("lseek"); + ok = false; + goto done; + } + + contents->resize(len); + if (lseek(fd, 0, SEEK_SET) == -1) { - perror("lseek"); - return false; + log_perror("lseek"); + ok = false; + goto done; } - char buf[4096]; - for ( ;; ) { - ssize_t ret = read(fd, buf, sizeof(buf)); + has_read = 0; + while (has_read < len) { + ret = read(fd, &((*contents)[has_read]), len - has_read); if (ret == -1) { - perror("read"); - return false; + log_perror("read"); + ok = false; + goto done; } if (ret == 0) { - // EOF. - break; + log(ERROR, "Unexpected EOF!"); + ok = false; + goto done; } - - contents->append(string(buf, buf + ret)); + has_read += ret; } - int ret; +done: do { ret = close(fd); // Implicitly deletes the files. } while (ret == -1 && errno == EINTR); if (ret == -1) { - perror("close"); + log_perror("close"); // Can still continue. } - return true; + return ok; }