[libvirt] [PATCH 0/5] virsh: Allow more use of VIR_AUTO* in virsh

See patch 1 for impl and description and patch 2 for example. Peter Krempa (5): virsh: Allow using VIR_AUTOPTR for releasing virDomainPtr in virsh virsh: demonstrate use of VIR_AUTOPTR(virshDomain) on 'send-process-signal' virsh: Use virshDomain type in 'inject-nmi' virsh: Use VIR_AUTO machinery in cmdQemuMonitorCommand virsh: Don't open-code virJSONStringReformat in cmdQemuMonitorCommand tools/virsh-domain.c | 51 ++++++++++++++------------------------------ tools/virsh-util.h | 3 +++ 2 files changed, 19 insertions(+), 35 deletions(-) -- 2.21.0

I opted to alias the 'virDomainType' to 'virshDomain' so that it's obvious in all cases that this is a virsh-only construct. This is also somewhat consistent with virsh's use of 'virshDomainFree' wrapper for the freeing function which actually accepts NULL. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- tools/virsh-util.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/virsh-util.h b/tools/virsh-util.h index 9005aa9d36..7fdd39dd12 100644 --- a/tools/virsh-util.h +++ b/tools/virsh-util.h @@ -39,8 +39,11 @@ virshCommandOptDomain(vshControl *ctl, const vshCmd *cmd, const char **name); +typedef virDomain virshDomain; + void virshDomainFree(virDomainPtr dom); +VIR_DEFINE_AUTOPTR_FUNC(virshDomain, virshDomainFree); void virshDomainCheckpointFree(virDomainCheckpointPtr chk); -- 2.21.0

On 9/16/19 9:45 AM, Peter Krempa wrote:
I opted to alias the 'virDomainType' to 'virshDomain' so that it's obvious in all cases that this is a virsh-only construct. This is also somewhat consistent with virsh's use of 'virshDomainFree' wrapper for the freeing function which actually accepts NULL.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> ---
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
tools/virsh-util.h | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/tools/virsh-util.h b/tools/virsh-util.h index 9005aa9d36..7fdd39dd12 100644 --- a/tools/virsh-util.h +++ b/tools/virsh-util.h @@ -39,8 +39,11 @@ virshCommandOptDomain(vshControl *ctl, const vshCmd *cmd, const char **name);
+typedef virDomain virshDomain; + void virshDomainFree(virDomainPtr dom); +VIR_DEFINE_AUTOPTR_FUNC(virshDomain, virshDomainFree);
void virshDomainCheckpointFree(virDomainCheckpointPtr chk);

