diff --git a/0001-Translated-using-Weblate-Finnish.patch b/0001-Translated-using-Weblate-Finnish.patch new file mode 100644 index 0000000..bb93c29 --- /dev/null +++ b/0001-Translated-using-Weblate-Finnish.patch @@ -0,0 +1,79 @@ +From 1b27b7ed1a24030fc840123badf514e0a7b58341 Mon Sep 17 00:00:00 2001 +From: Ricky Tigg +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 \n" + "Language-Team: Finnish \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 + diff --git a/0002-Update-translation-files.patch b/0002-Update-translation-files.patch new file mode 100644 index 0000000..8faec28 --- /dev/null +++ b/0002-Update-translation-files.patch @@ -0,0 +1,1703 @@ +From 8cad86d63c3403bb67d963e2d338328ef95cf231 Mon Sep 17 00:00:00 2001 +From: Weblate +Date: Fri, 4 Apr 2025 10:06:26 +0000 +Subject: [PATCH] Update translation files + +Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. + +Translation: libguestfs/libguestfs-master +Translate-URL: https://translate.fedoraproject.org/projects/libguestfs/libguestfs-master/ +--- + po/cs.po | 20 ++++++++++---------- + po/de.po | 24 ++++++++++++------------ + po/en_GB.po | 20 ++++++++++---------- + po/es.po | 20 ++++++++++---------- + po/eu.po | 20 ++++++++++---------- + po/fi.po | 24 ++++++++++++------------ + po/fr.po | 20 ++++++++++---------- + po/gu.po | 20 ++++++++++---------- + po/hi.po | 20 ++++++++++---------- + po/ja.po | 20 ++++++++++---------- + po/ka.po | 20 ++++++++++---------- + po/kn.po | 20 ++++++++++---------- + po/ml.po | 20 ++++++++++---------- + po/mr.po | 20 ++++++++++---------- + po/nl.po | 20 ++++++++++---------- + po/or.po | 20 ++++++++++---------- + po/pa.po | 20 ++++++++++---------- + po/pl.po | 20 ++++++++++---------- + po/ru.po | 20 ++++++++++---------- + po/si.po | 20 ++++++++++---------- + po/ta.po | 20 ++++++++++---------- + po/te.po | 20 ++++++++++---------- + po/tg.po | 20 ++++++++++---------- + po/uk.po | 20 ++++++++++---------- + po/zh_CN.po | 20 ++++++++++---------- + 25 files changed, 254 insertions(+), 254 deletions(-) + +diff --git a/po/cs.po b/po/cs.po +index 7c5911c7f..6dde24a8a 100644 +--- a/po/cs.po ++++ b/po/cs.po +@@ -5,7 +5,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.39.12\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2023-04-06 20:20+0000\n" + "Last-Translator: Pavel Borecki \n" + "Language-Team: Czech \n" + "Language-Team: German \n" + "Language-Team: English (United Kingdom) \n" + "Language-Team: Spanish (http://www.transifex.com/projects/p/libguestfs/" +@@ -4234,43 +4234,43 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" + msgstr "" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "" +diff --git a/po/eu.po b/po/eu.po +index a88ad9998..23aeb8b01 100644 +--- a/po/eu.po ++++ b/po/eu.po +@@ -9,7 +9,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.39.12\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2015-02-21 10:49+0000\n" + "Last-Translator: Copied by Zanata \n" + "Language-Team: Basque (http://www.transifex.com/projects/p/libguestfs/" +@@ -3993,43 +3993,43 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" + msgstr "" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "" +diff --git a/po/fi.po b/po/fi.po +index 5c01bd861..6eed27c15 100644 +--- a/po/fi.po ++++ b/po/fi.po +@@ -6,9 +6,9 @@ + 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" +-"POT-Creation-Date: 2025-03-11 14:34+0000\n" ++"Report-Msgid-Bugs-To: https://bugzilla.redhat.com/enter_bug.cgi?" ++"component=libguestfs&product=Virtualization+Tools\n" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2025-04-04 10:05+0000\n" + "Last-Translator: Ricky Tigg \n" + "Language-Team: Finnish \n" + "Language-Team: French \n" + "Language-Team: Gujarati (http://www.transifex.com/projects/p/libguestfs/" +@@ -4013,43 +4013,43 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" + msgstr "" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "" +diff --git a/po/hi.po b/po/hi.po +index 0f6c7091e..7bafd7f82 100644 +--- a/po/hi.po ++++ b/po/hi.po +@@ -10,7 +10,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.39.12\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2015-02-21 10:49+0000\n" + "Last-Translator: Copied by Zanata \n" + "Language-Team: Hindi (http://www.transifex.com/projects/p/libguestfs/" +@@ -4008,43 +4008,43 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" + msgstr "" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "" +diff --git a/po/ja.po b/po/ja.po +index 12a18a060..16a78a68d 100644 +--- a/po/ja.po ++++ b/po/ja.po +@@ -11,7 +11,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.39.12\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2017-02-24 07:33+0000\n" + "Last-Translator: Copied by Zanata \n" + "Language-Team: Japanese (http://www.transifex.com/projects/p/libguestfs/" +@@ -4257,12 +4257,12 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" +@@ -4270,32 +4270,32 @@ msgstr "" + "libvirt が qemu curl ドライバープロトコル (ftp, http など) をサポートしませ" + "ん; LIBGUESTFS_BACKEND=direct の設定を試してください" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "libvirt 仮想マシンを強制停止できませんでした" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "%s: エラーメッセージを形成している内部エラー" +diff --git a/po/ka.po b/po/ka.po +index f536e7f59..11f873ccd 100644 +--- a/po/ka.po ++++ b/po/ka.po +@@ -7,7 +7,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.49.1\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2023-11-26 21:01+0000\n" + "Last-Translator: Temuri Doghonadze \n" + "Language-Team: Georgian \n" + "Language-Team: Kannada (http://www.transifex.com/projects/p/libguestfs/" +@@ -4014,43 +4014,43 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" + msgstr "" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "" +diff --git a/po/ml.po b/po/ml.po +index ba444fb4b..109e4221d 100644 +--- a/po/ml.po ++++ b/po/ml.po +@@ -9,7 +9,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.39.12\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2015-02-21 10:50+0000\n" + "Last-Translator: Copied by Zanata \n" + "Language-Team: Malayalam (http://www.transifex.com/projects/p/libguestfs/" +@@ -4011,43 +4011,43 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" + msgstr "" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "" +diff --git a/po/mr.po b/po/mr.po +index 4370fa8df..ad10d9fad 100644 +--- a/po/mr.po ++++ b/po/mr.po +@@ -10,7 +10,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.39.12\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2015-02-21 10:51+0000\n" + "Last-Translator: Copied by Zanata \n" + "Language-Team: Marathi (http://www.transifex.com/projects/p/libguestfs/" +@@ -4167,43 +4167,43 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" + msgstr "" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "" +diff --git a/po/nl.po b/po/nl.po +index ec9cc1ff6..b364c9ffd 100644 +--- a/po/nl.po ++++ b/po/nl.po +@@ -11,7 +11,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.39.12\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2015-02-21 10:51+0000\n" + "Last-Translator: Copied by Zanata \n" + "Language-Team: Dutch (http://www.transifex.com/projects/p/libguestfs/" +@@ -4205,43 +4205,43 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" + msgstr "" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "kon libvirt domein niet vernietigen" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "%s: interne fout bij formuleren van foutboodschap" +diff --git a/po/or.po b/po/or.po +index 0b489f19f..cb620084b 100644 +--- a/po/or.po ++++ b/po/or.po +@@ -9,7 +9,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.39.12\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2015-02-21 10:51+0000\n" + "Last-Translator: Copied by Zanata \n" + "Language-Team: Oriya (http://www.transifex.com/projects/p/libguestfs/" +@@ -4008,43 +4008,43 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" + msgstr "" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "" +diff --git a/po/pa.po b/po/pa.po +index baf94e876..cc7a56043 100644 +--- a/po/pa.po ++++ b/po/pa.po +@@ -10,7 +10,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.39.12\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2015-02-21 10:52+0000\n" + "Last-Translator: Copied by Zanata \n" + "Language-Team: Panjabi (Punjabi) (http://www.transifex.com/projects/p/" +@@ -4164,43 +4164,43 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" + msgstr "" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "" +diff --git a/po/pl.po b/po/pl.po +index 2d12570ef..e65014ba5 100644 +--- a/po/pl.po ++++ b/po/pl.po +@@ -15,7 +15,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.39.12\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2022-07-31 11:55+0000\n" + "Last-Translator: Piotr Drąg \n" + "Language-Team: Polish \n" + "Language-Team: Russian (http://www.transifex.com/projects/p/libguestfs/" +@@ -3994,43 +3994,43 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" + msgstr "" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "" +diff --git a/po/si.po b/po/si.po +index 258f3bd31..5af277c4e 100644 +--- a/po/si.po ++++ b/po/si.po +@@ -7,7 +7,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.45.1\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" + "Last-Translator: Automatically generated\n" + "Language-Team: none\n" +@@ -3988,43 +3988,43 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" + msgstr "" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "" +diff --git a/po/ta.po b/po/ta.po +index 84b7f90a8..a7f643b72 100644 +--- a/po/ta.po ++++ b/po/ta.po +@@ -9,7 +9,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.39.12\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2015-02-21 10:53+0000\n" + "Last-Translator: Copied by Zanata \n" + "Language-Team: Tamil (http://www.transifex.com/projects/p/libguestfs/" +@@ -4007,43 +4007,43 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" + msgstr "" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "" +diff --git a/po/te.po b/po/te.po +index 611efb650..9d4802c0f 100644 +--- a/po/te.po ++++ b/po/te.po +@@ -9,7 +9,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.39.12\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2015-02-21 10:53+0000\n" + "Last-Translator: Copied by Zanata \n" + "Language-Team: Telugu (http://www.transifex.com/projects/p/libguestfs/" +@@ -4005,43 +4005,43 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" + msgstr "" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "" +diff --git a/po/tg.po b/po/tg.po +index 03c40f614..5410e48e9 100644 +--- a/po/tg.po ++++ b/po/tg.po +@@ -8,7 +8,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.39.12\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2015-02-21 10:53+0000\n" + "Last-Translator: Copied by Zanata \n" + "Language-Team: Tajik (http://www.transifex.com/projects/p/libguestfs/" +@@ -3992,43 +3992,43 @@ msgstr "" + msgid "unable to parse domain capabilities XML returned by libvirt" + msgstr "" + +-#: lib/launch-libvirt.c:1503 lib/launch-libvirt.c:1756 lib/qemu.c:766 ++#: lib/launch-libvirt.c:1496 lib/launch-libvirt.c:1749 lib/qemu.c:766 + #, c-format + msgid "realpath: could not convert ‘%s’ to absolute path" + msgstr "" + +-#: lib/launch-libvirt.c:1581 ++#: lib/launch-libvirt.c:1574 + msgid "" + "libvirt does not support the qemu curl driver protocols (ftp, http, etc.); " + "try setting LIBGUESTFS_BACKEND=direct" + msgstr "" + +-#: lib/launch-libvirt.c:1971 ++#: lib/launch-libvirt.c:1964 + msgid "could not define libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:1982 ++#: lib/launch-libvirt.c:1975 + msgid "rbd protocol secret must be base64 encoded" + msgstr "" + +-#: lib/launch-libvirt.c:1986 ++#: lib/launch-libvirt.c:1979 + #, c-format + msgid "base64_decode_alloc: %m" + msgstr "" + +-#: lib/launch-libvirt.c:2004 ++#: lib/launch-libvirt.c:1997 + msgid "could not set libvirt secret value" + msgstr "" + +-#: lib/launch-libvirt.c:2017 ++#: lib/launch-libvirt.c:2010 + msgid "could not get UUID from libvirt secret" + msgstr "" + +-#: lib/launch-libvirt.c:2187 ++#: lib/launch-libvirt.c:2180 + msgid "could not destroy libvirt domain" + msgstr "" + +-#: lib/launch-libvirt.c:2208 lib/launch-libvirt.c:2241 ++#: lib/launch-libvirt.c:2201 lib/launch-libvirt.c:2234 + #, c-format + msgid "%s: internal error forming error message" + msgstr "" +diff --git a/po/uk.po b/po/uk.po +index b818fcfdf..94c7a0cc3 100644 +--- a/po/uk.po ++++ b/po/uk.po +@@ -15,7 +15,7 @@ msgstr "" + "Project-Id-Version: libguestfs 1.39.12\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" ++"POT-Creation-Date: 2025-04-03 19:19+0100\n" + "PO-Revision-Date: 2025-03-05 06:38+0000\n" + "Last-Translator: Yuri Chornoivan \n" + "Language-Team: Ukrainian \n" + "Language-Team: Chinese (Simplified) +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 +--- + 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). + +-=item B<\"osinfo\"> +- +-The literal string C<\"osinfo\"> means to use the +-libosinfo database to locate the drivers. (See +-L. +- + =back + + Note that to do a full conversion of a Windows guest from a +-- +2.47.1 + diff --git a/0003-lib-Print-kernel-utsname-in-debug-output.patch b/0003-lib-Print-kernel-utsname-in-debug-output.patch deleted file mode 100644 index df65b00..0000000 --- a/0003-lib-Print-kernel-utsname-in-debug-output.patch +++ /dev/null @@ -1,48 +0,0 @@ -From a2bd2c18940c8779da87737c9811ca0b63e96dde Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -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 - #include - #include -+#include - #include - #include - #include -@@ -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 - diff --git a/0004-daemon-Fix-loongarch64-detection-on-RHEL-9.patch b/0004-daemon-Fix-loongarch64-detection-on-RHEL-9.patch deleted file mode 100644 index 158c81c..0000000 --- a/0004-daemon-Fix-loongarch64-detection-on-RHEL-9.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 02a4073c0a416d5a6c1592b4f3647750869acc28 Mon Sep 17 00:00:00 2001 -From: "Richard W.M. Jones" -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 - diff --git a/0004-daemon-inspect-Add-some-debugging-of-usr-merging.patch b/0004-daemon-inspect-Add-some-debugging-of-usr-merging.patch new file mode 100644 index 0000000..462af94 --- /dev/null +++ b/0004-daemon-inspect-Add-some-debugging-of-usr-merging.patch @@ -0,0 +1,71 @@ +From 2d1e8941301373d04a436333219358a72f9660f1 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +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 + diff --git a/0005-generator-Implement-struct-FDevice-type.patch b/0005-generator-Implement-struct-FDevice-type.patch new file mode 100644 index 0000000..682970f --- /dev/null +++ b/0005-generator-Implement-struct-FDevice-type.patch @@ -0,0 +1,491 @@ +From 0ff73a42c7f4f309fbab11ea2e89ee6f0501367d Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +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,\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 + diff --git a/0006-generator-Use-new-FDevice-type-for-the-pvs-full-pv_n.patch b/0006-generator-Use-new-FDevice-type-for-the-pvs-full-pv_n.patch new file mode 100644 index 0000000..dee9f23 --- /dev/null +++ b/0006-generator-Use-new-FDevice-type-for-the-pvs-full-pv_n.patch @@ -0,0 +1,69 @@ +From 5a16d1120fb7b046974abde43b1c40250bfd1a95 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +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 + diff --git a/0007-daemon-inspect-Resolve-Ubuntu-22-dev-disk-by-uuid-in.patch b/0007-daemon-inspect-Resolve-Ubuntu-22-dev-disk-by-uuid-in.patch new file mode 100644 index 0000000..6240f36 --- /dev/null +++ b/0007-daemon-inspect-Resolve-Ubuntu-22-dev-disk-by-uuid-in.patch @@ -0,0 +1,47 @@ +From 7a1ffd744b12c4c79fa1b78341ea714d831f4205 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +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 + diff --git a/0008-generator-Fix-implementation-of-FUUID-for-OCaml-func.patch b/0008-generator-Fix-implementation-of-FUUID-for-OCaml-func.patch new file mode 100644 index 0000000..57a0fa8 --- /dev/null +++ b/0008-generator-Fix-implementation-of-FUUID-for-OCaml-func.patch @@ -0,0 +1,44 @@ +From bcd6b3ec3a1038d840e832732b3910f939566436 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +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 + #include + #include ++#include + + #include + #include +@@ -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 + diff --git a/0009-Update-common-submodule.patch b/0009-Update-common-submodule.patch new file mode 100644 index 0000000..e1f7b86 --- /dev/null +++ b/0009-Update-common-submodule.patch @@ -0,0 +1,45 @@ +From 3f9078261ce917231eb62575557b1c9fb076a91f Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +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 diff --git a/0010-daemon-Rewrite-pvs-vgs-lvs-full-APIs-in-OCaml.patch b/0010-daemon-Rewrite-pvs-vgs-lvs-full-APIs-in-OCaml.patch new file mode 100644 index 0000000..98d8d42 --- /dev/null +++ b/0010-daemon-Rewrite-pvs-vgs-lvs-full-APIs-in-OCaml.patch @@ -0,0 +1,660 @@ +From a73f248369d35249a9324a0e0df9f7ccd1420d3f Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +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, C." }; + { 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 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 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 +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#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 + diff --git a/0011-daemon-inspect-Resolve-Ubuntu-22-dev-disk-by-id-dm-u.patch b/0011-daemon-inspect-Resolve-Ubuntu-22-dev-disk-by-id-dm-u.patch new file mode 100644 index 0000000..2a6c881 --- /dev/null +++ b/0011-daemon-inspect-Resolve-Ubuntu-22-dev-disk-by-id-dm-u.patch @@ -0,0 +1,72 @@ +From e43ca1912973b3ddfa73b09a4690aa8bb26e08af Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +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 + diff --git a/0001-RHEL-Disable-unsupported-remote-drive-protocols-RHBZ.patch b/0012-RHEL-Disable-unsupported-remote-drive-protocols-RHBZ.patch similarity index 99% rename from 0001-RHEL-Disable-unsupported-remote-drive-protocols-RHBZ.patch rename to 0012-RHEL-Disable-unsupported-remote-drive-protocols-RHBZ.patch index 170f396..97e6449 100644 --- a/0001-RHEL-Disable-unsupported-remote-drive-protocols-RHBZ.patch +++ b/0012-RHEL-Disable-unsupported-remote-drive-protocols-RHBZ.patch @@ -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" Date: Mon, 29 Jul 2013 14:47:56 +0100 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.img 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 +++ b/generator/actions_core.ml @@ -350,22 +350,6 @@ F is interpreted as a local file or device. diff --git a/0002-RHEL-Reject-use-of-libguestfs-winsupport-features-ex.patch b/0013-RHEL-Reject-use-of-libguestfs-winsupport-features-ex.patch similarity index 93% rename from 0002-RHEL-Reject-use-of-libguestfs-winsupport-features-ex.patch rename to 0013-RHEL-Reject-use-of-libguestfs-winsupport-features-ex.patch index d41bca4..01152c5 100644 --- a/0002-RHEL-Reject-use-of-libguestfs-winsupport-features-ex.patch +++ b/0013-RHEL-Reject-use-of-libguestfs-winsupport-features-ex.patch @@ -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" Date: Tue, 7 Jul 2015 09:28:03 -0400 Subject: [PATCH] RHEL: Reject use of libguestfs-winsupport features except for @@ -13,10 +13,10 @@ edits. 3 files changed, 19 insertions(+) diff --git a/generator/c.ml b/generator/c.ml -index a51031eff..90b8ffeb9 100644 +index c6e5dd994..b6cc0da20 100644 --- a/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; trace_call name c_name style; diff --git a/libguestfs.spec b/libguestfs.spec index 3544477..4220301 100644 --- a/libguestfs.spec +++ b/libguestfs.spec @@ -41,7 +41,7 @@ ExcludeArch: %{ix86} Summary: Access and modify virtual machine disk images Name: libguestfs Epoch: 1 -Version: 1.55.6 +Version: 1.55.8 Release: 1%{?dist}.alma.1 License: LGPL-2.1-or-later @@ -82,10 +82,19 @@ Source8: copy-patches.sh # https://github.com/libguestfs/libguestfs/commits/rhel-10.1 # Patches. -Patch0001: 0001-RHEL-Disable-unsupported-remote-drive-protocols-RHBZ.patch -Patch0002: 0002-RHEL-Reject-use-of-libguestfs-winsupport-features-ex.patch -Patch0003: 0003-lib-Print-kernel-utsname-in-debug-output.patch -Patch0004: 0004-daemon-Fix-loongarch64-detection-on-RHEL-9.patch +Patch0001: 0001-Translated-using-Weblate-Finnish.patch +Patch0002: 0002-Update-translation-files.patch +Patch0003: 0003-common-update-submodule.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 @@ -115,8 +124,6 @@ BuildRequires: pcre2-devel BuildRequires: file-devel BuildRequires: libvirt-devel BuildRequires: gperf -BuildRequires: flex -BuildRequires: bison BuildRequires: rpm-devel BuildRequires: cpio BuildRequires: libconfig-devel @@ -156,7 +163,6 @@ BuildRequires: ocaml >= 4.08 BuildRequires: ocaml-ocamldoc BuildRequires: ocaml-findlib-devel %if !0%{?rhel} -BuildRequires: ocaml-ounit-devel BuildRequires: lua BuildRequires: lua-devel %endif @@ -1115,14 +1121,17 @@ rm ocaml/html/.gitignore %changelog -* Wed Mar 12 2025 Eduard Abdullin - 1:1.55.6-1.alma.1 +* Fri Apr 18 2025 Eduard Abdullin - 1:1.55.8-1.alma.1 - Enable building for ppc64le -* Tue Mar 11 2025 Richard W.M. Jones - 1:1.55.6-1 -- Rebase to libguestfs 1.55.6 +* Wed Apr 16 2025 Richard W.M. Jones - 1:1.55.8-1 +- Rebase to libguestfs 1.55.8 resolves: RHEL-81733 - Include host kernel information in libguestfs debugging output 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 - 1:1.54.0-5 - Rebase to libguestfs 1.54.0 diff --git a/sources b/sources index 6e57975..fc72b4e 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ -SHA512 (libguestfs-1.55.6.tar.gz) = 3dba2f8c2086024674375d054a214d34a028345e2f32cf439de38dfe2815ab2cc6cc64cff58b59ed2f38712006e1563fdf58713ccecfe155b7542742a4ee5104 -SHA512 (libguestfs-1.55.6.tar.gz.sig) = db4c89e918b2404f511734d34c98aedd58c3b1446d8831c7793958e1f70d24fe5378b331d015b53ad7f90ec04c9aa98fe7d6390b08e80fdac19691a4e30b95dd +SHA512 (libguestfs-1.55.8.tar.gz) = 86510eb82c03381d432bca2ef1d077a971e0d0f27c7852a81dff0228bd3745748a19dff597defb948dd182568a0a949aaa37a1bbd619a96f976b4974f7c81c92 +SHA512 (libguestfs-1.55.8.tar.gz.sig) = 08d64a4c1e885201961af6e48f95c7d2cccf6fa2ee5c50db5890b673f5e6397f09b89432a7ac1b5f6890424873b359c5f74d264bc2f243ed84fb1738c142cec1