[libvirt PATCH 6/7] Do not check return value of VIR_REALLOC_N

2021-03-19 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 src/bhyve/bhyve_parse_command.c |  8 +++---
 src/conf/capabilities.c |  3 +--
 src/conf/domain_conf.c  | 11 
 src/conf/storage_conf.c |  3 +--
 src/conf/virinterfaceobj.c  |  2 +-
 src/conf/virnetworkobj.c|  4 +--
 src/conf/virnodedeviceobj.c |  2 +-
 src/conf/virsecretobj.c |  2 +-
 src/conf/virstorageobj.c|  2 +-
 src/esx/esx_stream.c|  3 +--
 src/interface/interface_backend_netcf.c |  2 +-
 src/interface/interface_backend_udev.c  |  2 +-
 src/libxl/libxl_capabilities.c  |  3 +--
 src/libxl/libxl_conf.c  | 14 --
 src/libxl/libxl_driver.c| 15 ---
 src/qemu/qemu_agent.c   |  4 +--
 src/qemu/qemu_firmware.c|  5 ++--
 src/qemu/qemu_hotplug.c | 36 +
 src/qemu/qemu_monitor.c |  4 +--
 src/qemu/qemu_monitor_json.c| 12 ++---
 src/qemu/qemu_process.c | 25 ++---
 src/rpc/virnetclient.c  |  3 +--
 src/rpc/virnetmessage.c | 12 +++--
 src/storage/storage_backend_disk.c  |  4 +--
 src/storage/storage_backend_logical.c   |  3 +--
 src/storage/storage_backend_rbd.c   |  3 +--
 src/util/virarptable.c  |  3 +--
 src/util/vircommand.c   |  5 ++--
 src/util/virdnsmasq.c   | 13 +++--
 src/util/virfile.c  |  5 +---
 src/util/virjson.c  | 13 +++--
 src/util/virnuma.c  | 14 +-
 src/util/virstring.c|  3 +--
 src/util/virsysinfo.c   |  3 +--
 src/vbox/vbox_common.c  |  4 +--
 tests/domaincapstest.c  |  8 ++
 tests/qemublocktest.c   |  3 +--
 tests/viralloctest.c|  9 +++
 tools/virsh-console.c   | 22 ++-
 tools/virt-login-shell-helper.c |  3 +--
 tools/vsh.c |  6 ++---
 41 files changed, 96 insertions(+), 205 deletions(-)

