diff options
author | Pekka Paalanen <ppaalanen@gmail.com> | 2012-07-10 13:05:02 +0300 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-07-10 14:08:59 -0400 |
commit | a88a4386cbf5f3a627345f12683210c3b81b292b (patch) | |
tree | 2cda8cfaf635c3d3494c2303e7cb79ec63872911 /cursor | |
parent | 9326498d03c9c4b0120082387b623ad70b4205c7 (diff) |
cursor: use os_create_anonymous_file()
Copy the implementation of os_create_anonymous_file() here from weston,
so we can use it instead of hardcoding a path to /tmp.
Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
Diffstat (limited to 'cursor')
-rw-r--r-- | cursor/Makefile.am | 2 | ||||
-rw-r--r-- | cursor/os-compatibility.c | 128 | ||||
-rw-r--r-- | cursor/os-compatibility.h | 31 | ||||
-rw-r--r-- | cursor/wayland-cursor.c | 9 |
4 files changed, 164 insertions, 6 deletions
diff --git a/cursor/Makefile.am b/cursor/Makefile.am index 3efcb17..3987546 100644 --- a/cursor/Makefile.am +++ b/cursor/Makefile.am @@ -4,6 +4,8 @@ include_HEADERS = wayland-cursor.h libwayland_cursor_la_SOURCES = \ wayland-cursor.c \ + os-compatibility.c \ + os-compatibility.h \ xcursor.c \ xcursor.h libwayland_cursor_la_LIBADD = $(top_builddir)/src/libwayland-client.la diff --git a/cursor/os-compatibility.c b/cursor/os-compatibility.c new file mode 100644 index 0000000..418b0d3 --- /dev/null +++ b/cursor/os-compatibility.c @@ -0,0 +1,128 @@ +/* + * Copyright © 2012 Collabora, Ltd. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#define _GNU_SOURCE + +#include <sys/types.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <string.h> +#include <stdlib.h> + +#include "config.h" +#include "os-compatibility.h" + +#ifndef HAVE_MKOSTEMP +static int +set_cloexec_or_close(int fd) +{ + long flags; + + if (fd == -1) + return -1; + + flags = fcntl(fd, F_GETFD); + if (flags == -1) + goto err; + + if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) + goto err; + + return fd; + +err: + close(fd); + return -1; +} +#endif + +static int +create_tmpfile_cloexec(char *tmpname) +{ + int fd; + +#ifdef HAVE_MKOSTEMP + fd = mkostemp(tmpname, O_CLOEXEC); + if (fd >= 0) + unlink(tmpname); +#else + fd = mkstemp(tmpname); + if (fd >= 0) { + fd = set_cloexec_or_close(fd); + unlink(tmpname); + } +#endif + + return fd; +} + +/* + * Create a new, unique, anonymous file of the given size, and + * return the file descriptor for it. The file descriptor is set + * CLOEXEC. The file is immediately suitable for mmap()'ing + * the given size at offset zero. + * + * The file should not have a permanent backing store like a disk, + * but may have if XDG_RUNTIME_DIR is not properly implemented in OS. + * + * The file name is deleted from the file system. + * + * The file is suitable for buffer sharing between processes by + * transmitting the file descriptor over Unix sockets using the + * SCM_RIGHTS methods. + */ +int +os_create_anonymous_file(off_t size) +{ + static const char template[] = "/weston-shared-XXXXXX"; + const char *path; + char *name; + int fd; + + path = getenv("XDG_RUNTIME_DIR"); + if (!path) { + errno = ENOENT; + return -1; + } + + name = malloc(strlen(path) + sizeof(template)); + if (!name) + return -1; + + strcpy(name, path); + strcat(name, template); + + fd = create_tmpfile_cloexec(name); + + free(name); + + if (fd < 0) + return -1; + + if (ftruncate(fd, size) < 0) { + close(fd); + return -1; + } + + return fd; +} diff --git a/cursor/os-compatibility.h b/cursor/os-compatibility.h new file mode 100644 index 0000000..947555c --- /dev/null +++ b/cursor/os-compatibility.h @@ -0,0 +1,31 @@ +/* + * Copyright © 2012 Collabora, Ltd. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef OS_COMPATIBILITY_H +#define OS_COMPATIBILITY_H + +#include <sys/types.h> + +int +os_create_anonymous_file(off_t size); + +#endif /* OS_COMPATIBILITY_H */ diff --git a/cursor/wayland-cursor.c b/cursor/wayland-cursor.c index 36a8b54..c41860a 100644 --- a/cursor/wayland-cursor.c +++ b/cursor/wayland-cursor.c @@ -29,6 +29,8 @@ #include <unistd.h> #include <sys/mman.h> +#include "os-compatibility.h" + struct shm_pool { struct wl_shm_pool *pool; int fd; @@ -41,22 +43,17 @@ static struct shm_pool * shm_pool_create(struct wl_shm *shm, int size) { struct shm_pool *pool; - char filename[] = "/tmp/wayland-shm-XXXXXX"; pool = malloc(sizeof *pool); if (!pool) return NULL; - pool->fd = mkstemp(filename); + pool->fd = os_create_anonymous_file(size); if (pool->fd < 0) goto err_free; - if (ftruncate(pool->fd, size) < 0) - goto err_close; - pool->data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, pool->fd, 0); - unlink(filename); if (pool->data == MAP_FAILED) goto err_close; |