This patch series implements user cancellation. What this means is that the "user" (or any library caller) can cancel certain long-running operations. Currently it is only possible to cancel upload and download operations (ie. anything in the generator which uses FileIn and FileOut). The mechanism in the protocol to implement cancellation already exists, and it is already used to cancel transfers where there is an error. For example, if the library gets an error while reading a local file during an upload, it already cancels the transfer. Therefore the only thing left to do is to expose cancellation to library callers. This is done through the new API call: void guestfs_user_cancel (guestfs_h *g); This call is signal safe and thread safe. It is, in fact, designed to be called from a SIGINT signal handler (to handle ^C being pressed by the user during a transfer). You could also wire it up to a cancel button called from another thread, or use it in other ways. There are three main complexities to this patch series: (1) We need to implement process groups (see patch 2/8). This is because otherwise the terminal sends ^C to the qemu process (because it is in the same process group as the parent), killing it. In order to catch ^C in guestfish, we need guestfish and the subprocesses to be in different process groups. (2) The language bindings need to be signal safe. This turns out to be simple for OCaml, Perl and Ruby. However Python doesn't have any clear way to make functions signal safe, and so I did not implement a Python binding for now. (3) There is a multithreaded test program (capitests/test-user-cancel.c) which performs an upload and a download and attempts to cancel it at the same time. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://libguestfs.org