diff --git a/src/bhyve/bhyve_parse_command.c b/src/bhyve/bhyve_parse_command.c
index 8d9a21e671..70f5ac42a0 100644
--- a/src/bhyve/bhyve_parse_command.c
+++ b/src/bhyve/bhyve_parse_command.c
@@ -219,8 +219,8 @@ bhyveCommandLineToArgv(const char *nativeConfig,
  * Otherwise, later argument lists may be assigned to _argv without
  * freeing the earlier ones. */
 if (!_bhyve_argv && STREQ(arglist[0], "/usr/sbin/bhyve")) {
-if ((VIR_REALLOC_N(_bhyve_argv, args_count + 1) < 0)
-|| (!bhyve_argc))
+VIR_REALLOC_N(_bhyve_argv, args_count + 1);
+if (!bhyve_argc)
 goto error;
 for (j = 0; j < args_count; j++)
 _bhyve_argv[j] = arglist[j];
@@ -228,8 +228,8 @@ bhyveCommandLineToArgv(const char *nativeConfig,
 *bhyve_argc = args_count-1;
 VIR_FREE(arglist);
 } else if (!_loader_argv) {
-if ((VIR_REALLOC_N(_loader_argv, args_count + 1) < 0)
-|| (!loader_argc))
+VIR_REALLOC_N(_loader_argv, args_count + 1);
+if (!loader_argc)
 goto error;
 for (j = 0; j < args_count; j++)
 _loader_argv[j] = arglist[j];
diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
index bc9035afae..573ac4e975 100644
--- a/src/conf/capabilities.c
+++ b/src/conf/capabilities.c
@@ -1476,8 +1476,7 @@ virCapabilitiesGetNUMASiblingInfo(int node,
 tmp_size++;
 }
 
-if (VIR_REALLOC_N(tmp, tmp_size) < 0)
-goto cleanup;
+VIR_REALLOC_N(tmp, tmp_size);
 
 *nsiblings = tmp_size;
 *siblings = g_steal_pointer();
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index afbd6fc7c1..95602ae57e 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -3433,8 +3433,7 @@ virDomainIOThreadIDDefArrayInit(virDomainDefPtr def,
def->iothreadids[i]->iothread_id));
 
 /* resize array */
-if (VIR_REALLOC_N(def->iothreadids, iothreads) < 0)
-return -1;
+VIR_REALLOC_N(def->iothreadids, iothreads);
 
 /* Populate iothreadids[] using the set bit number from thrmap */
 while (def->niothreadids < iothreads) {
@@ -17587,7 +17586,8 @@ virDomainChrPreAlloc(virDomainDefPtr vmdef,
   , ) < 0)
 return -1;
 
-return VIR_REALLOC_N(*arrPtr, *cntPtr + 1);
+VIR_REALLOC_N(*arrPtr, *cntPtr + 1);
+return 0;
 }
 
 void
@@ -21442,8 +21442,9 @@ virDomainDefParseXML(xmlDocPtr xml,
 /* analysis of the host devices */
 if ((n = virXPathNodeSet("./devices/hostdev", ctxt, )) < 0)
 goto error;
-if (n && VIR_REALLOC_N(def->hostdevs, def->nhostdevs + 

[libvirt PATCH 4/7] Do not check return value of VIR_EXPAND_N

2021-03-19 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 src/access/viraccessdriverstack.c |  3 +-
 src/conf/backup_conf.c|  3 +-
 src/conf/capabilities.c   |  4 +-
 src/conf/domain_addr.c|  6 +--
 src/conf/domain_conf.c|  3 +-
 src/conf/nwfilter_conf.c  |  6 +--
 src/conf/nwfilter_params.c|  8 +---
 src/esx/esx_driver.c  |  4 +-
 src/hyperv/hyperv_wmi.c   |  3 +-
 src/hypervisor/domain_driver.c|  3 +-
 src/hypervisor/virclosecallbacks.c|  2 +-
 src/libxl/libxl_conf.c|  9 ++--
 src/libxl/xen_common.c|  6 +--
 src/locking/lock_driver_lockd.c   |  4 +-
 src/lxc/lxc_controller.c  | 18 ++--
 src/lxc/lxc_native.c  | 33 +--
 src/qemu/qemu_agent.c |  7 +---
 src/qemu/qemu_capabilities.c  |  3 +-
 src/qemu/qemu_conf.c  |  6 +--
 src/rpc/virnetclient.c| 16 +--
 src/rpc/virnetdaemon.c|  3 +-
 src/rpc/virnetlibsshsession.c |  8 +---
 src/rpc/virnetserver.c| 19 ++---
 src/rpc/virnetsocket.c|  3 +-
 src/rpc/virnetsshsession.c|  8 +---
 src/storage/storage_backend_rbd.c |  3 +-
 .../storage_file_backend_gluster.c|  3 +-
 .../storage_source_backingstore.c |  3 +-
 src/util/vircommand.c |  2 +-
 src/util/virfile.c| 14 ++-
 src/util/virfirewall.c|  3 +-
 src/util/virlockspace.c   |  7 +---
 src/util/virprocess.c | 17 +---
 src/util/virresctrl.c | 42 ---
 src/util/virstring.c  |  6 +--
 src/util/virsysinfo.c | 34 ---
 src/util/virsystemd.c |  3 +-
 src/util/virthreadpool.c  |  3 +-
 src/util/virtypedparam.c  |  3 +-
 src/vbox/vbox_snapshot_conf.c | 29 -
 tests/qemudomaincheckpointxml2xmltest.c   |  3 +-
 tests/qemumonitortestutils.c  | 12 ++
 tests/securityselinuxlabeltest.c  |  7 +---
 tests/viralloctest.c  |  3 +-
 tools/virsh-domain.c  | 27 +++-
 45 files changed, 106 insertions(+), 306 deletions(-)

diff --git a/src/access/viraccessdriverstack.c 
b/src/access/viraccessdriverstack.c
index 238caef115..0f0858e96e 100644
--- a/src/access/viraccessdriverstack.c
+++ b/src/access/viraccessdriverstack.c
@@ -40,8 +40,7 @@ int virAccessDriverStackAppend(virAccessManagerPtr manager,
 {
 virAccessDriverStackPrivatePtr priv = 
virAccessManagerGetPrivateData(manager);
 
-if (VIR_EXPAND_N(priv->managers, priv->managersLen, 1) < 0)
-return -1;
+VIR_EXPAND_N(priv->managers, priv->managersLen, 1);
 
 priv->managers[priv->managersLen-1] = child;
 
diff --git a/src/conf/backup_conf.c b/src/conf/backup_conf.c
index ba58b2e322..2d6d2d99f4 100644
--- a/src/conf/backup_conf.c
+++ b/src/conf/backup_conf.c
@@ -554,8 +554,7 @@ virDomainBackupAlignDisks(virDomainBackupDefPtr def,
 backup_all = true;
 
 ndisks = def->ndisks;
-if (VIR_EXPAND_N(def->disks, def->ndisks, dom->ndisks - def->ndisks) < 0)
-return -1;
+VIR_EXPAND_N(def->disks, def->ndisks, dom->ndisks - def->ndisks);
 
 for (i = 0; i < dom->ndisks; i++) {
 virDomainBackupDiskDefPtr backupdisk = NULL;
diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
index 14f0d48930..bc9035afae 100644
--- a/src/conf/capabilities.c
+++ b/src/conf/capabilities.c
@@ -580,9 +580,7 @@ 
virCapabilitiesHostSecModelAddBaseLabel(virCapsHostSecModelPtr secmodel,
 if (type == NULL || label == NULL)
 return -1;
 
-if (VIR_EXPAND_N(secmodel->labels, secmodel->nlabels, 1) < 0)
-return -1;
-
+VIR_EXPAND_N(secmodel->labels, secmodel->nlabels, 1);
 secmodel->labels[secmodel->nlabels - 1].type = g_strdup(type);
 secmodel->labels[secmodel->nlabels - 1].label = g_strdup(label);
 
diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
index 8b927689f8..9167b489d1 100644
--- a/src/conf/domain_addr.c
+++ b/src/conf/domain_addr.c
@@ -728,8 +728,7 @@ virDomainPCIAddressSetGrow(virDomainPCIAddressSetPtr addrs,
 
 i = addrs->nbuses;
 
-if (VIR_EXPAND_N(addrs->buses, addrs->nbuses, add) < 0)
-return -1;
+VIR_EXPAND_N(addrs->buses, addrs->nbuses, add);
 
 if (needDMIToPCIBridge) {
 /* first of the new buses is dmi-to-pci-bridge, the
@@ -1985,8 +1984,7 @@ 
virDomainUSBAddressSetAddController(virDomainUSBAddressSetPtr addrs,
 return 

[libvirt PATCH 3/7] util: Make virResizeN return void

2021-03-19 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 src/util/viralloc.c | 17 +
 src/util/viralloc.h |  4 ++--
 2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/src/util/viralloc.c b/src/util/viralloc.c
index 1317537c8a..cd770eb601 100644
--- a/src/util/viralloc.c
+++ b/src/util/viralloc.c
@@ -98,13 +98,13 @@ int virExpandN(void *ptrptr,
  * failure, 'ptrptr' and 'allocptr' are not changed. Any newly
  * allocated memory in 'ptrptr' is zero-filled.
  *
- * Returns zero on success, aborts on OOM
+ * Aborts on OOM
  */
-int virResizeN(void *ptrptr,
-   size_t size,
-   size_t *allocptr,
-   size_t count,
-   size_t add)
+void virResizeN(void *ptrptr,
+size_t size,
+size_t *allocptr,
+size_t count,
+size_t add)
 {
 size_t delta;
 
@@ -112,12 +112,13 @@ int virResizeN(void *ptrptr,
 abort();
 
 if (count + add <= *allocptr)
-return 0;
+return;
 
 delta = count + add - *allocptr;
 if (delta < *allocptr / 2)
 delta = *allocptr / 2;
-return virExpandN(ptrptr, size, allocptr, delta);
+
+virExpandN(ptrptr, size, allocptr, delta);
 }
 
 /**
diff --git a/src/util/viralloc.h b/src/util/viralloc.h
index d656d4ba0e..878c9485cf 100644
--- a/src/util/viralloc.h
+++ b/src/util/viralloc.h
@@ -38,7 +38,7 @@ int virReallocN(void *ptrptr, size_t size, size_t count)
 ATTRIBUTE_NONNULL(1);
 int virExpandN(void *ptrptr, size_t size, size_t *count, size_t add)
 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
-int virResizeN(void *ptrptr, size_t size, size_t *alloc, size_t count, size_t 
desired)
+void virResizeN(void *ptrptr, size_t size, size_t *alloc, size_t count, size_t 
desired)
 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
 void virShrinkN(void *ptrptr, size_t size, size_t *count, size_t toremove)
 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
@@ -102,7 +102,7 @@ int virDeleteElementsN(void *ptrptr, size_t size, size_t 
at, size_t *countptr,
  *
  * This macro is safe to use on arguments with side effects.
  *
- * Returns 0 on success, aborts on OOM
+ * Aborts on OOM
  */
 #define VIR_RESIZE_N(ptr, alloc, count, add) \
 virResizeN(&(ptr), sizeof(*(ptr)), &(alloc), count, add)
-- 
2.31.0



[libvirt PATCH 1/7] util: Drop G_GNUC_WARN_UNUSED_RESULT from reallocation APIs

2021-03-19 Thread Jiri Denemark
Our reallocation APIs already abort on OOM and thus can only return 0.
There's no need to force callers to check the result.

Signed-off-by: Jiri Denemark 
---
 src/util/viralloc.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/util/viralloc.h b/src/util/viralloc.h
index e3027622c4..d656d4ba0e 100644
--- a/src/util/viralloc.h
+++ b/src/util/viralloc.h
@@ -35,11 +35,11 @@
 
 /* Don't call these directly - use the macros below */
 int virReallocN(void *ptrptr, size_t size, size_t count)
-G_GNUC_WARN_UNUSED_RESULT ATTRIBUTE_NONNULL(1);
+ATTRIBUTE_NONNULL(1);
 int virExpandN(void *ptrptr, size_t size, size_t *count, size_t add)
-G_GNUC_WARN_UNUSED_RESULT ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
+ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
 int virResizeN(void *ptrptr, size_t size, size_t *alloc, size_t count, size_t 
desired)
-G_GNUC_WARN_UNUSED_RESULT ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
+ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
 void virShrinkN(void *ptrptr, size_t size, size_t *count, size_t toremove)
 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
 int virInsertElementsN(void *ptrptr, size_t size, size_t at, size_t *countptr,
-- 
2.31.0



[libvirt PATCH 2/7] Do not check return value of VIR_RESIZE_N

2021-03-19 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 src/bhyve/bhyve_capabilities.c  |  5 +
 src/bhyve/bhyve_parse_command.c | 11 ++
 src/conf/capabilities.c | 36 -
 src/conf/cpu_conf.c | 11 ++
 src/conf/domain_capabilities.c  |  5 ++---
 src/esx/esx_driver.c|  3 +--
 src/hyperv/hyperv_driver.c  |  3 +--
 src/qemu/qemu_domain.c  | 13 +---
 src/util/virbitmap.c|  5 ++---
 src/util/vircommand.c   | 16 +++
 src/util/virfile.c  |  3 +--
 src/util/virfirewall.c  |  5 +
 src/util/virnetlink.c   |  7 +++
 src/util/virtypedparam-public.c | 24 --
 src/util/virtypedparam.c|  6 ++
 src/util/viruri.c   |  8 +---
 src/util/virutil.c  | 14 -
 tests/viralloctest.c|  3 +--
 18 files changed, 53 insertions(+), 125 deletions(-)

diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c
index e9b4e5176d..efd6a59aec 100644
--- a/src/bhyve/bhyve_capabilities.c
+++ b/src/bhyve/bhyve_capabilities.c
@@ -154,10 +154,7 @@ virBhyveDomainCapsBuild(bhyveConnPtr conn,
 
 if (virDirOpenIfExists(, firmware_dir) > 0) {
 while ((virDirRead(dir, , firmware_dir)) > 0) {
-if (VIR_RESIZE_N(firmwares->values,
-firmwares_alloc, firmwares->nvalues, 1) < 0)
-goto cleanup;
-
+VIR_RESIZE_N(firmwares->values, firmwares_alloc, 
firmwares->nvalues, 1);
 firmwares->values[firmwares->nvalues] = g_strdup_printf("%s/%s",
 firmware_dir, 
entry->d_name);
 firmwares->nvalues++;
diff --git a/src/bhyve/bhyve_parse_command.c b/src/bhyve/bhyve_parse_command.c
index 2762b7e921..8d9a21e671 100644
--- a/src/bhyve/bhyve_parse_command.c
+++ b/src/bhyve/bhyve_parse_command.c
@@ -153,10 +153,7 @@ bhyveCommandLineToArgv(const char *nativeConfig,
 else
 line = g_strdup(curr);
 
-if (VIR_RESIZE_N(lines, lines_alloc, line_count, 2) < 0) {
-VIR_FREE(line);
-goto error;
-}
+VIR_RESIZE_N(lines, lines_alloc, line_count, 2);
 
 if (*line)
 lines[line_count++] = line;
@@ -203,11 +200,7 @@ bhyveCommandLineToArgv(const char *nativeConfig,
 if (next && (*next == '\'' || *next == '"'))
 next++;
 
-if (VIR_RESIZE_N(arglist, args_alloc, args_count, 2) < 0) {
-VIR_FREE(arg);
-goto error;
-}
-
+VIR_RESIZE_N(arglist, args_alloc, args_count, 2);
 arglist[args_count++] = arg;
 arglist[args_count] = NULL;
 
diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
index f610975ae5..14f0d48930 100644
--- a/src/conf/capabilities.c
+++ b/src/conf/capabilities.c
@@ -280,10 +280,8 @@ int
 virCapabilitiesAddHostFeature(virCapsPtr caps,
   const char *name)
 {
-if (VIR_RESIZE_N(caps->host.features, caps->host.nfeatures_max,
- caps->host.nfeatures, 1) < 0)
-return -1;
-
+VIR_RESIZE_N(caps->host.features, caps->host.nfeatures_max,
+ caps->host.nfeatures, 1);
 caps->host.features[caps->host.nfeatures] = g_strdup(name);
 caps->host.nfeatures++;
 
@@ -301,10 +299,8 @@ int
 virCapabilitiesAddHostMigrateTransport(virCapsPtr caps,
const char *name)
 {
-if (VIR_RESIZE_N(caps->host.migrateTrans, caps->host.nmigrateTrans_max,
- caps->host.nmigrateTrans, 1) < 0)
-return -1;
-
+VIR_RESIZE_N(caps->host.migrateTrans, caps->host.nmigrateTrans_max,
+ caps->host.nmigrateTrans, 1);
 caps->host.migrateTrans[caps->host.nmigrateTrans] = g_strdup(name);
 caps->host.nmigrateTrans++;
 
@@ -447,9 +443,7 @@ virCapabilitiesAddGuest(virCapsPtr caps,
 guest->arch.defaultInfo.emulator = g_strdup(emulator);
 guest->arch.defaultInfo.loader = g_strdup(loader);
 
-if (VIR_RESIZE_N(caps->guests, caps->nguests_max,
- caps->nguests, 1) < 0)
-goto error;
+VIR_RESIZE_N(caps->guests, caps->nguests_max, caps->nguests, 1);
 caps->guests[caps->nguests++] = guest;
 
 if (nmachines) {
@@ -458,10 +452,6 @@ virCapabilitiesAddGuest(virCapsPtr caps,
 }
 
 return guest;
-
- error:
-virCapabilitiesFreeGuest(guest);
-return NULL;
 }
 
 
@@ -493,9 +483,8 @@ virCapabilitiesAddGuestDomain(virCapsGuestPtr guest,
 dom->info.emulator = g_strdup(emulator);
 dom->info.loader = g_strdup(loader);
 
-if (VIR_RESIZE_N(guest->arch.domains, guest->arch.ndomains_max,
- guest->arch.ndomains, 1) < 0)
-goto error;
+VIR_RESIZE_N(guest->arch.domains, guest->arch.ndomains_max,
+ guest->arch.ndomains, 1);
 guest->arch.domains[guest->arch.ndomains] = dom;
 

[libvirt PATCH 0/7] Change reallocation APIs to return void

2021-03-19 Thread Jiri Denemark
They can never return anything but zero anyway.

Jiri Denemark (7):
  util: Drop G_GNUC_WARN_UNUSED_RESULT from reallocation APIs
  Do not check return value of VIR_RESIZE_N
  util: Make virResizeN return void
  Do not check return value of VIR_EXPAND_N
  util: Make virExpandN return void
  Do not check return value of VIR_REALLOC_N
  util: Make virReallocN return void

 src/access/viraccessdriverstack.c |  3 +-
 src/bhyve/bhyve_capabilities.c|  5 +--
 src/bhyve/bhyve_parse_command.c   | 19 +++-
 src/conf/backup_conf.c|  3 +-
 src/conf/capabilities.c   | 43 +-
 src/conf/cpu_conf.c   | 11 +
 src/conf/domain_addr.c|  6 +--
 src/conf/domain_capabilities.c|  5 +--
 src/conf/domain_conf.c| 14 +++---
 src/conf/nwfilter_conf.c  |  6 +--
 src/conf/nwfilter_params.c|  8 +---
 src/conf/storage_conf.c   |  3 +-
 src/conf/virinterfaceobj.c|  2 +-
 src/conf/virnetworkobj.c  |  4 +-
 src/conf/virnodedeviceobj.c   |  2 +-
 src/conf/virsecretobj.c   |  2 +-
 src/conf/virstorageobj.c  |  2 +-
 src/esx/esx_driver.c  |  7 +--
 src/esx/esx_stream.c  |  3 +-
 src/hyperv/hyperv_driver.c|  3 +-
 src/hyperv/hyperv_wmi.c   |  3 +-
 src/hypervisor/domain_driver.c|  3 +-
 src/hypervisor/virclosecallbacks.c|  2 +-
 src/interface/interface_backend_netcf.c   |  2 +-
 src/interface/interface_backend_udev.c|  2 +-
 src/libxl/libxl_capabilities.c|  3 +-
 src/libxl/libxl_conf.c| 23 --
 src/libxl/libxl_driver.c  | 15 +++
 src/libxl/xen_common.c|  6 +--
 src/locking/lock_driver_lockd.c   |  4 +-
 src/lxc/lxc_controller.c  | 18 ++--
 src/lxc/lxc_native.c  | 33 +-
 src/qemu/qemu_agent.c | 11 ++---
 src/qemu/qemu_capabilities.c  |  3 +-
 src/qemu/qemu_conf.c  |  6 +--
 src/qemu/qemu_domain.c| 13 +++---
 src/qemu/qemu_firmware.c  |  5 +--
 src/qemu/qemu_hotplug.c   | 36 +--
 src/qemu/qemu_monitor.c   |  4 +-
 src/qemu/qemu_monitor_json.c  | 12 +
 src/qemu/qemu_process.c   | 25 +--
 src/rpc/virnetclient.c| 19 ++--
 src/rpc/virnetdaemon.c|  3 +-
 src/rpc/virnetlibsshsession.c |  8 +---
 src/rpc/virnetmessage.c   | 12 ++---
 src/rpc/virnetserver.c| 19 ++--
 src/rpc/virnetsocket.c|  3 +-
 src/rpc/virnetsshsession.c|  8 +---
 src/storage/storage_backend_disk.c|  4 +-
 src/storage/storage_backend_logical.c |  3 +-
 src/storage/storage_backend_rbd.c |  6 +--
 .../storage_file_backend_gluster.c|  3 +-
 .../storage_source_backingstore.c |  3 +-
 src/util/viralloc.c   | 44 +--
 src/util/viralloc.h   | 18 
 src/util/virarptable.c|  3 +-
 src/util/virbitmap.c  |  5 +--
 src/util/vircommand.c | 23 +-
 src/util/virdnsmasq.c | 13 ++
 src/util/virfile.c| 22 +++---
 src/util/virfirewall.c|  8 +---
 src/util/virjson.c| 13 ++
 src/util/virlockspace.c   |  7 +--
 src/util/virnetlink.c |  7 ++-
 src/util/virnuma.c| 14 +++---
 src/util/virprocess.c | 17 +--
 src/util/virresctrl.c | 42 +++---
 src/util/virstring.c  |  9 ++--
 src/util/virsysinfo.c | 37 
 src/util/virsystemd.c |  3 +-
 src/util/virthreadpool.c  |  3 +-
 src/util/virtypedparam-public.c   | 24 --
 src/util/virtypedparam.c  |  9 ++--
 src/util/viruri.c |  8 +---
 src/util/virutil.c| 14 ++
 src/vbox/vbox_common.c|  4 +-
 src/vbox/vbox_snapshot_conf.c | 29 +++-
 tests/domaincapstest.c|  8 +---
 tests/qemublocktest.c |  3 +-
 

[libvirt PATCH 5/7] util: Make virExpandN return void

2021-03-19 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 src/util/viralloc.c | 14 ++
 src/util/viralloc.h |  4 ++--
 2 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/src/util/viralloc.c b/src/util/viralloc.c
index cd770eb601..81f5ba9a09 100644
--- a/src/util/viralloc.c
+++ b/src/util/viralloc.c
@@ -66,12 +66,12 @@ int virReallocN(void *ptrptr,
  * allocated memory. On failure, 'ptrptr' and 'countptr' are not
  * changed. Any newly allocated memory in 'ptrptr' is zero-filled.
  *
- * Returns zero on success, aborts on OOM
+ * Aborts on OOM
  */
-int virExpandN(void *ptrptr,
-   size_t size,
-   size_t *countptr,
-   size_t add)
+void virExpandN(void *ptrptr,
+size_t size,
+size_t *countptr,
+size_t add)
 {
 if (*countptr + add < *countptr)
 abort();
@@ -80,7 +80,6 @@ int virExpandN(void *ptrptr,
 abort();
 memset(*(char **)ptrptr + (size * *countptr), 0, size * add);
 *countptr += add;
-return 0;
 }
 
 /**
@@ -192,8 +191,7 @@ virInsertElementsN(void *ptrptr, size_t size, size_t at,
 if (inPlace) {
 *countptr += add;
 } else {
-if (virExpandN(ptrptr, size, countptr, add) < 0)
-abort();
+virExpandN(ptrptr, size, countptr, add);
 }
 
 /* memory was successfully re-allocated. Move up all elements from
diff --git a/src/util/viralloc.h b/src/util/viralloc.h
index 878c9485cf..6051c91913 100644
--- a/src/util/viralloc.h
+++ b/src/util/viralloc.h
@@ -36,7 +36,7 @@
 /* Don't call these directly - use the macros below */
 int virReallocN(void *ptrptr, size_t size, size_t count)
 ATTRIBUTE_NONNULL(1);
-int virExpandN(void *ptrptr, size_t size, size_t *count, size_t add)
+void virExpandN(void *ptrptr, size_t size, size_t *count, size_t add)
 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
 void virResizeN(void *ptrptr, size_t size, size_t *alloc, size_t count, size_t 
desired)
 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
@@ -78,7 +78,7 @@ int virDeleteElementsN(void *ptrptr, size_t size, size_t at, 
size_t *countptr,
  *
  * This macro is safe to use on arguments with side effects.
  *
- * Returns 0 on success, aborts on OOM
+ * Aborts on OOM
  */
 #define VIR_EXPAND_N(ptr, count, add) virExpandN(&(ptr), sizeof(*(ptr)), 
&(count), add)
 
-- 
2.31.0



[libvirt PATCH 7/7] util: Make virReallocN return void

2021-03-19 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 src/util/viralloc.c | 13 +
 src/util/viralloc.h |  4 ++--
 2 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/src/util/viralloc.c b/src/util/viralloc.c
index 81f5ba9a09..cd7ae9e7d1 100644
--- a/src/util/viralloc.c
+++ b/src/util/viralloc.c
@@ -45,12 +45,11 @@ VIR_LOG_INIT("util.alloc");
  *
  * Returns zero on success, aborts on OOM
  */
-int virReallocN(void *ptrptr,
-size_t size,
-size_t count)
+void virReallocN(void *ptrptr,
+ size_t size,
+ size_t count)
 {
 *(void **)ptrptr = g_realloc_n(*(void**)ptrptr, size, count);
-return 0;
 }
 
 /**
@@ -76,8 +75,7 @@ void virExpandN(void *ptrptr,
 if (*countptr + add < *countptr)
 abort();
 
-if (virReallocN(ptrptr, size, *countptr + add) < 0)
-abort();
+virReallocN(ptrptr, size, *countptr + add);
 memset(*(char **)ptrptr + (size * *countptr), 0, size * add);
 *countptr += add;
 }
@@ -136,8 +134,7 @@ void virResizeN(void *ptrptr,
 void virShrinkN(void *ptrptr, size_t size, size_t *countptr, size_t toremove)
 {
 if (toremove < *countptr) {
-if (virReallocN(ptrptr, size, *countptr -= toremove) < 0)
-abort();
+virReallocN(ptrptr, size, *countptr -= toremove);
 } else {
 g_free(*((void **)ptrptr));
 *((void **)ptrptr) = NULL;
diff --git a/src/util/viralloc.h b/src/util/viralloc.h
index 6051c91913..553d2951cf 100644
--- a/src/util/viralloc.h
+++ b/src/util/viralloc.h
@@ -34,7 +34,7 @@
  */
 
 /* Don't call these directly - use the macros below */
-int virReallocN(void *ptrptr, size_t size, size_t count)
+void virReallocN(void *ptrptr, size_t size, size_t count)
 ATTRIBUTE_NONNULL(1);
 void virExpandN(void *ptrptr, size_t size, size_t *count, size_t add)
 ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
@@ -61,7 +61,7 @@ int virDeleteElementsN(void *ptrptr, size_t size, size_t at, 
size_t *countptr,
  *
  * This macro is safe to use on arguments with side effects.
  *
- * Returns 0 on success, aborts on OOM
+ * Aborts on OOM
  */
 #define VIR_REALLOC_N(ptr, count) virReallocN(&(ptr), sizeof(*(ptr)), (count))
 
-- 
2.31.0



Re: [PATCH v1 01/12] libxl: add API wrapper for libxl_domain_create_restore

2021-03-19 Thread Olaf Hering
Am Thu, 18 Mar 2021 21:51:18 -0600
schrieb Jim Fehlig :

> Unless someone listening has a better idea, I lean towards 
> libxl_api_wrapper.h 
> with function names libxl*Wrapper.

I will rename the header, adjust the two style issues, and use these function 
names:

libxlDomainCreateRestoreWrapper
libxlRetrieveDomainConfigurationWrapper
libxlDomainShutdownWrapper
libxlDomainRebootWrapper
libxlDomainPauseWrapper
libxlDomainUnpauseWrapper
libxlDomainNeedMemoryWrapper
libxlGetFreeMemoryWrapper
libxlSetVcpuonlineWrapper
libxlSendTriggerWrapper
libxlSetMemoryTargetWrapper

Olaf


pgplcNJ33XvhE.pgp
Description: Digitale Signatur von OpenPGP


[libvirt PATCH] qemu: Drop redundant checks for qemuCaps before virQEMUCapsGet

2021-03-19 Thread Jiri Denemark
virQEMUCapsGet checks for qemuCaps itself, no need to do it explicitly.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_domain.c  | 5 +
 src/qemu/qemu_process.c | 3 +--
 2 files changed, 2 insertions(+), 6 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 5c98f8ff1a..fff67481a7 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -5289,7 +5289,6 @@ 
qemuDomainDeviceDiskDefPostParseRestoreSecAlias(virDomainDiskDefPtr disk,
 g_autofree char *encalias = NULL;
 
 if (!(parseFlags & VIR_DOMAIN_DEF_PARSE_STATUS) ||
-!qemuCaps ||
 virStorageSourceIsEmpty(disk->src) ||
 !virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_SECRET))
 return 0;
@@ -5475,7 +5474,6 @@ 
qemuDomainDeviceHostdevDefPostParseRestoreSecAlias(virDomainHostdevDefPtr hostde
 g_autofree char *authalias = NULL;
 
 if (!(parseFlags & VIR_DOMAIN_DEF_PARSE_STATUS) ||
-!qemuCaps ||
 !virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_SECRET))
 return 0;
 
@@ -5520,8 +5518,7 @@ 
qemuDomainDeviceHostdevDefPostParseRestoreBackendAlias(virDomainHostdevDefPtr ho
 if (!(parseFlags & VIR_DOMAIN_DEF_PARSE_STATUS))
 return 0;
 
-if (!qemuCaps ||
-hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
+if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
 hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI ||
 !virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV_HOSTDEV_SCSI))
 return 0;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 0b79dde2c3..b86afe4daa 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -8349,8 +8349,7 @@ qemuProcessReconnect(void *opaque)
 if (qemuHostdevUpdateActiveDomainDevices(driver, obj->def) < 0)
 goto error;
 
-if (priv->qemuCaps &&
-virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS))
+if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_CHARDEV_FD_PASS))
 retry = false;
 
 if (qemuDomainObjStartWorker(obj) < 0)
-- 
2.31.0



[libvirt PATCH 1/2] qemu: Use g_autofree in qemuMigrationJobCheckStatus

2021-03-19 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_migration.c | 15 +--
 1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 79dcb4a15d..ba2ee4f081 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1703,9 +1703,8 @@ qemuMigrationJobCheckStatus(virQEMUDriverPtr driver,
 {
 qemuDomainObjPrivatePtr priv = vm->privateData;
 qemuDomainJobInfoPtr jobInfo = priv->job.current;
-char *error = NULL;
+g_autofree char *error = NULL;
 bool events = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVENT);
-int ret = -1;
 
 if (!events ||
 jobInfo->stats.mig.status == QEMU_MONITOR_MIGRATION_STATUS_ERROR) {
@@ -1719,18 +1718,18 @@ qemuMigrationJobCheckStatus(virQEMUDriverPtr driver,
 case QEMU_DOMAIN_JOB_STATUS_NONE:
 virReportError(VIR_ERR_OPERATION_FAILED, _("%s: %s"),
qemuMigrationJobName(vm), _("is not active"));
-goto cleanup;
+return -1;
 
 case QEMU_DOMAIN_JOB_STATUS_FAILED:
 virReportError(VIR_ERR_OPERATION_FAILED, _("%s: %s"),
qemuMigrationJobName(vm),
error ? error : _("unexpectedly failed"));
-goto cleanup;
+return -1;
 
 case QEMU_DOMAIN_JOB_STATUS_CANCELED:
 virReportError(VIR_ERR_OPERATION_ABORTED, _("%s: %s"),
qemuMigrationJobName(vm), _("canceled by client"));
-goto cleanup;
+return -1;
 
 case QEMU_DOMAIN_JOB_STATUS_COMPLETED:
 case QEMU_DOMAIN_JOB_STATUS_ACTIVE:
@@ -1741,11 +1740,7 @@ qemuMigrationJobCheckStatus(virQEMUDriverPtr driver,
 break;
 }
 
-ret = 0;
-
- cleanup:
-VIR_FREE(error);
-return ret;
+return 0;
 }
 
 
-- 
2.31.0



[libvirt PATCH 2/2] qemu: Use g_autoptr in qemuMonitorJSONSetCapabilities

2021-03-19 Thread Jiri Denemark
Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_monitor_json.c | 19 ---
 1 file changed, 8 insertions(+), 11 deletions(-)

diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index b669630bc8..5e7f425495 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -1644,23 +1644,20 @@ qemuMonitorJSONHumanCommand(qemuMonitorPtr mon,
 int
 qemuMonitorJSONSetCapabilities(qemuMonitorPtr mon)
 {
-int ret = -1;
-virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("qmp_capabilities", NULL);
-virJSONValuePtr reply = NULL;
-if (!cmd)
+g_autoptr(virJSONValue) cmd = NULL;
+g_autoptr(virJSONValue) reply = NULL;
+
+if (!(cmd = qemuMonitorJSONMakeCommand("qmp_capabilities",
+   NULL)))
 return -1;
 
 if (qemuMonitorJSONCommand(mon, cmd, ) < 0)
-goto cleanup;
+return -1;
 
 if (qemuMonitorJSONCheckError(cmd, reply) < 0)
-goto cleanup;
+return -1;
 
-ret = 0;
- cleanup:
-virJSONValueFree(cmd);
-virJSONValueFree(reply);
-return ret;
+return 0;
 }
 
 
-- 
2.31.0



[libvirt PATCH 0/2] qemu: Use g_auto* in a few more places

2021-03-19 Thread Jiri Denemark
I'll be touching these functions soon, let's modernize them first.

Jiri Denemark (2):
  qemu: Use g_autofree in qemuMigrationJobCheckStatus
  qemu: Use g_autoptr in qemuMonitorJSONSetCapabilities

 src/qemu/qemu_migration.c| 15 +--
 src/qemu/qemu_monitor_json.c | 19 ---
 2 files changed, 13 insertions(+), 21 deletions(-)

-- 
2.31.0



[libvirt PATCH] qemu: Update asyncOwnerAPI when entering async job phase

2021-03-19 Thread Jiri Denemark
In case an async job spans multiple APIs (e.g., incoming migration) the
API that started the job is recorded as the asyncOwnerAPI even though it
is no longer running and the owner thread is updated properly to the one
currently handling the job. Let's also update asyncOwnerAPI to make it
more obvious which is the current (or the most recent) API involved in
the job.

Signed-off-by: Jiri Denemark 
---
 src/qemu/qemu_domainjob.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c
index b58d6837ad..50cfc45f5b 100644
--- a/src/qemu/qemu_domainjob.c
+++ b/src/qemu/qemu_domainjob.c
@@ -711,7 +711,9 @@ qemuDomainObjSetJobPhase(virQEMUDriverPtr driver,
   qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
   qemuDomainAsyncJobPhaseToString(priv->job.asyncJob, phase));
 
-if (priv->job.asyncOwner && me != priv->job.asyncOwner) {
+if (priv->job.asyncOwner == 0) {
+priv->job.asyncOwnerAPI = g_strdup(virThreadJobGet());
+} else if (me != priv->job.asyncOwner) {
 VIR_WARN("'%s' async job is owned by thread %llu",
  qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
  priv->job.asyncOwner);
-- 
2.31.0



[PATCH 2/6] qemu: capabilities: Introduce QEMU_CAPS_COMPAT_DEPRECATED

2021-03-19 Thread Peter Krempa
The capability is asserted if qemu supports the -compat
deprecated-input= and deprecated-output= settings to control what should
happen if deprecated fields are used in QMP.

This will be used for a developer/tester-oriented setting which will
aid us in catching use of deprecated settings sooner.

Signed-off-by: Peter Krempa 
---
 src/qemu/qemu_capabilities.c | 8 
 src/qemu/qemu_capabilities.h | 1 +
 tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml | 1 +
 3 files changed, 10 insertions(+)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index dc1b10cd66..beea57caf6 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -624,6 +624,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
   "audiodev",
   "blockdev-backup",
   "object.qapified",
+  "compat-deprecated",
 );


@@ -5187,6 +5188,13 @@ virQEMUCapsInitProcessCapsInterlock(virQEMUCapsPtr 
qemuCaps)

 if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV))
 virQEMUCapsSet(qemuCaps, QEMU_CAPS_BLOCKDEV_HOSTDEV_SCSI);
+
+/* The -compat qemu command line argument is implemented using a newer
+ * method which doesn't show up in query-command-line-options. As we'll use
+ * it only for development and testing purposes we can base the capability
+ * on a not entirely related witness. */
+if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_QAPIFIED))
+virQEMUCapsSet(qemuCaps, QEMU_CAPS_COMPAT_DEPRECATED);
 }


diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index da51a788fa..a66a48a351 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -604,6 +604,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for 
syntax-check */
 QEMU_CAPS_AUDIODEV, /* -audiodev instead of QEMU_AUDIO_DRV */
 QEMU_CAPS_BLOCKDEV_BACKUP, /* qemu supports the blockdev-backup job */
 QEMU_CAPS_OBJECT_QAPIFIED, /* parameters for object-add are formally 
described */
+QEMU_CAPS_COMPAT_DEPRECATED, /* -compat deprecated-(input|output) is 
supported */

 QEMU_CAPS_LAST /* this must always be the last item */
 } virQEMUCapsFlags;
diff --git a/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml 
b/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml
index 555b6b5317..458ae66719 100644
--- a/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_6.0.0.x86_64.xml
@@ -260,6 +260,7 @@
   
   
   
+  
   5002050
   0
   43100242
-- 
2.29.2



[PATCH 1/6] docs/drvqemu: Convert to RST

2021-03-19 Thread Peter Krempa
There are two links to this document using anchors so they need to be
updated as well.

Signed-off-by: Peter Krempa 
---
 docs/drvqemu.html.in| 743 
 docs/drvqemu.rst| 588 +
 docs/formatdomain.rst   |   2 +-
 docs/manpages/virt-qemu-run.rst |   2 +-
 docs/meson.build|   2 +-
 5 files changed, 591 insertions(+), 746 deletions(-)
 delete mode 100644 docs/drvqemu.html.in
 create mode 100644 docs/drvqemu.rst

diff --git a/docs/drvqemu.html.in b/docs/drvqemu.html.in
deleted file mode 100644
index fdf74979ad..00
--- a/docs/drvqemu.html.in
+++ /dev/null
@@ -1,743 +0,0 @@
-
-
-http://www.w3.org/1999/xhtml;>
-  
-KVM/QEMU hypervisor driver
-
-
-
-
-  The libvirt KVM/QEMU driver can manage any QEMU emulator from
-  version 1.5.0 or later.
-
-
-Project Links
-
-
-  
-The https://www.linux-kvm.org/;>KVM Linux
-hypervisor
-  
-  
-The https://wiki.qemu.org/Index.html;>QEMU emulator
-  
-
-
-Deployment pre-requisites
-
-
-  
-QEMU emulators: The driver will probe 
/usr/bin
-for the presence of qemu, qemu-system-x86_64,
-qemu-system-microblaze,
-qemu-system-microblazeel,
-qemu-system-mips,qemu-system-mipsel,
-qemu-system-sparc,qemu-system-ppc. The 
results
-of this can be seen from the capabilities XML output.
-  
-  
-KVM hypervisor: The driver will probe 
/usr/bin
-for the presence of qemu-kvm and /dev/kvm 
device
-node. If both are found, then KVM fully virtualized, hardware 
accelerated
-guests will be available.
-  
-
-
-Connections to QEMU driver
-
-
-The libvirt QEMU driver is a multi-instance driver, providing a single
-system wide privileged driver (the "system" instance), and per-user
-unprivileged drivers (the "session" instance). The URI driver protocol
-is "qemu". Some example connection URIs for the libvirt driver are:
-
-
-
-qemu:///session  (local access to per-user instance)
-qemu+unix:///session (local access to per-user instance)
-
-qemu:///system   (local access to system instance)
-qemu+unix:///system  (local access to system instance)
-qemu://example.com/system(remote access, TLS/x509)
-qemu+tcp://example.com/system(remote access, SASl/Kerberos)
-qemu+ssh://r...@example.com/system   (remote access, SSH tunnelled)
-
-
-Embedded driver
-
-
-  Since 6.1.0 the QEMU driver has experimental support for operating
-  in an embedded mode. In this scenario, rather than connecting to
-  the libvirtd daemon, the QEMU driver runs in the client application
-  process directly. To use this the client application must have
-  registered  be running an instance of the event loop. To open
-  the driver in embedded mode the app use the new URI path and specify
-  a virtual root directory under which the driver will create content.
-  The path to the root directory must be absolute. Passing a relative
-  path results in an error.
-
-
-
-  qemu:///embed?root=/some/dir
-
-
-
-  Broadly speaking the range of functionality is intended to be
-  on a par with that seen when using the traditional system or
-  session libvirt connections to QEMU. The features will of course
-  differ depending on whether the application using the embedded
-  driver is running privileged or unprivileged. For example PCI
-  device assignment or TAP based networking are only available
-  when running privileged. While the embedded mode is still classed
-  as experimental some features may change their default settings
-  between releases.
-
-
-
-  By default if the application uses any APIs associated with
-  secondary drivers, these will result in a connection being
-  opened to the corresponding driver in libvirtd. For example,
-  this allows a virtual machine from the embedded QEMU to connect
-  its NIC to a virtual network or connect its disk to a storage
-  volume. Some of the secondary drivers will also be able to support
-  running in embedded mode. Currently this is supported by the
-  secrets driver, to allow for use of VMs with encrypted disks
-
-
-Directory tree
-
-
-  Under the specified root directory the following locations will
-  be used
-
-
-
-/some/dir
-  |
-  +- log
-  |   |
-  |   +- qemu
-  |   +- swtpm
-  |
-  +- etc
-  |   |
-  |   +- qemu
-  |   +- pki
-  |   |
-  |   +- qemu
-  |
-  +- run
-  |   |
-  |   +- qemu
-  |   +- swtpm
-  |
-  +- cache
-  |   |
-  |   +- qemu
-  |
-  +- lib
-  |
-  +- qemu
-  +- swtpm
-
-
-
-  Note that UNIX domain sockets used for QEMU virtual machines had
-  a maximum 

[PATCH 4/6] qemuxml2xmltest: Enable 'qemu-ns' case

2021-03-19 Thread Peter Krempa
The XML formatter validation was missing for this code path.

Signed-off-by: Peter Krempa 
---
 .../qemu-ns.x86_64-latest.xml | 51 +++
 tests/qemuxml2xmltest.c   |  1 +
 2 files changed, 52 insertions(+)
 create mode 100644 tests/qemuxml2xmloutdata/qemu-ns.x86_64-latest.xml

diff --git a/tests/qemuxml2xmloutdata/qemu-ns.x86_64-latest.xml 
b/tests/qemuxml2xmloutdata/qemu-ns.x86_64-latest.xml
new file mode 100644
index 00..53e21edfaf
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/qemu-ns.x86_64-latest.xml
@@ -0,0 +1,51 @@
+
+  QEMUGuest1
+  c7a5fdbd-edaf-9455-926a-d65c16db1809
+  219136
+  219136
+  1
+  
+hvm
+
+  
+  
+qemu64
+  
+  
+  destroy
+  restart
+  destroy
+  
+/usr/bin/qemu-system-i386
+
+  
+  
+  
+  
+
+
+  
+
+
+  
+
+
+
+
+
+
+  
+
+  
+  
+
+
+
+
+  
+  
+
+
+
+  
+
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 4e7cce21c6..d4beb12e22 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -277,6 +277,7 @@ mymain(void)
 DO_TEST("restore-v2", NONE);
 DO_TEST("migrate", NONE);
 DO_TEST("qemu-ns-no-env", NONE);
+DO_TEST_CAPS_LATEST("qemu-ns");
 DO_TEST("disk-aio", NONE);
 DO_TEST_CAPS_LATEST("disk-aio-io_uring");
 DO_TEST("disk-cdrom", NONE);
-- 
2.29.2



[PATCH 5/6] qemu: Add per-VM control of deprecation behavior

2021-03-19 Thread Peter Krempa
Similar to the qemu.conf knob 'deprecation_behavior' add a per-VM knob
in the QEMU namespace:

  

Signed-off-by: Peter Krempa 
---
 docs/drvqemu.rst  | 48 +++
 docs/schemas/domaincommon.rng | 16 +++
 src/qemu/qemu_domain.c| 10 +++-
 src/qemu/qemu_domain.h|  5 ++
 tests/qemuxml2argvdata/qemu-ns.xml|  1 +
 .../qemu-ns.x86_64-latest.xml |  1 +
 6 files changed, 80 insertions(+), 1 deletion(-)

diff --git a/docs/drvqemu.rst b/docs/drvqemu.rst
index 0f8fd9e47d..41c9c5d8e1 100644
--- a/docs/drvqemu.rst
+++ b/docs/drvqemu.rst
@@ -523,6 +523,54 @@ Example:
  


+Control of QEMU deprecation warnings
+
+
+The following knob controls how QEMU behaves towards deprecated commands and
+arguments used by libvirt:
+
+::
+
+   
+ testvm
+
+  [...]
+
+ 
+
+This setting is meant for developers and CI efforts to make it obvious when
+libvirt relies on fields which are deprecated so that it can be fixes as soon
+as possible.
+
+Possible options are:
+
+``none``
+   (default) qemu is supposed to accept and output deprecated fields and 
commands
+
+``omit``
+qemu is instructed to omit deprecated fields on output, behaviour towards
+fields and commadns from libvirtd is not changed
+
+``reject``
+qemu is instructed to report an error if a deprecated command or field is
+used by libvirtd
+
+``crash``
+qemu crashes when an deprecated command or field is used by libvirtd
+
+For both "reject" and "crash" qemu is instructed to omit any deprecated fields
+on output.
+
+The "reject" option is less harsh towards the VMs but some code paths ignore
+errors reported by qemu and thus it may not be obvious that a deprecated
+command/field was used, thus it's suggested to use the "crash" option instead.
+
+In cases when qemu doesn't support configuring the behaviour this setting is
+silently ignored to allow testing older qemu versions without having to
+reconfigure libvirtd.
+
+*DO NOT* use in production.
+
 Example domain XML config
 -

diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 1dbfc68f18..ffd992852a 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -77,6 +77,9 @@
 
   
 
+
+  
+
 
   
 
@@ -7271,6 +7274,19 @@
 
   

+  
+http://libvirt.org/schemas/domain/qemu/1.0;>
+  
+
+  none
+  omit
+  reject
+  crash
+
+  
+
+  
+

   

[PATCH 3/6] qemu: conf: Add 'deprecation_behavior' setting to qemu.conf

2021-03-19 Thread Peter Krempa
New QEMU supports an harsh, but hard to ignore way to notify that the
QMP user used an deprecated command. This is useful e.g. for developers
to see that something needs to be fixed.

This patch introduces a qemu.conf option to enable the setting in cases
when qemu supports it so that developers and continiuous integration
efforts are notified about use of deprecated fields while it's not late.

The option is deliberately stored as string and not validated to prevent
failures when downgrading qemu or libvirt versions. While we don't
support this, the knob isn't meant for public consumption anyways.

Signed-off-by: Peter Krempa 
---
 src/qemu/libvirtd_qemu.aug |  1 +
 src/qemu/qemu.conf | 31 ++
 src/qemu/qemu_conf.c   |  4 
 src/qemu/qemu_conf.h   |  2 ++
 src/qemu/test_libvirtd_qemu.aug.in |  1 +
 5 files changed, 39 insertions(+)

diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug
index 3c1045858b..0f18775121 100644
--- a/src/qemu/libvirtd_qemu.aug
+++ b/src/qemu/libvirtd_qemu.aug
@@ -131,6 +131,7 @@ module Libvirtd_qemu =

let debug_level_entry = int_entry "gluster_debug_level"
  | bool_entry "virtiofsd_debug"
+ | str_entry "deprecation_behavior"

let memory_entry = str_entry "memory_backing_dir"

diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf
index 0c1054f198..086d7d2296 100644
--- a/src/qemu/qemu.conf
+++ b/src/qemu/qemu.conf
@@ -922,3 +922,34 @@
 # may change across versions.
 #
 #capability_filters = [ "capname" ]
+
+# 'deprecation_behavior' setting controls how the qemu process behaves towards
+# deprecated commands and arguments used by libvirt.
+#
+# This setting is meant for developers and CI efforts to make it obvious when
+# libvirt relies on fields which are deprecated so that it can be fixes as soon
+# as possible.
+#
+# Possible options are:
+# "none"   - (default) qemu is supposed to accept and output deprecated fields
+#and commands
+# "omit"   - qemu is instructed to omit deprecated fields on output, behaviour
+#towards fields and commadns from qemu is not changed
+# "reject" - qemu is instructed to report an error if a deprecated command or
+#field is used by libvirtd
+# "crash"  - qemu crashes when an deprecated command or field is used by 
libvirtd
+#
+# For both "reject" and "crash" qemu is instructed to omit any deprecated 
fields
+# on output.
+#
+# The "reject" option is less harsh towards the VMs but some code paths ignore
+# errors reported by qemu and thus it may not be obvious that a deprecated
+# command/field was used, thus it's suggested to use the "crash" option 
instead.
+#
+# In cases when qemu doesn't support configuring the behaviour this setting is
+# silently ignored to allow testing older qemu versions without having to
+# reconfigure libvirtd.
+#
+# DO NOT use in production.
+#
+#deprecation_behavior = "none"
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 2bbc75024c..4f7c85cda1 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -380,6 +380,8 @@ static void virQEMUDriverConfigDispose(void *obj)
 g_free(cfg->swtpmStorageDir);

 g_strfreev(cfg->capabilityfilters);
+
+g_free(cfg->deprecationBehavior);
 }


@@ -869,6 +871,8 @@ virQEMUDriverConfigLoadDebugEntry(virQEMUDriverConfigPtr 
cfg,
 return -1;
 if (virConfGetValueBool(conf, "virtiofsd_debug", >virtiofsdDebug) < 0)
 return -1;
+if (virConfGetValueString(conf, "deprecation_behavior", 
>deprecationBehavior) < 0)
+return -1;

 return 0;
 }
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 7025b5222e..e62cd88950 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -223,6 +223,8 @@ struct _virQEMUDriverConfig {
 gid_t swtpm_group;

 char **capabilityfilters;
+
+char *deprecationBehavior;
 };

 G_DEFINE_AUTOPTR_CLEANUP_FUNC(virQEMUDriverConfig, virObjectUnref);
diff --git a/src/qemu/test_libvirtd_qemu.aug.in 
b/src/qemu/test_libvirtd_qemu.aug.in
index 9310dcec1c..20a89ade32 100644
--- a/src/qemu/test_libvirtd_qemu.aug.in
+++ b/src/qemu/test_libvirtd_qemu.aug.in
@@ -115,3 +115,4 @@ module Test_libvirtd_qemu =
 { "capability_filters"
 { "1" = "capname" }
 }
+{ "deprecation_behavior" = "none" }
-- 
2.29.2



[PATCH 6/6] qemu: command: Handle formatting of '-compat' options

2021-03-19 Thread Peter Krempa
Enable '-compat' if requested in qemu.conf and supported by qemu to
instruct qemu to crash when a deprecated command is used and stop
returning deprecated fields.

This setting is meant for libvirt developers and such.
---
 src/qemu/qemu_command.c   | 80 +++
 .../qemu-ns.x86_64-latest.args|  1 +
 2 files changed, 81 insertions(+)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 1b4fa77867..2388b1a1a1 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -10325,6 +10325,84 @@ qemuBuildVsockCommandLine(virCommandPtr cmd,
 }


+typedef enum {
+QEMU_COMMAND_DEPRECATION_BEHAVIOR_NONE = 0,
+QEMU_COMMAND_DEPRECATION_BEHAVIOR_OMIT,
+QEMU_COMMAND_DEPRECATION_BEHAVIOR_REJECT,
+QEMU_COMMAND_DEPRECATION_BEHAVIOR_CRASH,
+
+QEMU_COMMAND_DEPRECATION_BEHAVIOR_LAST
+} qemuCommnadDeprecationBehavior;
+
+
+VIR_ENUM_DECL(qemuCommnadDeprecationBehavior);
+VIR_ENUM_IMPL(qemuCommnadDeprecationBehavior,
+  QEMU_COMMAND_DEPRECATION_BEHAVIOR_LAST,
+  "none",
+  "omit",
+  "reject",
+  "crash");
+
+static void
+qemuBuildCompatDeprecatedCommandLine(virCommand *cmd,
+ virQEMUDriverConfig *cfg,
+ virDomainDef *def,
+ virQEMUCaps *qemuCaps)
+{
+g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
+qemuDomainXmlNsDefPtr nsdata = def->namespaceData;
+qemuCommnadDeprecationBehavior behavior = 
QEMU_COMMAND_DEPRECATION_BEHAVIOR_NONE;
+const char *behaviorStr = cfg->deprecationBehavior;
+int tmp;
+
+if (nsdata && nsdata->deprecationBehavior)
+behaviorStr = nsdata->deprecationBehavior;
+
+if ((tmp = qemuCommnadDeprecationBehaviorTypeFromString(behaviorStr)) < 0) 
{
+VIR_WARN("Unsupported deprecation behavior '%s' for VM '%s'",
+ behaviorStr, def->name);
+return;
+}
+
+behavior = tmp;
+
+if (behavior == QEMU_COMMAND_DEPRECATION_BEHAVIOR_NONE)
+return;
+
+/* we don't try to enable this feature at all if qemu doesn't support it,
+ * so that a downgrade of qemu version doesn't impact startup of the VM */
+if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_COMPAT_DEPRECATED)) {
+VIR_DEBUG("-compat not supported for VM '%s'", def->name);
+return;
+}
+
+/* all active options hide output fields from qemu */
+virBufferAddLit(, "deprecated-output=hide,");
+
+switch (behavior) {
+case QEMU_COMMAND_DEPRECATION_BEHAVIOR_OMIT:
+case QEMU_COMMAND_DEPRECATION_BEHAVIOR_NONE:
+case QEMU_COMMAND_DEPRECATION_BEHAVIOR_LAST:
+default:
+/* output field hiding is default for all cases */
+break;
+
+case QEMU_COMMAND_DEPRECATION_BEHAVIOR_REJECT:
+virBufferAddLit(, "deprecated-input=reject,");
+break;
+
+case QEMU_COMMAND_DEPRECATION_BEHAVIOR_CRASH:
+virBufferAddLit(, "deprecated-input=crash,");
+break;
+}
+
+virBufferTrim(, ",");
+
+virCommandAddArg(cmd, "-compat");
+virCommandAddArgBuffer(cmd, );
+}
+
+
 /*
  * Constructs a argv suitable for launching qemu with config defined
  * for a given virtual machine.
@@ -10385,6 +10463,8 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
 if (qemuBuildNameCommandLine(cmd, cfg, def, qemuCaps) < 0)
 return NULL;

+qemuBuildCompatDeprecatedCommandLine(cmd, cfg, def, qemuCaps);
+
 if (!standalone)
 virCommandAddArg(cmd, "-S"); /* freeze CPU */

diff --git a/tests/qemuxml2argvdata/qemu-ns.x86_64-latest.args 
b/tests/qemuxml2argvdata/qemu-ns.x86_64-latest.args
index 5a8136a8b7..71b83ca681 100644
--- a/tests/qemuxml2argvdata/qemu-ns.x86_64-latest.args
+++ b/tests/qemuxml2argvdata/qemu-ns.x86_64-latest.args
@@ -10,6 +10,7 @@ NS=ns \
 BAR='' \
 /usr/bin/qemu-system-i386 \
 -name guest=QEMUGuest1,debug-threads=on \
+-compat deprecated-output=hide,deprecated-input=crash \
 -S \
 -object '{"qom-type":"secret","id":"masterKey0","format":"raw",\
 "file":"/tmp/lib/domain--1-QEMUGuest1/master-key.aes"}' \
-- 
2.29.2



[PATCH 0/6] qemu: Allow control of deprecation behaviour

2021-03-19 Thread Peter Krempa
For debugging purposes it's very useful to disable all deprecated
commands and fields in qemu. This series implements a qemu.conf knob and
a qemu namespace element to control this.

The implementation tries to be very conservative to allow downgrades of
qemu and such without breaking the startup of the VM.

The intention is that developers and CI deployments use the 'crash'
option to catch any unexpected qemu disappearance.

Note that this applies on top of my series for -object QAPIfication.

Based on Markus' -compat series which was now merged to upstream qemu.

Peter Krempa (6):
  docs/drvqemu: Convert to RST
  qemu: capabilities: Introduce QEMU_CAPS_COMPAT_DEPRECATED
  qemu: conf: Add 'deprecation_behavior' setting to qemu.conf
  qemuxml2xmltest: Enable 'qemu-ns' case
  qemu: Add per-VM control of deprecation behavior
  qemu: command: Handle formatting of '-compat' options

 docs/drvqemu.html.in  | 743 --
 docs/drvqemu.rst  | 636 +++
 docs/formatdomain.rst |   2 +-
 docs/manpages/virt-qemu-run.rst   |   2 +-
 docs/meson.build  |   2 +-
 docs/schemas/domaincommon.rng |  16 +
 src/qemu/libvirtd_qemu.aug|   1 +
 src/qemu/qemu.conf|  31 +
 src/qemu/qemu_capabilities.c  |   8 +
 src/qemu/qemu_capabilities.h  |   1 +
 src/qemu/qemu_command.c   |  80 ++
 src/qemu/qemu_conf.c  |   4 +
 src/qemu/qemu_conf.h  |   2 +
 src/qemu/qemu_domain.c|  10 +-
 src/qemu/qemu_domain.h|   5 +
 src/qemu/test_libvirtd_qemu.aug.in|   1 +
 .../caps_6.0.0.x86_64.xml |   1 +
 .../qemu-ns.x86_64-latest.args|   1 +
 tests/qemuxml2argvdata/qemu-ns.xml|   1 +
 .../qemu-ns.x86_64-latest.xml |  52 ++
 tests/qemuxml2xmltest.c   |   1 +
 21 files changed, 853 insertions(+), 747 deletions(-)
 delete mode 100644 docs/drvqemu.html.in
 create mode 100644 docs/drvqemu.rst
 create mode 100644 tests/qemuxml2xmloutdata/qemu-ns.x86_64-latest.xml

-- 
2.29.2



[libvirt PATCH 1/3] gitignore: Ignore __pycache__ directory

2021-03-19 Thread Andrea Bolognani
Unfortunately running Python scripts causes this directory to
be created in the *source* directory, and there doesn't seem
to be a way to prevent that from happening.

Signed-off-by: Andrea Bolognani 
---
 .gitignore | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/.gitignore b/.gitignore
index 6d44a50061..4695391342 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,9 @@
 *.orig
 .git-module-status
 
+# python related ignores
+__pycache__/
+
 # libvirt related ignores
 /build/
 /ci/scratch/
-- 
2.26.3



[libvirt PATCH 3/3] syntax-check: Run flake8 on all Python scripts

2021-03-19 Thread Andrea Bolognani
Currenty we only check files that end in .py, but we have at
least a couple of scripts that don't have that suffix and we
nonetheless want to keep compliant with the code style.

Extend the sc_flake8 syntax-check rule so that any file that
contains a Python 3 shebang is fed to flake8 too.

Signed-off-by: Andrea Bolognani 
---
 build-aux/syntax-check.mk | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk
index 2bd7e2aae4..51a498a897 100644
--- a/build-aux/syntax-check.mk
+++ b/build-aux/syntax-check.mk
@@ -877,8 +877,10 @@ FLAKE8_IGNORE = E501,W504
 
 sc_flake8:
@if [ -n "$(FLAKE8)" ]; then \
-   $(VC_LIST_EXCEPT) | $(GREP) '\.py$$' | xargs \
-   $(FLAKE8) --ignore $(FLAKE8_IGNORE) --show-source; \
+   DOT_PY=$$($(VC_LIST_EXCEPT) | $(GREP) '\.py$$'); \
+   BANG_PY=$$($(VC_LIST_EXCEPT) | xargs grep -l '^#!/usr/bin/env 
python3$$'); \
+   ALL_PY=$$(printf "%s\n%s" "$$DOT_PY" "$$BANG_PY" | sort -u); \
+   echo "$$ALL_PY" | xargs $(FLAKE8) --ignore $(FLAKE8_IGNORE) 
--show-source; \
else \
echo '$(ME): skipping test $@: flake8 not installed' 1>&2; \
fi
-- 
2.26.3



[libvirt PATCH 0/3] Misc Python-adjacent fixes

2021-03-19 Thread Andrea Bolognani
Andrea Bolognani (3):
  gitignore: Ignore __pycache__ directory
  tests: Fix flake8 errors in virsh-auth
  syntax-check: Run flake8 on all Python scripts

 .gitignore|  3 +++
 build-aux/syntax-check.mk |  6 --
 tests/virsh-auth  | 20 ++--
 3 files changed, 17 insertions(+), 12 deletions(-)

-- 
2.26.3




[libvirt PATCH 2/3] tests: Fix flake8 errors in virsh-auth

2021-03-19 Thread Andrea Bolognani
Specifically

  E111 indentation is not a multiple of four

This commit is better viewed with 'git show -w'.

Signed-off-by: Andrea Bolognani 
---
 tests/virsh-auth | 20 ++--
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/tests/virsh-auth b/tests/virsh-auth
index d548694190..ce3a599107 100755
--- a/tests/virsh-auth
+++ b/tests/virsh-auth
@@ -24,11 +24,11 @@ import subprocess
 
 builddir = os.getenv("abs_top_builddir")
 if builddir is None:
-   builddir = os.path.join(os.getcwd(), "..")
+builddir = os.path.join(os.getcwd(), "..")
 
 srcdir = os.getenv("abs_top_srcdir")
 if srcdir is None:
-   srcdir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
+srcdir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
 
 uri = "test://" + os.path.join(srcdir, "tests", "virsh-auth.xml")
 
@@ -43,15 +43,15 @@ proc = subprocess.Popen([virsh, "-c", uri, "uri"],
 out, err = proc.communicate("astrochicken")
 
 if proc.returncode != 0:
-   print("virsh failed with code %d" % proc.returncode, file=sys.stderr)
-   if out != "":
-  print("stdout=%s" % out)
-   if err != "":
-  print("stderr=%s" % err)
-   sys.exit(1)
+print("virsh failed with code %d" % proc.returncode, file=sys.stderr)
+if out != "":
+print("stdout=%s" % out)
+if err != "":
+print("stderr=%s" % err)
+sys.exit(1)
 
 if uri not in out:
-   print("Expected '%s' in '%s'" % (uri, out), file=sys.stderr)
-   sys.exit(1)
+print("Expected '%s' in '%s'" % (uri, out), file=sys.stderr)
+sys.exit(1)
 
 sys.exit(0)
-- 
2.26.3



Re: [libvirt PATCH 8/9] conf: introduce support for firmware auto-selection feature filtering

2021-03-19 Thread Pavel Hrdina
On Fri, Mar 19, 2021 at 04:11:39PM +0100, Kashyap Chamarthy wrote:
> On Fri, Mar 19, 2021 at 11:59:11AM +0100, Pavel Hrdina wrote:
> > On Fri, Mar 19, 2021 at 11:10:05AM +0100, Kashyap Chamarthy wrote:
> > > On Thu, Mar 18, 2021 at 01:26:45PM +0100, Pavel Hrdina wrote:
> 
> [...]
> 
> > > Nit: I'd recast it as: "When using firmware auto-selection, different
> > > features are enabled in any given firmware binary."
> > 
> > Sounds a bit better but I've already pushed the patches.
> 
> Np; can be a follow-up.
> 
> [...]
> 
> > > Should we also list a couple of example features?  E.g.  "amd-sev" (on
> > > supported hardware), "acpi-s3", "secure-boot".
> > 
> > I was considering listing all features that the JSON files can have but
> > most of the other features are already controlled by different XML
> > elements. There is an explicit list of features later in the docs.
> 
> Ah, where's the explict list of features?  I don't see them under the
> "BIOS bootloader" section:
> https://libvirt.org/formatdomain.html#bios-bootloader

Under the 'firmware' element there is a description of 'feature' element
that lists mandatory attributes and for attribute 'name' there is a list
of possible features which includes 'enrolled-keys' and 'secure-boot'.

This is the part from formatdomain.rst file:


   ``feature``
  The list of mandatory attributes:

  - ``enabled`` (accepted values are ``yes`` and ``no``) is used to tell 
libvirt
if the feature must be enabled or not in the automatically selected 
firmware

  - ``name`` the name of the feature, the list of the features:

- ``enrolled-keys`` whether the selected nvram template has default
  certificate enrolled. Firmware with Secure Boot feature but without
  enrolled keys will successfully boot non-signed binaries as well.
  Valid only for firmwares with Secure Boot feature.

- ``secure-boot`` whether the firmware implements UEFI Secure boot 
feature.


Pavel


signature.asc
Description: PGP signature


[libvirt PATCH v3 51/51] storage_conf: Use virXMLPropTristateXXX in virStoragePoolDefParseSource

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/storage_conf.c | 16 
 1 file changed, 4 insertions(+), 12 deletions(-)

diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 6116b04d44..286cdf105d 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -605,7 +605,6 @@ virStoragePoolDefParseSource(xmlXPathContextPtr ctxt,
 goto cleanup;
 
 for (i = 0; i < nsource; i++) {
-g_autofree char *partsep = NULL;
 virStoragePoolSourceDevice dev = { .path = NULL };
 dev.path = virXMLPropString(nodeset[i], "path");
 
@@ -615,17 +614,10 @@ virStoragePoolDefParseSource(xmlXPathContextPtr ctxt,
 goto cleanup;
 }
 
-partsep = virXMLPropString(nodeset[i], "part_separator");
-if (partsep) {
-int value = virTristateBoolTypeFromString(partsep);
-if (value <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("invalid part_separator setting '%s'"),
-   partsep);
-virStoragePoolSourceDeviceClear();
-goto cleanup;
-}
-dev.part_separator = value;
+if (virXMLPropTristateBool(nodeset[i], "part_separator", false,
+   _separator) < 0) {
+virStoragePoolSourceDeviceClear();
+goto cleanup;
 }
 
 if (VIR_APPEND_ELEMENT(source->devices, source->ndevice, dev) < 0) {
-- 
2.26.2



[libvirt PATCH v3 50/51] storage_adapter_conf: Use virXMLPropTristateXXX in virStorageAdapterParseXMLFCHost

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/storage_adapter_conf.c | 16 ++--
 1 file changed, 2 insertions(+), 14 deletions(-)

diff --git a/src/conf/storage_adapter_conf.c b/src/conf/storage_adapter_conf.c
index 69062b4b58..a19920c8b2 100644
--- a/src/conf/storage_adapter_conf.c
+++ b/src/conf/storage_adapter_conf.c
@@ -64,28 +64,16 @@ static int
 virStorageAdapterParseXMLFCHost(xmlNodePtr node,
 virStorageAdapterFCHostPtr fchost)
 {
-char *managed = NULL;
+if (virXMLPropTristateBool(node, "managed", false, >managed) < 0)
+return -1;
 
 fchost->parent = virXMLPropString(node, "parent");
-if ((managed = virXMLPropString(node, "managed"))) {
-int value;
-if ((value = virTristateBoolTypeFromString(managed)) < 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown fc_host managed setting '%s'"),
-   managed);
-VIR_FREE(managed);
-return -1;
-}
-fchost->managed = value;
-}
-
 fchost->parent_wwnn = virXMLPropString(node, "parent_wwnn");
 fchost->parent_wwpn = virXMLPropString(node, "parent_wwpn");
 fchost->parent_fabric_wwn = virXMLPropString(node, "parent_fabric_wwn");
 fchost->wwpn = virXMLPropString(node, "wwpn");
 fchost->wwnn = virXMLPropString(node, "wwnn");
 
-VIR_FREE(managed);
 return 0;
 }
 
-- 
2.26.2



[libvirt PATCH v3 48/51] network_conf: Use virXMLPropTristateXXX in virNetworkForwardNatDefParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/network_conf.c | 15 ++-
 1 file changed, 2 insertions(+), 13 deletions(-)

diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index 4cf4aa4840..bbd18ba163 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -1321,7 +1321,6 @@ virNetworkForwardNatDefParseXML(const char *networkName,
 g_autofree xmlNodePtr *natPortNodes = NULL;
 g_autofree char *addrStart = NULL;
 g_autofree char *addrEnd = NULL;
-g_autofree char *ipv6 = NULL;
 VIR_XPATH_NODE_AUTORESTORE(ctxt)
 
 ctxt->node = node;
@@ -1333,18 +1332,8 @@ virNetworkForwardNatDefParseXML(const char *networkName,
 return -1;
 }
 
-ipv6 = virXMLPropString(node, "ipv6");
-if (ipv6) {
-int natIPv6;
-if ((natIPv6 = virTristateBoolTypeFromString(ipv6)) <= 0) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("Invalid ipv6 setting '%s' "
- "in network '%s' NAT"),
-   ipv6, networkName);
-return -1;
-}
-def->natIPv6 = natIPv6;
-}
+if (virXMLPropTristateBool(node, "ipv6", false, >natIPv6) < 0)
+return -1;
 
 /* addresses for SNAT */
 nNatAddrs = virXPathNodeSet("./address", ctxt, );
-- 
2.26.2



[libvirt PATCH v3 35/51] domain_conf: Use virXMLPropTristateXXX in virDomainAudioDefParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 16 
 1 file changed, 4 insertions(+), 12 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c341091c99..0b5d8e5164 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13969,23 +13969,15 @@ virDomainAudioDefParseXML(virDomainXMLOptionPtr 
xmlopt G_GNUC_UNUSED,
 break;
 
 case VIR_DOMAIN_AUDIO_TYPE_OSS: {
-g_autofree char *tryMMap = virXMLPropString(node, "tryMMap");
-g_autofree char *exclusive = virXMLPropString(node, "exclusive");
 g_autofree char *dspPolicy = virXMLPropString(node, "dspPolicy");
 
-if (tryMMap && ((def->backend.oss.tryMMap =
- virTristateBoolTypeFromString(tryMMap)) <= 0)) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("unknown 'tryMMap' value '%s'"), tryMMap);
+if (virXMLPropTristateBool(node, "tryMMap", false,
+   >backend.oss.tryMMap) < 0)
 goto error;
-}
 
-if (exclusive && ((def->backend.oss.exclusive =
-   virTristateBoolTypeFromString(exclusive)) <= 0)) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("unknown 'exclusive' value '%s'"), exclusive);
+if (virXMLPropTristateBool(node, "exclusive", false,
+   >backend.oss.exclusive) < 0)
 goto error;
-}
 
 if (dspPolicy) {
 if (virStrToLong_i(dspPolicy, NULL, 10,
-- 
2.26.2



[libvirt PATCH v3 49/51] numa_conf: Use virXMLPropTristateXXX in virDomainNumaDefParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/numa_conf.c | 14 +++---
 1 file changed, 3 insertions(+), 11 deletions(-)

diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c
index 64b93fd7d1..2555eeaef9 100644
--- a/src/conf/numa_conf.c
+++ b/src/conf/numa_conf.c
@@ -1079,17 +1079,9 @@ virDomainNumaDefParseXML(virDomainNumaPtr def,
 VIR_FREE(tmp);
 }
 
-if ((tmp = virXMLPropString(nodes[i], "discard"))) {
-if ((rc = virTristateBoolTypeFromString(tmp)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("Invalid 'discard' attribute value '%s'"),
-   tmp);
-goto cleanup;
-}
-
-def->mem_nodes[cur_cell].discard = rc;
-VIR_FREE(tmp);
-}
+if (virXMLPropTristateBool(nodes[i], "discard", false,
+   >mem_nodes[cur_cell].discard) < 0)
+goto cleanup;
 
 /* Parse NUMA distances info */
 if (virDomainNumaDefNodeDistanceParseXML(def, ctxt, cur_cell) < 0)
-- 
2.26.2



[libvirt PATCH v3 46/51] backup_conf: Use virXMLPropTristateXXX in virDomainBackupDefParse

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/backup_conf.c | 16 ++--
 1 file changed, 2 insertions(+), 14 deletions(-)

diff --git a/src/conf/backup_conf.c b/src/conf/backup_conf.c
index ce85ed8bad..d3ea9ce4a3 100644
--- a/src/conf/backup_conf.c
+++ b/src/conf/backup_conf.c
@@ -234,8 +234,6 @@ virDomainBackupDefParse(xmlXPathContextPtr ctxt,
 def->incremental = virXPathString("string(./incremental)", ctxt);
 
 if ((node = virXPathNode("./server", ctxt))) {
-g_autofree char *tls = NULL;
-
 if (def->type != VIR_DOMAIN_BACKUP_TYPE_PULL) {
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("use of  requires pull mode backup"));
@@ -261,18 +259,8 @@ virDomainBackupDefParse(xmlXPathContextPtr ctxt,
 return NULL;
 }
 
-if ((tls = virXMLPropString(node, "tls"))) {
-int tmp;
-
-if ((tmp = virTristateBoolTypeFromString(tls)) <= 0) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("unknown value '%s' of 'tls' attribute"),\
-   tls);
-return NULL;
-}
-
-def->tls = tmp;
-}
+if (virXMLPropTristateBool(node, "tls", false, >tls) < 0)
+return NULL;
 }
 
 if ((n = virXPathNodeSet("./disks/*", ctxt, )) < 0)
-- 
2.26.2



[libvirt PATCH v3 42/51] domain_conf: Use virXMLPropTristateXXX in virDomainFeaturesDefParse

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 146 ++---
 1 file changed, 33 insertions(+), 113 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 3289c9fa12..dfa8b98aae 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -18236,6 +18236,7 @@ virDomainFeaturesDefParse(virDomainDefPtr def,
 
 for (i = 0; i < n; i++) {
 g_autofree char *tmp = NULL;
+virTristateSwitch triSwitch = VIR_TRISTATE_SWITCH_ABSENT;
 int val = virDomainFeatureTypeFromString((const char *)nodes[i]->name);
 if (val < 0) {
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -18245,16 +18246,8 @@ virDomainFeaturesDefParse(virDomainDefPtr def,
 
 switch ((virDomainFeature) val) {
 case VIR_DOMAIN_FEATURE_APIC:
-if ((tmp = virXPathString("string(./features/apic/@eoi)", ctxt))) {
-int eoi;
-if ((eoi = virTristateSwitchTypeFromString(tmp)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown value for attribute eoi: '%s'"),
-   tmp);
-return -1;
-}
-def->apic_eoi = eoi;
-}
+if (virXMLPropTristateSwitch(nodes[i], "eoi", false, 
>apic_eoi) < 0)
+return -1;
 G_GNUC_FALLTHROUGH;
 case VIR_DOMAIN_FEATURE_ACPI:
 case VIR_DOMAIN_FEATURE_PAE:
@@ -18286,16 +18279,10 @@ virDomainFeaturesDefParse(virDomainDefPtr def,
 case VIR_DOMAIN_FEATURE_PVSPINLOCK:
 case VIR_DOMAIN_FEATURE_VMPORT:
 case VIR_DOMAIN_FEATURE_SMM:
-if ((tmp = virXMLPropString(nodes[i], "state"))) {
-if ((def->features[val] = 
virTristateSwitchTypeFromString(tmp)) == -1) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown state attribute '%s' of feature 
'%s'"),
-   tmp, virDomainFeatureTypeToString(val));
-return -1;
-}
-} else {
+if (virXMLPropTristateSwitch(nodes[i], "state", false, ) 
< 0)
+return -1;
+if ((def->features[val] = triSwitch) == VIR_TRISTATE_SWITCH_ABSENT)
 def->features[val] = VIR_TRISTATE_SWITCH_ON;
-}
 break;
 
 case VIR_DOMAIN_FEATURE_GIC:
@@ -18403,18 +18390,9 @@ virDomainFeaturesDefParse(virDomainDefPtr def,
 case VIR_DOMAIN_FEATURE_HTM:
 case VIR_DOMAIN_FEATURE_NESTED_HV:
 case VIR_DOMAIN_FEATURE_CCF_ASSIST:
-if (!(tmp = virXMLPropString(nodes[i], "state"))) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("missing state attribute '%s' of feature 
'%s'"),
-   tmp, virDomainFeatureTypeToString(val));
-return -1;
-}
-if ((def->features[val] = virTristateSwitchTypeFromString(tmp)) < 
0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown state attribute '%s' of feature 
'%s'"),
-   tmp, virDomainFeatureTypeToString(val));
+if (virXMLPropTristateSwitch(nodes[i], "state", true, ) 
< 0)
 return -1;
-}
+def->features[val] = triSwitch;
 break;
 
 /* coverity[dead_error_begin] */
@@ -18426,13 +18404,12 @@ virDomainFeaturesDefParse(virDomainDefPtr def,
 
 if (def->features[VIR_DOMAIN_FEATURE_HYPERV] == VIR_TRISTATE_SWITCH_ON) {
 int feature;
-int value;
+virTristateSwitch state = VIR_TRISTATE_SWITCH_ABSENT;
 xmlNodePtr node = ctxt->node;
 if ((n = virXPathNodeSet("./features/hyperv/*", ctxt, )) < 0)
 return -1;
 
 for (i = 0; i < n; i++) {
-g_autofree char *tmp = NULL;
 feature = virDomainHypervTypeFromString((const char 
*)nodes[i]->name);
 if (feature < 0) {
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -18443,23 +18420,10 @@ virDomainFeaturesDefParse(virDomainDefPtr def,
 
 ctxt->node = nodes[i];
 
-if (!(tmp = virXMLPropString(nodes[i], "state"))) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("missing 'state' attribute for "
- "HyperV Enlightenment feature '%s'"),
-   nodes[i]->name);
-return -1;
-}
-
-if ((value = virTristateSwitchTypeFromString(tmp)) < 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("invalid value of state argument "
- "for HyperV Enlightenment feature '%s'"),
-   nodes[i]->name);

[libvirt PATCH v3 47/51] device_conf: Use virXMLPropTristateXXX in virPCIDeviceAddressParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/device_conf.c | 14 +++---
 1 file changed, 3 insertions(+), 11 deletions(-)

diff --git a/src/conf/device_conf.c b/src/conf/device_conf.c
index 0dd60985e9..8d0540bb02 100644
--- a/src/conf/device_conf.c
+++ b/src/conf/device_conf.c
@@ -214,7 +214,6 @@ virPCIDeviceAddressParseXML(xmlNodePtr node,
 g_autofree char *bus  = virXMLPropString(node, "bus");
 g_autofree char *slot = virXMLPropString(node, "slot");
 g_autofree char *function = virXMLPropString(node, "function");
-g_autofree char *multi= virXMLPropString(node, "multifunction");
 
 memset(addr, 0, sizeof(*addr));
 
@@ -246,16 +245,9 @@ virPCIDeviceAddressParseXML(xmlNodePtr node,
 return -1;
 }
 
-if (multi) {
-int value;
-if ((value = virTristateSwitchTypeFromString(multi)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("Unknown value '%s' for  'multifunction' 
attribute"),
-   multi);
-return -1;
-}
-addr->multi = value;
-}
+if (virXMLPropTristateSwitch(node, "multifunction", false, >multi) < 
0)
+return -1;
+
 if (!virPCIDeviceAddressIsEmpty(addr) && !virPCIDeviceAddressIsValid(addr, 
true))
 return -1;
 
-- 
2.26.2



[libvirt PATCH v3 10/51] conf: Use virTristateXXX in virDomainLoaderDef

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 26 --
 src/conf/domain_conf.h |  4 ++--
 2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 0480fc610d..9e106b8846 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -19198,18 +19198,24 @@ virDomainLoaderDefParseXML(xmlNodePtr node,
 VIR_FREE(loader->path);
 }
 
-if (readonly_str &&
-(loader->readonly = virTristateBoolTypeFromString(readonly_str)) <= 0) 
{
-virReportError(VIR_ERR_XML_DETAIL,
-   _("unknown readonly value: %s"), readonly_str);
-return -1;
+if (readonly_str) {
+int value;
+if ((value = virTristateBoolTypeFromString(readonly_str)) <= 0) {
+virReportError(VIR_ERR_XML_DETAIL,
+   _("unknown readonly value: %s"), readonly_str);
+return -1;
+}
+loader->readonly = value;
 }
 
-if (secure_str &&
-(loader->secure = virTristateBoolTypeFromString(secure_str)) <= 0) {
-virReportError(VIR_ERR_XML_DETAIL,
-   _("unknown secure value: %s"), secure_str);
-return -1;
+if (secure_str) {
+int value;
+if ((value = virTristateBoolTypeFromString(secure_str)) <= 0) {
+virReportError(VIR_ERR_XML_DETAIL,
+   _("unknown secure value: %s"), secure_str);
+return -1;
+}
+loader->secure = value;
 }
 
 if (type_str) {
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 2d342effb1..d6ca5e9725 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2152,9 +2152,9 @@ VIR_ENUM_DECL(virDomainLoader);
 
 struct _virDomainLoaderDef {
 char *path;
-int readonly;   /* enum virTristateBool */
+virTristateBool readonly;
 virDomainLoader type;
-int secure; /* enum virTristateBool */
+virTristateBool secure;
 char *nvram;/* path to non-volatile RAM */
 char *templt;   /* user override of path to master nvram */
 };
-- 
2.26.2



[libvirt PATCH v3 43/51] domain_conf: Use virXMLPropTristateXXX in virDomainLoaderDefParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 29 +
 1 file changed, 5 insertions(+), 24 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index dfa8b98aae..55405d129b 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -18712,14 +18712,12 @@ virDomainLoaderDefParseXML(xmlNodePtr node,
virDomainLoaderDefPtr loader,
bool fwAutoSelect)
 {
-g_autofree char *readonly_str = NULL;
-g_autofree char *secure_str = NULL;
 g_autofree char *type_str = NULL;
 
-secure_str = virXMLPropString(node, "secure");
-
 if (!fwAutoSelect) {
-readonly_str = virXMLPropString(node, "readonly");
+if (virXMLPropTristateBool(node, "readonly", false, >readonly) 
< 0)
+return -1;
+
 type_str = virXMLPropString(node, "type");
 if (!(loader->path = virXMLNodeContentString(node)))
 return -1;
@@ -18728,25 +18726,8 @@ virDomainLoaderDefParseXML(xmlNodePtr node,
 VIR_FREE(loader->path);
 }
 
-if (readonly_str) {
-int value;
-if ((value = virTristateBoolTypeFromString(readonly_str)) <= 0) {
-virReportError(VIR_ERR_XML_DETAIL,
-   _("unknown readonly value: %s"), readonly_str);
-return -1;
-}
-loader->readonly = value;
-}
-
-if (secure_str) {
-int value;
-if ((value = virTristateBoolTypeFromString(secure_str)) <= 0) {
-virReportError(VIR_ERR_XML_DETAIL,
-   _("unknown secure value: %s"), secure_str);
-return -1;
-}
-loader->secure = value;
-}
+if (virXMLPropTristateBool(node, "secure", false, >secure) < 0)
+return -1;
 
 if (type_str) {
 int type;
-- 
2.26.2



[libvirt PATCH v3 44/51] domain_conf: Use virXMLPropTristateXXX in virDomainVcpuParse

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 28 +---
 1 file changed, 5 insertions(+), 23 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 55405d129b..97c7a3ec28 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -18998,7 +18998,7 @@ virDomainVcpuParse(virDomainDefPtr def,
 
 for (i = 0; i < n; i++) {
 virDomainVcpuDefPtr vcpu;
-int state;
+virTristateBool state;
 unsigned int id;
 unsigned int order;
 
@@ -19020,31 +19020,13 @@ virDomainVcpuParse(virDomainDefPtr def,
 
 vcpu = virDomainDefGetVcpu(def, id);
 
-if (!(tmp = virXMLPropString(nodes[i], "enabled"))) {
-virReportError(VIR_ERR_XML_ERROR, "%s",
-   _("missing vcpu enabled state"));
+if (virXMLPropTristateBool(nodes[i], "enabled", true, ) < 0)
 return -1;
-}
-
-if ((state = virTristateBoolTypeFromString(tmp)) < 0) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("invalid vcpu 'enabled' value '%s'"), tmp);
-return -1;
-}
-VIR_FREE(tmp);
-
 vcpu->online = state == VIR_TRISTATE_BOOL_YES;
 
-if ((tmp = virXMLPropString(nodes[i], "hotpluggable"))) {
-int hotpluggable;
-if ((hotpluggable = virTristateBoolTypeFromString(tmp)) < 0) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("invalid vcpu 'hotpluggable' value 
'%s'"), tmp);
-return -1;
-}
-vcpu->hotpluggable = hotpluggable;
-VIR_FREE(tmp);
-}
+if (virXMLPropTristateBool(nodes[i], "hotpluggable", false,
+   >hotpluggable) < 0)
+return -1;
 
 if ((tmp = virXMLPropString(nodes[i], "order"))) {
 if (virStrToLong_uip(tmp, NULL, 10, ) < 0) {
-- 
2.26.2



[libvirt PATCH v3 45/51] backup_conf: Use virXMLPropTristateXXX in virDomainBackupDiskDefParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/backup_conf.c | 16 
 1 file changed, 4 insertions(+), 12 deletions(-)

diff --git a/src/conf/backup_conf.c b/src/conf/backup_conf.c
index ba58b2e322..ce85ed8bad 100644
--- a/src/conf/backup_conf.c
+++ b/src/conf/backup_conf.c
@@ -106,7 +106,6 @@ virDomainBackupDiskDefParseXML(xmlNodePtr node,
 g_autofree char *type = NULL;
 g_autofree char *format = NULL;
 g_autofree char *idx = NULL;
-g_autofree char *backup = NULL;
 g_autofree char *state = NULL;
 g_autofree char *backupmode = NULL;
 int tmp;
@@ -125,17 +124,10 @@ virDomainBackupDiskDefParseXML(xmlNodePtr node,
 return -1;
 }
 
-def->backup = VIR_TRISTATE_BOOL_YES;
-
-if ((backup = virXMLPropString(node, "backup"))) {
-if ((tmp = virTristateBoolTypeFromString(backup)) <= 0) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("invalid disk 'backup' state '%s'"), backup);
-return -1;
-}
-
-def->backup = tmp;
-}
+if (virXMLPropTristateBool(node, "backup", false, >backup) < 0)
+return -1;
+if (def->backup == VIR_TRISTATE_BOOL_ABSENT)
+def->backup = VIR_TRISTATE_BOOL_YES;
 
 /* don't parse anything else if backup is disabled */
 if (def->backup == VIR_TRISTATE_BOOL_NO)
-- 
2.26.2



[libvirt PATCH v3 40/51] domain_conf: Use virXMLPropTristateXXX in virDomainIOMMUDefParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 41 +
 1 file changed, 9 insertions(+), 32 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 0b009bb237..c7d2e86dfe 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -15776,40 +15776,17 @@ virDomainIOMMUDefParseXML(xmlNodePtr node,
 iommu->model = val;
 
 if ((driver = virXPathNode("./driver", ctxt))) {
-VIR_FREE(tmp);
-if ((tmp = virXMLPropString(driver, "intremap"))) {
-if ((val = virTristateSwitchTypeFromString(tmp)) < 0) {
-virReportError(VIR_ERR_XML_ERROR, _("unknown intremap value: 
%s"), tmp);
-return NULL;
-}
-iommu->intremap = val;
-}
+if (virXMLPropTristateSwitch(driver, "intremap", false, 
>intremap) < 0)
+return NULL;
 
-VIR_FREE(tmp);
-if ((tmp = virXMLPropString(driver, "caching_mode"))) {
-if ((val = virTristateSwitchTypeFromString(tmp)) < 0) {
-virReportError(VIR_ERR_XML_ERROR, _("unknown caching_mode 
value: %s"), tmp);
-return NULL;
-}
-iommu->caching_mode = val;
-}
-VIR_FREE(tmp);
-if ((tmp = virXMLPropString(driver, "iotlb"))) {
-if ((val = virTristateSwitchTypeFromString(tmp)) < 0) {
-virReportError(VIR_ERR_XML_ERROR, _("unknown iotlb value: 
%s"), tmp);
-return NULL;
-}
-iommu->iotlb = val;
-}
+if (virXMLPropTristateSwitch(driver, "caching_mode", false, 
>caching_mode) < 0)
+return NULL;
 
-VIR_FREE(tmp);
-if ((tmp = virXMLPropString(driver, "eim"))) {
-if ((val = virTristateSwitchTypeFromString(tmp)) < 0) {
-virReportError(VIR_ERR_XML_ERROR, _("unknown eim value: %s"), 
tmp);
-return NULL;
-}
-iommu->eim = val;
-}
+if (virXMLPropTristateSwitch(driver, "iotlb", false, >iotlb) < 
0)
+return NULL;
+
+if (virXMLPropTristateSwitch(driver, "eim", false, >eim) < 0)
+return NULL;
 
 VIR_FREE(tmp);
 if ((tmp = virXMLPropString(driver, "aw_bits"))) {
-- 
2.26.2



[libvirt PATCH v3 16/51] virxml: Add virXMLPropTristateSwitch

2021-03-19 Thread Tim Wiederhake
Convenience function to return value of an on / off attribute.

Signed-off-by: Tim Wiederhake 
---
 src/libvirt_private.syms |  1 +
 src/util/virxml.c| 41 
 src/util/virxml.h|  6 +-
 3 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 70525cef8c..9aed890c58 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -3546,6 +3546,7 @@ virXMLPickShellSafeComment;
 virXMLPropString;
 virXMLPropStringLimit;
 virXMLPropTristateBool;
+virXMLPropTristateSwitch;
 virXMLSaveFile;
 virXMLValidateAgainstSchema;
 virXMLValidatorFree;
diff --git a/src/util/virxml.c b/src/util/virxml.c
index 81b7bb1386..aaad6453d2 100644
--- a/src/util/virxml.c
+++ b/src/util/virxml.c
@@ -599,6 +599,47 @@ virXMLPropTristateBool(xmlNodePtr node, const char* name, 
bool required,
 }
 
 
+/**
+ * virXMLPropTristateSwitch:
+ * @node: XML dom node pointer
+ * @name: Name of the property (attribute) to get
+ * @required: Change the return value to -1 if the attribute is not present
+ * @result: The returned virTristateSwitch value
+ *
+ * Convenience function to return value of an on / off attribute.
+ *
+ * Returns 1 in case of success in which case @value is set,
+ * or 0 if the attribute is not present,
+ * or -1 and reports an error on failure.
+ */
+int
+virXMLPropTristateSwitch(xmlNodePtr node, const char* name, bool required,
+ virTristateSwitch *result)
+{
+g_autofree char *tmp = virXMLPropString(node, name);
+int val;
+
+if (!tmp) {
+if (!required)
+return 0;
+virReportError(VIR_ERR_XML_ERROR,
+   _("Missing required attribute '%s' in element '%s'"),
+   name, node->name);
+return -1;
+}
+
+if ((val = virTristateSwitchTypeFromString(tmp)) <= 0) {
+virReportError(VIR_ERR_XML_ERROR,
+   _("Invalid value for attribute '%s' in element '%s': 
'%s'. Expected 'on' or 'off'"),
+   name, node->name, tmp);
+return -1;
+}
+
+*result = val;
+return 1;
+}
+
+
 /**
  * virXPathBoolean:
  * @xpath: the XPath string to evaluate
diff --git a/src/util/virxml.h b/src/util/virxml.h
index 3041c37df3..e844cb0713 100644
--- a/src/util/virxml.h
+++ b/src/util/virxml.h
@@ -80,8 +80,12 @@ char * virXMLPropStringLimit(xmlNodePtr node,
 char *   virXMLNodeContentString(xmlNodePtr node);
 int   virXMLPropTristateBool(xmlNodePtr node,
  const char *name,
- bool mandatory,
+ bool required,
  virTristateBool *result);
+int virXMLPropTristateSwitch(xmlNodePtr node,
+ const char *name,
+ bool required,
+ virTristateSwitch *result);
 
 /* Internal function; prefer the macros below.  */
 xmlDocPtr  virXMLParseHelper(int domcode,
-- 
2.26.2



[libvirt PATCH v3 25/51] domain_conf: Use virXMLPropTristateXXX in virDomainNetDefParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 180 +++--
 1 file changed, 49 insertions(+), 131 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 7e17ded2a1..97eb1b6f8a 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -10719,7 +10719,6 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
 g_autofree char *queues = NULL;
 g_autofree char *rx_queue_size = NULL;
 g_autofree char *tx_queue_size = NULL;
-g_autofree char *str = NULL;
 g_autofree char *filter = NULL;
 g_autofree char *internal = NULL;
 g_autofree char *mode = NULL;
@@ -10729,7 +10728,6 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
 g_autofree char *vhostuser_mode = NULL;
 g_autofree char *vhostuser_path = NULL;
 g_autofree char *vhostuser_type = NULL;
-g_autofree char *trustGuestRxFilters = NULL;
 g_autofree char *vhost_path = NULL;
 const char *prefix = xmlopt ? xmlopt->config.netPrefix : NULL;
 
@@ -10749,16 +10747,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
 def->type = VIR_DOMAIN_NET_TYPE_USER;
 }
 
-if ((trustGuestRxFilters = virXMLPropString(node, "trustGuestRxFilters"))) 
{
-int value;
-if ((value = virTristateBoolTypeFromString(trustGuestRxFilters)) <= 0) 
{
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown trustGuestRxFilters value '%s'"),
-   trustGuestRxFilters);
-goto error;
-}
-def->trustGuestRxFilters = value;
-}
+if (virXMLPropTristateBool(node, "trustGuestRxFilters", false,
+   >trustGuestRxFilters) < 0)
+goto error;
 
 cur = node->children;
 while (cur != NULL) {
@@ -11328,128 +11319,55 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
 }
 
 if ((tmpNode = virXPathNode("./driver/host", ctxt))) {
-if ((str = virXMLPropString(tmpNode, "csum"))) {
-if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown host csum mode '%s'"),
-   str);
-goto error;
-}
-def->driver.virtio.host.csum = val;
-}
-VIR_FREE(str);
-if ((str = virXMLPropString(tmpNode, "gso"))) {
-if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown host gso mode '%s'"),
-   str);
-goto error;
-}
-def->driver.virtio.host.gso = val;
-}
-VIR_FREE(str);
-if ((str = virXMLPropString(tmpNode, "tso4"))) {
-if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown host tso4 mode '%s'"),
-   str);
-goto error;
-}
-def->driver.virtio.host.tso4 = val;
-}
-VIR_FREE(str);
-if ((str = virXMLPropString(tmpNode, "tso6"))) {
-if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown host tso6 mode '%s'"),
-   str);
-goto error;
-}
-def->driver.virtio.host.tso6 = val;
-}
-VIR_FREE(str);
-if ((str = virXMLPropString(tmpNode, "ecn"))) {
-if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown host ecn mode '%s'"),
-   str);
-goto error;
-}
-def->driver.virtio.host.ecn = val;
-}
-VIR_FREE(str);
-if ((str = virXMLPropString(tmpNode, "ufo"))) {
-if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown host ufo mode '%s'"),
-   str);
-goto error;
-}
-def->driver.virtio.host.ufo = val;
-}
-VIR_FREE(str);
-if ((str = virXMLPropString(tmpNode, "mrg_rxbuf"))) {
-if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown host 

[libvirt PATCH v3 39/51] domain_conf: Use virXMLPropTristateXXX in virDomainMemoryDefParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 12 ++--
 1 file changed, 2 insertions(+), 10 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 4debb895e9..0b009bb237 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -15705,16 +15705,8 @@ virDomainMemoryDefParseXML(virDomainXMLOptionPtr 
xmlopt,
 }
 VIR_FREE(tmp);
 
-if ((tmp = virXMLPropString(memdevNode, "discard"))) {
-if ((val = virTristateBoolTypeFromString(tmp)) <= 0) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("invalid discard value '%s'"), tmp);
-goto error;
-}
-
-def->discard = val;
-}
-VIR_FREE(tmp);
+if (virXMLPropTristateBool(memdevNode, "discard", false, >discard) < 
0)
+goto error;
 
 /* Extract NVDIMM UUID. */
 if (def->model == VIR_DOMAIN_MEMORY_MODEL_NVDIMM &&
-- 
2.26.2



[libvirt PATCH v3 41/51] domain_conf: Use virXMLPropTristateXXX in virDomainVsockDefParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 13 ++---
 1 file changed, 2 insertions(+), 11 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c7d2e86dfe..3289c9fa12 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -15841,17 +15841,8 @@ virDomainVsockDefParseXML(virDomainXMLOptionPtr xmlopt,
 }
 }
 
-VIR_FREE(tmp);
-if ((tmp = virXMLPropString(cid, "auto"))) {
-val = virTristateBoolTypeFromString(tmp);
-if (val <= 0) {
-virReportError(VIR_ERR_XML_DETAIL,
-   _("'auto' attribute can be 'yes' or 'no': %s"),
-   tmp);
-return NULL;
-}
-vsock->auto_cid = val;
-}
+if (virXMLPropTristateBool(cid, "auto", false, >auto_cid) < 0)
+return NULL;
 }
 
 if (virDomainDeviceInfoParseXML(xmlopt, node, ctxt, >info, flags) < 
0)
-- 
2.26.2



[libvirt PATCH v3 37/51] domain_conf: Use virXMLPropTristateXXX in virDomainShmemDefParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 14 +++---
 1 file changed, 3 insertions(+), 11 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 6b98d34eb4..ef1a9cdab2 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -14358,17 +14358,9 @@ virDomainShmemDefParseXML(virDomainXMLOptionPtr xmlopt,
 }
 VIR_FREE(tmp);
 
-if ((tmp = virXMLPropString(msi, "ioeventfd"))) {
-int val;
-
-if ((val = virTristateSwitchTypeFromString(tmp)) <= 0) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("invalid msi ioeventfd setting for shmem: 
'%s'"),
-   tmp);
-goto cleanup;
-}
-def->msi.ioeventfd = val;
-}
+if (virXMLPropTristateSwitch(msi, "ioeventfd", false,
+ >msi.ioeventfd) < 0)
+goto cleanup;
 }
 
 /* msi option is only relevant with a server */
-- 
2.26.2



[libvirt PATCH v3 38/51] domain_conf: Use virXMLPropTristateXXX in virDomainPerfEventDefParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 15 +++
 1 file changed, 3 insertions(+), 12 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index ef1a9cdab2..4debb895e9 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -15442,7 +15442,7 @@ virDomainPerfEventDefParseXML(virDomainPerfDefPtr perf,
 {
 int event;
 g_autofree char *name = NULL;
-g_autofree char *enabled = NULL;
+virTristateBool enabled = VIR_TRISTATE_BOOL_ABSENT;
 
 if (!(name = virXMLPropString(node, "name"))) {
 virReportError(VIR_ERR_XML_ERROR, "%s", _("missing perf event name"));
@@ -15461,18 +15461,9 @@ virDomainPerfEventDefParseXML(virDomainPerfDefPtr perf,
 return -1;
 }
 
-if (!(enabled = virXMLPropString(node, "enabled"))) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("missing state of perf event '%s'"), name);
-return -1;
-}
-
-if ((perf->events[event] = virTristateBoolTypeFromString(enabled)) < 0) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("invalid state '%s' of perf event '%s'"),
-   enabled, name);
+if (virXMLPropTristateBool(node, "enabled", true, ) < 0)
 return -1;
-}
+perf->events[event] = enabled;
 
 return 0;
 }
-- 
2.26.2



[libvirt PATCH v3 30/51] domain_conf: Use virXMLPropTristateXXX in virDomainGraphicsDefParseXMLSDL

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 16 
 1 file changed, 4 insertions(+), 12 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 35320fe1e5..4684496522 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13139,10 +13139,8 @@ 
virDomainGraphicsDefParseXMLSDL(virDomainGraphicsDefPtr def,
 xmlXPathContextPtr ctxt)
 {
 VIR_XPATH_NODE_AUTORESTORE(ctxt)
-int enableVal;
 xmlNodePtr glNode;
 g_autofree char *fullscreen = virXMLPropString(node, "fullscreen");
-g_autofree char *enable = NULL;
 
 ctxt->node = node;
 
@@ -13161,20 +13159,14 @@ 
virDomainGraphicsDefParseXMLSDL(virDomainGraphicsDefPtr def,
 
 glNode = virXPathNode("./gl", ctxt);
 if (glNode) {
-enable = virXMLPropString(glNode, "enable");
-if (!enable) {
-virReportError(VIR_ERR_XML_ERROR, "%s",
-   _("sdl gl element missing enable"));
+if (virXMLPropTristateBool(glNode, "enable", false, >data.sdl.gl) 
< 0)
 return -1;
-}
 
-enableVal = virTristateBoolTypeFromString(enable);
-if (enableVal < 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown enable value '%s'"), enable);
+if (def->data.sdl.gl == VIR_TRISTATE_BOOL_ABSENT) {
+virReportError(VIR_ERR_XML_ERROR, "%s",
+   _("sdl gl element missing enable"));
 return -1;
 }
-def->data.sdl.gl = enableVal;
 }
 
 return 0;
-- 
2.26.2



[libvirt PATCH v3 21/51] domain_conf: Use virXMLPropTristateXXX in virDomainDiskSourceNVMeParse

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 13 ++---
 1 file changed, 2 insertions(+), 11 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 4fd4fabb3f..f2fb3c8dd5 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8397,7 +8397,6 @@ virDomainDiskSourceNVMeParse(xmlNodePtr node,
 g_autoptr(virStorageSourceNVMeDef) nvme = NULL;
 g_autofree char *type = NULL;
 g_autofree char *namespc = NULL;
-g_autofree char *managed = NULL;
 xmlNodePtr address;
 
 nvme = g_new0(virStorageSourceNVMeDef, 1);
@@ -8428,16 +8427,8 @@ virDomainDiskSourceNVMeParse(xmlNodePtr node,
 return -1;
 }
 
-if ((managed = virXMLPropString(node, "managed"))) {
-int value;
-if ((value = virTristateBoolTypeFromString(managed)) <= 0) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("malformed managed value '%s'"),
-   managed);
-return -1;
-}
-nvme->managed = value;
-}
+if (virXMLPropTristateBool(node, "managed", false, >managed) < 0)
+return -1;
 
 if (!(address = virXPathNode("./address", ctxt))) {
 virReportError(VIR_ERR_XML_ERROR, "%s",
-- 
2.26.2



[libvirt PATCH v3 29/51] domain_conf: Use virXMLPropTristateXXX in virDomainGraphicsDefParseXMLVNC

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 13 +++--
 1 file changed, 3 insertions(+), 10 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 842a134220..35320fe1e5 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13043,7 +13043,6 @@ virDomainGraphicsDefParseXMLVNC(virDomainGraphicsDefPtr 
def,
 g_autofree char *websocketGenerated = virXMLPropString(node, 
"websocketGenerated");
 g_autofree char *sharePolicy = virXMLPropString(node, "sharePolicy");
 g_autofree char *autoport = virXMLPropString(node, "autoport");
-g_autofree char *powerControl = virXMLPropString(node, "powerControl");
 xmlNodePtr audioNode;
 VIR_XPATH_NODE_AUTORESTORE(ctxt)
 
@@ -13102,15 +13101,9 @@ 
virDomainGraphicsDefParseXMLVNC(virDomainGraphicsDefPtr def,
 }
 }
 
-if (powerControl) {
-int powerControlVal = virTristateBoolTypeFromString(powerControl);
-if (powerControlVal < 0) {
-virReportError(VIR_ERR_INTERNAL_ERROR,
-   _("cannot parse vnc power control '%s'"), 
powerControl);
-return -1;
-}
-def->data.vnc.powerControl = powerControlVal;
-}
+if ((virXMLPropTristateBool(node, "powerControl", false,
+>data.vnc.powerControl)) < 0)
+return -1;
 
 def->data.vnc.keymap = virXMLPropString(node, "keymap");
 
-- 
2.26.2



[libvirt PATCH v3 36/51] domain_conf: Use virXMLPropTristateXXX in virDomainMemballoonDefParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 25 +
 1 file changed, 5 insertions(+), 20 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 0b5d8e5164..6b98d34eb4 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -14211,8 +14211,6 @@ virDomainMemballoonDefParseXML(virDomainXMLOptionPtr 
xmlopt,
 VIR_XPATH_NODE_AUTORESTORE(ctxt)
 unsigned int period = 0;
 g_autofree char *model = NULL;
-g_autofree char *freepage_reporting = NULL;
-g_autofree char *deflate = NULL;
 
 def = g_new0(virDomainMemballoonDef, 1);
 
@@ -14229,25 +14227,12 @@ virDomainMemballoonDefParseXML(virDomainXMLOptionPtr 
xmlopt,
 goto error;
 }
 
-if ((deflate = virXMLPropString(node, "autodeflate"))) {
-int value;
-if ((value = virTristateSwitchTypeFromString(deflate)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("invalid autodeflate attribute value '%s'"), 
deflate);
-goto error;
-}
-def->autodeflate = value;
-}
+if (virXMLPropTristateSwitch(node, "autodeflate", false, 
>autodeflate) < 0)
+goto error;
 
-if ((freepage_reporting = virXMLPropString(node, "freePageReporting"))) {
-int value;
-if ((value = virTristateSwitchTypeFromString(freepage_reporting)) <= 
0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("invalid freePageReporting attribute value 
'%s'"), freepage_reporting);
-goto error;
-}
-def->free_page_reporting = value;
-}
+if (virXMLPropTristateSwitch(node, "freePageReporting", false,
+ >free_page_reporting) < 0)
+goto error;
 
 ctxt->node = node;
 if (virXPathUInt("string(./stats/@period)", ctxt, ) < -1) {
-- 
2.26.2



[libvirt PATCH v3 34/51] domain_conf: Use virXMLPropTristateXXX in virDomainAudioOSSParse

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 8 +---
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index afd37e3e49..c341091c99 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13837,18 +13837,12 @@ static int
 virDomainAudioOSSParse(virDomainAudioIOOSSPtr def,
xmlNodePtr node)
 {
-g_autofree char *tryPoll = virXMLPropString(node, "tryPoll");
 g_autofree char *bufferCount = virXMLPropString(node, "bufferCount");
 
 def->dev = virXMLPropString(node, "dev");
 
-if (tryPoll &&
-((def->tryPoll =
-  virTristateBoolTypeFromString(tryPoll)) <= 0)) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("unknown 'tryPoll' value '%s'"), tryPoll);
+if (virXMLPropTristateBool(node, "tryPoll", false, >tryPoll) < 0)
 return -1;
-}
 
 if (bufferCount &&
 virStrToLong_ui(bufferCount, NULL, 10,
-- 
2.26.2



[libvirt PATCH v3 18/51] domain_conf: Use virXMLPropTristateXXX in virDomainVirtioOptionsParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 34 ++
 1 file changed, 6 insertions(+), 28 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 7dfbca12e5..6997b7d743 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1591,9 +1591,7 @@ static int
 virDomainVirtioOptionsParseXML(xmlNodePtr driver,
virDomainVirtioOptionsPtr *virtio)
 {
-int val;
 virDomainVirtioOptionsPtr res;
-g_autofree char *str = NULL;
 
 if (*virtio || !driver)
 return 0;
@@ -1602,34 +1600,14 @@ virDomainVirtioOptionsParseXML(xmlNodePtr driver,
 
 res = *virtio;
 
-if ((str = virXMLPropString(driver, "iommu"))) {
-if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
-virReportError(VIR_ERR_XML_ERROR, "%s",
-   _("invalid iommu value"));
-return -1;
-}
-res->iommu = val;
-}
-VIR_FREE(str);
+if (virXMLPropTristateSwitch(driver, "iommu", false, >iommu) < 0)
+return -1;
 
-if ((str = virXMLPropString(driver, "ats"))) {
-if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
-virReportError(VIR_ERR_XML_ERROR, "%s",
-   _("invalid ats value"));
-return -1;
-}
-res->ats = val;
-}
-VIR_FREE(str);
+if (virXMLPropTristateSwitch(driver, "ats", false, >ats) < 0)
+return -1;
 
-if ((str = virXMLPropString(driver, "packed"))) {
-if ((val = virTristateSwitchTypeFromString(str)) <= 0) {
-virReportError(VIR_ERR_XML_ERROR, "%s",
-   _("invalid packed value"));
-return -1;
-}
-res->packed = val;
-}
+if (virXMLPropTristateSwitch(driver, "packed", false, >packed) < 0)
+return -1;
 
 return 0;
 }
-- 
2.26.2



[libvirt PATCH v3 28/51] domain_conf: Use virXMLPropTristateXXX in virDomainChrSourceDefParseLog

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 14 ++
 1 file changed, 2 insertions(+), 12 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 0f3be88235..842a134220 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -11812,20 +11812,10 @@ static int
 virDomainChrSourceDefParseLog(virDomainChrSourceDefPtr def,
   xmlNodePtr log)
 {
-g_autofree char *append = NULL;
-
 def->logfile = virXMLPropString(log, "file");
 
-if ((append = virXMLPropString(log, "append"))) {
-int value;
-if ((value = virTristateSwitchTypeFromString(append)) <= 0) {
-virReportError(VIR_ERR_INTERNAL_ERROR,
-   _("Invalid append attribute value '%s'"),
-   append);
-return -1;
-}
-def->logappend = value;
-}
+if (virXMLPropTristateSwitch(log, "append", false, >logappend) < 0)
+return -1;
 
 return 0;
 }
-- 
2.26.2



[libvirt PATCH v3 33/51] domain_conf: Use virXMLPropTristateXXX in virDomainAudioJackParse

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 9 +
 1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index dff554874f..afd37e3e49 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13822,19 +13822,12 @@ static int
 virDomainAudioJackParse(virDomainAudioIOJackPtr def,
 xmlNodePtr node)
 {
-g_autofree char *exactName = virXMLPropString(node, "exactName");
-
 def->serverName = virXMLPropString(node, "serverName");
 def->clientName = virXMLPropString(node, "clientName");
 def->connectPorts = virXMLPropString(node, "connectPorts");
 
-if (exactName &&
-((def->exactName =
-  virTristateBoolTypeFromString(exactName)) <= 0)) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("unknown 'exactName' value '%s'"), exactName);
+if (virXMLPropTristateBool(node, "exactName", false, >exactName) < 0)
 return -1;
-}
 
 return 0;
 }
-- 
2.26.2



[libvirt PATCH v3 32/51] domain_conf: Use virXMLPropTristateXXX in virDomainAudioCommonParse

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 16 ++--
 1 file changed, 2 insertions(+), 14 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index d78d09a4b9..dff554874f 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13716,8 +13716,6 @@ virDomainAudioCommonParse(virDomainAudioIOCommonPtr def,
   xmlNodePtr node,
   xmlXPathContextPtr ctxt)
 {
-g_autofree char *mixingEngine = virXMLPropString(node, "mixingEngine");
-g_autofree char *fixedSettings = virXMLPropString(node, "fixedSettings");
 g_autofree char *voices = virXMLPropString(node, "voices");
 g_autofree char *bufferLength = virXMLPropString(node, "bufferLength");
 xmlNodePtr settings;
@@ -13726,21 +13724,11 @@ virDomainAudioCommonParse(virDomainAudioIOCommonPtr 
def,
 ctxt->node = node;
 settings = virXPathNode("./settings", ctxt);
 
-if (mixingEngine &&
-((def->mixingEngine =
-  virTristateBoolTypeFromString(mixingEngine)) <= 0)) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("unknown 'mixingEngine' value '%s'"), mixingEngine);
+if (virXMLPropTristateBool(node, "mixingEngine", false, 
>mixingEngine) < 0)
 return -1;
-}
 
-if (fixedSettings &&
-((def->fixedSettings =
-  virTristateBoolTypeFromString(fixedSettings)) <= 0)) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("unknown 'fixedSettings' value '%s'"), fixedSettings);
+if (virXMLPropTristateBool(node, "fixedSettings", false, 
>fixedSettings) < 0)
 return -1;
-}
 
 if (def->fixedSettings == VIR_TRISTATE_BOOL_YES &&
 def->mixingEngine != VIR_TRISTATE_BOOL_YES) {
-- 
2.26.2



[libvirt PATCH v3 05/51] conf: Use virTristateXXX in virDomainActualNetDef

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 17 +
 src/conf/domain_conf.h |  2 +-
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 014f318dcd..8e94860b51 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -10551,14 +10551,15 @@ virDomainActualNetDefParseXML(xmlNodePtr node,
 goto error;
 }
 
-trustGuestRxFilters = virXMLPropString(node, "trustGuestRxFilters");
-if (trustGuestRxFilters &&
-((actual->trustGuestRxFilters
-  = virTristateBoolTypeFromString(trustGuestRxFilters)) <= 0)) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown trustGuestRxFilters value '%s'"),
-   trustGuestRxFilters);
-goto error;
+if ((trustGuestRxFilters = virXMLPropString(node, "trustGuestRxFilters"))) 
{
+int value;
+if ((value = virTristateBoolTypeFromString(trustGuestRxFilters)) <= 0) 
{
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _("unknown trustGuestRxFilters value '%s'"),
+   trustGuestRxFilters);
+goto error;
+}
+actual->trustGuestRxFilters = value;
 }
 
 virtPortNode = virXPathNode("./virtualport", ctxt);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 853cab96b5..90079d7e64 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -994,7 +994,7 @@ struct _virDomainActualNetDef {
 virNetDevVPortProfilePtr virtPortProfile;
 virNetDevBandwidthPtr bandwidth;
 virNetDevVlan vlan;
-int trustGuestRxFilters; /* enum virTristateBool */
+virTristateBool trustGuestRxFilters;
 virTristateBool isolatedPort;
 unsigned int class_id; /* class ID for bandwidth 'floor' */
 };
-- 
2.26.2



[libvirt PATCH v3 31/51] domain_conf: Use virXMLPropTristateXXX in virDomainGraphicsDefParseXMLSpice

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 75 ++
 1 file changed, 10 insertions(+), 65 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 4684496522..d78d09a4b9 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13396,23 +13396,10 @@ 
virDomainGraphicsDefParseXMLSpice(virDomainGraphicsDefPtr def,
 
 def->data.spice.zlib = compressionVal;
 } else if (virXMLNodeNameEqual(cur, "playback")) {
-int compressionVal;
-g_autofree char *compression = virXMLPropString(cur, 
"compression");
-
-if (!compression) {
-virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-   _("spice playback missing compression"));
-return -1;
-}
-
-if ((compressionVal =
- virTristateSwitchTypeFromString(compression)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-   _("unknown spice playback compression"));
+if (virXMLPropTristateSwitch(cur, "compression", true,
+ >data.spice.playback) < 0)
 return -1;
-}
 
-def->data.spice.playback = compressionVal;
 } else if (virXMLNodeNameEqual(cur, "streaming")) {
 int modeVal;
 g_autofree char *mode = virXMLPropString(cur, "mode");
@@ -13431,62 +13418,20 @@ 
virDomainGraphicsDefParseXMLSpice(virDomainGraphicsDefPtr def,
 
 def->data.spice.streaming = modeVal;
 } else if (virXMLNodeNameEqual(cur, "clipboard")) {
-int copypasteVal;
-g_autofree char *copypaste = virXMLPropString(cur, 
"copypaste");
-
-if (!copypaste) {
-virReportError(VIR_ERR_XML_ERROR, "%s",
-   _("spice clipboard missing copypaste"));
+if (virXMLPropTristateBool(cur, "copypaste", true,
+   >data.spice.copypaste) < 0)
 return -1;
-}
-
-if ((copypasteVal =
- virTristateBoolTypeFromString(copypaste)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown copypaste value '%s'"), 
copypaste);
-return -1;
-}
-
-def->data.spice.copypaste = copypasteVal;
 } else if (virXMLNodeNameEqual(cur, "filetransfer")) {
-int enableVal;
-g_autofree char *enable = virXMLPropString(cur, "enable");
-
-if (!enable) {
-virReportError(VIR_ERR_XML_ERROR, "%s",
-   _("spice filetransfer missing enable"));
+if (virXMLPropTristateBool(cur, "enable", true,
+   >data.spice.filetransfer) < 0)
 return -1;
-}
-
-if ((enableVal =
- virTristateBoolTypeFromString(enable)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown enable value '%s'"), enable);
-return -1;
-}
-
-def->data.spice.filetransfer = enableVal;
 } else if (virXMLNodeNameEqual(cur, "gl")) {
-int enableVal;
-g_autofree char *enable = virXMLPropString(cur, "enable");
-g_autofree char *rendernode = virXMLPropString(cur, 
"rendernode");
+def->data.spice.rendernode = virXMLPropString(cur,
+  "rendernode");
 
-if (!enable) {
-virReportError(VIR_ERR_XML_ERROR, "%s",
-   _("spice gl element missing enable"));
-return -1;
-}
-
-if ((enableVal =
- virTristateBoolTypeFromString(enable)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown enable value '%s'"), enable);
+if (virXMLPropTristateBool(cur, "enable", true,
+   >data.spice.gl) < 0)
 return -1;
-}
-
-def->data.spice.gl = enableVal;
-def->data.spice.rendernode = g_steal_pointer();
-
 } else if (virXMLNodeNameEqual(cur, "mouse")) {
 int modeVal;
 g_autofree char *mode = virXMLPropString(cur, "mode");
-- 
2.26.2



[libvirt PATCH v3 09/51] conf: Use virTristateXXX in virDomainMemballoonDef

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 26 --
 src/conf/domain_conf.h |  4 ++--
 2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index e99699028a..0480fc610d 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -14547,18 +14547,24 @@ virDomainMemballoonDefParseXML(virDomainXMLOptionPtr 
xmlopt,
 goto error;
 }
 
-if ((deflate = virXMLPropString(node, "autodeflate")) &&
-(def->autodeflate = virTristateSwitchTypeFromString(deflate)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("invalid autodeflate attribute value '%s'"), deflate);
-goto error;
+if ((deflate = virXMLPropString(node, "autodeflate"))) {
+int value;
+if ((value = virTristateSwitchTypeFromString(deflate)) <= 0) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _("invalid autodeflate attribute value '%s'"), 
deflate);
+goto error;
+}
+def->autodeflate = value;
 }
 
-if ((freepage_reporting = virXMLPropString(node, "freePageReporting")) &&
-(def->free_page_reporting = 
virTristateSwitchTypeFromString(freepage_reporting)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("invalid freePageReporting attribute value '%s'"), 
freepage_reporting);
-goto error;
+if ((freepage_reporting = virXMLPropString(node, "freePageReporting"))) {
+int value;
+if ((value = virTristateSwitchTypeFromString(freepage_reporting)) <= 
0) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _("invalid freePageReporting attribute value 
'%s'"), freepage_reporting);
+goto error;
+}
+def->free_page_reporting = value;
 }
 
 ctxt->node = node;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 09b697432d..2d342effb1 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1921,8 +1921,8 @@ struct _virDomainMemballoonDef {
 int model;
 virDomainDeviceInfo info;
 int period; /* seconds between collections */
-int autodeflate; /* enum virTristateSwitch */
-int free_page_reporting; /* enum virTristateSwitch */
+virTristateSwitch autodeflate;
+virTristateSwitch free_page_reporting;
 virDomainVirtioOptionsPtr virtio;
 };
 
-- 
2.26.2



[libvirt PATCH v3 19/51] domain_conf: Use virXMLPropTristateXXX in virDomainDeviceInfoParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 26 ++
 1 file changed, 6 insertions(+), 20 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 6997b7d743..920078a706 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -6620,8 +6620,6 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr xmlopt,
 xmlNodePtr boot = NULL;
 xmlNodePtr rom = NULL;
 int ret = -1;
-g_autofree char *romenabled = NULL;
-g_autofree char *rombar = NULL;
 g_autofree char *aliasStr = NULL;
 VIR_XPATH_NODE_AUTORESTORE(ctxt)
 
@@ -6649,24 +6647,12 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr 
xmlopt,
 
 if ((flags & VIR_DOMAIN_DEF_PARSE_ALLOW_ROM) &&
 (rom = virXPathNode("./rom", ctxt))) {
-if ((romenabled = virXPathString("string(./rom/@enabled)", ctxt))) {
-int value;
-if ((value = virTristateBoolTypeFromString(romenabled)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown rom enabled value '%s'"), 
romenabled);
-goto cleanup;
-}
-info->romenabled = value;
-}
-if ((rombar = virXPathString("string(./rom/@bar)", ctxt))) {
-int value;
-if ((value = virTristateSwitchTypeFromString(rombar)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown rom bar value '%s'"), rombar);
-goto cleanup;
-}
-info->rombar = value;
-}
+if (virXMLPropTristateBool(rom, "enabled", false, >romenabled) < 
0)
+goto cleanup;
+
+if (virXMLPropTristateSwitch(rom, "bar", false, >rombar) < 0)
+goto cleanup;
+
 info->romfile = virXMLPropString(rom, "file");
 
 if (info->romenabled == VIR_TRISTATE_BOOL_NO &&
-- 
2.26.2



[libvirt PATCH v3 20/51] domain_conf: Use virXMLPropTristateXXX in virDomainDiskSourceNetworkParse

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 13 ++---
 1 file changed, 2 insertions(+), 11 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 920078a706..4fd4fabb3f 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8274,7 +8274,6 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node,
 {
 int tlsCfgVal;
 g_autofree char *protocol = NULL;
-g_autofree char *haveTLS = NULL;
 g_autofree char *tlsCfg = NULL;
 g_autofree char *sslverifystr = NULL;
 xmlNodePtr tmpnode;
@@ -8298,16 +8297,8 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node,
 return -1;
 }
 
-if ((haveTLS = virXMLPropString(node, "tls"))) {
-int value;
-
-if ((value = virTristateBoolTypeFromString(haveTLS)) <= 0) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("unknown disk source 'tls' setting '%s'"), 
haveTLS);
-return -1;
-}
-src->haveTLS = value;
-}
+if (virXMLPropTristateBool(node, "tls", false, >haveTLS) < 0)
+return -1;
 
 if ((flags & VIR_DOMAIN_DEF_PARSE_STATUS) &&
 (tlsCfg = virXMLPropString(node, "tlsFromConfig"))) {
-- 
2.26.2



[libvirt PATCH v3 23/51] domain_conf: Use virXMLPropTristateXXX in virDomainActualNetDefParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 14 +++---
 1 file changed, 3 insertions(+), 11 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index f17c979e31..6a43fb2588 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -10435,7 +10435,6 @@ virDomainActualNetDefParseXML(xmlNodePtr node,
 g_autofree char *type = NULL;
 g_autofree char *mode = NULL;
 g_autofree char *addrtype = NULL;
-g_autofree char *trustGuestRxFilters = NULL;
 g_autofree char *macTableManager = NULL;
 
 actual = g_new0(virDomainActualNetDef, 1);
@@ -10463,16 +10462,9 @@ virDomainActualNetDefParseXML(xmlNodePtr node,
 goto error;
 }
 
-if ((trustGuestRxFilters = virXMLPropString(node, "trustGuestRxFilters"))) 
{
-int value;
-if ((value = virTristateBoolTypeFromString(trustGuestRxFilters)) <= 0) 
{
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown trustGuestRxFilters value '%s'"),
-   trustGuestRxFilters);
-goto error;
-}
-actual->trustGuestRxFilters = value;
-}
+if (virXMLPropTristateBool(node, "trustGuestRxFilters", false,
+   >trustGuestRxFilters) < 0)
+goto error;
 
 virtPortNode = virXPathNode("./virtualport", ctxt);
 if (virtPortNode) {
-- 
2.26.2



[libvirt PATCH v3 24/51] domain_conf: Use virXMLPropTristateXXX in virDomainChrSourceReconnectDefParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 13 ++---
 1 file changed, 2 insertions(+), 11 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 6a43fb2588..7e17ded2a1 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -10618,7 +10618,6 @@ 
virDomainChrSourceReconnectDefParseXML(virDomainChrSourceReconnectDefPtr def,
xmlNodePtr node,
xmlXPathContextPtr ctxt)
 {
-int tmpVal;
 VIR_XPATH_NODE_AUTORESTORE(ctxt)
 xmlNodePtr cur;
 g_autofree char *tmp = NULL;
@@ -10626,16 +10625,8 @@ 
virDomainChrSourceReconnectDefParseXML(virDomainChrSourceReconnectDefPtr def,
 ctxt->node = node;
 
 if ((cur = virXPathNode("./reconnect", ctxt))) {
-if ((tmp = virXMLPropString(cur, "enabled"))) {
-if ((tmpVal = virTristateBoolTypeFromString(tmp)) < 0) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("invalid reconnect enabled value: '%s'"),
-   tmp);
-return -1;
-}
-def->enabled = tmpVal;
-VIR_FREE(tmp);
-}
+if (virXMLPropTristateBool(cur, "enabled", false, >enabled) < 0)
+return -1;
 
 if (def->enabled == VIR_TRISTATE_BOOL_YES) {
 if ((tmp = virXMLPropString(cur, "timeout"))) {
-- 
2.26.2



[libvirt PATCH v3 22/51] domain_conf: Use virXMLPropTristateXXX in virDomainDiskDefDriverParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 36 ++--
 1 file changed, 6 insertions(+), 30 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index f2fb3c8dd5..f17c979e31 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -9132,38 +9132,14 @@ virDomainDiskDefDriverParseXML(virDomainDiskDefPtr def,
 }
 VIR_FREE(tmp);
 
-if ((tmp = virXMLPropString(cur, "ioeventfd"))) {
-int value;
-if ((value = virTristateSwitchTypeFromString(tmp)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown disk ioeventfd mode '%s'"), tmp);
-return -1;
-}
-def->ioeventfd = value;
-}
-VIR_FREE(tmp);
+if (virXMLPropTristateSwitch(cur, "ioeventfd", false, >ioeventfd) < 0)
+return -1;
 
-if ((tmp = virXMLPropString(cur, "event_idx"))) {
-int value;
-if ((value = virTristateSwitchTypeFromString(tmp)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown disk event_idx mode '%s'"), tmp);
-return -1;
-}
-def->event_idx = value;
-}
-VIR_FREE(tmp);
+if (virXMLPropTristateSwitch(cur, "event_idx", false, >event_idx) < 0)
+return -1;
 
-if ((tmp = virXMLPropString(cur, "copy_on_read"))) {
-int value;
-if ((value = virTristateSwitchTypeFromString(tmp)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown disk copy_on_read mode '%s'"), tmp);
-return -1;
-}
-def->copy_on_read = value;
-}
-VIR_FREE(tmp);
+if (virXMLPropTristateSwitch(cur, "copy_on_read", false, 
>copy_on_read) < 0)
+return -1;
 
 if ((tmp = virXMLPropString(cur, "discard")) &&
 (def->discard = virDomainDiskDiscardTypeFromString(tmp)) <= 0) {
-- 
2.26.2



[libvirt PATCH v3 27/51] domain_conf: Use virXMLPropTristateXXX in virDomainChrSourceDefParseFile

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 15 +++
 1 file changed, 3 insertions(+), 12 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 7fb096e6d9..0f3be88235 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -11777,20 +11777,11 @@ static int
 virDomainChrSourceDefParseFile(virDomainChrSourceDefPtr def,
xmlNodePtr source)
 {
-g_autofree char *append = NULL;
-
 def->data.file.path = virXMLPropString(source, "path");
 
-if ((append = virXMLPropString(source, "append"))) {
-int value;
-if ((value = virTristateSwitchTypeFromString(append)) <= 0) {
-virReportError(VIR_ERR_INTERNAL_ERROR,
-   _("Invalid append attribute value '%s'"),
-   append);
-return -1;
-}
-def->data.file.append = value;
-}
+if (virXMLPropTristateSwitch(source, "append", false,
+ >data.file.append) < 0)
+return -1;
 
 return 0;
 }
-- 
2.26.2



[libvirt PATCH v3 26/51] domain_conf: Use virXMLPropTristateXXX in virDomainChrSourceDefParseTCP

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 13 ++---
 1 file changed, 2 insertions(+), 11 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 97eb1b6f8a..7fb096e6d9 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -11703,17 +11703,8 @@ virDomainChrSourceDefParseTCP(virDomainChrSourceDefPtr 
def,
 def->data.tcp.host = virXMLPropString(source, "host");
 def->data.tcp.service = virXMLPropString(source, "service");
 
-if ((tmp = virXMLPropString(source, "tls"))) {
-int value;
-if ((value = virTristateBoolTypeFromString(tmp)) <= 0) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("unknown chardev 'tls' setting '%s'"),
-   tmp);
-return -1;
-}
-def->data.tcp.haveTLS = value;
-VIR_FREE(tmp);
-}
+if (virXMLPropTristateBool(source, "tls", false, >data.tcp.haveTLS) < 
0)
+return -1;
 
 if ((flags & VIR_DOMAIN_DEF_PARSE_STATUS) &&
 (tmp = virXMLPropString(source, "tlsFromConfig"))) {
-- 
2.26.2



[libvirt PATCH v3 15/51] virxml: Add virXMLPropTristateBool

2021-03-19 Thread Tim Wiederhake
Convenience function to return value of a yes / no attribute.

Signed-off-by: Tim Wiederhake 
---
 src/libvirt_private.syms |  1 +
 src/util/virxml.c| 41 
 src/util/virxml.h|  5 +
 3 files changed, 47 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 526dcee11a..70525cef8c 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -3545,6 +3545,7 @@ virXMLParseHelper;
 virXMLPickShellSafeComment;
 virXMLPropString;
 virXMLPropStringLimit;
+virXMLPropTristateBool;
 virXMLSaveFile;
 virXMLValidateAgainstSchema;
 virXMLValidatorFree;
diff --git a/src/util/virxml.c b/src/util/virxml.c
index 4a6fe09468..81b7bb1386 100644
--- a/src/util/virxml.c
+++ b/src/util/virxml.c
@@ -558,6 +558,47 @@ virXMLNodeContentString(xmlNodePtr node)
 }
 
 
+/**
+ * virXMLPropTristateBool:
+ * @node: XML dom node pointer
+ * @name: Name of the property (attribute) to get
+ * @required: Change the return value to -1 if the attribute is not present
+ * @result: The returned virTristateBool value
+ *
+ * Convenience function to return value of a yes / no attribute.
+ *
+ * Returns 1 in case of success in which case @value is set,
+ * or 0 if the attribute is not present,
+ * or -1 and reports an error on failure.
+ */
+int
+virXMLPropTristateBool(xmlNodePtr node, const char* name, bool required,
+   virTristateBool *result)
+{
+g_autofree char *tmp = virXMLPropString(node, name);
+int val;
+
+if (!tmp) {
+if (!required)
+return 0;
+virReportError(VIR_ERR_XML_ERROR,
+   _("Missing required attribute '%s' in element '%s'"),
+   name, node->name);
+return -1;
+}
+
+if ((val = virTristateBoolTypeFromString(tmp)) <= 0) {
+virReportError(VIR_ERR_XML_ERROR,
+   _("Invalid value for attribute '%s' in element '%s': 
'%s'. Expected 'yes' or 'no'"),
+   name, node->name, tmp);
+return -1;
+}
+
+*result = val;
+return 1;
+}
+
+
 /**
  * virXPathBoolean:
  * @xpath: the XPath string to evaluate
diff --git a/src/util/virxml.h b/src/util/virxml.h
index d32f77b867..3041c37df3 100644
--- a/src/util/virxml.h
+++ b/src/util/virxml.h
@@ -28,6 +28,7 @@
 #include 
 
 #include "virbuffer.h"
+#include "virenum.h"
 
 xmlXPathContextPtr virXMLXPathContextNew(xmlDocPtr xml)
 G_GNUC_WARN_UNUSED_RESULT;
@@ -77,6 +78,10 @@ char * virXMLPropStringLimit(xmlNodePtr node,
  const char *name,
  size_t maxlen);
 char *   virXMLNodeContentString(xmlNodePtr node);
+int   virXMLPropTristateBool(xmlNodePtr node,
+ const char *name,
+ bool mandatory,
+ virTristateBool *result);
 
 /* Internal function; prefer the macros below.  */
 xmlDocPtr  virXMLParseHelper(int domcode,
-- 
2.26.2



[libvirt PATCH v3 17/51] domain_conf: Use virXMLPropTristateXXX in virDomainKeyWrapCipherDefParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 14 ++
 1 file changed, 2 insertions(+), 12 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 9e106b8846..7dfbca12e5 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1447,10 +1447,9 @@ static int
 virDomainKeyWrapCipherDefParseXML(virDomainKeyWrapDefPtr keywrap,
   xmlNodePtr node)
 {
-int state_type;
+virTristateSwitch state_type = VIR_TRISTATE_SWITCH_ABSENT;
 int name_type;
 g_autofree char *name = NULL;
-g_autofree char *state = NULL;
 
 if (!(name = virXMLPropString(node, "name"))) {
 virReportError(VIR_ERR_CONF_SYNTAX, "%s",
@@ -1464,17 +1463,8 @@ virDomainKeyWrapCipherDefParseXML(virDomainKeyWrapDefPtr 
keywrap,
 return -1;
 }
 
-if (!(state = virXMLPropString(node, "state"))) {
-virReportError(VIR_ERR_CONF_SYNTAX,
-   _("missing state for cipher named %s"), name);
-return -1;
-}
-
-if ((state_type = virTristateSwitchTypeFromString(state)) < 0) {
-virReportError(VIR_ERR_CONF_SYNTAX,
-   _("%s is not a supported cipher state"), state);
+if (virXMLPropTristateSwitch(node, "state", true, _type) < 0)
 return -1;
-}
 
 switch ((virDomainKeyWrapCipherName) name_type) {
 case VIR_DOMAIN_KEY_WRAP_CIPHER_NAME_AES:
-- 
2.26.2



[libvirt PATCH v3 12/51] conf: Use virTristateXXX in virStorageAdapterFCHost

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/storage_adapter_conf.c | 4 +++-
 src/conf/storage_adapter_conf.h | 2 +-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/conf/storage_adapter_conf.c b/src/conf/storage_adapter_conf.c
index 77ecb8d5f2..69062b4b58 100644
--- a/src/conf/storage_adapter_conf.c
+++ b/src/conf/storage_adapter_conf.c
@@ -68,13 +68,15 @@ virStorageAdapterParseXMLFCHost(xmlNodePtr node,
 
 fchost->parent = virXMLPropString(node, "parent");
 if ((managed = virXMLPropString(node, "managed"))) {
-if ((fchost->managed = virTristateBoolTypeFromString(managed)) < 0) {
+int value;
+if ((value = virTristateBoolTypeFromString(managed)) < 0) {
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("unknown fc_host managed setting '%s'"),
managed);
 VIR_FREE(managed);
 return -1;
 }
+fchost->managed = value;
 }
 
 fchost->parent_wwnn = virXMLPropString(node, "parent_wwnn");
diff --git a/src/conf/storage_adapter_conf.h b/src/conf/storage_adapter_conf.h
index 4c7da7c8d9..3f64cda9af 100644
--- a/src/conf/storage_adapter_conf.h
+++ b/src/conf/storage_adapter_conf.h
@@ -51,7 +51,7 @@ struct _virStorageAdapterFCHost {
 char *parent_fabric_wwn;
 char *wwnn;
 char *wwpn;
-int managed;/* enum virTristateSwitch */
+virTristateBool managed;
 };
 
 typedef struct _virStorageAdapter virStorageAdapter;
-- 
2.26.2



[libvirt PATCH v3 06/51] conf: Use virTristateXXX in virDomainNetDef

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 17 +
 src/conf/domain_conf.h |  2 +-
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 8e94860b51..9f59756119 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -10854,14 +10854,15 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
 def->type = VIR_DOMAIN_NET_TYPE_USER;
 }
 
-trustGuestRxFilters = virXMLPropString(node, "trustGuestRxFilters");
-if (trustGuestRxFilters &&
-((def->trustGuestRxFilters
-  = virTristateBoolTypeFromString(trustGuestRxFilters)) <= 0)) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown trustGuestRxFilters value '%s'"),
-   trustGuestRxFilters);
-goto error;
+if ((trustGuestRxFilters = virXMLPropString(node, "trustGuestRxFilters"))) 
{
+int value;
+if ((value = virTristateBoolTypeFromString(trustGuestRxFilters)) <= 0) 
{
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _("unknown trustGuestRxFilters value '%s'"),
+   trustGuestRxFilters);
+goto error;
+}
+def->trustGuestRxFilters = value;
 }
 
 cur = node->children;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 90079d7e64..15dc416384 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1102,7 +1102,7 @@ struct _virDomainNetDef {
 GHashTable *filterparams;
 virNetDevBandwidthPtr bandwidth;
 virNetDevVlan vlan;
-int trustGuestRxFilters; /* enum virTristateBool */
+virTristateBool trustGuestRxFilters;
 virTristateBool isolatedPort;
 int linkstate;
 unsigned int mtu;
-- 
2.26.2



[libvirt PATCH v3 11/51] conf: Use virTristateXXX in virDomainDef

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index d6ca5e9725..25af058241 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2755,7 +2755,7 @@ struct _virDomainDef {
 virDomainHPTResizing hpt_resizing;
 unsigned long long hpt_maxpagesize; /* Stored in KiB */
 char *hyperv_vendor_id;
-int apic_eoi;
+virTristateSwitch apic_eoi;
 
 bool tseg_specified;
 unsigned long long tseg_size;
-- 
2.26.2



[libvirt PATCH v3 14/51] conf: Use virTristateXXX in virPCIDeviceAddress

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/device_conf.c | 16 +---
 src/util/virpci.h  |  2 +-
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/conf/device_conf.c b/src/conf/device_conf.c
index 714ac50762..0dd60985e9 100644
--- a/src/conf/device_conf.c
+++ b/src/conf/device_conf.c
@@ -246,13 +246,15 @@ virPCIDeviceAddressParseXML(xmlNodePtr node,
 return -1;
 }
 
-if (multi &&
-((addr->multi = virTristateSwitchTypeFromString(multi)) <= 0)) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("Unknown value '%s' for  'multifunction' 
attribute"),
-   multi);
-return -1;
-
+if (multi) {
+int value;
+if ((value = virTristateSwitchTypeFromString(multi)) <= 0) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _("Unknown value '%s' for  'multifunction' 
attribute"),
+   multi);
+return -1;
+}
+addr->multi = value;
 }
 if (!virPCIDeviceAddressIsEmpty(addr) && !virPCIDeviceAddressIsValid(addr, 
true))
 return -1;
diff --git a/src/util/virpci.h b/src/util/virpci.h
index 9b37a12883..2c86642ea7 100644
--- a/src/util/virpci.h
+++ b/src/util/virpci.h
@@ -65,7 +65,7 @@ struct _virPCIDeviceAddress {
 unsigned int bus;
 unsigned int slot;
 unsigned int function;
-int multi; /* virTristateSwitch */
+virTristateSwitch multi;
 int extFlags; /* enum virPCIDeviceAddressExtensionFlags */
 virZPCIDeviceAddress zpci;
 /* Don't forget to update virPCIDeviceAddressCopy if needed. */
-- 
2.26.2



[libvirt PATCH v3 04/51] conf: Use virTristateXXX in virDomainDiskDef

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 39 ---
 src/conf/domain_conf.h |  6 +++---
 2 files changed, 27 insertions(+), 18 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 43789fa2c7..014f318dcd 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -9196,27 +9196,36 @@ virDomainDiskDefDriverParseXML(virDomainDiskDefPtr def,
 }
 VIR_FREE(tmp);
 
-if ((tmp = virXMLPropString(cur, "ioeventfd")) &&
-(def->ioeventfd = virTristateSwitchTypeFromString(tmp)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown disk ioeventfd mode '%s'"), tmp);
-return -1;
+if ((tmp = virXMLPropString(cur, "ioeventfd"))) {
+int value;
+if ((value = virTristateSwitchTypeFromString(tmp)) <= 0) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _("unknown disk ioeventfd mode '%s'"), tmp);
+return -1;
+}
+def->ioeventfd = value;
 }
 VIR_FREE(tmp);
 
-if ((tmp = virXMLPropString(cur, "event_idx")) &&
-(def->event_idx = virTristateSwitchTypeFromString(tmp)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown disk event_idx mode '%s'"), tmp);
-return -1;
+if ((tmp = virXMLPropString(cur, "event_idx"))) {
+int value;
+if ((value = virTristateSwitchTypeFromString(tmp)) <= 0) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _("unknown disk event_idx mode '%s'"), tmp);
+return -1;
+}
+def->event_idx = value;
 }
 VIR_FREE(tmp);
 
-if ((tmp = virXMLPropString(cur, "copy_on_read")) &&
-(def->copy_on_read = virTristateSwitchTypeFromString(tmp)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown disk copy_on_read mode '%s'"), tmp);
-return -1;
+if ((tmp = virXMLPropString(cur, "copy_on_read"))) {
+int value;
+if ((value = virTristateSwitchTypeFromString(tmp)) <= 0) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _("unknown disk copy_on_read mode '%s'"), tmp);
+return -1;
+}
+def->copy_on_read = value;
 }
 VIR_FREE(tmp);
 
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 87bc7e8625..853cab96b5 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -568,9 +568,9 @@ struct _virDomainDiskDef {
 int error_policy;  /* enum virDomainDiskErrorPolicy */
 int rerror_policy; /* enum virDomainDiskErrorPolicy */
 int iomode; /* enum virDomainDiskIo */
-int ioeventfd; /* enum virTristateSwitch */
-int event_idx; /* enum virTristateSwitch */
-int copy_on_read; /* enum virTristateSwitch */
+virTristateSwitch ioeventfd;
+virTristateSwitch event_idx;
+virTristateSwitch copy_on_read;
 int snapshot; /* virDomainSnapshotLocation, snapshot_conf.h */
 int startupPolicy; /* enum virDomainStartupPolicy */
 bool transient;
-- 
2.26.2



[libvirt PATCH v3 03/51] conf: Use virTristateXXX in virDomainDeviceInfo

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/device_conf.h  |  4 ++--
 src/conf/domain_conf.c  | 26 --
 src/qemu/qemu_command.c |  3 ++-
 src/qemu/qemu_hotplug.c |  2 +-
 4 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h
index a51bdf10ee..289af1153a 100644
--- a/src/conf/device_conf.h
+++ b/src/conf/device_conf.h
@@ -153,8 +153,8 @@ struct _virDomainDeviceInfo {
 } master;
 /* rombar and romfile are only used for pci hostdev and network
  * devices. */
-int romenabled; /* enum virTristateBool */
-int rombar; /* enum virTristateSwitch */
+virTristateBool romenabled;
+virTristateSwitch rombar;
 char *romfile;
 /* bootIndex is only used for disk, network interface, hostdev
  * and redirdev devices */
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 27eb98d93c..43789fa2c7 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -6681,17 +6681,23 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr 
xmlopt,
 
 if ((flags & VIR_DOMAIN_DEF_PARSE_ALLOW_ROM) &&
 (rom = virXPathNode("./rom", ctxt))) {
-if ((romenabled = virXPathString("string(./rom/@enabled)", ctxt)) &&
-((info->romenabled = virTristateBoolTypeFromString(romenabled)) <= 
0)) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown rom enabled value '%s'"), romenabled);
-goto cleanup;
+if ((romenabled = virXPathString("string(./rom/@enabled)", ctxt))) {
+int value;
+if ((value = virTristateBoolTypeFromString(romenabled)) <= 0) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _("unknown rom enabled value '%s'"), 
romenabled);
+goto cleanup;
+}
+info->romenabled = value;
 }
-if ((rombar = virXPathString("string(./rom/@bar)", ctxt)) &&
-((info->rombar = virTristateSwitchTypeFromString(rombar)) <= 0)) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown rom bar value '%s'"), rombar);
-goto cleanup;
+if ((rombar = virXPathString("string(./rom/@bar)", ctxt))) {
+int value;
+if ((value = virTristateSwitchTypeFromString(rombar)) <= 0) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _("unknown rom bar value '%s'"), rombar);
+goto cleanup;
+}
+info->rombar = value;
 }
 info->romfile = virXMLPropString(rom, "file");
 
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 5717f7b98d..73c28ed7a0 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -660,7 +660,8 @@ qemuBuildRomStr(virBufferPtr buf,
 case VIR_TRISTATE_SWITCH_ON:
 virBufferAddLit(buf, ",rombar=1");
 break;
-default:
+case VIR_TRISTATE_SWITCH_ABSENT:
+case VIR_TRISTATE_SWITCH_LAST:
 break;
 }
 if (info->romfile) {
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index a66354426d..cc49f10198 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -3665,7 +3665,7 @@ qemuDomainChangeNet(virQEMUDriverPtr driver,
 
 /* device alias is checked already in virDomainDefCompatibleDevice */
 
-if (newdev->info.rombar == VIR_TRISTATE_BOOL_ABSENT)
+if (newdev->info.rombar == VIR_TRISTATE_SWITCH_ABSENT)
 newdev->info.rombar = olddev->info.rombar;
 if (olddev->info.rombar != newdev->info.rombar) {
 virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
-- 
2.26.2



[libvirt PATCH v3 13/51] conf: Use virTristateXXX in virStoragePoolSourceDevice

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/storage_conf.c | 7 ---
 src/conf/storage_conf.h | 2 +-
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 2e07c81f8a..6116b04d44 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -617,14 +617,15 @@ virStoragePoolDefParseSource(xmlXPathContextPtr ctxt,
 
 partsep = virXMLPropString(nodeset[i], "part_separator");
 if (partsep) {
-dev.part_separator = virTristateBoolTypeFromString(partsep);
-if (dev.part_separator <= 0) {
+int value = virTristateBoolTypeFromString(partsep);
+if (value <= 0) {
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("invalid part_separator setting '%s'"),
partsep);
 virStoragePoolSourceDeviceClear();
 goto cleanup;
 }
+dev.part_separator = value;
 }
 
 if (VIR_APPEND_ELEMENT(source->devices, source->ndevice, dev) < 0) {
@@ -1097,7 +1098,7 @@ virStoragePoolSourceFormat(virBufferPtr buf,
 virBufferEscapeString(buf, "devices[i].path);
 if (src->devices[i].part_separator !=
-VIR_TRISTATE_SWITCH_ABSENT) {
+VIR_TRISTATE_BOOL_ABSENT) {
 virBufferAsprintf(buf, " part_separator='%s'",
   
virTristateBoolTypeToString(src->devices[i].part_separator));
 }
diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
index 647eb847bf..8d417af7bb 100644
--- a/src/conf/storage_conf.h
+++ b/src/conf/storage_conf.h
@@ -168,7 +168,7 @@ struct _virStoragePoolSourceDevice {
 virStoragePoolSourceDeviceExtentPtr freeExtents;
 char *path;
 int format; /* Pool specific source format */
-int part_separator;  /* enum virTristateSwitch */
+virTristateBool part_separator;
 
 /* When the source device is a physical disk,
  * the geometry data is needed
-- 
2.26.2



[libvirt PATCH v3 08/51] conf: Use virTristateXXX in virDomainGraphicsDef

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 6619b9f006..09b697432d 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1862,7 +1862,7 @@ struct _virDomainGraphicsDef {
 int image;
 int jpeg;
 int zlib;
-int playback;
+virTristateSwitch playback;
 int streaming;
 virTristateBool copypaste;
 virTristateBool filetransfer;
-- 
2.26.2



[libvirt PATCH v3 01/51] conf: Use virTristateXXX in virStorageSource

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 12 
 src/conf/storage_source_conf.h |  2 +-
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 7671050134..3d24479f28 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8338,11 +8338,15 @@ virDomainDiskSourceNetworkParse(xmlNodePtr node,
 return -1;
 }
 
-if ((haveTLS = virXMLPropString(node, "tls")) &&
-(src->haveTLS = virTristateBoolTypeFromString(haveTLS)) <= 0) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("unknown disk source 'tls' setting '%s'"), haveTLS);
+if ((haveTLS = virXMLPropString(node, "tls"))) {
+int value;
+
+if ((value = virTristateBoolTypeFromString(haveTLS)) <= 0) {
+virReportError(VIR_ERR_XML_ERROR,
+   _("unknown disk source 'tls' setting '%s'"), 
haveTLS);
 return -1;
+}
+src->haveTLS = value;
 }
 
 if ((flags & VIR_DOMAIN_DEF_PARSE_STATUS) &&
diff --git a/src/conf/storage_source_conf.h b/src/conf/storage_source_conf.h
index f42bb1c67d..e6702a1ffc 100644
--- a/src/conf/storage_source_conf.h
+++ b/src/conf/storage_source_conf.h
@@ -356,7 +356,7 @@ struct _virStorageSource {
 char *nodestorage; /* name of the storage object */
 
 /* An optional setting to enable usage of TLS for the storage source */
-int haveTLS; /* enum virTristateBool */
+virTristateBool haveTLS;
 
 /* Indication whether the haveTLS value was altered due to qemu.conf
  * setting when haveTLS is missing from the domain config file */
-- 
2.26.2



[libvirt PATCH v3 07/51] conf: Use virTristateXXX in virDomainChrSourceDef

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 34 +-
 src/conf/domain_conf.h |  6 +++---
 2 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 9f59756119..e99699028a 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -11891,12 +11891,14 @@ 
virDomainChrSourceDefParseTCP(virDomainChrSourceDefPtr def,
 def->data.tcp.service = virXMLPropString(source, "service");
 
 if ((tmp = virXMLPropString(source, "tls"))) {
-if ((def->data.tcp.haveTLS = virTristateBoolTypeFromString(tmp)) <= 0) 
{
+int value;
+if ((value = virTristateBoolTypeFromString(tmp)) <= 0) {
 virReportError(VIR_ERR_XML_ERROR,
_("unknown chardev 'tls' setting '%s'"),
tmp);
 return -1;
 }
+def->data.tcp.haveTLS = value;
 VIR_FREE(tmp);
 }
 
@@ -11975,12 +11977,15 @@ 
virDomainChrSourceDefParseFile(virDomainChrSourceDefPtr def,
 
 def->data.file.path = virXMLPropString(source, "path");
 
-if ((append = virXMLPropString(source, "append")) &&
-(def->data.file.append = virTristateSwitchTypeFromString(append)) <= 
0) {
-virReportError(VIR_ERR_INTERNAL_ERROR,
-   _("Invalid append attribute value '%s'"),
-   append);
-return -1;
+if ((append = virXMLPropString(source, "append"))) {
+int value;
+if ((value = virTristateSwitchTypeFromString(append)) <= 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR,
+   _("Invalid append attribute value '%s'"),
+   append);
+return -1;
+}
+def->data.file.append = value;
 }
 
 return 0;
@@ -12016,12 +12021,15 @@ 
virDomainChrSourceDefParseLog(virDomainChrSourceDefPtr def,
 
 def->logfile = virXMLPropString(log, "file");
 
-if ((append = virXMLPropString(log, "append")) &&
-(def->logappend = virTristateSwitchTypeFromString(append)) <= 0) {
-virReportError(VIR_ERR_INTERNAL_ERROR,
-   _("Invalid append attribute value '%s'"),
-   append);
-return -1;
+if ((append = virXMLPropString(log, "append"))) {
+int value;
+if ((value = virTristateSwitchTypeFromString(append)) <= 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR,
+   _("Invalid append attribute value '%s'"),
+   append);
+return -1;
+}
+def->logappend = value;
 }
 
 return 0;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 15dc416384..6619b9f006 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1232,7 +1232,7 @@ struct _virDomainChrSourceDef {
 /* no  for null, vc, stdio */
 struct {
 char *path;
-int append; /* enum virTristateSwitch */
+virTristateSwitch append;
 } file; /* pty, file, pipe, or device */
 struct {
 char *master;
@@ -1244,7 +1244,7 @@ struct _virDomainChrSourceDef {
 bool listen;
 int protocol;
 bool tlscreds;
-int haveTLS; /* enum virTristateBool */
+virTristateBool haveTLS;
 bool tlsFromConfig;
 virDomainChrSourceReconnectDef reconnect;
 } tcp;
@@ -1265,7 +1265,7 @@ struct _virDomainChrSourceDef {
 } spiceport;
 } data;
 char *logfile;
-int logappend;
+virTristateSwitch logappend;
 
 size_t nseclabels;
 virSecurityDeviceLabelDefPtr *seclabels;
-- 
2.26.2



[libvirt PATCH v3 02/51] conf: Use virTristateXXX in virStorageSourceNVMeDef

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 4 +++-
 src/conf/storage_source_conf.h | 2 +-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 3d24479f28..27eb98d93c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8478,12 +8478,14 @@ virDomainDiskSourceNVMeParse(xmlNodePtr node,
 }
 
 if ((managed = virXMLPropString(node, "managed"))) {
-if ((nvme->managed = virTristateBoolTypeFromString(managed)) <= 0) {
+int value;
+if ((value = virTristateBoolTypeFromString(managed)) <= 0) {
 virReportError(VIR_ERR_XML_ERROR,
_("malformed managed value '%s'"),
managed);
 return -1;
 }
+nvme->managed = value;
 }
 
 if (!(address = virXPathNode("./address", ctxt))) {
diff --git a/src/conf/storage_source_conf.h b/src/conf/storage_source_conf.h
index e6702a1ffc..1783dc195e 100644
--- a/src/conf/storage_source_conf.h
+++ b/src/conf/storage_source_conf.h
@@ -251,7 +251,7 @@ typedef struct _virStorageSourceNVMeDef 
virStorageSourceNVMeDef;
 typedef virStorageSourceNVMeDef *virStorageSourceNVMeDefPtr;
 struct _virStorageSourceNVMeDef {
 unsigned long long namespc;
-int managed; /* enum virTristateBool */
+virTristateBool managed;
 virPCIDeviceAddress pciAddr;
 
 /* Don't forget to update virStorageSourceNVMeDefCopy */
-- 
2.26.2



[libvirt PATCH v3 00/51] Refactor XML parsing boilerplate code

2021-03-19 Thread Tim Wiederhake
This series replaces some recurring boilerplate code in src/conf/ regarding
the extraction of a virTristate(Switch|Bool) XML attribute.

The boilerplate code looks roughly like this,

  g_autofree char *str = NULL;
  if (str = virXMLPropString(node, ...)) {
int val;
if ((val = virTristateBoolTypeFromString(str)) <= 0) {
  virReportError(...)
  return -1;
}
def->... = val;
  }

with some variations regarding how `str` is free'd in case of later re-use,
the exact error message for invalid values, whether or not
`VIR_TRISTATE_(SWITCH|BOOL)_ABSENT` is explicitly checked for (`val < 0` vs.
`val <= 0`), whether an intermediate variable is used or the value is assigned
directly, and in some cases the conditions in the two if-blocks are merged.

As a side effect, this makes the error messages for invalid values in these
attributes much more consistent and catches some instances where e.g.
`` would incorrectly be accepted.

V1: https://listman.redhat.com/archives/libvir-list/2021-March/msg00853.html
V2: https://listman.redhat.com/archives/libvir-list/2021-March/msg00994.html

Changes since V2:
* Fixed the -Wtautological-unsigned-enum-zero-compare issues in the first
  part of the series. These issues were solved later in the series, but
  this change makes it easier to bisect in the future.

I was thinking about only re-sending the first couple of patches, but the
latter part would have endet up with quite a few conflicts, so I am sending
it in its entirety, again. Sorry for the spam!

Cheers,
Tim

Tim Wiederhake (51):
  conf: Use virTristateXXX in virStorageSource
  conf: Use virTristateXXX in virStorageSourceNVMeDef
  conf: Use virTristateXXX in virDomainDeviceInfo
  conf: Use virTristateXXX in virDomainDiskDef
  conf: Use virTristateXXX in virDomainActualNetDef
  conf: Use virTristateXXX in virDomainNetDef
  conf: Use virTristateXXX in virDomainChrSourceDef
  conf: Use virTristateXXX in virDomainGraphicsDef
  conf: Use virTristateXXX in virDomainMemballoonDef
  conf: Use virTristateXXX in virDomainLoaderDef
  conf: Use virTristateXXX in virDomainDef
  conf: Use virTristateXXX in virStorageAdapterFCHost
  conf: Use virTristateXXX in virStoragePoolSourceDevice
  conf: Use virTristateXXX in virPCIDeviceAddress
  virxml: Add virXMLPropTristateBool
  virxml: Add virXMLPropTristateSwitch
  domain_conf: Use virXMLPropTristateXXX in
virDomainKeyWrapCipherDefParseXML
  domain_conf: Use virXMLPropTristateXXX in
virDomainVirtioOptionsParseXML
  domain_conf: Use virXMLPropTristateXXX in virDomainDeviceInfoParseXML
  domain_conf: Use virXMLPropTristateXXX in
virDomainDiskSourceNetworkParse
  domain_conf: Use virXMLPropTristateXXX in virDomainDiskSourceNVMeParse
  domain_conf: Use virXMLPropTristateXXX in
virDomainDiskDefDriverParseXML
  domain_conf: Use virXMLPropTristateXXX in
virDomainActualNetDefParseXML
  domain_conf: Use virXMLPropTristateXXX in
virDomainChrSourceReconnectDefParseXML
  domain_conf: Use virXMLPropTristateXXX in virDomainNetDefParseXML
  domain_conf: Use virXMLPropTristateXXX in
virDomainChrSourceDefParseTCP
  domain_conf: Use virXMLPropTristateXXX in
virDomainChrSourceDefParseFile
  domain_conf: Use virXMLPropTristateXXX in
virDomainChrSourceDefParseLog
  domain_conf: Use virXMLPropTristateXXX in
virDomainGraphicsDefParseXMLVNC
  domain_conf: Use virXMLPropTristateXXX in
virDomainGraphicsDefParseXMLSDL
  domain_conf: Use virXMLPropTristateXXX in
virDomainGraphicsDefParseXMLSpice
  domain_conf: Use virXMLPropTristateXXX in virDomainAudioCommonParse
  domain_conf: Use virXMLPropTristateXXX in virDomainAudioJackParse
  domain_conf: Use virXMLPropTristateXXX in virDomainAudioOSSParse
  domain_conf: Use virXMLPropTristateXXX in virDomainAudioDefParseXML
  domain_conf: Use virXMLPropTristateXXX in
virDomainMemballoonDefParseXML
  domain_conf: Use virXMLPropTristateXXX in virDomainShmemDefParseXML
  domain_conf: Use virXMLPropTristateXXX in
virDomainPerfEventDefParseXML
  domain_conf: Use virXMLPropTristateXXX in virDomainMemoryDefParseXML
  domain_conf: Use virXMLPropTristateXXX in virDomainIOMMUDefParseXML
  domain_conf: Use virXMLPropTristateXXX in virDomainVsockDefParseXML
  domain_conf: Use virXMLPropTristateXXX in virDomainFeaturesDefParse
  domain_conf: Use virXMLPropTristateXXX in virDomainLoaderDefParseXML
  domain_conf: Use virXMLPropTristateXXX in virDomainVcpuParse
  backup_conf: Use virXMLPropTristateXXX in
virDomainBackupDiskDefParseXML
  backup_conf: Use virXMLPropTristateXXX in virDomainBackupDefParse
  device_conf: Use virXMLPropTristateXXX in virPCIDeviceAddressParseXML
  network_conf: Use virXMLPropTristateXXX in
virNetworkForwardNatDefParseXML
  numa_conf: Use virXMLPropTristateXXX in virDomainNumaDefParseXML
  storage_adapter_conf: Use virXMLPropTristateXXX in
virStorageAdapterParseXMLFCHost
  storage_conf: Use virXMLPropTristateXXX in
virStoragePoolDefParseSource

 src/conf/backup_conf.c

[libvirt PATCH] ci: Drop prefix from Dockerfiles

2021-03-19 Thread Andrea Bolognani
Since the string "ci" is already contained in the path, it
seems unnecessary to include it into the filename too: in fact,
we only do that for Dockerfiles and not for files in ci/cirrus,
even though those are generated the very same way.

Signed-off-by: Andrea Bolognani 
---
 .gitlab-ci.yml| 2 +-
 ci/containers/{ci-centos-7.Dockerfile => centos-7.Dockerfile} | 0
 ci/containers/{ci-centos-8.Dockerfile => centos-8.Dockerfile} | 0
 .../{ci-centos-stream.Dockerfile => centos-stream.Dockerfile} | 0
 ...-aarch64.Dockerfile => debian-10-cross-aarch64.Dockerfile} | 0
 ...ss-armv6l.Dockerfile => debian-10-cross-armv6l.Dockerfile} | 0
 ...ss-armv7l.Dockerfile => debian-10-cross-armv7l.Dockerfile} | 0
 ...-cross-i686.Dockerfile => debian-10-cross-i686.Dockerfile} | 0
 ...-cross-mips.Dockerfile => debian-10-cross-mips.Dockerfile} | 0
 ...ips64el.Dockerfile => debian-10-cross-mips64el.Dockerfile} | 0
 ...ss-mipsel.Dockerfile => debian-10-cross-mipsel.Dockerfile} | 0
 ...-ppc64le.Dockerfile => debian-10-cross-ppc64le.Dockerfile} | 0
 ...ross-s390x.Dockerfile => debian-10-cross-s390x.Dockerfile} | 0
 .../{ci-debian-10.Dockerfile => debian-10.Dockerfile} | 0
 ...aarch64.Dockerfile => debian-sid-cross-aarch64.Dockerfile} | 0
 ...s-armv6l.Dockerfile => debian-sid-cross-armv6l.Dockerfile} | 0
 ...s-armv7l.Dockerfile => debian-sid-cross-armv7l.Dockerfile} | 0
 ...cross-i686.Dockerfile => debian-sid-cross-i686.Dockerfile} | 0
 ...ps64el.Dockerfile => debian-sid-cross-mips64el.Dockerfile} | 0
 ...s-mipsel.Dockerfile => debian-sid-cross-mipsel.Dockerfile} | 0
 ...ppc64le.Dockerfile => debian-sid-cross-ppc64le.Dockerfile} | 0
 ...oss-s390x.Dockerfile => debian-sid-cross-s390x.Dockerfile} | 0
 .../{ci-debian-sid.Dockerfile => debian-sid.Dockerfile}   | 0
 .../{ci-fedora-32.Dockerfile => fedora-32.Dockerfile} | 0
 .../{ci-fedora-33.Dockerfile => fedora-33.Dockerfile} | 0
 ...w32.Dockerfile => fedora-rawhide-cross-mingw32.Dockerfile} | 0
 ...w64.Dockerfile => fedora-rawhide-cross-mingw64.Dockerfile} | 0
 ...ci-fedora-rawhide.Dockerfile => fedora-rawhide.Dockerfile} | 0
 .../{ci-opensuse-152.Dockerfile => opensuse-152.Dockerfile}   | 0
 .../{ci-ubuntu-1804.Dockerfile => ubuntu-1804.Dockerfile} | 0
 .../{ci-ubuntu-2004.Dockerfile => ubuntu-2004.Dockerfile} | 0
 ci/helper | 4 ++--
 32 files changed, 3 insertions(+), 3 deletions(-)
 rename ci/containers/{ci-centos-7.Dockerfile => centos-7.Dockerfile} (100%)
 rename ci/containers/{ci-centos-8.Dockerfile => centos-8.Dockerfile} (100%)
 rename ci/containers/{ci-centos-stream.Dockerfile => centos-stream.Dockerfile} 
(100%)
 rename ci/containers/{ci-debian-10-cross-aarch64.Dockerfile => 
debian-10-cross-aarch64.Dockerfile} (100%)
 rename ci/containers/{ci-debian-10-cross-armv6l.Dockerfile => 
debian-10-cross-armv6l.Dockerfile} (100%)
 rename ci/containers/{ci-debian-10-cross-armv7l.Dockerfile => 
debian-10-cross-armv7l.Dockerfile} (100%)
 rename ci/containers/{ci-debian-10-cross-i686.Dockerfile => 
debian-10-cross-i686.Dockerfile} (100%)
 rename ci/containers/{ci-debian-10-cross-mips.Dockerfile => 
debian-10-cross-mips.Dockerfile} (100%)
 rename ci/containers/{ci-debian-10-cross-mips64el.Dockerfile => 
debian-10-cross-mips64el.Dockerfile} (100%)
 rename ci/containers/{ci-debian-10-cross-mipsel.Dockerfile => 
debian-10-cross-mipsel.Dockerfile} (100%)
 rename ci/containers/{ci-debian-10-cross-ppc64le.Dockerfile => 
debian-10-cross-ppc64le.Dockerfile} (100%)
 rename ci/containers/{ci-debian-10-cross-s390x.Dockerfile => 
debian-10-cross-s390x.Dockerfile} (100%)
 rename ci/containers/{ci-debian-10.Dockerfile => debian-10.Dockerfile} (100%)
 rename ci/containers/{ci-debian-sid-cross-aarch64.Dockerfile => 
debian-sid-cross-aarch64.Dockerfile} (100%)
 rename ci/containers/{ci-debian-sid-cross-armv6l.Dockerfile => 
debian-sid-cross-armv6l.Dockerfile} (100%)
 rename ci/containers/{ci-debian-sid-cross-armv7l.Dockerfile => 
debian-sid-cross-armv7l.Dockerfile} (100%)
 rename ci/containers/{ci-debian-sid-cross-i686.Dockerfile => 
debian-sid-cross-i686.Dockerfile} (100%)
 rename ci/containers/{ci-debian-sid-cross-mips64el.Dockerfile => 
debian-sid-cross-mips64el.Dockerfile} (100%)
 rename ci/containers/{ci-debian-sid-cross-mipsel.Dockerfile => 
debian-sid-cross-mipsel.Dockerfile} (100%)
 rename ci/containers/{ci-debian-sid-cross-ppc64le.Dockerfile => 
debian-sid-cross-ppc64le.Dockerfile} (100%)
 rename ci/containers/{ci-debian-sid-cross-s390x.Dockerfile => 
debian-sid-cross-s390x.Dockerfile} (100%)
 rename ci/containers/{ci-debian-sid.Dockerfile => debian-sid.Dockerfile} (100%)
 rename ci/containers/{ci-fedora-32.Dockerfile => fedora-32.Dockerfile} (100%)
 rename ci/containers/{ci-fedora-33.Dockerfile => fedora-33.Dockerfile} (100%)
 rename ci/containers/{ci-fedora-rawhide-cross-mingw32.Dockerfile => 
fedora-rawhide-cross-mingw32.Dockerfile} (100%)
 rename 

Re: [libvirt PATCH 8/9] conf: introduce support for firmware auto-selection feature filtering

2021-03-19 Thread Kashyap Chamarthy
On Fri, Mar 19, 2021 at 11:59:11AM +0100, Pavel Hrdina wrote:
> On Fri, Mar 19, 2021 at 11:10:05AM +0100, Kashyap Chamarthy wrote:
> > On Thu, Mar 18, 2021 at 01:26:45PM +0100, Pavel Hrdina wrote:

[...]

> > Nit: I'd recast it as: "When using firmware auto-selection, different
> > features are enabled in any given firmware binary."
> 
> Sounds a bit better but I've already pushed the patches.

Np; can be a follow-up.

[...]

> > Should we also list a couple of example features?  E.g.  "amd-sev" (on
> > supported hardware), "acpi-s3", "secure-boot".
> 
> I was considering listing all features that the JSON files can have but
> most of the other features are already controlled by different XML
> elements. There is an explicit list of features later in the docs.

Ah, where's the explict list of features?  I don't see them under the
"BIOS bootloader" section:
https://libvirt.org/formatdomain.html#bios-bootloader

> > I notice that "enrolled-keys" is the only feature advertized by one of
> > the firmware descriptor files (40-edk2-ovmf-x64-sb-enrolled.json), which
> > is used as a mandatory XML attribute for the ``feature`` element.
> > 
> > I'm silently wondering there's a possibility for confusion: "Hmm,
> > 'enrolled-keys' is a possible feature, but it is a mandatory attribute
> > of ``feature`` element."
> 
> I don't understand what you mean here. If you are talking about our XML
> and the following text here in this patch then if you use the feature
> element both attributes ``enabled`` and ``name`` are mandatory. 
> But few lines above there is a statement that the you can specify zero
> or more ``feature`` elements so you don't have to limit any features.

I missed the "zero or more" bit; sorry.

> Our documentation doesn't state that 'enrolled-keys' is possible feature
> and mandatory attribute at the same time.

Yep, fair enough.  You can disregard my second paragraph above.

[...]

> > > +- ``enrolled-keys`` whether the selected nvram template has 
> > > default
> > 
> > Nit: s/nvram/NVRAM/  (Or ``nvram``, to use rST verbatim; as it's an XML
> > element.)
> 
> Using ``nvram`` would have been probably better.

[...]

> > Acked-by: Kashyap Chamarthy
> 
> As I stated the patch is already pushed so you can post a patch fixing
> the small nits listed here.

Sure.

> Thanks for the review.
> 
> Pavel



-- 
/kashyap



Re: [PATCH 3/3] NEWS: Mention support for full backups via virDomainBackupBegin

2021-03-19 Thread Eric Blake
On 3/18/21 11:45 AM, Peter Krempa wrote:
> Signed-off-by: Peter Krempa 
> ---
>  NEWS.rst | 9 +
>  1 file changed, 9 insertions(+)
> 
> diff --git a/NEWS.rst b/NEWS.rst
> index 9d819a3cf2..c2013ecac9 100644
> --- a/NEWS.rst
> +++ b/NEWS.rst
> @@ -24,6 +24,15 @@ v7.2.0 (unreleased)
>  The memory dirty rate stats can be obtained through ``virsh domstats
>  --dirtyrate`` via the virConnectGetAllDomainStats API.
> 
> +  * qemu: Full disk backups via ``virDomainBackupBegin``
> +
> +The qemu hypervisor dirver now allows taking full disk backups via the

driver

> +``virDomainBackupBegin`` API and the corresponding virsh wrapper.
> +
> +In future releases the feature will be extended to also support 
> incremental
> +backups (where only the difference since the last backup is copied) when
> +qemu adds the required functionality.
> +
>  * **Improvements**
> 
>  * **Bug fixes**
> 

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.   +1-919-301-3226
Virtualization:  qemu.org | libvirt.org



[PATCH v4 11/13] qemuxml2argvtest: Add DO_CAPS_LATEST variant of 'numatune-memnode'

2021-03-19 Thread Peter Krempa
The test has interesting config of the memory backend object. Preserve
the 5.2 output too since it's prior to JSONification.

Signed-off-by: Peter Krempa 
---
 .../numatune-memnode.x86_64-5.2.0.args| 43 +++
 .../numatune-memnode.x86_64-latest.args   | 43 +++
 tests/qemuxml2argvtest.c  |  2 +
 3 files changed, 88 insertions(+)
 create mode 100644 tests/qemuxml2argvdata/numatune-memnode.x86_64-5.2.0.args
 create mode 100644 tests/qemuxml2argvdata/numatune-memnode.x86_64-latest.args

diff --git a/tests/qemuxml2argvdata/numatune-memnode.x86_64-5.2.0.args 
b/tests/qemuxml2argvdata/numatune-memnode.x86_64-5.2.0.args
new file mode 100644
index 00..c1c21db41c
--- /dev/null
+++ b/tests/qemuxml2argvdata/numatune-memnode.x86_64-5.2.0.args
@@ -0,0 +1,43 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/tmp/lib/domain--1-QEMUGuest \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest/.local/share \
+XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest/.cache \
+XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest/.config \
+/usr/bin/qemu-system-x86_64 \
+-name guest=QEMUGuest,debug-threads=on \
+-S \
+-object secret,id=masterKey0,format=raw,\
+file=/tmp/lib/domain--1-QEMUGuest/master-key.aes \
+-machine pc-i440fx-5.2,accel=tcg,usb=off,dump-guest-core=off \
+-cpu qemu64 \
+-m 24105 \
+-overcommit mem-lock=off \
+-smp 32,sockets=32,cores=1,threads=1 \
+-object memory-backend-ram,id=ram-node0,size=20971520,host-nodes=3,\
+policy=preferred \
+-numa node,nodeid=0,cpus=0,memdev=ram-node0 \
+-object memory-backend-ram,id=ram-node1,size=676331520,host-nodes=0-7,\
+policy=bind \
+-numa node,nodeid=1,cpus=1-27,cpus=29,memdev=ram-node1 \
+-object memory-backend-ram,id=ram-node2,size=24578621440,host-nodes=1-2,\
+host-nodes=5,host-nodes=7,policy=bind \
+-numa node,nodeid=2,cpus=28,cpus=30-31,memdev=ram-node2 \
+-uuid 9f4b6512-e73a-4a25-93e8-5307802821ce \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc \
+-no-shutdown \
+-no-acpi \
+-boot strict=on \
+-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
+-audiodev id=audio1,driver=none \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\
+resourcecontrol=deny \
+-msg timestamp=on
diff --git a/tests/qemuxml2argvdata/numatune-memnode.x86_64-latest.args 
b/tests/qemuxml2argvdata/numatune-memnode.x86_64-latest.args
new file mode 100644
index 00..94b173f117
--- /dev/null
+++ b/tests/qemuxml2argvdata/numatune-memnode.x86_64-latest.args
@@ -0,0 +1,43 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/tmp/lib/domain--1-QEMUGuest \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest/.local/share \
+XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest/.cache \
+XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest/.config \
+/usr/bin/qemu-system-x86_64 \
+-name guest=QEMUGuest,debug-threads=on \
+-S \
+-object secret,id=masterKey0,format=raw,\
+file=/tmp/lib/domain--1-QEMUGuest/master-key.aes \
+-machine pc,accel=tcg,usb=off,dump-guest-core=off \
+-cpu qemu64 \
+-m 24105 \
+-overcommit mem-lock=off \
+-smp 32,sockets=32,cores=1,threads=1 \
+-object memory-backend-ram,id=ram-node0,size=20971520,host-nodes=3,\
+policy=preferred \
+-numa node,nodeid=0,cpus=0,memdev=ram-node0 \
+-object memory-backend-ram,id=ram-node1,size=676331520,host-nodes=0-7,\
+policy=bind \
+-numa node,nodeid=1,cpus=1-27,cpus=29,memdev=ram-node1 \
+-object memory-backend-ram,id=ram-node2,size=24578621440,host-nodes=1-2,\
+host-nodes=5,host-nodes=7,policy=bind \
+-numa node,nodeid=2,cpus=28,cpus=30-31,memdev=ram-node2 \
+-uuid 9f4b6512-e73a-4a25-93e8-5307802821ce \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc \
+-no-shutdown \
+-no-acpi \
+-boot strict=on \
+-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
+-audiodev id=audio1,driver=none \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\
+resourcecontrol=deny \
+-msg timestamp=on
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 1f53d95f13..26d098d32f 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -2133,6 +2133,8 @@ mymain(void)
 QEMU_CAPS_NUMA,
 QEMU_CAPS_OBJECT_MEMORY_RAM);
 DO_TEST_PARSE_ERROR("numatune-memnode", NONE);
+DO_TEST_CAPS_VER("numatune-memnode", "5.2.0");
+DO_TEST_CAPS_LATEST("numatune-memnode");

 DO_TEST("numatune-memnode-no-memory",
 QEMU_CAPS_NUMA,
-- 
2.29.2



[PATCH v4 02/13] virQEMUQAPISchemaTraverse: Fix quoting in comment

2021-03-19 Thread Peter Krempa
It tripped up highlighter in my editor.

Signed-off-by: Peter Krempa 
---
 src/qemu/qemu_qapi.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/qemu/qemu_qapi.c b/src/qemu/qemu_qapi.c
index f7e4ca9324..f4047f507a 100644
--- a/src/qemu/qemu_qapi.c
+++ b/src/qemu/qemu_qapi.c
@@ -402,7 +402,7 @@ virQEMUQAPISchemaTraverse(const char *baseName,
  *   'subattribute': selects a plain object member named 'subattribute'
  *   '*subattribute': same as above but the selected member must be optional
  *(has a property named 'default' in the schema)
- *   '+variant": In the case of unionized objects, select a specific variant of
+ *   '+variant': In the case of unionized objects, select a specific variant of
  *   the previously selected member
  *
  * - Boolean queries - @entry remains NULL, return value indicates success:
-- 
2.29.2



[PATCH v4 07/13] qemu: command: Use JSON for QAPIfied -object directly

2021-03-19 Thread Peter Krempa
Skip the lossy conversion to legacy commandline arguments by using the
JSON props directly when -object is QAPIfied. This avoids issues with
conversion of bitmaps and also allows validation of the generated JSON
against the QMP schema in the tests.

Since the new approach is triggered by a qemu capability the code
from 'virQEMUBuildObjectCommandlineFromJSON' in util/virqemu.c was moved
to 'qemuBuildObjectCommandlineFromJSON' in qemu/qemu_command.c which has
the virQEMUCaps type.

Some functions needed to be modified to propagate qemuCaps.

Signed-off-by: Peter Krempa 
---
 src/libvirt_private.syms |  1 -
 src/qemu/qemu_command.c  | 92 +++-
 src/util/virqemu.c   | 24 ---
 src/util/virqemu.h   |  3 --
 4 files changed, 63 insertions(+), 57 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 526dcee11a..c27a4a7d2e 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -3065,7 +3065,6 @@ virQEMUBuildCommandLineJSONArrayBitmap;
 virQEMUBuildCommandLineJSONArrayNumbered;
 virQEMUBuildDriveCommandlineFromJSON;
 virQEMUBuildNetdevCommandlineFromJSON;
-virQEMUBuildObjectCommandlineFromJSON;


 # util/virrandom.h
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index b60f297331..1b4fa77867 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -192,6 +192,31 @@ VIR_ENUM_IMPL(qemuAudioDriver,
 );


+static int
+qemuBuildObjectCommandlineFromJSON(virBuffer *buf,
+   virJSONValue *props,
+   virQEMUCaps *qemuCaps)
+{
+const char *type = virJSONValueObjectGetString(props, "qom-type");
+const char *alias = virJSONValueObjectGetString(props, "id");
+
+if (!type || !alias) {
+virReportError(VIR_ERR_INTERNAL_ERROR,
+   _("missing 'type'(%s) or 'alias'(%s) field of QOM 
'object'"),
+   NULLSTR(type), NULLSTR(alias));
+return -1;
+}
+
+if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_QAPIFIED)) {
+return virJSONValueToBuffer(props, buf, false);
+} else {
+virBufferAsprintf(buf, "%s,", type);
+
+return virQEMUBuildCommandLineJSON(props, buf, "qom-type",
+   
virQEMUBuildCommandLineJSONArrayBitmap);
+}
+}
+

 /**
  * qemuBuildMasterKeyCommandLine:
@@ -238,7 +263,7 @@ qemuBuildMasterKeyCommandLine(virCommandPtr cmd,
  NULL) < 0)
 return -1;

-if (virQEMUBuildObjectCommandlineFromJSON(, props) < 0)
+if (qemuBuildObjectCommandlineFromJSON(, props, priv->qemuCaps) < 0)
 return -1;

 virCommandAddArg(cmd, "-object");
@@ -714,6 +739,7 @@ qemuBuildSecretInfoProps(qemuDomainSecretInfoPtr secinfo,
  * qemuBuildObjectSecretCommandLine:
  * @cmd: the command to modify
  * @secinfo: pointer to the secret info object
+ * @qemuCaps: qemu capabilities
  *
  * If the secinfo is available and associated with an AES secret,
  * then format the command line for the secret object. This object
@@ -724,7 +750,8 @@ qemuBuildSecretInfoProps(qemuDomainSecretInfoPtr secinfo,
  */
 static int
 qemuBuildObjectSecretCommandLine(virCommandPtr cmd,
- qemuDomainSecretInfoPtr secinfo)
+ qemuDomainSecretInfoPtr secinfo,
+ virQEMUCaps *qemuCaps)
 {
 g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
 g_autoptr(virJSONValue) props = NULL;
@@ -732,7 +759,7 @@ qemuBuildObjectSecretCommandLine(virCommandPtr cmd,
 if (qemuBuildSecretInfoProps(secinfo, ) < 0)
 return -1;

-if (virQEMUBuildObjectCommandlineFromJSON(, props) < 0)
+if (qemuBuildObjectCommandlineFromJSON(, props, qemuCaps) < 0)
 return -1;

 virCommandAddArg(cmd, "-object");
@@ -901,7 +928,7 @@ qemuBuildTLSx509CommandLine(virCommandPtr cmd,
  certEncSecretAlias, qemuCaps, ) < 0)
 return -1;

-if (virQEMUBuildObjectCommandlineFromJSON(, props) < 0)
+if (qemuBuildObjectCommandlineFromJSON(, props, qemuCaps) < 0)
 return -1;

 virCommandAddArg(cmd, "-object");
@@ -1991,14 +2018,15 @@ 
qemuBuildFloppyCommandLineControllerOptions(virCommandPtr cmd,

 static int
 qemuBuildObjectCommandline(virCommandPtr cmd,
-   virJSONValuePtr objProps)
+   virJSONValuePtr objProps,
+   virQEMUCaps *qemuCaps)
 {
 g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;

 if (!objProps)
 return 0;

-if (virQEMUBuildObjectCommandlineFromJSON(, objProps) < 0)
+if (qemuBuildObjectCommandlineFromJSON(, objProps, qemuCaps) < 0)
 return -1;

 virCommandAddArg(cmd, "-object");
@@ -2010,16 +2038,17 @@ qemuBuildObjectCommandline(virCommandPtr cmd,

 static int
 qemuBuildBlockStorageSourceAttachDataCommandline(virCommandPtr cmd,
- 

[PATCH v4 03/13] qemu: capabilities: Introduce QEMU_CAPS_OBJECT_QAPIFIED

2021-03-19 Thread Peter Krempa
Starting from qemu-6.0 the parameters of -object/object-add are formally
described by the QAPI schema. Additionally this changes the nesting of
the properties as the 'props' nested object will be flattened to the
parent.

We'll need to detect whether qemu switched to this new approach to
generate the objects with proper nesting and also allow testing.

Signed-off-by: Peter Krempa 
---
 src/qemu/qemu_capabilities.c | 1 +
 src/qemu/qemu_capabilities.h | 1 +
 2 files changed, 2 insertions(+)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 447cf77875..1ae7b2b704 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -622,6 +622,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
   /* 395 */
   "vnc-power-control",
   "audiodev",
+  "object.qapified",
 );


diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index ee321df66c..657044854a 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -602,6 +602,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for 
syntax-check */
 /* 395 */
 QEMU_CAPS_VNC_POWER_CONTROL, /* -vnc power-control option */
 QEMU_CAPS_AUDIODEV, /* -audiodev instead of QEMU_AUDIO_DRV */
+QEMU_CAPS_OBJECT_QAPIFIED, /* parameters for object-add are formally 
described */

 QEMU_CAPS_LAST /* this must always be the last item */
 } virQEMUCapsFlags;
-- 
2.29.2



[PATCH v4 09/13] qemumonitorjsontest: Remove tripwire guarding object-add QAPIfication

2021-03-19 Thread Peter Krempa
Libvirt is now prepared for QAPIfied object-add.

Signed-off-by: Peter Krempa 
---
 tests/qemumonitorjsontest.c | 14 --
 1 file changed, 14 deletions(-)

diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
index 82c74e2ef9..48b41c908a 100644
--- a/tests/qemumonitorjsontest.c
+++ b/tests/qemumonitorjsontest.c
@@ -2740,20 +2740,6 @@ testQAPISchemaObjectDeviceAdd(const void *opaque)
 return -1;
 }

-if (virQEMUQAPISchemaPathGet("object-add/arg-type", schema, ) < 0) {
-fprintf(stderr, "schema for 'objectadd' not found\n");
-return -1;
-}
-
-if (testQEMUSchemaEntryMatchTemplate(entry,
- "str:qom-type",
- "str:id",
- "any:props",
- NULL) < 0) {
-VIR_TEST_VERBOSE("object-add has unexpected members in schema");
-return -1;
-}
-
 return 0;
 }

-- 
2.29.2



[PATCH v4 12/13] qemuxml2argvtest: Pin examples of -object usage to qemu-5.2 caps

2021-03-19 Thread Peter Krempa
Add a selection of tests making exapmple use of -object prior to change
to the JSON format for -object.

Signed-off-by: Peter Krempa 
---
 ...disk-network-tlsx509-nbd.x86_64-5.2.0.args |  50 
 ...virtio-scsi-reservations.x86_64-5.2.0.args |  55 +
 .../graphics-vnc-tls-secret.x86_64-5.2.0.args |  42 +++
 ...othreads-virtio-scsi-pci.x86_64-5.2.0.args |  57 +
 .../luks-disks-source-qcow2.x86_64-5.2.0.args | 112 ++
 ...ory-hotplug-nvdimm-align.x86_64-5.2.0.args |  44 +++
 ...ory-hotplug-nvdimm-label.x86_64-5.2.0.args |  44 +++
 ...mory-hotplug-nvdimm-pmem.x86_64-5.2.0.args |  44 +++
 ...-hotplug-nvdimm-readonly.x86_64-5.2.0.args |  44 +++
 ...mory-hotplug-virtio-pmem.x86_64-5.2.0.args |  45 +++
 .../virtio-rng-builtin.x86_64-5.2.0.args  |  38 ++
 .../virtio-rng-egd-unix.x86_64-5.2.0.args |  39 ++
 tests/qemuxml2argvtest.c  |  12 ++
 13 files changed, 626 insertions(+)
 create mode 100644 
tests/qemuxml2argvdata/disk-network-tlsx509-nbd.x86_64-5.2.0.args
 create mode 100644 
tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-5.2.0.args
 create mode 100644 
tests/qemuxml2argvdata/graphics-vnc-tls-secret.x86_64-5.2.0.args
 create mode 100644 
tests/qemuxml2argvdata/iothreads-virtio-scsi-pci.x86_64-5.2.0.args
 create mode 100644 
tests/qemuxml2argvdata/luks-disks-source-qcow2.x86_64-5.2.0.args
 create mode 100644 
tests/qemuxml2argvdata/memory-hotplug-nvdimm-align.x86_64-5.2.0.args
 create mode 100644 
tests/qemuxml2argvdata/memory-hotplug-nvdimm-label.x86_64-5.2.0.args
 create mode 100644 
tests/qemuxml2argvdata/memory-hotplug-nvdimm-pmem.x86_64-5.2.0.args
 create mode 100644 
tests/qemuxml2argvdata/memory-hotplug-nvdimm-readonly.x86_64-5.2.0.args
 create mode 100644 
tests/qemuxml2argvdata/memory-hotplug-virtio-pmem.x86_64-5.2.0.args
 create mode 100644 tests/qemuxml2argvdata/virtio-rng-builtin.x86_64-5.2.0.args
 create mode 100644 tests/qemuxml2argvdata/virtio-rng-egd-unix.x86_64-5.2.0.args

diff --git a/tests/qemuxml2argvdata/disk-network-tlsx509-nbd.x86_64-5.2.0.args 
b/tests/qemuxml2argvdata/disk-network-tlsx509-nbd.x86_64-5.2.0.args
new file mode 100644
index 00..308d9a9fcf
--- /dev/null
+++ b/tests/qemuxml2argvdata/disk-network-tlsx509-nbd.x86_64-5.2.0.args
@@ -0,0 +1,50 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/tmp/lib/domain--1-QEMUGuest1 \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \
+XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \
+XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
+/usr/bin/qemu-system-x86_64 \
+-name guest=QEMUGuest1,debug-threads=on \
+-S \
+-object secret,id=masterKey0,format=raw,\
+file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
+-machine pc-i440fx-5.2,accel=tcg,usb=off,dump-guest-core=off,\
+memory-backend=pc.ram \
+-cpu qemu64 \
+-m 214 \
+-object memory-backend-ram,id=pc.ram,size=224395264 \
+-overcommit mem-lock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc \
+-no-shutdown \
+-no-acpi \
+-boot strict=on \
+-device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
+-object secret,id=objlibvirt-1-storage_tls0-secret0,\
+data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\
+keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \
+-object tls-creds-x509,id=objlibvirt-1-storage_tls0,\
+dir=/etc/pki/libvirt-nbd/dummy,,path,endpoint=client,verify-peer=on,\
+passwordid=objlibvirt-1-storage_tls0-secret0 \
+-blockdev '{"driver":"nbd","server":{"type":"inet","host":"example.com",\
+"port":"1234"},"tls-creds":"objlibvirt-1-storage_tls0",\
+"node-name":"libvirt-1-storage","cache":{"direct":true,"no-flush":false},\
+"auto-read-only":true,"discard":"unmap"}' \
+-blockdev '{"node-name":"libvirt-1-format","read-only":false,\
+"cache":{"direct":true,"no-flush":false},"driver":"raw",\
+"file":"libvirt-1-storage"}' \
+-device virtio-blk-pci,bus=pci.0,addr=0x7,drive=libvirt-1-format,\
+id=virtio-disk3,bootindex=1,write-cache=on \
+-audiodev id=audio1,driver=none \
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\
+resourcecontrol=deny \
+-msg timestamp=on
diff --git 
a/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-5.2.0.args 
b/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-5.2.0.args
new file mode 100644
index 00..e21be7eb54
--- /dev/null
+++ b/tests/qemuxml2argvdata/disk-virtio-scsi-reservations.x86_64-5.2.0.args
@@ -0,0 +1,55 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/tmp/lib/domain--1-QEMUGuest1 \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \
+XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \
+XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
+/usr/bin/qemu-system-i386 \
+-name 

[PATCH v4 08/13] tests: qemuxml2argv: Validate generation of JSON props for object-add

2021-03-19 Thread Peter Krempa
Similarly to the validation for blockdev-add and netdev_add, use the
qemuxml2argv test repository to drive validation of props for
object-add.

Signed-off-by: Peter Krempa 
---
 tests/qemuxml2argvtest.c | 18 ++
 1 file changed, 18 insertions(+)

diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 44c2a316b0..1f53d95f13 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -603,6 +603,24 @@ testCompareXMLToArgvValidateSchema(virQEMUDriverPtr drv,
 return -1;
 }

+i++;
+} else if (STREQ(args[i], "-object")) {
+
+if (*args[i + 1] != '{') {
+i++;
+continue;
+}
+
+if (!(jsonargs = virJSONValueFromString(args[i + 1])))
+return -1;
+
+if (testQEMUSchemaValidateCommand("object-add", jsonargs,
+  schema, false, false, ) < 
0) {
+VIR_TEST_VERBOSE("failed to validate -object '%s' against QAPI 
schema: %s",
+ args[i + 1], virBufferCurrentContent());
+return -1;
+}
+
 i++;
 }
 }
-- 
2.29.2



[PATCH v4 05/13] qemuMonitorCreateObjectPropsWrap: Open-code in qemuBuildMemoryBackendProps

2021-03-19 Thread Peter Krempa
There's just one caller left. Since qemuBuildMemoryBackendProps is too
complex to be modified for now, just move the adding of 'id' and 'qom'
type directly into the function.

Signed-off-by: Peter Krempa 
---
 src/qemu/qemu_command.c |  6 --
 src/qemu/qemu_monitor.c | 15 ---
 src/qemu/qemu_monitor.h |  4 
 3 files changed, 4 insertions(+), 21 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 5717f7b98d..b60f297331 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -3284,10 +3284,12 @@ qemuBuildMemoryBackendProps(virJSONValuePtr 
*backendProps,
 rc = 0;
 }

-if (!(*backendProps = qemuMonitorCreateObjectPropsWrap(backendType, alias,
-   )))
+if (virJSONValueObjectPrependString(props, "id", alias) < 0 ||
+virJSONValueObjectPrependString(props, "qom-type", backendType) < 0)
 return -1;

+*backendProps = g_steal_pointer();
+
 return rc;
 }

diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 5a5a98d3e7..d26ea94803 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3017,21 +3017,6 @@ qemuMonitorAddDeviceArgs(qemuMonitorPtr mon,
 }


-virJSONValuePtr
-qemuMonitorCreateObjectPropsWrap(const char *type,
- const char *alias,
- virJSONValuePtr *props)
-{
-
-if (virJSONValueObjectPrependString(*props, "id", alias) < 0 ||
-virJSONValueObjectPrependString(*props, "qom-type", type))
-return NULL;
-
-return g_steal_pointer(props);
-}
-
-
-
 /**
  * qemuMonitorCreateObjectProps:
  * @propsret: returns full object properties
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index c812aa9cc3..9106f966da 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -1006,10 +1006,6 @@ int qemuMonitorAddDeviceWithFd(qemuMonitorPtr mon,
 int qemuMonitorDelDevice(qemuMonitorPtr mon,
  const char *devalias);

-virJSONValuePtr qemuMonitorCreateObjectPropsWrap(const char *type,
- const char *alias,
- virJSONValuePtr *props);
-
 int qemuMonitorCreateObjectProps(virJSONValuePtr *propsret,
  const char *type,
  const char *alias,
-- 
2.29.2



[PATCH v4 01/13] qemuxml2argvdata: Remove unused output file 'disk-network-tlsx509.x86_64-latest.args'

2021-03-19 Thread Peter Krempa
Signed-off-by: Peter Krempa 
---
 .../disk-network-tlsx509.x86_64-latest.args   | 90 ---
 1 file changed, 90 deletions(-)
 delete mode 100644 
tests/qemuxml2argvdata/disk-network-tlsx509.x86_64-latest.args

diff --git a/tests/qemuxml2argvdata/disk-network-tlsx509.x86_64-latest.args 
b/tests/qemuxml2argvdata/disk-network-tlsx509.x86_64-latest.args
deleted file mode 100644
index 4ac7e270d4..00
--- a/tests/qemuxml2argvdata/disk-network-tlsx509.x86_64-latest.args
+++ /dev/null
@@ -1,90 +0,0 @@
-LC_ALL=C \
-PATH=/bin \
-HOME=/tmp/lib/domain--1-QEMUGuest1 \
-USER=test \
-LOGNAME=test \
-XDG_DATA_HOME=/tmp/lib/domain--1-QEMUGuest1/.local/share \
-XDG_CACHE_HOME=/tmp/lib/domain--1-QEMUGuest1/.cache \
-XDG_CONFIG_HOME=/tmp/lib/domain--1-QEMUGuest1/.config \
-QEMU_AUDIO_DRV=none \
-/usr/bin/qemu-system-x86_64 \
--name guest=QEMUGuest1,debug-threads=on \
--S \
--object secret,id=masterKey0,format=raw,\
-file=/tmp/lib/domain--1-QEMUGuest1/master-key.aes \
--machine pc,accel=tcg,usb=off,dump-guest-core=off \
--cpu qemu64 \
--m 214 \
--overcommit mem-lock=off \
--smp 1,sockets=1,cores=1,threads=1 \
--uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
--display none \
--no-user-config \
--nodefaults \
--chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
--mon chardev=charmonitor,id=monitor,mode=control \
--rtc base=utc \
--no-shutdown \
--no-acpi \
--boot strict=on \
--device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 \
--object secret,id=objlibvirt-4-storage_tls0-secret0,\
-data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\
-keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \
--object tls-creds-x509,id=objlibvirt-4-storage_tls0,\
-dir=/etc/pki/libvirt-vxhs/dummy,,path,endpoint=client,verify-peer=on,\
-passwordid=objlibvirt-4-storage_tls0-secret0 \
--blockdev '{"driver":"vxhs","tls-creds":"objlibvirt-4-storage_tls0",\
-"vdisk-id":"eb90327c-8302-4725-9e1b-4e85ed4dc251",\
-"server":{"host":"192.168.0.1","port":""},"node-name":"libvirt-4-storage",\
-"cache":{"direct":true,"no-flush":false},"auto-read-only":true,\
-"discard":"unmap"}' \
--blockdev '{"node-name":"libvirt-4-format","read-only":false,\
-"cache":{"direct":true,"no-flush":false},"driver":"raw",\
-"file":"libvirt-4-storage"}' \
--device virtio-blk-pci,bus=pci.0,addr=0x4,drive=libvirt-4-format,\
-id=virtio-disk0,bootindex=1,write-cache=on,\
-serial=eb90327c-8302-4725-9e1b-4e85ed4dc251 \
--object secret,id=objlibvirt-3-storage_tls0-secret0,\
-data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\
-keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \
--object tls-creds-x509,id=objlibvirt-3-storage_tls0,\
-dir=/etc/pki/libvirt-vxhs/dummy,,path,endpoint=client,verify-peer=on,\
-passwordid=objlibvirt-3-storage_tls0-secret0 \
--blockdev '{"driver":"vxhs","tls-creds":"objlibvirt-3-storage_tls0",\
-"vdisk-id":"eb90327c-8302-4725-9e1b-4e85ed4dc252",\
-"server":{"host":"192.168.0.2","port":""},"node-name":"libvirt-3-storage",\
-"cache":{"direct":true,"no-flush":false},"auto-read-only":true,\
-"discard":"unmap"}' \
--blockdev '{"node-name":"libvirt-3-format","read-only":false,\
-"cache":{"direct":true,"no-flush":false},"driver":"raw",\
-"file":"libvirt-3-storage"}' \
--device virtio-blk-pci,bus=pci.0,addr=0x5,drive=libvirt-3-format,\
-id=virtio-disk1,write-cache=on,serial=eb90327c-8302-4725-9e1b-4e85ed4dc252 \
--blockdev '{"driver":"vxhs","vdisk-id":"eb90327c-8302-4725-9e1b-4e85ed4dc253",\
-"server":{"host":"192.168.0.3","port":""},"node-name":"libvirt-2-storage",\
-"cache":{"direct":true,"no-flush":false},"auto-read-only":true,\
-"discard":"unmap"}' \
--blockdev '{"node-name":"libvirt-2-format","read-only":false,\
-"cache":{"direct":true,"no-flush":false},"driver":"raw",\
-"file":"libvirt-2-storage"}' \
--device virtio-blk-pci,bus=pci.0,addr=0x6,drive=libvirt-2-format,\
-id=virtio-disk2,write-cache=on,serial=eb90327c-8302-4725-9e1b-4e85ed4dc252 \
--object secret,id=objlibvirt-1-storage_tls0-secret0,\
-data=9eao5F8qtkGt+seB1HYivWIxbtwUu6MQtg1zpj/oDtUsPr1q8wBYM91uEHCn6j/1,\
-keyid=masterKey0,iv=AAECAwQFBgcICQoLDA0ODw==,format=base64 \
--object tls-creds-x509,id=objlibvirt-1-storage_tls0,\
-dir=/etc/pki/libvirt-nbd/dummy,,path,endpoint=client,verify-peer=on,\
-passwordid=objlibvirt-1-storage_tls0-secret0 \
--blockdev '{"driver":"nbd","server":{"type":"inet","host":"example.com",\
-"port":"1234"},"tls-creds":"objlibvirt-1-storage_tls0",\
-"node-name":"libvirt-1-storage","cache":{"direct":true,"no-flush":false},\
-"auto-read-only":true,"discard":"unmap"}' \
--blockdev '{"node-name":"libvirt-1-format","read-only":false,\
-"cache":{"direct":true,"no-flush":false},"driver":"raw",\
-"file":"libvirt-1-storage"}' \
--device virtio-blk-pci,bus=pci.0,addr=0x7,drive=libvirt-1-format,\
-id=virtio-disk3,write-cache=on \
--sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,\
-resourcecontrol=deny \
--msg timestamp=on
-- 
2.29.2



[PATCH v4 06/13] qemu: monitor: Don't add 'props' wrapper if qemu has QEMU_CAPS_OBJECT_QAPIFIED

2021-03-19 Thread Peter Krempa
Set 'objectAddNoWrap' when the capability is present.

Signed-off-by: Peter Krempa 
---
 src/qemu/qemu_monitor.c | 5 +
 1 file changed, 5 insertions(+)

diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index d26ea94803..6b32c4cfe3 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -32,6 +32,7 @@
 #include "qemu_monitor_json.h"
 #include "qemu_domain.h"
 #include "qemu_process.h"
+#include "qemu_capabilities.h"
 #include "virerror.h"
 #include "viralloc.h"
 #include "virlog.h"
@@ -672,6 +673,7 @@ qemuMonitorOpenInternal(virDomainObjPtr vm,
 qemuMonitorCallbacksPtr cb,
 void *opaque)
 {
+qemuDomainObjPrivatePtr priv = vm->privateData;
 qemuMonitorPtr mon;
 g_autoptr(GError) gerr = NULL;

@@ -704,6 +706,9 @@ qemuMonitorOpenInternal(virDomainObjPtr vm,
 mon->cb = cb;
 mon->callbackOpaque = opaque;

+if (priv)
+mon->objectAddNoWrap = virQEMUCapsGet(priv->qemuCaps, 
QEMU_CAPS_OBJECT_QAPIFIED);
+
 if (virSetCloseExec(mon->fd) < 0) {
 virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("Unable to set monitor close-on-exec flag"));
-- 
2.29.2



[PATCH v4 04/13] qemu: monitor: Make wrapping of 'props' of 'object-add' optional

2021-03-19 Thread Peter Krempa
Construct the JSON object which is used for object-add without the
'props' wrapper and add the wrapper only in the monitor code.

This simplifies the JSON->commandline generator in the first place and
also prepares for upcoming qemu where 'props' will be removed.

Signed-off-by: Peter Krempa 
---
 src/qemu/qemu_monitor.c | 68 +
 src/util/virqemu.c  | 34 ++---
 2 files changed, 58 insertions(+), 44 deletions(-)

diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index c43c6f180e..5a5a98d3e7 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -109,6 +109,9 @@ struct _qemuMonitor {
 qemuMonitorReportDomainLogError logFunc;
 void *logOpaque;
 virFreeCallback logDestroy;
+
+/* true if qemu no longer wants 'props' sub-object of object-add */
+bool objectAddNoWrap;
 };

 /**
@@ -3019,14 +3022,12 @@ qemuMonitorCreateObjectPropsWrap(const char *type,
  const char *alias,
  virJSONValuePtr *props)
 {
-virJSONValuePtr ret;

-ignore_value(virJSONValueObjectCreate(,
-  "s:qom-type", type,
-  "s:id", alias,
-  "A:props", props,
-  NULL));
-return ret;
+if (virJSONValueObjectPrependString(*props, "id", alias) < 0 ||
+virJSONValueObjectPrependString(*props, "qom-type", type))
+return NULL;
+
+return g_steal_pointer(props);
 }


@@ -3046,26 +3047,28 @@ qemuMonitorCreateObjectProps(virJSONValuePtr *propsret,
  const char *alias,
  ...)
 {
-virJSONValuePtr props = NULL;
-int ret = -1;
+g_autoptr(virJSONValue) props = NULL;
+int rc;
 va_list args;

-*propsret = NULL;
+if (virJSONValueObjectCreate(,
+ "s:qom-type", type,
+ "s:id", alias,
+ NULL) < 0)
+return -1;
+

 va_start(args, alias);

-if (virJSONValueObjectCreateVArgs(, args) < 0)
-goto cleanup;
+rc = virJSONValueObjectAddVArgs(props, args);

-if (!(*propsret = qemuMonitorCreateObjectPropsWrap(type, alias, )))
-goto cleanup;
+va_end(args);

-ret = 0;
+if (rc < 0)
+return -1;

- cleanup:
-virJSONValueFree(props);
-va_end(args);
-return ret;
+*propsret = g_steal_pointer();
+return 0;
 }


@@ -3085,6 +3088,7 @@ qemuMonitorAddObject(qemuMonitorPtr mon,
  virJSONValuePtr *props,
  char **alias)
 {
+g_autoptr(virJSONValue) pr = NULL;
 const char *type = NULL;
 const char *id = NULL;
 g_autofree char *aliasCopy = NULL;
@@ -3112,7 +3116,31 @@ qemuMonitorAddObject(qemuMonitorPtr mon,
 if (alias)
 aliasCopy = g_strdup(id);

-if (qemuMonitorJSONAddObject(mon, props) < 0)
+if (mon->objectAddNoWrap) {
+pr = g_steal_pointer(props);
+} else {
+/* we need to create a wrapper which has the 'qom-type' and 'id' and
+ * store everything else under a 'props' sub-object */
+g_autoptr(virJSONValue) typeobj = NULL;
+g_autoptr(virJSONValue) idobj = NULL;
+
+ignore_value(virJSONValueObjectRemoveKey(*props, "qom-type", 
));
+ignore_value(virJSONValueObjectRemoveKey(*props, "id", ));
+
+if (!virJSONValueObjectGetKey(*props, 0)) {
+virJSONValueFree(*props);
+*props = NULL;
+}
+
+if (virJSONValueObjectCreate(,
+ "s:qom-type", type,
+ "s:id", id,
+ "A:props", props,
+ NULL) < 0)
+return -1;
+}
+
+if (qemuMonitorJSONAddObject(mon, ) < 0)
 return -1;

 if (alias)
diff --git a/src/util/virqemu.c b/src/util/virqemu.c
index 57ee42dd16..a206da1852 100644
--- a/src/util/virqemu.c
+++ b/src/util/virqemu.c
@@ -303,12 +303,13 @@ virQEMUBuildNetdevCommandlineFromJSON(virJSONValuePtr 
props,
 }


-static int
-virQEMUBuildObjectCommandlineFromJSONInternal(virBufferPtr buf,
-  const char *type,
-  const char *alias,
-  virJSONValuePtr props)
+int
+virQEMUBuildObjectCommandlineFromJSON(virBufferPtr buf,
+  virJSONValuePtr objprops)
 {
+const char *type = virJSONValueObjectGetString(objprops, "qom-type");
+const char *alias = virJSONValueObjectGetString(objprops, "id");
+
 if (!type || !alias) {
 virReportError(VIR_ERR_INTERNAL_ERROR,
_("missing 'type'(%s) or 'alias'(%s) field of QOM 
'object'"),
@@ -316,31 +317,16 @@ 

[PATCH v4 00/13] qemu: Prepare for -object QAPIfication

2021-03-19 Thread Peter Krempa
The qemu changes are merged upstream now, so this series is now required
to ensure qemu compatibility with 'object_add' (support for 'props'
sub-object is now dropped from qemu, but libvirt would still use it) and
also to allow further updates of capability test data, as the build
would fail now because of the tripwire which was added to prevent not
noticing that -object was qapified.

Peter Krempa (13):
  qemuxml2argvdata: Remove unused output file
'disk-network-tlsx509.x86_64-latest.args'
  virQEMUQAPISchemaTraverse: Fix quoting in comment
  qemu: capabilities: Introduce QEMU_CAPS_OBJECT_QAPIFIED
  qemu: monitor: Make wrapping of 'props' of 'object-add' optional
  qemuMonitorCreateObjectPropsWrap: Open-code in
qemuBuildMemoryBackendProps
  qemu: monitor: Don't add 'props' wrapper if qemu has
QEMU_CAPS_OBJECT_QAPIFIED
  qemu: command: Use JSON for QAPIfied -object directly
  tests: qemuxml2argv: Validate generation of JSON props for object-add
  qemumonitorjsontest: Remove tripwire guarding object-add QAPIfication
  tests: qemucapabilities: Update qemu caps for object-add qapification
  qemuxml2argvtest: Add DO_CAPS_LATEST variant of 'numatune-memnode'
  qemuxml2argvtest: Pin examples of -object usage to qemu-5.2 caps
  qemu: capabilities: Enable detection of QEMU_CAPS_OBJECT_QAPIFIED

 src/libvirt_private.syms  |1 -
 src/qemu/qemu_capabilities.c  |2 +
 src/qemu/qemu_capabilities.h  |1 +
 src/qemu/qemu_command.c   |   98 +-
 src/qemu/qemu_monitor.c   |   78 +-
 src/qemu/qemu_monitor.h   |4 -
 src/qemu/qemu_qapi.c  |2 +-
 src/util/virqemu.c|   38 -
 src/util/virqemu.h|3 -
 .../domaincapsdata/qemu_6.0.0-q35.x86_64.xml  |1 +
 .../domaincapsdata/qemu_6.0.0-tcg.x86_64.xml  |1 +
 tests/domaincapsdata/qemu_6.0.0.x86_64.xml|1 +
 .../caps_6.0.0.x86_64.replies | 5103 +++--
 .../caps_6.0.0.x86_64.xml |   86 +-
 tests/qemumonitorjsontest.c   |   14 -
 .../audio-alsa-best.x86_64-latest.args|6 +-
 .../audio-alsa-full.x86_64-latest.args|6 +-
 .../audio-alsa-minimal.x86_64-latest.args |6 +-
 .../audio-coreaudio-best.x86_64-latest.args   |6 +-
 .../audio-coreaudio-full.x86_64-latest.args   |6 +-
 ...audio-coreaudio-minimal.x86_64-latest.args |6 +-
 ...udio-default-nographics.x86_64-latest.args |6 +-
 .../audio-default-sdl.x86_64-latest.args  |6 +-
 .../audio-default-spice.x86_64-latest.args|6 +-
 .../audio-default-vnc.x86_64-latest.args  |6 +-
 .../audio-file-best.x86_64-latest.args|6 +-
 .../audio-file-full.x86_64-latest.args|6 +-
 .../audio-file-minimal.x86_64-latest.args |6 +-
 .../audio-jack-full.x86_64-latest.args|6 +-
 .../audio-jack-minimal.x86_64-latest.args |6 +-
 .../audio-many-backends.x86_64-latest.args|6 +-
 .../audio-none-best.x86_64-latest.args|6 +-
 .../audio-none-full.x86_64-latest.args|6 +-
 .../audio-none-minimal.x86_64-latest.args |6 +-
 .../audio-oss-best.x86_64-latest.args |6 +-
 .../audio-oss-full.x86_64-latest.args |6 +-
 .../audio-oss-minimal.x86_64-latest.args  |6 +-
 .../audio-pulseaudio-best.x86_64-latest.args  |6 +-
 .../audio-pulseaudio-full.x86_64-latest.args  |6 +-
 ...udio-pulseaudio-minimal.x86_64-latest.args |6 +-
 .../audio-sdl-best.x86_64-latest.args |6 +-
 .../audio-sdl-full.x86_64-latest.args |6 +-
 .../audio-sdl-minimal.x86_64-latest.args  |6 +-
 .../audio-spice-best.x86_64-latest.args   |6 +-
 .../audio-spice-full.x86_64-latest.args   |6 +-
 .../audio-spice-minimal.x86_64-latest.args|6 +-
 .../blkdeviotune-group-num.x86_64-latest.args |6 +-
 ...blkdeviotune-max-length.x86_64-latest.args |6 +-
 .../blkdeviotune-max.x86_64-latest.args   |6 +-
 .../channel-unix-guestfwd.x86_64-latest.args  |6 +-
 .../console-virtio-unix.x86_64-latest.args|6 +-
 .../controller-virtio-scsi.x86_64-latest.args |6 +-
 ...-Icelake-Server-pconfig.x86_64-latest.args |6 +-
 .../cpu-translation.x86_64-latest.args|6 +-
 .../cpu-tsc-high-frequency.x86_64-latest.args |6 +-
 .../cputune-cpuset-big-id.x86_64-latest.args  |6 +-
 .../disk-aio-io_uring.x86_64-latest.args  |6 +-
 .../disk-aio.x86_64-latest.args   |6 +-
 ...-backing-chains-noindex.x86_64-latest.args |   12 +-
 .../disk-cache.x86_64-latest.args |6 +-
 .../disk-cdrom-bus-other.x86_64-latest.args   |6 +-
 ...m-empty-network-invalid.x86_64-latest.args |6 +-
 .../disk-cdrom-network.x86_64-latest.args |6 +-
 .../disk-cdrom-tray.x86_64-latest.args|6 +-
 

Re: [libvirt PATCH v2 09/51] conf: Use virTristateXXX in virDomainMemballoonDef

2021-03-19 Thread Peter Krempa
On Fri, Mar 19, 2021 at 15:16:49 +0100, Tim Wiederhake wrote:
> On Fri, 2021-03-19 at 15:00 +0100, Peter Krempa wrote:
> > On Fri, Mar 19, 2021 at 14:40:23 +0100, Tim Wiederhake wrote:
> > > Signed-off-by: Tim Wiederhake 
> > > ---
> > >  src/conf/domain_conf.h | 4 ++--
> > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> > > index 09b697432d..2d342effb1 100644
> > > --- a/src/conf/domain_conf.h
> > > +++ b/src/conf/domain_conf.h
> > > @@ -1921,8 +1921,8 @@ struct _virDomainMemballoonDef {
> > >  int model;
> > >  virDomainDeviceInfo info;
> > >  int period; /* seconds between collections */
> > > -int autodeflate; /* enum virTristateSwitch */
> > > -int free_page_reporting; /* enum virTristateSwitch */
> > > +virTristateSwitch autodeflate;
> > > +virTristateSwitch free_page_reporting;
> > 
> > Sorry to jump in in the middle of the series without the intention to
> > continue review, but this is wong, when coupled with the code
> > assigning
> > to the enum value directly from virTristateSwitchTypeFromString:
> > 
> > Such as:
> > 
> > (def->autodeflate = virTristateSwitchTypeFromString(deflate)) <= 0)
> > 
> > virTristateSwitch is an enum value, thus treated as an unsigned
> > value,
> > while here you compare it with a signed value.
> > 
> > Comparing it with a negative value doesn't work.
> > 
> > Here the compiler doesn't moan as it's a <= 0 check, but if you
> > change
> > it to < you get a compiler warning that the statement is a
> > contradiction:
> > 
> > ../../../libvirt/src/conf/domain_conf.c:14520:71: error: result of
> > comparison of unsigned enum expression < 0 is always false [-Werror,-
> > Wtautological-unsigned-enum-zero-compare]
> > (def->autodeflate = virTristateSwitchTypeFromString(deflate))
> > < 0) {
> > ~
> > ^ ~
> > 
> > 
> > As of such, return value of virTristateSwitchTypeFromString must
> > never
> > be directly assigned to a variable of virTristateSwitch type.
> > 
> 
> Ah, thanks, I thought I caught all of those (see e.g. 
> https://listman.redhat.com/archives/libvir-list/2021-March/msg01006.html
> ).
> 
> Will double check, and to your all delight, resend the entire series.

Well, in that case you must reorder the series first or squash
appropriate commits , because here at 9/51 in this series this is
introducing a bug, which only gets fixed later in

[libvirt PATCH v2 36/51] domain_conf: Use virXMLPropTristateXXX
in virDomainMemballoonDefParseXML



Re: [libvirt PATCH v2 09/51] conf: Use virTristateXXX in virDomainMemballoonDef

2021-03-19 Thread Tim Wiederhake
On Fri, 2021-03-19 at 15:00 +0100, Peter Krempa wrote:
> On Fri, Mar 19, 2021 at 14:40:23 +0100, Tim Wiederhake wrote:
> > Signed-off-by: Tim Wiederhake 
> > ---
> >  src/conf/domain_conf.h | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> > index 09b697432d..2d342effb1 100644
> > --- a/src/conf/domain_conf.h
> > +++ b/src/conf/domain_conf.h
> > @@ -1921,8 +1921,8 @@ struct _virDomainMemballoonDef {
> >  int model;
> >  virDomainDeviceInfo info;
> >  int period; /* seconds between collections */
> > -int autodeflate; /* enum virTristateSwitch */
> > -int free_page_reporting; /* enum virTristateSwitch */
> > +virTristateSwitch autodeflate;
> > +virTristateSwitch free_page_reporting;
> 
> Sorry to jump in in the middle of the series without the intention to
> continue review, but this is wong, when coupled with the code
> assigning
> to the enum value directly from virTristateSwitchTypeFromString:
> 
> Such as:
> 
> (def->autodeflate = virTristateSwitchTypeFromString(deflate)) <= 0)
> 
> virTristateSwitch is an enum value, thus treated as an unsigned
> value,
> while here you compare it with a signed value.
> 
> Comparing it with a negative value doesn't work.
> 
> Here the compiler doesn't moan as it's a <= 0 check, but if you
> change
> it to < you get a compiler warning that the statement is a
> contradiction:
> 
> ../../../libvirt/src/conf/domain_conf.c:14520:71: error: result of
> comparison of unsigned enum expression < 0 is always false [-Werror,-
> Wtautological-unsigned-enum-zero-compare]
> (def->autodeflate = virTristateSwitchTypeFromString(deflate))
> < 0) {
> ~
> ^ ~
> 
> 
> As of such, return value of virTristateSwitchTypeFromString must
> never
> be directly assigned to a variable of virTristateSwitch type.
> 

Ah, thanks, I thought I caught all of those (see e.g. 
https://listman.redhat.com/archives/libvir-list/2021-March/msg01006.html
).

Will double check, and to your all delight, resend the entire series.

Cheers,
Tim



Re: [libvirt PATCH v2 09/51] conf: Use virTristateXXX in virDomainMemballoonDef

2021-03-19 Thread Peter Krempa
On Fri, Mar 19, 2021 at 14:40:23 +0100, Tim Wiederhake wrote:
> Signed-off-by: Tim Wiederhake 
> ---
>  src/conf/domain_conf.h | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 09b697432d..2d342effb1 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1921,8 +1921,8 @@ struct _virDomainMemballoonDef {
>  int model;
>  virDomainDeviceInfo info;
>  int period; /* seconds between collections */
> -int autodeflate; /* enum virTristateSwitch */
> -int free_page_reporting; /* enum virTristateSwitch */
> +virTristateSwitch autodeflate;
> +virTristateSwitch free_page_reporting;

Sorry to jump in in the middle of the series without the intention to
continue review, but this is wong, when coupled with the code assigning
to the enum value directly from virTristateSwitchTypeFromString:

Such as:

(def->autodeflate = virTristateSwitchTypeFromString(deflate)) <= 0)

virTristateSwitch is an enum value, thus treated as an unsigned value,
while here you compare it with a signed value.

Comparing it with a negative value doesn't work.

Here the compiler doesn't moan as it's a <= 0 check, but if you change
it to < you get a compiler warning that the statement is a
contradiction:

../../../libvirt/src/conf/domain_conf.c:14520:71: error: result of comparison 
of unsigned enum expression < 0 is always false 
[-Werror,-Wtautological-unsigned-enum-zero-compare]
(def->autodeflate = virTristateSwitchTypeFromString(deflate)) < 0) {
~ ^ ~


As of such, return value of virTristateSwitchTypeFromString must never
be directly assigned to a variable of virTristateSwitch type.



[libvirt PATCH v2 19/51] domain_conf: Use virXMLPropTristateXXX in virDomainDeviceInfoParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 17 +
 1 file changed, 5 insertions(+), 12 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c8411bdf40..91dc00edad 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -6620,8 +6620,6 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr xmlopt,
 xmlNodePtr boot = NULL;
 xmlNodePtr rom = NULL;
 int ret = -1;
-g_autofree char *romenabled = NULL;
-g_autofree char *rombar = NULL;
 g_autofree char *aliasStr = NULL;
 VIR_XPATH_NODE_AUTORESTORE(ctxt)
 
@@ -6649,18 +6647,13 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr 
xmlopt,
 
 if ((flags & VIR_DOMAIN_DEF_PARSE_ALLOW_ROM) &&
 (rom = virXPathNode("./rom", ctxt))) {
-if ((romenabled = virXPathString("string(./rom/@enabled)", ctxt)) &&
-((info->romenabled = virTristateBoolTypeFromString(romenabled)) <= 
0)) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown rom enabled value '%s'"), romenabled);
+
+if (virXMLPropTristateBool(rom, "enabled", false, >romenabled) < 
0)
 goto cleanup;
-}
-if ((rombar = virXPathString("string(./rom/@bar)", ctxt)) &&
-((info->rombar = virTristateSwitchTypeFromString(rombar)) <= 0)) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown rom bar value '%s'"), rombar);
+
+if (virXMLPropTristateSwitch(rom, "bar", false, >rombar) < 0)
 goto cleanup;
-}
+
 info->romfile = virXMLPropString(rom, "file");
 
 if (info->romenabled == VIR_TRISTATE_BOOL_NO &&
-- 
2.26.2



[libvirt PATCH v2 46/51] backup_conf: Use virXMLPropTristateXXX in virDomainBackupDefParse

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/backup_conf.c | 16 ++--
 1 file changed, 2 insertions(+), 14 deletions(-)

diff --git a/src/conf/backup_conf.c b/src/conf/backup_conf.c
index ce85ed8bad..d3ea9ce4a3 100644
--- a/src/conf/backup_conf.c
+++ b/src/conf/backup_conf.c
@@ -234,8 +234,6 @@ virDomainBackupDefParse(xmlXPathContextPtr ctxt,
 def->incremental = virXPathString("string(./incremental)", ctxt);
 
 if ((node = virXPathNode("./server", ctxt))) {
-g_autofree char *tls = NULL;
-
 if (def->type != VIR_DOMAIN_BACKUP_TYPE_PULL) {
 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("use of  requires pull mode backup"));
@@ -261,18 +259,8 @@ virDomainBackupDefParse(xmlXPathContextPtr ctxt,
 return NULL;
 }
 
-if ((tls = virXMLPropString(node, "tls"))) {
-int tmp;
-
-if ((tmp = virTristateBoolTypeFromString(tls)) <= 0) {
-virReportError(VIR_ERR_XML_ERROR,
-   _("unknown value '%s' of 'tls' attribute"),\
-   tls);
-return NULL;
-}
-
-def->tls = tmp;
-}
+if (virXMLPropTristateBool(node, "tls", false, >tls) < 0)
+return NULL;
 }
 
 if ((n = virXPathNodeSet("./disks/*", ctxt, )) < 0)
-- 
2.26.2



[libvirt PATCH v2 50/51] storage_adapter_conf: Use virXMLPropTristateXXX in virStorageAdapterParseXMLFCHost

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/storage_adapter_conf.c | 16 ++--
 1 file changed, 2 insertions(+), 14 deletions(-)

diff --git a/src/conf/storage_adapter_conf.c b/src/conf/storage_adapter_conf.c
index 69062b4b58..a19920c8b2 100644
--- a/src/conf/storage_adapter_conf.c
+++ b/src/conf/storage_adapter_conf.c
@@ -64,28 +64,16 @@ static int
 virStorageAdapterParseXMLFCHost(xmlNodePtr node,
 virStorageAdapterFCHostPtr fchost)
 {
-char *managed = NULL;
+if (virXMLPropTristateBool(node, "managed", false, >managed) < 0)
+return -1;
 
 fchost->parent = virXMLPropString(node, "parent");
-if ((managed = virXMLPropString(node, "managed"))) {
-int value;
-if ((value = virTristateBoolTypeFromString(managed)) < 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown fc_host managed setting '%s'"),
-   managed);
-VIR_FREE(managed);
-return -1;
-}
-fchost->managed = value;
-}
-
 fchost->parent_wwnn = virXMLPropString(node, "parent_wwnn");
 fchost->parent_wwpn = virXMLPropString(node, "parent_wwpn");
 fchost->parent_fabric_wwn = virXMLPropString(node, "parent_fabric_wwn");
 fchost->wwpn = virXMLPropString(node, "wwpn");
 fchost->wwnn = virXMLPropString(node, "wwnn");
 
-VIR_FREE(managed);
 return 0;
 }
 
-- 
2.26.2



[libvirt PATCH v2 22/51] domain_conf: Use virXMLPropTristateXXX in virDomainDiskDefDriverParseXML

2021-03-19 Thread Tim Wiederhake
Signed-off-by: Tim Wiederhake 
---
 src/conf/domain_conf.c | 21 +++--
 1 file changed, 3 insertions(+), 18 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 39b1e237f5..ef7eed5682 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -9133,29 +9133,14 @@ virDomainDiskDefDriverParseXML(virDomainDiskDefPtr def,
 }
 VIR_FREE(tmp);
 
-if ((tmp = virXMLPropString(cur, "ioeventfd")) &&
-(def->ioeventfd = virTristateSwitchTypeFromString(tmp)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown disk ioeventfd mode '%s'"), tmp);
+if (virXMLPropTristateSwitch(cur, "ioeventfd", false, >ioeventfd) < 0)
 return -1;
-}
-VIR_FREE(tmp);
 
-if ((tmp = virXMLPropString(cur, "event_idx")) &&
-(def->event_idx = virTristateSwitchTypeFromString(tmp)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown disk event_idx mode '%s'"), tmp);
+if (virXMLPropTristateSwitch(cur, "event_idx", false, >event_idx) < 0)
 return -1;
-}
-VIR_FREE(tmp);
 
-if ((tmp = virXMLPropString(cur, "copy_on_read")) &&
-(def->copy_on_read = virTristateSwitchTypeFromString(tmp)) <= 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-   _("unknown disk copy_on_read mode '%s'"), tmp);
+if (virXMLPropTristateSwitch(cur, "copy_on_read", false, 
>copy_on_read) < 0)
 return -1;
-}
-VIR_FREE(tmp);
 
 if ((tmp = virXMLPropString(cur, "discard")) &&
 (def->discard = virDomainDiskDiscardTypeFromString(tmp)) <= 0) {
-- 
2.26.2



  1   2   >