Skip to content
Snippets Groups Projects
Commit d76f9101 authored by Simon McVittie's avatar Simon McVittie
Browse files

wrap: Add the ability to copy regular files into the container

parent e04f6a15
No related branches found
No related tags found
No related merge requests found
...@@ -759,24 +759,26 @@ try_bind_dri (FlatpakBwrap *bwrap, ...@@ -759,24 +759,26 @@ try_bind_dri (FlatpakBwrap *bwrap,
static struct static struct
{ {
FlatpakBwrap *bwrap; FlatpakBwrap *bwrap;
const char *symlink_farm; const char *source;
const char *dest; const char *dest;
} nftw_data; } nftw_data;
static int static int
add_symlinks_to_bwrap (const char *fpath, copy_tree_helper (const char *fpath,
const struct stat *sb, const struct stat *sb,
int typeflag, int typeflag,
struct FTW *ftwbuf) struct FTW *ftwbuf)
{ {
const char *path_in_container; const char *path_in_container;
g_autofree gchar *target = NULL; g_autofree gchar *target = NULL;
gsize prefix_len; gsize prefix_len;
int fd = -1;
GError *error = NULL;
g_return_val_if_fail (g_str_has_prefix (fpath, nftw_data.symlink_farm), 1); g_return_val_if_fail (g_str_has_prefix (fpath, nftw_data.source), 1);
g_return_val_if_fail (g_str_has_suffix (nftw_data.symlink_farm, nftw_data.dest), 1); g_return_val_if_fail (g_str_has_suffix (nftw_data.source, nftw_data.dest), 1);
prefix_len = strlen (nftw_data.symlink_farm) - strlen (nftw_data.dest); prefix_len = strlen (nftw_data.source) - strlen (nftw_data.dest);
path_in_container = fpath + prefix_len; path_in_container = fpath + prefix_len;
switch (typeflag) switch (typeflag)
...@@ -794,6 +796,19 @@ add_symlinks_to_bwrap (const char *fpath, ...@@ -794,6 +796,19 @@ add_symlinks_to_bwrap (const char *fpath,
NULL); NULL);
break; break;
case FTW_F:
if (!glnx_openat_rdonly (AT_FDCWD, fpath, FALSE, &fd, &error))
{
g_warning ("Unable to copy file into container: %s",
error->message);
g_clear_error (&error);
}
flatpak_bwrap_add_args_data_fd (nftw_data.bwrap,
"--ro-bind-data", glnx_steal_fd (&fd),
path_in_container);
break;
default: default:
g_warning ("Don't know how to handle ftw type flag %d at %s", g_warning ("Don't know how to handle ftw type flag %d at %s",
typeflag, fpath); typeflag, fpath);
...@@ -802,25 +817,34 @@ add_symlinks_to_bwrap (const char *fpath, ...@@ -802,25 +817,34 @@ add_symlinks_to_bwrap (const char *fpath,
return 0; return 0;
} }
/* /**
* For every symbolic link in @farm, add a corresponding symbolic link * pv_bwrap_copy_tree:
* via the bwrap command-line. * @bwrap: The #FlatpakBwrap
* @source: A copy of the desired @dest in a temporary directory,
* for example `/tmp/tmp12345678/overrides/lib`. The path must end
* with @dest.
* @dest: The destination path in the container, which must be absolute.
*
* For every file, directory or symbolic link in @source, add a
* corresponding read-only file, directory or symbolic link via the bwrap
* command-line, so that the files, directories and symbolic links in the
* container will persist even after @source has been deleted.
*/ */
static void static void
add_symlink_farm (FlatpakBwrap *bwrap, pv_bwrap_copy_tree (FlatpakBwrap *bwrap,
const char *farm, const char *source,
const char *dest) const char *dest)
{ {
g_return_if_fail (nftw_data.bwrap == NULL); g_return_if_fail (nftw_data.bwrap == NULL);
g_return_if_fail (dest[0] == '/'); g_return_if_fail (dest[0] == '/');
g_return_if_fail (g_str_has_suffix (farm, dest)); g_return_if_fail (g_str_has_suffix (source, dest));
nftw_data.bwrap = bwrap; nftw_data.bwrap = bwrap;
nftw_data.symlink_farm = farm; nftw_data.source = source;
nftw_data.dest = dest; nftw_data.dest = dest;
nftw (farm, add_symlinks_to_bwrap, 100, FTW_PHYS); nftw (source, copy_tree_helper, 100, FTW_PHYS);
nftw_data.bwrap = NULL; nftw_data.bwrap = NULL;
nftw_data.symlink_farm = NULL; nftw_data.source = NULL;
nftw_data.dest = NULL; nftw_data.dest = NULL;
} }
...@@ -1185,7 +1209,7 @@ bind_runtime (FlatpakBwrap *bwrap, ...@@ -1185,7 +1209,7 @@ bind_runtime (FlatpakBwrap *bwrap,
"--unsetenv", "LIBGL_DRIVERS_PATH", "--unsetenv", "LIBGL_DRIVERS_PATH",
NULL); NULL);
add_symlink_farm (bwrap, overrides, "/overrides"); pv_bwrap_copy_tree (bwrap, overrides, "/overrides");
if (!pv_bwrap_bind_usr (bwrap, "/", "/run/host", error)) if (!pv_bwrap_bind_usr (bwrap, "/", "/run/host", error))
return FALSE; return FALSE;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment