Skip to content
Snippets Groups Projects
wrap.c 65 KiB
Newer Older

  /* flatpak_bwrap_finish did this */
  g_assert (g_ptr_array_index (bwrap->argv, bwrap->argv->len - 1) == NULL);

  g_debug ("Launching child process...");

  if (opt_interactive)
    spawn_flags |= G_SPAWN_CHILD_INHERITS_STDIN;

  if (!g_spawn_async (NULL,   /* cwd */
                      (gchar **) bwrap->argv->pdata,
                      bwrap->envp,
                      spawn_flags,
                      flatpak_bwrap_child_setup_cb,
                      bwrap->fds,
                      &child_pid,
                      error))
    {
      ret = 127;
      goto out;
    }

  g_child_watch_add (child_pid, child_exited_cb, &child_exited_closure);

  while (!child_exited_closure.exited)
    g_main_context_iteration (NULL, TRUE);

  if (opt_verbose)
    {
      if (WIFEXITED (child_exited_closure.wait_status))
        g_message ("Command exited with status %d",
                    WEXITSTATUS (child_exited_closure.wait_status));
      else if (WIFSIGNALED (child_exited_closure.wait_status))
        g_message ("Command killed by signal %d",
                   WTERMSIG (child_exited_closure.wait_status));
      else
        g_message ("Command terminated in an unknown way");
    }

  if (WIFEXITED (child_exited_closure.wait_status))
    ret = WEXITSTATUS (child_exited_closure.wait_status);
  else if (WIFSIGNALED (child_exited_closure.wait_status))
    ret = 128 + WTERMSIG (child_exited_closure.wait_status);
  else
    ret = 126;

out:
  if (local_error != NULL)
    g_warning ("%s", local_error->message);

  if (tmpdir != NULL &&
      !glnx_shutil_rm_rf_at (-1, tmpdir, NULL, error))
    {
      g_warning ("Unable to delete temporary directory: %s",
                 local_error->message);
      g_clear_error (&local_error);
    }

  g_clear_pointer (&opt_ld_preload, g_ptr_array_unref);
  g_clear_pointer (&opt_env_if_host, g_strfreev);
  g_clear_pointer (&opt_freedesktop_app_id, g_free);
  g_clear_pointer (&opt_steam_app_id, g_free);
  g_clear_pointer (&opt_home, g_free);
  g_clear_pointer (&opt_fake_home, g_free);
  g_clear_pointer (&opt_runtime, g_free);

  return ret;
}