From af0478ae1e051a0a38ea7cd4e8bee4cb2b4d9872 Mon Sep 17 00:00:00 2001 From: Ting-Wei Lan Date: Mon, 2 Dec 2019 23:27:55 +0800 Subject: [PATCH] xwayland: Don't use abstract socket on non-Linux systems Abstract socket is a Linux-only feature. On operating systems other than Linux, we can only use the normal UNIX socket. This patch allows mutter to run as a nested Wayland compositor under Xorg on FreeBSD. https://gitlab.gnome.org/GNOME/mutter/merge_requests/954 --- src/wayland/meta-wayland-private.h | 2 ++ src/wayland/meta-xwayland.c | 44 +++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/wayland/meta-wayland-private.h b/src/wayland/meta-wayland-private.h index e28ca06d6..5c4f6e1f4 100644 --- a/src/wayland/meta-wayland-private.h +++ b/src/wayland/meta-wayland-private.h @@ -46,7 +46,9 @@ typedef struct { int display_index; char *lock_file; +#ifdef __linux__ int abstract_fd; +#endif int unix_fd; char *name; } MetaXWaylandConnection; diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c index ac55599d4..28fbca62e 100644 --- a/src/wayland/meta-xwayland.c +++ b/src/wayland/meta-xwayland.c @@ -235,6 +235,7 @@ create_lock_file (int display, int *display_out) return filename; } +#ifdef __linux__ static int bind_to_abstract_socket (int display, gboolean *fatal) @@ -274,6 +275,7 @@ bind_to_abstract_socket (int display, return fd; } +#endif static int bind_to_unix_socket (int display) @@ -381,26 +383,37 @@ meta_xwayland_override_display_number (int number) static gboolean open_display_sockets (MetaXWaylandManager *manager, int display_index, +#ifdef __linux__ int *abstract_fd_out, +#endif int *unix_fd_out, gboolean *fatal) { - int abstract_fd, unix_fd; +#ifdef __linux__ + int abstract_fd; +#endif + int unix_fd; +#ifdef __linux__ abstract_fd = bind_to_abstract_socket (display_index, fatal); if (abstract_fd < 0) return FALSE; +#endif unix_fd = bind_to_unix_socket (display_index); if (unix_fd < 0) { *fatal = FALSE; +#ifdef __linux__ close (abstract_fd); +#endif return FALSE; } +#ifdef __linux__ *abstract_fd_out = abstract_fd; +#endif *unix_fd_out = unix_fd; return TRUE; @@ -429,7 +442,9 @@ choose_xdisplay (MetaXWaylandManager *manager, } if (!open_display_sockets (manager, display, +#ifdef __linux__ &connection->abstract_fd, +#endif &connection->unix_fd, &fatal)) { @@ -617,10 +632,14 @@ meta_xwayland_start_xserver (MetaXWaylandManager *manager, launcher = g_subprocess_launcher_new (flags); g_subprocess_launcher_take_fd (launcher, xwayland_client_fd[1], 3); - g_subprocess_launcher_take_fd (launcher, manager->public_connection.abstract_fd, 4); + g_subprocess_launcher_take_fd (launcher, displayfd[1], 4); g_subprocess_launcher_take_fd (launcher, manager->public_connection.unix_fd, 5); - g_subprocess_launcher_take_fd (launcher, displayfd[1], 6); - g_subprocess_launcher_take_fd (launcher, manager->private_connection.abstract_fd, 7); +#ifdef __linux__ + g_subprocess_launcher_take_fd (launcher, manager->private_connection.abstract_fd, 6); + g_subprocess_launcher_take_fd (launcher, manager->public_connection.abstract_fd, 7); +#else + g_subprocess_launcher_take_fd (launcher, manager->private_connection.unix_fd, 6); +#endif g_subprocess_launcher_setenv (launcher, "WAYLAND_SOCKET", "3", TRUE); @@ -632,12 +651,14 @@ meta_xwayland_start_xserver (MetaXWaylandManager *manager, "-accessx", "-core", "-auth", manager->auth_file, - "-listen", "4", + "-displayfd", "4", "-listen", "5", - "-displayfd", "6", #ifdef HAVE_XWAYLAND_INITFD - "-initfd", "7", + "-initfd", "6", #else + "-listen", "6", +#endif +#ifdef __linux__ "-listen", "7", #endif NULL); @@ -756,14 +777,18 @@ meta_xwayland_init (MetaXWaylandManager *manager, { if (!open_display_sockets (manager, manager->public_connection.display_index, +#ifdef __linux__ &manager->public_connection.abstract_fd, +#endif &manager->public_connection.unix_fd, &fatal)) return FALSE; if (!open_display_sockets (manager, manager->private_connection.display_index, +#ifdef __linux__ &manager->private_connection.abstract_fd, +#endif &manager->private_connection.unix_fd, &fatal)) return FALSE; @@ -774,8 +799,13 @@ meta_xwayland_init (MetaXWaylandManager *manager, if (policy == META_DISPLAY_POLICY_ON_DEMAND) { +#ifdef __linux__ g_unix_fd_add (manager->public_connection.abstract_fd, G_IO_IN, xdisplay_connection_activity_cb, manager); +#else + g_unix_fd_add (manager->public_connection.unix_fd, G_IO_IN, + xdisplay_connection_activity_cb, manager); +#endif } return TRUE;