From e02c486b604ea54f8b268a1f73d38f4ddb3078a4 Mon Sep 17 00:00:00 2001 From: emersion Date: Sat, 21 Jul 2018 11:55:54 +0100 Subject: [PATCH] Use posix_fallocate when available --- meson.build | 4 ++++ util/os-compatibility.c | 44 ++++++++++++++++++++--------------------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/meson.build b/meson.build index 3aefd8f8..d43d22f1 100644 --- a/meson.build +++ b/meson.build @@ -130,6 +130,10 @@ else exclude_headers += 'xwayland.h' endif +if cc.has_header_symbol('fcntl.h', 'posix_fallocate', prefix: '#define _POSIX_C_SOURCE 200112L') + conf_data.set('WLR_HAS_POSIX_FALLOCATE', true) +endif + includedir = get_option('includedir') exclude_headers += 'meson.build' install_subdir('include/wlr', install_dir: includedir, exclude_files: exclude_headers) diff --git a/util/os-compatibility.c b/util/os-compatibility.c index 38333605..70539eef 100644 --- a/util/os-compatibility.c +++ b/util/os-compatibility.c @@ -23,7 +23,7 @@ * SOFTWARE. */ -#define _XOPEN_SOURCE 700 +#define _POSIX_C_SOURCE 200809L #include #include #include @@ -35,17 +35,18 @@ #include "util/os-compatibility.h" int os_fd_set_cloexec(int fd) { - long flags; - - if (fd == -1) + if (fd == -1) { return -1; + } - flags = fcntl(fd, F_GETFD); - if (flags == -1) + long flags = fcntl(fd, F_GETFD); + if (flags == -1) { return -1; + } - if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) + if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) { return -1; + } return 0; } @@ -58,15 +59,14 @@ int set_cloexec_or_close(int fd) { return fd; } -int create_tmpfile_cloexec(char *tmpname) -{ +int create_tmpfile_cloexec(char *tmpname) { int fd; - mode_t prev_umask = umask(0066); #ifdef HAVE_MKOSTEMP fd = mkostemp(tmpname, O_CLOEXEC); - if (fd >= 0) + if (fd >= 0) { unlink(tmpname); + } #else fd = mkstemp(tmpname); if (fd >= 0) { @@ -102,32 +102,29 @@ int create_tmpfile_cloexec(char *tmpname) */ int os_create_anonymous_file(off_t size) { static const char template[] = "/wlroots-shared-XXXXXX"; - const char *path; - char *name; - int fd; - int ret; - path = getenv("XDG_RUNTIME_DIR"); + const char *path = getenv("XDG_RUNTIME_DIR"); if (!path) { errno = ENOENT; return -1; } - name = malloc(strlen(path) + sizeof(template)); - if (!name) + char *name = malloc(strlen(path) + sizeof(template)); + if (!name) { return -1; + } strcpy(name, path); strcat(name, template); - fd = create_tmpfile_cloexec(name); - + int fd = create_tmpfile_cloexec(name); free(name); - - if (fd < 0) + if (fd < 0) { return -1; + } -#ifdef HAVE_POSIX_FALLOCATE +#ifdef WLR_HAS_POSIX_FALLOCATE + int ret; do { ret = posix_fallocate(fd, 0, size); } while (ret == EINTR); @@ -137,6 +134,7 @@ int os_create_anonymous_file(off_t size) { return -1; } #else + int ret; do { ret = ftruncate(fd, size); } while (ret < 0 && errno == EINTR);