summaryrefslogtreecommitdiffstats
path: root/osdep
diff options
context:
space:
mode:
authorKacper Michajłow <kasper93@gmail.com>2023-11-21 08:32:21 +0100
committerDudemanguy <random342@airmail.cc>2024-01-31 15:38:21 +0000
commite2e75906da76ab587156b29b5847e57b0e29c0b3 (patch)
tree2a7eeb6c67692f56146c09d48bf5b9aeefabb45b /osdep
parent69891c4070f03236c3843fd49e6ee69a46dfe82c (diff)
downloadmpv-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.c29
-rw-r--r--osdep/io.h1
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