Index: head/graphics/wayland/Makefile =================================================================== --- head/graphics/wayland/Makefile (revision 455877) +++ head/graphics/wayland/Makefile (revision 455878) @@ -1,47 +1,31 @@ # 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.13.0 +PORTVERSION= 1.14.0 CATEGORIES= graphics 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${LOCALBASE}/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 +CONFIGURE_ENV= ac_cv_func_posix_fallocate=no # EINVAL for many FS on 12.0 INSTALL_TARGET= install-strip .include Index: head/graphics/wayland/distinfo =================================================================== --- head/graphics/wayland/distinfo (revision 455877) +++ head/graphics/wayland/distinfo (revision 455878) @@ -1,3 +1,3 @@ -TIMESTAMP = 1493984926 -SHA256 (wayland-1.13.0.tar.xz) = 69b052c031a61e89af7cc8780893d0da1e301492352aa449dee9345043e6fe51 -SIZE (wayland-1.13.0.tar.xz) = 414508 +TIMESTAMP = 1507715269 +SHA256 (wayland-1.14.0.tar.xz) = ed80cabc0961a759a42092e2c39aabfc1ec9a13c86c98bbe2b812f008da27ab8 +SIZE (wayland-1.14.0.tar.xz) = 413960 Index: head/graphics/wayland/files/patch-configure.ac =================================================================== --- head/graphics/wayland/files/patch-configure.ac (revision 455877) +++ head/graphics/wayland/files/patch-configure.ac (revision 455878) @@ -1,56 +1,52 @@ ---- configure.ac.orig 2016-06-01 00:11:10 UTC +--- configure.ac.orig 2017-08-08 18:20:52 UTC +++ configure.ac -@@ -63,6 +63,28 @@ AC_SUBST(GCC_CFLAGS) +@@ -63,6 +63,25 @@ 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 ++# Use epoll on Linux and epoll-shim (kqueue) on BSD ++AC_CHECK_HEADERS([sys/epoll.h]) + +# 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]) +@@ -98,17 +117,21 @@ 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 ]]) 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 ]]) 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 + [[#include ]]) 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.])]) Index: head/graphics/wayland/files/patch-src_wayland-os.c =================================================================== --- head/graphics/wayland/files/patch-src_wayland-os.c (revision 455877) +++ head/graphics/wayland/files/patch-src_wayland-os.c (revision 455878) @@ -1,114 +1,97 @@ ---- src/wayland-os.c.orig 2015-07-06 19:38:51 UTC +--- src/wayland-os.c.orig 2017-08-08 18:20:52 UTC +++ src/wayland-os.c -@@ -25,14 +25,20 @@ +@@ -25,6 +25,8 @@ #define _GNU_SOURCE +#include "../config.h" + #include #include #include - #include +@@ -32,7 +34,6 @@ #include -+#ifdef HAVE_SYS_EPOLL_H #include -+#endif -+#ifdef HAVE_SYS_EVENT_H -+#include -+#endif -#include "../config.h" #include "wayland-os.h" static int -@@ -62,26 +68,50 @@ wl_os_socket_cloexec(int domain, int typ +@@ -62,26 +63,50 @@ wl_os_socket_cloexec(int domain, int type, int protoco { 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 +@@ -123,15 +148,18 @@ wl_os_recvmsg_cloexec(int sockfd, struct msghdr *msg, { 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) +@@ -148,6 +176,7 @@ 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) Index: head/graphics/wayland/files/patch-src_wayland-os.h =================================================================== --- head/graphics/wayland/files/patch-src_wayland-os.h (revision 455877) +++ head/graphics/wayland/files/patch-src_wayland-os.h (revision 455878) @@ -1,28 +1,12 @@ ---- src/wayland-os.h.orig 2015-07-06 19:38:51 UTC +--- src/wayland-os.h.orig 2017-08-08 18:20:52 UTC +++ src/wayland-os.h -@@ -30,13 +30,25 @@ int +@@ -30,6 +30,9 @@ 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); Index: head/graphics/wayland/files/patch-src_wayland-server.c =================================================================== --- head/graphics/wayland/files/patch-src_wayland-server.c (revision 455877) +++ head/graphics/wayland/files/patch-src_wayland-server.c (revision 455878) @@ -1,82 +1,82 @@ ---- src/wayland-server.c.orig 2017-02-07 22:59:06 UTC +--- src/wayland-server.c.orig 2017-08-08 18:20:52 UTC +++ src/wayland-server.c @@ -25,6 +25,8 @@ #define _GNU_SOURCE +#include "../config.h" + #include #include #include @@ -43,6 +45,11 @@ #include #include +#ifdef HAVE_SYS_UCRED_H +#include +#include +#endif + #include "wayland-util.h" #include "wayland-private.h" #include "wayland-server.h" -@@ -79,7 +86,13 @@ struct wl_client { +@@ -77,7 +84,13 @@ struct wl_client { struct wl_list link; struct wl_map objects; struct wl_priv_signal destroy_signal; +#ifdef HAVE_SYS_UCRED_H + /* FreeBSD */ + struct xucred xucred; +#else + /* Linux */ struct ucred ucred; +#endif int error; struct wl_priv_signal resource_created_signal; }; -@@ -503,10 +516,20 @@ wl_client_create(struct wl_display *disp +@@ -501,10 +514,20 @@ wl_client_create(struct wl_display *display, int fd) 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) -@@ -560,12 +583,23 @@ WL_EXPORT void +@@ -558,12 +581,23 @@ WL_EXPORT void 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) + 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) ++ 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 Index: head/graphics/wayland/files/patch-src_wayland-shm.c =================================================================== --- head/graphics/wayland/files/patch-src_wayland-shm.c (revision 455877) +++ head/graphics/wayland/files/patch-src_wayland-shm.c (revision 455878) @@ -1,147 +1,147 @@ ---- src/wayland-shm.c.orig 2016-11-18 00:32:40 UTC +--- src/wayland-shm.c.orig 2017-08-08 18:20:52 UTC +++ src/wayland-shm.c @@ -30,6 +30,8 @@ #define _GNU_SOURCE +#include "../config.h" + #include #include #include @@ -59,6 +61,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 { @@ -76,15 +81,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, -@@ -110,6 +124,10 @@ shm_pool_unref(struct wl_shm_pool *pool, +@@ -110,6 +124,10 @@ shm_pool_unref(struct wl_shm_pool *pool, bool external if (pool->internal_refcount + pool->external_refcount) return; +#ifdef HAVE_SYS_UCRED_H + close(pool->fd); +#endif + munmap(pool->data, pool->size); free(pool); } -@@ -223,6 +241,73 @@ shm_pool_destroy(struct wl_client *clien +@@ -223,6 +241,73 @@ shm_pool_destroy(struct wl_client *client, struct wl_r 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) -@@ -284,7 +369,14 @@ shm_create_pool(struct wl_client *client +@@ -284,7 +369,14 @@ shm_create_pool(struct wl_client *client, struct wl_re "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); Index: head/graphics/wayland/files/patch-tests_event-loop-test.c =================================================================== --- head/graphics/wayland/files/patch-tests_event-loop-test.c (revision 455877) +++ head/graphics/wayland/files/patch-tests_event-loop-test.c (revision 455878) @@ -1,40 +1,39 @@ ---- tests/event-loop-test.c.orig 2016-10-22 16:23:10 UTC +--- tests/event-loop-test.c.orig 2017-08-08 18:20:52 UTC +++ tests/event-loop-test.c @@ -167,10 +167,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); -@@ -234,12 +234,20 @@ TEST(event_loop_timer) +@@ -234,11 +234,19 @@ 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); - } Index: head/graphics/wayland/files/patch-tests_os-wrappers-test.c =================================================================== --- head/graphics/wayland/files/patch-tests_os-wrappers-test.c (revision 455877) +++ head/graphics/wayland/files/patch-tests_os-wrappers-test.c (revision 455878) @@ -1,185 +1,103 @@ ---- tests/os-wrappers-test.c.orig 2016-10-22 16:23:10 UTC +--- tests/os-wrappers-test.c.orig 2017-08-08 18:20:52 UTC +++ tests/os-wrappers-test.c @@ -26,6 +26,8 @@ #define _GNU_SOURCE +#include "../config.h" + #include #include #include -@@ -38,7 +40,13 @@ - #include - #include - #include -+ -+#ifdef HAVE_SYS_EPOLL_H - #include -+#elif HAVE_SYS_EVENT_H -+#include -+#include -+#endif - - #include "wayland-private.h" - #include "test-runner.h" -@@ -55,8 +63,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) -@@ -65,7 +78,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 -@@ -73,10 +90,12 @@ socket(int domain, int type, int protoco +@@ -73,10 +75,12 @@ socket(int domain, int type, int protocol) { wrapped_calls_socket++; +#ifdef SOCK_CLOEXEC if (fall_back && (type & SOCK_CLOEXEC)) { errno = EINVAL; return -1; } +#endif return real_socket(domain, type, protocol); } -@@ -89,10 +108,12 @@ fcntl(int fd, int cmd, ...) +@@ -89,10 +93,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*); -@@ -106,14 +127,17 @@ recvmsg(int sockfd, struct msghdr *msg, +@@ -106,10 +112,12 @@ recvmsg(int sockfd, struct msghdr *msg, int flags) { 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) - { -@@ -127,6 +151,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) -@@ -156,12 +189,14 @@ TEST(os_wrappers_socket_cloexec) +@@ -156,12 +164,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) -@@ -195,11 +230,13 @@ TEST(os_wrappers_dupfd_cloexec) +@@ -195,11 +205,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; -@@ -218,8 +255,7 @@ struct marshal_data { +@@ -218,8 +230,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); -@@ -328,11 +364,13 @@ TEST(os_wrappers_recvmsg_cloexec) +@@ -328,11 +339,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) -@@ -342,12 +380,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 - Index: head/graphics/wayland/files/patch-tests_test-runner.c =================================================================== --- head/graphics/wayland/files/patch-tests_test-runner.c (revision 455877) +++ head/graphics/wayland/files/patch-tests_test-runner.c (revision 455878) @@ -1,170 +1,172 @@ ---- tests/test-runner.c.orig 2016-11-18 00:32:40 UTC +--- tests/test-runner.c.orig 2017-08-08 18:20:52 UTC +++ tests/test-runner.c @@ -25,6 +25,12 @@ #define _GNU_SOURCE +#include "../config.h" + +#ifdef HAVE_SYS_PARAM_H +#include +#endif + #include #include #include -@@ -37,18 +43,35 @@ +@@ -37,19 +43,36 @@ #include #include #include +#ifdef __linux__ #include +#endif #ifndef PR_SET_PTRACER # define PR_SET_PTRACER 0x59616d61 #endif +#include #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 + * WAYLAND_TEST_NO_LEAK_CHECK environment variable. */ @@ -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) { @@ -98,6 +122,7 @@ calloc(size_t nmemb, size_t size) return sys_calloc(nmemb, size); } +#endif static const struct test * find_test(const char *name) @@ -292,6 +317,8 @@ is_debugger_attached(void) return 0; } + +// xxx start here pid = fork(); if (pid == -1) { perror("fork"); @@ -312,7 +339,7 @@ is_debugger_attached(void) _exit(1); if (!waitpid(-1, NULL, 0)) _exit(1); - ptrace(PTRACE_CONT, NULL, NULL); + ptrace(PTRACE_CONT, ppid, NULL, NULL); ptrace(PTRACE_DETACH, ppid, NULL, NULL); _exit(0); } else { @@ -346,17 +373,19 @@ int main(int argc, char *argv[]) const struct test *t; pid_t pid; int total, pass; +#ifdef HAVE_WAITID siginfo_t info; +#else + int status; +#endif +#ifndef __FreeBSD__ /* Load system malloc, free, and realloc */ sys_calloc = dlsym(RTLD_NEXT, "calloc"); sys_realloc = dlsym(RTLD_NEXT, "realloc"); sys_malloc = dlsym(RTLD_NEXT, "malloc"); sys_free = dlsym(RTLD_NEXT, "free"); - if (isatty(fileno(stderr))) - is_atty = 1; - if (is_debugger_attached()) { leak_check_enabled = 0; timeouts_enabled = 0; -@@ -364,6 +393,16 @@ int main(int argc, char *argv[]) +@@ -364,7 +393,17 @@ int main(int argc, char *argv[]) leak_check_enabled = !getenv("WAYLAND_TEST_NO_LEAK_CHECK"); timeouts_enabled = !getenv("WAYLAND_TEST_NO_TIMEOUTS"); } +#else + /* Disable leak checking on FreeBSD since we can't override malloc(). */ + leak_check_enabled = 0; + /* XXX review later */ + timeouts_enabled = 0; +#endif -+ + + if (isatty(fileno(stderr))) + is_atty = 1; + - ++ if (argc == 2 && strcmp(argv[1], "--help") == 0) usage(argv[0], EXIT_SUCCESS); + @@ -395,7 +434,8 @@ int main(int argc, char *argv[]) if (pid == 0) run_test(t); /* never returns */ - if (waitid(P_PID, pid, &info, WEXITED)) { +#ifdef HAVE_WAITID + if (waitid(P_PID, 0, &info, WEXITED)) { stderr_set_color(RED); fprintf(stderr, "waitid failed: %m\n"); stderr_reset_color(); @@ -426,6 +466,25 @@ int main(int argc, char *argv[]) break; } +#else + if (waitpid(-1, &status, 0) == -1) { + fprintf(stderr, "waitpid failed: %s\n", + strerror(errno)); + abort(); + } + + fprintf(stderr, "test \"%s\":\t", t->name); + if (WIFEXITED(status)) { + fprintf(stderr, "exit status %d", WEXITSTATUS(status)); + if (WEXITSTATUS(status) == EXIT_SUCCESS) + success = 1; + } else if (WIFSIGNALED(status)) { + fprintf(stderr, "signal %d", WTERMSIG(status)); + } +#endif + + if (t->must_fail) + success = !success; if (success) { pass++;