Enable building for ppc64le

This commit is contained in:
Eduard Abdullin 2025-04-18 02:11:07 +00:00 committed by root
commit 5ddf53b14c
17 changed files with 3351 additions and 98 deletions

View File

@ -0,0 +1,79 @@
From 1b27b7ed1a24030fc840123badf514e0a7b58341 Mon Sep 17 00:00:00 2001
From: Ricky Tigg <ricky.tigg@gmail.com>
Date: Fri, 4 Apr 2025 10:06:26 +0000
Subject: [PATCH] Translated using Weblate (Finnish)
Currently translated at 9.7% (94 of 960 strings)
Translation: libguestfs/libguestfs-master
Translate-URL: https://translate.fedoraproject.org/projects/libguestfs/libguestfs-master/fi/
---
po/fi.po | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/po/fi.po b/po/fi.po
index 27e511b4a..5c01bd861 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -6,10 +6,10 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.43.2\n"
-"Report-Msgid-Bugs-To: https://bugzilla.redhat.com/enter_bug.cgi?"
-"component=libguestfs&product=Virtualization+Tools\n"
+"Report-Msgid-Bugs-To: https://bugzilla.redhat.com/"
+"enter_bug.cgi?component=libguestfs&product=Virtualization+Tools\n"
"POT-Creation-Date: 2025-03-11 14:34+0000\n"
-"PO-Revision-Date: 2025-01-11 07:16+0000\n"
+"PO-Revision-Date: 2025-04-04 10:05+0000\n"
"Last-Translator: Ricky Tigg <ricky.tigg@gmail.com>\n"
"Language-Team: Finnish <https://translate.fedoraproject.org/projects/"
"libguestfs/libguestfs-master/fi/>\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.9.2\n"
+"X-Generator: Weblate 5.10.4\n"
#: common/options/config.c:72
#, c-format
@@ -453,7 +453,7 @@ msgstr ""
#: fish/cmds.c:540
msgid "upload base64-encoded data to file"
-msgstr ""
+msgstr "lataa ulospäin base64-koodatut tiedot tiedostoon"
#: fish/cmds.c:541
msgid "download file and encode as base64"
@@ -810,7 +810,7 @@ msgstr ""
#: fish/cmds.c:637
msgid "upload a file to the appliance (internal use only)"
-msgstr ""
+msgstr "lataa ulospäin tiedosto laitteeseen (vain sisäiseen käyttöön)"
#: fish/cmds.c:638
msgid "delete a previously registered event handler"
@@ -2440,7 +2440,7 @@ msgstr ""
#: fish/cmds.c:1150
msgid "upload a file from the local machine"
-msgstr ""
+msgstr "lataa ulospäin tiedosto paikalliselta koneelta"
#: fish/cmds.c:1151
msgid "upload a file from the local machine with offset"
@@ -2448,7 +2448,7 @@ msgstr ""
#: fish/cmds.c:1152
msgid "cancel the current upload or download operation"
-msgstr ""
+msgstr "peruuta nykyinen ulospäin-lataus- tai lataustoiminto"
#: fish/cmds.c:1153
msgid "set timestamp of a file with nanosecond precision"
--
2.47.1

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,43 @@
From abdec091c4e277515815c14fc3d02eec57e22dea Mon Sep 17 00:00:00 2001
From: Cole Robinson <crobinso@redhat.com>
Date: Wed, 9 Apr 2025 16:09:05 -0400
Subject: [PATCH] common: update submodule
Cole Robinson (2):
mltools: decouple and simplify osinfo device support checks
mlcustomize: disable `--inject-virtio-win osinfo`
Richard W.M. Jones (3):
mltools: Fix de-oUnit-ized tests
mltools: Unreference various objects
Revert "mltools: Unreference various objects"
And update customize docs to match
Signed-off-by: Cole Robinson <crobinso@redhat.com>
---
common | 2 +-
generator/customize.ml | 6 ------
2 files changed, 1 insertion(+), 7 deletions(-)
Submodule common 64f6ee85f..347b13716:
diff --git a/generator/customize.ml b/generator/customize.ml
index dc36afe70..fd6ebf588 100644
--- a/generator/customize.ml
+++ b/generator/customize.ml
@@ -341,12 +341,6 @@ The path to the ISO image containing the virtio-win drivers
The directory containing the unpacked virtio-win drivers
(eg. F</usr/share/virtio-win>).
-=item B<\"osinfo\">
-
-The literal string C<\"osinfo\"> means to use the
-libosinfo database to locate the drivers. (See
-L<osinfo-query(1)>.
-
=back
Note that to do a full conversion of a Windows guest from a
--
2.47.1

View File

@ -1,48 +0,0 @@
From a2bd2c18940c8779da87737c9811ca0b63e96dde Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 10 Mar 2025 18:52:08 +0000
Subject: [PATCH] lib: Print kernel utsname in debug output
Useful for debugging problems caused by the host kernel. In
particular we were looking at a problem with passt creating a user
namespace but didn't know what exact kernel was being used.
(cherry picked from commit 31fa712aa07190f2c5ed789712b92b4be2d51488)
---
lib/launch.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/lib/launch.c b/lib/launch.c
index ddf303a66..495b0c65d 100644
--- a/lib/launch.c
+++ b/lib/launch.c
@@ -36,6 +36,7 @@
#include <signal.h>
#include <sys/stat.h>
#include <sys/types.h>
+#include <sys/utsname.h>
#include <sys/wait.h>
#include <errno.h>
#include <assert.h>
@@ -93,6 +94,7 @@ guestfs_impl_launch (guestfs_h *g)
struct backend *b;
CLEANUP_FREE char *backend = guestfs_get_backend (g);
int mask;
+ struct utsname utsname;
debug (g, "launch: program=%s", g->program);
if (STRNEQ (g->identifier, ""))
@@ -109,6 +111,10 @@ guestfs_impl_launch (guestfs_h *g)
if (mask >= 0)
debug (g, "launch: umask=0%03o", (unsigned) mask);
debug (g, "launch: euid=%ju", (uintmax_t) geteuid ());
+ if (uname (&utsname) == 0)
+ debug (g, "launch: host: %s %s %s %s %s",
+ utsname.sysname, utsname.nodename, utsname.release,
+ utsname.version, utsname.machine);
}
/* Launch the appliance. */
--
2.47.1

View File

@ -1,32 +0,0 @@
From 02a4073c0a416d5a6c1592b4f3647750869acc28 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 11 Mar 2025 13:36:12 +0000
Subject: [PATCH] daemon: Fix loongarch64 detection on RHEL 9
$ rpm -q file
file-5.39-16.el9.x86_64
$ file ./test-data/binaries/bin-loongarch64-dynamic
./test-data/binaries/bin-loongarch64-dynamic: ELF 64-bit LSB pie executable, *unknown arch 0x102* version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-loongarch-lp64d.so.1, BuildID[sha1]=7622a1a70bf6e697851ac3790557e1ca686459b5, for GNU/Linux 5.19.0, stripped
Updates: commit 729d6d55ea84494f0398d02450bd29c39c55f0bd
(cherry picked from commit 4176b2043f6cf65f8f5f4f7d6fa39beb9c0a22c6)
---
daemon/filearch.ml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/daemon/filearch.ml b/daemon/filearch.ml
index 471b3bf5e..6eed7d396 100644
--- a/daemon/filearch.ml
+++ b/daemon/filearch.ml
@@ -100,6 +100,8 @@ and canonical_elf_arch bits endianness elf_arch =
)
else if substr "LoongArch" then
sprintf "loongarch%s" bits
+ else if substr "*unknown arch 0x102*" then (* file command on RHEL 9 *)
+ sprintf "loongarch%s" bits
else
elf_arch
--
2.47.1

View File

@ -0,0 +1,71 @@
From 2d1e8941301373d04a436333219358a72f9660f1 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 16 Apr 2025 10:01:33 +0100
Subject: [PATCH] daemon: inspect: Add some debugging of /usr merging
---
daemon/inspect.ml | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/daemon/inspect.ml b/daemon/inspect.ml
index e3b6d71a1..2c027b7c5 100644
--- a/daemon/inspect.ml
+++ b/daemon/inspect.ml
@@ -47,18 +47,21 @@ let rec inspect_os () =
* multiple filesystems. Gather all the inspected information in the
* inspect_fs struct of the root filesystem.
*)
+ eprintf "inspect_os: collect_coreos_inspection_info\n%!";
let fses = collect_coreos_inspection_info fses in
(* Check if the same filesystem was listed twice as root in fses.
* This may happen for the *BSD root partition where an MBR partition
* is a shadow of the real root partition probably /dev/sda5
*)
+ eprintf "inspect_os: check_for_duplicated_bsd_root\n%!";
let fses = check_for_duplicated_bsd_root fses in
(* For Linux guests with a separate /usr filesystem, merge some of the
* inspected information in that partition to the inspect_fs struct
* of the root filesystem.
*)
+ eprintf "inspect_os: collect_linux_inspection_info\n%!";
let fses = collect_linux_inspection_info fses in
(* Save what we found in a global variable. *)
@@ -194,6 +197,9 @@ and collect_linux_inspection_info fses =
* or other ways to identify the OS).
*)
and collect_linux_inspection_info_for fses root =
+ eprintf "inspect_os: collect_linux_inspection_info_for %s\n"
+ (string_of_location root.fs_location);
+
let root_fstab =
match root with
| { role = RoleRoot { fstab = f } } -> f
@@ -207,14 +213,21 @@ and collect_linux_inspection_info_for fses root =
(* This checks that this usr is found in the fstab of
* the root filesystem.
*)
+ eprintf "inspect_os: checking if %s found in fstab of this root\n"
+ (string_of_location usr_mp);
List.exists (
fun (mountable, _) ->
+ eprintf "inspect_os: collect_linux_inspection_info_for: \
+ compare %s = %s\n"
+ (Mountable.to_string usr_mp.mountable)
+ (Mountable.to_string mountable);
usr_mp.mountable = mountable
) root_fstab
| _ -> false
) fses in
- eprintf "collect_linux_inspection_info_for: merging:\n%sinto:\n%s"
+ eprintf "inspect_os: collect_linux_inspection_info_for: merging:\n\
+ %sinto:\n%s"
(string_of_fs usr) (string_of_fs root);
merge usr root;
root
--
2.47.1

