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. --- v2: - use g_strdupv rather than manually duping everything - split GetClientPaths to GetClientPath and GetFallbackClientPath SpiceXPI/src/plugin/controller-unix.cpp | 78 ++++++++++++++++++++++++--------- SpiceXPI/src/plugin/controller.h | 2 + 2 files changed, 60 insertions(+), 20 deletions(-) diff --git a/SpiceXPI/src/plugin/controller-unix.cpp b/SpiceXPI/src/plugin/controller-unix.cpp index 338f1a8..16f7033 100644 --- a/SpiceXPI/src/plugin/controller-unix.cpp +++ b/SpiceXPI/src/plugin/controller-unix.cpp @@ -138,6 +138,20 @@ int SpiceController::Connect(const int nRetries) return rc; } +GStrv SpiceControllerUnix::GetClientPath() +{ + const char *client_argv[] = { "/usr/libexec/spice-xpi-client", NULL }; + + return g_strdupv((GStrv)client_argv); +} + +GStrv SpiceControllerUnix::GetFallbackClientPath() +{ + const char *fallback_argv[] = { "/usr/bin/spicec", "--controller", NULL }; + + return g_strdupv((GStrv)fallback_argv); +} + void SpiceController::SetupControllerPipe(GStrv &env) { std::string socket_file(this->m_tmp_dir); @@ -208,42 +222,66 @@ 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; - + // Setup client environment 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); + // Try to spawn main client + client_argv = fake_this->GetClientPath(); + if (client_argv != NULL) { + char *argv_str = g_strjoinv(" ", client_argv); + g_warning("main client cmdline: %s", argv_str); + g_free(argv_str); + + 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); + } + g_strfreev(client_argv); } + if (!spawned) { - // 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, + // Fallback client for backward compatibility + GStrv fallback_argv; + char *argv_str; + fallback_argv = fake_this->GetFallbackClientPath(); + if (fallback_argv == NULL) { + goto out; + } + + argv_str = g_strjoinv(" ", fallback_argv); + g_warning("fallback client cmdline: %s", argv_str); + g_free(argv_str); + + 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 %s: %s", fallback_argv[0], error->message); + g_warn_if_fail(spawned == FALSE); + g_clear_error(&error); + } } - if (error != NULL) { - g_warning("failed to start spice-xpi-client: %s", error->message); - g_clear_error(&error); - } + +out: g_strfreev(env); + 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 e19187c..b38f7bc 100644 --- a/SpiceXPI/src/plugin/controller.h +++ b/SpiceXPI/src/plugin/controller.h @@ -89,6 +89,8 @@ private: int Connect(); void WaitForPid(GPid pid); void SetupControllerPipe(GStrv &env); + GStrv GetClientPath(void); + GStrv GetFallbackClientPath(void); static void ChildExited(GPid pid, gint status, gpointer user_data); static gpointer ClientThread(gpointer data); -- 1.8.1.4 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel