On 3/18/19 5:08 AM, Nikolay Shirokovskiy wrote:
If the console was disconnected due to a connection problem or a
problem on the
server side it is convinient to provide the cause to the user. If the error
come from the API then the error is saved in a virsh global variable. However,
since success is returned from virshRunConsole after we reach the waiting stage,
then the error is never reported. Let's track the error in the event loop.
Next after failure we do a cleanup and this cleanup can overwrite
root cause. Thus let's save root cause immediately and then set it to
virsh error after all cleanup is done.
Since we'll be sending the error to the consumer, each failure path from
the event handlers needs to be augmented to provide what error generated
the failure.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy(a)virtuozzo.com>
---
tools/virsh-console.c | 55 +++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 47 insertions(+), 8 deletions(-)
diff --git a/tools/virsh-console.c b/tools/virsh-console.c
index d109734..236933a 100644
--- a/tools/virsh-console.c
+++ b/tools/virsh-console.c
@@ -73,6 +73,7 @@ struct virConsole {
struct virConsoleBuffer terminalToStream;
char escapeChar;
+ virError error;
};
static virClassPtr virConsoleClass;
@@ -98,6 +99,11 @@ virConsoleHandleSignal(int sig ATTRIBUTE_UNUSED)
static void
virConsoleShutdown(virConsolePtr con)
{
+ virErrorPtr err = virGetLastError();
+
+ if (con->error.code == VIR_ERR_OK && err && err->code !=
VIR_ERR_OK)
+ virCopyLastError(&con->error);
+
virGetLastError() returns NULL if err->code == VIR_ERR_OK, so that last
check can be removed. The rest looks good to me
Reviewed-by: Cole Robinson <crobinso(a)redhat.com>
- Cole