From ae1df38c889282608a909e834e85059726ab8ec6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 27 Apr 2021 12:03:24 +0530 Subject: [PATCH] Fallback to mkostemp if O_TMPFILE fails --- kitty/disk-cache.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/kitty/disk-cache.c b/kitty/disk-cache.c index f0582284b..b26fefbff 100644 --- a/kitty/disk-cache.c +++ b/kitty/disk-cache.c @@ -82,14 +82,8 @@ new(PyTypeObject *type, PyObject UNUSED *args, PyObject UNUSED *kwds) { } static int -open_cache_file(const char *cache_path) { +open_cache_file_without_tmpfile(const char *cache_path) { int fd = -1; -#ifdef O_TMPFILE - while (fd < 0) { - fd = safe_open(cache_path, O_TMPFILE | O_CLOEXEC | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR); - if (fd > -1 || errno != EINTR) break; - } -#else size_t sz = strlen(cache_path) + 16; FREE_AFTER_FUNCTION char *buf = calloc(1, sz); if (!buf) { errno = ENOMEM; return -1; } @@ -99,6 +93,20 @@ open_cache_file(const char *cache_path) { if (fd > -1 || errno != EINTR) break; } if (fd > -1) unlink(buf); + return fd; +} + +static int +open_cache_file(const char *cache_path) { + int fd = -1; +#ifdef O_TMPFILE + while (fd < 0) { + fd = safe_open(cache_path, O_TMPFILE | O_CLOEXEC | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR); + if (fd > -1 || errno != EINTR) break; + } + if (fd == -1) fd = open_cache_file_without_tmpfile(cache_path); +#else + fd = open_cache_file_without_tmpfile(cache_path); #endif return fd; }