Date: Tue, 24 Jan 2017 23:44:13 +0000 (UTC) From: Baptiste Daroussin <bapt@FreeBSD.org> To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r432406 - in head/x11-servers: . wayland wayland/files Message-ID: <201701242344.v0ONiD7D087893@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: bapt Date: Tue Jan 24 23:44:12 2017 New Revision: 432406 URL: https://svnweb.freebsd.org/changeset/ports/432406 Log: Import Wayland This port was first created by kwm@ then updated and improved by Johannes Lundberg Wayland is intended as a simpler replacement for X, easier to develop and maintain. GNOME and KDE are expected to be ported to it. Wayland is a protocol for a compositor to talk to its clients as well as a C library implementation of that protocol. The compositor can be a standalone display server running on Linux kernel modesetting and evdev input devices, an X application, or a wayland client itself. The clients can be traditional applications, X servers (rootless or fullscreen) or other display servers. Please report bugs to the FreeBSD bugtracker! WWW: http://wayland.freedesktop.org/ Added: head/x11-servers/wayland/ head/x11-servers/wayland/Makefile (contents, props changed) head/x11-servers/wayland/distinfo (contents, props changed) head/x11-servers/wayland/files/ head/x11-servers/wayland/files/patch-Makefile.am (contents, props changed) head/x11-servers/wayland/files/patch-configure.ac (contents, props changed) head/x11-servers/wayland/files/patch-src_wayland-os.c (contents, props changed) head/x11-servers/wayland/files/patch-src_wayland-os.h (contents, props changed) head/x11-servers/wayland/files/patch-src_wayland-server.c (contents, props changed) head/x11-servers/wayland/files/patch-src_wayland-shm.c (contents, props changed) head/x11-servers/wayland/files/patch-tests_client-test.c (contents, props changed) head/x11-servers/wayland/files/patch-tests_connection-test.c (contents, props changed) head/x11-servers/wayland/files/patch-tests_event-loop-test.c (contents, props changed) head/x11-servers/wayland/files/patch-tests_os-wrappers-test.c (contents, props changed) head/x11-servers/wayland/files/patch-tests_queue-test.c (contents, props changed) head/x11-servers/wayland/files/patch-tests_sanity-test.c (contents, props changed) head/x11-servers/wayland/files/patch-tests_test-helpers.c (contents, props changed) head/x11-servers/wayland/files/patch-tests_test-runner.c (contents, props changed) head/x11-servers/wayland/pkg-descr (contents, props changed) head/x11-servers/wayland/pkg-plist (contents, props changed) Modified: head/x11-servers/Makefile Modified: head/x11-servers/Makefile ============================================================================== --- head/x11-servers/Makefile Tue Jan 24 23:42:53 2017 (r432405) +++ head/x11-servers/Makefile Tue Jan 24 23:44:12 2017 (r432406) @@ -3,6 +3,7 @@ COMMENT = X11 servers + SUBDIR += wayland SUBDIR += Xfstt SUBDIR += x11rdp SUBDIR += x2vnc Added: head/x11-servers/wayland/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/Makefile Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,47 @@ +# Created by: kwm@FreeBSD.org +# $FreeBSD$ + +# NOTE +# Changes made by kwm to use kevent instead of epoll +# are still in place. However, since libinput depends +# on libepoll-shim the simplest to do was to have Wayland +# also use it. Currently build will fail if epoll-shim +# is not available but can be built without epoll-shim +# if EPOLLSHIM_LIBS is cleared (configure.ac) +# +# TODO: Add condition for this in configure +# +# If we want to build Wayland with kwm's kevent patches +# and use epoll-shim for libinput we have to change it +# so that Wayland ignore epoll headers installed by +# epoll-shim. +# Maybe best is to use epoll-shim if it is good enough +# and keep diff with upstream minimal. + +PORTNAME= wayland +PORTVERSION= 1.12.0 +CATEGORIES= x11-servers wayland +MASTER_SITES= http://wayland.freedesktop.org/releases/ + +MAINTAINER= x11@FreeBSD.org +COMMENT= Wayland composite "server" + +LICENSE= MIT +LICENSE_FILE= ${WRKSRC}/COPYING + +LIB_DEPENDS= libexpat.so:textproc/expat2 \ + libffi.so:devel/libffi \ + libepoll-shim.so:devel/libepoll-shim + +CFLAGS+= "-I${PREFIX}/include/libepoll-shim" + +WITH_DEBUG= 1 + +USES= autoreconf gmake libtool localbase pathfix pkgconfig tar:xz +USE_GNOME= libxslt:build +USE_LDCONFIG= yes +GNU_CONFIGURE= yes +CONFIGURE_ARGS= --disable-documentation +INSTALL_TARGET= install-strip + +.include <bsd.port.mk> Added: head/x11-servers/wayland/distinfo ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/distinfo Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,3 @@ +TIMESTAMP = 1481659324 +SHA256 (wayland-1.12.0.tar.xz) = d6b4135cba0188abcb7275513c72dede751d6194f6edc5b82183a3ba8b821ab1 +SIZE (wayland-1.12.0.tar.xz) = 379520 Added: head/x11-servers/wayland/files/patch-Makefile.am ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/files/patch-Makefile.am Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,29 @@ +--- Makefile.am.orig 2016-02-29 23:30:58 UTC ++++ Makefile.am +@@ -73,7 +73,7 @@ nodist_include_HEADERS = \ + protocol/wayland-client-protocol.h + + libwayland_server_la_CFLAGS = $(FFI_CFLAGS) $(AM_CFLAGS) -pthread +-libwayland_server_la_LIBADD = $(FFI_LIBS) libwayland-private.la libwayland-util.la -lrt -lm ++libwayland_server_la_LIBADD = $(FFI_LIBS) $(EPOLLSHIM_LIBS) libwayland-private.la libwayland-util.la -lrt -lm + libwayland_server_la_LDFLAGS = -version-info 1:0:1 + libwayland_server_la_SOURCES = \ + src/wayland-server.c \ +@@ -85,7 +85,7 @@ nodist_libwayland_server_la_SOURCES = \ + protocol/wayland-protocol.c + + libwayland_client_la_CFLAGS = $(FFI_CFLAGS) $(AM_CFLAGS) -pthread +-libwayland_client_la_LIBADD = $(FFI_LIBS) libwayland-private.la libwayland-util.la -lrt -lm ++libwayland_client_la_LIBADD = $(FFI_LIBS) $(EPOLLSHIM_LIBS) libwayland-private.la libwayland-util.la -lrt -lm + libwayland_client_la_LDFLAGS = -version-info 3:0:3 + libwayland_client_la_SOURCES = \ + src/wayland-client.c +@@ -186,7 +186,7 @@ libtest_runner_la_LIBADD = \ + libwayland-util.la \ + libwayland-client.la \ + libwayland-server.la \ +- -lrt -ldl $(FFI_LIBS) ++ -lrt $(DL_LIBS) $(FFI_LIBS) $(EPOLLSHIM_LIBS) + + + array_test_SOURCES = tests/array-test.c Added: head/x11-servers/wayland/files/patch-configure.ac ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/files/patch-configure.ac Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,56 @@ +--- configure.ac.orig 2016-06-01 00:11:10 UTC ++++ configure.ac +@@ -63,6 +63,28 @@ AC_SUBST(GCC_CFLAGS) + + AC_CHECK_FUNCS([accept4 mkostemp posix_fallocate]) + ++AC_CHECK_HEADERS([sys/signalfd.h sys/timerfd.h]) ++ ++# Use epoll on Linux or kqueue on BSD ++AC_CHECK_HEADERS([sys/epoll.h sys/event.h]) ++if test "x$ac_cv_header_sys_epoll_h" != "xyes" && test "x$ac_cv_header_sys_event_h" != "xyes"; then ++ AC_MSG_ERROR([Can't find sys/epoll.h or sys/event.h. Please ensure either epoll or kqueue is available.]) ++fi ++ ++# Credential support on FreeBSD ++AC_CHECK_HEADERS([sys/ucred.h]) ++ ++# dlopen() ++AC_CHECK_LIB([dl], [dlsym], [DL_LIBS=-ldl]) ++AC_SUBST([DL_LIBS]) ++ ++# Defines __FreeBSD__ if we're on FreeBSD ++AC_CHECK_HEADERS([sys/param.h]) ++ ++# waitid() and signal.h are needed for the test suite. ++AC_CHECK_FUNCS([waitid]) ++AC_CHECK_HEADERS([signal.h]) ++ + AC_ARG_ENABLE([libraries], + [AC_HELP_STRING([--disable-libraries], + [Disable compilation of wayland libraries])], +@@ -98,11 +120,12 @@ AC_SUBST([ICONDIR]) + + if test "x$enable_libraries" = "xyes"; then + PKG_CHECK_MODULES(FFI, [libffi]) ++dnl convert SFD_CLOEXEC and TFD_CLOEXEC to warning while figuring out how to do this. + AC_CHECK_DECL(SFD_CLOEXEC,[], +- [AC_MSG_ERROR("SFD_CLOEXEC is needed to compile wayland libraries")], ++ [AC_MSG_WARN("SFD_CLOEXEC is needed to compile wayland libraries")], + [[#include <sys/signalfd.h>]]) + AC_CHECK_DECL(TFD_CLOEXEC,[], +- [AC_MSG_ERROR("TFD_CLOEXEC is needed to compile wayland libraries")], ++ [AC_MSG_WARN("TFD_CLOEXEC is needed to compile wayland libraries")], + [[#include <sys/timerfd.h>]]) + AC_CHECK_DECL(CLOCK_MONOTONIC,[], + [AC_MSG_ERROR("CLOCK_MONOTONIC is needed to compile wayland libraries")], +@@ -110,6 +133,9 @@ if test "x$enable_libraries" = "xyes"; t + AC_CHECK_HEADERS([execinfo.h]) + fi + ++EPOLLSHIM_LIBS="-lepoll-shim" ++AC_SUBST(EPOLLSHIM_LIBS) ++ + PKG_CHECK_MODULES(EXPAT, [expat], [], + [AC_CHECK_HEADERS(expat.h, [], + [AC_MSG_ERROR([Can't find expat.h. Please install expat.])]) Added: head/x11-servers/wayland/files/patch-src_wayland-os.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/files/patch-src_wayland-os.c Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,114 @@ +--- src/wayland-os.c.orig 2015-07-06 19:38:51 UTC ++++ src/wayland-os.c +@@ -25,14 +25,20 @@ + + #define _GNU_SOURCE + ++#include "../config.h" ++ + #include <sys/types.h> + #include <sys/socket.h> + #include <unistd.h> + #include <fcntl.h> + #include <errno.h> ++#ifdef HAVE_SYS_EPOLL_H + #include <sys/epoll.h> ++#endif ++#ifdef HAVE_SYS_EVENT_H ++#include <sys/event.h> ++#endif + +-#include "../config.h" + #include "wayland-os.h" + + static int +@@ -62,26 +68,50 @@ wl_os_socket_cloexec(int domain, int typ + { + int fd; + ++#ifdef SOCK_CLOEXEC + fd = socket(domain, type | SOCK_CLOEXEC, protocol); + if (fd >= 0) + return fd; + if (errno != EINVAL) + return -1; ++#endif + + fd = socket(domain, type, protocol); + return set_cloexec_or_close(fd); + } + + int ++wl_os_socketpair_cloexec(int domain, int type, int protocol, int sv[2]) ++{ ++ int retval; ++ ++#ifdef SOCK_CLOEXEC ++ retval = socketpair(domain, type | SOCK_CLOEXEC, protocol, sv); ++ if (retval >= 0) ++ return retval; ++ if (errno != EINVAL) ++ return -1; ++#endif ++ ++ retval = socketpair(domain, type, protocol, sv); ++ if (set_cloexec_or_close(sv[0]) < 0 || set_cloexec_or_close(sv[1]) < 0) ++ retval = -1; ++ ++ return retval; ++} ++ ++int + wl_os_dupfd_cloexec(int fd, long minfd) + { + int newfd; + ++#ifdef F_DUPFD_CLOEXEC + newfd = fcntl(fd, F_DUPFD_CLOEXEC, minfd); + if (newfd >= 0) + return newfd; + if (errno != EINVAL) + return -1; ++#endif + + newfd = fcntl(fd, F_DUPFD, minfd); + return set_cloexec_or_close(newfd); +@@ -123,15 +153,18 @@ wl_os_recvmsg_cloexec(int sockfd, struct + { + ssize_t len; + ++#ifdef MSG_CMSG_CLOEXEC + len = recvmsg(sockfd, msg, flags | MSG_CMSG_CLOEXEC); + if (len >= 0) + return len; + if (errno != EINVAL) + return -1; ++#endif + + return recvmsg_cloexec_fallback(sockfd, msg, flags); + } + ++#ifdef HAVE_SYS_EPOLL_H + int + wl_os_epoll_create_cloexec(void) + { +@@ -148,6 +181,19 @@ wl_os_epoll_create_cloexec(void) + fd = epoll_create(1); + return set_cloexec_or_close(fd); + } ++#endif ++ ++#ifdef HAVE_SYS_EVENT_H ++int ++wl_os_kqueue_create_cloexec(void) ++{ ++ int fd; ++ ++ fd = kqueue(); ++ ++ return set_cloexec_or_close(fd); ++} ++#endif + + int + wl_os_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen) Added: head/x11-servers/wayland/files/patch-src_wayland-os.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/files/patch-src_wayland-os.h Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,28 @@ +--- src/wayland-os.h.orig 2015-07-06 19:38:51 UTC ++++ src/wayland-os.h +@@ -30,13 +30,25 @@ int + wl_os_socket_cloexec(int domain, int type, int protocol); + + int ++wl_os_socketpair_cloexec(int domain, int type, int protocol, int sv[2]); ++ ++int + wl_os_dupfd_cloexec(int fd, long minfd); + + ssize_t + wl_os_recvmsg_cloexec(int sockfd, struct msghdr *msg, int flags); + ++/* FIXME? not sure if this will work in this header like this ... ++ though seems build only header perhaps? */ ++#ifdef HAVE_SYS_EPOLL_H + int + wl_os_epoll_create_cloexec(void); ++#endif ++ ++#ifdef HAVE_SYS_EVENT_H ++int ++wl_os_kqueue_create_cloexec(void); ++#endif + + int + wl_os_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen); Added: head/x11-servers/wayland/files/patch-src_wayland-server.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/files/patch-src_wayland-server.c Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,82 @@ +--- src/wayland-server.c.orig 2016-09-20 17:33:11.000000000 +0000 ++++ src/wayland-server.c 2016-12-13 20:07:06.878000000 +0000 +@@ -25,6 +25,8 @@ + + #define _GNU_SOURCE + ++#include "../config.h" ++ + #include <stdlib.h> + #include <stdint.h> + #include <stddef.h> +@@ -43,6 +45,11 @@ + #include <sys/file.h> + #include <sys/stat.h> + ++#ifdef HAVE_SYS_UCRED_H ++#include <sys/types.h> ++#include <sys/ucred.h> ++#endif ++ + #include "wayland-util.h" + #include "wayland-private.h" + #include "wayland-server.h" +@@ -79,7 +86,13 @@ + struct wl_list link; + struct wl_map objects; + struct wl_signal destroy_signal; ++#ifdef HAVE_SYS_UCRED_H ++ /* FreeBSD */ ++ struct xucred xucred; ++#else ++ /* Linux */ + struct ucred ucred; ++#endif + int error; + struct wl_signal resource_created_signal; + }; +@@ -466,10 +479,20 @@ + if (!client->source) + goto err_client; + ++#if defined(SO_PEERCRED) ++ /* Linux */ + len = sizeof client->ucred; + if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, + &client->ucred, &len) < 0) + goto err_source; ++#elif defined(LOCAL_PEERCRED) ++ /* FreeBSD */ ++ len = sizeof client->xucred; ++ if (getsockopt(fd, SOL_SOCKET, LOCAL_PEERCRED, ++ &client->xucred, &len) < 0 || ++ client->xucred.cr_version != XUCRED_VERSION) ++ goto err_source; ++#endif + + client->connection = wl_connection_create(fd); + if (client->connection == NULL) +@@ -523,12 +546,23 @@ + wl_client_get_credentials(struct wl_client *client, + pid_t *pid, uid_t *uid, gid_t *gid) + { ++#ifdef HAVE_SYS_UCRED_H ++ /* FreeBSD */ ++ if (pid) ++ *pid = 0; /* FIXME: not defined on FreeBSD */ ++ if (uid) ++ *uid = client->xucred.cr_uid; ++ if (gid) ++ *gid = client->xucred.cr_gid; ++#else ++ /* Linux */ + if (pid) + *pid = client->ucred.pid; + if (uid) + *uid = client->ucred.uid; + if (gid) + *gid = client->ucred.gid; ++#endif + } + + /** Get the file descriptor for the client Added: head/x11-servers/wayland/files/patch-src_wayland-shm.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/files/patch-src_wayland-shm.c Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,147 @@ +--- src/wayland-shm.c.orig 2016-03-09 00:55:02 UTC ++++ src/wayland-shm.c +@@ -30,6 +30,8 @@ + + #define _GNU_SOURCE + ++#include "../config.h" ++ + #include <stdbool.h> + #include <stdio.h> + #include <stdlib.h> +@@ -57,6 +59,9 @@ struct wl_shm_pool { + char *data; + int32_t size; + int32_t new_size; ++#ifdef HAVE_SYS_UCRED_H ++ int fd; ++#endif + }; + + struct wl_shm_buffer { +@@ -74,15 +79,24 @@ struct wl_shm_sigbus_data { + int fallback_mapping_used; + }; + ++static void *mremap_compat_maymove(void *, size_t, size_t, int, int, int); ++ + static void + shm_pool_finish_resize(struct wl_shm_pool *pool) + { + void *data; ++ int fd = -1; + + if (pool->size == pool->new_size) + return; + +- data = mremap(pool->data, pool->size, pool->new_size, MREMAP_MAYMOVE); ++#ifdef HAVE_SYS_UCRED_H ++ fd = pool->fd; ++#endif ++ ++ data = mremap_compat_maymove(pool->data, pool->size, pool->new_size, ++ PROT_READ | PROT_WRITE, MAP_SHARED, fd); ++ + if (data == MAP_FAILED) { + wl_resource_post_error(pool->resource, + WL_SHM_ERROR_INVALID_FD, +@@ -108,6 +122,10 @@ shm_pool_unref(struct wl_shm_pool *pool, + if (pool->internal_refcount + pool->external_refcount) + return; + ++#ifdef HAVE_SYS_UCRED_H ++ close(pool->fd); ++#endif ++ + munmap(pool->data, pool->size); + free(pool); + } +@@ -221,6 +239,73 @@ shm_pool_destroy(struct wl_client *clien + wl_resource_destroy(resource); + } + ++#ifdef HAVE_MREMAP ++static void * ++mremap_compat_maymove(void *old_address, size_t old_size, size_t new_size, ++ int old_prot, int old_flags, int old_fd) ++{ ++ return mremap(old_address, old_size, new_size, MREMAP_MAYMOVE); ++} ++#else ++static void * ++mremap_compat_maymove(void *old_address, size_t old_size, size_t new_size, ++ int old_prot, int old_flags, int old_fd) ++{ ++ /* FreeBSD doesn't support mremap() yet, so we have to emulate it. ++ * This assumes MREMAP_MAYMOVE is the only flag in use. */ ++ if (new_size == old_size) { ++ return old_address; ++ } else if (new_size < old_size) { ++ /* Shrinking: munmap() the spare region. */ ++ munmap(old_address + old_size, new_size - old_size); ++ return old_address; ++ } else { ++ void *ret; ++ ++ /* Growing. Try and mmap() the extra region at the end of ++ * our existing allocation. If that gets mapped in the ++ * wrong place, fall back to mmap()ing an entirely new ++ * region of new_size and copying the data across. */ ++ ret = mmap(old_address + old_size, new_size - old_size, ++ old_prot, old_flags, old_fd, 0); ++ ++/* FIXME TODO: msync() before munmap()? */ ++ if (ret == MAP_FAILED) { ++ /* Total failure! */ ++ return ret; ++ } else if (ret == old_address + old_size) { ++ /* Success. */ ++ return old_address; ++ } else if (ret != old_address + old_size) { ++ /* Partial failure. Fall back to mapping an ++ * entirely new region. Unmap the region we ++ * just mapped first. */ ++ munmap(ret, new_size - old_size); ++ ++ /* Map an entirely new region. */ ++ ret = mmap(NULL, new_size, ++ old_prot, old_flags, old_fd, 0); ++ if (ret == MAP_FAILED) { ++ /* Total failure! */ ++ return ret; ++ } ++ ++ /* Copy the old data across. Implicit assumption ++ * that the old and new regions don't overlap. */ ++ memcpy(ret, old_address, old_size); ++ ++ /* Unmap the old region. */ ++ munmap(old_address, old_size); ++ ++ return ret; ++ } ++ } ++ ++ /* Unreachable. */ ++ return MAP_FAILED; ++} ++#endif ++ + static void + shm_pool_resize(struct wl_client *client, struct wl_resource *resource, + int32_t size) +@@ -282,7 +367,14 @@ shm_create_pool(struct wl_client *client + "failed mmap fd %d", fd); + goto err_free; + } ++ ++#ifdef HAVE_SYS_UCRED_H ++ /* We need to keep the FD around on FreeBSD so we can implement ++ * mremap(). See: mremap_compat_maymove(). */ ++ pool->fd = fd; ++#else + close(fd); ++#endif + + pool->resource = + wl_resource_create(client, &wl_shm_pool_interface, 1, id); Added: head/x11-servers/wayland/files/patch-tests_client-test.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/files/patch-tests_client-test.c Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,19 @@ +--- tests/client-test.c.orig 2015-07-06 19:38:51 UTC ++++ tests/client-test.c +@@ -34,6 +34,7 @@ + #include <sys/types.h> + #include <sys/stat.h> + ++#include "wayland-os.h" + #include "wayland-private.h" + #include "wayland-server.h" + #include "test-runner.h" +@@ -59,7 +60,7 @@ TEST(client_destroy_listener) + struct client_destroy_listener a, b; + int s[2]; + +- assert(socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, s) == 0); ++ assert(wl_os_socketpair_cloexec(AF_UNIX, SOCK_STREAM, 0, s) == 0); + display = wl_display_create(); + assert(display); + client = wl_client_create(display, s[0]); Added: head/x11-servers/wayland/files/patch-tests_connection-test.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/files/patch-tests_connection-test.c Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,29 @@ +--- tests/connection-test.c.orig 2016-02-17 01:13:16 UTC ++++ tests/connection-test.c +@@ -36,6 +36,7 @@ + #include <sys/stat.h> + #include <poll.h> + ++#include "wayland-os.h" + #include "wayland-private.h" + #include "test-runner.h" + #include "test-compositor.h" +@@ -47,7 +48,7 @@ setup(int *s) + { + struct wl_connection *connection; + +- assert(socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, s) == 0); ++ assert(wl_os_socketpair_cloexec(AF_UNIX, SOCK_STREAM, 0, s) == 0); + + connection = wl_connection_create(s[0]); + assert(connection); +@@ -145,8 +146,7 @@ struct marshal_data { + static void + setup_marshal_data(struct marshal_data *data) + { +- assert(socketpair(AF_UNIX, +- SOCK_STREAM | SOCK_CLOEXEC, 0, data->s) == 0); ++ assert(wl_os_socketpair_cloexec(AF_UNIX, SOCK_STREAM, 0, data->s) == 0); + data->read_connection = wl_connection_create(data->s[0]); + assert(data->read_connection); + data->write_connection = wl_connection_create(data->s[1]); Added: head/x11-servers/wayland/files/patch-tests_event-loop-test.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/files/patch-tests_event-loop-test.c Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,40 @@ +--- tests/event-loop-test.c.orig 2015-07-06 19:38:51 UTC ++++ tests/event-loop-test.c +@@ -166,10 +166,10 @@ TEST(event_loop_signal) + signal_callback, &got_it); + assert(source); + +- wl_event_loop_dispatch(loop, 0); ++ assert(wl_event_loop_dispatch(loop, 0) == 0); + assert(!got_it); +- kill(getpid(), SIGUSR1); +- wl_event_loop_dispatch(loop, 0); ++ assert(kill(getpid(), SIGUSR1) == 0); ++ assert(wl_event_loop_dispatch(loop, 0) == 0); + assert(got_it == 1); + + wl_event_source_remove(source); +@@ -233,12 +233,20 @@ TEST(event_loop_timer) + + source = wl_event_loop_add_timer(loop, timer_callback, &got_it); + assert(source); +- wl_event_source_timer_update(source, 10); +- wl_event_loop_dispatch(loop, 0); ++ assert(wl_event_source_timer_update(source, 10) == 0); ++ assert(wl_event_loop_dispatch(loop, 0) == 0); + assert(!got_it); +- wl_event_loop_dispatch(loop, 20); ++ /* FreeBSD has a bug where it converts ms_timeout to ticks; it always adds 1 to the tick count. ++ * Consequently, we need to grossly overcompensate here. ++ * See: http://unix.derkeiler.com/Mailing-Lists/FreeBSD/hackers/2012-07/msg00319.html */ ++ assert(wl_event_loop_dispatch(loop, 50) == 0); + assert(got_it == 1); + ++ /* Check it doesn't fire again. */ ++ got_it = 0; ++ assert(wl_event_loop_dispatch(loop, 20) == 0); ++ assert(!got_it); ++ + wl_event_source_remove(source); + wl_event_loop_destroy(loop); + } Added: head/x11-servers/wayland/files/patch-tests_os-wrappers-test.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/files/patch-tests_os-wrappers-test.c Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,185 @@ +--- tests/os-wrappers-test.c.orig 2015-07-06 19:38:51 UTC ++++ tests/os-wrappers-test.c +@@ -26,6 +26,8 @@ + + #define _GNU_SOURCE + ++#include "../config.h" ++ + #include <stdlib.h> + #include <assert.h> + #include <sys/types.h> +@@ -37,7 +39,13 @@ + #include <stdarg.h> + #include <fcntl.h> + #include <stdio.h> ++ ++#ifdef HAVE_SYS_EPOLL_H + #include <sys/epoll.h> ++#elif HAVE_SYS_EVENT_H ++#include <sys/event.h> ++#include <sys/types.h> ++#endif + + #include "wayland-private.h" + #include "test-runner.h" +@@ -54,8 +62,13 @@ static int wrapped_calls_fcntl; + static ssize_t (*real_recvmsg)(int, struct msghdr *, int); + static int wrapped_calls_recvmsg; + ++#ifdef HAVE_SYS_EPOLL_H + static int (*real_epoll_create1)(int); + static int wrapped_calls_epoll_create1; ++#elif HAVE_SYS_EVENT_H ++static int (*real_kqueue)(void); ++static int wrapped_calls_kqueue; ++#endif + + static void + init_fallbacks(int do_fallbacks) +@@ -64,7 +77,11 @@ init_fallbacks(int do_fallbacks) + real_socket = dlsym(RTLD_NEXT, "socket"); + real_fcntl = dlsym(RTLD_NEXT, "fcntl"); + real_recvmsg = dlsym(RTLD_NEXT, "recvmsg"); ++#ifdef HAVE_SYS_EPOLL_H + real_epoll_create1 = dlsym(RTLD_NEXT, "epoll_create1"); ++#elif HAVE_SYS_EVENT_H ++ real_kqueue = dlsym(RTLD_NEXT, "kqueue"); ++#endif + } + + __attribute__ ((visibility("default"))) int +@@ -72,10 +89,12 @@ socket(int domain, int type, int protoco + { + wrapped_calls_socket++; + ++#ifdef SOCK_CLOEXEC + if (fall_back && (type & SOCK_CLOEXEC)) { + errno = EINVAL; + return -1; + } ++#endif + + return real_socket(domain, type, protocol); + } +@@ -88,10 +107,12 @@ fcntl(int fd, int cmd, ...) + + wrapped_calls_fcntl++; + ++#ifdef F_DUPFD_CLOEXEC + if (fall_back && (cmd == F_DUPFD_CLOEXEC)) { + errno = EINVAL; + return -1; + } ++#endif + + va_start(ap, cmd); + arg = va_arg(ap, void*); +@@ -105,14 +126,17 @@ recvmsg(int sockfd, struct msghdr *msg, + { + wrapped_calls_recvmsg++; + ++#ifdef MSG_CMSG_CLOEXEC + if (fall_back && (flags & MSG_CMSG_CLOEXEC)) { + errno = EINVAL; + return -1; + } ++#endif + + return real_recvmsg(sockfd, msg, flags); + } + ++#ifdef HAVE_SYS_EPOLL_H + __attribute__ ((visibility("default"))) int + epoll_create1(int flags) + { +@@ -126,6 +150,15 @@ epoll_create1(int flags) + + return real_epoll_create1(flags); + } ++#elif HAVE_SYS_EVENT_H ++__attribute__ ((visibility("default"))) int ++kqueue(void) ++{ ++ wrapped_calls_kqueue++; ++ ++ return real_kqueue(); ++} ++#endif + + static void + do_os_wrappers_socket_cloexec(int n) +@@ -155,12 +188,14 @@ TEST(os_wrappers_socket_cloexec) + do_os_wrappers_socket_cloexec(0); + } + ++#ifdef SOCK_CLOEXEC + TEST(os_wrappers_socket_cloexec_fallback) + { + /* forced fallback */ + init_fallbacks(1); + do_os_wrappers_socket_cloexec(1); + } ++#endif + + static void + do_os_wrappers_dupfd_cloexec(int n) +@@ -194,11 +229,13 @@ TEST(os_wrappers_dupfd_cloexec) + do_os_wrappers_dupfd_cloexec(0); + } + ++#ifdef F_DUPFD_CLOEXEC + TEST(os_wrappers_dupfd_cloexec_fallback) + { + init_fallbacks(1); + do_os_wrappers_dupfd_cloexec(3); + } ++#endif + + struct marshal_data { + struct wl_connection *read_connection; +@@ -217,8 +254,7 @@ struct marshal_data { + static void + setup_marshal_data(struct marshal_data *data) + { +- assert(socketpair(AF_UNIX, +- SOCK_STREAM | SOCK_CLOEXEC, 0, data->s) == 0); ++ assert(wl_os_socketpair_cloexec(AF_UNIX, SOCK_STREAM, 0, data->s) == 0); + + data->read_connection = wl_connection_create(data->s[0]); + assert(data->read_connection); +@@ -327,11 +363,13 @@ TEST(os_wrappers_recvmsg_cloexec) + do_os_wrappers_recvmsg_cloexec(0); + } + ++#ifdef MSG_CMSG_CLOEXEC + TEST(os_wrappers_recvmsg_cloexec_fallback) + { + init_fallbacks(1); + do_os_wrappers_recvmsg_cloexec(1); + } ++#endif + + static void + do_os_wrappers_epoll_create_cloexec(int n) +@@ -341,12 +379,20 @@ do_os_wrappers_epoll_create_cloexec(int + + nr_fds = count_open_fds(); + ++#ifdef HAVE_SYS_EPOLL_H + fd = wl_os_epoll_create_cloexec(); ++#elif HAVE_SYS_EVENT_H ++ fd = wl_os_kqueue_create_cloexec(); ++#endif + assert(fd >= 0); + + #ifdef EPOLL_CLOEXEC ++#ifdef HAVE_SYS_EPOLL_H + assert(wrapped_calls_epoll_create1 == n); + #else ++ assert(wrapped_calls_kqueue == n); ++#endif ++#else + printf("No epoll_create1.\n"); + #endif + Added: head/x11-servers/wayland/files/patch-tests_queue-test.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/files/patch-tests_queue-test.c Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,21 @@ +--- tests/queue-test.c.orig 2016-04-29 23:36:09 UTC ++++ tests/queue-test.c +@@ -23,6 +23,8 @@ + * SOFTWARE. + */ + ++#include "../config.h" ++ + #include <stdlib.h> + #include <stdio.h> + #include <stdbool.h> +@@ -30,6 +32,9 @@ + #include <sys/types.h> + #include <sys/wait.h> + #include <assert.h> ++#ifdef HAVE_SIGNAL_H ++#include <signal.h> ++#endif + + #include "wayland-client.h" + #include "wayland-server.h" Added: head/x11-servers/wayland/files/patch-tests_sanity-test.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/files/patch-tests_sanity-test.c Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,22 @@ +--- tests/sanity-test.c.orig 2016-02-17 01:13:16 UTC ++++ tests/sanity-test.c +@@ -92,7 +92,8 @@ FAIL_TEST(sanity_malloc_direct) + TEST(disable_leak_checks) + { + volatile void *mem; +- assert(leak_check_enabled); ++// XXX FreeBSD disables leak checks... ++// assert(leak_check_enabled); + /* normally this should be on the beginning of the test. + * Here we need to be sure, that the leak checks are + * turned on */ +@@ -171,7 +172,8 @@ sanity_fd_no_leak(void) + { + int fd[2]; + +- assert(leak_check_enabled); ++// XXX FreeBSD leak checks are disabled ++// assert(leak_check_enabled); + + /* leak 2 file descriptors */ + if (pipe(fd) < 0) Added: head/x11-servers/wayland/files/patch-tests_test-helpers.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/files/patch-tests_test-helpers.c Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,52 @@ +--- tests/test-helpers.c.orig 2015-07-06 19:38:51 UTC ++++ tests/test-helpers.c +@@ -23,6 +23,12 @@ + * SOFTWARE. + */ + ++#include "../config.h" ++ ++#ifdef HAVE_SYS_PARAM_H ++#include <sys/param.h> ++#endif ++ + #include <assert.h> + #include <errno.h> + #include <dirent.h> +@@ -32,6 +38,16 @@ + + #include "test-runner.h" + ++#ifdef __FreeBSD__ ++/* FreeBSD uses fdescfs (which must be mounted using: ++ * mount -t fdescfs fdescfs /dev/fd ++ * before the test suite can be run). */ ++#define OPEN_FDS_DIR "/dev/fd" ++#else ++/* Linux. */ ++#define OPEN_FDS_DIR "/proc/self/fd" ++#endif ++ + int + count_open_fds(void) + { +@@ -39,8 +55,8 @@ count_open_fds(void) + struct dirent *ent; + int count = 0; + +- dir = opendir("/proc/self/fd"); +- assert(dir && "opening /proc/self/fd failed."); ++ dir = opendir(OPEN_FDS_DIR); ++ assert(dir && "opening " OPEN_FDS_DIR " failed."); + + errno = 0; + while ((ent = readdir(dir))) { +@@ -49,7 +65,7 @@ count_open_fds(void) + continue; + count++; + } +- assert(errno == 0 && "reading /proc/self/fd failed."); ++ assert(errno == 0 && "reading " OPEN_FDS_DIR " failed."); + + closedir(dir); + Added: head/x11-servers/wayland/files/patch-tests_test-runner.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/x11-servers/wayland/files/patch-tests_test-runner.c Tue Jan 24 23:44:12 2017 (r432406) @@ -0,0 +1,170 @@ +--- tests/test-runner.c.orig 2016-05-03 00:46:35 UTC ++++ tests/test-runner.c +@@ -25,6 +25,12 @@ + + #define _GNU_SOURCE + ++#include "../config.h" ++ ++#ifdef HAVE_SYS_PARAM_H ++#include <sys/param.h> ++#endif ++ + #include <unistd.h> + #include <stdio.h> + #include <stdlib.h> +@@ -37,18 +43,35 @@ + #include <errno.h> + #include <limits.h> + #include <sys/ptrace.h> ++#ifdef __linux__ + #include <sys/prctl.h> ++#endif + #ifndef PR_SET_PTRACER + # define PR_SET_PTRACER 0x59616d61 + #endif ++#include <signal.h> + + #include "test-runner.h" + + static int num_alloc; ++ ++extern const struct test __start_test_section, __stop_test_section; ++ ++/* This is all disabled for FreeBSD because it gives "can't allocate initial ++ * thread" aborts otherwise. */ ++#ifndef __FreeBSD__ + static void* (*sys_malloc)(size_t); + static void (*sys_free)(void*); + static void* (*sys_realloc)(void*, size_t); + static void* (*sys_calloc)(size_t, size_t); ++#endif ++ ++#ifdef __FreeBSD__ ++/* XXX review ptrace() usage */ ++#define PTRACE_ATTACH PT_ATTACH ++#define PTRACE_CONT PT_CONTINUE ++#define PTRACE_DETACH PT_DETACH ++#endif + + /* when set to 1, check if tests are not leaking memory and opened files. + * It is turned on by default. It can be turned off by +@@ -57,7 +80,7 @@ int leak_check_enabled; + + /* when this var is set to 0, every call to test_set_timeout() is + * suppressed - handy when debugging the test. Can be set by +- * WAYLAND_TEST_NO_TIMEOUTS environment variable. */ ++ * WAYLAND_TESTS_NO_TIMEOUTS evnironment var */ + static int timeouts_enabled = 1; + + /* set to one if the output goes to the terminal */ +@@ -65,6 +88,7 @@ static int is_atty = 0; + + extern const struct test __start_test_section, __stop_test_section; + ++#ifndef __FreeBSD__ + __attribute__ ((visibility("default"))) void * + malloc(size_t size) + { *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201701242344.v0ONiD7D087893>