mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-08 10:06:22 -05:00
shm: unbreak build without memfd_create
New FreeBSD versions have memfd_create but other BSDs don't.
pgo/pgo.c:260:22: error: implicit declaration of function 'memfd_create' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
int mem_fd = memfd_create("foot-pgo-ptmx", MFD_CLOEXEC);
^
pgo/pgo.c:260:52: error: use of undeclared identifier 'MFD_CLOEXEC'
int mem_fd = memfd_create("foot-pgo-ptmx", MFD_CLOEXEC);
^
shm.c:13:10: fatal error: 'linux/mman.h' file not found
#include <linux/mman.h>
^~~~~~~~~~~~~~
shm.c:277:15: error: implicit declaration of function 'memfd_create' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
pool_fd = memfd_create("foot-wayland-shm-buffer-pool", MFD_CLOEXEC | MFD_ALLOW_SEALING);
^
shm.c:277:60: error: use of undeclared identifier 'MFD_CLOEXEC'
pool_fd = memfd_create("foot-wayland-shm-buffer-pool", MFD_CLOEXEC | MFD_ALLOW_SEALING);
^
shm.c:277:74: error: use of undeclared identifier 'MFD_ALLOW_SEALING'
pool_fd = memfd_create("foot-wayland-shm-buffer-pool", MFD_CLOEXEC | MFD_ALLOW_SEALING);
^
shm.c:339:15: error: use of undeclared identifier 'F_SEAL_GROW'
F_SEAL_GROW | F_SEAL_SHRINK | /*F_SEAL_FUTURE_WRITE |*/ F_SEAL_SEAL) < 0)
^
shm.c:339:29: error: use of undeclared identifier 'F_SEAL_SHRINK'
F_SEAL_GROW | F_SEAL_SHRINK | /*F_SEAL_FUTURE_WRITE |*/ F_SEAL_SEAL) < 0)
^
shm.c:339:71: error: use of undeclared identifier 'F_SEAL_SEAL'
F_SEAL_GROW | F_SEAL_SHRINK | /*F_SEAL_FUTURE_WRITE |*/ F_SEAL_SEAL) < 0)
^
shm.c:338:24: error: use of undeclared identifier 'F_ADD_SEALS'
if (fcntl(pool_fd, F_ADD_SEALS,
^
This commit is contained in:
parent
93fd77e01b
commit
fcf3f124d6
3 changed files with 25 additions and 2 deletions
|
|
@ -12,6 +12,10 @@ is_debug_build = get_option('buildtype').startswith('debug')
|
|||
|
||||
cc = meson.get_compiler('c')
|
||||
|
||||
if cc.has_function('memfd_create')
|
||||
add_project_arguments('-DMEMFD_CREATE', language: 'c')
|
||||
endif
|
||||
|
||||
add_project_arguments(
|
||||
['-D_POSIX_C_SOURCE=200809L', '-D_GNU_SOURCE=200809L'] +
|
||||
(is_debug_build
|
||||
|
|
|
|||
|
|
@ -257,7 +257,16 @@ main(int argc, const char *const *argv)
|
|||
|
||||
close(fd);
|
||||
|
||||
#if defined(MEMFD_CREATE)
|
||||
int mem_fd = memfd_create("foot-pgo-ptmx", MFD_CLOEXEC);
|
||||
#elif defined(__FreeBSD__)
|
||||
// memfd_create on FreeBSD 13 is SHM_ANON without sealing support
|
||||
int mem_fd = shm_open(SHM_ANON, O_RDWR | O_CLOEXEC, 0600);
|
||||
#else
|
||||
char name[] = "/tmp/foot-pgo-ptmx-XXXXXX";
|
||||
int mem_fd = mkostemp(name, O_CLOEXEC);
|
||||
unlink(name);
|
||||
#endif
|
||||
if (mem_fd < 0) {
|
||||
fprintf(stderr, "error: failed to create memory FD\n");
|
||||
goto out;
|
||||
|
|
|
|||
14
shm.c
14
shm.c
|
|
@ -10,8 +10,7 @@
|
|||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/time.h>
|
||||
#include <linux/mman.h>
|
||||
#include <linux/memfd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <pixman.h>
|
||||
|
|
@ -276,7 +275,16 @@ shm_get_buffer(struct wl_shm *shm, int width, int height, unsigned long cookie,
|
|||
LOG_DBG("cookie=%lx: allocating new buffer: %zu KB", cookie, size / 1024);
|
||||
|
||||
/* Backing memory for SHM */
|
||||
#if defined(MEMFD_CREATE)
|
||||
pool_fd = memfd_create("foot-wayland-shm-buffer-pool", MFD_CLOEXEC | MFD_ALLOW_SEALING);
|
||||
#elif defined(__FreeBSD__)
|
||||
// memfd_create on FreeBSD 13 is SHM_ANON without sealing support
|
||||
pool_fd = shm_open(SHM_ANON, O_RDWR | O_CLOEXEC, 0600);
|
||||
#else
|
||||
char name[] = "/tmp/foot-wayland-shm-buffer-pool-XXXXXX";
|
||||
pool_fd = mkostemp(name, O_CLOEXEC);
|
||||
unlink(name);
|
||||
#endif
|
||||
if (pool_fd == -1) {
|
||||
LOG_ERRNO("failed to create SHM backing memory file");
|
||||
goto err;
|
||||
|
|
@ -335,6 +343,7 @@ shm_get_buffer(struct wl_shm *shm, int width, int height, unsigned long cookie,
|
|||
goto err;
|
||||
}
|
||||
|
||||
#if defined(MEMFD_CREATE)
|
||||
/* Seal file - we no longer allow any kind of resizing */
|
||||
/* TODO: wayland mmaps(PROT_WRITE), for some unknown reason, hence we cannot use F_SEAL_FUTURE_WRITE */
|
||||
if (fcntl(pool_fd, F_ADD_SEALS,
|
||||
|
|
@ -343,6 +352,7 @@ shm_get_buffer(struct wl_shm *shm, int width, int height, unsigned long cookie,
|
|||
LOG_ERRNO("failed to seal SHM backing memory file");
|
||||
/* This is not a fatal error */
|
||||
}
|
||||
#endif
|
||||
|
||||
pool = wl_shm_create_pool(shm, pool_fd, memfd_size);
|
||||
if (pool == NULL) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue