]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virsh: Fix Ctrl-C behavior when watching a job
authorJiri Denemark <jdenemar@redhat.com>
Mon, 1 Jun 2015 13:06:16 +0000 (15:06 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Wed, 3 Jun 2015 07:53:02 +0000 (09:53 +0200)
When watching a job (save, managedsave, dump, migrate) virsh spawns a
thread to call the appropriate API and waits for the result while
watching for interruption signals (SIGINT, Ctrl-C on the terminal).
Whenever such signal is caught, virsh calls virDomainAbortJob, stops
waiting for the job, and returns the result of virDomainAbortJob.

This is wrong because the job might have finished in the meantime or it
might have been cancelled by someone else and virsh would just report
the failure to abort the job. However, we are not interested in the
virDomainAbortJob's result at all, we need to keep waiting for the main
job to finish and report its result instead.

https://bugzilla.redhat.com/show_bug.cgi?id=1131755

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
tools/virsh-domain.c

index 49709488b1cf1e8850d5146b096770994caa9fe7..a25b7ba96982cb27cb1168e898d2064af02c24ba 100644 (file)
@@ -4207,12 +4207,9 @@ vshWatchJob(vshControl *ctl,
         if (ret > 0) {
             if (pollfd[1].revents & POLLIN &&
                 saferead(STDIN_FILENO, &retchar, sizeof(retchar)) > 0) {
-                if (vshTTYIsInterruptCharacter(ctl, retchar)) {
+                if (vshTTYIsInterruptCharacter(ctl, retchar))
                     virDomainAbortJob(dom);
-                    goto cleanup;
-                } else {
-                    continue;
-                }
+                continue;
             }
 
             if (pollfd[0].revents & POLLIN &&
@@ -4232,9 +4229,8 @@ vshWatchJob(vshControl *ctl,
                 if (intCaught) {
                     virDomainAbortJob(dom);
                     intCaught = 0;
-                } else {
-                    continue;
                 }
+                continue;
             }
             goto cleanup;
         }