From a3da0b3da8947c4bbf96e5c40457bf51256c2248 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 1 Feb 2017 16:23:41 +0100 Subject: [PATCH] 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. --- app/flatpak-builtins-build.c | 7 ++++--- common/flatpak-run.c | 19 +++++++++++++++++-- common/flatpak-run.h | 1 + common/flatpak-utils.c | 35 ++++++++++++++++++++++++++++++----- common/flatpak-utils.h | 2 ++ 5 files changed, 54 insertions(+), 10 deletions(-) diff --git a/app/flatpak-builtins-build.c b/app/flatpak-builtins-build.c index 53113fb4..2595b745 100644 --- a/app/flatpak-builtins-build.c +++ b/app/flatpak-builtins-build.c @@ -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], '='); diff --git a/common/flatpak-run.c b/common/flatpak-run.c index 5e49f092..46b67237 100644 --- a/common/flatpak-run.c +++ b/common/flatpak-run.c @@ -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]); diff --git a/common/flatpak-run.h b/common/flatpak-run.h index 4721cb8a..8a29fe0a 100644 --- a/common/flatpak-run.h +++ b/common/flatpak-run.h @@ -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, diff --git a/common/flatpak-utils.c b/common/flatpak-utils.c index 30ac34d0..cc948037 100644 --- a/common/flatpak-utils.c +++ b/common/flatpak-utils.c @@ -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; diff --git a/common/flatpak-utils.h b/common/flatpak-utils.h index 2bd2e8a4..4f9eaaae 100644 --- a/common/flatpak-utils.h +++ b/common/flatpak-utils.h @@ -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;