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:
Alexander Larsson
2017-02-01 16:23:41 +01:00
parent 7f8ad5b3a1
commit a3da0b3da8
5 changed files with 54 additions and 10 deletions

View File

@@ -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], '=');

View File

@@ -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]);

View File

@@ -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,

View File

@@ -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;

View File

@@ -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;