diff --git a/pressure-vessel/adverb-preload.c b/pressure-vessel/adverb-preload.c index f6b8de8315d6a14147b2f95bb96d17229d83b375..082614c2d28d1446d2a29d5dd731798c237b5fe7 100644 --- a/pressure-vessel/adverb-preload.c +++ b/pressure-vessel/adverb-preload.c @@ -261,3 +261,29 @@ pv_adverb_preload_module_parse_adverb_cli (PvAdverbPreloadModule *self, self->abi_index = abi_index; return TRUE; } + +gchar * +pv_adverb_preload_module_to_adverb_cli (PvAdverbPreloadModule *self) +{ + g_autoptr(GString) buf = NULL; + const PvPreloadVariable *variable; + + g_return_val_if_fail (self->index_in_preload_variables < G_N_ELEMENTS (pv_preload_variables), NULL); + g_return_val_if_fail (self->name != NULL, NULL); + g_return_val_if_fail (self->abi_index == PV_UNSPECIFIED_ABI + || self->abi_index < PV_N_SUPPORTED_ARCHITECTURES, + NULL); + + variable = &pv_preload_variables[self->index_in_preload_variables]; + buf = g_string_new (variable->adverb_option); + g_string_append_c (buf, '='); + g_string_append (buf, self->name); + + if (self->abi_index != PV_UNSPECIFIED_ABI) + { + g_string_append (buf, ":abi="); + g_string_append (buf, pv_multiarch_tuples[self->abi_index]); + } + + return g_string_free (g_steal_pointer (&buf), FALSE); +} diff --git a/pressure-vessel/adverb-preload.h b/pressure-vessel/adverb-preload.h index 0e76b9e77a0e7e183887c5bacefc53288d403070..4c79b4f69f514f67fccc5d1e0d1d417c8352e4d2 100644 --- a/pressure-vessel/adverb-preload.h +++ b/pressure-vessel/adverb-preload.h @@ -56,6 +56,8 @@ pv_adverb_preload_module_clear (gpointer p) G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (PvAdverbPreloadModule, pv_adverb_preload_module_clear) +gchar *pv_adverb_preload_module_to_adverb_cli (PvAdverbPreloadModule *self); + gboolean pv_adverb_preload_module_parse_adverb_cli (PvAdverbPreloadModule *self, const char *option, PvPreloadVariableIndex which, diff --git a/pressure-vessel/wrap-setup.c b/pressure-vessel/wrap-setup.c index 93ba728912560eb577519147f821591a53f89ed6..8570ea535a2ff6ffc8c58689c535c2c3a887b41d 100644 --- a/pressure-vessel/wrap-setup.c +++ b/pressure-vessel/wrap-setup.c @@ -556,49 +556,28 @@ append_preload_internal (GPtrArray *argv, PvRuntime *runtime, FlatpakExports *exports) { - const char *option = pv_preload_variables[which].adverb_option; - const char *multiarch_tuple; + g_auto(PvAdverbPreloadModule) module = PV_ADVERB_PRELOAD_MODULE_INIT; + g_autofree gchar *arg = NULL; gboolean flatpak_subsandbox = ((flags & PV_APPEND_PRELOAD_FLAGS_FLATPAK_SUBSANDBOX) != 0); - g_return_if_fail (abi_index == PV_UNSPECIFIED_ABI - || abi_index < PV_N_SUPPORTED_ARCHITECTURES); - - if (abi_index == PV_UNSPECIFIED_ABI) - multiarch_tuple = NULL; - else - multiarch_tuple = pv_multiarch_tuples[abi_index]; + module.index_in_preload_variables = which; + module.abi_index = abi_index; if (runtime != NULL && (g_str_has_prefix (original_path, "/usr/") || g_str_has_prefix (original_path, "/lib") || (flatpak_subsandbox && g_str_has_prefix (original_path, "/app/")))) { - g_autofree gchar *adjusted_path = NULL; const char *target = flatpak_subsandbox ? "/run/parent" : "/run/host"; - adjusted_path = g_build_filename (target, original_path, NULL); - g_debug ("%s -> %s", original_path, adjusted_path); - - if (multiarch_tuple != NULL) - g_ptr_array_add (argv, g_strdup_printf ("%s=%s:abi=%s", - option, adjusted_path, - multiarch_tuple)); - else - g_ptr_array_add (argv, g_strdup_printf ("%s=%s", - option, adjusted_path)); + module.name = g_build_filename (target, original_path, NULL); + g_debug ("%s -> %s", original_path, module.name); } else { + module.name = g_strdup (original_path); g_debug ("%s -> unmodified", original_path); - if (multiarch_tuple != NULL) - g_ptr_array_add (argv, g_strdup_printf ("%s=%s:abi=%s", - option, original_path, - multiarch_tuple)); - else - g_ptr_array_add (argv, g_strdup_printf ("%s=%s", - option, original_path)); - if (exports != NULL && export_path != NULL && export_path[0] == '/') { const gchar *steam_path = g_environ_getenv (env, "STEAM_COMPAT_CLIENT_INSTALL_PATH"); @@ -619,6 +598,10 @@ append_preload_internal (GPtrArray *argv, } } } + + arg = pv_adverb_preload_module_to_adverb_cli (&module); + g_return_if_fail (arg != NULL); + g_ptr_array_add (argv, g_steal_pointer (&arg)); } /* diff --git a/tests/pressure-vessel/adverb-preload.c b/tests/pressure-vessel/adverb-preload.c index 744a9180576b5c9bfba5a6772a4d7c5af0b9df6a..3024a75957d6e31ee1a67410a1e8f0f48a1fcf6e 100644 --- a/tests/pressure-vessel/adverb-preload.c +++ b/tests/pressure-vessel/adverb-preload.c @@ -420,12 +420,33 @@ test_cli (Fixture *f, } else { + g_autofree gchar *serialized = NULL; + g_auto(PvAdverbPreloadModule) reparsed = PV_ADVERB_PRELOAD_MODULE_INIT; + gchar *equals; + g_assert_no_error (local_error); g_assert_true (ret); g_assert_cmpstr (actual.name, ==, test->expected.name); g_assert_cmpuint (actual.abi_index, ==, test->expected.abi_index); g_assert_cmpuint (actual.index_in_preload_variables, ==, which); - pv_adverb_preload_module_clear (&actual); + + /* Check that it round-trips */ + serialized = pv_adverb_preload_module_to_adverb_cli (&actual); + g_assert_true (g_str_has_prefix (serialized, option)); + equals = serialized + strlen (option); + g_assert_cmpint (*equals, ==, '='); + *equals = '\0'; + + ret = pv_adverb_preload_module_parse_adverb_cli (&reparsed, + option, + which, + equals + 1, + &local_error); + g_assert_no_error (local_error); + g_assert_true (ret); + g_assert_cmpstr (reparsed.name, ==, test->expected.name); + g_assert_cmpuint (reparsed.abi_index, ==, test->expected.abi_index); + g_assert_cmpuint (reparsed.index_in_preload_variables, ==, which); } } }