View File

@ -0,0 +1,491 @@
From 0ff73a42c7f4f309fbab11ea2e89ee6f0501367d Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 16 Apr 2025 11:35:13 +0100
Subject: [PATCH] generator: Implement struct FDevice type
This acts just like FString except that we do reverse device name
translation on it. The only use is in the 'pvs-full' API where we
will use it (in a subsequent commit) to reverse translate the pv_name
field (a device name) before returning it from the daemon.
Compare this to the 'pvs' API which also returns a list of device
names, but using the generator's 'RStructList (RDevice,...)' return
type, where RDevice is similarly reverse translated.
Note in the library-side bindings, because the name has already been
translated in the daemon, we just treat it exactly the same as
FString. The vast majority of this patch is this mechanical change.
---
generator/GObject.ml | 6 +++---
generator/OCaml.ml | 6 ++----
generator/XDR.ml | 2 +-
generator/c.ml | 20 +++++++++-----------
generator/csharp.ml | 2 +-
generator/daemon.ml | 30 ++++++++++++++++++++++++++----
generator/erlang.ml | 2 +-
generator/golang.ml | 4 ++--
generator/java.ml | 7 ++++---
generator/lua.ml | 2 +-
generator/perl.ml | 4 ++--
generator/php.ml | 4 ++--
generator/python.ml | 2 +-
generator/ruby.ml | 4 ++--
generator/rust.ml | 6 +++---
generator/types.ml | 1 +
generator/types.mli | 1 +
17 files changed, 62 insertions(+), 41 deletions(-)
diff --git a/generator/GObject.ml b/generator/GObject.ml
index b89db690f..87c5b33bf 100644
--- a/generator/GObject.ml
+++ b/generator/GObject.ml
@@ -206,7 +206,7 @@ let generate_gobject_struct_header filename typ cols () =
pr " * @%s: An unsigned 64-bit integer\n" n
| n, FInt64 ->
pr " * @%s: A signed 64-bit integer\n" n
- | n, FString ->
+ | n, (FString|FDevice) ->
pr " * @%s: A NULL-terminated string\n" n
| n, FBuffer ->
pr " * @%s: A GByteArray\n" n
@@ -231,7 +231,7 @@ let generate_gobject_struct_header filename typ cols () =
pr " guint64 %s;\n" n
| n, FInt64 ->
pr " gint64 %s;\n" n
- | n, FString ->
+ | n, (FString|FDevice) ->
pr " gchar *%s;\n" n
| n, FBuffer ->
pr " GByteArray *%s;\n" n
@@ -1228,7 +1228,7 @@ guestfs_session_close (GuestfsSession *session, GError **err)
| n, FUUID ->
pr "%smemcpy (%s%s, %s%s, sizeof (%s%s));\n"
indent dst n src n dst n
- | n, FString ->
+ | n, (FString|FDevice) ->
pr "%sif (%s%s) %s%s = g_strdup (%s%s);\n"
indent src n dst n src n
| n, FBuffer ->
diff --git a/generator/OCaml.ml b/generator/OCaml.ml
index 66ed5e1ae..d4dfe9ed0 100644
--- a/generator/OCaml.ml
+++ b/generator/OCaml.ml
@@ -512,7 +512,7 @@ copy_table (char * const * argv)
List.iteri (
fun i col ->
(match col with
- | name, FString ->
+ | name, (FString|FDevice) ->
pr " v = caml_copy_string (%s->%s);\n" typ name
| name, FBuffer ->
pr " v = caml_alloc_initialized_string (%s->%s_len, %s->%s);\n"
@@ -839,9 +839,7 @@ and generate_ocaml_structure_decls () =
pr "type %s = {\n" typ;
List.iter (
function
- | name, FString -> pr " %s : string;\n" name
- | name, FBuffer -> pr " %s : string;\n" name
- | name, FUUID -> pr " %s : string;\n" name
+ | name, (FString|FDevice|FBuffer|FUUID) -> pr " %s : string;\n" name
| name, (FBytes|FInt64|FUInt64) -> pr " %s : int64;\n" name
| name, (FInt32|FUInt32) -> pr " %s : int32;\n" name
| name, FChar -> pr " %s : char;\n" name
diff --git a/generator/XDR.ml b/generator/XDR.ml
index c5444b501..431959819 100644
--- a/generator/XDR.ml
+++ b/generator/XDR.ml
@@ -66,7 +66,7 @@ let generate_xdr () =
pr "struct guestfs_int_%s {\n" typ;
List.iter (function
| name, FChar -> pr " char %s;\n" name
- | name, FString -> pr " string %s<>;\n" name
+ | name, (FString|FDevice) -> pr " string %s<>;\n" name
| name, FBuffer -> pr " opaque %s<>;\n" name
| name, FUUID -> pr " opaque %s[32];\n" name
| name, FInt32 -> pr " int %s;\n" name
diff --git a/generator/c.ml b/generator/c.ml
index a51031eff..c6e5dd994 100644
--- a/generator/c.ml
+++ b/generator/c.ml
@@ -352,7 +352,7 @@ and generate_structs_pod () =
| name, FInt32 -> pr " int32_t %s;\n" name
| name, (FUInt64|FBytes) -> pr " uint64_t %s;\n" name
| name, FInt64 -> pr " int64_t %s;\n" name
- | name, FString -> pr " char *%s;\n" name
+ | name, (FString|FDevice) -> pr " char *%s;\n" name
| name, FBuffer ->
pr " /* The next two fields describe a byte array. */\n";
pr " uint32_t %s_len;\n" name;
@@ -609,7 +609,7 @@ extern GUESTFS_DLL_PUBLIC void *guestfs_next_private (guestfs_h *g, const char *
List.iter (
function
| name, FChar -> pr " char %s;\n" name
- | name, FString -> pr " char *%s;\n" name
+ | name, (FString|FDevice) -> pr " char *%s;\n" name
| name, FBuffer ->
pr " uint32_t %s_len;\n" name;
pr " char *%s;\n" name
@@ -916,7 +916,7 @@ and generate_client_structs_compare () =
fun { s_name = typ; s_cols = cols } ->
let has_nonnumeric_cols =
let nonnumeric = function
- | _,(FString|FUUID|FBuffer) -> true
+ | _,(FString|FDevice|FUUID|FBuffer) -> true
| _,(FChar|FUInt32|FInt32|FUInt64|FBytes|FInt64|FOptPercent) -> false
in
List.exists nonnumeric cols in
@@ -932,7 +932,7 @@ and generate_client_structs_compare () =
);
List.iter (
function
- | name, FString ->
+ | name, (FString|FDevice) ->
pr " r = strcmp (s1->%s, s2->%s);\n" name name;
pr " if (r != 0) return r;\n"
| name, FBuffer ->
@@ -1001,7 +1001,7 @@ and generate_client_structs_copy () =
fun { s_name = typ; s_cols = cols } ->
let has_boxed_cols =
let boxed = function
- | _,(FString|FBuffer) -> true
+ | _,(FString|FDevice|FBuffer) -> true
| _,(FChar|FUUID|FUInt32|FInt32|FUInt64|FBytes|FInt64|FOptPercent) ->
false
in
@@ -1014,8 +1014,7 @@ and generate_client_structs_copy () =
pr "{\n";
List.iter (
function
- | name, FString
- | name, FBuffer -> pr " free (s->%s);\n" name
+ | name, (FString|FDevice|FBuffer) -> pr " free (s->%s);\n" name
| _, FChar
| _, FUUID
| _, FUInt32
@@ -1038,8 +1037,7 @@ and generate_client_structs_copy () =
pr "\n";
List.iter (
function
- | name, FString
- | name, FBuffer -> pr " out->%s = NULL;\n" name
+ | name, (FString|FDevice|FBuffer) -> pr " out->%s = NULL;\n" name
| _, FChar
| _, FUUID
| _, FUInt32
@@ -1051,7 +1049,7 @@ and generate_client_structs_copy () =
) cols;
List.iter (
function
- | name, FString ->
+ | name, (FString|FDevice) ->
pr " out->%s = strdup (inp->%s);\n" name name;
pr " if (out->%s == NULL) goto error;\n" name
| name, FBuffer ->
@@ -1234,7 +1232,7 @@ and generate_client_structs_print_c () =
);
List.iter (
function
- | name, FString ->
+ | name, (FString|FDevice) ->
pr " fprintf (dest, \"%%s%s: %%s%%s\", indent, %s->%s, linesep);\n"
name typ name
| name, FUUID ->
diff --git a/generator/csharp.ml b/generator/csharp.ml
index d1999bcff..5c77a46b4 100644
--- a/generator/csharp.ml
+++ b/generator/csharp.ml
@@ -119,7 +119,7 @@ namespace Guestfs
List.iter (
function
| name, FChar -> pr " char %s;\n" name
- | name, FString -> pr " string %s;\n" name
+ | name, (FString | FDevice) -> pr " string %s;\n" name
| name, FBuffer ->
pr " uint %s_len;\n" name;
pr " string %s;\n" name
diff --git a/generator/daemon.ml b/generator/daemon.ml
index 9f75f385a..e19fa07d2 100644
--- a/generator/daemon.ml
+++ b/generator/daemon.ml
@@ -442,15 +442,37 @@ let generate_daemon_stubs actions () =
pr " ret.%s.%s_val = r;\n" n n;
pr " reply ((xdrproc_t) &xdr_guestfs_%s_ret, (char *) &ret);\n"
name
- | RStruct (n, _) ->
+ | RStruct (n, typ) ->
+ (* XXX RStruct containing an FDevice field would require
+ * reverse device name translation. That is not implemented.
+ * See also RStructList immediately below this.
+ *)
+ let cols = (Structs.lookup_struct typ).s_cols in
+ assert (not (List.exists
+ (function (_, FDevice) -> true | _ -> false) cols));
pr " struct guestfs_%s_ret ret;\n" name;
pr " ret.%s = *r;\n" n;
pr " reply ((xdrproc_t) xdr_guestfs_%s_ret, (char *) &ret);\n"
name;
pr " xdr_free ((xdrproc_t) xdr_guestfs_%s_ret, (char *) &ret);\n"
name
- | RStructList (n, _) ->
+ | RStructList (n, typ) ->
pr " struct guestfs_%s_ret ret;\n" name;
+ let cols = (Structs.lookup_struct typ).s_cols in
+ List.iter (
+ function
+ | (fname, FDevice) ->
+ pr " for (size_t i = 0; i < r->guestfs_int_%s_list_len; ++i) {\n"
+ typ;
+ pr " char *field = r->guestfs_int_%s_list_val[i].%s;\n"
+ typ fname;
+ pr " char *rr = reverse_device_name_translation (field);\n";
+ pr " if (!rr) abort ();\n";
+ pr " free (field);\n";
+ pr " r->guestfs_int_%s_list_val[i].%s = rr;\n" typ fname;
+ pr " }\n";
+ | _ -> ()
+ ) cols;
pr " ret.%s = *r;\n" n;
pr " reply ((xdrproc_t) xdr_guestfs_%s_ret, (char *) &ret);\n"
name;
@@ -619,7 +641,7 @@ let generate_daemon_caml_stubs () =
fun i ->
pr " v = Field (retv, %d);\n" i;
function
- | n, (FString|FUUID) ->
+ | n, (FString|FDevice|FUUID) ->
pr " ret->%s = strdup (String_val (v));\n" n;
pr " if (ret->%s == NULL) return NULL;\n" n
| n, FBuffer ->
@@ -986,7 +1008,7 @@ let generate_daemon_lvm_tokenization () =
pr " if (*p) next = p+1; else next = NULL;\n";
pr " *p = '\\0';\n";
(match coltype with
- | FString ->
+ | FString | FDevice ->
pr " r->%s = strdup (tok);\n" name;
pr " if (r->%s == NULL) {\n" name;
pr " perror (\"strdup\");\n";
diff --git a/generator/erlang.ml b/generator/erlang.ml
index 65af75aaf..864b3ff04 100644
--- a/generator/erlang.ml
+++ b/generator/erlang.ml
@@ -286,7 +286,7 @@ and generate_erlang_structs () =
List.iteri (
fun i col ->
(match col with
- | name, FString ->
+ | name, (FString|FDevice) ->
pr " if (ei_x_encode_string (buff, %s->%s) != 0) return -1;\n" typ name
| name, FBuffer ->
pr " if (ei_x_encode_string_len (buff, %s->%s, %s->%s_len) != 0) return -1;\n"
diff --git a/generator/golang.ml b/generator/golang.ml
index 0d6a92367..a5b39f5df 100644
--- a/generator/golang.ml
+++ b/generator/golang.ml
@@ -248,7 +248,7 @@ func return_hashtable (argv **C.char) map[string]string {
let n = String.capitalize_ascii n in
match field with
| FChar -> pr " %s byte\n" n
- | FString -> pr " %s string\n" n
+ | FString | FDevice -> pr " %s string\n" n
| FBuffer -> pr " %s []byte\n" n
| FUInt32 -> pr " %s uint32\n" n
| FInt32 -> pr " %s int32\n" n
@@ -267,7 +267,7 @@ func return_hashtable (argv **C.char) map[string]string {
let gon = String.capitalize_ascii n in
match field with
| FChar -> pr " r.%s = byte (c.%s)\n" gon n
- | FString -> pr " r.%s = C.GoString (c.%s)\n" gon n
+ | FString | FDevice -> pr " r.%s = C.GoString (c.%s)\n" gon n
| FBuffer ->
pr " r.%s = C.GoBytes (unsafe.Pointer (c.%s), C.int (c.%s_len))\n"
gon n n
diff --git a/generator/java.ml b/generator/java.ml
index 7a8c0016c..909db4530 100644
--- a/generator/java.ml
+++ b/generator/java.ml
@@ -560,6 +560,7 @@ public class %s {
List.iter (
function
| name, FString
+ | name, FDevice
| name, FUUID
| name, FBuffer -> pr " public String %s;\n" name
| name, (FBytes|FUInt64|FInt64) -> pr " public long %s;\n" name
@@ -947,7 +948,7 @@ and generate_java_struct_return typ jtyp cols =
pr " jr = (*env)->AllocObject (env, cl);\n";
List.iter (
function
- | name, FString ->
+ | name, (FString|FDevice) ->
pr " fl = (*env)->GetFieldID (env, cl, \"%s\", \"Ljava/lang/String;\");\n" name;
pr " (*env)->SetObjectField (env, jr, fl, (*env)->NewStringUTF (env, r->%s));\n" name;
| name, FUUID ->
@@ -997,7 +998,7 @@ and generate_java_struct_list_return typ jtyp cols =
fun (name, ftyp) ->
(* Get the field ID in 'fl'. *)
let java_field_type = match ftyp with
- | FString | FUUID | FBuffer -> "Ljava/lang/String;"
+ | FString | FDevice | FUUID | FBuffer -> "Ljava/lang/String;"
| FBytes | FUInt64 | FInt64 -> "J"
| FUInt32 | FInt32 -> "I"
| FOptPercent -> "F"
@@ -1007,7 +1008,7 @@ and generate_java_struct_list_return typ jtyp cols =
(* Assign the value to this field. *)
match ftyp with
- | FString ->
+ | FString | FDevice ->
pr " (*env)->SetObjectField (env, jfl, fl,\n";
pr " (*env)->NewStringUTF (env, r->val[i].%s));\n" name;
| FUUID ->
diff --git a/generator/lua.ml b/generator/lua.ml
index 0d7e63be0..685645abf 100644
--- a/generator/lua.ml
+++ b/generator/lua.ml
@@ -824,7 +824,7 @@ push_event (lua_State *L, uint64_t event)
(match field with
| FChar ->
pr " lua_pushlstring (L, &v->%s, 1);\n" n
- | FString ->
+ | FString | FDevice ->
pr " lua_pushstring (L, v->%s);\n" n
| FBuffer ->
pr " lua_pushlstring (L, v->%s, v->%s_len);\n" n n
diff --git a/generator/perl.ml b/generator/perl.ml
index 0059d4c1d..17ed64d29 100644
--- a/generator/perl.ml
+++ b/generator/perl.ml
@@ -607,7 +607,7 @@ and generate_perl_struct_list_code typ cols name style =
pr " hv = newHV ();\n";
List.iter (
function
- | name, FString ->
+ | name, (FString|FDevice) ->
pr " (void) hv_store (hv, \"%s\", %d, newSVpv (r->val[i].%s, 0), 0);\n"
name (String.length name) name
| name, FUUID ->
@@ -645,7 +645,7 @@ and generate_perl_struct_code typ cols name style =
pr " PUSHs (sv_2mortal (newSVpv (\"%s\", 0)));\n" name;
match col with
- | name, FString ->
+ | name, (FString|FDevice) ->
pr " PUSHs (sv_2mortal (newSVpv (r->%s, 0)));\n"
name
| name, FBuffer ->
diff --git a/generator/php.ml b/generator/php.ml
index df8470461..2b336f96f 100644
--- a/generator/php.ml
+++ b/generator/php.ml
@@ -616,7 +616,7 @@ and generate_php_struct_code typ cols =
pr " array_init (return_value);\n";
List.iter (
function
- | name, FString ->
+ | name, (FString|FDevice) ->
pr " guestfs_add_assoc_string (return_value, \"%s\", r->%s, 1);\n" name name
| name, FBuffer ->
pr " guestfs_add_assoc_stringl (return_value, \"%s\", r->%s, r->%s_len, 1);\n"
@@ -650,7 +650,7 @@ and generate_php_struct_list_code typ cols =
pr " array_init (z_elem);\n";
List.iter (
function
- | name, FString ->
+ | name, (FString|FDevice) ->
pr " guestfs_add_assoc_string (z_elem, \"%s\", r->val[c].%s, 1);\n"
name name
| name, FBuffer ->
diff --git a/generator/python.ml b/generator/python.ml
index 242721f33..86b70b2de 100644
--- a/generator/python.ml
+++ b/generator/python.ml
@@ -168,7 +168,7 @@ and generate_python_structs () =
pr " return NULL;\n";
List.iter (
function
- | name, FString ->
+ | name, (FString|FDevice) ->
pr " value = guestfs_int_py_fromstring (%s->%s);\n" typ name;
pr " if (value == NULL)\n";
pr " goto err;\n";
diff --git a/generator/ruby.ml b/generator/ruby.ml
index 0f63b82ed..f9787af69 100644
--- a/generator/ruby.ml
+++ b/generator/ruby.ml
@@ -526,7 +526,7 @@ and generate_ruby_struct_code typ cols =
pr " volatile VALUE rv = rb_hash_new ();\n";
List.iter (
function
- | name, FString ->
+ | name, (FString|FDevice) ->
pr " rb_hash_aset (rv, rb_str_new2 (\"%s\"), rb_str_new2 (r->%s));\n" name name
| name, FBuffer ->
pr " rb_hash_aset (rv, rb_str_new2 (\"%s\"), rb_str_new (r->%s, r->%s_len));\n" name name name
@@ -556,7 +556,7 @@ and generate_ruby_struct_list_code typ cols =
pr " volatile VALUE hv = rb_hash_new ();\n";
List.iter (
function
- | name, FString ->
+ | name, (FString|FDevice) ->
pr " rb_hash_aset (hv, rb_str_new2 (\"%s\"), rb_str_new2 (r->val[i].%s));\n" name name
| name, FBuffer ->
pr " rb_hash_aset (hv, rb_str_new2 (\"%s\"), rb_str_new (r->val[i].%s, r->val[i].%s_len));\n" name name name
diff --git a/generator/rust.ml b/generator/rust.ml
index 1f5cefa62..f4dcfd723 100644
--- a/generator/rust.ml
+++ b/generator/rust.ml
@@ -115,7 +115,7 @@ extern \"C\" {
List.iter (
function
| n, FChar -> pr " pub %s: i8,\n" n
- | n, FString -> pr " pub %s: String,\n" n
+ | n, (FString|FDevice) -> pr " pub %s: String,\n" n
| n, FBuffer -> pr " pub %s: Vec<u8>,\n" n
| n, FUInt32 -> pr " pub %s: u32,\n" n
| n, FInt32 -> pr " pub %s: i32,\n" n
@@ -130,7 +130,7 @@ extern \"C\" {
List.iter (
function
| n, FChar -> pr " %s: c_char,\n" n
- | n, FString -> pr " %s: *const c_char,\n" n
+ | n, (FString|FDevice) -> pr " %s: *const c_char,\n" n
| n, FBuffer ->
pr " %s_len: usize,\n" n;
pr " %s: *const c_char,\n" n;
@@ -154,7 +154,7 @@ extern \"C\" {
match x with
| n, FChar ->
pr "%s: (*raw).%s as i8,\n" n n;
- | n, FString ->
+ | n, (FString|FDevice) ->
pr "%s: char_ptr_to_string((*raw).%s)?,\n" n n;
| n, FBuffer ->
pr "%s: slice::from_raw_parts((*raw).%s as *const u8, (*raw).%s_len).to_vec(),\n" n n n
diff --git a/generator/types.ml b/generator/types.ml
index 76b699e78..7163da8d2 100644
--- a/generator/types.ml
+++ b/generator/types.ml
@@ -215,6 +215,7 @@ let defaults = { name = "";
type field =
| FChar (* C 'char' (really, a 7 bit byte). *)
| FString (* nul-terminated ASCII string, NOT NULL. *)
+ | FDevice (* device name, needs reverse transl. *)
| FBuffer (* opaque buffer of bytes, (char *, int) pair *)
| FUInt32
| FInt32
diff --git a/generator/types.mli b/generator/types.mli
index 7c549a35e..e8939370e 100644
--- a/generator/types.mli
+++ b/generator/types.mli
@@ -413,6 +413,7 @@ val defaults : action
type field =
| FChar (** C 'char' (really, a 7 bit byte). *)
| FString (** nul-terminated ASCII string, NOT NULL. *)
+ | FDevice (** device name, needs reverse transl. *)
| FBuffer (** opaque buffer of bytes, (char *, int) pair*)
| FUInt32
| FInt32
--
2.47.1

View File

@ -0,0 +1,69 @@
From 5a16d1120fb7b046974abde43b1c40250bfd1a95 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 16 Apr 2025 11:50:37 +0100
Subject: [PATCH] generator: Use new FDevice type for the pvs-full pv_name
field
Remove the code which did explicit reverse device name translation,
and use the generator's code instead.
---
daemon/lvm.c | 29 +----------------------------
generator/structs.ml | 2 +-
2 files changed, 2 insertions(+), 29 deletions(-)
diff --git a/daemon/lvm.c b/daemon/lvm.c
index 6d8d675db..261573882 100644
--- a/daemon/lvm.c
+++ b/daemon/lvm.c
@@ -146,34 +146,7 @@ do_vgs (void)
guestfs_int_lvm_pv_list *
do_pvs_full (void)
{
- guestfs_int_lvm_pv_list *r;
- size_t i;
- char *din, *dout;
-
- r = parse_command_line_pvs ();
- if (r == NULL)
- /* parse_command_line_pvs has already called reply_with_error */
- return NULL;
-
- /* The pv_name fields contain device names which must be reverse
- * translated. The problem here is that the generator does not have
- * a "FMountable" field type in types.mli.
- */
- for (i = 0; i < r->guestfs_int_lvm_pv_list_len; ++i) {
- din = r->guestfs_int_lvm_pv_list_val[i].pv_name;
- if (din) {
- dout = reverse_device_name_translation (din);
- if (!dout) {
- /* reverse_device_name_translation has already called reply_with_error*/
- /* XXX memory leak here */
- return NULL;
- }
- r->guestfs_int_lvm_pv_list_val[i].pv_name = dout;
- free (din);
- }
- }
-
- return r;
+ return parse_command_line_pvs ();
}
guestfs_int_lvm_vg_list *
diff --git a/generator/structs.ml b/generator/structs.ml
index e5ed71ecd..fcacade65 100644
--- a/generator/structs.ml
+++ b/generator/structs.ml
@@ -35,7 +35,7 @@ type struc = {
* we have to pull out the LVM columns separately here.
*)
let lvm_pv_cols = [
- "pv_name", FString;
+ "pv_name", FDevice;
"pv_uuid", FUUID;
"pv_fmt", FString;
"pv_size", FBytes;
--
2.47.1

View File

@ -0,0 +1,47 @@
From 7a1ffd744b12c4c79fa1b78341ea714d831f4205 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 16 Apr 2025 10:13:52 +0100
Subject: [PATCH] daemon: inspect: Resolve Ubuntu 22+ /dev/disk/by-uuid/ in
fstab
Ubuntu 22= uses /dev/disk/by-uuid/ followed by a filesystem UUID in
fstab entries. Resolve these to mountables.
A typical fstab entry looks like this:
# /boot was on /dev/vda2 during curtin installation
/dev/disk/by-uuid/b4e56462-5a64-4272-b76d-f5e58bd8f128 /boot ext4 defaults 0 1
The comment is generated by the installer and appears in the fstab.
This entry would be translated to /dev/sda2.
---
daemon/inspect_fs_unix_fstab.ml | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/daemon/inspect_fs_unix_fstab.ml b/daemon/inspect_fs_unix_fstab.ml
index 912ffee34..769959693 100644
--- a/daemon/inspect_fs_unix_fstab.ml
+++ b/daemon/inspect_fs_unix_fstab.ml
@@ -394,6 +394,19 @@ and resolve_fstab_device spec md_map os_type =
resolve_diskbyid part default
)
+ (* Ubuntu 22+ uses /dev/disk/by-uuid/ followed by a UUID. *)
+ else if String.is_prefix spec "/dev/disk/by-uuid/" then (
+ debug_matching "diskbyuuid";
+ let uuid = String.sub spec 18 (String.length spec - 18) in
+ try
+ (* Try a filesystem UUID. Unclear if this could be a partition UUID
+ * as well, but in the Ubuntu guest I tried it was an fs UUID XXX.
+ *)
+ Mountable.of_device (Findfs.findfs_uuid uuid)
+ with
+ Failure _ -> default
+ )
+
else if PCRE.matches re_freebsd_gpt spec then (
debug_matching "FreeBSD GPT";
(* group 1 (type) is not used *)
--
2.47.1

View File

@ -0,0 +1,44 @@
From bcd6b3ec3a1038d840e832732b3910f939566436 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 16 Apr 2025 13:19:17 +0100
Subject: [PATCH] generator: Fix implementation of FUUID for OCaml functions
This was implemented wrongly. In the XDR protocol, UUIDs are fixed
buffers of length 32. We can just use memcpy to copy from the OCaml
string to the UUID, but we have to ensure the string length returned
by OCaml is correct (if not we just assert, it's an internal error).
(It didn't even compile before, so we know it was never used).
---
generator/daemon.ml | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/generator/daemon.ml b/generator/daemon.ml
index e19fa07d2..b23034fd7 100644
--- a/generator/daemon.ml
+++ b/generator/daemon.ml
@@ -606,6 +606,7 @@ let generate_daemon_caml_stubs () =
#include <string.h>
#include <inttypes.h>
#include <errno.h>
+#include <assert.h>
#include <caml/alloc.h>
#include <caml/callback.h>
@@ -641,9 +642,12 @@ let generate_daemon_caml_stubs () =
fun i ->
pr " v = Field (retv, %d);\n" i;
function
- | n, (FString|FDevice|FUUID) ->
+ | n, (FString|FDevice) ->
pr " ret->%s = strdup (String_val (v));\n" n;
pr " if (ret->%s == NULL) return NULL;\n" n
+ | n, FUUID ->
+ pr " assert (caml_string_length (v) == sizeof ret->%s);\n" n;
+ pr " memcpy (ret->%s, String_val (v), sizeof ret->%s);\n" n n
| n, FBuffer ->
pr " ret->%s_len = caml_string_length (v);\n" n;
pr " ret->%s = strdup (String_val (v));\n" n;
--
2.47.1

View File

@ -0,0 +1,45 @@
From 3f9078261ce917231eb62575557b1c9fb076a91f Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 16 Apr 2025 13:57:30 +0100
Subject: [PATCH] Update common submodule
Pulls in these commits:
Richard W.M. Jones (2):
mltools: Fix memory leak in OCaml binding of libosinfo
mlstdutils: Implement String.implode
---
common | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Submodule common 347b13716..353b8474e:
diff --git a/common/mlstdutils/std_utils.ml b/common/mlstdutils/std_utils.ml
index 212a151..086d66d 100644
--- a/common/mlstdutils/std_utils.ml
+++ b/common/mlstdutils/std_utils.ml
@@ -275,6 +275,12 @@ module String = struct
let map_chars f str =
List.map f (explode str)
+ let implode cs =
+ let n = List.length cs in
+ let b = Bytes.create n in
+ List.iteri (Bytes.unsafe_set b) cs;
+ Bytes.to_string b
+
let spaces n = String.make n ' '
let span str accept =
diff --git a/common/mlstdutils/std_utils.mli b/common/mlstdutils/std_utils.mli
index 72a2d44..39448fb 100644
--- a/common/mlstdutils/std_utils.mli
+++ b/common/mlstdutils/std_utils.mli
@@ -127,6 +127,8 @@ module String : sig
(** Explode a string into a list of characters. *)
val map_chars : (char -> 'a) -> string -> 'a list
(** Explode string, then map function over the characters. *)
+ val implode : char list -> string
+ (** Join list of characters into a single string. *)
val spaces : int -> string
(** [spaces n] creates a string of n spaces. *)
val span : string -> string -> int

View File

@ -0,0 +1,660 @@
From a73f248369d35249a9324a0e0df9f7ccd1420d3f Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 16 Apr 2025 10:41:59 +0100
Subject: [PATCH] daemon: Rewrite {pvs,vgs,lvs}-full APIs in OCaml
These were previously written in very convoluted C which had to deal
with parsing the crazy output of the "lvm" command. In fact the
parsing was so complex that it was generated by the generator. It's
easier to do this in OCaml.
These are basically legacy APIs. They cannot be expanded and LVM
already supports many more fields. We should replace these with APIs
for getting single named fields from LVM.
---
.gitignore | 2 +-
daemon/Makefile.am | 5 +-
daemon/lvm.c | 22 ----
daemon/lvm_full.ml | 221 ++++++++++++++++++++++++++++++++++++++
docs/C_SOURCE_FILES | 1 -
generator/actions_core.ml | 3 +
generator/daemon.ml | 190 --------------------------------
generator/daemon.mli | 1 -
generator/main.ml | 2 -
generator/structs.ml | 4 +-
generator/structs.mli | 7 --
po/POTFILES | 1 -
12 files changed, 229 insertions(+), 230 deletions(-)
create mode 100644 daemon/lvm_full.ml
diff --git a/.gitignore b/.gitignore
index 9d59a80f1..81cd278cc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -97,7 +97,7 @@ Makefile.in
/daemon/listfs.mli
/daemon/lvm.mli
/daemon/lvm_dm.mli
-/daemon/lvm-tokenization.c
+/daemon/lvm_full.mli
/daemon/md.mli
/daemon/mount.mli
/daemon/names.c
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index bb72c0244..90ece8461 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -22,7 +22,6 @@ BUILT_SOURCES = \
caml-stubs.c \
dispatch.c \
names.c \
- lvm-tokenization.c \
structs-cleanups.c \
structs-cleanups.h \
stubs-0.c \
@@ -52,6 +51,7 @@ generator_built = \
listfs.mli \
lvm.mli \
lvm_dm.mli \
+ lvm_full.mli \
md.mli \
mount.mli \
optgroups.ml \
@@ -152,7 +152,6 @@ guestfsd_SOURCES = \
luks.c \
lvm.c \
lvm-filter.c \
- lvm-tokenization.c \
md.c \
mkfs.c \
mknod.c \
@@ -298,6 +297,7 @@ SOURCES_MLI = \
listfs.mli \
lvm.mli \
lvm_dm.mli \
+ lvm_full.mli \
lvm_utils.mli \
md.mli \
mount.mli \
@@ -333,6 +333,7 @@ SOURCES_ML = \
ldm.ml \
link.ml \
lvm.ml \
+ lvm_full.ml \
lvm_utils.ml \
lvm_dm.ml \
findfs.ml \
diff --git a/daemon/lvm.c b/daemon/lvm.c
index 261573882..924c1ddb3 100644
--- a/daemon/lvm.c
+++ b/daemon/lvm.c
@@ -139,28 +139,6 @@ do_vgs (void)
return convert_lvm_output (out, NULL);
}
-/* These were so complex to implement that I ended up auto-generating
- * the code. That code is in stubs.c, and it is generated as usual
- * by generator.ml.
- */
-guestfs_int_lvm_pv_list *
-do_pvs_full (void)
-{
- return parse_command_line_pvs ();
-}
-
-guestfs_int_lvm_vg_list *
-do_vgs_full (void)
-{
- return parse_command_line_vgs ();
-}
-
-guestfs_int_lvm_lv_list *
-do_lvs_full (void)
-{
- return parse_command_line_lvs ();
-}
-
int
do_pvcreate (const char *device)
{
diff --git a/daemon/lvm_full.ml b/daemon/lvm_full.ml
new file mode 100644
index 000000000..d5653d2f0
--- /dev/null
+++ b/daemon/lvm_full.ml
@@ -0,0 +1,221 @@
+(* guestfs-inspection
+ * Copyright (C) 2009-2025 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *)
+
+(* This file implements the complicated lvs-full, vgs-full and pvs-full APIs
+ *
+ * XXX Deprecate these APIs are replace with APIs for getting single
+ * named fields from LVM. That will be slower but far more flexible
+ * and extensible.
+ *)
+
+open Unix
+open Printf
+
+open Std_utils
+
+open Utils
+
+(* LVM UUIDs are basically 32 byte strings with '-' inserted.
+ * Remove the '-' characters and check it's the right length.
+ *)
+let parse_uuid uuid =
+ let uuid' =
+ uuid |> String.explode |> List.filter ((<>) '-') |> String.implode in
+ if String.length uuid' <> 32 then
+ failwithf "lvm-full: parse_uuid: unexpected UUID format: %S" uuid;
+ uuid'
+
+(* Parse the percent fields. These can be empty. *)
+let parse_percent pc = if pc = "" then None else Some (float_of_string pc)
+
+(* XXX These must match generator/structs.ml *)
+let lvm_pv_cols = [
+ "pv_name"; (* FString *)
+ "pv_uuid"; (* FUUID *)
+ "pv_fmt"; (* FString *)
+ "pv_size"; (* FBytes *)
+ "dev_size"; (* FBytes *)
+ "pv_free"; (* FBytes *)
+ "pv_used"; (* FBytes *)
+ "pv_attr"; (* FString (* XXX *) *)
+ "pv_pe_count"; (* FInt64 *)
+ "pv_pe_alloc_count"; (* FInt64 *)
+ "pv_tags"; (* FString *)
+ "pe_start"; (* FBytes *)
+ "pv_mda_count"; (* FInt64 *)
+ "pv_mda_free"; (* FBytes *)
+]
+
+let tokenize_pvs = function
+ | [ pv_name; pv_uuid; pv_fmt; pv_size; dev_size; pv_free;
+ pv_used; pv_attr; pv_pe_count; pv_pe_alloc_count; pv_tags;
+ pe_start; pv_mda_count; pv_mda_free ] ->
+ { Structs.pv_name = pv_name;
+ pv_uuid = parse_uuid pv_uuid;
+ pv_fmt = pv_fmt;
+ pv_size = Int64.of_string pv_size;
+ dev_size = Int64.of_string dev_size;
+ pv_free = Int64.of_string pv_free;
+ pv_used = Int64.of_string pv_used;
+ pv_attr = pv_attr;
+ pv_pe_count = Int64.of_string pv_pe_count;
+ pv_pe_alloc_count = Int64.of_string pv_pe_alloc_count;
+ pv_tags = pv_tags;
+ pe_start = Int64.of_string pe_start;
+ pv_mda_count = Int64.of_string pv_mda_count;
+ pv_mda_free = Int64.of_string pv_mda_free }
+
+ | fields ->
+ failwithf "pvs-full: tokenize_pvs: unexpected number of fields: %d"
+ (List.length fields)
+
+(* XXX These must match generator/structs.ml *)
+let lvm_vg_cols = [
+ "vg_name"; (* FString *)
+ "vg_uuid"; (* FUUID *)
+ "vg_fmt"; (* FString *)
+ "vg_attr"; (* FString (* XXX *) *)
+ "vg_size"; (* FBytes *)
+ "vg_free"; (* FBytes *)
+ "vg_sysid"; (* FString *)
+ "vg_extent_size"; (* FBytes *)
+ "vg_extent_count"; (* FInt64 *)
+ "vg_free_count"; (* FInt64 *)
+ "max_lv"; (* FInt64 *)
+ "max_pv"; (* FInt64 *)
+ "pv_count"; (* FInt64 *)
+ "lv_count"; (* FInt64 *)
+ "snap_count"; (* FInt64 *)
+ "vg_seqno"; (* FInt64 *)
+ "vg_tags"; (* FString *)
+ "vg_mda_count"; (* FInt64 *)
+ "vg_mda_free"; (* FBytes *)
+]
+
+let tokenize_vgs = function
+ | [ vg_name; vg_uuid; vg_fmt; vg_attr; vg_size; vg_free; vg_sysid;
+ vg_extent_size; vg_extent_count; vg_free_count; max_lv;
+ max_pv; pv_count; lv_count; snap_count; vg_seqno; vg_tags;
+ vg_mda_count; vg_mda_free ] ->
+ { Structs.vg_name = vg_name;
+ vg_uuid = parse_uuid vg_uuid;
+ vg_fmt = vg_fmt;
+ vg_attr = vg_attr;
+ vg_size = Int64.of_string vg_size;
+ vg_free = Int64.of_string vg_free;
+ vg_sysid = vg_sysid;
+ vg_extent_size = Int64.of_string vg_extent_size;
+ vg_extent_count = Int64.of_string vg_extent_count;
+ vg_free_count = Int64.of_string vg_free_count;
+ max_lv = Int64.of_string max_lv;
+ max_pv = Int64.of_string max_pv;
+ pv_count = Int64.of_string pv_count;
+ lv_count = Int64.of_string lv_count;
+ snap_count = Int64.of_string snap_count;
+ vg_seqno = Int64.of_string vg_seqno;
+ vg_tags = vg_tags;
+ vg_mda_count = Int64.of_string vg_mda_count;
+ vg_mda_free = Int64.of_string vg_mda_free }
+
+ | fields ->
+ failwithf "pvs-full: tokenize_vgs: unexpected number of fields: %d"
+ (List.length fields)
+
+(* XXX These must match generator/structs.ml *)
+let lvm_lv_cols = [
+ "lv_name"; (* FString *)
+ "lv_uuid"; (* FUUID *)
+ "lv_attr"; (* FString (* XXX *) *)
+ "lv_major"; (* FInt64 *)
+ "lv_minor"; (* FInt64 *)
+ "lv_kernel_major"; (* FInt64 *)
+ "lv_kernel_minor"; (* FInt64 *)
+ "lv_size"; (* FBytes *)
+ "seg_count"; (* FInt64 *)
+ "origin"; (* FString *)
+ "snap_percent"; (* FOptPercent *)
+ "copy_percent"; (* FOptPercent *)
+ "move_pv"; (* FString *)
+ "lv_tags"; (* FString *)
+ "mirror_log"; (* FString *)
+ "modules"; (* FString *)
+]
+
+let tokenize_lvs = function
+ | [ lv_name; lv_uuid; lv_attr; lv_major; lv_minor; lv_kernel_major;
+ lv_kernel_minor; lv_size; seg_count; origin; snap_percent;
+ copy_percent; move_pv; lv_tags; mirror_log; modules ] ->
+ { Structs.lv_name = lv_name;
+ lv_uuid = parse_uuid lv_uuid;
+ lv_attr = lv_attr;
+ lv_major = Int64.of_string lv_major;
+ lv_minor = Int64.of_string lv_minor;
+ lv_kernel_major = Int64.of_string lv_kernel_major;
+ lv_kernel_minor = Int64.of_string lv_kernel_minor;
+ lv_size = Int64.of_string lv_size;
+ seg_count = Int64.of_string seg_count;
+ origin = origin;
+ snap_percent = parse_percent snap_percent;
+ copy_percent = parse_percent copy_percent;
+ move_pv = move_pv;
+ lv_tags = lv_tags;
+ mirror_log = mirror_log;
+ modules = modules }
+
+ | fields ->
+ failwithf "pvs-full: tokenize_vgs: unexpected number of fields: %d"
+ (List.length fields)
+
+let rec pvs_full () =
+ let out = run_lvm_command "pvs" lvm_pv_cols in
+ let lines = trim_and_split out in
+ let pvs = List.map tokenize_pvs lines in
+ pvs
+
+and vgs_full () =
+ let out = run_lvm_command "vgs" lvm_vg_cols in
+ let lines = trim_and_split out in
+ let vgs = List.map tokenize_vgs lines in
+ vgs
+
+and lvs_full () =
+ let out = run_lvm_command "lvs" lvm_lv_cols in
+ let lines = trim_and_split out in
+ let lvs = List.map tokenize_lvs lines in
+ lvs
+
+and run_lvm_command typ cols =
+ let cols = String.concat "," cols in
+ let cmd = [ typ; "-o"; cols;
+ "--unbuffered"; "--noheadings"; "--nosuffix";
+ "--separator"; "\r"; "--units"; "b" ] in
+ command "lvm" cmd
+
+and trim_and_split out =
+ (* Split the output into lines. *)
+ let lines = String.nsplit "\n" out in
+
+ (* LVM puts leading whitespace on each line so remove that. *)
+ let lines = List.map String.triml lines in
+
+ (* Ignore any blank lines. *)
+ let lines = List.filter ((<>) "") lines in
+
+ (* Split each line into fields. *)
+ let lines = List.map (String.nsplit "\r") lines in
+ lines
diff --git a/docs/C_SOURCE_FILES b/docs/C_SOURCE_FILES
index 0038f95e4..cdfb1d615 100644
--- a/docs/C_SOURCE_FILES
+++ b/docs/C_SOURCE_FILES
@@ -111,7 +111,6 @@ daemon/link.c
daemon/ls.c
daemon/luks.c
daemon/lvm-filter.c
-daemon/lvm-tokenization.c
daemon/lvm.c
daemon/md.c
daemon/mkfs.c
diff --git a/generator/actions_core.ml b/generator/actions_core.ml
index 5e8de563a..34bd15ae6 100644
--- a/generator/actions_core.ml
+++ b/generator/actions_core.ml
@@ -1795,6 +1795,7 @@ See also C<guestfs_lvs_full>, C<guestfs_list_filesystems>." };
{ defaults with
name = "pvs_full"; added = (0, 0, 4);
style = RStructList ("physvols", "lvm_pv"), [], [];
+ impl = OCaml "Lvm_full.pvs_full";
optional = Some "lvm2";
shortdesc = "list the LVM physical volumes (PVs)";
longdesc = "\
@@ -1804,6 +1805,7 @@ of the L<pvs(8)> command. The \"full\" version includes all fields." };
{ defaults with
name = "vgs_full"; added = (0, 0, 4);
style = RStructList ("volgroups", "lvm_vg"), [], [];
+ impl = OCaml "Lvm_full.vgs_full";
optional = Some "lvm2";
shortdesc = "list the LVM volume groups (VGs)";
longdesc = "\
@@ -1813,6 +1815,7 @@ of the L<vgs(8)> command. The \"full\" version includes all fields." };
{ defaults with
name = "lvs_full"; added = (0, 0, 4);
style = RStructList ("logvols", "lvm_lv"), [], [];
+ impl = OCaml "Lvm_full.lvs_full";
optional = Some "lvm2";
shortdesc = "list the LVM logical volumes (LVs)";
longdesc = "\
diff --git a/generator/daemon.ml b/generator/daemon.ml
index b23034fd7..da5593ce1 100644
--- a/generator/daemon.ml
+++ b/generator/daemon.ml
@@ -951,196 +951,6 @@ let generate_daemon_dispatch () =
pr "}\n";
pr "\n"
-let generate_daemon_lvm_tokenization () =
- generate_header CStyle GPLv2plus;
-
- pr "\
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <inttypes.h>
-#include <errno.h>
-#include <rpc/types.h>
-#include <rpc/xdr.h>
-
-#include \"daemon.h\"
-#include \"c-ctype.h\"
-#include \"guestfs_protocol.h\"
-#include \"actions.h\"
-#include \"optgroups.h\"
-
-";
-
- (* LVM columns and tokenization functions. *)
- (* XXX This generates crap code. We should rethink how we
- * do this parsing.
- *)
- List.iter (
- function
- | typ, cols ->
- pr "static const char lvm_%s_cols[] = \"%s\";\n"
- typ (String.concat "," (List.map fst cols));
- pr "\n";
-
- pr "static int lvm_tokenize_%s (char *str, guestfs_int_lvm_%s *r)\n" typ typ;
- pr "{\n";
- pr " char *tok, *p, *next;\n";
- pr " size_t i, j;\n";
- pr "\n";
- (*
- pr " fprintf (stderr, \"%%s: <<%%s>>\\n\", __func__, str);\n";
- pr "\n";
- *)
- pr " if (!str) {\n";
- pr " fprintf (stderr, \"%%s: failed: passed a NULL string\\n\", __func__);\n";
- pr " return -1;\n";
- pr " }\n";
- pr " if (!*str || c_isspace (*str)) {\n";
- pr " fprintf (stderr, \"%%s: failed: passed a empty string or one beginning with whitespace\\n\", __func__);\n";
- pr " return -1;\n";
- pr " }\n";
- pr " tok = str;\n";
- List.iter (
- fun (name, coltype) ->
- pr " if (!tok) {\n";
- pr " fprintf (stderr, \"%%s: failed: string finished early, around token %%s\\n\", __func__, \"%s\");\n" name;
- pr " return -1;\n";
- pr " }\n";
- pr " p = strchrnul (tok, '\\r');\n";
- pr " if (*p) next = p+1; else next = NULL;\n";
- pr " *p = '\\0';\n";
- (match coltype with
- | FString | FDevice ->
- pr " r->%s = strdup (tok);\n" name;
- pr " if (r->%s == NULL) {\n" name;
- pr " perror (\"strdup\");\n";
- pr " return -1;\n";
- pr " }\n"
- | FUUID ->
- pr " for (i = j = 0; i < 32; ++j) {\n";
- pr " if (tok[j] == '\\0') {\n";
- pr " fprintf (stderr, \"%%s: failed to parse UUID from '%%s'\\n\", __func__, tok);\n";
- pr " return -1;\n";
- pr " } else if (tok[j] != '-')\n";
- pr " r->%s[i++] = tok[j];\n" name;
- pr " }\n";
- | FBytes ->
- pr " if (sscanf (tok, \"%%\" SCNi64, &r->%s) != 1) {\n" name;
- pr " fprintf (stderr, \"%%s: failed to parse size '%%s' from token %%s\\n\", __func__, tok, \"%s\");\n" name;
- pr " return -1;\n";
- pr " }\n";
- | FInt64 ->
- pr " if (sscanf (tok, \"%%\" SCNi64, &r->%s) != 1) {\n" name;
- pr " fprintf (stderr, \"%%s: failed to parse int '%%s' from token %%s\\n\", __func__, tok, \"%s\");\n" name;
- pr " return -1;\n";
- pr " }\n";
- | FOptPercent ->
- pr " if (tok[0] == '\\0')\n";
- pr " r->%s = -1;\n" name;
- pr " else if (sscanf (tok, \"%%f\", &r->%s) != 1) {\n" name;
- pr " fprintf (stderr, \"%%s: failed to parse float '%%s' from token %%s\\n\", __func__, tok, \"%s\");\n" name;
- pr " return -1;\n";
- pr " }\n";
- | FBuffer | FInt32 | FUInt32 | FUInt64 | FChar ->
- assert false (* can never be an LVM column *)
- );
- pr " tok = next;\n";
- ) cols;
-
- pr " if (tok != NULL) {\n";
- pr " fprintf (stderr, \"%%s: failed: extra tokens at end of string\\n\", __func__);\n";
- pr " return -1;\n";
- pr " }\n";
- pr " return 0;\n";
- pr "}\n";
- pr "\n";
-
- pr "guestfs_int_lvm_%s_list *\n" typ;
- pr "parse_command_line_%ss (void)\n" typ;
- pr "{\n";
- pr " char *out, *err;\n";
- pr " char *p, *pend;\n";
- pr " int r, i;\n";
- pr " guestfs_int_lvm_%s_list *ret;\n" typ;
- pr " void *newp;\n";
- pr "\n";
- pr " ret = malloc (sizeof *ret);\n";
- pr " if (!ret) {\n";
- pr " reply_with_perror (\"malloc\");\n";
- pr " return NULL;\n";
- pr " }\n";
- pr "\n";
- pr " ret->guestfs_int_lvm_%s_list_len = 0;\n" typ;
- pr " ret->guestfs_int_lvm_%s_list_val = NULL;\n" typ;
- pr "\n";
- pr " r = command (&out, &err,\n";
- pr " \"lvm\", \"%ss\",\n" typ;
- pr " \"-o\", lvm_%s_cols, \"--unbuffered\", \"--noheadings\",\n" typ;
- pr " \"--nosuffix\", \"--separator\", \"\\r\", \"--units\", \"b\", NULL);\n";
- pr " if (r == -1) {\n";
- pr " reply_with_error (\"%%s\", err);\n";
- pr " free (out);\n";
- pr " free (err);\n";
- pr " free (ret);\n";
- pr " return NULL;\n";
- pr " }\n";
- pr "\n";
- pr " free (err);\n";
- pr "\n";
- pr " /* Tokenize each line of the output. */\n";
- pr " p = out;\n";
- pr " i = 0;\n";
- pr " while (p) {\n";
- pr " pend = strchr (p, '\\n'); /* Get the next line of output. */\n";
- pr " if (pend) {\n";
- pr " *pend = '\\0';\n";
- pr " pend++;\n";
- pr " }\n";
- pr "\n";
- pr " while (*p && c_isspace (*p)) /* Skip any leading whitespace. */\n";
- pr " p++;\n";
- pr "\n";
- pr " if (!*p) { /* Empty line? Skip it. */\n";
- pr " p = pend;\n";
- pr " continue;\n";
- pr " }\n";
- pr "\n";
- pr " /* Allocate some space to store this next entry. */\n";
- pr " newp = realloc (ret->guestfs_int_lvm_%s_list_val,\n" typ;
- pr " sizeof (guestfs_int_lvm_%s) * (i+1));\n" typ;
- pr " if (newp == NULL) {\n";
- pr " reply_with_perror (\"realloc\");\n";
- pr " free (ret->guestfs_int_lvm_%s_list_val);\n" typ;
- pr " free (ret);\n";
- pr " free (out);\n";
- pr " return NULL;\n";
- pr " }\n";
- pr " ret->guestfs_int_lvm_%s_list_val = newp;\n" typ;
- pr "\n";
- pr " /* Tokenize the next entry. */\n";
- pr " r = lvm_tokenize_%s (p, &ret->guestfs_int_lvm_%s_list_val[i]);\n" typ typ;
- pr " if (r == -1) {\n";
- pr " reply_with_error (\"failed to parse output of '%ss' command\");\n" typ;
- pr " free (ret->guestfs_int_lvm_%s_list_val);\n" typ;
- pr " free (ret);\n";
- pr " free (out);\n";
- pr " return NULL;\n";
- pr " }\n";
- pr "\n";
- pr " ++i;\n";
- pr " p = pend;\n";
- pr " }\n";
- pr "\n";
- pr " ret->guestfs_int_lvm_%s_list_len = i;\n" typ;
- pr "\n";
- pr " free (out);\n";
- pr " return ret;\n";
- pr "}\n"
-
- ) ["pv", lvm_pv_cols; "vg", lvm_vg_cols; "lv", lvm_lv_cols]
-
(* Generate a list of function names, for debugging in the daemon.. *)
let generate_daemon_names () =
generate_header CStyle GPLv2plus;
diff --git a/generator/daemon.mli b/generator/daemon.mli
index f65545302..849979451 100644
--- a/generator/daemon.mli
+++ b/generator/daemon.mli
@@ -23,7 +23,6 @@ val generate_daemon_caml_stubs : unit -> unit
val generate_daemon_caml_callbacks_ml : unit -> unit
val generate_daemon_caml_interface : string -> unit -> unit
val generate_daemon_dispatch : unit -> unit
-val generate_daemon_lvm_tokenization : unit -> unit
val generate_daemon_names : unit -> unit
val generate_daemon_optgroups_c : unit -> unit
val generate_daemon_optgroups_h : unit -> unit
diff --git a/generator/main.ml b/generator/main.ml
index 17bcef8b5..57285003b 100644
--- a/generator/main.ml
+++ b/generator/main.ml
@@ -147,8 +147,6 @@ Run it from the top source directory using the command
Daemon.generate_daemon_optgroups_ml;
output_to "daemon/optgroups.mli"
Daemon.generate_daemon_optgroups_mli;
- output_to "daemon/lvm-tokenization.c"
- Daemon.generate_daemon_lvm_tokenization;
output_to "daemon/structs-cleanups.c"
Daemon.generate_daemon_structs_cleanups_c;
output_to "daemon/structs-cleanups.h"
diff --git a/generator/structs.ml b/generator/structs.ml
index fcacade65..84db7fe84 100644
--- a/generator/structs.ml
+++ b/generator/structs.ml
@@ -31,9 +31,7 @@ type struc = {
s_unused : unit; (* Silences warning 23 when using 'defaults with ...' *)
}
-(* Because we generate extra parsing code for LVM command line tools,
- * we have to pull out the LVM columns separately here.
- *)
+(* XXX These must match daemon/lvm_full.ml *)
let lvm_pv_cols = [
"pv_name", FDevice;
"pv_uuid", FUUID;
diff --git a/generator/structs.mli b/generator/structs.mli
index 13bb0d5d3..c99086214 100644
--- a/generator/structs.mli
+++ b/generator/structs.mli
@@ -34,13 +34,6 @@ type struc = {
val structs : struc list
(** List of structures. *)
-val lvm_pv_cols : cols
-val lvm_vg_cols : cols
-val lvm_lv_cols : cols
-(** These are exported to the daemon code generator where they are
- used to generate code for parsing the output of commands like
- [lvs]. One day replace this with liblvm API calls. *)
-
val lookup_struct : string -> struc
(** Lookup a struct by name. *)
diff --git a/po/POTFILES b/po/POTFILES
index 75b040c06..d10f97106 100644
--- a/po/POTFILES
+++ b/po/POTFILES
@@ -90,7 +90,6 @@ daemon/link.c
daemon/ls.c
daemon/luks.c
daemon/lvm-filter.c
-daemon/lvm-tokenization.c
daemon/lvm.c
daemon/md.c
daemon/mkfs.c
--
2.47.1

View File

@ -0,0 +1,72 @@
From e43ca1912973b3ddfa73b09a4690aa8bb26e08af Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 16 Apr 2025 10:27:25 +0100
Subject: [PATCH] daemon: inspect: Resolve Ubuntu 22+
/dev/disk/by-id/dm-uuid-LVM-... in fstab
Linux + LVM supports device names like /dev/disk/by-id/dm-uuid-LVM-
followed by two concatenated UUIDs, firstly for the volume group and
secondly for the logical volume. We can reverse those to get the
device name (/dev/VG/LV).
fstab entries look like:
# / was on /dev/vg0/lv-0 during curtin installation
/dev/disk/by-id/dm-uuid-LVM-OzFWT6NHkstr1hcmrWRRMDGPn9xdZj1YOOycQ533186x288FdU6UubU3OlnWJz6D / ext4 defaults 0 1
# /usr was on /dev/vg0/lv-1 during curtin installation
/dev/disk/by-id/dm-uuid-LVM-OzFWT6NHkstr1hcmrWRRMDGPn9xdZj1YZu53m4ZssZ8Jeb3I14RAJwIj5YlHIb9P /usr ext4 defaults 0 1
The upshot of this fix is that we are now able to correctly inspect
and run virt-v2v on Ubuntu 22+ guests with split /usr. In particular,
we correctly map /etc/fstab entries like the above to LV device names,
which means that /usr merging now works correctly.
Reported-by: Jaroslav Spanko
Thanks: Daniel Berrange
Fixes: https://issues.redhat.com/browse/RHEL-87493
---
daemon/inspect_fs_unix_fstab.ml | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/daemon/inspect_fs_unix_fstab.ml b/daemon/inspect_fs_unix_fstab.ml
index 769959693..788b36caa 100644
--- a/daemon/inspect_fs_unix_fstab.ml
+++ b/daemon/inspect_fs_unix_fstab.ml
@@ -27,6 +27,7 @@ open Inspect_utils
let re_cciss = PCRE.compile "^/dev/(cciss/c\\d+d\\d+)(?:p(\\d+))?$"
let re_diskbyid = PCRE.compile "^/dev/disk/by-id/.*-part(\\d+)$"
+let re_dmuuid = PCRE.compile "^/dev/disk/by-id/dm-uuid-LVM-([0-9a-zA-Z]{32})([0-9a-zA-Z]{32})$"
let re_freebsd_gpt = PCRE.compile "^/dev/(ada{0,1}|vtbd)(\\d+)p(\\d+)$"
let re_freebsd_mbr = PCRE.compile "^/dev/(ada{0,1}|vtbd)(\\d+)s(\\d+)([a-z])$"
let re_hurd_dev = PCRE.compile "^/dev/(h)d(\\d+)s(\\d+)$"
@@ -407,6 +408,26 @@ and resolve_fstab_device spec md_map os_type =
Failure _ -> default
)
+ (* Ubuntu 22+ uses /dev/disk/by-id/dm-uuid-LVM-... followed by a
+ * double UUID which identifies an LV. The first part of the UUID
+ * is the VG UUID. The second part is the LV UUID.
+ *)
+ else if PCRE.matches re_dmuuid spec then (
+ debug_matching "dmuuid";
+ let vg_uuid_spec = PCRE.sub 1 and lv_uuid_spec = PCRE.sub 2 in
+ try
+ (* Get the list of all VGs and LVs. *)
+ let vgs = Lvm_full.vgs_full () and lvs = Lvm_full.lvs_full () in
+ (* Find one VG & LV (hopefully) that matches the UUIDs. *)
+ let vg =
+ List.find (fun { Structs.vg_uuid } -> vg_uuid = vg_uuid_spec) vgs
+ and lv =
+ List.find (fun { Structs.lv_uuid } -> lv_uuid = lv_uuid_spec) lvs in
+ Mountable.of_device (sprintf "/dev/%s/%s" vg.vg_name lv.lv_name)
+ with
+ Failure _ | Not_found -> default
+ )
+
else if PCRE.matches re_freebsd_gpt spec then (
debug_matching "FreeBSD GPT";
(* group 1 (type) is not used *)
--
2.47.1

View File

@ -1,4 +1,4 @@
From 61c266ec6c4190f9ad27413cc15461678e5979d6 Mon Sep 17 00:00:00 2001 From c3766f3353338baae501b95a4353d3040b12ff28 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com> From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 29 Jul 2013 14:47:56 +0100 Date: Mon, 29 Jul 2013 14:47:56 +0100
Subject: [PATCH] RHEL: Disable unsupported remote drive protocols Subject: [PATCH] RHEL: Disable unsupported remote drive protocols
@ -180,7 +180,7 @@ index e4e1021db..8419ce78a 100755
rm test-add-uri.out rm test-add-uri.out
rm test-add-uri.img rm test-add-uri.img
diff --git a/generator/actions_core.ml b/generator/actions_core.ml diff --git a/generator/actions_core.ml b/generator/actions_core.ml
index 5e8de563a..5e347ca85 100644 index 34bd15ae6..f56bacff6 100644
--- a/generator/actions_core.ml --- a/generator/actions_core.ml
+++ b/generator/actions_core.ml +++ b/generator/actions_core.ml
@@ -350,22 +350,6 @@ F<filename> is interpreted as a local file or device. @@ -350,22 +350,6 @@ F<filename> is interpreted as a local file or device.

View File

@ -1,4 +1,4 @@
From fb0b57a61b6a5a2259fb9f7ad2d6271f505acde4 Mon Sep 17 00:00:00 2001 From 7fc7794f9fcf5f098b394d177be9f4281c3614f3 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com> From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 7 Jul 2015 09:28:03 -0400 Date: Tue, 7 Jul 2015 09:28:03 -0400
Subject: [PATCH] RHEL: Reject use of libguestfs-winsupport features except for Subject: [PATCH] RHEL: Reject use of libguestfs-winsupport features except for
@ -13,10 +13,10 @@ edits.
3 files changed, 19 insertions(+) 3 files changed, 19 insertions(+)
diff --git a/generator/c.ml b/generator/c.ml diff --git a/generator/c.ml b/generator/c.ml
index a51031eff..90b8ffeb9 100644 index c6e5dd994..b6cc0da20 100644
--- a/generator/c.ml --- a/generator/c.ml
+++ b/generator/c.ml +++ b/generator/c.ml
@@ -1836,6 +1836,22 @@ and generate_client_actions actions () = @@ -1834,6 +1834,22 @@ and generate_client_actions actions () =
check_args_validity c_name style; check_args_validity c_name style;
trace_call name c_name style; trace_call name c_name style;

View File

@ -41,7 +41,7 @@ ExcludeArch: %{ix86}
Summary: Access and modify virtual machine disk images Summary: Access and modify virtual machine disk images
Name: libguestfs Name: libguestfs
Epoch: 1 Epoch: 1
Version: 1.55.6 Version: 1.55.8
Release: 1%{?dist}.alma.1 Release: 1%{?dist}.alma.1
License: LGPL-2.1-or-later License: LGPL-2.1-or-later
@ -82,10 +82,19 @@ Source8: copy-patches.sh
# https://github.com/libguestfs/libguestfs/commits/rhel-10.1 # https://github.com/libguestfs/libguestfs/commits/rhel-10.1
# Patches. # Patches.
Patch0001: 0001-RHEL-Disable-unsupported-remote-drive-protocols-RHBZ.patch Patch0001: 0001-Translated-using-Weblate-Finnish.patch
Patch0002: 0002-RHEL-Reject-use-of-libguestfs-winsupport-features-ex.patch Patch0002: 0002-Update-translation-files.patch
Patch0003: 0003-lib-Print-kernel-utsname-in-debug-output.patch Patch0003: 0003-common-update-submodule.patch
Patch0004: 0004-daemon-Fix-loongarch64-detection-on-RHEL-9.patch Patch0004: 0004-daemon-inspect-Add-some-debugging-of-usr-merging.patch
Patch0005: 0005-generator-Implement-struct-FDevice-type.patch
Patch0006: 0006-generator-Use-new-FDevice-type-for-the-pvs-full-pv_n.patch
Patch0007: 0007-daemon-inspect-Resolve-Ubuntu-22-dev-disk-by-uuid-in.patch
Patch0008: 0008-generator-Fix-implementation-of-FUUID-for-OCaml-func.patch
Patch0009: 0009-Update-common-submodule.patch
Patch0010: 0010-daemon-Rewrite-pvs-vgs-lvs-full-APIs-in-OCaml.patch
Patch0011: 0011-daemon-inspect-Resolve-Ubuntu-22-dev-disk-by-id-dm-u.patch
Patch0012: 0012-RHEL-Disable-unsupported-remote-drive-protocols-RHBZ.patch
Patch0013: 0013-RHEL-Reject-use-of-libguestfs-winsupport-features-ex.patch
BuildRequires: autoconf, automake, libtool, gettext-devel BuildRequires: autoconf, automake, libtool, gettext-devel
@ -115,8 +124,6 @@ BuildRequires: pcre2-devel
BuildRequires: file-devel BuildRequires: file-devel
BuildRequires: libvirt-devel BuildRequires: libvirt-devel
BuildRequires: gperf BuildRequires: gperf
BuildRequires: flex
BuildRequires: bison
BuildRequires: rpm-devel BuildRequires: rpm-devel
BuildRequires: cpio BuildRequires: cpio
BuildRequires: libconfig-devel BuildRequires: libconfig-devel
@ -156,7 +163,6 @@ BuildRequires: ocaml >= 4.08
BuildRequires: ocaml-ocamldoc BuildRequires: ocaml-ocamldoc
BuildRequires: ocaml-findlib-devel BuildRequires: ocaml-findlib-devel
%if !0%{?rhel} %if !0%{?rhel}
BuildRequires: ocaml-ounit-devel
BuildRequires: lua BuildRequires: lua
BuildRequires: lua-devel BuildRequires: lua-devel
%endif %endif
@ -1115,14 +1121,17 @@ rm ocaml/html/.gitignore
%changelog %changelog
* Wed Mar 12 2025 Eduard Abdullin <eabdullin@almalinux.org> - 1:1.55.6-1.alma.1 * Fri Apr 18 2025 Eduard Abdullin <eabdullin@almalinux.org> - 1:1.55.8-1.alma.1
- Enable building for ppc64le - Enable building for ppc64le
* Tue Mar 11 2025 Richard W.M. Jones <rjones@redhat.com> - 1:1.55.6-1 * Wed Apr 16 2025 Richard W.M. Jones <rjones@redhat.com> - 1:1.55.8-1
- Rebase to libguestfs 1.55.6 - Rebase to libguestfs 1.55.8
resolves: RHEL-81733 resolves: RHEL-81733
- Include host kernel information in libguestfs debugging output - Include host kernel information in libguestfs debugging output
resolves: RHEL-83026 resolves: RHEL-83026
- Fix virt-v2v conversion of split /usr Ubuntu 22+
resolves: RHEL-87622
- Remove dependencies on oUnit, flex, bison
* Tue Nov 26 2024 Richard W.M. Jones <rjones@redhat.com> - 1:1.54.0-5 * Tue Nov 26 2024 Richard W.M. Jones <rjones@redhat.com> - 1:1.54.0-5
- Rebase to libguestfs 1.54.0 - Rebase to libguestfs 1.54.0

View File

@ -1,2 +1,2 @@
SHA512 (libguestfs-1.55.6.tar.gz) = 3dba2f8c2086024674375d054a214d34a028345e2f32cf439de38dfe2815ab2cc6cc64cff58b59ed2f38712006e1563fdf58713ccecfe155b7542742a4ee5104 SHA512 (libguestfs-1.55.8.tar.gz) = 86510eb82c03381d432bca2ef1d077a971e0d0f27c7852a81dff0228bd3745748a19dff597defb948dd182568a0a949aaa37a1bbd619a96f976b4974f7c81c92
SHA512 (libguestfs-1.55.6.tar.gz.sig) = db4c89e918b2404f511734d34c98aedd58c3b1446d8831c7793958e1f70d24fe5378b331d015b53ad7f90ec04c9aa98fe7d6390b08e80fdac19691a4e30b95dd SHA512 (libguestfs-1.55.8.tar.gz.sig) = 08d64a4c1e885201961af6e48f95c7d2cccf6fa2ee5c50db5890b673f5e6397f09b89432a7ac1b5f6890424873b359c5f74d264bc2f243ed84fb1738c142cec1