[PATCH v4 4/4] tests: update LXC config dataset to support V3 indexes

2020-02-02 Thread Julio Faracco
LXC version 3 config files are still using network old style definition.
So, as LXC supports it now, they can be converted to use this new
definition.

Signed-off-by: Julio Faracco 
---
 .../lxcconf2xml-ethernet-v3.config| 16 -
 .../lxcconf2xml-fstab-v3.config   | 10 +++---
 .../lxcconf2xml-macvlannetwork-v3.config  | 10 +++---
 .../lxcconf2xml-miscnetwork-v3.config | 34 +--
 .../lxcconf2xml-nonenetwork-v3.config |  2 +-
 .../lxcconf2xml-physnetwork-v3.config | 14 
 .../lxcconf2xml-simple-v3.config  | 18 +-
 .../lxcconf2xml-vlannetwork-v3.config | 10 +++---
 8 files changed, 57 insertions(+), 57 deletions(-)

diff --git a/tests/lxcconf2xmldata/lxcconf2xml-ethernet-v3.config 
b/tests/lxcconf2xmldata/lxcconf2xml-ethernet-v3.config
index 630cb2ebb6..0a641549f3 100644
--- a/tests/lxcconf2xmldata/lxcconf2xml-ethernet-v3.config
+++ b/tests/lxcconf2xmldata/lxcconf2xml-ethernet-v3.config
@@ -1,14 +1,14 @@
 # Template used to create this container: opensuse
 # Template script checksum (SHA-1): 27307e0a95bd81b2c0bd82d6f87fdbe83be075ef
 
-lxc.network.type = veth
-lxc.network.flags = up
-lxc.network.hwaddr = 02:00:15:8f:05:c1
-lxc.network.name = eth0
-lxc.network.ipv4 = 192.168.122.2/24
-lxc.network.ipv4.gateway = 192.168.122.1
-lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64
-lxc.network.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595
+lxc.net.0.type = veth
+lxc.net.0.flags = up
+lxc.net.0.hwaddr = 02:00:15:8f:05:c1
+lxc.net.0.name = eth0
+lxc.net.0.ipv4 = 192.168.122.2/24
+lxc.net.0.ipv4.gateway = 192.168.122.1
+lxc.net.0.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64
+lxc.net.0.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595
 
 #remove next line if host DNS configuration should not be available to 
container
 lxc.mount.entry = proc proc proc nodev,noexec,nosuid 0 0
diff --git a/tests/lxcconf2xmldata/lxcconf2xml-fstab-v3.config 
b/tests/lxcconf2xmldata/lxcconf2xml-fstab-v3.config
index 8b62818657..79bcfa1bd1 100644
--- a/tests/lxcconf2xmldata/lxcconf2xml-fstab-v3.config
+++ b/tests/lxcconf2xmldata/lxcconf2xml-fstab-v3.config
@@ -1,11 +1,11 @@
 # Template used to create this container: opensuse
 # Template script checksum (SHA-1): 27307e0a95bd81b2c0bd82d6f87fdbe83be075ef
 
-lxc.network.type = veth
-lxc.network.flags = up
-lxc.network.link = virbr0
-lxc.network.hwaddr = 02:00:15:8f:05:c1
-lxc.network.name = eth0
+lxc.net.0.type = veth
+lxc.net.0.flags = up
+lxc.net.0.link = virbr0
+lxc.net.0.hwaddr = 02:00:15:8f:05:c1
+lxc.net.0.name = eth0
 
 #remove next line if host DNS configuration should not be available to 
container
 lxc.mount.fstab = /var/lib/lxc/migrate_test/fstab
diff --git a/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork-v3.config 
b/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork-v3.config
index 631f07ecca..ab8d85361f 100644
--- a/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork-v3.config
+++ b/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork-v3.config
@@ -1,11 +1,11 @@
 # Template used to create this container: opensuse
 # Template script checksum (SHA-1): 27307e0a95bd81b2c0bd82d6f87fdbe83be075ef
 
-lxc.network.type = macvlan
-lxc.network.flags = up
-lxc.network.link = eth0
-lxc.network.hwaddr = 02:00:15:8f:05:c1
-lxc.network.macvlan.mode = vepa
+lxc.net.0.type = macvlan
+lxc.net.0.flags = up
+lxc.net.0.link = eth0
+lxc.net.0.hwaddr = 02:00:15:8f:05:c1
+lxc.net.0.macvlan.mode = vepa
 
 #remove next line if host DNS configuration should not be available to 
container
 lxc.rootfs.path = /var/lib/lxc/migrate_test/rootfs
diff --git a/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork-v3.config 
b/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork-v3.config
index b46cb3ee7d..537da64592 100644
--- a/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork-v3.config
+++ b/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork-v3.config
@@ -1,22 +1,22 @@
-lxc.network.type = phys
-lxc.network.link = eth0
-lxc.network.name = eth1
-lxc.network.ipv4 = 192.168.122.2/24
-lxc.network.ipv4.gateway = 192.168.122.1
-lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64
-lxc.network.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595
+lxc.net.0.type = phys
+lxc.net.0.link = eth0
+lxc.net.0.name = eth1
+lxc.net.0.ipv4 = 192.168.122.2/24
+lxc.net.0.ipv4.gateway = 192.168.122.1
+lxc.net.0.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64
+lxc.net.0.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595
 
-lxc.network.type = vlan
-lxc.network.flags = up
-lxc.network.link = eth0
-lxc.network.hwaddr = 02:00:15:8f:05:c1
-lxc.network.vlan.id = 2
+lxc.net.1.type = vlan
+lxc.net.1.flags = up
+lxc.net.1.link = eth0
+lxc.net.1.hwaddr = 02:00:15:8f:05:c1
+lxc.net.1.vlan.id = 2
 
-lxc.network.type = macvlan
-lxc.network.flags = up
-lxc.network.link = eth0
-lxc.network.hwaddr = 02:00:15:8f:05:c1
-lxc.network.macvlan.mode = vepa
+lxc.net.2.type = macvlan
+lxc.net.2.flags = up
+lxc.net.2.link = eth0
+lxc.net.2.hwaddr = 02:00:15:8f:05:c1
+lxc.net.2.macvlan.mode = vepa
 
 

[PATCH v4 3/4] lxc: remove domain definition from lxc network struct

2020-02-02 Thread Julio Faracco
Domain definition is useless now inside network structure. This pointer
was required because new network definition was being added each time
that a new network type appeared. So, this should be processed into
old function `lxcNetworkParseDataType()`. Now, as it was moved to an
array, it can be handle together each interface pointer.

Signed-off-by: Julio Faracco 
---
 src/lxc/lxc_native.c | 17 +
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
index 8bbe205659..99539a0205 100644
--- a/src/lxc/lxc_native.c
+++ b/src/lxc/lxc_native.c
@@ -414,7 +414,6 @@ lxcCreateHostdevDef(int mode, int type, const char *data)
 typedef struct _lxcNetworkParseData lxcNetworkParseData;
 typedef lxcNetworkParseData *lxcNetworkParseDataPtr;
 struct _lxcNetworkParseData {
-virDomainDefPtr def;
 char *type;
 char *link;
 char *mac;
@@ -470,13 +469,16 @@ lxcAddNetworkRouteDefinition(const char *address,
 }
 
 static int
-lxcAddNetworkDefinition(lxcNetworkParseData *data)
+lxcAddNetworkDefinition(virDomainDefPtr def, lxcNetworkParseData *data)
 {
 virDomainNetDefPtr net = NULL;
 virDomainHostdevDefPtr hostdev = NULL;
 bool isPhys, isVlan = false;
 size_t i;
 
+if (!data)
+return -1;
+
 if ((data->type == NULL) || STREQ(data->type, "empty") ||
  STREQ(data->type, "") ||  STREQ(data->type, "none"))
 return 0;
@@ -518,9 +520,9 @@ lxcAddNetworkDefinition(lxcNetworkParseData *data)
  
>source.caps.u.net.ip.nroutes) < 0)
 goto error;
 
-if (VIR_EXPAND_N(data->def->hostdevs, data->def->nhostdevs, 1) < 0)
+if (VIR_EXPAND_N(def->hostdevs, def->nhostdevs, 1) < 0)
 goto error;
