[PATCH wayland 3/4] cursor: use os_create_anonymous_file()
Kristian Høgsberg
hoegsberg at gmail.com
Tue Jul 10 11:09:17 PDT 2012
On Tue, Jul 10, 2012 at 01:05:02PM +0300, Pekka Paalanen wrote:
> Copy the implementation of os_create_anonymous_file() here from weston,
> so we can use it instead of hardcoding a path to /tmp.
Thanks, that's better.
Kristian
> Signed-off-by: Pekka Paalanen <ppaalanen at gmail.com>
> ---
> configure.ac | 2 +-
> cursor/Makefile.am | 2 +
> cursor/os-compatibility.c | 128 +++++++++++++++++++++++++++++++++++++++++++++
> cursor/os-compatibility.h | 31 +++++++++++
> cursor/wayland-cursor.c | 9 +--
> 5 files changed, 165 insertions(+), 7 deletions(-)
> create mode 100644 cursor/os-compatibility.c
> create mode 100644 cursor/os-compatibility.h
>
> diff --git a/configure.ac b/configure.ac
> index ad9de80..ae32c19 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -39,7 +39,7 @@ if test "x$GCC" = "xyes"; then
> fi
> AC_SUBST(GCC_CFLAGS)
>
> -AC_CHECK_FUNCS([accept4])
> +AC_CHECK_FUNCS([accept4 mkostemp])
>
> AC_ARG_ENABLE([scanner],
> [AC_HELP_STRING([--disable-scanner],
> 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;
> --
> 1.7.8.6
>
More information about the wayland-devel
mailing list