* [PULL 01/11] configure: Fix error message when C compiler is not working
2024-05-14 12:51 [PULL 00/11] gitlab CI fix and glib update Thomas Huth
@ 2024-05-14 12:51 ` Thomas Huth
2024-05-14 12:51 ` [PULL 02/11] dockerfiles: add 'MAKE' env variable to remaining containers Thomas Huth
` (11 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Thomas Huth @ 2024-05-14 12:51 UTC (permalink / raw)
To: qemu-devel, Richard Henderson
If you try to run the configure script on a system without a working
C compiler, you get a very misleading error message:
ERROR: Unrecognized host OS (uname -s reports 'Linux')
Some people already opened bug tickets because of this problem:
https://gitlab.com/qemu-project/qemu/-/issues/2057
https://gitlab.com/qemu-project/qemu/-/issues/2288
We should rather tell the user that we were not able to use the C
compiler instead, otherwise they will have a hard time to figure
out what was going wrong.
While we're at it, let's also suppress the "unrecognized host CPU"
message in this case since it is rather misleading than helpful.
Fixes: 264b803721 ("configure: remove compiler sanity check")
Message-ID: <20240513114010.51608-1-thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
configure | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/configure b/configure
index 330664786d..38ee257701 100755
--- a/configure
+++ b/configure
@@ -411,7 +411,9 @@ else
# Using uname is really broken, but it is just a fallback for architectures
# that are going to use TCI anyway
cpu=$(uname -m)
- echo "WARNING: unrecognized host CPU, proceeding with 'uname -m' output '$cpu'"
+ if test "$host_os" != "bogus"; then
+ echo "WARNING: unrecognized host CPU, proceeding with 'uname -m' output '$cpu'"
+ fi
fi
# Normalise host CPU name to the values used by Meson cross files and in source
@@ -894,6 +896,13 @@ EOF
exit 0
fi
+# Now that we are sure that the user did not only want to print the --help
+# information, we should double-check that the C compiler really works:
+write_c_skeleton
+if ! compile_object ; then
+ error_exit "C compiler \"$cc\" either does not exist or does not work."
+fi
+
# Remove old dependency files to make sure that they get properly regenerated
rm -f ./*/config-devices.mak.d
--
2.45.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PULL 02/11] dockerfiles: add 'MAKE' env variable to remaining containers
2024-05-14 12:51 [PULL 00/11] gitlab CI fix and glib update Thomas Huth
2024-05-14 12:51 ` [PULL 01/11] configure: Fix error message when C compiler is not working Thomas Huth
@ 2024-05-14 12:51 ` Thomas Huth
2024-05-14 12:51 ` [PULL 03/11] gitlab: use $MAKE instead of 'make' Thomas Huth
` (10 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Thomas Huth @ 2024-05-14 12:51 UTC (permalink / raw)
To: qemu-devel, Richard Henderson
From: Daniel P. Berrangé <berrange@redhat.com>
All the lcitool generated containers define a "MAKE" env. It will be
convenient for later patches if all containers do this.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-ID: <20240513111551.488088-2-berrange@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
tests/docker/dockerfiles/debian-all-test-cross.docker | 1 +
tests/docker/dockerfiles/debian-hexagon-cross.docker | 1 +
tests/docker/dockerfiles/debian-legacy-test-cross.docker | 1 +
tests/docker/dockerfiles/debian-loongarch-cross.docker | 1 +
tests/docker/dockerfiles/debian-tricore-cross.docker | 1 +
tests/docker/dockerfiles/debian-xtensa-cross.docker | 1 +
tests/docker/dockerfiles/fedora-cris-cross.docker | 1 +
7 files changed, 7 insertions(+)
diff --git a/tests/docker/dockerfiles/debian-all-test-cross.docker b/tests/docker/dockerfiles/debian-all-test-cross.docker
index 2cc7a24d4d..6cc38a3633 100644
--- a/tests/docker/dockerfiles/debian-all-test-cross.docker
+++ b/tests/docker/dockerfiles/debian-all-test-cross.docker
@@ -68,6 +68,7 @@ RUN DEBIAN_FRONTEND=noninteractive eatmydata \
ENV QEMU_CONFIGURE_OPTS --disable-system --disable-docs --disable-tools
ENV DEF_TARGET_LIST aarch64-linux-user,arm-linux-user,hppa-linux-user,i386-linux-user,m68k-linux-user,mips-linux-user,mips64-linux-user,mips64el-linux-user,mipsel-linux-user,ppc-linux-user,ppc64-linux-user,ppc64le-linux-user,riscv64-linux-user,s390x-linux-user,sparc64-linux-user
# As a final step configure the user (if env is defined)
+ENV MAKE /usr/bin/make
ARG USER
ARG UID
RUN if [ "${USER}" ]; then \
diff --git a/tests/docker/dockerfiles/debian-hexagon-cross.docker b/tests/docker/dockerfiles/debian-hexagon-cross.docker
index 60bd8faa20..f2d40f2dee 100644
--- a/tests/docker/dockerfiles/debian-hexagon-cross.docker
+++ b/tests/docker/dockerfiles/debian-hexagon-cross.docker
@@ -45,6 +45,7 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
RUN curl -#SL "$TOOLCHAIN_URL" | tar -xJC "$TOOLCHAIN_INSTALL"
ENV PATH $PATH:${TOOLCHAIN_INSTALL}/${TOOLCHAIN_BASENAME}/x86_64-linux-gnu/bin
+ENV MAKE /usr/bin/make
# As a final step configure the user (if env is defined)
ARG USER
ARG UID
diff --git a/tests/docker/dockerfiles/debian-legacy-test-cross.docker b/tests/docker/dockerfiles/debian-legacy-test-cross.docker
index 8cc68bc912..d75e0b85e2 100644
--- a/tests/docker/dockerfiles/debian-legacy-test-cross.docker
+++ b/tests/docker/dockerfiles/debian-legacy-test-cross.docker
@@ -42,6 +42,7 @@ RUN /usr/bin/pip3 install tomli
ENV QEMU_CONFIGURE_OPTS --disable-system --disable-docs --disable-tools
ENV DEF_TARGET_LIST alpha-linux-user,sh4-linux-user
+ENV MAKE /usr/bin/make
# As a final step configure the user (if env is defined)
ARG USER
ARG UID
diff --git a/tests/docker/dockerfiles/debian-loongarch-cross.docker b/tests/docker/dockerfiles/debian-loongarch-cross.docker
index b25e779a2c..6a9197528b 100644
--- a/tests/docker/dockerfiles/debian-loongarch-cross.docker
+++ b/tests/docker/dockerfiles/debian-loongarch-cross.docker
@@ -44,6 +44,7 @@ ENV LD_LIBRARY_PATH /opt/cross-tools/lib:/opt/cross-tools/loongarch64-unknown-li
ENV QEMU_CONFIGURE_OPTS --disable-system --disable-docs --disable-tools
ENV DEF_TARGET_LIST loongarch64-linux-user,loongarch-softmmu
+ENV MAKE /usr/bin/make
# As a final step configure the user (if env is defined)
ARG USER
diff --git a/tests/docker/dockerfiles/debian-tricore-cross.docker b/tests/docker/dockerfiles/debian-tricore-cross.docker
index c597f8e16b..16276aa21d 100644
--- a/tests/docker/dockerfiles/debian-tricore-cross.docker
+++ b/tests/docker/dockerfiles/debian-tricore-cross.docker
@@ -44,6 +44,7 @@ RUN curl -#SL https://github.com/bkoppelmann/package_940/releases/download/trico
# This image can only build a very minimal QEMU as well as the tests
ENV DEF_TARGET_LIST tricore-softmmu
ENV QEMU_CONFIGURE_OPTS --disable-user --disable-tools --disable-fdt
+ENV MAKE /usr/bin/make
# As a final step configure the user (if env is defined)
ARG USER
ARG UID
diff --git a/tests/docker/dockerfiles/debian-xtensa-cross.docker b/tests/docker/dockerfiles/debian-xtensa-cross.docker
index 72c25d63d9..413881899b 100644
--- a/tests/docker/dockerfiles/debian-xtensa-cross.docker
+++ b/tests/docker/dockerfiles/debian-xtensa-cross.docker
@@ -27,6 +27,7 @@ RUN for cpu in $CPU_LIST; do \
done
ENV PATH $PATH:/opt/$TOOLCHAIN_RELEASE/xtensa-dc232b-elf/bin:/opt/$TOOLCHAIN_RELEASE/xtensa-dc233c-elf/bin:/opt/$TOOLCHAIN_RELEASE/xtensa-de233_fpu-elf/bin:/opt/$TOOLCHAIN_RELEASE/xtensa-dsp3400-elf/bin
+ENV MAKE /usr/bin/make
# As a final step configure the user (if env is defined)
ARG USER
ARG UID
diff --git a/tests/docker/dockerfiles/fedora-cris-cross.docker b/tests/docker/dockerfiles/fedora-cris-cross.docker
index f2899af410..97c9d37ede 100644
--- a/tests/docker/dockerfiles/fedora-cris-cross.docker
+++ b/tests/docker/dockerfiles/fedora-cris-cross.docker
@@ -4,6 +4,7 @@
FROM registry.fedoraproject.org/fedora:33
ENV PACKAGES gcc-cris-linux-gnu
+ENV MAKE /usr/bin/make
RUN dnf install -y $PACKAGES
RUN rpm -q $PACKAGES | sort > /packages.txt
# As a final step configure the user (if env is defined)
--
2.45.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PULL 03/11] gitlab: use $MAKE instead of 'make'
2024-05-14 12:51 [PULL 00/11] gitlab CI fix and glib update Thomas Huth
2024-05-14 12:51 ` [PULL 01/11] configure: Fix error message when C compiler is not working Thomas Huth
2024-05-14 12:51 ` [PULL 02/11] dockerfiles: add 'MAKE' env variable to remaining containers Thomas Huth
@ 2024-05-14 12:51 ` Thomas Huth
2024-05-14 12:51 ` [PULL 04/11] gitlab: use 'setarch -R' to workaround tsan bug Thomas Huth
` (9 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Thomas Huth @ 2024-05-14 12:51 UTC (permalink / raw)
To: qemu-devel, Richard Henderson
From: Daniel P. Berrangé <berrange@redhat.com>
The lcitool generated containers have '$MAKE' set to the path
of the right 'make' binary. Using the env variable makes it
possible to override the choice per job.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-ID: <20240513111551.488088-3-berrange@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
.gitlab-ci.d/buildtest-template.yml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/.gitlab-ci.d/buildtest-template.yml b/.gitlab-ci.d/buildtest-template.yml
index 22045add80..278a5ea966 100644
--- a/.gitlab-ci.d/buildtest-template.yml
+++ b/.gitlab-ci.d/buildtest-template.yml
@@ -26,10 +26,10 @@
then
pyvenv/bin/meson configure . -Dbackend_max_links="$LD_JOBS" ;
fi || exit 1;
- - make -j"$JOBS"
+ - $MAKE -j"$JOBS"
- if test -n "$MAKE_CHECK_ARGS";
then
- make -j"$JOBS" $MAKE_CHECK_ARGS ;
+ $MAKE -j"$JOBS" $MAKE_CHECK_ARGS ;
fi
- ccache --show-stats
@@ -60,7 +60,7 @@
- cd build
- find . -type f -exec touch {} +
# Avoid recompiling by hiding ninja with NINJA=":"
- - make NINJA=":" $MAKE_CHECK_ARGS
+ - $MAKE NINJA=":" $MAKE_CHECK_ARGS
.native_test_job_template:
extends: .common_test_job_template
--
2.45.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PULL 04/11] gitlab: use 'setarch -R' to workaround tsan bug
2024-05-14 12:51 [PULL 00/11] gitlab CI fix and glib update Thomas Huth
` (2 preceding siblings ...)
2024-05-14 12:51 ` [PULL 03/11] gitlab: use $MAKE instead of 'make' Thomas Huth
@ 2024-05-14 12:51 ` Thomas Huth
2024-05-14 12:51 ` [PULL 05/11] Bump minimum glib version to v2.66 Thomas Huth
` (8 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Thomas Huth @ 2024-05-14 12:51 UTC (permalink / raw)
To: qemu-devel, Richard Henderson
From: Daniel P. Berrangé <berrange@redhat.com>
The TSAN job started failing when gitlab rolled out their latest
release. The root cause is a change in the Google COS version used
on shared runners. This brings a kernel running with
vm.mmap_rnd_bits = 31
which is incompatible with TSAN in LLVM < 18, which only supports
upto '28'. LLVM 18 can support upto '30', and failing that will
re-exec itself to turn off VA randomization.
Our LLVM is too old for now, but we can run with 'setarch -R make ..'
to turn off VA randomization ourselves.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-ID: <20240513111551.488088-4-berrange@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
.gitlab-ci.d/buildtest.yml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/.gitlab-ci.d/buildtest.yml b/.gitlab-ci.d/buildtest.yml
index 372404fc85..91c57efded 100644
--- a/.gitlab-ci.d/buildtest.yml
+++ b/.gitlab-ci.d/buildtest.yml
@@ -575,6 +575,9 @@ tsan-build:
CONFIGURE_ARGS: --enable-tsan --cc=clang --cxx=clang++
--enable-trace-backends=ust --disable-slirp
TARGETS: x86_64-softmmu ppc64-softmmu riscv64-softmmu x86_64-linux-user
+ # Remove when we switch to a distro with clang >= 18
+ # https://github.com/google/sanitizers/issues/1716
+ MAKE: setarch -R make
# gcov is a GCC features
gcov:
--
2.45.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PULL 05/11] Bump minimum glib version to v2.66
2024-05-14 12:51 [PULL 00/11] gitlab CI fix and glib update Thomas Huth
` (3 preceding siblings ...)
2024-05-14 12:51 ` [PULL 04/11] gitlab: use 'setarch -R' to workaround tsan bug Thomas Huth
@ 2024-05-14 12:51 ` Thomas Huth
2024-05-14 12:51 ` [PULL 06/11] Remove glib compatibility code that is not required anymore Thomas Huth
` (7 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Thomas Huth @ 2024-05-14 12:51 UTC (permalink / raw)
To: qemu-devel, Richard Henderson
Now that we dropped support for CentOS 8 and Ubuntu 20.04, we can
look into bumping the glib version to a new minimum for further
clean-ups. According to repology.org, available versions are:
CentOS Stream 9: 2.66.7
Debian 11: 2.66.8
Fedora 38: 2.74.1
Freebsd: 2.78.4
Homebrew: 2.80.0
Openbsd: 2.78.4
OpenSuse leap 15.5: 2.70.5
pkgsrc_current: 2.78.4
Ubuntu 22.04: 2.72.1
Thus it should be safe to bump the minimum glib version to 2.66 now.
Version 2.66 comes with new functions for URI parsing which will
allow further clean-ups in the following patches.
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-ID: <20240418101056.302103-8-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
meson.build | 16 +---------------
include/glib-compat.h | 27 ++-------------------------
qga/commands-posix-ssh.c | 4 ++--
3 files changed, 5 insertions(+), 42 deletions(-)
diff --git a/meson.build b/meson.build
index 9c14192514..a9de71d450 100644
--- a/meson.build
+++ b/meson.build
@@ -869,7 +869,7 @@ have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
# When bumping glib minimum version, please check also whether to increase
# the _WIN32_WINNT setting in osdep.h according to the value from glib
-glib_req_ver = '>=2.56.0'
+glib_req_ver = '>=2.66.0'
glib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
method: 'pkg-config')
glib_cflags = []
@@ -910,20 +910,6 @@ if not cc.compiles('''
to the right pkg-config files for your build target.''')
endif
-# Silence clang warnings triggered by glib < 2.57.2
-if not cc.compiles('''
- #include <glib.h>
- typedef struct Foo {
- int i;
- } Foo;
- static void foo_free(Foo *f)
- {
- g_free(f);
- }
- G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free)
- int main(void) { return 0; }''', dependencies: glib_pc, args: ['-Wunused-function', '-Werror'])
- glib_cflags += cc.get_supported_arguments('-Wno-unused-function')
-endif
glib = declare_dependency(dependencies: [glib_pc, gmodule],
compile_args: glib_cflags,
version: glib_pc.version())
diff --git a/include/glib-compat.h b/include/glib-compat.h
index 43a562974d..86be439ba0 100644
--- a/include/glib-compat.h
+++ b/include/glib-compat.h
@@ -19,12 +19,12 @@
/* Ask for warnings for anything that was marked deprecated in
* the defined version, or before. It is a candidate for rewrite.
*/
-#define GLIB_VERSION_MIN_REQUIRED GLIB_VERSION_2_56
+#define GLIB_VERSION_MIN_REQUIRED GLIB_VERSION_2_66
/* Ask for warnings if code tries to use function that did not
* exist in the defined version. These risk breaking builds
*/
-#define GLIB_VERSION_MAX_ALLOWED GLIB_VERSION_2_56
+#define GLIB_VERSION_MAX_ALLOWED GLIB_VERSION_2_66
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
@@ -105,29 +105,6 @@ static inline gpointer g_memdup2_qemu(gconstpointer mem, gsize byte_size)
}
#define g_memdup2(m, s) g_memdup2_qemu(m, s)
-#if defined(G_OS_UNIX)
-/*
- * Note: The fallback implementation is not MT-safe, and it returns a copy of
- * the libc passwd (must be g_free() after use) but not the content. Because of
- * these important differences the caller must be aware of, it's not #define for
- * GLib API substitution.
- */
-static inline struct passwd *
-g_unix_get_passwd_entry_qemu(const gchar *user_name, GError **error)
-{
-#if GLIB_CHECK_VERSION(2, 64, 0)
- return g_unix_get_passwd_entry(user_name, error);
-#else
- struct passwd *p = getpwnam(user_name);
- if (!p) {
- g_set_error_literal(error, G_UNIX_ERROR, 0, g_strerror(errno));
- return NULL;
- }
- return (struct passwd *)g_memdup(p, sizeof(*p));
-#endif
-}
-#endif /* G_OS_UNIX */
-
static inline bool
qemu_g_test_slow(void)
{
diff --git a/qga/commands-posix-ssh.c b/qga/commands-posix-ssh.c
index dd2ecb453a..866afe6741 100644
--- a/qga/commands-posix-ssh.c
+++ b/qga/commands-posix-ssh.c
@@ -36,7 +36,7 @@ test_get_passwd_entry(const gchar *user_name, GError **error)
return p;
}
-#define g_unix_get_passwd_entry_qemu(username, err) \
+#define g_unix_get_passwd_entry(username, err) \
test_get_passwd_entry(username, err)
#endif
@@ -46,7 +46,7 @@ get_passwd_entry(const char *username, Error **errp)
g_autoptr(GError) err = NULL;
struct passwd *p;
- p = g_unix_get_passwd_entry_qemu(username, &err);
+ p = g_unix_get_passwd_entry(username, &err);
if (p == NULL) {
error_setg(errp, "failed to lookup user '%s': %s",
username, err->message);
--
2.45.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PULL 06/11] Remove glib compatibility code that is not required anymore
2024-05-14 12:51 [PULL 00/11] gitlab CI fix and glib update Thomas Huth
` (4 preceding siblings ...)
2024-05-14 12:51 ` [PULL 05/11] Bump minimum glib version to v2.66 Thomas Huth
@ 2024-05-14 12:51 ` Thomas Huth
2024-05-14 12:51 ` [PULL 07/11] block/gluster: Use URI parsing code from glib Thomas Huth
` (6 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Thomas Huth @ 2024-05-14 12:51 UTC (permalink / raw)
To: qemu-devel, Richard Henderson
Now that we bumped the minimum glib version to 2.66, we can drop
the old code.
Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-ID: <20240418101056.302103-9-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
qga/commands-posix-ssh.c | 8 --------
util/error-report.c | 10 ----------
2 files changed, 18 deletions(-)
diff --git a/qga/commands-posix-ssh.c b/qga/commands-posix-ssh.c
index 866afe6741..246171d323 100644
--- a/qga/commands-posix-ssh.c
+++ b/qga/commands-posix-ssh.c
@@ -243,7 +243,6 @@ qmp_guest_ssh_get_authorized_keys(const char *username, Error **errp)
}
#ifdef QGA_BUILD_UNIT_TEST
-#if GLIB_CHECK_VERSION(2, 60, 0)
static const strList test_key2 = {
.value = (char *)"algo key2 comments"
};
@@ -439,11 +438,4 @@ int main(int argc, char *argv[])
return g_test_run();
}
-#else
-int main(int argc, char *argv[])
-{
- g_test_message("test skipped, needs glib >= 2.60");
- return 0;
-}
-#endif /* GLIB_2_60 */
#endif /* BUILD_UNIT_TEST */
diff --git a/util/error-report.c b/util/error-report.c
index 6e44a55732..1b17c11de1 100644
--- a/util/error-report.c
+++ b/util/error-report.c
@@ -172,18 +172,8 @@ static void print_loc(void)
static char *
real_time_iso8601(void)
{
-#if GLIB_CHECK_VERSION(2,62,0)
g_autoptr(GDateTime) dt = g_date_time_new_now_utc();
- /* ignore deprecation warning, since GLIB_VERSION_MAX_ALLOWED is 2.56 */
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
return g_date_time_format_iso8601(dt);
-#pragma GCC diagnostic pop
-#else
- GTimeVal tv;
- g_get_current_time(&tv);
- return g_time_val_to_iso8601(&tv);
-#endif
}
/*
--
2.45.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PULL 07/11] block/gluster: Use URI parsing code from glib
2024-05-14 12:51 [PULL 00/11] gitlab CI fix and glib update Thomas Huth
` (5 preceding siblings ...)
2024-05-14 12:51 ` [PULL 06/11] Remove glib compatibility code that is not required anymore Thomas Huth
@ 2024-05-14 12:51 ` Thomas Huth
2024-05-14 12:51 ` [PULL 08/11] block/nbd: " Thomas Huth
` (5 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Thomas Huth @ 2024-05-14 12:51 UTC (permalink / raw)
To: qemu-devel, Richard Henderson
Since version 2.66, glib has useful URI parsing functions, too.
Use those instead of the QEMU-internal ones to be finally able
to get rid of the latter.
Since g_uri_get_path() returns a const pointer, we also need to
tweak the parameter of parse_volume_options() (where we use the
result of g_uri_get_path() as input).
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Message-Id: <20240418101056.302103-10-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
block/gluster.c | 69 ++++++++++++++++++++++++-------------------------
1 file changed, 34 insertions(+), 35 deletions(-)
diff --git a/block/gluster.c b/block/gluster.c
index 4253c8db5e..d0999903df 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -17,7 +17,6 @@
#include "qapi/error.h"
#include "qapi/qmp/qdict.h"
#include "qapi/qmp/qerror.h"
-#include "qemu/uri.h"
#include "qemu/error-report.h"
#include "qemu/module.h"
#include "qemu/option.h"
@@ -289,9 +288,9 @@ static void glfs_clear_preopened(glfs_t *fs)
}
}
-static int parse_volume_options(BlockdevOptionsGluster *gconf, char *path)
+static int parse_volume_options(BlockdevOptionsGluster *gconf, const char *path)
{
- char *p, *q;
+ const char *p, *q;
if (!path) {
return -EINVAL;
@@ -349,13 +348,13 @@ static int parse_volume_options(BlockdevOptionsGluster *gconf, char *path)
static int qemu_gluster_parse_uri(BlockdevOptionsGluster *gconf,
const char *filename)
{
+ g_autoptr(GUri) uri = g_uri_parse(filename, G_URI_FLAGS_NONE, NULL);
+ g_autoptr(GHashTable) qp = NULL;
SocketAddress *gsconf;
- URI *uri;
- QueryParams *qp = NULL;
bool is_unix = false;
- int ret = 0;
+ const char *uri_scheme, *uri_query, *uri_server;
+ int uri_port, ret;
- uri = uri_parse(filename);
if (!uri) {
return -EINVAL;
}
@@ -364,54 +363,54 @@ static int qemu_gluster_parse_uri(BlockdevOptionsGluster *gconf,
QAPI_LIST_PREPEND(gconf->server, gsconf);
/* transport */
- if (!uri->scheme || !strcmp(uri->scheme, "gluster")) {
+ uri_scheme = g_uri_get_scheme(uri);
+ if (!uri_scheme || !strcmp(uri_scheme, "gluster")) {
gsconf->type = SOCKET_ADDRESS_TYPE_INET;
- } else if (!strcmp(uri->scheme, "gluster+tcp")) {
+ } else if (!strcmp(uri_scheme, "gluster+tcp")) {
gsconf->type = SOCKET_ADDRESS_TYPE_INET;
- } else if (!strcmp(uri->scheme, "gluster+unix")) {
+ } else if (!strcmp(uri_scheme, "gluster+unix")) {
gsconf->type = SOCKET_ADDRESS_TYPE_UNIX;
is_unix = true;
} else {
- ret = -EINVAL;
- goto out;
+ return -EINVAL;
}
- ret = parse_volume_options(gconf, uri->path);
+ ret = parse_volume_options(gconf, g_uri_get_path(uri));
if (ret < 0) {
- goto out;
+ return ret;
}
- qp = query_params_parse(uri->query);
- if (qp->n > 1 || (is_unix && !qp->n) || (!is_unix && qp->n)) {
- ret = -EINVAL;
- goto out;
+ uri_query = g_uri_get_query(uri);
+ if (uri_query) {
+ qp = g_uri_parse_params(uri_query, -1, "&", G_URI_PARAMS_NONE, NULL);
+ if (!qp) {
+ return -EINVAL;
+ }
+ ret = g_hash_table_size(qp);
+ if (ret > 1 || (is_unix && !ret) || (!is_unix && ret)) {
+ return -EINVAL;
+ }
}
+ uri_server = g_uri_get_host(uri);
+ uri_port = g_uri_get_port(uri);
+
if (is_unix) {
- if (uri->server || uri->port) {
- ret = -EINVAL;
- goto out;
- }
- if (strcmp(qp->p[0].name, "socket")) {
- ret = -EINVAL;
- goto out;
+ char *uri_socket = g_hash_table_lookup(qp, "socket");
+ if (uri_server || uri_port != -1 || !uri_socket) {
+ return -EINVAL;
}
- gsconf->u.q_unix.path = g_strdup(qp->p[0].value);
+ gsconf->u.q_unix.path = g_strdup(uri_socket);
} else {
- gsconf->u.inet.host = g_strdup(uri->server ? uri->server : "localhost");
- if (uri->port) {
- gsconf->u.inet.port = g_strdup_printf("%d", uri->port);
+ gsconf->u.inet.host = g_strdup(uri_server ? uri_server : "localhost");
+ if (uri_port > 0) {
+ gsconf->u.inet.port = g_strdup_printf("%d", uri_port);
} else {
gsconf->u.inet.port = g_strdup_printf("%d", GLUSTER_DEFAULT_PORT);
}
}
-out:
- if (qp) {
- query_params_free(qp);
- }
- uri_free(uri);
- return ret;
+ return 0;
}
static struct glfs *qemu_gluster_glfs_init(BlockdevOptionsGluster *gconf,
--
2.45.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PULL 08/11] block/nbd: Use URI parsing code from glib
2024-05-14 12:51 [PULL 00/11] gitlab CI fix and glib update Thomas Huth
` (6 preceding siblings ...)
2024-05-14 12:51 ` [PULL 07/11] block/gluster: Use URI parsing code from glib Thomas Huth
@ 2024-05-14 12:51 ` Thomas Huth
2024-05-14 12:51 ` [PULL 09/11] block/nfs: " Thomas Huth
` (4 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Thomas Huth @ 2024-05-14 12:51 UTC (permalink / raw)
To: qemu-devel, Richard Henderson
Since version 2.66, glib has useful URI parsing functions, too.
Use those instead of the QEMU-internal ones to be finally able
to get rid of the latter. The g_uri_get_host() also takes care
of removing the square brackets from IPv6 addresses, so we can
drop that part of the QEMU code now, too.
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-ID: <20240418101056.302103-11-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
block/nbd.c | 76 ++++++++++++++++++++++++++---------------------------
1 file changed, 37 insertions(+), 39 deletions(-)
diff --git a/block/nbd.c b/block/nbd.c
index ef05f7cdfd..589d28af83 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -31,7 +31,6 @@
#include "qemu/osdep.h"
#include "trace.h"
-#include "qemu/uri.h"
#include "qemu/option.h"
#include "qemu/cutils.h"
#include "qemu/main-loop.h"
@@ -1514,30 +1513,31 @@ static void nbd_client_close(BlockDriverState *bs)
static int nbd_parse_uri(const char *filename, QDict *options)
{
- URI *uri;
+ g_autoptr(GUri) uri = g_uri_parse(filename, G_URI_FLAGS_NONE, NULL);
+ g_autoptr(GHashTable) qp = NULL;
const char *p;
- QueryParams *qp = NULL;
- int ret = 0;
+ int qp_n;
bool is_unix;
+ const char *uri_scheme, *uri_query, *uri_server;
+ int uri_port;
- uri = uri_parse(filename);
if (!uri) {
return -EINVAL;
}
/* transport */
- if (!g_strcmp0(uri->scheme, "nbd")) {
+ uri_scheme = g_uri_get_scheme(uri);
+ if (!g_strcmp0(uri_scheme, "nbd")) {
is_unix = false;
- } else if (!g_strcmp0(uri->scheme, "nbd+tcp")) {
+ } else if (!g_strcmp0(uri_scheme, "nbd+tcp")) {
is_unix = false;
- } else if (!g_strcmp0(uri->scheme, "nbd+unix")) {
+ } else if (!g_strcmp0(uri_scheme, "nbd+unix")) {
is_unix = true;
} else {
- ret = -EINVAL;
- goto out;
+ return -EINVAL;
}
- p = uri->path ? uri->path : "";
+ p = g_uri_get_path(uri) ?: "";
if (p[0] == '/') {
p++;
}
@@ -1545,52 +1545,50 @@ static int nbd_parse_uri(const char *filename, QDict *options)
qdict_put_str(options, "export", p);
}
- qp = query_params_parse(uri->query);
- if (qp->n > 1 || (is_unix && !qp->n) || (!is_unix && qp->n)) {
- ret = -EINVAL;
- goto out;
+ uri_query = g_uri_get_query(uri);
+ if (uri_query) {
+ qp = g_uri_parse_params(uri_query, -1, "&", G_URI_PARAMS_NONE, NULL);
+ if (!qp) {
+ return -EINVAL;
+ }
+ qp_n = g_hash_table_size(qp);
+ if (qp_n > 1 || (is_unix && !qp_n) || (!is_unix && qp_n)) {
+ return -EINVAL;
+ }
+ }
+
+ uri_server = g_uri_get_host(uri);
+ if (uri_server && !uri_server[0]) {
+ uri_server = NULL;
}
+ uri_port = g_uri_get_port(uri);
if (is_unix) {
/* nbd+unix:///export?socket=path */
- if (uri->server || uri->port || strcmp(qp->p[0].name, "socket")) {
- ret = -EINVAL;
- goto out;
+ const char *uri_socket = g_hash_table_lookup(qp, "socket");
+ if (uri_server || uri_port != -1 || !uri_socket) {
+ return -EINVAL;
}
qdict_put_str(options, "server.type", "unix");
- qdict_put_str(options, "server.path", qp->p[0].value);
+ qdict_put_str(options, "server.path", uri_socket);
} else {
- QString *host;
char *port_str;
/* nbd[+tcp]://host[:port]/export */
- if (!uri->server) {
- ret = -EINVAL;
- goto out;
- }
-
- /* strip braces from literal IPv6 address */
- if (uri->server[0] == '[') {
- host = qstring_from_substr(uri->server, 1,
- strlen(uri->server) - 1);
- } else {
- host = qstring_from_str(uri->server);
+ if (!uri_server) {
+ return -EINVAL;
}
qdict_put_str(options, "server.type", "inet");
- qdict_put(options, "server.host", host);
+ qdict_put_str(options, "server.host", uri_server);
- port_str = g_strdup_printf("%d", uri->port ?: NBD_DEFAULT_PORT);
+ port_str = g_strdup_printf("%d", uri_port > 0 ? uri_port
+ : NBD_DEFAULT_PORT);
qdict_put_str(options, "server.port", port_str);
g_free(port_str);
}
-out:
- if (qp) {
- query_params_free(qp);
- }
- uri_free(uri);
- return ret;
+ return 0;
}
static bool nbd_has_filename_options_conflict(QDict *options, Error **errp)
--
2.45.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PULL 09/11] block/nfs: Use URI parsing code from glib
2024-05-14 12:51 [PULL 00/11] gitlab CI fix and glib update Thomas Huth
` (7 preceding siblings ...)
2024-05-14 12:51 ` [PULL 08/11] block/nbd: " Thomas Huth
@ 2024-05-14 12:51 ` Thomas Huth
2024-05-14 12:51 ` [PULL 10/11] block/ssh: " Thomas Huth
` (3 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Thomas Huth @ 2024-05-14 12:51 UTC (permalink / raw)
To: qemu-devel, Richard Henderson
Since version 2.66, glib has useful URI parsing functions, too.
Use those instead of the QEMU-internal ones to be finally able
to get rid of the latter.
While we're at it, slightly rephrase one of the error messages:
Use "Invalid value..." instead of "Illegal value..." since the
latter rather sounds like the users were breaking a law here.
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-ID: <20240418101056.302103-12-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
block/nfs.c | 110 ++++++++++++++++++++++++++--------------------------
1 file changed, 54 insertions(+), 56 deletions(-)
diff --git a/block/nfs.c b/block/nfs.c
index f737e19cd3..60240a8733 100644
--- a/block/nfs.c
+++ b/block/nfs.c
@@ -38,7 +38,6 @@
#include "qemu/main-loop.h"
#include "qemu/module.h"
#include "qemu/option.h"
-#include "qemu/uri.h"
#include "qemu/cutils.h"
#include "sysemu/replay.h"
#include "qapi/qapi-visit-block-core.h"
@@ -79,77 +78,76 @@ typedef struct NFSRPC {
static int nfs_parse_uri(const char *filename, QDict *options, Error **errp)
{
- URI *uri = NULL;
- QueryParams *qp = NULL;
- int ret = -EINVAL, i;
+ g_autoptr(GUri) uri = g_uri_parse(filename, G_URI_FLAGS_NONE, NULL);
+ GUriParamsIter qp;
+ const char *uri_server, *uri_path, *uri_query;
+ char *qp_name, *qp_value;
+ GError *gerror = NULL;
- uri = uri_parse(filename);
if (!uri) {
error_setg(errp, "Invalid URI specified");
- goto out;
+ return -EINVAL;
}
- if (g_strcmp0(uri->scheme, "nfs") != 0) {
+ if (!g_str_equal(g_uri_get_scheme(uri), "nfs")) {
error_setg(errp, "URI scheme must be 'nfs'");
- goto out;
+ return -EINVAL;
}
- if (!uri->server) {
+ uri_server = g_uri_get_host(uri);
+ if (!uri_server || !uri_server[0]) {
error_setg(errp, "missing hostname in URI");
- goto out;
+ return -EINVAL;
}
- if (!uri->path) {
+ uri_path = g_uri_get_path(uri);
+ if (!uri_path || !uri_path[0]) {
error_setg(errp, "missing file path in URI");
- goto out;
- }
-
- qp = query_params_parse(uri->query);
- if (!qp) {
- error_setg(errp, "could not parse query parameters");
- goto out;
+ return -EINVAL;
}
- qdict_put_str(options, "server.host", uri->server);
+ qdict_put_str(options, "server.host", uri_server);
qdict_put_str(options, "server.type", "inet");
- qdict_put_str(options, "path", uri->path);
-
- for (i = 0; i < qp->n; i++) {
- uint64_t val;
- if (!qp->p[i].value) {
- error_setg(errp, "Value for NFS parameter expected: %s",
- qp->p[i].name);
- goto out;
- }
- if (parse_uint_full(qp->p[i].value, 0, &val)) {
- error_setg(errp, "Illegal value for NFS parameter: %s",
- qp->p[i].name);
- goto out;
- }
- if (!strcmp(qp->p[i].name, "uid")) {
- qdict_put_str(options, "user", qp->p[i].value);
- } else if (!strcmp(qp->p[i].name, "gid")) {
- qdict_put_str(options, "group", qp->p[i].value);
- } else if (!strcmp(qp->p[i].name, "tcp-syncnt")) {
- qdict_put_str(options, "tcp-syn-count", qp->p[i].value);
- } else if (!strcmp(qp->p[i].name, "readahead")) {
- qdict_put_str(options, "readahead-size", qp->p[i].value);
- } else if (!strcmp(qp->p[i].name, "pagecache")) {
- qdict_put_str(options, "page-cache-size", qp->p[i].value);
- } else if (!strcmp(qp->p[i].name, "debug")) {
- qdict_put_str(options, "debug", qp->p[i].value);
- } else {
- error_setg(errp, "Unknown NFS parameter name: %s",
- qp->p[i].name);
- goto out;
+ qdict_put_str(options, "path", uri_path);
+
+ uri_query = g_uri_get_query(uri);
+ if (uri_query) {
+ g_uri_params_iter_init(&qp, uri_query, -1, "&", G_URI_PARAMS_NONE);
+ while (g_uri_params_iter_next(&qp, &qp_name, &qp_value, &gerror)) {
+ uint64_t val;
+ if (!qp_name || gerror) {
+ error_setg(errp, "Failed to parse NFS parameter");
+ return -EINVAL;
+ }
+ if (!qp_value) {
+ error_setg(errp, "Value for NFS parameter expected: %s",
+ qp_name);
+ return -EINVAL;
+ }
+ if (parse_uint_full(qp_value, 0, &val)) {
+ error_setg(errp, "Invalid value for NFS parameter: %s",
+ qp_name);
+ return -EINVAL;
+ }
+ if (g_str_equal(qp_name, "uid")) {
+ qdict_put_str(options, "user", qp_value);
+ } else if (g_str_equal(qp_name, "gid")) {
+ qdict_put_str(options, "group", qp_value);
+ } else if (g_str_equal(qp_name, "tcp-syncnt")) {
+ qdict_put_str(options, "tcp-syn-count", qp_value);
+ } else if (g_str_equal(qp_name, "readahead")) {
+ qdict_put_str(options, "readahead-size", qp_value);
+ } else if (g_str_equal(qp_name, "pagecache")) {
+ qdict_put_str(options, "page-cache-size", qp_value);
+ } else if (g_str_equal(qp_name, "debug")) {
+ qdict_put_str(options, "debug", qp_value);
+ } else {
+ error_setg(errp, "Unknown NFS parameter name: %s", qp_name);
+ return -EINVAL;
+ }
}
}
- ret = 0;
-out:
- if (qp) {
- query_params_free(qp);
- }
- uri_free(uri);
- return ret;
+
+ return 0;
}
static bool nfs_has_filename_options_conflict(QDict *options, Error **errp)
--
2.45.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PULL 10/11] block/ssh: Use URI parsing code from glib
2024-05-14 12:51 [PULL 00/11] gitlab CI fix and glib update Thomas Huth
` (8 preceding siblings ...)
2024-05-14 12:51 ` [PULL 09/11] block/nfs: " Thomas Huth
@ 2024-05-14 12:51 ` Thomas Huth
2024-05-14 12:51 ` [PULL 11/11] util/uri: Remove the old URI parsing code Thomas Huth
` (2 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Thomas Huth @ 2024-05-14 12:51 UTC (permalink / raw)
To: qemu-devel, Richard Henderson
Since version 2.66, glib has useful URI parsing functions, too.
Use those instead of the QEMU-internal ones to be finally able
to get rid of the latter.
While we're at it, also emit a warning when encountering unknown
parameters in the URI, so that the users have a chance to detect
their typos or other mistakes.
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
Message-ID: <20240418101056.302103-13-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
block/ssh.c | 75 ++++++++++++++++++++++++++++-------------------------
1 file changed, 40 insertions(+), 35 deletions(-)
diff --git a/block/ssh.c b/block/ssh.c
index 2748253d4a..a88171d4b5 100644
--- a/block/ssh.c
+++ b/block/ssh.c
@@ -37,7 +37,6 @@
#include "qemu/ctype.h"
#include "qemu/cutils.h"
#include "qemu/sockets.h"
-#include "qemu/uri.h"
#include "qapi/qapi-visit-sockets.h"
#include "qapi/qapi-visit-block-core.h"
#include "qapi/qmp/qdict.h"
@@ -181,65 +180,71 @@ static void sftp_error_trace(BDRVSSHState *s, const char *op)
static int parse_uri(const char *filename, QDict *options, Error **errp)
{
- URI *uri = NULL;
- QueryParams *qp;
+ g_autoptr(GUri) uri = g_uri_parse(filename, G_URI_FLAGS_NONE, NULL);
+ const char *uri_host, *uri_path, *uri_user, *uri_query;
char *port_str;
- int i;
+ int port;
+ g_autoptr(GError) gerror = NULL;
+ char *qp_name, *qp_value;
+ GUriParamsIter qp;
- uri = uri_parse(filename);
if (!uri) {
return -EINVAL;
}
- if (g_strcmp0(uri->scheme, "ssh") != 0) {
+ if (g_strcmp0(g_uri_get_scheme(uri), "ssh") != 0) {
error_setg(errp, "URI scheme must be 'ssh'");
- goto err;
+ return -EINVAL;
}
- if (!uri->server || strcmp(uri->server, "") == 0) {
+ uri_host = g_uri_get_host(uri);
+ if (!uri_host || g_str_equal(uri_host, "")) {
error_setg(errp, "missing hostname in URI");
- goto err;
+ return -EINVAL;
}
- if (!uri->path || strcmp(uri->path, "") == 0) {
+ uri_path = g_uri_get_path(uri);
+ if (!uri_path || g_str_equal(uri_path, "")) {
error_setg(errp, "missing remote path in URI");
- goto err;
- }
-
- qp = query_params_parse(uri->query);
- if (!qp) {
- error_setg(errp, "could not parse query parameters");
- goto err;
+ return -EINVAL;
}
- if(uri->user && strcmp(uri->user, "") != 0) {
- qdict_put_str(options, "user", uri->user);
+ uri_user = g_uri_get_user(uri);
+ if (uri_user && !g_str_equal(uri_user, "")) {
+ qdict_put_str(options, "user", uri_user);
}
- qdict_put_str(options, "server.host", uri->server);
+ qdict_put_str(options, "server.host", uri_host);
- port_str = g_strdup_printf("%d", uri->port ?: 22);
+ port = g_uri_get_port(uri);
+ port_str = g_strdup_printf("%d", port > 0 ? port : 22);
qdict_put_str(options, "server.port", port_str);
g_free(port_str);
- qdict_put_str(options, "path", uri->path);
-
- /* Pick out any query parameters that we understand, and ignore
- * the rest.
- */
- for (i = 0; i < qp->n; ++i) {
- if (strcmp(qp->p[i].name, "host_key_check") == 0) {
- qdict_put_str(options, "host_key_check", qp->p[i].value);
+ qdict_put_str(options, "path", uri_path);
+
+ uri_query = g_uri_get_query(uri);
+ if (uri_query) {
+ g_uri_params_iter_init(&qp, uri_query, -1, "&", G_URI_PARAMS_NONE);
+ while (g_uri_params_iter_next(&qp, &qp_name, &qp_value, &gerror)) {
+ if (!qp_name || !qp_value || gerror) {
+ warn_report("Failed to parse SSH URI parameters '%s'",
+ uri_query);
+ break;
+ }
+ /*
+ * Pick out the query parameters that we understand, and ignore
+ * (or rather warn about) the rest.
+ */
+ if (g_str_equal(qp_name, "host_key_check")) {
+ qdict_put_str(options, "host_key_check", qp_value);
+ } else {
+ warn_report("Unsupported parameter '%s' in URI", qp_name);
+ }
}
}
- query_params_free(qp);
- uri_free(uri);
return 0;
-
- err:
- uri_free(uri);
- return -EINVAL;
}
static bool ssh_has_filename_options_conflict(QDict *options, Error **errp)
--
2.45.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PULL 11/11] util/uri: Remove the old URI parsing code
2024-05-14 12:51 [PULL 00/11] gitlab CI fix and glib update Thomas Huth
` (9 preceding siblings ...)
2024-05-14 12:51 ` [PULL 10/11] block/ssh: " Thomas Huth
@ 2024-05-14 12:51 ` Thomas Huth
2024-05-15 6:51 ` [PULL 00/11] gitlab CI fix and glib update Richard Henderson
2024-05-15 10:39 ` Daniel P. Berrangé
12 siblings, 0 replies; 15+ messages in thread
From: Thomas Huth @ 2024-05-14 12:51 UTC (permalink / raw)
To: qemu-devel, Richard Henderson
Now that we switched all consumers of the URI code to use the URI
parsing functions from glib instead, we can remove our internal
URI parsing code since it is not used anymore.
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-ID: <20240418101056.302103-14-thuth@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
include/qemu/uri.h | 99 ---
util/uri.c | 1466 --------------------------------------------
util/meson.build | 2 +-
3 files changed, 1 insertion(+), 1566 deletions(-)
delete mode 100644 include/qemu/uri.h
delete mode 100644 util/uri.c
diff --git a/include/qemu/uri.h b/include/qemu/uri.h
deleted file mode 100644
index 255e61f452..0000000000
--- a/include/qemu/uri.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- * Summary: library of generic URI related routines
- * Description: library of generic URI related routines
- * Implements RFC 2396
- *
- * Copyright (C) 1998-2003 Daniel Veillard. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of Daniel Veillard shall not
- * be used in advertising or otherwise to promote the sale, use or other
- * dealings in this Software without prior written authorization from him.
- *
- * Author: Daniel Veillard
- **
- * Copyright (C) 2007 Red Hat, Inc.
- *
- * 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 <https://www.gnu.org/licenses/>.
- *
- * Authors:
- * Richard W.M. Jones <rjones@redhat.com>
- *
- * Utility functions to help parse and assemble query strings.
- */
-
-#ifndef QEMU_URI_H
-#define QEMU_URI_H
-
-/**
- * URI:
- *
- * A parsed URI reference. This is a struct containing the various fields
- * as described in RFC 2396 but separated for further processing.
- */
-typedef struct URI {
- char *scheme; /* the URI scheme */
- char *opaque; /* opaque part */
- char *authority; /* the authority part */
- char *server; /* the server part */
- char *user; /* the user part */
- int port; /* the port number */
- char *path; /* the path string */
- char *fragment; /* the fragment identifier */
- int cleanup; /* parsing potentially unclean URI */
- char *query; /* the query string (as it appears in the URI) */
-} URI;
-
-URI *uri_new(void);
-URI *uri_parse(const char *str);
-URI *uri_parse_raw(const char *str, int raw);
-int uri_parse_into(URI *uri, const char *str);
-char *uri_to_string(URI *uri);
-void uri_free(URI *uri);
-
-/* Single web service query parameter 'name=value'. */
-typedef struct QueryParam {
- char *name; /* Name (unescaped). */
- char *value; /* Value (unescaped). */
- int ignore; /* Ignore this field in qparam_get_query */
-} QueryParam;
-
-/* Set of parameters. */
-typedef struct QueryParams {
- int n; /* number of parameters used */
- int alloc; /* allocated space */
- QueryParam *p; /* array of parameters */
-} QueryParams;
-
-QueryParams *query_params_new(int init_alloc);
-QueryParams *query_params_parse(const char *query);
-void query_params_free(QueryParams *ps);
-
-#endif /* QEMU_URI_H */
diff --git a/util/uri.c b/util/uri.c
deleted file mode 100644
index 573174bf47..0000000000
--- a/util/uri.c
+++ /dev/null
@@ -1,1466 +0,0 @@
-/**
- * uri.c: set of generic URI related routines
- *
- * Reference: RFCs 3986, 2732 and 2373
- *
- * Copyright (C) 1998-2003 Daniel Veillard. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of Daniel Veillard shall not
- * be used in advertising or otherwise to promote the sale, use or other
- * dealings in this Software without prior written authorization from him.
- *
- * daniel@veillard.com
- *
- **
- *
- * Copyright (C) 2007, 2009-2010 Red Hat, Inc.
- *
- * 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 <https://www.gnu.org/licenses/>.
- *
- * Authors:
- * Richard W.M. Jones <rjones@redhat.com>
- *
- */
-
-#include "qemu/osdep.h"
-#include "qemu/cutils.h"
-
-#include "qemu/uri.h"
-
-static void uri_clean(URI *uri);
-
-/*
- * Old rule from 2396 used in legacy handling code
- * alpha = lowalpha | upalpha
- */
-#define IS_ALPHA(x) (IS_LOWALPHA(x) || IS_UPALPHA(x))
-
-/*
- * lowalpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" |
- * "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" |
- * "u" | "v" | "w" | "x" | "y" | "z"
- */
-
-#define IS_LOWALPHA(x) (((x) >= 'a') && ((x) <= 'z'))
-
-/*
- * upalpha = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" |
- * "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" |
- * "U" | "V" | "W" | "X" | "Y" | "Z"
- */
-#define IS_UPALPHA(x) (((x) >= 'A') && ((x) <= 'Z'))
-
-#ifdef IS_DIGIT
-#undef IS_DIGIT
-#endif
-/*
- * digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
- */
-#define IS_DIGIT(x) (((x) >= '0') && ((x) <= '9'))
-
-/*
- * alphanum = alpha | digit
- */
-
-#define IS_ALPHANUM(x) (IS_ALPHA(x) || IS_DIGIT(x))
-
-/*
- * mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
- */
-
-#define IS_MARK(x) (((x) == '-') || ((x) == '_') || ((x) == '.') || \
- ((x) == '!') || ((x) == '~') || ((x) == '*') || ((x) == '\'') || \
- ((x) == '(') || ((x) == ')'))
-
-/*
- * unwise = "{" | "}" | "|" | "\" | "^" | "`"
- */
-
-#define IS_UNWISE(p) \
- (((*(p) == '{')) || ((*(p) == '}')) || ((*(p) == '|')) || \
- ((*(p) == '\\')) || ((*(p) == '^')) || ((*(p) == '[')) || \
- ((*(p) == ']')) || ((*(p) == '`')))
-/*
- * reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," |
- * "[" | "]"
- */
-
-#define IS_RESERVED(x) (((x) == ';') || ((x) == '/') || ((x) == '?') || \
- ((x) == ':') || ((x) == '@') || ((x) == '&') || ((x) == '=') || \
- ((x) == '+') || ((x) == '$') || ((x) == ',') || ((x) == '[') || \
- ((x) == ']'))
-
-/*
- * unreserved = alphanum | mark
- */
-
-#define IS_UNRESERVED(x) (IS_ALPHANUM(x) || IS_MARK(x))
-
-/*
- * Skip to next pointer char, handle escaped sequences
- */
-
-#define NEXT(p) ((*p == '%') ? p += 3 : p++)
-
-/*
- * Productions from the spec.
- *
- * authority = server | reg_name
- * reg_name = 1*( unreserved | escaped | "$" | "," |
- * ";" | ":" | "@" | "&" | "=" | "+" )
- *
- * path = [ abs_path | opaque_part ]
- */
-
-/************************************************************************
- * *
- * RFC 3986 parser *
- * *
- ************************************************************************/
-
-#define ISA_DIGIT(p) ((*(p) >= '0') && (*(p) <= '9'))
-#define ISA_ALPHA(p) (((*(p) >= 'a') && (*(p) <= 'z')) || \
- ((*(p) >= 'A') && (*(p) <= 'Z')))
-#define ISA_HEXDIG(p) \
- (ISA_DIGIT(p) || ((*(p) >= 'a') && (*(p) <= 'f')) || \
- ((*(p) >= 'A') && (*(p) <= 'F')))
-
-/*
- * sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
- * / "*" / "+" / "," / ";" / "="
- */
-#define ISA_SUB_DELIM(p) \
- (((*(p) == '!')) || ((*(p) == '$')) || ((*(p) == '&')) || \
- ((*(p) == '(')) || ((*(p) == ')')) || ((*(p) == '*')) || \
- ((*(p) == '+')) || ((*(p) == ',')) || ((*(p) == ';')) || \
- ((*(p) == '=')) || ((*(p) == '\'')))
-
-/*
- * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
- */
-#define ISA_UNRESERVED(p) \
- ((ISA_ALPHA(p)) || (ISA_DIGIT(p)) || ((*(p) == '-')) || \
- ((*(p) == '.')) || ((*(p) == '_')) || ((*(p) == '~')))
-
-/*
- * pct-encoded = "%" HEXDIG HEXDIG
- */
-#define ISA_PCT_ENCODED(p) \
- ((*(p) == '%') && (ISA_HEXDIG(p + 1)) && (ISA_HEXDIG(p + 2)))
-
-/*
- * pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
- */
-#define ISA_PCHAR(p) \
- (ISA_UNRESERVED(p) || ISA_PCT_ENCODED(p) || ISA_SUB_DELIM(p) || \
- ((*(p) == ':')) || ((*(p) == '@')))
-
-/**
- * rfc3986_parse_scheme:
- * @uri: pointer to an URI structure
- * @str: pointer to the string to analyze
- *
- * Parse an URI scheme
- *
- * ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse_scheme(URI *uri, const char **str)
-{
- const char *cur;
-
- if (str == NULL) {
- return -1;
- }
-
- cur = *str;
- if (!ISA_ALPHA(cur)) {
- return 2;
- }
- cur++;
- while (ISA_ALPHA(cur) || ISA_DIGIT(cur) || (*cur == '+') || (*cur == '-') ||
- (*cur == '.')) {
- cur++;
- }
- if (uri != NULL) {
- g_free(uri->scheme);
- uri->scheme = g_strndup(*str, cur - *str);
- }
- *str = cur;
- return 0;
-}
-
-/**
- * rfc3986_parse_fragment:
- * @uri: pointer to an URI structure
- * @str: pointer to the string to analyze
- *
- * Parse the query part of an URI
- *
- * fragment = *( pchar / "/" / "?" )
- * NOTE: the strict syntax as defined by 3986 does not allow '[' and ']'
- * in the fragment identifier but this is used very broadly for
- * xpointer scheme selection, so we are allowing it here to not break
- * for example all the DocBook processing chains.
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse_fragment(URI *uri, const char **str)
-{
- const char *cur;
-
- if (str == NULL) {
- return -1;
- }
-
- cur = *str;
-
- while ((ISA_PCHAR(cur)) || (*cur == '/') || (*cur == '?') ||
- (*cur == '[') || (*cur == ']') ||
- ((uri != NULL) && (uri->cleanup & 1) && (IS_UNWISE(cur)))) {
- NEXT(cur);
- }
- if (uri != NULL) {
- g_free(uri->fragment);
- if (uri->cleanup & 2) {
- uri->fragment = g_strndup(*str, cur - *str);
- } else {
- uri->fragment = g_uri_unescape_segment(*str, cur, NULL);
- }
- }
- *str = cur;
- return 0;
-}
-
-/**
- * rfc3986_parse_query:
- * @uri: pointer to an URI structure
- * @str: pointer to the string to analyze
- *
- * Parse the query part of an URI
- *
- * query = *uric
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse_query(URI *uri, const char **str)
-{
- const char *cur;
-
- if (str == NULL) {
- return -1;
- }
-
- cur = *str;
-
- while ((ISA_PCHAR(cur)) || (*cur == '/') || (*cur == '?') ||
- ((uri != NULL) && (uri->cleanup & 1) && (IS_UNWISE(cur)))) {
- NEXT(cur);
- }
- if (uri != NULL) {
- g_free(uri->query);
- uri->query = g_strndup(*str, cur - *str);
- }
- *str = cur;
- return 0;
-}
-
-/**
- * rfc3986_parse_port:
- * @uri: pointer to an URI structure
- * @str: the string to analyze
- *
- * Parse a port part and fills in the appropriate fields
- * of the @uri structure
- *
- * port = *DIGIT
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse_port(URI *uri, const char **str)
-{
- const char *cur = *str;
- int port = 0;
-
- if (ISA_DIGIT(cur)) {
- while (ISA_DIGIT(cur)) {
- port = port * 10 + (*cur - '0');
- if (port > 65535) {
- return 1;
- }
- cur++;
- }
- if (uri) {
- uri->port = port;
- }
- *str = cur;
- return 0;
- }
- return 1;
-}
-
-/**
- * rfc3986_parse_user_info:
- * @uri: pointer to an URI structure
- * @str: the string to analyze
- *
- * Parse a user information part and fill in the appropriate fields
- * of the @uri structure
- *
- * userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse_user_info(URI *uri, const char **str)
-{
- const char *cur;
-
- cur = *str;
- while (ISA_UNRESERVED(cur) || ISA_PCT_ENCODED(cur) || ISA_SUB_DELIM(cur) ||
- (*cur == ':')) {
- NEXT(cur);
- }
- if (*cur == '@') {
- if (uri != NULL) {
- g_free(uri->user);
- if (uri->cleanup & 2) {
- uri->user = g_strndup(*str, cur - *str);
- } else {
- uri->user = g_uri_unescape_segment(*str, cur, NULL);
- }
- }
- *str = cur;
- return 0;
- }
- return 1;
-}
-
-/**
- * rfc3986_parse_dec_octet:
- * @str: the string to analyze
- *
- * dec-octet = DIGIT ; 0-9
- * / %x31-39 DIGIT ; 10-99
- * / "1" 2DIGIT ; 100-199
- * / "2" %x30-34 DIGIT ; 200-249
- * / "25" %x30-35 ; 250-255
- *
- * Skip a dec-octet.
- *
- * Returns 0 if found and skipped, 1 otherwise
- */
-static int rfc3986_parse_dec_octet(const char **str)
-{
- const char *cur = *str;
-
- if (!(ISA_DIGIT(cur))) {
- return 1;
- }
- if (!ISA_DIGIT(cur + 1)) {
- cur++;
- } else if ((*cur != '0') && (ISA_DIGIT(cur + 1)) && (!ISA_DIGIT(cur + 2))) {
- cur += 2;
- } else if ((*cur == '1') && (ISA_DIGIT(cur + 1)) && (ISA_DIGIT(cur + 2))) {
- cur += 3;
- } else if ((*cur == '2') && (*(cur + 1) >= '0') && (*(cur + 1) <= '4') &&
- (ISA_DIGIT(cur + 2))) {
- cur += 3;
- } else if ((*cur == '2') && (*(cur + 1) == '5') && (*(cur + 2) >= '0') &&
- (*(cur + 1) <= '5')) {
- cur += 3;
- } else {
- return 1;
- }
- *str = cur;
- return 0;
-}
-/**
- * rfc3986_parse_host:
- * @uri: pointer to an URI structure
- * @str: the string to analyze
- *
- * Parse an host part and fills in the appropriate fields
- * of the @uri structure
- *
- * host = IP-literal / IPv4address / reg-name
- * IP-literal = "[" ( IPv6address / IPvFuture ) "]"
- * IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
- * reg-name = *( unreserved / pct-encoded / sub-delims )
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse_host(URI *uri, const char **str)
-{
- const char *cur = *str;
- const char *host;
-
- host = cur;
- /*
- * IPv6 and future addressing scheme are enclosed between brackets
- */
- if (*cur == '[') {
- cur++;
- while ((*cur != ']') && (*cur != 0)) {
- cur++;
- }
- if (*cur != ']') {
- return 1;
- }
- cur++;
- goto found;
- }
- /*
- * try to parse an IPv4
- */
- if (ISA_DIGIT(cur)) {
- if (rfc3986_parse_dec_octet(&cur) != 0) {
- goto not_ipv4;
- }
- if (*cur != '.') {
- goto not_ipv4;
- }
- cur++;
- if (rfc3986_parse_dec_octet(&cur) != 0) {
- goto not_ipv4;
- }
- if (*cur != '.') {
- goto not_ipv4;
- }
- if (rfc3986_parse_dec_octet(&cur) != 0) {
- goto not_ipv4;
- }
- if (*cur != '.') {
- goto not_ipv4;
- }
- if (rfc3986_parse_dec_octet(&cur) != 0) {
- goto not_ipv4;
- }
- goto found;
- not_ipv4:
- cur = *str;
- }
- /*
- * then this should be a hostname which can be empty
- */
- while (ISA_UNRESERVED(cur) || ISA_PCT_ENCODED(cur) || ISA_SUB_DELIM(cur)) {
- NEXT(cur);
- }
-found:
- if (uri != NULL) {
- g_free(uri->authority);
- uri->authority = NULL;
- g_free(uri->server);
- if (cur != host) {
- if (uri->cleanup & 2) {
- uri->server = g_strndup(host, cur - host);
- } else {
- uri->server = g_uri_unescape_segment(host, cur, NULL);
- }
- } else {
- uri->server = NULL;
- }
- }
- *str = cur;
- return 0;
-}
-
-/**
- * rfc3986_parse_authority:
- * @uri: pointer to an URI structure
- * @str: the string to analyze
- *
- * Parse an authority part and fills in the appropriate fields
- * of the @uri structure
- *
- * authority = [ userinfo "@" ] host [ ":" port ]
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse_authority(URI *uri, const char **str)
-{
- const char *cur;
- int ret;
-
- cur = *str;
- /*
- * try to parse a userinfo and check for the trailing @
- */
- ret = rfc3986_parse_user_info(uri, &cur);
- if ((ret != 0) || (*cur != '@')) {
- cur = *str;
- } else {
- cur++;
- }
- ret = rfc3986_parse_host(uri, &cur);
- if (ret != 0) {
- return ret;
- }
- if (*cur == ':') {
- cur++;
- ret = rfc3986_parse_port(uri, &cur);
- if (ret != 0) {
- return ret;
- }
- }
- *str = cur;
- return 0;
-}
-
-/**
- * rfc3986_parse_segment:
- * @str: the string to analyze
- * @forbid: an optional forbidden character
- * @empty: allow an empty segment
- *
- * Parse a segment and fills in the appropriate fields
- * of the @uri structure
- *
- * segment = *pchar
- * segment-nz = 1*pchar
- * segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
- * ; non-zero-length segment without any colon ":"
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse_segment(const char **str, char forbid, int empty)
-{
- const char *cur;
-
- cur = *str;
- if (!ISA_PCHAR(cur)) {
- if (empty) {
- return 0;
- }
- return 1;
- }
- while (ISA_PCHAR(cur) && (*cur != forbid)) {
- NEXT(cur);
- }
- *str = cur;
- return 0;
-}
-
-/**
- * rfc3986_parse_path_ab_empty:
- * @uri: pointer to an URI structure
- * @str: the string to analyze
- *
- * Parse an path absolute or empty and fills in the appropriate fields
- * of the @uri structure
- *
- * path-abempty = *( "/" segment )
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse_path_ab_empty(URI *uri, const char **str)
-{
- const char *cur;
- int ret;
-
- cur = *str;
-
- while (*cur == '/') {
- cur++;
- ret = rfc3986_parse_segment(&cur, 0, 1);
- if (ret != 0) {
- return ret;
- }
- }
- if (uri != NULL) {
- g_free(uri->path);
- if (*str != cur) {
- if (uri->cleanup & 2) {
- uri->path = g_strndup(*str, cur - *str);
- } else {
- uri->path = g_uri_unescape_segment(*str, cur, NULL);
- }
- } else {
- uri->path = NULL;
- }
- }
- *str = cur;
- return 0;
-}
-
-/**
- * rfc3986_parse_path_absolute:
- * @uri: pointer to an URI structure
- * @str: the string to analyze
- *
- * Parse an path absolute and fills in the appropriate fields
- * of the @uri structure
- *
- * path-absolute = "/" [ segment-nz *( "/" segment ) ]
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse_path_absolute(URI *uri, const char **str)
-{
- const char *cur;
- int ret;
-
- cur = *str;
-
- if (*cur != '/') {
- return 1;
- }
- cur++;
- ret = rfc3986_parse_segment(&cur, 0, 0);
- if (ret == 0) {
- while (*cur == '/') {
- cur++;
- ret = rfc3986_parse_segment(&cur, 0, 1);
- if (ret != 0) {
- return ret;
- }
- }
- }
- if (uri != NULL) {
- g_free(uri->path);
- if (cur != *str) {
- if (uri->cleanup & 2) {
- uri->path = g_strndup(*str, cur - *str);
- } else {
- uri->path = g_uri_unescape_segment(*str, cur, NULL);
- }
- } else {
- uri->path = NULL;
- }
- }
- *str = cur;
- return 0;
-}
-
-/**
- * rfc3986_parse_path_rootless:
- * @uri: pointer to an URI structure
- * @str: the string to analyze
- *
- * Parse an path without root and fills in the appropriate fields
- * of the @uri structure
- *
- * path-rootless = segment-nz *( "/" segment )
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse_path_rootless(URI *uri, const char **str)
-{
- const char *cur;
- int ret;
-
- cur = *str;
-
- ret = rfc3986_parse_segment(&cur, 0, 0);
- if (ret != 0) {
- return ret;
- }
- while (*cur == '/') {
- cur++;
- ret = rfc3986_parse_segment(&cur, 0, 1);
- if (ret != 0) {
- return ret;
- }
- }
- if (uri != NULL) {
- g_free(uri->path);
- if (cur != *str) {
- if (uri->cleanup & 2) {
- uri->path = g_strndup(*str, cur - *str);
- } else {
- uri->path = g_uri_unescape_segment(*str, cur, NULL);
- }
- } else {
- uri->path = NULL;
- }
- }
- *str = cur;
- return 0;
-}
-
-/**
- * rfc3986_parse_path_no_scheme:
- * @uri: pointer to an URI structure
- * @str: the string to analyze
- *
- * Parse an path which is not a scheme and fills in the appropriate fields
- * of the @uri structure
- *
- * path-noscheme = segment-nz-nc *( "/" segment )
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse_path_no_scheme(URI *uri, const char **str)
-{
- const char *cur;
- int ret;
-
- cur = *str;
-
- ret = rfc3986_parse_segment(&cur, ':', 0);
- if (ret != 0) {
- return ret;
- }
- while (*cur == '/') {
- cur++;
- ret = rfc3986_parse_segment(&cur, 0, 1);
- if (ret != 0) {
- return ret;
- }
- }
- if (uri != NULL) {
- g_free(uri->path);
- if (cur != *str) {
- if (uri->cleanup & 2) {
- uri->path = g_strndup(*str, cur - *str);
- } else {
- uri->path = g_uri_unescape_segment(*str, cur, NULL);
- }
- } else {
- uri->path = NULL;
- }
- }
- *str = cur;
- return 0;
-}
-
-/**
- * rfc3986_parse_hier_part:
- * @uri: pointer to an URI structure
- * @str: the string to analyze
- *
- * Parse an hierarchical part and fills in the appropriate fields
- * of the @uri structure
- *
- * hier-part = "//" authority path-abempty
- * / path-absolute
- * / path-rootless
- * / path-empty
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse_hier_part(URI *uri, const char **str)
-{
- const char *cur;
- int ret;
-
- cur = *str;
-
- if ((*cur == '/') && (*(cur + 1) == '/')) {
- cur += 2;
- ret = rfc3986_parse_authority(uri, &cur);
- if (ret != 0) {
- return ret;
- }
- ret = rfc3986_parse_path_ab_empty(uri, &cur);
- if (ret != 0) {
- return ret;
- }
- *str = cur;
- return 0;
- } else if (*cur == '/') {
- ret = rfc3986_parse_path_absolute(uri, &cur);
- if (ret != 0) {
- return ret;
- }
- } else if (ISA_PCHAR(cur)) {
- ret = rfc3986_parse_path_rootless(uri, &cur);
- if (ret != 0) {
- return ret;
- }
- } else {
- /* path-empty is effectively empty */
- if (uri != NULL) {
- g_free(uri->path);
- uri->path = NULL;
- }
- }
- *str = cur;
- return 0;
-}
-
-/**
- * rfc3986_parse_relative_ref:
- * @uri: pointer to an URI structure
- * @str: the string to analyze
- *
- * Parse an URI string and fills in the appropriate fields
- * of the @uri structure
- *
- * relative-ref = relative-part [ "?" query ] [ "#" fragment ]
- * relative-part = "//" authority path-abempty
- * / path-absolute
- * / path-noscheme
- * / path-empty
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse_relative_ref(URI *uri, const char *str)
-{
- int ret;
-
- if ((*str == '/') && (*(str + 1) == '/')) {
- str += 2;
- ret = rfc3986_parse_authority(uri, &str);
- if (ret != 0) {
- return ret;
- }
- ret = rfc3986_parse_path_ab_empty(uri, &str);
- if (ret != 0) {
- return ret;
- }
- } else if (*str == '/') {
- ret = rfc3986_parse_path_absolute(uri, &str);
- if (ret != 0) {
- return ret;
- }
- } else if (ISA_PCHAR(str)) {
- ret = rfc3986_parse_path_no_scheme(uri, &str);
- if (ret != 0) {
- return ret;
- }
- } else {
- /* path-empty is effectively empty */
- if (uri != NULL) {
- g_free(uri->path);
- uri->path = NULL;
- }
- }
-
- if (*str == '?') {
- str++;
- ret = rfc3986_parse_query(uri, &str);
- if (ret != 0) {
- return ret;
- }
- }
- if (*str == '#') {
- str++;
- ret = rfc3986_parse_fragment(uri, &str);
- if (ret != 0) {
- return ret;
- }
- }
- if (*str != 0) {
- uri_clean(uri);
- return 1;
- }
- return 0;
-}
-
-/**
- * rfc3986_parse:
- * @uri: pointer to an URI structure
- * @str: the string to analyze
- *
- * Parse an URI string and fills in the appropriate fields
- * of the @uri structure
- *
- * scheme ":" hier-part [ "?" query ] [ "#" fragment ]
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse(URI *uri, const char *str)
-{
- int ret;
-
- ret = rfc3986_parse_scheme(uri, &str);
- if (ret != 0) {
- return ret;
- }
- if (*str != ':') {
- return 1;
- }
- str++;
- ret = rfc3986_parse_hier_part(uri, &str);
- if (ret != 0) {
- return ret;
- }
- if (*str == '?') {
- str++;
- ret = rfc3986_parse_query(uri, &str);
- if (ret != 0) {
- return ret;
- }
- }
- if (*str == '#') {
- str++;
- ret = rfc3986_parse_fragment(uri, &str);
- if (ret != 0) {
- return ret;
- }
- }
- if (*str != 0) {
- uri_clean(uri);
- return 1;
- }
- return 0;
-}
-
-/**
- * rfc3986_parse_uri_reference:
- * @uri: pointer to an URI structure
- * @str: the string to analyze
- *
- * Parse an URI reference string and fills in the appropriate fields
- * of the @uri structure
- *
- * URI-reference = URI / relative-ref
- *
- * Returns 0 or the error code
- */
-static int rfc3986_parse_uri_reference(URI *uri, const char *str)
-{
- int ret;
-
- if (str == NULL) {
- return -1;
- }
- uri_clean(uri);
-
- /*
- * Try first to parse absolute refs, then fallback to relative if
- * it fails.
- */
- ret = rfc3986_parse(uri, str);
- if (ret != 0) {
- uri_clean(uri);
- ret = rfc3986_parse_relative_ref(uri, str);
- if (ret != 0) {
- uri_clean(uri);
- return ret;
- }
- }
- return 0;
-}
-
-/**
- * uri_parse:
- * @str: the URI string to analyze
- *
- * Parse an URI based on RFC 3986
- *
- * URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
- *
- * Returns a newly built URI or NULL in case of error
- */
-URI *uri_parse(const char *str)
-{
- URI *uri;
- int ret;
-
- if (str == NULL) {
- return NULL;
- }
- uri = uri_new();
- ret = rfc3986_parse_uri_reference(uri, str);
- if (ret) {
- uri_free(uri);
- return NULL;
- }
- return uri;
-}
-
-/**
- * uri_parse_into:
- * @uri: pointer to an URI structure
- * @str: the string to analyze
- *
- * Parse an URI reference string based on RFC 3986 and fills in the
- * appropriate fields of the @uri structure
- *
- * URI-reference = URI / relative-ref
- *
- * Returns 0 or the error code
- */
-int uri_parse_into(URI *uri, const char *str)
-{
- return rfc3986_parse_uri_reference(uri, str);
-}
-
-/**
- * uri_parse_raw:
- * @str: the URI string to analyze
- * @raw: if 1 unescaping of URI pieces are disabled
- *
- * Parse an URI but allows to keep intact the original fragments.
- *
- * URI-reference = URI / relative-ref
- *
- * Returns a newly built URI or NULL in case of error
- */
-URI *uri_parse_raw(const char *str, int raw)
-{
- URI *uri;
- int ret;
-
- if (str == NULL) {
- return NULL;
- }
- uri = uri_new();
- if (raw) {
- uri->cleanup |= 2;
- }
- ret = uri_parse_into(uri, str);
- if (ret) {
- uri_free(uri);
- return NULL;
- }
- return uri;
-}
-
-/************************************************************************
- * *
- * Generic URI structure functions *
- * *
- ************************************************************************/
-
-/**
- * uri_new:
- *
- * Simply creates an empty URI
- *
- * Returns the new structure or NULL in case of error
- */
-URI *uri_new(void)
-{
- return g_new0(URI, 1);
-}
-
-/**
- * realloc2n:
- *
- * Function to handle properly a reallocation when saving an URI
- * Also imposes some limit on the length of an URI string output
- */
-static char *realloc2n(char *ret, int *max)
-{
- char *temp;
- int tmp;
-
- tmp = *max * 2;
- temp = g_realloc(ret, (tmp + 1));
- *max = tmp;
- return temp;
-}
-
-/**
- * uri_to_string:
- * @uri: pointer to an URI
- *
- * Save the URI as an escaped string
- *
- * Returns a new string (to be deallocated by caller)
- */
-char *uri_to_string(URI *uri)
-{
- char *ret = NULL;
- char *temp;
- const char *p;
- int len;
- int max;
-
- if (uri == NULL) {
- return NULL;
- }
-
- max = 80;
- ret = g_malloc(max + 1);
- len = 0;
-
- if (uri->scheme != NULL) {
- p = uri->scheme;
- while (*p != 0) {
- if (len >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- ret[len++] = *p++;
- }
- if (len >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- ret[len++] = ':';
- }
- if (uri->opaque != NULL) {
- p = uri->opaque;
- while (*p != 0) {
- if (len + 3 >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- if (IS_RESERVED(*(p)) || IS_UNRESERVED(*(p))) {
- ret[len++] = *p++;
- } else {
- int val = *(unsigned char *)p++;
- int hi = val / 0x10, lo = val % 0x10;
- ret[len++] = '%';
- ret[len++] = hi + (hi > 9 ? 'A' - 10 : '0');
- ret[len++] = lo + (lo > 9 ? 'A' - 10 : '0');
- }
- }
- } else {
- if (uri->server != NULL) {
- if (len + 3 >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- ret[len++] = '/';
- ret[len++] = '/';
- if (uri->user != NULL) {
- p = uri->user;
- while (*p != 0) {
- if (len + 3 >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- if ((IS_UNRESERVED(*(p))) || ((*(p) == ';')) ||
- ((*(p) == ':')) || ((*(p) == '&')) || ((*(p) == '=')) ||
- ((*(p) == '+')) || ((*(p) == '$')) || ((*(p) == ','))) {
- ret[len++] = *p++;
- } else {
- int val = *(unsigned char *)p++;
- int hi = val / 0x10, lo = val % 0x10;
- ret[len++] = '%';
- ret[len++] = hi + (hi > 9 ? 'A' - 10 : '0');
- ret[len++] = lo + (lo > 9 ? 'A' - 10 : '0');
- }
- }
- if (len + 3 >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- ret[len++] = '@';
- }
- p = uri->server;
- while (*p != 0) {
- if (len >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- ret[len++] = *p++;
- }
- if (uri->port > 0) {
- if (len + 10 >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- len += snprintf(&ret[len], max - len, ":%d", uri->port);
- }
- } else if (uri->authority != NULL) {
- if (len + 3 >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- ret[len++] = '/';
- ret[len++] = '/';
- p = uri->authority;
- while (*p != 0) {
- if (len + 3 >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- if ((IS_UNRESERVED(*(p))) || ((*(p) == '$')) ||
- ((*(p) == ',')) || ((*(p) == ';')) || ((*(p) == ':')) ||
- ((*(p) == '@')) || ((*(p) == '&')) || ((*(p) == '=')) ||
- ((*(p) == '+'))) {
- ret[len++] = *p++;
- } else {
- int val = *(unsigned char *)p++;
- int hi = val / 0x10, lo = val % 0x10;
- ret[len++] = '%';
- ret[len++] = hi + (hi > 9 ? 'A' - 10 : '0');
- ret[len++] = lo + (lo > 9 ? 'A' - 10 : '0');
- }
- }
- } else if (uri->scheme != NULL) {
- if (len + 3 >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- ret[len++] = '/';
- ret[len++] = '/';
- }
- if (uri->path != NULL) {
- p = uri->path;
- /*
- * the colon in file:///d: should not be escaped or
- * Windows accesses fail later.
- */
- if ((uri->scheme != NULL) && (p[0] == '/') &&
- (((p[1] >= 'a') && (p[1] <= 'z')) ||
- ((p[1] >= 'A') && (p[1] <= 'Z'))) &&
- (p[2] == ':') && (!strcmp(uri->scheme, "file"))) {
- if (len + 3 >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- ret[len++] = *p++;
- ret[len++] = *p++;
- ret[len++] = *p++;
- }
- while (*p != 0) {
- if (len + 3 >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- if ((IS_UNRESERVED(*(p))) || ((*(p) == '/')) ||
- ((*(p) == ';')) || ((*(p) == '@')) || ((*(p) == '&')) ||
- ((*(p) == '=')) || ((*(p) == '+')) || ((*(p) == '$')) ||
- ((*(p) == ','))) {
- ret[len++] = *p++;
- } else {
- int val = *(unsigned char *)p++;
- int hi = val / 0x10, lo = val % 0x10;
- ret[len++] = '%';
- ret[len++] = hi + (hi > 9 ? 'A' - 10 : '0');
- ret[len++] = lo + (lo > 9 ? 'A' - 10 : '0');
- }
- }
- }
- if (uri->query != NULL) {
- if (len + 1 >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- ret[len++] = '?';
- p = uri->query;
- while (*p != 0) {
- if (len + 1 >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- ret[len++] = *p++;
- }
- }
- }
- if (uri->fragment != NULL) {
- if (len + 3 >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- ret[len++] = '#';
- p = uri->fragment;
- while (*p != 0) {
- if (len + 3 >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) {
- ret[len++] = *p++;
- } else {
- int val = *(unsigned char *)p++;
- int hi = val / 0x10, lo = val % 0x10;
- ret[len++] = '%';
- ret[len++] = hi + (hi > 9 ? 'A' - 10 : '0');
- ret[len++] = lo + (lo > 9 ? 'A' - 10 : '0');
- }
- }
- }
- if (len >= max) {
- temp = realloc2n(ret, &max);
- ret = temp;
- }
- ret[len] = 0;
- return ret;
-}
-
-/**
- * uri_clean:
- * @uri: pointer to an URI
- *
- * Make sure the URI struct is free of content
- */
-static void uri_clean(URI *uri)
-{
- if (uri == NULL) {
- return;
- }
-
- g_free(uri->scheme);
- uri->scheme = NULL;
- g_free(uri->server);
- uri->server = NULL;
- g_free(uri->user);
- uri->user = NULL;
- g_free(uri->path);
- uri->path = NULL;
- g_free(uri->fragment);
- uri->fragment = NULL;
- g_free(uri->opaque);
- uri->opaque = NULL;
- g_free(uri->authority);
- uri->authority = NULL;
- g_free(uri->query);
- uri->query = NULL;
-}
-
-/**
- * uri_free:
- * @uri: pointer to an URI, NULL is ignored
- *
- * Free up the URI struct
- */
-void uri_free(URI *uri)
-{
- uri_clean(uri);
- g_free(uri);
-}
-
-/************************************************************************
- * *
- * Public functions *
- * *
- ************************************************************************/
-
-/*
- * Utility functions to help parse and assemble query strings.
- */
-
-struct QueryParams *query_params_new(int init_alloc)
-{
- struct QueryParams *ps;
-
- if (init_alloc <= 0) {
- init_alloc = 1;
- }
-
- ps = g_new(QueryParams, 1);
- ps->n = 0;
- ps->alloc = init_alloc;
- ps->p = g_new(QueryParam, ps->alloc);
-
- return ps;
-}
-
-/* Ensure there is space to store at least one more parameter
- * at the end of the set.
- */
-static int query_params_append(struct QueryParams *ps, const char *name,
- const char *value)
-{
- if (ps->n >= ps->alloc) {
- ps->p = g_renew(QueryParam, ps->p, ps->alloc * 2);
- ps->alloc *= 2;
- }
-
- ps->p[ps->n].name = g_strdup(name);
- ps->p[ps->n].value = g_strdup(value);
- ps->p[ps->n].ignore = 0;
- ps->n++;
-
- return 0;
-}
-
-void query_params_free(struct QueryParams *ps)
-{
- int i;
-
- for (i = 0; i < ps->n; ++i) {
- g_free(ps->p[i].name);
- g_free(ps->p[i].value);
- }
- g_free(ps->p);
- g_free(ps);
-}
-
-struct QueryParams *query_params_parse(const char *query)
-{
- struct QueryParams *ps;
- const char *end, *eq;
-
- ps = query_params_new(0);
- if (!query || query[0] == '\0') {
- return ps;
- }
-
- while (*query) {
- char *name = NULL, *value = NULL;
-
- /* Find the next separator, or end of the string. */
- end = strchr(query, '&');
- if (!end) {
- end = qemu_strchrnul(query, ';');
- }
-
- /* Find the first '=' character between here and end. */
- eq = strchr(query, '=');
- if (eq && eq >= end) {
- eq = NULL;
- }
-
- /* Empty section (eg. "&&"). */
- if (end == query) {
- goto next;
- }
-
- /* If there is no '=' character, then we have just "name"
- * and consistent with CGI.pm we assume value is "".
- */
- else if (!eq) {
- name = g_uri_unescape_segment(query, end, NULL);
- value = NULL;
- }
- /* Or if we have "name=" here (works around annoying
- * problem when calling uri_string_unescape with len = 0).
- */
- else if (eq + 1 == end) {
- name = g_uri_unescape_segment(query, eq, NULL);
- value = g_new0(char, 1);
- }
- /* If the '=' character is at the beginning then we have
- * "=value" and consistent with CGI.pm we _ignore_ this.
- */
- else if (query == eq) {
- goto next;
- }
-
- /* Otherwise it's "name=value". */
- else {
- name = g_uri_unescape_segment(query, eq, NULL);
- value = g_uri_unescape_segment(eq + 1, end, NULL);
- }
-
- /* Append to the parameter set. */
- query_params_append(ps, name, value);
- g_free(name);
- g_free(value);
-
- next:
- query = end;
- if (*query) {
- query++; /* skip '&' separator */
- }
- }
-
- return ps;
-}
diff --git a/util/meson.build b/util/meson.build
index 2ad57b10ba..72b505df11 100644
--- a/util/meson.build
+++ b/util/meson.build
@@ -93,7 +93,7 @@ if have_block
util_ss.add(files('hbitmap.c'))
util_ss.add(files('hexdump.c'))
util_ss.add(files('iova-tree.c'))
- util_ss.add(files('iov.c', 'uri.c'))
+ util_ss.add(files('iov.c'))
util_ss.add(files('nvdimm-utils.c'))
util_ss.add(files('block-helpers.c'))
util_ss.add(files('qemu-coroutine-sleep.c'))
--
2.45.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PULL 00/11] gitlab CI fix and glib update
2024-05-14 12:51 [PULL 00/11] gitlab CI fix and glib update Thomas Huth
` (10 preceding siblings ...)
2024-05-14 12:51 ` [PULL 11/11] util/uri: Remove the old URI parsing code Thomas Huth
@ 2024-05-15 6:51 ` Richard Henderson
2024-05-15 10:39 ` Daniel P. Berrangé
12 siblings, 0 replies; 15+ messages in thread
From: Richard Henderson @ 2024-05-15 6:51 UTC (permalink / raw)
To: Thomas Huth, qemu-devel
On 5/14/24 14:51, Thomas Huth wrote:
> The following changes since commit 9360070196789cc8b9404b2efaf319384e64b107:
>
> Merge tag 'for-upstream' ofhttps://gitlab.com/bonzini/qemu into staging (2024-05-12 13:41:26 +0200)
>
> are available in the Git repository at:
>
> https://gitlab.com/thuth/qemu.git tags/pull-request-2024-05-14
>
> for you to fetch changes up to da79537e0c8cef007d30298343d05acb0ba8b427:
>
> util/uri: Remove the old URI parsing code (2024-05-14 12:46:46 +0200)
>
> ----------------------------------------------------------------
> * Fix the "tsan-build" CI job on the shared gitlab CI runners
> * Bump minimum glib version and use URI code from the newer glib
> * Fix error message from "configure" when C compiler is not working
Applied, thanks. Please update https://wiki.qemu.org/ChangeLog/9.1 as appropriate.
r~
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PULL 00/11] gitlab CI fix and glib update
2024-05-14 12:51 [PULL 00/11] gitlab CI fix and glib update Thomas Huth
` (11 preceding siblings ...)
2024-05-15 6:51 ` [PULL 00/11] gitlab CI fix and glib update Richard Henderson
@ 2024-05-15 10:39 ` Daniel P. Berrangé
2024-05-27 19:09 ` Michael Tokarev
12 siblings, 1 reply; 15+ messages in thread
From: Daniel P. Berrangé @ 2024-05-15 10:39 UTC (permalink / raw)
To: Michael Tokarev, qemu-stable; +Cc: qemu-devel, Richard Henderson, Thomas Huth
Hi Michael,
In this pull request, patches 2, 3 & 4 will be applicable to stable
to fix the tsan CI job which broke with the latest GitLab software
release.
On Tue, May 14, 2024 at 02:51:08PM +0200, Thomas Huth wrote:
> The following changes since commit 9360070196789cc8b9404b2efaf319384e64b107:
>
> Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging (2024-05-12 13:41:26 +0200)
>
> are available in the Git repository at:
>
> https://gitlab.com/thuth/qemu.git tags/pull-request-2024-05-14
>
> for you to fetch changes up to da79537e0c8cef007d30298343d05acb0ba8b427:
>
> util/uri: Remove the old URI parsing code (2024-05-14 12:46:46 +0200)
>
> ----------------------------------------------------------------
> * Fix the "tsan-build" CI job on the shared gitlab CI runners
> * Bump minimum glib version and use URI code from the newer glib
> * Fix error message from "configure" when C compiler is not working
>
> ----------------------------------------------------------------
> Daniel P. Berrangé (3):
> dockerfiles: add 'MAKE' env variable to remaining containers
> gitlab: use $MAKE instead of 'make'
> gitlab: use 'setarch -R' to workaround tsan bug
>
> Thomas Huth (8):
> configure: Fix error message when C compiler is not working
> Bump minimum glib version to v2.66
> Remove glib compatibility code that is not required anymore
> block/gluster: Use URI parsing code from glib
> block/nbd: Use URI parsing code from glib
> block/nfs: Use URI parsing code from glib
> block/ssh: Use URI parsing code from glib
> util/uri: Remove the old URI parsing code
>
> configure | 11 +-
> meson.build | 16 +-
> include/glib-compat.h | 27 +-
> include/qemu/uri.h | 99 --
> block/gluster.c | 69 +-
> block/nbd.c | 76 +-
> block/nfs.c | 110 +-
> block/ssh.c | 75 +-
> qga/commands-posix-ssh.c | 12 +-
> util/error-report.c | 10 -
> util/uri.c | 1466 --------------------
> .gitlab-ci.d/buildtest-template.yml | 6 +-
> .gitlab-ci.d/buildtest.yml | 3 +
> .../dockerfiles/debian-all-test-cross.docker | 1 +
> .../docker/dockerfiles/debian-hexagon-cross.docker | 1 +
> .../dockerfiles/debian-legacy-test-cross.docker | 1 +
> .../dockerfiles/debian-loongarch-cross.docker | 1 +
> .../docker/dockerfiles/debian-tricore-cross.docker | 1 +
> .../docker/dockerfiles/debian-xtensa-cross.docker | 1 +
> tests/docker/dockerfiles/fedora-cris-cross.docker | 1 +
> util/meson.build | 2 +-
> 21 files changed, 194 insertions(+), 1795 deletions(-)
> delete mode 100644 include/qemu/uri.h
> delete mode 100644 util/uri.c
>
>
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PULL 00/11] gitlab CI fix and glib update
2024-05-15 10:39 ` Daniel P. Berrangé
@ 2024-05-27 19:09 ` Michael Tokarev
0 siblings, 0 replies; 15+ messages in thread
From: Michael Tokarev @ 2024-05-27 19:09 UTC (permalink / raw)
To: Daniel P. Berrangé, qemu-stable
Cc: qemu-devel, Richard Henderson, Thomas Huth
15.05.2024 13:39, Daniel P. Berrangé пишет:
> Hi Michael,
>
> In this pull request, patches 2, 3 & 4 will be applicable to stable
> to fix the tsan CI job which broke with the latest GitLab software
> release.
These are:
bad7a2759c dockerfiles: add 'MAKE' env variable to remaining containers
c53f7a1078 gitlab: use $MAKE instead of 'make'
b563959b90 gitlab: use 'setarch -R' to workaround tsan bug
I picked these up for 8.2 and 9.0, but not to 7.2 (yet), since this one
needs more work.
If someone can tell me which changes are also needed for 7.2, I'm all ears :)
Thanks,
/mjt
--
GPG Key transition (from rsa2048 to rsa4096) since 2024-04-24.
New key: rsa4096/61AD3D98ECDF2C8E 9D8B E14E 3F2A 9DD7 9199 28F1 61AD 3D98 ECDF 2C8E
Old key: rsa2048/457CE0A0804465C5 6EE1 95D1 886E 8FFB 810D 4324 457C E0A0 8044 65C5
Transition statement: http://www.corpit.ru/mjt/gpg-transition-2024.txt
^ permalink raw reply [flat|nested] 15+ messages in thread