-data->def->hostdevs[data->def->nhostdevs - 1] = hostdev;
+def->hostdevs[def->nhostdevs - 1] = hostdev;
 } else {
 if (!(net = lxcCreateNetDef(data->type, data->link, data->mac,
 data->flag, data->macvlanmode,
@@ -542,9 +544,9 @@ lxcAddNetworkDefinition(lxcNetworkParseData *data)
  >guestIP.nroutes) < 0)
 goto error;
 
-if (VIR_EXPAND_N(data->def->nets, data->def->nnets, 1) < 0)
+if (VIR_EXPAND_N(def->nets, def->nnets, 1) < 0)
 goto error;
-data->def->nets[data->def->nnets - 1] = net;
+def->nets[def->nnets - 1] = net;
 }
 
 return 1;
@@ -766,9 +768,8 @@ lxcConvertNetworkSettings(virDomainDefPtr def, virConfPtr 
properties)
 
 for (i = 0; i < networks.ndata; i++) {
 lxcNetworkParseDataPtr data = networks.parseData[i];
-data->def = def;
 
-status = lxcAddNetworkDefinition(data);
+status = lxcAddNetworkDefinition(def, data);
 
 if (status < 0)
 goto error;
-- 
2.20.1




[PATCH v4 2/4] lxc: add LXC version 3 network parser

2020-02-02 Thread Julio Faracco
LXC version 3 or higher introduced indexes for network interfaces.
Libvirt should be able to parse entries like `lxc.net.2.KEY`. This
commit adds functions to parse this type of field. That's why array
structures are so important this time.

Signed-off-by: Julio Faracco 
---
 src/lxc/lxc_native.c | 51 
 1 file changed, 51 insertions(+)

diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
index 31aa666e38..8bbe205659 100644
--- a/src/lxc/lxc_native.c
+++ b/src/lxc/lxc_native.c
@@ -649,6 +649,55 @@ lxcNetworkParseDataSuffix(const char *entry,
 }
 
 
+static lxcNetworkParseDataPtr
+lxcNetworkGetParseDataByIndex(lxcNetworkParseDataArray *networks,
+  unsigned int index)
+{
+size_t ndata = networks->ndata;
+size_t i;
+
+for (i = 0; i < ndata; i++) {
+if (networks->parseData[i]->index == index)
+return networks->parseData[i];
+}
+
+/* Index was not found. So, it is time to add new *
+ * interface and return this last position.   */
+if (VIR_EXPAND_N(networks->parseData, networks->ndata, 1) < 0)
+return NULL;
+
+networks->parseData[ndata] = g_new0(lxcNetworkParseData, 1);
+networks->parseData[ndata]->index = index;
+
+return networks->parseData[ndata];
+}
+
+
+static int
+lxcNetworkParseDataEntry(const char *name,
+ virConfValuePtr value,
+ lxcNetworkParseDataArray *networks)
+{
+lxcNetworkParseData *parseData;
+const char *suffix_tmp = STRSKIP(name, "lxc.net.");
+char *suffix = NULL;
+unsigned long long index;
+
+if (virStrToLong_ull(suffix_tmp, , 10, ) < 0)
+return -1;
+
+if (suffix[0] != '.')
+return -1;
+
+suffix++;
+
+if (!(parseData = lxcNetworkGetParseDataByIndex(networks, index)))
+return -1;
+
+return lxcNetworkParseDataSuffix(suffix, value, parseData);
+}
+
+
 static lxcNetworkParseDataPtr
 lxcNetworkGetParseDataByIndexLegacy(lxcNetworkParseDataArray *networks,
 const char *entry)
@@ -695,6 +744,8 @@ lxcNetworkWalkCallback(const char *name, virConfValuePtr 
value, void *data)
 
 if (STRPREFIX(name, "lxc.network."))
 return lxcNetworkParseDataEntryLegacy(name, value, networks);
+if (STRPREFIX(name, "lxc.net."))
+return lxcNetworkParseDataEntry(name, value, networks);
 
 return 0;
 }
-- 
2.20.1




[PATCH v4 0/4] This series implement support for network syntax settings for LXC 3.X.

2020-02-02 Thread Julio Faracco
Old:
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = virbr0

New:
lxc.net.0.type = veth
lxc.net.0.flags = up
lxc.net.0.link = virbr0

v1-v2: Moving sscanf to virStrToLong_ull according Daniel's suggestion.
v2-v3: Adding missing g_autofree from `suffix` variable.
v2-v4: Removing g_autofree inserted above and adding some missing free
functions. See Daniel's test results/comments.

Julio Faracco (4):
  lxc: refactor lxcNetworkParseData pointers to use new structures
  lxc: add LXC version 3 network parser
  lxc: remove domain definition from lxc network struct
  tests: update LXC config dataset to support V3 indexes

 src/lxc/lxc_native.c  | 200 --
 .../lxcconf2xml-ethernet-v3.config|  16 +-
 .../lxcconf2xml-fstab-v3.config   |  10 +-
 .../lxcconf2xml-macvlannetwork-v3.config  |  10 +-
 .../lxcconf2xml-miscnetwork-v3.config |  34 +--
 .../lxcconf2xml-nonenetwork-v3.config |   2 +-
 .../lxcconf2xml-physnetwork-v3.config |  14 +-
 .../lxcconf2xml-simple-v3.config  |  18 +-
 .../lxcconf2xml-vlannetwork-v3.config |  10 +-
 9 files changed, 190 insertions(+), 124 deletions(-)

-- 
2.20.1




[PATCH v4 1/4] lxc: refactor lxcNetworkParseData pointers to use new structures

2020-02-02 Thread Julio Faracco
Struct lxcNetworkParseData is being used as a single pointer which
iterates through LXC config lines. It means that it will be applied as a
network each time that a new type appears. After, the same struct is
used to populate a new network interface. This commit changes this logic
to multiple lxcNetworkParseData to move this strcuture to an array. It
makes more sense if we are using indexes to fill interface settings.
This is better to improve code clarity.

This commit still introduces *Legacy() functions to keep support of
network old style definitions.

Signed-off-by: Julio Faracco 
---
 src/lxc/lxc_native.c | 140 ---
 1 file changed, 77 insertions(+), 63 deletions(-)

diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
index dd2345c324..31aa666e38 100644
--- a/src/lxc/lxc_native.c
+++ b/src/lxc/lxc_native.c
@@ -411,7 +411,9 @@ lxcCreateHostdevDef(int mode, int type, const char *data)
 return hostdev;
 }
 