Refactor the command code to use the new type. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- tools/virsh-domain.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 3d26e81b22..9015c43ba2 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -8834,8 +8834,7 @@ static int getSignalNumber(vshControl *ctl, const char *signame) static bool cmdSendProcessSignal(vshControl *ctl, const vshCmd *cmd) { - virDomainPtr dom; - bool ret = false; + VIR_AUTOPTR(virshDomain) dom = NULL; const char *signame; long long pid_value; int signum; @@ -8844,24 +8843,20 @@ cmdSendProcessSignal(vshControl *ctl, const vshCmd *cmd) return false; if (vshCommandOptLongLong(ctl, cmd, "pid", &pid_value) < 0) - goto cleanup; + return false; if (vshCommandOptStringReq(ctl, cmd, "signame", &signame) < 0) - goto cleanup; + return false; if ((signum = getSignalNumber(ctl, signame)) < 0) { vshError(ctl, _("malformed signal name: %s"), signame); - goto cleanup; + return false; } if (virDomainSendProcessSignal(dom, pid_value, signum, 0) < 0) - goto cleanup; - - ret = true; + return false; - cleanup: - virshDomainFree(dom); - return ret; + return true; } /* -- 2.21.0

On 9/16/19 9:45 AM, Peter Krempa wrote:
Refactor the command code to use the new type.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> ---
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
tools/virsh-domain.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 3d26e81b22..9015c43ba2 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -8834,8 +8834,7 @@ static int getSignalNumber(vshControl *ctl, const char *signame) static bool cmdSendProcessSignal(vshControl *ctl, const vshCmd *cmd) { - virDomainPtr dom; - bool ret = false; + VIR_AUTOPTR(virshDomain) dom = NULL; const char *signame; long long pid_value; int signum; @@ -8844,24 +8843,20 @@ cmdSendProcessSignal(vshControl *ctl, const vshCmd *cmd) return false;
if (vshCommandOptLongLong(ctl, cmd, "pid", &pid_value) < 0) - goto cleanup; + return false;
if (vshCommandOptStringReq(ctl, cmd, "signame", &signame) < 0) - goto cleanup; + return false;
if ((signum = getSignalNumber(ctl, signame)) < 0) { vshError(ctl, _("malformed signal name: %s"), signame); - goto cleanup; + return false; }
if (virDomainSendProcessSignal(dom, pid_value, signum, 0) < 0) - goto cleanup; - - ret = true; + return false;
- cleanup: - virshDomainFree(dom); - return ret; + return true; }
/*

With a nice side-effect of fixing alignment. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- tools/virsh-domain.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 9015c43ba2..9913d703ec 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -8645,17 +8645,15 @@ static const vshCmdOptDef opts_inject_nmi[] = { static bool cmdInjectNMI(vshControl *ctl, const vshCmd *cmd) { - virDomainPtr dom; - bool ret = true; + VIR_AUTOPTR(virshDomain) dom = NULL; if (!(dom = virshCommandOptDomain(ctl, cmd, NULL))) return false; if (virDomainInjectNMI(dom, 0) < 0) - ret = false; + return false; - virshDomainFree(dom); - return ret; + return true; } /* -- 2.21.0

On 9/16/19 9:45 AM, Peter Krempa wrote:
With a nice side-effect of fixing alignment.
Signed-off-by: Peter Krempa <pkrempa@redhat.com> ---
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
tools/virsh-domain.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 9015c43ba2..9913d703ec 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -8645,17 +8645,15 @@ static const vshCmdOptDef opts_inject_nmi[] = { static bool cmdInjectNMI(vshControl *ctl, const vshCmd *cmd) { - virDomainPtr dom; - bool ret = true; + VIR_AUTOPTR(virshDomain) dom = NULL;
if (!(dom = virshCommandOptDomain(ctl, cmd, NULL))) return false;
if (virDomainInjectNMI(dom, 0) < 0) - ret = false; + return false;
- virshDomainFree(dom); - return ret; + return true; }
/*

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- tools/virsh-domain.c | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 9913d703ec..8c24935938 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -9506,14 +9506,13 @@ static const vshCmdOptDef opts_qemu_monitor_command[] = { static bool cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd) { - virDomainPtr dom = NULL; - bool ret = false; - char *monitor_cmd = NULL; - char *result = NULL; + VIR_AUTOPTR(virshDomain) dom = NULL; + VIR_AUTOFREE(char *) monitor_cmd = NULL; + VIR_AUTOFREE(char *) result = NULL; unsigned int flags = 0; const vshCmdOpt *opt = NULL; virBuffer buf = VIR_BUFFER_INITIALIZER; - virJSONValuePtr pretty = NULL; + VIR_AUTOPTR(virJSONValue) pretty = NULL; VSH_EXCLUSIVE_OPTIONS("hmp", "pretty"); @@ -9527,7 +9526,7 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd) if (virBufferError(&buf)) { vshError(ctl, "%s", _("Failed to collect command")); - goto cleanup; + return false; } monitor_cmd = virBufferContentAndReset(&buf); @@ -9535,7 +9534,7 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd) flags |= VIR_DOMAIN_QEMU_MONITOR_COMMAND_HMP; if (virDomainQemuMonitorCommand(dom, monitor_cmd, &result, flags) < 0) - goto cleanup; + return false; if (vshCommandOptBool(cmd, "pretty")) { char *tmp; @@ -9549,16 +9548,7 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd) } } vshPrint(ctl, "%s\n", result); - - ret = true; - - cleanup: - VIR_FREE(result); - VIR_FREE(monitor_cmd); - virJSONValueFree(pretty); - virshDomainFree(dom); - - return ret; + return true; } /* -- 2.21.0

On 9/16/19 9:45 AM, Peter Krempa wrote:
Signed-off-by: Peter Krempa <pkrempa@redhat.com> ---
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
tools/virsh-domain.c | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 9913d703ec..8c24935938 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -9506,14 +9506,13 @@ static const vshCmdOptDef opts_qemu_monitor_command[] = { static bool cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd) { - virDomainPtr dom = NULL; - bool ret = false; - char *monitor_cmd = NULL; - char *result = NULL; + VIR_AUTOPTR(virshDomain) dom = NULL; + VIR_AUTOFREE(char *) monitor_cmd = NULL; + VIR_AUTOFREE(char *) result = NULL; unsigned int flags = 0; const vshCmdOpt *opt = NULL; virBuffer buf = VIR_BUFFER_INITIALIZER; - virJSONValuePtr pretty = NULL; + VIR_AUTOPTR(virJSONValue) pretty = NULL;
VSH_EXCLUSIVE_OPTIONS("hmp", "pretty");
@@ -9527,7 +9526,7 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd)
if (virBufferError(&buf)) { vshError(ctl, "%s", _("Failed to collect command")); - goto cleanup; + return false; } monitor_cmd = virBufferContentAndReset(&buf);
@@ -9535,7 +9534,7 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd) flags |= VIR_DOMAIN_QEMU_MONITOR_COMMAND_HMP;
if (virDomainQemuMonitorCommand(dom, monitor_cmd, &result, flags) < 0) - goto cleanup; + return false;
if (vshCommandOptBool(cmd, "pretty")) { char *tmp; @@ -9549,16 +9548,7 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd) } } vshPrint(ctl, "%s\n", result); - - ret = true; - - cleanup: - VIR_FREE(result); - VIR_FREE(monitor_cmd); - virJSONValueFree(pretty); - virshDomainFree(dom); - - return ret; + return true; }
/*

Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- tools/virsh-domain.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 8c24935938..fbfdc09c0d 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -9512,7 +9512,6 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd) unsigned int flags = 0; const vshCmdOpt *opt = NULL; virBuffer buf = VIR_BUFFER_INITIALIZER; - VIR_AUTOPTR(virJSONValue) pretty = NULL; VSH_EXCLUSIVE_OPTIONS("hmp", "pretty"); @@ -9538,8 +9537,7 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd) if (vshCommandOptBool(cmd, "pretty")) { char *tmp; - pretty = virJSONValueFromString(result); - if (pretty && (tmp = virJSONValueToString(pretty, true))) { + if ((tmp = virJSONStringReformat(result, true))) { VIR_FREE(result); result = tmp; virTrimSpaces(result, NULL); -- 2.21.0

On 9/16/19 9:45 AM, Peter Krempa wrote:
Signed-off-by: Peter Krempa <pkrempa@redhat.com> ---
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
tools/virsh-domain.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 8c24935938..fbfdc09c0d 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -9512,7 +9512,6 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd) unsigned int flags = 0; const vshCmdOpt *opt = NULL; virBuffer buf = VIR_BUFFER_INITIALIZER; - VIR_AUTOPTR(virJSONValue) pretty = NULL;
VSH_EXCLUSIVE_OPTIONS("hmp", "pretty");
@@ -9538,8 +9537,7 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd)
if (vshCommandOptBool(cmd, "pretty")) { char *tmp; - pretty = virJSONValueFromString(result); - if (pretty && (tmp = virJSONValueToString(pretty, true))) { + if ((tmp = virJSONStringReformat(result, true))) { VIR_FREE(result); result = tmp; virTrimSpaces(result, NULL);

On Mon, Sep 16, 2019 at 02:45:31PM +0200, Peter Krempa wrote:
See patch 1 for impl and description and patch 2 for example.
Peter Krempa (5): virsh: Allow using VIR_AUTOPTR for releasing virDomainPtr in virsh virsh: demonstrate use of VIR_AUTOPTR(virshDomain) on 'send-process-signal' virsh: Use virshDomain type in 'inject-nmi' virsh: Use VIR_AUTO machinery in cmdQemuMonitorCommand virsh: Don't open-code virJSONStringReformat in cmdQemuMonitorCommand
tools/virsh-domain.c | 51 ++++++++++++++------------------------------ tools/virsh-util.h | 3 +++ 2 files changed, 19 insertions(+), 35 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
participants (3)
-
Daniel Henrique Barboza
-
Ján Tomko
-
Peter Krempa