|
7 | 7 | #include <zmq.h> |
8 | 8 | #endif |
9 | 9 | #include <chrono> |
| 10 | +#include <memory> |
10 | 11 |
|
11 | 12 | using namespace std; |
12 | 13 | using namespace ToxVPN; |
@@ -48,15 +49,28 @@ int netmode = MODE_TUN; |
48 | 49 |
|
49 | 50 | bool saveState(Tox* tox) { |
50 | 51 | size_t size = tox_get_savedata_size(tox); |
51 | | - uint8_t* savedata = new uint8_t[size]; |
52 | | - tox_get_savedata(tox, savedata); |
53 | | - int fd = open("savedata", O_TRUNC | O_WRONLY | O_CREAT, 0644); |
54 | | - assert(fd); |
55 | | - ssize_t written = write(fd, savedata, size); |
56 | | - assert(written > 0); // FIXME: check even if NDEBUG is disabled |
| 52 | + auto savedata = make_unique<uint8_t[]>(size); |
| 53 | + tox_get_savedata(tox, savedata.get()); |
| 54 | + int fd = open("savedata.new", O_TRUNC | O_WRONLY | O_CREAT, 0644); |
| 55 | + if (fd < 0) { |
| 56 | + perror("cant open savedata.new"); |
| 57 | + return false; |
| 58 | + } |
| 59 | + ssize_t written = write(fd, savedata.get(), size); |
| 60 | + if (written != size) { |
| 61 | + printf("failed to write to savedata.new, %d bytes written out of %d\n", written, size); |
| 62 | + close(fd); |
| 63 | + return false; |
| 64 | + } |
| 65 | + int ret = fdatasync(fd); |
| 66 | + if (ret == -1) { |
| 67 | + perror("cant fdatasync to savedata.new"); |
| 68 | + close(fd); |
| 69 | + return false; |
| 70 | + } |
57 | 71 | close(fd); |
58 | | - delete[] savedata; |
59 | | - return written > 0; |
| 72 | + rename("savedata.new","savedata"); |
| 73 | + return true; |
60 | 74 | } |
61 | 75 |
|
62 | 76 | void do_bootstrap(Tox* tox, ToxVPNCore* toxvpn) { |
@@ -362,6 +376,7 @@ int main(int argc, char** argv) { |
362 | 376 | memset(&interupt, 0, sizeof(interupt)); |
363 | 377 | interupt.sa_handler = &handle_int; |
364 | 378 | sigaction(SIGINT, &interupt, nullptr); |
| 379 | + sigaction(SIGTERM, &interupt, nullptr); |
365 | 380 | #endif |
366 | 381 |
|
367 | 382 | json configRoot; |
|
0 commit comments