[libvirt] [PATCHv2 1/3] xen_vm: convert to typesafe virConf accessors
Ján Tomko
jtomko at redhat.com
Sun May 27 09:55:34 UTC 2018
On Sat, May 26, 2018 at 11:00:25PM +0200, Fabiano Fidêncio wrote:
>From: Fabiano Fidêncio <fidencio at redhat.com>
>
>Signed-off-by: Fabiano Fidêncio <fabiano at fidencio.org>
The S-o-B address should match the one of the author.
>---
> src/xenconfig/xen_xm.c | 268 ++++++++++++++++++++++++-------------------------
> 1 file changed, 132 insertions(+), 136 deletions(-)
>
>diff --git a/src/xenconfig/xen_xm.c b/src/xenconfig/xen_xm.c
>index 4becb40b4c..fc88ac8238 100644
>--- a/src/xenconfig/xen_xm.c
>+++ b/src/xenconfig/xen_xm.c
>@@ -112,172 +112,168 @@ xenParseXMDisk(virConfPtr conf, virDomainDefPtr def)
> {
> virDomainDiskDefPtr disk = NULL;
> int hvm = def->os.type == VIR_DOMAIN_OSTYPE_HVM;
>- virConfValuePtr list = virConfGetValue(conf, "disk");
>+ char **disks = NULL, **entries;
>
>- if (list && list->type == VIR_CONF_LIST) {
>- list = list->list;
Adding
else
list = NULL;
Would let you move the while below outside of the if body and separate
the whitespace changes from the virConfGetValue -> StringList change.
Or, even better, the whole per-disk logic can be moved to a separate
function.
>- while (list) {
>- char *head;
>- char *offset;
>- char *tmp;
>- const char *src;
>+ if (virConfGetValueStringList(conf, "disk", false, &disks) < 0)
>+ goto cleanup;
>
>- if ((list->type != VIR_CONF_STRING) || (list->str == NULL))
>- goto skipdisk;
>+ for (entries = disks; *entries; entries++) {
>+ char *head = *entries;
>+ char *offset;
>+ char *tmp;
>+ const char *src;
>
>- head = list->str;
>- if (!(disk = virDomainDiskDefNew(NULL)))
>- return -1;
>+ if (!(disk = virDomainDiskDefNew(NULL)))
>+ return -1;
>+
>+ /*
>+ * Disks have 3 components, SOURCE,DEST-DEVICE,MODE
>+ * eg, phy:/dev/HostVG/XenGuest1,xvda,w
>+ * The SOURCE is usually prefixed with a driver type,
>+ * and optionally driver sub-type
>+ * The DEST-DEVICE is optionally post-fixed with disk type
>+ */
>+
>+ /* Extract the source file path*/
>+ if (!(offset = strchr(head, ',')))
>+ goto skipdisk;
Using a separate function would also get rid of this unusual label.
>+
>+ if (offset == head) {
>+ /* No source file given, eg CDROM with no media */
>+ ignore_value(virDomainDiskSetSource(disk, NULL));
>+ } else {
>+ if (VIR_STRNDUP(tmp, head, offset - head) < 0)
>+ goto cleanup;
>+
>+ if (virDomainDiskSetSource(disk, tmp) < 0) {
>+ VIR_FREE(tmp);
>+ goto cleanup;
>+ }
>+ VIR_FREE(tmp);
>+ }
>
[...]
>- skipdisk:
>- list = list->next;
>- virDomainDiskDefFree(disk);
>- disk = NULL;
>- }
>+ skipdisk:
>+ virDomainDiskDefFree(disk);
>+ disk = NULL;
> }
>
> return 0;
>
> cleanup:
>+ virStringListFree(disks);
The list needs to be freed even in the success path.
(NB: this usage of 'cleanup' label is not customary -
for code paths returning an error, we use 'error'.
'cleanup' is meant for code shared between the success
and error paths)
Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20180527/cc5db69e/attachment-0001.sig>
More information about the libvir-list
mailing list