[Spice-devel] [spice-xpi 10/12] Add helper function to get client paths
Christophe Fergeau
cfergeau at redhat.com
Tue Mar 12 04:23:05 PDT 2013
The SPICE client paths will be different on Windows and Unix so add
a helper function returning the paths to use to spawn the clients.
---
SpiceXPI/src/plugin/controller-unix.cpp | 66 ++++++++++++++++++++++++---------
SpiceXPI/src/plugin/controller.h | 1 +
2 files changed, 49 insertions(+), 18 deletions(-)
diff --git a/SpiceXPI/src/plugin/controller-unix.cpp b/SpiceXPI/src/plugin/controller-unix.cpp
index 504a8ef..743e00b 100644
--- a/SpiceXPI/src/plugin/controller-unix.cpp
+++ b/SpiceXPI/src/plugin/controller-unix.cpp
@@ -139,6 +139,20 @@ int SpiceController::Connect(const int nRetries)
return rc;
}
+void SpiceController::GetClientPaths(GStrv *client_argv, GStrv *fallback_argv)
+{
+ if (client_argv != NULL) {
+ *client_argv = g_new0(char *, 2);
+ (*client_argv)[0] = g_strdup("/usr/libexec/spice-xpi-client");
+ }
+
+ if (fallback_argv != NULL) {
+ *client_argv = g_new0(char *, 3);
+ (*client_argv)[0] = g_strdup("/usr/bin/spicec");
+ (*client_argv)[1] = g_strdup("--controller");
+ }
+}
+
void SpiceController::SetupControllerPipe(GStrv &env)
{
std::string socket_file(this->m_tmp_dir);
@@ -209,42 +223,58 @@ void SpiceController::WaitForPid(GPid pid)
gpointer SpiceController::ClientThread(gpointer data)
{
- char *spice_xpi_argv[] = { "/usr/libexec/spice-xpi-client", NULL };
SpiceController *fake_this = (SpiceController *)data;
gchar **env = g_get_environ();
GPid pid;
- gboolean spawned;
+ gboolean spawned = FALSE;
GError *error = NULL;
+ GStrv client_argv;
+ GStrv fallback_argv;
+ fake_this->GetClientPaths(&client_argv, &fallback_argv);
+ {
+ char *argv_str = g_strjoinv(" ", client_argv);
+ g_warning("main client cmdline: %s", argv_str);
+ g_free(argv_str);
+ argv_str = g_strjoinv(" ", fallback_argv);
+ g_warning("fallback client cmdline: %s", argv_str);
+ g_free(argv_str);
+ }
fake_this->SetupControllerPipe(env);
if (!fake_this->m_proxy.empty())
env = g_environ_setenv(env, "SPICE_PROXY", fake_this->m_proxy.c_str(), TRUE);
- spawned = g_spawn_async(NULL,
- spice_xpi_argv, env,
- G_SPAWN_DO_NOT_REAP_CHILD,
- NULL, NULL, /* child_func, child_arg */
- &pid, &error);
- if (error != NULL) {
- g_warning("failed to start spice-xpi-client: %s", error->message);
- g_clear_error(&error);
+ if (client_argv != NULL) {
+ spawned = g_spawn_async(NULL,
+ client_argv, env,
+ G_SPAWN_DO_NOT_REAP_CHILD,
+ NULL, NULL, /* child_func, child_arg */
+ &pid, &error);
+ if (error != NULL) {
+ g_warning("failed to start %s: %s", client_argv[0], error->message);
+ g_warn_if_fail(spawned == FALSE);
+ g_clear_error(&error);
+ }
}
- if (!spawned) {
+ if (!spawned && (fallback_argv != NULL)) {
// TODO: temporary fallback for backward compatibility
- char *spicec_argv[] = { "/usr/bin/spicec", "--controller", NULL };
- g_message("failed to run spice-xpi-client, running spicec instead");
- spawned = g_spawn_async(NULL, spicec_argv, env,
+ g_message("failed to run preferred client, running fallback client instead");
+ spawned = g_spawn_async(NULL, fallback_argv, env,
G_SPAWN_DO_NOT_REAP_CHILD,
NULL, NULL, /* child_func, child_arg */
&pid, &error);
- }
- if (error != NULL) {
- g_warning("failed to start spice-xpi-client: %s", error->message);
- g_clear_error(&error);
+ if (error != NULL) {
+ g_warning("failed to start %s: %s", fallback_argv[0], error->message);
+ g_warn_if_fail(spawned == FALSE);
+ g_clear_error(&error);
+ }
}
g_strfreev(env);
+ g_strfreev(client_argv);
+ g_strfreev(fallback_argv);
+
if (!spawned) {
g_critical("ERROR failed to run spicec fallback");
return NULL;
diff --git a/SpiceXPI/src/plugin/controller.h b/SpiceXPI/src/plugin/controller.h
index f47a921..de4516c 100644
--- a/SpiceXPI/src/plugin/controller.h
+++ b/SpiceXPI/src/plugin/controller.h
@@ -90,6 +90,7 @@ private:
int Connect();
void WaitForPid(GPid pid);
void SetupControllerPipe(GStrv &env);
+ void GetClientPaths(GStrv *client_argv, GStrv *fallback_argv);
static void ChildExited(GPid pid, gint status, gpointer user_data);
static gpointer ClientThread(gpointer data);
--
1.8.1.4
More information about the Spice-devel
mailing list