[mutter] xwayland: Port to GSubprocess



commit d4e8d97e58f9c931a14ea9b6484890d7a66e65e7
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Sat Mar 21 18:24:37 2015 -0700

    xwayland: Port to GSubprocess

 src/wayland/meta-xwayland.c |   84 ++++++++++++++++++------------------------
 1 files changed, 36 insertions(+), 48 deletions(-)
---
diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c
index 95786bb..8736978 100644
--- a/src/wayland/meta-xwayland.c
+++ b/src/wayland/meta-xwayland.c
@@ -322,11 +322,13 @@ bind_to_unix_socket (int display)
 }
 
 static void
-xserver_died (GPid     pid,
-              gint     status,
-              gpointer user_data)
+xserver_died (GObject      *source,
+              GAsyncResult *result,
+              gpointer      user_data)
 {
-  if (!WIFEXITED (status))
+  GSubprocess *proc = G_SUBPROCESS (source);
+
+  if (!g_subprocess_get_successful (proc))
     g_error ("X Wayland crashed; aborting");
   else
     {
@@ -434,7 +436,10 @@ meta_xwayland_start (MetaXWaylandManager *manager,
 {
   int xwayland_client_fd[2];
   int displayfd[2];
-  int fd;
+  GSubprocessLauncher *launcher;
+  GSubprocessFlags flags;
+  GSubprocess *proc;
+  GError *error = NULL;
 
   if (!choose_xdisplay (manager))
     return FALSE;
@@ -455,54 +460,37 @@ meta_xwayland_start (MetaXWaylandManager *manager,
       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. */
-      if (getenv ("XWAYLAND_STFU"))
-        {
-          int dev_null;
-          dev_null = open ("/dev/null", O_WRONLY);
-
-          dup2 (dev_null, STDOUT_FILENO);
-          dup2 (dev_null, STDERR_FILENO);
-        }
+  /* xwayland, please. */
+  flags = G_SUBPROCESS_FLAGS_NONE;
 
-      if (execl (XWAYLAND_PATH, XWAYLAND_PATH,
-                 manager->display_name,
-                 "-rootless",
-                 "-noreset",
-                 "-listen", abstract_fd,
-                 "-listen", unix_fd,
-                 "-displayfd", displayfd_fd,
-                 NULL) < 0)
-        {
-          g_error ("Failed to spawn XWayland: %m");
-        }
+  if (getenv ("XWAYLAND_STFU"))
+    {
+      flags |= G_SUBPROCESS_FLAGS_STDOUT_SILENCE;
+      flags |= G_SUBPROCESS_FLAGS_STDERR_SILENCE;
     }
-  else if (manager->pid == -1)
+
+  launcher = g_subprocess_launcher_new (flags);
+
+  g_subprocess_launcher_take_fd (launcher, xwayland_client_fd[1], 3);
+  g_subprocess_launcher_take_fd (launcher, manager->abstract_fd, 4);
+  g_subprocess_launcher_take_fd (launcher, manager->unix_fd, 5);
+  g_subprocess_launcher_take_fd (launcher, displayfd[1], 6);
+
+  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 fork: %m");
+      g_error ("Failed to spawn Xwayland: %s", error->message);
+      return FALSE;
     }
 
-  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);
   manager->client = wl_client_create (wl_display, xwayland_client_fd[0]);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]