In some cases we don't want to log errors if an agent command is unsupported. Wire it up into qemuAgentCheckError via qemuAgentCommandFull and provide a thin wrapper (qemuAgentCommand) to prevent having to fix all callers. Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx> --- src/qemu/qemu_agent.c | 45 +++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index 8790c47b87..bc5d57ab94 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -1051,7 +1051,8 @@ qemuAgentCommandName(virJSONValuePtr cmd) static int qemuAgentCheckError(virJSONValuePtr cmd, - virJSONValuePtr reply) + virJSONValuePtr reply, + bool report_unsupported) { if (virJSONValueObjectHasKey(reply, "error")) { virJSONValuePtr error = virJSONValueObjectGet(reply, "error"); @@ -1063,15 +1064,25 @@ qemuAgentCheckError(virJSONValuePtr cmd, NULLSTR(cmdstr), NULLSTR(replystr)); /* Only send the user the command name + friendly error */ - if (!error) + if (!error) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unable to execute QEMU agent command '%s'"), qemuAgentCommandName(cmd)); - else - virReportError(VIR_ERR_INTERNAL_ERROR, - _("unable to execute QEMU agent command '%s': %s"), - qemuAgentCommandName(cmd), - qemuAgentStringifyError(error)); + return -1; + } + + if (!report_unsupported) { + const char *klass = virJSONValueObjectGetString(error, "class"); + + if (STREQ_NULLABLE(klass, "CommandNotFound") || + STREQ_NULLABLE(klass, "CommandDisabled")) + return -2; + } + + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unable to execute QEMU agent command '%s': %s"), + qemuAgentCommandName(cmd), + qemuAgentStringifyError(error)); return -1; } else if (!virJSONValueObjectHasKey(reply, "return")) { @@ -1089,10 +1100,11 @@ qemuAgentCheckError(virJSONValuePtr cmd, } static int -qemuAgentCommand(qemuAgentPtr agent, - virJSONValuePtr cmd, - virJSONValuePtr *reply, - int seconds) +qemuAgentCommandFull(qemuAgentPtr agent, + virJSONValuePtr cmd, + virJSONValuePtr *reply, + int seconds, + bool report_unsupported) { int ret = -1; qemuAgentMessage msg; @@ -1143,7 +1155,7 @@ qemuAgentCommand(qemuAgentPtr agent, } *reply = msg.rxObject; - ret = qemuAgentCheckError(cmd, *reply); + ret = qemuAgentCheckError(cmd, *reply, report_unsupported); cleanup: VIR_FREE(cmdstr); @@ -1153,6 +1165,15 @@ qemuAgentCommand(qemuAgentPtr agent, return ret; } +static int +qemuAgentCommand(qemuAgentPtr agent, + virJSONValuePtr cmd, + virJSONValuePtr *reply, + int seconds) +{ + return qemuAgentCommandFull(agent, cmd, reply, seconds, true); +} + static virJSONValuePtr G_GNUC_NULL_TERMINATED qemuAgentMakeCommand(const char *cmdname, ...) -- 2.24.1