Merge branch 'darwin-portability' into 'main'

Misc portability improvements to help bring wayland to darwin

See merge request wayland/wayland!290
This commit is contained in:
Jeremy Huddleston Sequoia 2023-06-22 21:43:05 +00:00
commit 29f820549f
14 changed files with 138 additions and 28 deletions

View file

@ -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"
@ -88,7 +89,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]);

View file

@ -37,6 +37,7 @@
#include <sys/stat.h>
#include <poll.h>
#include "wayland-os.h"
#include "wayland-private.h"
#include "test-runner.h"
#include "test-compositor.h"
@ -48,7 +49,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);
@ -181,8 +182,8 @@ 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]);
@ -824,7 +825,7 @@ TEST(request_bogus_size)
for (bogus_size = 11; bogus_size >= 0; bogus_size--) {
fprintf(stderr, "* bogus size %d\n", bogus_size);
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]);

View file

@ -47,6 +47,7 @@
static int fall_back;
#ifdef __ELF__
/* Play nice with sanitizers
*
* Sanitizers need to intercept syscalls in the compiler run-time library. As
@ -71,6 +72,13 @@ static int fall_back;
#define REAL(func) (__interceptor_ ## func) ? \
__interceptor_ ## func : \
(__typeof__(&__interceptor_ ## func))dlsym(RTLD_NEXT, #func)
#else
#define DECL(ret_type, func, ...) \
static ret_type (*real_ ## func)(__VA_ARGS__); \
static int wrapped_calls_ ## func;
#define REAL(func) (__typeof__(real_ ## func)) dlsym(RTLD_NEXT, #func)
#endif
DECL(int, socket, int, int, int);
DECL(int, fcntl, int, int, ...);
@ -92,10 +100,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);
}
@ -141,10 +151,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);
}
@ -179,7 +191,11 @@ do_os_wrappers_socket_cloexec(int n)
* Must have 2 calls if falling back, but must also allow
* falling back without a forced fallback.
*/
#ifdef SOCK_CLOEXEC
assert(wrapped_calls_socket > n);
#else
assert(wrapped_calls_socket == 1);
#endif
exec_fd_leak_check(nr_fds);
}
@ -253,8 +269,8 @@ 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);
@ -342,9 +358,10 @@ do_os_wrappers_recvmsg_cloexec(int n)
struct marshal_data data;
data.nr_fds_begin = count_open_fds();
#if HAVE_BROKEN_MSG_CMSG_CLOEXEC
#if HAVE_BROKEN_MSG_CMSG_CLOEXEC || !defined(MSG_CMSG_CLOEXEC)
/* We call the fallback directly on FreeBSD versions with a broken
* MSG_CMSG_CLOEXEC, so we don't call the local recvmsg() wrapper. */
* MSG_CMSG_CLOEXEC or platforms without MSG_CMSG_CLOEXEC, so we
* don't call the local recvmsg() wrapper. */
data.wrapped_calls = 0;
#else
data.wrapped_calls = n;

View file

@ -28,6 +28,7 @@
#include <unistd.h>
#include <stdint.h>
#include "wayland-os.h"
#include "wayland-server.h"
#include "test-runner.h"
@ -40,7 +41,7 @@ TEST(create_resource_tst)
int s[2];
uint32_t id;
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]);
@ -111,7 +112,7 @@ TEST(destroy_res_tst)
.notify = &destroy_notify
};
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]);
@ -159,7 +160,7 @@ TEST(create_resource_with_same_id)
int s[2];
uint32_t id;
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]);

View file

@ -93,7 +93,7 @@ get_socket_name(void)
gettimeofday(&tv, NULL);
snprintf(retval, sizeof retval, "wayland-test-%d-%ld%ld",
getpid(), tv.tv_sec, tv.tv_usec);
(int)getpid(), (long)tv.tv_sec, (long)tv.tv_usec);
return retval;
}
@ -510,7 +510,7 @@ static const struct wl_registry_listener registry_listener =
NULL
};
struct client *client_connect()
struct client *client_connect(void)
{
struct wl_registry *reg;
struct client *c = calloc(1, sizeof *c);

View file

@ -63,7 +63,12 @@ static int timeouts_enabled = 1;
/* set to one if the output goes to the terminal */
static int is_atty = 0;
#ifdef __APPLE__
extern const struct test __start_test_section __asm("section$start$__RODATA$test_section");
extern const struct test __stop_test_section __asm("section$end$__RODATA$test_section");
#else
extern const struct test __start_test_section, __stop_test_section;
#endif
static const struct test *
find_test(const char *name)
@ -308,6 +313,12 @@ is_debugger_attached(void)
return rc;
}
#else
static int
is_debugger_attached(void)
{
return 0;
}
#endif
int main(int argc, char *argv[])

View file

@ -31,6 +31,12 @@
#include <unistd.h>
#ifdef __APPLE__
#define TEST_SECTION "__RODATA,test_section"
#else
#define TEST_SECTION "test_section"
#endif
struct test {
const char *name;
void (*run)(void);
@ -41,7 +47,7 @@ struct test {
static void name(void); \
\
const struct test test##name \
__attribute__ ((used, section ("test_section"))) = { \
__attribute__ ((used, section (TEST_SECTION))) = { \
#name, name, 0 \
}; \
\
@ -51,7 +57,7 @@ struct test {
static void name(void); \
\
const struct test test##name \
__attribute__ ((used, section ("test_section"))) = { \
__attribute__ ((used, section (TEST_SECTION))) = { \
#name, name, 1 \
}; \
\