diff options
author | Kacper Michajłow <kasper93@gmail.com> | 2023-11-21 08:32:21 +0100 |
---|---|---|
committer | Dudemanguy <random342@airmail.cc> | 2024-01-31 15:38:21 +0000 |
commit | e2e75906da76ab587156b29b5847e57b0e29c0b3 (patch) | |
tree | 2a7eeb6c67692f56146c09d48bf5b9aeefabb45b /osdep | |
parent | 69891c4070f03236c3843fd49e6ee69a46dfe82c (diff) | |
download | mpv-e2e75906da76ab587156b29b5847e57b0e29c0b3.tar.bz2 mpv-e2e75906da76ab587156b29b5847e57b0e29c0b3.tar.xz |
io: add mp_save_file
Move from vo_gpu_next.c to io.c and return result.
Diffstat (limited to 'osdep')
-rw-r--r-- | osdep/io.c | 29 | ||||
-rw-r--r-- | osdep/io.h | 1 |
2 files changed, 30 insertions, 0 deletions
diff --git a/osdep/io.c b/osdep/io.c index 93f97b5ecf..617764c16a 100644 --- a/osdep/io.c +++ b/osdep/io.c @@ -918,3 +918,32 @@ int mp_mkostemps(char *template, int suffixlen, int flags) errno = EEXIST; return -1; } + +bool mp_save_to_file(const char *filepath, const void *data, size_t size) +{ + assert(filepath && data && size); + + bool result = false; + char *tmp = talloc_asprintf(NULL, "%sXXXXXX", filepath); + int fd = mkstemp(tmp); + if (fd < 0) + goto done; + FILE *cache = fdopen(fd, "wb"); + if (!cache) { + close(fd); + unlink(tmp); + goto done; + } + size_t written = fwrite(data, size, 1, cache); + int ret = fclose(cache); + if (written > 0 && !ret) { + ret = rename(tmp, filepath); + result = !ret; + } else { + unlink(tmp); + } + +done: + talloc_free(tmp); + return result; +} diff --git a/osdep/io.h b/osdep/io.h index 0a0d01eb05..31d17154ed 100644 --- a/osdep/io.h +++ b/osdep/io.h @@ -240,5 +240,6 @@ extern char **environ; #endif /* __MINGW32__ */ int mp_mkostemps(char *template, int suffixlen, int flags); +bool mp_save_to_file(const char *filepath, const void *data, size_t size); #endif |