-typedef struct {
+typedef struct _lxcNetworkParseData lxcNetworkParseData;
+typedef lxcNetworkParseData *lxcNetworkParseDataPtr;
+struct _lxcNetworkParseData {
 virDomainDefPtr def;
 char *type;
 char *link;
@@ -424,9 +426,14 @@ typedef struct {
 size_t nips;
 char *gateway_ipv4;
 char *gateway_ipv6;
-bool privnet;
-size_t networks;
-} lxcNetworkParseData;
+size_t index;
+};
+
+typedef struct {
+size_t ndata;
+lxcNetworkParseDataPtr *parseData;
+} lxcNetworkParseDataArray;
+
 
 static int
 lxcAddNetworkRouteDefinition(const char *address,
@@ -552,39 +559,6 @@ lxcAddNetworkDefinition(lxcNetworkParseData *data)
 }
 
 
-static int
-lxcNetworkParseDataType(virConfValuePtr value,
-lxcNetworkParseData *parseData)
-{
-virDomainDefPtr def = parseData->def;
-size_t networks = parseData->networks;
-bool privnet = parseData->privnet;
-int status;
-
-/* Store the previous NIC */
-status = lxcAddNetworkDefinition(parseData);
-
-if (status < 0)
-return -1;
-else if (status > 0)
-networks++;
-else if (parseData->type != NULL && STREQ(parseData->type, "none"))
-privnet = false;
-
-/* clean NIC to store a new one */
-memset(parseData, 0, sizeof(*parseData));
-
-parseData->def = def;
-parseData->networks = networks;
-parseData->privnet = privnet;
-
-/* Keep the new value */
-parseData->type = value->str;
-
-return 0;
-}
-
-
 static int
 lxcNetworkParseDataIPs(const char *name,
virConfValuePtr value,
@@ -633,8 +607,7 @@ lxcNetworkParseDataSuffix(const char *entry,
 
 switch (elem) {
 case VIR_LXC_NETWORK_CONFIG_TYPE:
-if (lxcNetworkParseDataType(value, parseData) < 0)
-return -1;
+parseData->type = value->str;
 break;
 case VIR_LXC_NETWORK_CONFIG_LINK:
 parseData->link = value->str;
@@ -676,12 +649,40 @@ lxcNetworkParseDataSuffix(const char *entry,
 }
 
 
+static lxcNetworkParseDataPtr
+lxcNetworkGetParseDataByIndexLegacy(lxcNetworkParseDataArray *networks,
+const char *entry)
+{
+int elem = virLXCNetworkConfigEntryTypeFromString(entry);
+size_t ndata = networks->ndata;
+
+if (elem == VIR_LXC_NETWORK_CONFIG_TYPE) {
+/* Index was not found. So, it is time to add new *
+ * interface and return this last position.   */
+if (VIR_EXPAND_N(networks->parseData, networks->ndata, 1) < 0)
+return NULL;
+
+networks->parseData[ndata] = g_new0(lxcNetworkParseData, 1);
+networks->parseData[ndata]->index = networks->ndata;
+
+return networks->parseData[ndata];
+}
+
+/* Return last element added like a stack. */
+return networks->parseData[ndata - 1];
+}
+
+
 static int
-lxcNetworkParseDataEntry(const char *name,
- virConfValuePtr value,
- lxcNetworkParseData *parseData)
+lxcNetworkParseDataEntryLegacy(const char *name,
+   virConfValuePtr value,
+   lxcNetworkParseDataArray *networks)
 {
 const char *suffix = STRSKIP(name, "lxc.network.");
+lxcNetworkParseData *parseData;
+
+if (!(parseData = lxcNetworkGetParseDataByIndexLegacy(networks, suffix)))
+return -1;
 
 return lxcNetworkParseDataSuffix(suffix, value, parseData);
 }
@@ -690,10 +691,10 @@ lxcNetworkParseDataEntry(const char *name,
 static int
 lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data)
 {
-lxcNetworkParseData *parseData = data;
+lxcNetworkParseDataArray *networks = data;
 
 if (STRPREFIX(name, "lxc.network."))
-return lxcNetworkParseDataEntry(name, value, parseData);
+return lxcNetworkParseDataEntryLegacy(name, value, networks);
 
 return 0;
 }
@@ -702,36 +703,49 @@ static int
 lxcConvertNetworkSettings(virDomainDefPtr def, virConfPtr properties)
 {
 int status;
-size_t i;

Re: [PATCH 0/5] Add support for SPAPR vTPM for pSeries VM

2020-02-02 Thread Marc-André Lureau
On Fri, Jan 31, 2020 at 10:17 PM Stefan Berger  wrote:
>
> QEMU 5.0 will have SPAPR vTPM support. This series of patches
> adds support for the XML and command line creation of the
> SPAPR vTPM for pSeries VMs along with test cases.
>
> Regards,
>Stefan
>
> Stefan Berger (5):
>   conf: Add support for tpm-spapr to domain XML
>   qemu: Extend QEMU capabilities with 'tpm-spapr'
>   qemu: Extend QEMU with tpm-spapr support
>   tests: Extend ppc64 capabilities data with TPM related XML and
> responses
>   tests: Add test for domain XML with tpm-spapr TPM device model
>
>  docs/formatdomain.html.in | 4 +-
>  docs/schemas/domaincommon.rng | 4 +
>  src/conf/domain_conf.c|24 +-
>  src/conf/domain_conf.h| 1 +
>  src/qemu/qemu_capabilities.c  | 6 +
>  src/qemu/qemu_capabilities.h  | 1 +
>  src/qemu/qemu_command.c   |15 +-
>  src/qemu/qemu_domain.c| 8 +-
>  src/qemu/qemu_domain_address.c|10 +
>  tests/domaincapsdata/qemu_5.0.0.ppc64.xml |   115 +
>  .../caps_5.0.0.ppc64.replies  | 24695 
>  .../qemucapabilitiesdata/caps_5.0.0.ppc64.xml |  1128 +
>  .../tpm-emulator-spapr.ppc64-latest.args  |45 +
>  tests/qemuxml2argvdata/tpm-emulator-spapr.xml |60 +
>  tests/qemuxml2argvtest.c  | 4 +
>  15 files changed, 26105 insertions(+), 15 deletions(-)
>  create mode 100644 tests/domaincapsdata/qemu_5.0.0.ppc64.xml
>  create mode 100644 tests/qemucapabilitiesdata/caps_5.0.0.ppc64.replies
>  create mode 100644 tests/qemucapabilitiesdata/caps_5.0.0.ppc64.xml
>  create mode 100644 
> tests/qemuxml2argvdata/tpm-emulator-spapr.ppc64-latest.args
>  create mode 100644 tests/qemuxml2argvdata/tpm-emulator-spapr.xml
>

Series:
Reviewed-by: Marc-André Lureau 


> --
> 2.17.1
>




[libvirt PATCH 2/4] qemu: tpm: use g_autofree

2020-02-02 Thread Ján Tomko
Mark eligible declarations as g_autofree and remove
the corresponding VIR_FREE calls.

Signed-off-by: Ján Tomko 
---
 src/qemu/qemu_tpm.c | 30 ++
 1 file changed, 10 insertions(+), 20 deletions(-)

diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c
index 385f4c74f7..cfe7eb1846 100644
--- a/src/qemu/qemu_tpm.c
+++ b/src/qemu/qemu_tpm.c
@@ -126,7 +126,7 @@ qemuTPMCreateEmulatorStorage(const char *storagepath,
  gid_t swtpm_group)
 {
 int ret = -1;
-char *swtpmStorageDir = g_path_get_dirname(storagepath);
+g_autofree char *swtpmStorageDir = g_path_get_dirname(storagepath);
 
 if (qemuTPMEmulatorInitStorage(swtpmStorageDir) < 0)
 goto cleanup;
@@ -150,8 +150,6 @@ qemuTPMCreateEmulatorStorage(const char *storagepath,
 ret = 0;
 
  cleanup:
-VIR_FREE(swtpmStorageDir);
-
 return ret;
 }
 
@@ -220,14 +218,12 @@ qemuTPMEmulatorCreatePidFilename(const char 
*swtpmStateDir,
  const char *shortName)
 {
 char *pidfile = NULL;
-char *devicename = NULL;
+g_autofree char *devicename = NULL;
 
 devicename = g_strdup_printf("%s-swtpm", shortName);
 
 pidfile = virPidFileBuildPath(swtpmStateDir, devicename);
 
-VIR_FREE(devicename);
-
 return pidfile;
 }
 
@@ -433,7 +429,7 @@ qemuTPMEmulatorRunSetup(const char *storagepath,
 int exitstatus;
 int ret = -1;
 char uuid[VIR_UUID_STRING_BUFLEN];
-char *vmid = NULL;
+g_autofree char *vmid = NULL;
 g_autofree char *swtpm_setup = virTPMGetSwtpmSetup();
 VIR_AUTOCLOSE pwdfile_fd = -1;
 
@@ -516,7 +512,6 @@ qemuTPMEmulatorRunSetup(const char *storagepath,
 ret = 0;
 
  cleanup:
-VIR_FREE(vmid);
 virCommandFree(cmd);
 
 return ret;
@@ -554,7 +549,7 @@ qemuTPMEmulatorBuildCommand(virDomainTPMDefPtr tpm,
 {
 virCommandPtr cmd = NULL;
 bool created = false;
-char *pidfile;
+g_autofree char *pidfile = NULL;
 g_autofree char *swtpm = virTPMGetSwtpm();
 VIR_AUTOCLOSE pwdfile_fd = -1;
 VIR_AUTOCLOSE migpwdfile_fd = -1;
@@ -615,7 +610,6 @@ qemuTPMEmulatorBuildCommand(virDomainTPMDefPtr tpm,
 
 virCommandAddArg(cmd, "--pid");
 virCommandAddArgFormat(cmd, "file=%s", pidfile);
-VIR_FREE(pidfile);
 
 if (tpm->data.emulator.hassecretuuid) {
 if (!virTPMSwtpmCapsGet(VIR_TPM_SWTPM_FEATURE_CMDARG_PWD_FD)) {
@@ -669,8 +663,8 @@ qemuTPMEmulatorStop(const char *swtpmStateDir,
 const char *shortName)
 {
 virCommandPtr cmd;
-char *pathname;
-char *errbuf = NULL;
+g_autofree char *pathname = NULL;
+g_autofree char *errbuf = NULL;
 g_autofree char *swtpm_ioctl = virTPMGetSwtpmIoctl();
 
 if (!swtpm_ioctl)
@@ -701,8 +695,7 @@ qemuTPMEmulatorStop(const char *swtpmStateDir,
 unlink(pathname);
 
  cleanup:
-VIR_FREE(pathname);
-VIR_FREE(errbuf);
+return;
 }
 
 
@@ -735,7 +728,7 @@ qemuExtTPMPrepareHost(virQEMUDriverPtr driver,
 {
 virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
 int ret = 0;
-char *shortName = NULL;
+g_autofree char *shortName = NULL;
 
 switch (def->tpm->type) {
 case VIR_DOMAIN_TPM_TYPE_EMULATOR:
@@ -755,7 +748,6 @@ qemuExtTPMPrepareHost(virQEMUDriverPtr driver,
 }
 
  cleanup:
-VIR_FREE(shortName);
 virObjectUnref(cfg);
 
 return ret;
@@ -885,7 +877,7 @@ qemuExtTPMStop(virQEMUDriverPtr driver,
virDomainObjPtr vm)
 {
 virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
-char *shortName = NULL;
+g_autofree char *shortName = NULL;
 
 switch (vm->def->tpm->type) {
 case VIR_DOMAIN_TPM_TYPE_EMULATOR:
@@ -902,7 +894,6 @@ qemuExtTPMStop(virQEMUDriverPtr driver,
 }
 
  cleanup:
-VIR_FREE(shortName);
 virObjectUnref(cfg);
 }
 
@@ -913,7 +904,7 @@ qemuExtTPMSetupCgroup(virQEMUDriverPtr driver,
   virCgroupPtr cgroup)
 {
 virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
-char *shortName = NULL;
+g_autofree char *shortName = NULL;
 int ret = -1, rc;
 pid_t pid;
 
@@ -939,7 +930,6 @@ qemuExtTPMSetupCgroup(virQEMUDriverPtr driver,
 ret = 0;
 
  cleanup:
-VIR_FREE(shortName);
 virObjectUnref(cfg);
 
 return ret;
-- 
2.19.2



[libvirt PATCH 3/4] qemu: tpm: use g_autoptr where applicable

2020-02-02 Thread Ján Tomko
This requires stealing one cmd pointer before returning it.

Signed-off-by: Ján Tomko 
---
 src/qemu/qemu_tpm.c | 26 --
 1 file changed, 8 insertions(+), 18 deletions(-)

diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c
index cfe7eb1846..f9cea2ffde 100644
--- a/src/qemu/qemu_tpm.c
+++ b/src/qemu/qemu_tpm.c
@@ -425,7 +425,7 @@ qemuTPMEmulatorRunSetup(const char *storagepath,
 const unsigned char *secretuuid,
 bool incomingMigration)
 {
-virCommandPtr cmd = NULL;
+g_autoptr(virCommand) cmd = NULL;
 int exitstatus;
 int ret = -1;
 char uuid[VIR_UUID_STRING_BUFLEN];
@@ -512,8 +512,6 @@ qemuTPMEmulatorRunSetup(const char *storagepath,
 ret = 0;
 
  cleanup:
-virCommandFree(cmd);
-
 return ret;
 }
 
@@ -547,7 +545,7 @@ qemuTPMEmulatorBuildCommand(virDomainTPMDefPtr tpm,
 const char *shortName,
 bool incomingMigration)
 {
-virCommandPtr cmd = NULL;
+g_autoptr(virCommand) cmd = NULL;
 bool created = false;
 g_autofree char *pidfile = NULL;
 g_autofree char *swtpm = virTPMGetSwtpm();
@@ -639,14 +637,12 @@ qemuTPMEmulatorBuildCommand(virDomainTPMDefPtr tpm,
 migpwdfile_fd = -1;
 }
 
-return cmd;
+return g_steal_pointer();
 
  error:
 if (created)
 qemuTPMDeleteEmulatorStorage(tpm);
 
-virCommandFree(cmd);
-
 return NULL;
 }
 
@@ -703,7 +699,7 @@ int
 qemuExtTPMInitPaths(virQEMUDriverPtr driver,
 virDomainDefPtr def)
 {
-virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
 int ret = 0;
 
 switch (def->tpm->type) {
@@ -716,8 +712,6 @@ qemuExtTPMInitPaths(virQEMUDriverPtr driver,
 break;
 }
 
-virObjectUnref(cfg);
-
 return ret;
 }
 
@@ -726,7 +720,7 @@ int
 qemuExtTPMPrepareHost(virQEMUDriverPtr driver,
   virDomainDefPtr def)
 {
-virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
 int ret = 0;
 g_autofree char *shortName = NULL;
 
@@ -748,8 +742,6 @@ qemuExtTPMPrepareHost(virQEMUDriverPtr driver,
 }
 
  cleanup:
-virObjectUnref(cfg);
-
 return ret;
 }
 
@@ -876,7 +868,7 @@ void
 qemuExtTPMStop(virQEMUDriverPtr driver,
virDomainObjPtr vm)
 {
-virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
 g_autofree char *shortName = NULL;
 
 switch (vm->def->tpm->type) {
@@ -894,7 +886,7 @@ qemuExtTPMStop(virQEMUDriverPtr driver,
 }
 
  cleanup:
-virObjectUnref(cfg);
+return;
 }
 
 
@@ -903,7 +895,7 @@ qemuExtTPMSetupCgroup(virQEMUDriverPtr driver,
   virDomainDefPtr def,
   virCgroupPtr cgroup)
 {
-virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
 g_autofree char *shortName = NULL;
 int ret = -1, rc;
 pid_t pid;
@@ -930,7 +922,5 @@ qemuExtTPMSetupCgroup(virQEMUDriverPtr driver,
 ret = 0;
 
  cleanup:
-virObjectUnref(cfg);
-
 return ret;
 }
-- 
2.19.2



[libvirt PATCH 4/4] qemu: tpm: remove unused labels

2020-02-02 Thread Ján Tomko
Remove all the labels that are now redundant.

Signed-off-by: Ján Tomko 
---
 src/qemu/qemu_tpm.c | 74 +
 1 file changed, 27 insertions(+), 47 deletions(-)

diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c
index f9cea2ffde..f3562d7dfe 100644
--- a/src/qemu/qemu_tpm.c
+++ b/src/qemu/qemu_tpm.c
@@ -125,11 +125,10 @@ qemuTPMCreateEmulatorStorage(const char *storagepath,
  uid_t swtpm_user,
  gid_t swtpm_group)
 {
-int ret = -1;
 g_autofree char *swtpmStorageDir = g_path_get_dirname(storagepath);
 
 if (qemuTPMEmulatorInitStorage(swtpmStorageDir) < 0)
-goto cleanup;
+return -1;
 
 *created = false;
 
@@ -141,16 +140,13 @@ qemuTPMCreateEmulatorStorage(const char *storagepath,
 virReportError(VIR_ERR_INTERNAL_ERROR,
_("Could not create directory %s as %u:%d"),
storagepath, swtpm_user, swtpm_group);
-goto cleanup;
+return -1;
 }
 
 if (virFileChownFiles(storagepath, swtpm_user, swtpm_group) < 0)
-goto cleanup;
-
-ret = 0;
+return -1;
 
- cleanup:
-return ret;
+return 0;
 }
 
 
@@ -427,7 +423,6 @@ qemuTPMEmulatorRunSetup(const char *storagepath,
 {
 g_autoptr(virCommand) cmd = NULL;
 int exitstatus;
-int ret = -1;
 char uuid[VIR_UUID_STRING_BUFLEN];
 g_autofree char *vmid = NULL;
 g_autofree char *swtpm_setup = virTPMGetSwtpmSetup();
@@ -444,7 +439,7 @@ qemuTPMEmulatorRunSetup(const char *storagepath,
 
 cmd = virCommandNew(swtpm_setup);
 if (!cmd)
-goto cleanup;
+return -1;
 
 virUUIDFormat(vmuuid, uuid);
 vmid = g_strdup_printf("%s:%s", vmname, uuid);
@@ -469,10 +464,10 @@ qemuTPMEmulatorRunSetup(const char *storagepath,
 virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
 _("%s does not support passing a passphrase using a file "
   "descriptor"), swtpm_setup);
-goto cleanup;
+return -1;
 }
 if ((pwdfile_fd = qemuTPMSetupEncryption(secretuuid, cmd)) < 0)
-goto cleanup;
+return -1;
 
 virCommandAddArg(cmd, "--pwdfile-fd");
 virCommandAddArgFormat(cmd, "%d", pwdfile_fd);
@@ -506,13 +501,10 @@ qemuTPMEmulatorRunSetup(const char *storagepath,
_("Could not run '%s'. exitstatus: %d; "
  "Check error log '%s' for details."),
   swtpm_setup, exitstatus, logfile);
-goto cleanup;
+return -1;
 }
 
-ret = 0;
-
- cleanup:
-return ret;
+return 0;
 }
 
 
@@ -673,11 +665,11 @@ qemuTPMEmulatorStop(const char *swtpmStateDir,
 return;
 
 if (!virFileExists(pathname))
-goto cleanup;
+return;
 
 cmd = virCommandNew(swtpm_ioctl);
 if (!cmd)
-goto cleanup;
+return;
 
 virCommandAddArgList(cmd, "--unix", pathname, "-s", NULL);
 
@@ -689,9 +681,6 @@ qemuTPMEmulatorStop(const char *swtpmStateDir,
 
 /* clean up the socket */
 unlink(pathname);
-
- cleanup:
-return;
 }
 
 
@@ -700,19 +689,17 @@ qemuExtTPMInitPaths(virQEMUDriverPtr driver,
 virDomainDefPtr def)
 {
 g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
-int ret = 0;
 
 switch (def->tpm->type) {
 case VIR_DOMAIN_TPM_TYPE_EMULATOR:
-ret = qemuTPMEmulatorInitPaths(def->tpm, cfg->swtpmStorageDir,
-   def->uuid);
-break;
+return qemuTPMEmulatorInitPaths(def->tpm, cfg->swtpmStorageDir,
+def->uuid);
 case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
 case VIR_DOMAIN_TPM_TYPE_LAST:
 break;
 }
 
-return ret;
+return 0;
 }
 
 
@@ -721,28 +708,25 @@ qemuExtTPMPrepareHost(virQEMUDriverPtr driver,
   virDomainDefPtr def)
 {
 g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
-int ret = 0;
 g_autofree char *shortName = NULL;
 
 switch (def->tpm->type) {
 case VIR_DOMAIN_TPM_TYPE_EMULATOR:
 shortName = virDomainDefGetShortName(def);
 if (!shortName)
-goto cleanup;
+return -1;
 
-ret = qemuTPMEmulatorPrepareHost(def->tpm, cfg->swtpmLogDir,
- def->name, cfg->swtpm_user,
- cfg->swtpm_group,
- cfg->swtpmStateDir, cfg->user,
- shortName);
-break;
+return qemuTPMEmulatorPrepareHost(def->tpm, cfg->swtpmLogDir,
+  def->name, cfg->swtpm_user,
+  cfg->swtpm_group,
+  cfg->swtpmStateDir, cfg->user,
+  shortName);
 

[libvirt PATCH 1/4] qemu: tpm: remove unused pidfile variable

2020-02-02 Thread Ján Tomko
qemuExtTPMSetupCgroup declares pidfile but never uses it.

Signed-off-by: Ján Tomko 
---
 src/qemu/qemu_tpm.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c
index 6741373583..385f4c74f7 100644
--- a/src/qemu/qemu_tpm.c
+++ b/src/qemu/qemu_tpm.c
@@ -913,7 +913,6 @@ qemuExtTPMSetupCgroup(virQEMUDriverPtr driver,
   virCgroupPtr cgroup)
 {
 virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
-char *pidfile = NULL;
 char *shortName = NULL;
 int ret = -1, rc;
 pid_t pid;
@@ -940,7 +939,6 @@ qemuExtTPMSetupCgroup(virQEMUDriverPtr driver,
 ret = 0;
 
  cleanup:
-VIR_FREE(pidfile);
 VIR_FREE(shortName);
 virObjectUnref(cfg);
 
-- 
2.19.2



[libvirt PATCH 0/4] qemu: tpm: use g_auto

2020-02-02 Thread Ján Tomko
Ján Tomko (4):
  qemu: tpm: remove unused pidfile variable
  qemu: tpm: use g_autofree
  qemu: tpm: use g_autoptr where applicable
  qemu: tpm: remove unused labels

 src/qemu/qemu_tpm.c | 130 +++-
 1 file changed, 44 insertions(+), 86 deletions(-)

-- 
2.19.2



[libvirt PATCH 3/3] virBufferTrim: do not accept len

2020-02-02 Thread Ján Tomko
Always trim the full specified suffix.

All of the callers outside of tests were passing either
strlen or the actual length of the string.

Signed-off-by: Ján Tomko 
---
 src/conf/domain_addr.c  |  2 +-
 src/conf/domain_conf.c  |  6 +++---
 src/cpu/cpu_x86.c   |  6 +++---
 src/qemu/qemu_command.c |  8 
 src/rpc/virnetsshsession.c  |  2 +-
 src/storage/storage_util.c  |  4 ++--
 src/util/virbuffer.c| 28 
 src/util/virbuffer.h|  2 +-
 src/util/virqemu.c  |  2 +-
 src/util/virresctrl.c   |  4 ++--
 tests/qemublocktest.c   |  2 +-
 tests/qemumonitorjsontest.c |  4 ++--
 tests/virbuftest.c  | 13 ++---
 tools/virsh-domain.c|  8 
 tools/vsh.c |  4 ++--
 15 files changed, 41 insertions(+), 54 deletions(-)

diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
index bde0784189..c0e468122a 100644
--- a/src/conf/domain_addr.c
+++ b/src/conf/domain_addr.c
@@ -1946,7 +1946,7 @@ virDomainUSBAddressPortFormatBuf(virBufferPtr buf,
 break;
 virBufferAsprintf(buf, "%u.", port[i]);
 }
-virBufferTrim(buf, ".", -1);
+virBufferTrim(buf, ".");
 }
 
 
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 9b60db7ecd..c95bd34fb5 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -25521,7 +25521,7 @@ virDomainVirtioNetGuestOptsFormat(char **outstr,
 virBufferAsprintf(, "ufo='%s' ",
   
virTristateSwitchTypeToString(def->driver.virtio.guest.ufo));
 }
-virBufferTrim(, " ", -1);
+virBufferTrim(, " ");
 
 *outstr = virBufferContentAndReset();
 return 0;
@@ -25561,7 +25561,7 @@ virDomainVirtioNetHostOptsFormat(char **outstr,
 virBufferAsprintf(, "mrg_rxbuf='%s' ",
   
virTristateSwitchTypeToString(def->driver.virtio.host.mrg_rxbuf));
 }
-virBufferTrim(, " ", -1);
+virBufferTrim(, " ");
 
 *outstr = virBufferContentAndReset();
 return 0;
@@ -30580,7 +30580,7 @@ 
virDomainGetBlkioParametersAssignFromDef(virDomainDefPtr def,
   def->blkio.devices[i].path, \
   def->blkio.devices[i].param); \
 } \
-virBufferTrim(, ",", -1); \
+virBufferTrim(, ","); \
 data = virBufferContentAndReset(); \
 if (virTypedParameterAssign(&(params[(*nparams)++]), name, \
 VIR_TYPED_PARAM_STRING, data) < 0) \
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
index 9b7981d574..dca9ed2979 100644
--- a/src/cpu/cpu_x86.c
+++ b/src/cpu/cpu_x86.c
@@ -1981,7 +1981,7 @@ x86FormatSignatures(virCPUx86ModelPtr model)
   (unsigned long)model->signatures[i]);
 }
 
-virBufferTrim(, ",", -1);
+virBufferTrim(, ",");
 
 return virBufferContentAndReset();
 }
@@ -3059,8 +3059,8 @@ virCPUx86UpdateLive(virCPUDefPtr cpu,
 }
 }
 
-virBufferTrim(, ",", -1);
-virBufferTrim(, ",", -1);
+virBufferTrim(, ",");
+virBufferTrim(, ",");
 
 added = virBufferContentAndReset();
 removed = virBufferContentAndReset();
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index c8195cfbb9..81f5fa3416 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -2360,7 +2360,7 @@ qemuBuildFloppyCommandLineControllerOptions(virCommandPtr 
cmd,
 
 if (explicitfdc && hasfloppy) {
 /* Newer Q35 machine types require an explicit FDC controller */
-virBufferTrim(_opts, ",", -1);
+virBufferTrim(_opts, ",");
 virCommandAddArg(cmd, "-device");
 virCommandAddArgBuffer(cmd, _opts);
 }
@@ -3979,7 +3979,7 @@ qemuBuildHostNetStr(virDomainNetDefPtr net,
 }
 
 
-virBufferTrim(, ",", -1);
+virBufferTrim(, ",");
 
 return virBufferContentAndReset();
 }
@@ -6330,7 +6330,7 @@ qemuBuildBootCommandLine(virCommandPtr cmd,
 if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BOOT_STRICT))
 virBufferAddLit(_buf, "strict=on,");
 
-virBufferTrim(_buf, ",", -1);
+virBufferTrim(_buf, ",");
 
 boot_opts_str = virBufferContentAndReset(_buf);
 if (boot_opts_str) {
@@ -7744,7 +7744,7 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr 
cfg,
  * doesn't support it, it fallbacks to previous migration algorithm 
silently. */
 virBufferAddLit(, "seamless-migration=on,");
 
-virBufferTrim(, ",", -1);
+virBufferTrim(, ",");
 
 virCommandAddArg(cmd, "-spice");
 virCommandAddArgBuffer(cmd, );
diff --git a/src/rpc/virnetsshsession.c b/src/rpc/virnetsshsession.c
index 63773ecfc2..c31d80d4eb 100644
--- a/src/rpc/virnetsshsession.c
+++ b/src/rpc/virnetsshsession.c
@@ -357,7 +357,7 @@ virNetSSHCheckHostKey(virNetSSHSessionPtr sess)
  * we have to use a *MAGIC* constant. */
 for (i = 0; i < 16; i++)
 virBufferAsprintf(, "%02hhX:", keyhash[i]);
-virBufferTrim(, 

[libvirt PATCH 2/3] Use virBufferTrimLen when applicable

2020-02-02 Thread Ján Tomko
Replace all the cases that only supply the length
and do not care about matching a suffix, as well
as that one test case that does.

Signed-off-by: Ján Tomko 
---
 src/lxc/lxc_container.c | 2 +-
 tests/virbuftest.c  | 6 +++---
 tools/vsh.c | 2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
index b44cc68e67..fcd964cd1e 100644
--- a/src/lxc/lxc_container.c
+++ b/src/lxc/lxc_container.c
@@ -215,7 +215,7 @@ static virCommandPtr 
lxcContainerBuildInitCmd(virDomainDefPtr vmDef,
 virBufferAdd(, ttyPaths[i] + 5, -1);
 virBufferAddChar(, ' ');
 }
-virBufferTrim(, NULL, 1);
+virBufferTrimLen(, 1);
 
 virUUIDFormat(vmDef->uuid, uuidstr);
 
diff --git a/tests/virbuftest.c b/tests/virbuftest.c
index 7919075000..f2d4d9b9de 100644
--- a/tests/virbuftest.c
+++ b/tests/virbuftest.c
@@ -108,9 +108,9 @@ static int testBufTrim(const void *data G_GNUC_UNUSED)
 virBufferAddLit(buf, "a;");
 virBufferTrim(buf, "", 0);
 virBufferTrim(buf, "", -1);
-virBufferTrim(buf, NULL, 1);
-virBufferTrim(buf, NULL, 5);
-virBufferTrim(buf, "a", 2);
+virBufferTrimLen(buf, 1);
+virBufferTrimLen(buf, 5);
+virBufferTrimLen(buf, 2);
 
 virBufferAddLit(buf, ",b,,");
 virBufferTrim(buf, NULL, -1);
diff --git a/tools/vsh.c b/tools/vsh.c
index 9c58e40d4f..3c3b4bf1c3 100644
--- a/tools/vsh.c
+++ b/tools/vsh.c
@@ -2525,7 +2525,7 @@ vshTreePrintInternal(vshControl *ctl,
 vshPrint(ctl, "%s\n", virBufferCurrentContent(indent));
 
 if (!root)
-virBufferTrim(indent, NULL, 2);
+virBufferTrimLen(indent, 2);
 
 return 0;
 }
-- 
2.19.2



[libvirt PATCH 1/3] util: introduce virBufferTrimLen

2020-02-02 Thread Ján Tomko
Just like the existing virBufferTrim, but only
does one thing at a time.

Signed-off-by: Ján Tomko 
---
 src/libvirt_private.syms |  1 +
 src/util/virbuffer.c | 19 +++
 src/util/virbuffer.h |  1 +
 3 files changed, 21 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index ebf830791e..7dfb2458eb 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1646,6 +1646,7 @@ virBufferStrcat;
 virBufferStrcatVArgs;
 virBufferTrim;
 virBufferTrimChars;
+virBufferTrimLen;
 virBufferURIEncodeString;
 virBufferUse;
 virBufferVasprintf;
diff --git a/src/util/virbuffer.c b/src/util/virbuffer.c
index 914c386b18..b76d99b56f 100644
--- a/src/util/virbuffer.c
+++ b/src/util/virbuffer.c
@@ -700,6 +700,25 @@ virBufferTrimChars(virBufferPtr buf, const char *trim)
 g_string_truncate(buf->str, i + 1);
 }
 
+/**
+ * virBufferTrimLen:
+ * @buf: the buffer to trim
+ * @len: the number of bytes to trim
+ *
+ * Trim the tail of a buffer.
+ */
+void
+virBufferTrimLen(virBufferPtr buf, int len)
+{
+if (!buf || !buf->str)
+return;
+
+if (len > buf->str->len)
+return;
+
+g_string_truncate(buf->str, buf->str->len - len);
+}
+
 /**
  * virBufferAddStr:
  * @buf: the buffer to append to
diff --git a/src/util/virbuffer.h b/src/util/virbuffer.h
index 183f78f279..7b068075b2 100644
--- a/src/util/virbuffer.h
+++ b/src/util/virbuffer.h
@@ -93,4 +93,5 @@ size_t virBufferGetEffectiveIndent(const virBuffer *buf);
 
 void virBufferTrim(virBufferPtr buf, const char *trim, int len);
 void virBufferTrimChars(virBufferPtr buf, const char *trim);
+void virBufferTrimLen(virBufferPtr buf, int len);
 void virBufferAddStr(virBufferPtr buf, const char *str);
-- 
2.19.2



[libvirt PATCH 0/3] Clean up usage of virBufferTrim

2020-02-02 Thread Ján Tomko
Before it was possible to supply a matching suffix, a length of chars
to trim, or both.

However the combination of the two was only used in tests.
Split the function into two.

Ján Tomko (3):
  util: introduce virBufferTrimLen
  Use virBufferTrimLen when applicable
  virBufferTrim: do not accept len

 src/conf/domain_addr.c  |  2 +-
 src/conf/domain_conf.c  |  6 ++---
 src/cpu/cpu_x86.c   |  6 ++---
 src/libvirt_private.syms|  1 +
 src/lxc/lxc_container.c |  2 +-
 src/qemu/qemu_command.c |  8 +++
 src/rpc/virnetsshsession.c  |  2 +-
 src/storage/storage_util.c  |  4 ++--
 src/util/virbuffer.c| 47 +
 src/util/virbuffer.h|  3 ++-
 src/util/virqemu.c  |  2 +-
 src/util/virresctrl.c   |  4 ++--
 tests/qemublocktest.c   |  2 +-
 tests/qemumonitorjsontest.c |  4 ++--
 tests/virbuftest.c  | 19 +++
 tools/virsh-domain.c|  8 +++
 tools/vsh.c |  6 ++---
 17 files changed, 67 insertions(+), 59 deletions(-)

-- 
2.19.2



Re: [PATCH 2/7] tests: Drop viratomictest

2020-02-02 Thread Ján Tomko

On Sat, Feb 01, 2020 at 07:33:44AM +0100, Michal Privoznik wrote:

In future commits our virAtomic* APIs will be replaced with their
GLib variants. Instead of trying to update the test after each
commit and eventually removing the test anyway, remove it upfront
and save the hassle.



Alternatively, you could have just removed their usage, not the APIs
themselves.


Signed-off-by: Michal Privoznik 
---
tests/Makefile.am |   5 --
tests/viratomictest.c | 175 --
2 files changed, 180 deletions(-)
delete mode 100644 tests/viratomictest.c



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 7/7] Drop virAtomic module

2020-02-02 Thread Ján Tomko

On Sat, Feb 01, 2020 at 07:33:49AM +0100, Michal Privoznik wrote:

Now, that every use of virAtomic was replaced with its g_atomic


s/,//


equivalent, let's remove the module.

Signed-off-by: Michal Privoznik 
---
configure.ac  |  1 -
m4/virt-atomic.m4 | 77 --
src/Makefile.am   |  6 ---
src/libvirt_atomic.syms   | 11 
src/libxl/libxl_domain.c  |  1 -
src/libxl/libxl_driver.c  |  1 -
src/lxc/lxc_process.c |  1 -
src/nwfilter/nwfilter_dhcpsnoop.c |  1 -
src/qemu/qemu_conf.c  |  1 -
src/qemu/qemu_domain.c|  1 -
src/qemu/qemu_process.c   |  1 -
src/test/test_driver.c|  1 -
src/util/Makefile.inc.am  |  2 -
src/util/viratomic.c  | 35 
src/util/viratomic.h  | 90 ---
src/util/virobject.c  |  1 -
src/util/virprocess.c |  1 -
src/util/virsystemd.c |  1 -
18 files changed, 233 deletions(-)
delete mode 100644 m4/virt-atomic.m4
delete mode 100644 src/libvirt_atomic.syms
delete mode 100644 src/util/viratomic.c
delete mode 100644 src/util/viratomic.h



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 6/7] src: Drop virAtomicIntDecAndTest() with g_atomic_int_dec_and_test()

2020-02-02 Thread Ján Tomko

On Sat, Feb 01, 2020 at 07:33:48AM +0100, Michal Privoznik wrote:

Signed-off-by: Michal Privoznik 
---
src/libxl/libxl_domain.c  |  2 +-
src/lxc/lxc_process.c |  2 +-
src/nwfilter/nwfilter_dhcpsnoop.c |  8 
src/qemu/qemu_process.c   |  2 +-
src/util/viratomic.h  | 11 ---
src/util/virobject.c  |  2 +-
6 files changed, 8 insertions(+), 19 deletions(-)

@@ -868,7 +868,7 @@ virNWFilterSnoopReqLeaseDel(virNWFilterSnoopReqPtr req,
 skip_instantiate:
VIR_FREE(ipl);

-ignore_value(virAtomicIntDecAndTest());
+ignore_value(!!g_atomic_int_dec_and_test());

 lease_not_found:
VIR_FREE(ipstr);
@@ -1142,7 +1142,7 @@ static void virNWFilterDHCPDecodeWorker(void *jobdata, 
void *opaque)
   _("Instantiation of rules failed on "
 "interface '%s'"), req->binding->portdevname);
}
-ignore_value(virAtomicIntDecAndTest(job->qCtr));
+ignore_value(!!g_atomic_int_dec_and_test(job->qCtr));
VIR_FREE(job);
}

@@ -1543,7 +1543,7 @@ virNWFilterDHCPSnoopThread(void *req0)
pcap_close(pcapConf[i].handle);
}

-ignore_value(virAtomicIntDecAndTest());
+ignore_value(!!g_atomic_int_dec_and_test());

return;
}


Here you can drop the ignore_value as well as the !! double inversion.

Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 5/7] src: Replace virAtomicIntInc() with g_atomic_int_add()

2020-02-02 Thread Ján Tomko

On Sat, Feb 01, 2020 at 07:33:47AM +0100, Michal Privoznik wrote:

Signed-off-by: Michal Privoznik 
---
src/libxl/libxl_domain.c  |  2 +-
src/libxl/libxl_driver.c  |  2 +-
src/lxc/lxc_process.c |  4 ++--
src/nwfilter/nwfilter_dhcpsnoop.c | 10 +-
src/qemu/qemu_process.c   |  4 ++--
src/test/test_driver.c|  2 +-
src/util/viratomic.h  | 11 ---
src/util/virobject.c  |  4 ++--
src/util/virprocess.c |  2 +-
9 files changed, 15 insertions(+), 26 deletions(-)




diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 4e159157d7..ba157c0686 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -695,7 +695,7 @@ testDomainStartState(testDriverPtr privconn,
int ret = -1;

virDomainObjSetState(dom, VIR_DOMAIN_RUNNING, reason);
-dom->def->id = virAtomicIntInc(>nextDomID);
+dom->def->id = g_atomic_int_add(>nextDomID, 1);

if (virDomainObjSetDefTransient(privconn->xmlopt,
dom, NULL) < 0) {


This belongs in patch 1/7

To the rest:
Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 4/7] src: Replace virAtomicIntSet() with g_atomic_int_set()

2020-02-02 Thread Ján Tomko

On Sat, Feb 01, 2020 at 07:33:46AM +0100, Michal Privoznik wrote:

Signed-off-by: Michal Privoznik 
---
src/nwfilter/nwfilter_dhcpsnoop.c |  2 +-
src/test/test_driver.c|  4 ++--
src/util/viratomic.h  |  9 -
src/util/virobject.c  |  2 +-
src/util/virsystemd.c | 10 +-
5 files changed, 9 insertions(+), 18 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 3/7] src: Replace virAtomicIntGet() with g_atomic_int_get()

2020-02-02 Thread Ján Tomko

On Sat, Feb 01, 2020 at 07:33:45AM +0100, Michal Privoznik wrote:

Signed-off-by: Michal Privoznik 
---
src/nwfilter/nwfilter_dhcpsnoop.c | 12 ++--
src/util/viratomic.h  |  9 -
src/util/virsystemd.c |  6 +++---
3 files changed, 9 insertions(+), 18 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 1/7] test_driver: Replace virAtomicIntAdd() with virAtomicIntInc()

2020-02-02 Thread Ján Tomko

On Sat, Feb 01, 2020 at 07:33:43AM +0100, Michal Privoznik wrote:

Instead of calling virAtomicIntAdd(, 1); we can call
virAtomicIntInc() directly.

Signed-off-by: Michal Privoznik 
---
src/test/test_driver.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 47c1fc588f..6f617592f3 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -695,7 +695,7 @@ testDomainStartState(testDriverPtr privconn,
int ret = -1;

virDomainObjSetState(dom, VIR_DOMAIN_RUNNING, reason);
-dom->def->id = virAtomicIntAdd(>nextDomID, 1);
+dom->def->id = virAtomicIntInc(>nextDomID);


g_atomic_int_add(>nextDomID, 1);

I don't see the value of changing it to a function that is being phased
out.

With that fixed:
Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [PATCH 1/5] conf: Add support for tpm-spapr to domain XML

2020-02-02 Thread Ján Tomko

On Fri, Jan 31, 2020 at 04:17:39PM -0500, Stefan Berger wrote:

From: Stefan Berger 

This patch adds support for the tpm-spapr device model for ppc64. The XML for
this type of TPM looks as follows:


  


Extend the documentation.

Signed-off-by: Stefan Berger 
---
docs/formatdomain.html.in |  4 +++-
docs/schemas/domaincommon.rng |  4 
src/conf/domain_conf.c| 24 +---
src/conf/domain_conf.h|  1 +
src/qemu/qemu_domain.c|  6 --
5 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 60a103d7c6..5a9835fbfe 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -8508,7 +8508,9 @@ qemu-kvm -net nic,model=? /dev/null

  The model attribute specifies what device
  model QEMU provides to the guest. If no model name is provided,
-  tpm-tis will automatically be chosen.
+  tpm-tis will automatically be chosen for non-ppc64
+  architectures. For ppc64/pseries guests, tpm-spapr


Since 6.1.0, ...


+  is the default.
  Since 4.4.0, another available choice
  is the tpm-crb, which should only be used when the
  backend device is a TPM 2.0.



@@ -13242,7 +13243,8 @@ static virDomainTPMDefPtr
virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt,
xmlNodePtr node,
xmlXPathContextPtr ctxt,
-unsigned int flags)
+unsigned int flags,
+virArch arch)
{
virDomainTPMDefPtr def;
VIR_XPATH_NODE_AUTORESTORE(ctxt);
@@ -13258,11 +13260,17 @@ virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt,
return NULL;

model = virXMLPropString(node, "model");
-if (model != NULL &&
-(def->model = virDomainTPMModelTypeFromString(model)) < 0) {
-virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+if (model != NULL) {
+if ((def->model = virDomainTPMModelTypeFromString(model)) < 0) {
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
   _("Unknown TPM frontend model '%s'"), model);
-goto error;
+goto error;
+}
+} else {
+if (ARCH_IS_PPC64(arch))
+def->model = VIR_DOMAIN_TPM_MODEL_SPAPR;
+else
+def->model = VIR_DOMAIN_TPM_MODEL_TIS;
}


Default models should be set in qemuDomainDeviceDefPostParse.
(that might require a new VIR_DOMAIN_TPM_MODEL_DEFAULT, since so far we
 relied on VIR_DOMAIN_TPM_MODEL_TIS having the value of 0)
The parser should just translate XML into libvirt structs.


ctxt->node = node;
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index d3045b4bcd..ace611909d 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -7756,9 +7756,10 @@ qemuDomainDeviceDefValidateTPM(virDomainTPMDef *tpm,

switch (tpm->version) {
case VIR_DOMAIN_TPM_VERSION_1_2:
-/* only TIS available for emulator */
+/* only TIS available for emulator (non-ppc64 case) */
if (tpm->type == VIR_DOMAIN_TPM_TYPE_EMULATOR &&
-tpm->model != VIR_DOMAIN_TPM_MODEL_TIS) {
+tpm->model != VIR_DOMAIN_TPM_MODEL_TIS &&



+!ARCH_IS_PPC64(def->os.arch)) {


  tpm->model != VIR_DOMAIN_TPM_MODEL_SPAPR

no need to mention the architecture here.

Alternatively, are the comment and the condition just trying to say
1.2 + tpm-crb + emulator do not mix?

That might be shorter to write.

Jano


virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
   _("Unsupported interface %s for TPM 1.2"),
   virDomainTPMModelTypeToString(tpm->model));
@@ -7793,6 +7794,7 @@ qemuDomainDeviceDefValidateTPM(virDomainTPMDef *tpm,
case VIR_DOMAIN_TPM_MODEL_CRB:
flag = QEMU_CAPS_DEVICE_TPM_CRB;
break;
+case VIR_DOMAIN_TPM_MODEL_SPAPR:
case VIR_DOMAIN_TPM_MODEL_LAST:
default:
virReportEnumRangeError(virDomainTPMModel, tpm->model);
--
2.17.1




signature.asc
Description: PGP signature


Re: [libvirt PATCH 3/5] cpu: Add the kvm-no-adjvtime CPU feature

2020-02-02 Thread Ján Tomko

On Fri, Jan 31, 2020 at 05:39:50PM +0100, Andrea Bolognani wrote:

The feature is currently available on ARM only, and so it only
needs to be known to the corresponding CPU driver.

Signed-off-by: Andrea Bolognani 
---
src/cpu_map/arm_features.xml | 3 +++
1 file changed, 3 insertions(+)

diff --git a/src/cpu_map/arm_features.xml b/src/cpu_map/arm_features.xml
index 8a53384463..13d00f07a8 100644
--- a/src/cpu_map/arm_features.xml
+++ b/src/cpu_map/arm_features.xml
@@ -19,4 +19,7 @@
  
  

+  
+  


I think just like other kvm* features, this would fit better
in the hypervisor features element, not the CPU driver.

Jano


+

--
2.24.1



signature.asc
Description: PGP signature


Re: [libvirt PATCH 4/5] qemu: Validate the kvm-no-adjvtime CPU feature

2020-02-02 Thread Ján Tomko

On Fri, Jan 31, 2020 at 05:39:51PM +0100, Andrea Bolognani wrote:

Error out if the QEMU binary doesn't support it.

Signed-off-by: Andrea Bolognani 
---
src/qemu/qemu_domain.c | 14 --
1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index d3045b4bcd..8b0c91d6c1 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -4625,7 +4625,8 @@ qemuDomainDefSetDefaultCPU(virDomainDefPtr def,


static int
-qemuDomainDefCPUPostParse(virDomainDefPtr def)
+qemuDomainDefCPUPostParse(virDomainDefPtr def,
+  virQEMUCapsPtr qemuCaps)
{
virCPUFeatureDefPtr sveFeature = NULL;
bool sveVectorLengthsProvided = false;
@@ -4696,6 +4697,15 @@ qemuDomainDefCPUPostParse(virDomainDefPtr def)
} else if (STRPREFIX(feature->name, "sve")) {
sveVectorLengthsProvided = true;
}
+
+if (STREQ(feature->name, "kvm-no-adjvtime") &&
+!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_KVM_NO_ADJVTIME))
+{
+virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+   _("The '%s' feature is not supported by this "
+ "QEMU binary"), feature->name);
+return -1;


Either qemuDomain.*Validate or qemuProcessVerifyCPU would be a better
place for this check.

Jano


+}
}



signature.asc
Description: PGP signature


Re: [libvirt PATCH 2/5] qemu: Add the QEMU_CAPS_CPU_KVM_NO_ADJVTIME capability

2020-02-02 Thread Ján Tomko

On Fri, Jan 31, 2020 at 05:39:49PM +0100, Andrea Bolognani wrote:

We will use this capability to detect whether the QEMU binary
supports the kvm-no-adjvtime CPU feature.

Signed-off-by: Andrea Bolognani 
---
src/qemu/qemu_capabilities.c  | 2 ++
src/qemu/qemu_capabilities.h  | 1 +
tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml | 1 +
3 files changed, 4 insertions(+)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: PGP signature


Re: [libvirt PATCH 1/5] tests: Add capabilities for QEMU 5.0.0 on aarch64

2020-02-02 Thread Ján Tomko

On Fri, Jan 31, 2020 at 05:39:48PM +0100, Andrea Bolognani wrote:

This is the first QEMU version that supports the kvm-no-adjvtime
CPU feature.


s/is/will be/
s/supports/will support/



Signed-off-by: Andrea Bolognani 


FYI the sign-off is not present in the version you pushed to gitlab.


---
This patch has been trimmed.

.../qemu_5.0.0-virt.aarch64.xml   |   156 +
tests/domaincapsdata/qemu_5.0.0.aarch64.xml   |   150 +
.../caps_5.0.0.aarch64.replies| 22717 
.../caps_5.0.0.aarch64.xml|   456 +
4 files changed, 23479 insertions(+)
create mode 100644 tests/domaincapsdata/qemu_5.0.0-virt.aarch64.xml
create mode 100644 tests/domaincapsdata/qemu_5.0.0.aarch64.xml
create mode 100644 tests/qemucapabilitiesdata/caps_5.0.0.aarch64.replies
create mode 100644 tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml

diff --git a/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml 
b/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml
new file mode 100644
index 00..538b40dd5b
--- /dev/null
+++ b/tests/qemucapabilitiesdata/caps_5.0.0.aarch64.xml
@@ -0,0 +1,456 @@
+
+  /usr/bin/qemu-system-aarch64
[...]
+  4002050
+  0
+  61700241
+  v4.2.0-1157-gadcd6e93b9


Reviewed-by: Ján Tomko 

Jano


+  aarch64
+  
+
+


signature.asc
Description: PGP signature


[libvirt PATCH] rpc: gendispatch: trim Flags from the return struct name

2020-02-02 Thread Ján Tomko
This lets it generate the remote dispatch for StorageVolGetInfoFlags.

Signed-off-by: Ján Tomko 
---
 src/remote/remote_daemon_dispatch.c | 35 -
 src/remote/remote_protocol.x|  2 +-
 src/rpc/gendispatch.pl  |  1 +
 3 files changed, 2 insertions(+), 36 deletions(-)

diff --git a/src/remote/remote_daemon_dispatch.c 
b/src/remote/remote_daemon_dispatch.c
index b08bd5b8ba..2741a32f63 100644
--- a/src/remote/remote_daemon_dispatch.c
+++ b/src/remote/remote_daemon_dispatch.c
@@ -7162,41 +7162,6 @@ remoteDispatchDomainInterfaceAddresses(virNetServerPtr 
server G_GNUC_UNUSED,
 }
 
 
-static int
-remoteDispatchStorageVolGetInfoFlags(virNetServerPtr server G_GNUC_UNUSED,
- virNetServerClientPtr client,
- virNetMessagePtr msg G_GNUC_UNUSED,
- virNetMessageErrorPtr rerr,
- remote_storage_vol_get_info_flags_args 
*args,
- remote_storage_vol_get_info_flags_ret 
*ret)
-{
-int rv = -1;
-virStorageVolPtr vol = NULL;
-virStorageVolInfo tmp;
-virConnectPtr conn = remoteGetStorageConn(client);
-
-if (!conn)
-goto cleanup;
-
-if (!(vol = get_nonnull_storage_vol(conn, args->vol)))
-goto cleanup;
-
-if (virStorageVolGetInfoFlags(vol, , args->flags) < 0)
-goto cleanup;
-
-ret->type = tmp.type;
-ret->capacity = tmp.capacity;
-ret->allocation = tmp.allocation;
-rv = 0;
-
- cleanup:
-if (rv < 0)
-virNetMessageSaveError(rerr);
-virObjectUnref(vol);
-return rv;
-}
-
-
 static int
 remoteDispatchNetworkPortGetParameters(virNetServerPtr server G_GNUC_UNUSED,
virNetServerClientPtr client,
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index 1f7963510a..d4393680e9 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -6367,7 +6367,7 @@ enum remote_procedure {
 REMOTE_PROC_NODE_DEVICE_EVENT_UPDATE = 377,
 
 /**
- * @generate: none
+ * @generate: server
  * @priority: high
  * @acl: storage_vol:read
  */
diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl
index 8656c8f205..987a136566 100755
--- a/src/rpc/gendispatch.pl
+++ b/src/rpc/gendispatch.pl
@@ -994,6 +994,7 @@ elsif ($mode eq "server") {
 } else {
 my $struct_name = $call->{ProcName};
 $struct_name =~ s/Get//;
+$struct_name =~ s/Flags$//;
 
 splice(@args_list, $call->{ret_offset}, 0, (""));
 
-- 
2.21.0



Re: [libvirt PATCH v2 39/56] util: import an event loop impl based on GMainContext

2020-02-02 Thread Ján Tomko

On Tue, Jan 28, 2020 at 01:11:20PM +, Daniel P. Berrangé wrote:

The libvirt-glib project has provided a GMainContext based
event loop impl for applications. This imports it and sets
it up for use by libvirt as the primary event loop. This
remains a private impl detail of libvirt.

IOW, applications must *NOT* assume that a call to
"virEventRegisterDefaultImpl" results in a GLib based
event loop. They should continue to use the libvirt-glib
API gvir_event_register() if they explicitly want to
guarantee a GLib event loop.

This follows the general principal that the libvirt public


s/principal/principle/

same in the next patch.


API should not expose the fact that GLib is being used
internally.

Signed-off-by: Daniel P. Berrangé 
---
build-aux/syntax-check.mk |   2 +-
po/POTFILES.in|   1 +
src/libvirt_private.syms  |   5 +
src/util/Makefile.inc.am  |   2 +
src/util/vireventglib.c   | 455 ++
src/util/vireventglib.h   |  28 +++
6 files changed, 492 insertions(+), 1 deletion(-)
create mode 100644 src/util/vireventglib.c
create mode 100644 src/util/vireventglib.h



Jano


signature.asc
Description: PGP signature