* [PATCH v7 0/6] cutils: Introduce bundle mechanism
@ 2022-06-15 17:33 Akihiko Odaki
2022-06-15 17:33 ` [PATCH v7 1/6] qga: Relocate a path emitted in the help text Akihiko Odaki
` (6 more replies)
0 siblings, 7 replies; 11+ messages in thread
From: Akihiko Odaki @ 2022-06-15 17:33 UTC (permalink / raw)
Cc: Peter Maydell, Jason Wang, qemu-devel, Programmingkid,
Philippe Mathieu-Daudé,
Gerd Hoffmann, Daniel P . Berrangé,
Paolo Bonzini, Akihiko Odaki
Developers often run QEMU without installing. The bundle mechanism
allows to look up files which should be present in installation even in
such a situation.
It is a general mechanism and can find any files located relative
to the installation tree. The build tree must have a new directory,
qemu-bundle, to represent what files the installation tree would
have for reference by the executables.
v7: Properly fix --firmwarepath (Daniel P. Berrangé)
v6: Reuse get_relocated_path() in find_bundle() (Paolo Bonzini)
v5:
* Prefer qemu-bundle if it exists. (Daniel P. Berrangé)
* Check install_blobs option before installing BIOSes (Paolo Bonzini)
* Add common code to set up qemu-bundle to the top level meson.build
(Paolo Bonzini)
v4:
* Add Daniel P. Berrangé to CC. Hopefully this helps merging his patch:
https://mail.gnu.org/archive/html/qemu-devel/2022-06/msg02276.html
* Rebased to the latest QEMU.
v3:
* Note that the bundle mechanism is for any files located relative to the
installation tree including but not limited to datadir. (Peter Maydell)
* Fix "bridge" typo (Philippe Mathieu-Daudé)
v2: Rebased to the latest QEMU.
Akihiko Odaki (6):
qga: Relocate a path emitted in the help text
Remove prefixes from path configuration macros
cutils: Introduce bundle mechanism
datadir: Use bundle mechanism
ui/icons: Use bundle mechanism
net: Use bundle mechanism
.travis.yml | 2 +-
include/qemu/cutils.h | 21 ++++++++++++++-
meson.build | 37 +++++++++++++++++---------
net/tap.c | 2 +-
pc-bios/keymaps/meson.build | 2 ++
pc-bios/meson.build | 19 +++++++------
qemu-options.hx | 11 ++++----
qga/main.c | 2 +-
scripts/oss-fuzz/build.sh | 2 +-
softmmu/datadir.c | 41 +++++++++++-----------------
tests/qtest/fuzz/fuzz.c | 15 -----------
tests/vm/fedora | 2 +-
tests/vm/freebsd | 2 +-
tests/vm/netbsd | 2 +-
tests/vm/openbsd | 2 +-
ui/cocoa.m | 2 +-
ui/gtk.c | 2 +-
ui/icons/meson.build | 32 ++++++++++++++++------
ui/sdl2.c | 4 +--
util/cutils.c | 53 ++++++++++++++++++-------------------
20 files changed, 138 insertions(+), 117 deletions(-)
--
2.32.1 (Apple Git-133)
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v7 1/6] qga: Relocate a path emitted in the help text
2022-06-15 17:33 [PATCH v7 0/6] cutils: Introduce bundle mechanism Akihiko Odaki
@ 2022-06-15 17:33 ` Akihiko Odaki
2022-06-20 13:06 ` Konstantin Kostiuk
2022-06-20 13:11 ` Marc-André Lureau
2022-06-15 17:33 ` [PATCH v7 2/6] Remove prefixes from path configuration macros Akihiko Odaki
` (5 subsequent siblings)
6 siblings, 2 replies; 11+ messages in thread
From: Akihiko Odaki @ 2022-06-15 17:33 UTC (permalink / raw)
Cc: Peter Maydell, Jason Wang, qemu-devel, Programmingkid,
Philippe Mathieu-Daudé,
Gerd Hoffmann, Daniel P . Berrangé,
Paolo Bonzini, Akihiko Odaki
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
---
qga/main.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/qga/main.c b/qga/main.c
index c373fec3ee6..06e507b9979 100644
--- a/qga/main.c
+++ b/qga/main.c
@@ -270,7 +270,7 @@ QEMU_HELP_BOTTOM "\n"
, cmd, QGA_VIRTIO_PATH_DEFAULT, QGA_SERIAL_PATH_DEFAULT,
dfl_pathnames.pidfile,
#ifdef CONFIG_FSFREEZE
- QGA_FSFREEZE_HOOK_DEFAULT,
+ get_relocated_path(QGA_FSFREEZE_HOOK_DEFAULT),
#endif
dfl_pathnames.state_dir);
}
--
2.32.1 (Apple Git-133)
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v7 2/6] Remove prefixes from path configuration macros
2022-06-15 17:33 [PATCH v7 0/6] cutils: Introduce bundle mechanism Akihiko Odaki
2022-06-15 17:33 ` [PATCH v7 1/6] qga: Relocate a path emitted in the help text Akihiko Odaki
@ 2022-06-15 17:33 ` Akihiko Odaki
2022-06-15 17:33 ` [PATCH v7 3/6] cutils: Introduce bundle mechanism Akihiko Odaki
` (4 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Akihiko Odaki @ 2022-06-15 17:33 UTC (permalink / raw)
Cc: Peter Maydell, Jason Wang, qemu-devel, Programmingkid,
Philippe Mathieu-Daudé,
Gerd Hoffmann, Daniel P . Berrangé,
Paolo Bonzini, Akihiko Odaki
The path configuration macros are often supplied to
get_relocated_path(), and the function had some logics to remove the
prefixes.
With this change, the prefixes are removed from those macros and
get_relocated_path() is also simplified.
This also fixes --firmwarepath configuration option. The old
implementation naively added the prefix to the given option although
it is a list of paths. Now an absolute path in --firmwarepath will
be used as-is. A relative path in --firmwarepath will be relocated
with get_relocated_path().
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
---
include/qemu/cutils.h | 2 +-
meson.build | 23 +++++++++++------------
qemu-options.hx | 11 +++++------
softmmu/datadir.c | 9 +++++++--
util/cutils.c | 34 +++++++---------------------------
5 files changed, 31 insertions(+), 48 deletions(-)
diff --git a/include/qemu/cutils.h b/include/qemu/cutils.h
index 40e10e19a7e..57de1da5c95 100644
--- a/include/qemu/cutils.h
+++ b/include/qemu/cutils.h
@@ -207,7 +207,7 @@ const char *qemu_get_exec_dir(void);
*
* Returns a path for @dir that uses the directory of the running executable
* as the prefix. For example, if `bindir` is `/usr/bin` and @dir is
- * `/usr/share/qemu`, the function will append `../share/qemu` to the
+ * `share/qemu`, the function will append `../share/qemu` to the
* directory that contains the running executable and return the result.
* The returned string should be freed by the caller.
*/
diff --git a/meson.build b/meson.build
index 0c2e11ff071..b982bfd5d07 100644
--- a/meson.build
+++ b/meson.build
@@ -1679,18 +1679,17 @@ config_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
if iasl.found()
config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
endif
-config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
+config_host_data.set_quoted('CONFIG_BINDIR', get_option('bindir'))
config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
-config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
-config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
-config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
-config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('prefix') / get_option('qemu_firmwarepath'))
-config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
-config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
-config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
-config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
-config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
-config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
+config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', qemu_confdir)
+config_host_data.set_quoted('CONFIG_QEMU_DATADIR', qemu_datadir)
+config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
+config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('libexecdir'))
+config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', qemu_icondir)
+config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('localedir'))
+config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('localstatedir'))
+config_host_data.set_quoted('CONFIG_QEMU_MODDIR', qemu_moddir)
+config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('sysconfdir'))
if config_host.has_key('CONFIG_MODULES')
config_host_data.set('CONFIG_STAMP', run_command(
@@ -3622,7 +3621,7 @@ endif
summary_info = {}
summary_info += {'Install prefix': get_option('prefix')}
summary_info += {'BIOS directory': qemu_datadir}
-summary_info += {'firmware path': get_option('prefix') / get_option('qemu_firmwarepath')}
+summary_info += {'firmware path': get_option('qemu_firmwarepath')}
summary_info += {'binary directory': get_option('prefix') / get_option('bindir')}
summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
summary_info += {'module directory': qemu_moddir}
diff --git a/qemu-options.hx b/qemu-options.hx
index 377d22fbd82..f0ae8f44ff2 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -2661,12 +2661,11 @@ DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
" [,poll-us=n]\n"
" configure a host TAP network backend with ID 'str'\n"
" connected to a bridge (default=" DEFAULT_BRIDGE_INTERFACE ")\n"
- " use network scripts 'file' (default=" DEFAULT_NETWORK_SCRIPT ")\n"
- " to configure it and 'dfile' (default=" DEFAULT_NETWORK_DOWN_SCRIPT ")\n"
- " to deconfigure it\n"
+ " use custom network script 'file' to configure it (optional)\n"
+ " use custom network script 'dfile' to deconfigure it (optional)\n"
" use '[down]script=no' to disable script execution\n"
- " use network helper 'helper' (default=" DEFAULT_BRIDGE_HELPER ") to\n"
- " configure it\n"
+ " use custom network helper 'helper' to\n"
+ " configure it (optional)\n"
" use 'fd=h' to connect to an already opened TAP interface\n"
" use 'fds=x:y:...:z' to connect to already opened multiqueue capable TAP interfaces\n"
" use 'sndbuf=nbytes' to limit the size of the send buffer (the\n"
@@ -2684,7 +2683,7 @@ DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
"-netdev bridge,id=str[,br=bridge][,helper=helper]\n"
" configure a host TAP network backend with ID 'str' that is\n"
" connected to a bridge (default=" DEFAULT_BRIDGE_INTERFACE ")\n"
- " using the program 'helper (default=" DEFAULT_BRIDGE_HELPER ")\n"
+ " using the custom program 'helper' (optional)\n"
#endif
#ifdef __linux__
"-netdev l2tpv3,id=str,src=srcaddr,dst=dstaddr[,srcport=srcport][,dstport=dstport]\n"
diff --git a/softmmu/datadir.c b/softmmu/datadir.c
index 160cac999a6..3da42cb8ed7 100644
--- a/softmmu/datadir.c
+++ b/softmmu/datadir.c
@@ -111,9 +111,14 @@ void qemu_add_default_firmwarepath(void)
/* add configured firmware directories */
dirs = g_strsplit(CONFIG_QEMU_FIRMWAREPATH, G_SEARCHPATH_SEPARATOR_S, 0);
for (i = 0; dirs[i] != NULL; i++) {
- qemu_add_data_dir(get_relocated_path(dirs[i]));
+ if (g_path_is_absolute(dirs[i])) {
+ qemu_add_data_dir(dirs[i]);
+ } else {
+ qemu_add_data_dir(get_relocated_path(dirs[i]));
+ g_free(dirs[i]);
+ }
}
- g_strfreev(dirs);
+ g_free(dirs);
/* try to find datadir relative to the executable path */
qemu_add_data_dir(find_datadir());
diff --git a/util/cutils.c b/util/cutils.c
index a58bcfd80e7..983db97b4df 100644
--- a/util/cutils.c
+++ b/util/cutils.c
@@ -917,13 +917,6 @@ int qemu_pstrcmp0(const char **str1, const char **str2)
return g_strcmp0(*str1, *str2);
}
-static inline bool starts_with_prefix(const char *dir)
-{
- size_t prefix_len = strlen(CONFIG_PREFIX);
- return !memcmp(dir, CONFIG_PREFIX, prefix_len) &&
- (!dir[prefix_len] || G_IS_DIR_SEPARATOR(dir[prefix_len]));
-}
-
/* Return the next path component in dir, and store its length in *p_len. */
static inline const char *next_component(const char *dir, int *p_len)
{
@@ -967,7 +960,7 @@ void qemu_init_exec_dir(const char *argv0)
if (access(buf, R_OK) == 0) {
exec_dir = g_strdup(buf);
} else {
- exec_dir = CONFIG_BINDIR;
+ exec_dir = CONFIG_PREFIX G_DIR_SEPARATOR_S CONFIG_BINDIR;
}
#else
char *p = NULL;
@@ -1038,7 +1031,7 @@ void qemu_init_exec_dir(const char *argv0)
if (p) {
exec_dir = g_path_get_dirname(p);
} else {
- exec_dir = CONFIG_BINDIR;
+ exec_dir = CONFIG_PREFIX G_DIR_SEPARATOR_S CONFIG_BINDIR;
}
#endif
}
@@ -1050,39 +1043,26 @@ const char *qemu_get_exec_dir(void)
char *get_relocated_path(const char *dir)
{
- size_t prefix_len = strlen(CONFIG_PREFIX);
const char *bindir = CONFIG_BINDIR;
const char *exec_dir = qemu_get_exec_dir();
GString *result;
- int len_dir, len_bindir;
+ int len_bindir;
/* Fail if qemu_init_exec_dir was not called. */
assert(exec_dir[0]);
- if (!starts_with_prefix(dir) || !starts_with_prefix(bindir)) {
- return g_strdup(dir);
- }
result = g_string_new(exec_dir);
- /* Advance over common components. */
- len_dir = len_bindir = prefix_len;
- do {
- dir += len_dir;
- bindir += len_bindir;
- dir = next_component(dir, &len_dir);
- bindir = next_component(bindir, &len_bindir);
- } while (len_dir && len_dir == len_bindir && !memcmp(dir, bindir, len_dir));
-
/* Ascend from bindir to the common prefix with dir. */
+ len_bindir = 0;
while (len_bindir) {
bindir += len_bindir;
g_string_append(result, "/..");
bindir = next_component(bindir, &len_bindir);
}
- if (*dir) {
- assert(G_IS_DIR_SEPARATOR(dir[-1]));
- g_string_append(result, dir - 1);
- }
+ g_string_append_c(result, G_DIR_SEPARATOR);
+ g_string_append(result, dir);
+
return g_string_free(result, false);
}
--
2.32.1 (Apple Git-133)
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v7 3/6] cutils: Introduce bundle mechanism
2022-06-15 17:33 [PATCH v7 0/6] cutils: Introduce bundle mechanism Akihiko Odaki
2022-06-15 17:33 ` [PATCH v7 1/6] qga: Relocate a path emitted in the help text Akihiko Odaki
2022-06-15 17:33 ` [PATCH v7 2/6] Remove prefixes from path configuration macros Akihiko Odaki
@ 2022-06-15 17:33 ` Akihiko Odaki
2022-06-15 17:33 ` [PATCH v7 4/6] datadir: Use " Akihiko Odaki
` (3 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Akihiko Odaki @ 2022-06-15 17:33 UTC (permalink / raw)
Cc: Peter Maydell, Jason Wang, qemu-devel, Programmingkid,
Philippe Mathieu-Daudé,
Gerd Hoffmann, Daniel P . Berrangé,
Paolo Bonzini, Akihiko Odaki
Developers often run QEMU without installing. The bundle mechanism
allows to look up files which should be present in installation even in
such a situation.
It is a general mechanism and can find any files located relative
to the installation tree. The build tree must have a new directory,
qemu-bundle, to represent what files the installation tree would
have for reference by the executables.
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
---
include/qemu/cutils.h | 19 +++++++++++++++++++
meson.build | 12 ++++++++++++
util/cutils.c | 23 +++++++++++++++++++++++
3 files changed, 54 insertions(+)
diff --git a/include/qemu/cutils.h b/include/qemu/cutils.h
index 57de1da5c95..ca5bddb9e1c 100644
--- a/include/qemu/cutils.h
+++ b/include/qemu/cutils.h
@@ -213,6 +213,25 @@ const char *qemu_get_exec_dir(void);
*/
char *get_relocated_path(const char *dir);
+/**
+ * find_bundle:
+ * @path: Relative path
+ *
+ * Returns a path for the specified directory or file bundled in QEMU. It uses
+ * the directory of the running executable as the prefix first. See
+ * get_relocated_path() for the details. The next candidate is "qemu-bundle"
+ * directory in the directory of the running executable. "qemu-bundle"
+ * directory is typically present in the build tree.
+ *
+ * The returned string should be freed by the caller.
+ *
+ * Returns: a path that can access the bundle, or NULL if no matching bundle
+ * exists.
+ */
+char *find_bundle(const char *path);
+
+void list_bundle_candidates(const char *path);
+
static inline const char *yes_no(bool b)
{
return b ? "yes" : "no";
diff --git a/meson.build b/meson.build
index b982bfd5d07..8961df266d1 100644
--- a/meson.build
+++ b/meson.build
@@ -32,6 +32,7 @@ if get_option('qemu_suffix').startswith('/')
error('qemu_suffix cannot start with a /')
endif
+qemu_bundledir = meson.project_build_root() / 'qemu-bundle'
qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
@@ -2843,6 +2844,8 @@ target_arch = {}
target_softmmu_arch = {}
target_user_arch = {}
+bundles = {}
+
###############
# Trace files #
###############
@@ -3613,6 +3616,15 @@ if host_machine.system() == 'windows'
alias_target('installer', nsis)
endif
+###########
+# Bundles #
+###########
+
+foreach dst, src: bundles
+ run_command('mkdir', '-p', qemu_bundledir / fs.parent(dst), check: true)
+ run_command('ln', '-sf', src, qemu_bundledir / dst, check: true)
+endforeach
+
#########################
# Configuration summary #
#########################
diff --git a/util/cutils.c b/util/cutils.c
index 983db97b4df..64cb1616b9c 100644
--- a/util/cutils.c
+++ b/util/cutils.c
@@ -1066,3 +1066,26 @@ char *get_relocated_path(const char *dir)
return g_string_free(result, false);
}
+
+char *find_bundle(const char *path)
+{
+ char *bundle = g_strdup_printf("%s/qemu-bundle/%s", qemu_get_exec_dir(), path);
+ if (access(bundle, R_OK) == 0) {
+ return bundle;
+ }
+
+ g_free(bundle);
+
+ return get_relocated_path(path);
+}
+
+void list_bundle_candidates(const char *path)
+{
+ const char *dir = qemu_get_exec_dir();
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(bundle_formats); i++) {
+ printf(bundle_formats[i], dir, path);
+ putc('\n', stdout);
+ }
+}
--
2.32.1 (Apple Git-133)
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v7 4/6] datadir: Use bundle mechanism
2022-06-15 17:33 [PATCH v7 0/6] cutils: Introduce bundle mechanism Akihiko Odaki
` (2 preceding siblings ...)
2022-06-15 17:33 ` [PATCH v7 3/6] cutils: Introduce bundle mechanism Akihiko Odaki
@ 2022-06-15 17:33 ` Akihiko Odaki
2022-06-15 17:33 ` [PATCH v7 5/6] ui/icons: " Akihiko Odaki
` (2 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Akihiko Odaki @ 2022-06-15 17:33 UTC (permalink / raw)
Cc: Peter Maydell, Jason Wang, qemu-devel, Programmingkid,
Philippe Mathieu-Daudé,
Gerd Hoffmann, Daniel P . Berrangé,
Paolo Bonzini, Akihiko Odaki
softmmu/datadir.c had its own implementation to find files in the
build tree, but now bundle mechanism provides the unified
implementation which works for datadir and the other files.
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
---
.travis.yml | 2 +-
pc-bios/keymaps/meson.build | 2 ++
pc-bios/meson.build | 19 +++++++++----------
scripts/oss-fuzz/build.sh | 2 +-
softmmu/datadir.c | 32 ++++++++------------------------
tests/qtest/fuzz/fuzz.c | 15 ---------------
tests/vm/fedora | 2 +-
tests/vm/freebsd | 2 +-
tests/vm/netbsd | 2 +-
tests/vm/openbsd | 2 +-
util/cutils.c | 10 +++-------
11 files changed, 28 insertions(+), 62 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index 9afc4a54b8f..9fee2167b95 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -223,7 +223,7 @@ jobs:
- BUILD_RC=0 && make -j${JOBS} || BUILD_RC=$?
- |
if [ "$BUILD_RC" -eq 0 ] ; then
- mv pc-bios/s390-ccw/*.img pc-bios/ ;
+ mv pc-bios/s390-ccw/*.img qemu-bundle/share/qemu ;
${TEST_CMD} ;
else
$(exit $BUILD_RC);
diff --git a/pc-bios/keymaps/meson.build b/pc-bios/keymaps/meson.build
index 44247a12b54..dd103092290 100644
--- a/pc-bios/keymaps/meson.build
+++ b/pc-bios/keymaps/meson.build
@@ -67,3 +67,5 @@ if native_qemu_keymap.found()
endif
install_data(['sl', 'sv'], install_dir: qemu_datadir / 'keymaps')
+
+bundles += { qemu_datadir / 'keymaps': '../../../pc-bios/keymaps' }
diff --git a/pc-bios/meson.build b/pc-bios/meson.build
index 41ba1c0ec7b..0d2119836bd 100644
--- a/pc-bios/meson.build
+++ b/pc-bios/meson.build
@@ -20,6 +20,8 @@ if unpack_edk2_blobs
install: get_option('install_blobs'),
install_dir: qemu_datadir,
command: [ bzip2, '-dc', '@INPUT0@' ])
+
+ bundles += { qemu_datadir / f: '../../../pc-bios' / f }
endforeach
endif
@@ -85,16 +87,13 @@ blobs = [
'vof-nvram.bin',
]
-ln_s = [find_program('ln', required: true), '-sf']
-foreach f : blobs
- roms += custom_target(f,
- build_by_default: have_system,
- output: f,
- input: files('meson.build'), # dummy input
- install: get_option('install_blobs'),
- install_dir: qemu_datadir,
- command: [ ln_s, meson.project_source_root() / 'pc-bios' / f, '@OUTPUT@' ])
-endforeach
+if get_option('install_blobs')
+ install_data(blobs, install_dir: qemu_datadir)
+
+ foreach f : blobs
+ bundles += { qemu_datadir / f: meson.current_source_dir() / f }
+ endforeach
+endif
subdir('descriptors')
subdir('keymaps')
diff --git a/scripts/oss-fuzz/build.sh b/scripts/oss-fuzz/build.sh
index 98b56e05210..cbf8b3080e9 100755
--- a/scripts/oss-fuzz/build.sh
+++ b/scripts/oss-fuzz/build.sh
@@ -88,7 +88,7 @@ if [ "$GITLAB_CI" != "true" ]; then
fi
# Copy over the datadir
-cp -r ../pc-bios/ "$DEST_DIR/pc-bios"
+cp -r ../pc-bios/ "$DEST_DIR/qemu-bundle/share/qemu"
targets=$(./qemu-fuzz-i386 | awk '$1 ~ /\*/ {print $2}')
base_copy="$DEST_DIR/qemu-fuzz-i386-target-$(echo "$targets" | head -n 1)"
diff --git a/softmmu/datadir.c b/softmmu/datadir.c
index 3da42cb8ed7..b52c8dacd64 100644
--- a/softmmu/datadir.c
+++ b/softmmu/datadir.c
@@ -35,6 +35,7 @@ char *qemu_find_file(int type, const char *name)
int i;
const char *subdir;
char *buf;
+ char *bundle;
/* Try the name as a straight path first */
if (access(name, R_OK) == 0) {
@@ -61,7 +62,12 @@ char *qemu_find_file(int type, const char *name)
}
g_free(buf);
}
- return NULL;
+
+ bundle = g_strdup_printf("%s/%s%s", CONFIG_QEMU_DATADIR, subdir, name);
+ buf = find_bundle(bundle);
+ g_free(bundle);
+ trace_load_file(name, buf);
+ return buf;
}
void qemu_add_data_dir(char *path)
@@ -83,26 +89,6 @@ void qemu_add_data_dir(char *path)
data_dir[data_dir_idx++] = path;
}
-/*
- * Find a likely location for support files using the location of the binary.
- * When running from the build tree this will be "$bindir/pc-bios".
- * Otherwise, this is CONFIG_QEMU_DATADIR (possibly relocated).
- *
- * The caller must use g_free() to free the returned data when it is
- * no longer required.
- */
-static char *find_datadir(void)
-{
- g_autofree char *dir = NULL;
-
- dir = g_build_filename(qemu_get_exec_dir(), "pc-bios", NULL);
- if (g_file_test(dir, G_FILE_TEST_IS_DIR)) {
- return g_steal_pointer(&dir);
- }
-
- return get_relocated_path(CONFIG_QEMU_DATADIR);
-}
-
void qemu_add_default_firmwarepath(void)
{
char **dirs;
@@ -119,9 +105,6 @@ void qemu_add_default_firmwarepath(void)
}
}
g_free(dirs);
-
- /* try to find datadir relative to the executable path */
- qemu_add_data_dir(find_datadir());
}
void qemu_list_data_dirs(void)
@@ -130,4 +113,5 @@ void qemu_list_data_dirs(void)
for (i = 0; i < data_dir_idx; i++) {
printf("%s\n", data_dir[i]);
}
+ list_bundle_candidates(CONFIG_QEMU_DATADIR);
}
diff --git a/tests/qtest/fuzz/fuzz.c b/tests/qtest/fuzz/fuzz.c
index 0ad4ba9e94d..2062b40d82b 100644
--- a/tests/qtest/fuzz/fuzz.c
+++ b/tests/qtest/fuzz/fuzz.c
@@ -174,21 +174,6 @@ int LLVMFuzzerInitialize(int *argc, char ***argv, char ***envp)
target_name = strstr(**argv, "-target-");
if (target_name) { /* The binary name specifies the target */
target_name += strlen("-target-");
- /*
- * With oss-fuzz, the executable is kept in the root of a directory (we
- * cannot assume the path). All data (including bios binaries) must be
- * in the same dir, or a subdir. Thus, we cannot place the pc-bios so
- * that it would be in exec_dir/../pc-bios.
- * As a workaround, oss-fuzz allows us to use argv[0] to get the
- * location of the executable. Using this we add exec_dir/pc-bios to
- * the datadirs.
- */
- bindir = qemu_get_exec_dir();
- datadir = g_build_filename(bindir, "pc-bios", NULL);
- if (g_file_test(datadir, G_FILE_TEST_IS_DIR)) {
- qemu_add_data_dir(datadir);
- } else {
- g_free(datadir);
}
} else if (*argc > 1) { /* The target is specified as an argument */
target_name = (*argv)[1];
diff --git a/tests/vm/fedora b/tests/vm/fedora
index 92b78d6e2c9..4ccd31bba61 100755
--- a/tests/vm/fedora
+++ b/tests/vm/fedora
@@ -79,7 +79,7 @@ class FedoraVM(basevm.BaseVM):
self.exec_qemu_img("create", "-f", "qcow2", img_tmp, self.size)
self.print_step("Booting installer")
self.boot(img_tmp, extra_args = [
- "-bios", "pc-bios/bios-256k.bin",
+ "-bios", "qemu-bundle/share/qemu/bios-256k.bin",
"-machine", "graphics=off",
"-device", "VGA",
"-cdrom", iso
diff --git a/tests/vm/freebsd b/tests/vm/freebsd
index 805db759d67..2095d8c5204 100755
--- a/tests/vm/freebsd
+++ b/tests/vm/freebsd
@@ -95,7 +95,7 @@ class FreeBSDVM(basevm.BaseVM):
self.print_step("Booting installer")
self.boot(img_tmp, extra_args = [
- "-bios", "pc-bios/bios-256k.bin",
+ "-bios", "qemu-bundle/share/qemu/bios-256k.bin",
"-machine", "graphics=off",
"-device", "VGA",
"-cdrom", iso
diff --git a/tests/vm/netbsd b/tests/vm/netbsd
index 45aa9a7fda7..d59cfedb83e 100755
--- a/tests/vm/netbsd
+++ b/tests/vm/netbsd
@@ -86,7 +86,7 @@ class NetBSDVM(basevm.BaseVM):
self.print_step("Booting installer")
self.boot(img_tmp, extra_args = [
- "-bios", "pc-bios/bios-256k.bin",
+ "-bios", "qemu-bundle/share/qemu/bios-256k.bin",
"-machine", "graphics=off",
"-cdrom", iso
])
diff --git a/tests/vm/openbsd b/tests/vm/openbsd
index 13c82542140..036907c6243 100755
--- a/tests/vm/openbsd
+++ b/tests/vm/openbsd
@@ -82,7 +82,7 @@ class OpenBSDVM(basevm.BaseVM):
self.print_step("Booting installer")
self.boot(img_tmp, extra_args = [
- "-bios", "pc-bios/bios-256k.bin",
+ "-bios", "qemu-bundle/share/qemu/bios-256k.bin",
"-machine", "graphics=off",
"-device", "VGA",
"-cdrom", iso
diff --git a/util/cutils.c b/util/cutils.c
index 64cb1616b9c..c3aea6c6f68 100644
--- a/util/cutils.c
+++ b/util/cutils.c
@@ -1081,11 +1081,7 @@ char *find_bundle(const char *path)
void list_bundle_candidates(const char *path)
{
- const char *dir = qemu_get_exec_dir();
- int i;
-
- for (i = 0; i < ARRAY_SIZE(bundle_formats); i++) {
- printf(bundle_formats[i], dir, path);
- putc('\n', stdout);
- }
+ char *relocated = get_relocated_path(path);
+ printf("%s/qemu-bundle/%s\n%s\n", qemu_get_exec_dir(), path, relocated);
+ g_free(relocated);
}
--
2.32.1 (Apple Git-133)
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v7 5/6] ui/icons: Use bundle mechanism
2022-06-15 17:33 [PATCH v7 0/6] cutils: Introduce bundle mechanism Akihiko Odaki
` (3 preceding siblings ...)
2022-06-15 17:33 ` [PATCH v7 4/6] datadir: Use " Akihiko Odaki
@ 2022-06-15 17:33 ` Akihiko Odaki
2022-06-15 17:33 ` [PATCH v7 6/6] net: " Akihiko Odaki
2022-06-15 19:28 ` [PATCH v7 0/6] cutils: Introduce " Paolo Bonzini
6 siblings, 0 replies; 11+ messages in thread
From: Akihiko Odaki @ 2022-06-15 17:33 UTC (permalink / raw)
Cc: Peter Maydell, Jason Wang, qemu-devel, Programmingkid,
Philippe Mathieu-Daudé,
Gerd Hoffmann, Daniel P . Berrangé,
Paolo Bonzini, Akihiko Odaki
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
---
ui/cocoa.m | 2 +-
ui/gtk.c | 2 +-
ui/icons/meson.build | 32 ++++++++++++++++++++++++--------
ui/sdl2.c | 4 ++--
4 files changed, 28 insertions(+), 12 deletions(-)
diff --git a/ui/cocoa.m b/ui/cocoa.m
index 84c84e98fc5..25584cc78ce 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -1562,7 +1562,7 @@ - (BOOL)verifyQuit
- (IBAction) do_about_menu_item: (id) sender
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- char *icon_path_c = get_relocated_path(CONFIG_QEMU_ICONDIR "/hicolor/512x512/apps/qemu.png");
+ char *icon_path_c = find_bundle(CONFIG_QEMU_ICONDIR "/hicolor/512x512/apps/qemu.png");
NSString *icon_path = [NSString stringWithUTF8String:icon_path_c];
g_free(icon_path_c);
NSImage *icon = [[NSImage alloc] initWithContentsOfFile:icon_path];
diff --git a/ui/gtk.c b/ui/gtk.c
index 2a791dd2aa0..27d5a3407cf 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -2321,7 +2321,7 @@ static void gtk_display_init(DisplayState *ds, DisplayOptions *opts)
s->opts = opts;
theme = gtk_icon_theme_get_default();
- dir = get_relocated_path(CONFIG_QEMU_ICONDIR);
+ dir = find_bundle(CONFIG_QEMU_ICONDIR);
gtk_icon_theme_prepend_search_path(theme, dir);
g_free(dir);
g_set_prgname("qemu");
diff --git a/ui/icons/meson.build b/ui/icons/meson.build
index 12c52080ebd..1d99aff10ed 100644
--- a/ui/icons/meson.build
+++ b/ui/icons/meson.build
@@ -1,13 +1,29 @@
+icons = [
+ {
+ 'source': 'qemu_32x32.bmp',
+ 'install': 'hicolor' / '32x32' / 'apps' / 'qemu.bmp',
+ },
+ {
+ 'source': 'qemu.svg',
+ 'install': 'hicolor' / 'scalable' / 'apps' / 'qemu.svg',
+ },
+]
+
foreach s: [16, 24, 32, 48, 64, 128, 256, 512]
s = '@0@x@0@'.format(s.to_string())
- install_data('qemu_@0@.png'.format(s),
- rename: 'qemu.png',
- install_dir: qemu_icondir / 'hicolor' / s / 'apps')
+ icons += {
+ 'source': 'qemu_@0@.png'.format(s),
+ 'install': 'hicolor' / s / 'apps' / 'qemu.png',
+ }
endforeach
-install_data('qemu_32x32.bmp',
- rename: 'qemu.bmp',
- install_dir: qemu_icondir / 'hicolor' / '32x32' / 'apps')
+foreach icon: icons
+ source = icon.get('source')
+ install = icon.get('install')
+
+ install_data(source,
+ rename: fs.name(install),
+ install_dir: qemu_icondir / fs.parent(install))
-install_data('qemu.svg',
- install_dir: qemu_icondir / 'hicolor' / 'scalable' / 'apps')
+ bundles += { qemu_bundledir / qemu_icondir / install: meson.current_source_dir() / source }
+endforeach
diff --git a/ui/sdl2.c b/ui/sdl2.c
index 8cb77416af2..916815cc8a2 100644
--- a/ui/sdl2.c
+++ b/ui/sdl2.c
@@ -910,11 +910,11 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
}
#ifdef CONFIG_SDL_IMAGE
- dir = get_relocated_path(CONFIG_QEMU_ICONDIR "/hicolor/128x128/apps/qemu.png");
+ dir = find_bundle(CONFIG_QEMU_ICONDIR "/hicolor/128x128/apps/qemu.png");
icon = IMG_Load(dir);
#else
/* Load a 32x32x4 image. White pixels are transparent. */
- dir = get_relocated_path(CONFIG_QEMU_ICONDIR "/hicolor/32x32/apps/qemu.bmp");
+ dir = find_bundle(CONFIG_QEMU_ICONDIR "/hicolor/32x32/apps/qemu.bmp");
icon = SDL_LoadBMP(dir);
if (icon) {
uint32_t colorkey = SDL_MapRGB(icon->format, 255, 255, 255);
--
2.32.1 (Apple Git-133)
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v7 6/6] net: Use bundle mechanism
2022-06-15 17:33 [PATCH v7 0/6] cutils: Introduce bundle mechanism Akihiko Odaki
` (4 preceding siblings ...)
2022-06-15 17:33 ` [PATCH v7 5/6] ui/icons: " Akihiko Odaki
@ 2022-06-15 17:33 ` Akihiko Odaki
2022-06-15 19:28 ` [PATCH v7 0/6] cutils: Introduce " Paolo Bonzini
6 siblings, 0 replies; 11+ messages in thread
From: Akihiko Odaki @ 2022-06-15 17:33 UTC (permalink / raw)
Cc: Peter Maydell, Jason Wang, qemu-devel, Programmingkid,
Philippe Mathieu-Daudé,
Gerd Hoffmann, Daniel P . Berrangé,
Paolo Bonzini, Akihiko Odaki
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
---
meson.build | 2 ++
net/tap.c | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/meson.build b/meson.build
index 8961df266d1..5e0e08801c9 100644
--- a/meson.build
+++ b/meson.build
@@ -3574,6 +3574,8 @@ if have_tools
dependencies: [authz, crypto, io, qom, qemuutil,
libcap_ng, mpathpersist],
install: true)
+
+ bundles += { get_option('libexecdir') / 'qemu-bridge-helper': '../../qemu-bridge-helper' }
endif
if have_ivshmem
diff --git a/net/tap.c b/net/tap.c
index b3ddfd4a74b..5beba85fb22 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -507,7 +507,7 @@ static int net_bridge_run_helper(const char *helper, const char *bridge,
sigprocmask(SIG_BLOCK, &mask, &oldmask);
if (!helper) {
- helper = default_helper = get_relocated_path(DEFAULT_BRIDGE_HELPER);
+ helper = default_helper = find_bundle(DEFAULT_BRIDGE_HELPER);
}
if (socketpair(PF_UNIX, SOCK_STREAM, 0, sv) == -1) {
--
2.32.1 (Apple Git-133)
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v7 0/6] cutils: Introduce bundle mechanism
2022-06-15 17:33 [PATCH v7 0/6] cutils: Introduce bundle mechanism Akihiko Odaki
` (5 preceding siblings ...)
2022-06-15 17:33 ` [PATCH v7 6/6] net: " Akihiko Odaki
@ 2022-06-15 19:28 ` Paolo Bonzini
6 siblings, 0 replies; 11+ messages in thread
From: Paolo Bonzini @ 2022-06-15 19:28 UTC (permalink / raw)
To: Akihiko Odaki
Cc: Peter Maydell, Jason Wang, qemu-devel, Programmingkid,
Philippe Mathieu-Daudé,
Gerd Hoffmann, Daniel P . Berrangé
On 6/15/22 19:33, Akihiko Odaki wrote:
> Developers often run QEMU without installing. The bundle mechanism
> allows to look up files which should be present in installation even in
> such a situation.
>
> It is a general mechanism and can find any files located relative
> to the installation tree. The build tree must have a new directory,
> qemu-bundle, to represent what files the installation tree would
> have for reference by the executables.
>
> v7: Properly fix --firmwarepath (Daniel P. Berrangé)
Please give people a little time to review. I left more comments on v6.
Paolo
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v7 1/6] qga: Relocate a path emitted in the help text
2022-06-15 17:33 ` [PATCH v7 1/6] qga: Relocate a path emitted in the help text Akihiko Odaki
@ 2022-06-20 13:06 ` Konstantin Kostiuk
2022-06-20 13:11 ` Marc-André Lureau
1 sibling, 0 replies; 11+ messages in thread
From: Konstantin Kostiuk @ 2022-06-20 13:06 UTC (permalink / raw)
To: Akihiko Odaki
Cc: Peter Maydell, Jason Wang, QEMU, Programmingkid,
Philippe Mathieu-Daudé,
Gerd Hoffmann, Daniel P . Berrangé,
Paolo Bonzini
[-- Attachment #1: Type: text/plain, Size: 724 bytes --]
Reviewed-by: Konstantin Kostiuk <kkostiuk@redhat.com>
On Wed, Jun 15, 2022 at 8:43 PM Akihiko Odaki <akihiko.odaki@gmail.com>
wrote:
> Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
> ---
> qga/main.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/qga/main.c b/qga/main.c
> index c373fec3ee6..06e507b9979 100644
> --- a/qga/main.c
> +++ b/qga/main.c
> @@ -270,7 +270,7 @@ QEMU_HELP_BOTTOM "\n"
> , cmd, QGA_VIRTIO_PATH_DEFAULT, QGA_SERIAL_PATH_DEFAULT,
> dfl_pathnames.pidfile,
> #ifdef CONFIG_FSFREEZE
> - QGA_FSFREEZE_HOOK_DEFAULT,
> + get_relocated_path(QGA_FSFREEZE_HOOK_DEFAULT),
> #endif
> dfl_pathnames.state_dir);
> }
> --
> 2.32.1 (Apple Git-133)
>
>
>
[-- Attachment #2: Type: text/html, Size: 1429 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v7 1/6] qga: Relocate a path emitted in the help text
2022-06-15 17:33 ` [PATCH v7 1/6] qga: Relocate a path emitted in the help text Akihiko Odaki
2022-06-20 13:06 ` Konstantin Kostiuk
@ 2022-06-20 13:11 ` Marc-André Lureau
2022-06-20 13:12 ` Marc-André Lureau
1 sibling, 1 reply; 11+ messages in thread
From: Marc-André Lureau @ 2022-06-20 13:11 UTC (permalink / raw)
To: Akihiko Odaki
Cc: Peter Maydell, Jason Wang, QEMU, Programmingkid,
Philippe Mathieu-Daudé,
Gerd Hoffmann, Daniel P . Berrangé,
Paolo Bonzini
[-- Attachment #1: Type: text/plain, Size: 793 bytes --]
On Wed, Jun 15, 2022 at 9:43 PM Akihiko Odaki <akihiko.odaki@gmail.com>
wrote:
> Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> qga/main.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/qga/main.c b/qga/main.c
> index c373fec3ee6..06e507b9979 100644
> --- a/qga/main.c
> +++ b/qga/main.c
> @@ -270,7 +270,7 @@ QEMU_HELP_BOTTOM "\n"
> , cmd, QGA_VIRTIO_PATH_DEFAULT, QGA_SERIAL_PATH_DEFAULT,
> dfl_pathnames.pidfile,
> #ifdef CONFIG_FSFREEZE
> - QGA_FSFREEZE_HOOK_DEFAULT,
> + get_relocated_path(QGA_FSFREEZE_HOOK_DEFAULT),
> #endif
> dfl_pathnames.state_dir);
> }
> --
> 2.32.1 (Apple Git-133)
>
>
>
--
Marc-André Lureau
[-- Attachment #2: Type: text/html, Size: 1528 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v7 1/6] qga: Relocate a path emitted in the help text
2022-06-20 13:11 ` Marc-André Lureau
@ 2022-06-20 13:12 ` Marc-André Lureau
0 siblings, 0 replies; 11+ messages in thread
From: Marc-André Lureau @ 2022-06-20 13:12 UTC (permalink / raw)
To: Akihiko Odaki
Cc: Peter Maydell, Jason Wang, QEMU, Programmingkid,
Philippe Mathieu-Daudé,
Gerd Hoffmann, Daniel P . Berrangé,
Paolo Bonzini
[-- Attachment #1: Type: text/plain, Size: 1051 bytes --]
Hi
On Mon, Jun 20, 2022 at 5:11 PM Marc-André Lureau <
marcandre.lureau@gmail.com> wrote:
>
>
> On Wed, Jun 15, 2022 at 9:43 PM Akihiko Odaki <akihiko.odaki@gmail.com>
> wrote:
>
>> Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
>>
>
> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>
>
Oops, could you avoid leaking the result? g_autofree makes that easy.
thanks
> ---
>> qga/main.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/qga/main.c b/qga/main.c
>> index c373fec3ee6..06e507b9979 100644
>> --- a/qga/main.c
>> +++ b/qga/main.c
>> @@ -270,7 +270,7 @@ QEMU_HELP_BOTTOM "\n"
>> , cmd, QGA_VIRTIO_PATH_DEFAULT, QGA_SERIAL_PATH_DEFAULT,
>> dfl_pathnames.pidfile,
>> #ifdef CONFIG_FSFREEZE
>> - QGA_FSFREEZE_HOOK_DEFAULT,
>> + get_relocated_path(QGA_FSFREEZE_HOOK_DEFAULT),
>> #endif
>> dfl_pathnames.state_dir);
>> }
>> --
>> 2.32.1 (Apple Git-133)
>>
>>
>>
>
> --
> Marc-André Lureau
>
--
Marc-André Lureau
[-- Attachment #2: Type: text/html, Size: 2363 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2022-06-20 13:18 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-15 17:33 [PATCH v7 0/6] cutils: Introduce bundle mechanism Akihiko Odaki
2022-06-15 17:33 ` [PATCH v7 1/6] qga: Relocate a path emitted in the help text Akihiko Odaki
2022-06-20 13:06 ` Konstantin Kostiuk
2022-06-20 13:11 ` Marc-André Lureau
2022-06-20 13:12 ` Marc-André Lureau
2022-06-15 17:33 ` [PATCH v7 2/6] Remove prefixes from path configuration macros Akihiko Odaki
2022-06-15 17:33 ` [PATCH v7 3/6] cutils: Introduce bundle mechanism Akihiko Odaki
2022-06-15 17:33 ` [PATCH v7 4/6] datadir: Use " Akihiko Odaki
2022-06-15 17:33 ` [PATCH v7 5/6] ui/icons: " Akihiko Odaki
2022-06-15 17:33 ` [PATCH v7 6/6] net: " Akihiko Odaki
2022-06-15 19:28 ` [PATCH v7 0/6] cutils: Introduce " Paolo Bonzini
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.