]> git.sesse.net Git - cubemap/blob - util.cpp
Provide an install target in the Makefile.
[cubemap] / util.cpp
1 #include <errno.h>
2 #include <stddef.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <sys/stat.h>
6 #include <unistd.h>
7
8 #include "log.h"
9 #include "util.h"
10
11 using namespace std;
12
13 int make_tempfile(const std::string &contents)
14 {
15         char filename[] = "/tmp/cubemap.XXXXXX";
16         mode_t old_umask = umask(077);
17         int fd = mkstemp(filename);
18         umask(old_umask);
19         if (fd == -1) {
20                 log_perror("mkstemp");
21                 return -1;
22         }
23
24         if (unlink(filename) == -1) {
25                 log_perror("unlink");
26                 // Can still continue;
27         }
28
29         const char *ptr = contents.data();
30         size_t to_write = contents.size();
31         while (to_write > 0) {
32                 ssize_t ret = write(fd, ptr, to_write);
33                 if (ret == -1) {
34                         log_perror("write");
35                         safe_close(fd);
36                         return -1;
37                 }
38
39                 ptr += ret;
40                 to_write -= ret;
41         }
42
43         return fd;
44 }
45
46 bool read_tempfile_and_close(int fd, std::string *contents)
47 {
48         bool ok = read_tempfile(fd, contents);
49         safe_close(fd);  // Implicitly deletes the file.
50         return ok;
51 }
52
53 bool read_tempfile(int fd, std::string *contents)
54 {
55         ssize_t ret, has_read;
56
57         off_t len = lseek(fd, 0, SEEK_END);
58         if (len == -1) {
59                 log_perror("lseek");
60                 return false;
61         }
62
63         contents->resize(len);
64
65         if (lseek(fd, 0, SEEK_SET) == -1) {
66                 log_perror("lseek");
67                 return false;
68         }
69
70         has_read = 0;
71         while (has_read < len) {
72                 ret = read(fd, &((*contents)[has_read]), len - has_read);
73                 if (ret == -1) {
74                         log_perror("read");
75                         return false;
76                 }
77                 if (ret == 0) {
78                         log(ERROR, "Unexpected EOF!");
79                         return false;
80                 }
81                 has_read += ret;
82         }
83
84         return true;
85 }
86
87 int safe_close(int fd)
88 {
89         int ret;
90         do {
91                 ret = close(fd);
92         } while (ret == -1 && errno == EINTR);
93
94         if (ret == -1) {
95                 log_perror("close()");
96         }
97
98         return ret;
99 }