mirror of
https://github.com/flatpak/flatpak.git
synced 2026-05-18 21:55:22 -04:00
extensions: Add add_ld_path property
If your extension points set this, then each extension will have the corresponding subdirectory added to LD_LIBRARY_PATH. We also support a priority property in the ExtensionOf group in the extensions themselves to set the search order.
This commit is contained in:
@@ -316,13 +316,14 @@ flatpak_builtin_build (int argc, char **argv, GCancellable *cancellable, GError
|
||||
|
||||
envp = flatpak_run_get_minimal_env (TRUE);
|
||||
envp = flatpak_run_apply_env_vars (envp, app_context);
|
||||
flatpak_run_add_environment_args (argv_array, NULL, &envp, NULL, NULL, id,
|
||||
app_context, NULL);
|
||||
|
||||
if (!custom_usr && !(is_extension && !is_app_extension) &&
|
||||
!flatpak_run_add_extension_args (argv_array, runtime_metakey, runtime_ref, cancellable, error))
|
||||
!flatpak_run_add_extension_args (argv_array, &envp, runtime_metakey, runtime_ref, cancellable, error))
|
||||
return FALSE;
|
||||
|
||||
flatpak_run_add_environment_args (argv_array, NULL, &envp, NULL, NULL, id,
|
||||
app_context, NULL);
|
||||
|
||||
for (i = 0; opt_bind_mounts != NULL && opt_bind_mounts[i] != NULL; i++)
|
||||
{
|
||||
char *split = strchr (opt_bind_mounts[i], '=');
|
||||
|
||||
@@ -2163,6 +2163,7 @@ flatpak_add_bus_filters (GPtrArray *dbus_proxy_argv,
|
||||
|
||||
gboolean
|
||||
flatpak_run_add_extension_args (GPtrArray *argv_array,
|
||||
char ***envp_p,
|
||||
GKeyFile *metakey,
|
||||
const char *full_ref,
|
||||
GCancellable *cancellable,
|
||||
@@ -2210,6 +2211,20 @@ flatpak_run_add_extension_args (GPtrArray *argv_array,
|
||||
add_args (argv_array,
|
||||
"--lock-file", ref,
|
||||
NULL);
|
||||
|
||||
if (ext->add_ld_path)
|
||||
{
|
||||
g_autofree char *ld_path = g_build_filename (full_directory, ext->add_ld_path, NULL);
|
||||
const gchar *old_ld_path = g_environ_getenv (*envp_p, "LD_LIBRARY_PATH");
|
||||
g_autofree char *new_ld_path = NULL;
|
||||
|
||||
if (old_ld_path != NULL)
|
||||
new_ld_path = g_strconcat (old_ld_path, ":", ld_path, NULL);
|
||||
else
|
||||
new_ld_path = g_strdup (new_ld_path);
|
||||
|
||||
*envp_p = g_environ_setenv (*envp_p, "LD_LIBRARY_PATH", new_ld_path , TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
g_list_free_full (extensions, (GDestroyNotify) flatpak_extension_free);
|
||||
@@ -4187,10 +4202,10 @@ flatpak_run_app (const char *app_ref,
|
||||
return FALSE;
|
||||
|
||||
if (metakey != NULL &&
|
||||
!flatpak_run_add_extension_args (argv_array, metakey, app_ref, cancellable, error))
|
||||
!flatpak_run_add_extension_args (argv_array, &envp, metakey, app_ref, cancellable, error))
|
||||
return FALSE;
|
||||
|
||||
if (!flatpak_run_add_extension_args (argv_array, runtime_metakey, runtime_ref, cancellable, error))
|
||||
if (!flatpak_run_add_extension_args (argv_array, &envp, runtime_metakey, runtime_ref, cancellable, error))
|
||||
return FALSE;
|
||||
|
||||
add_document_portal_args (argv_array, app_ref_parts[1]);
|
||||
|
||||
@@ -72,6 +72,7 @@ void flatpak_context_to_args (FlatpakContext *context,
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FlatpakContext, flatpak_context_free)
|
||||
|
||||
gboolean flatpak_run_add_extension_args (GPtrArray *argv_array,
|
||||
char ***envp_p,
|
||||
GKeyFile *metakey,
|
||||
const char *full_ref,
|
||||
GCancellable *cancellable,
|
||||
|
||||
@@ -3450,14 +3450,26 @@ flatpak_extension_free (FlatpakExtension *extension)
|
||||
g_free (extension->ref);
|
||||
g_free (extension->directory);
|
||||
g_free (extension->files_path);
|
||||
g_free (extension->add_ld_path);
|
||||
g_free (extension);
|
||||
}
|
||||
|
||||
static int
|
||||
flatpak_extension_compare (gconstpointer _a,
|
||||
gconstpointer _b)
|
||||
{
|
||||
const FlatpakExtension *a = _a;
|
||||
const FlatpakExtension *b = _b;
|
||||
|
||||
return b->priority - a->priority;
|
||||
}
|
||||
|
||||
static FlatpakExtension *
|
||||
flatpak_extension_new (const char *id,
|
||||
const char *extension,
|
||||
const char *ref,
|
||||
const char *directory,
|
||||
const char *add_ld_path,
|
||||
GFile *files,
|
||||
gboolean is_unmaintained)
|
||||
{
|
||||
@@ -3468,7 +3480,20 @@ flatpak_extension_new (const char *id,
|
||||
ext->ref = g_strdup (ref);
|
||||
ext->directory = g_strdup (directory);
|
||||
ext->files_path = g_file_get_path (files);
|
||||
ext->add_ld_path = g_strdup (add_ld_path);
|
||||
ext->is_unmaintained = is_unmaintained;
|
||||
|
||||
if (is_unmaintained)
|
||||
ext->priority = 1000;
|
||||
else
|
||||
{
|
||||
g_autoptr(GKeyFile) keyfile = g_key_file_new ();
|
||||
g_autofree char *metadata_path = g_build_filename (ext->files_path, "../metadata", NULL);
|
||||
|
||||
if (g_key_file_load_from_file (keyfile, metadata_path, G_KEY_FILE_NONE, NULL))
|
||||
ext->priority = g_key_file_get_integer (keyfile, "ExtensionOf", "priority", NULL);
|
||||
}
|
||||
|
||||
return ext;
|
||||
}
|
||||
|
||||
@@ -3497,6 +3522,7 @@ flatpak_list_extensions (GKeyFile *metakey,
|
||||
{
|
||||
g_autofree char *directory = g_key_file_get_string (metakey, groups[i], "directory", NULL);
|
||||
g_autofree char *version = g_key_file_get_string (metakey, groups[i], "version", NULL);
|
||||
g_autofree char *add_ld_path = g_key_file_get_string (metakey, groups[i], "add-ld-path", NULL);
|
||||
g_autofree char *ref = NULL;
|
||||
const char *branch;
|
||||
gboolean is_unmaintained = FALSE;
|
||||
@@ -3522,7 +3548,7 @@ flatpak_list_extensions (GKeyFile *metakey,
|
||||
/* Prefer a full extension (org.freedesktop.Locale) over subdirectory ones (org.freedesktop.Locale.sv) */
|
||||
if (files != NULL)
|
||||
{
|
||||
ext = flatpak_extension_new (extension, extension, ref, directory, files, is_unmaintained);
|
||||
ext = flatpak_extension_new (extension, extension, ref, directory, add_ld_path, files, is_unmaintained);
|
||||
res = g_list_prepend (res, ext);
|
||||
}
|
||||
else if (g_key_file_get_boolean (metakey, groups[i],
|
||||
@@ -3543,7 +3569,7 @@ flatpak_list_extensions (GKeyFile *metakey,
|
||||
|
||||
if (subdir_files)
|
||||
{
|
||||
ext = flatpak_extension_new (extension, refs[j], dir_ref, extended_dir, subdir_files, FALSE);
|
||||
ext = flatpak_extension_new (extension, refs[j], dir_ref, extended_dir, add_ld_path, subdir_files, FALSE);
|
||||
ext->needs_tmpfs = TRUE;
|
||||
res = g_list_prepend (res, ext);
|
||||
}
|
||||
@@ -3559,7 +3585,7 @@ flatpak_list_extensions (GKeyFile *metakey,
|
||||
|
||||
if (subdir_files)
|
||||
{
|
||||
ext = flatpak_extension_new (extension, unmaintained_refs[j], dir_ref, extended_dir, subdir_files, TRUE);
|
||||
ext = flatpak_extension_new (extension, unmaintained_refs[j], dir_ref, extended_dir, add_ld_path, subdir_files, TRUE);
|
||||
ext->needs_tmpfs = TRUE;
|
||||
res = g_list_prepend (res, ext);
|
||||
}
|
||||
@@ -3568,10 +3594,9 @@ flatpak_list_extensions (GKeyFile *metakey,
|
||||
}
|
||||
}
|
||||
|
||||
return g_list_reverse (res);
|
||||
return g_list_sort (g_list_reverse (res), flatpak_extension_compare);
|
||||
}
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
FlatpakXml *current;
|
||||
|
||||
@@ -324,6 +324,8 @@ typedef struct
|
||||
char *ref;
|
||||
char *directory;
|
||||
char *files_path;
|
||||
char *add_ld_path;
|
||||
int priority;
|
||||
gboolean needs_tmpfs;
|
||||
gboolean is_unmaintained;
|
||||
} FlatpakExtension;
|
||||
|
||||
Reference in New Issue
Block a user