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

pressure-vessel: Make graphics drivers outside $HOME available, if used

Since !173, we have been able to create symbolic links to graphics
drivers anywhere on the filesystem, but that didn't mean the graphics
driver would necessarily be usable, because the directory containing it
would not necessarily be visible in the container. Add these directories
to the list of directories to be "exported".

Manual test (Debian on on Intel hardware, adjust as required for
others):

* Modify /usr/share/vulkan/icd.d/intel_icd.i686.json
  to use /opt/moved-from-usr/lib/i386-linux-gnu/libvulkan_intel.so
* Move the real i386 libvulkan_intel.so to that location
* ./run --verbose -- steam-runtime-system-info 2>&1 | tee container.log

Resolves: #29
Resolves: https://github.com/ValveSoftware/steam-runtime/issues/313


Signed-off-by: default avatarSimon McVittie <smcv@collabora.com>
parent be156ef9
No related branches found
No related tags found
1 merge request!192pressure-vessel: Make graphics drivers outside $HOME available, if used
Pipeline #5870 passed
/*
* Copyright © 2017-2020 Collabora Ltd.
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#include "exports.h"
#include <ftw.h>
/* nftw() doesn't have a user_data argument so we need to use a global
* variable :-( */
static struct
{
FlatpakExports *exports;
} export_targets_data;
static int
export_targets_helper (const char *fpath,
const struct stat *sb,
int typeflag,
struct FTW *ftwbuf)
{
g_autofree gchar *target = NULL;
switch (typeflag)
{
case FTW_SL:
target = glnx_readlinkat_malloc (-1, fpath, NULL, NULL);
if (target[0] != '/')
break;
if (g_str_has_prefix (target, "/run/host/"))
break;
g_debug ("Exporting %s because %s points to it",
target, fpath);
flatpak_exports_add_path_expose (export_targets_data.exports,
FLATPAK_FILESYSTEM_MODE_READ_ONLY,
target);
break;
default:
break;
}
return 0;
}
/**
* pv_export_symlink_targets:
* @exports: The #FlatpakExports
* @source: A copy of the overrides directory, for example
* `/tmp/tmp12345678/overrides/lib`.
*
* For every symbolic link in @source, if the target is absolute, mark
* it to be exported in @exports.
*/
void
pv_export_symlink_targets (FlatpakExports *exports,
const char *source)
{
g_return_if_fail (export_targets_data.exports == NULL);
export_targets_data.exports = exports;
nftw (source, export_targets_helper, 100, FTW_PHYS);
export_targets_data.exports = NULL;
}
/*
* Copyright © 2017-2020 Collabora Ltd.
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "libglnx/libglnx.h"
#include "flatpak-exports-private.h"
#include "steam-runtime-tools/glib-backports-internal.h"
void pv_export_symlink_targets (FlatpakExports *exports,
const char *source);
...@@ -191,6 +191,8 @@ executable( ...@@ -191,6 +191,8 @@ executable(
sources : [ sources : [
'bwrap.c', 'bwrap.c',
'bwrap.h', 'bwrap.h',
'exports.c',
'exports.h',
'flatpak-common-types-private.h', 'flatpak-common-types-private.h',
'flatpak-context.c', 'flatpak-context.c',
'flatpak-context-private.h', 'flatpak-context-private.h',
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include "bwrap-lock.h" #include "bwrap-lock.h"
#include "elf-utils.h" #include "elf-utils.h"
#include "enumtypes.h" #include "enumtypes.h"
#include "exports.h"
#include "flatpak-run-private.h" #include "flatpak-run-private.h"
#include "tree-copy.h" #include "tree-copy.h"
#include "utils.h" #include "utils.h"
...@@ -1626,6 +1627,7 @@ bind_icd (PvRuntime *self, ...@@ -1626,6 +1627,7 @@ bind_icd (PvRuntime *self,
static gboolean static gboolean
bind_runtime (PvRuntime *self, bind_runtime (PvRuntime *self,
FlatpakExports *exports,
FlatpakBwrap *bwrap, FlatpakBwrap *bwrap,
GHashTable *extra_locked_vars_to_unset, GHashTable *extra_locked_vars_to_unset,
GHashTable *extra_locked_vars_to_inherit, GHashTable *extra_locked_vars_to_inherit,
...@@ -1817,6 +1819,8 @@ bind_runtime (PvRuntime *self, ...@@ -1817,6 +1819,8 @@ bind_runtime (PvRuntime *self,
return FALSE; return FALSE;
} }
pv_export_symlink_targets (exports, self->overrides);
if (self->mutable_sysroot == NULL) if (self->mutable_sysroot == NULL)
{ {
/* self->overrides is in a temporary directory that will be /* self->overrides is in a temporary directory that will be
...@@ -3615,6 +3619,7 @@ pv_runtime_use_provider_graphics_stack (PvRuntime *self, ...@@ -3615,6 +3619,7 @@ pv_runtime_use_provider_graphics_stack (PvRuntime *self,
gboolean gboolean
pv_runtime_bind (PvRuntime *self, pv_runtime_bind (PvRuntime *self,
FlatpakExports *exports,
FlatpakBwrap *bwrap, FlatpakBwrap *bwrap,
GHashTable *extra_locked_vars_to_unset, GHashTable *extra_locked_vars_to_unset,
GHashTable *extra_locked_vars_to_inherit, GHashTable *extra_locked_vars_to_inherit,
...@@ -3623,13 +3628,18 @@ pv_runtime_bind (PvRuntime *self, ...@@ -3623,13 +3628,18 @@ pv_runtime_bind (PvRuntime *self,
g_autofree gchar *pressure_vessel_prefix = NULL; g_autofree gchar *pressure_vessel_prefix = NULL;
g_return_val_if_fail (PV_IS_RUNTIME (self), FALSE); g_return_val_if_fail (PV_IS_RUNTIME (self), FALSE);
g_return_val_if_fail (exports != NULL, FALSE);
g_return_val_if_fail (!pv_bwrap_was_finished (bwrap), FALSE); g_return_val_if_fail (!pv_bwrap_was_finished (bwrap), FALSE);
g_return_val_if_fail (extra_locked_vars_to_unset != NULL, FALSE); g_return_val_if_fail (extra_locked_vars_to_unset != NULL, FALSE);
g_return_val_if_fail (extra_locked_vars_to_inherit != NULL, FALSE); g_return_val_if_fail (extra_locked_vars_to_inherit != NULL, FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
if (!bind_runtime (self, bwrap, extra_locked_vars_to_unset, if (!bind_runtime (self,
extra_locked_vars_to_inherit, error)) exports,
bwrap,
extra_locked_vars_to_unset,
extra_locked_vars_to_inherit,
error))
return FALSE; return FALSE;
pressure_vessel_prefix = g_path_get_dirname (self->tools_dir); pressure_vessel_prefix = g_path_get_dirname (self->tools_dir);
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "libglnx/libglnx.h" #include "libglnx/libglnx.h"
#include "flatpak-bwrap-private.h" #include "flatpak-bwrap-private.h"
#include "flatpak-exports-private.h"
#include "flatpak-utils-base-private.h" #include "flatpak-utils-base-private.h"
/** /**
...@@ -82,6 +83,7 @@ PvRuntime *pv_runtime_new (const char *source_files, ...@@ -82,6 +83,7 @@ PvRuntime *pv_runtime_new (const char *source_files,
gchar *pv_runtime_get_adverb (PvRuntime *self, gchar *pv_runtime_get_adverb (PvRuntime *self,
FlatpakBwrap *adverb_args); FlatpakBwrap *adverb_args);
gboolean pv_runtime_bind (PvRuntime *self, gboolean pv_runtime_bind (PvRuntime *self,
FlatpakExports *exports,
FlatpakBwrap *bwrap, FlatpakBwrap *bwrap,
GHashTable *extra_locked_vars_to_unset, GHashTable *extra_locked_vars_to_unset,
GHashTable *extra_locked_vars_to_inherit, GHashTable *extra_locked_vars_to_inherit,
......
...@@ -1781,8 +1781,12 @@ main (int argc, ...@@ -1781,8 +1781,12 @@ main (int argc,
if (runtime == NULL) if (runtime == NULL)
goto out; goto out;
if (!pv_runtime_bind (runtime, bwrap, extra_locked_vars_to_unset, if (!pv_runtime_bind (runtime,
extra_locked_vars_to_inherit, error)) exports,
bwrap,
extra_locked_vars_to_unset,
extra_locked_vars_to_inherit,
error))
goto out; goto out;
} }
else if (is_flatpak_env) else if (is_flatpak_env)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment