xwayland: Port to GSubprocess

This commit is contained in:
Jasper St. Pierre 2015-03-21 18:24:37 -07:00
parent a86368dcb1
commit d4e8d97e58

View File

@ -322,11 +322,13 @@ bind_to_unix_socket (int display)
} }
static void static void
xserver_died (GPid pid, xserver_died (GObject *source,
gint status, GAsyncResult *result,
gpointer user_data) gpointer user_data)
{ {
if (!WIFEXITED (status)) GSubprocess *proc = G_SUBPROCESS (source);
if (!g_subprocess_get_successful (proc))
g_error ("X Wayland crashed; aborting"); g_error ("X Wayland crashed; aborting");
else else
{ {
@ -434,7 +436,10 @@ meta_xwayland_start (MetaXWaylandManager *manager,
{ {
int xwayland_client_fd[2]; int xwayland_client_fd[2];
int displayfd[2]; int displayfd[2];
int fd; GSubprocessLauncher *launcher;
GSubprocessFlags flags;
GSubprocess *proc;
GError *error = NULL;
if (!choose_xdisplay (manager)) if (!choose_xdisplay (manager))
return FALSE; return FALSE;
@ -455,54 +460,37 @@ meta_xwayland_start (MetaXWaylandManager *manager,
return FALSE; return FALSE;
} }
manager->pid = fork ();
if (manager->pid == 0)
{
char socket_fd[8], unix_fd[8], abstract_fd[8], displayfd_fd[8];
/* We passed SOCK_CLOEXEC, so dup the FD so it isn't
* closed on exec.. */
fd = dup (xwayland_client_fd[1]);
snprintf (socket_fd, sizeof (socket_fd), "%d", fd);
setenv ("WAYLAND_SOCKET", socket_fd, TRUE);
fd = dup (manager->abstract_fd);
snprintf (abstract_fd, sizeof (abstract_fd), "%d", fd);
fd = dup (manager->unix_fd);
snprintf (unix_fd, sizeof (unix_fd), "%d", fd);
fd = dup (displayfd[1]);
snprintf (displayfd_fd, sizeof (displayfd_fd), "%d", fd);
/* xwayland, please. */ /* xwayland, please. */
flags = G_SUBPROCESS_FLAGS_NONE;
if (getenv ("XWAYLAND_STFU")) if (getenv ("XWAYLAND_STFU"))
{ {
int dev_null; flags |= G_SUBPROCESS_FLAGS_STDOUT_SILENCE;
dev_null = open ("/dev/null", O_WRONLY); flags |= G_SUBPROCESS_FLAGS_STDERR_SILENCE;
dup2 (dev_null, STDOUT_FILENO);
dup2 (dev_null, STDERR_FILENO);
} }
if (execl (XWAYLAND_PATH, XWAYLAND_PATH, launcher = g_subprocess_launcher_new (flags);
manager->display_name,
"-rootless", g_subprocess_launcher_take_fd (launcher, xwayland_client_fd[1], 3);
"-noreset", g_subprocess_launcher_take_fd (launcher, manager->abstract_fd, 4);
"-listen", abstract_fd, g_subprocess_launcher_take_fd (launcher, manager->unix_fd, 5);
"-listen", unix_fd, g_subprocess_launcher_take_fd (launcher, displayfd[1], 6);
"-displayfd", displayfd_fd,
NULL) < 0) g_subprocess_launcher_setenv (launcher, "WAYLAND_SOCKET", "3", TRUE);
proc = g_subprocess_launcher_spawn (launcher, &error,
XWAYLAND_PATH, manager->display_name,
"-rootless", "-noreset",
"-listen", "4",
"-listen", "5",
"-displayfd", "6",
NULL);
if (!proc)
{ {
g_error ("Failed to spawn XWayland: %m"); g_error ("Failed to spawn Xwayland: %s", error->message);
} return FALSE;
}
else if (manager->pid == -1)
{
g_error ("Failed to fork: %m");
} }
g_child_watch_add (manager->pid, xserver_died, NULL); g_subprocess_wait_async (proc, NULL, xserver_died, NULL);
g_unix_fd_add (displayfd[0], G_IO_IN, on_displayfd_ready, manager); g_unix_fd_add (displayfd[0], G_IO_IN, on_displayfd_ready, manager);
manager->client = wl_client_create (wl_display, xwayland_client_fd[0]); manager->client = wl_client_create (wl_display, xwayland_client_fd[0]);