diff options
author | Ian Jackson <ian.jackson@eu.citrix.com> | 2012-08-03 09:54:08 +0100 |
---|---|---|
committer | Ian Jackson <ian.jackson@eu.citrix.com> | 2012-08-03 09:54:08 +0100 |
commit | 7253e0fd1aeb3ae7d4714bcc1d86b846b3331995 (patch) | |
tree | 943ea082fe03a56387831bd15b6a36e1ffa70b10 /tools/libxl/libxl_internal.h | |
parent | 2dc6e6ef994ca63c7f9fb49981c1b044a69f2ac1 (diff) | |
download | xen-7253e0fd1aeb3ae7d4714bcc1d86b846b3331995.tar.gz xen-7253e0fd1aeb3ae7d4714bcc1d86b846b3331995.tar.bz2 xen-7253e0fd1aeb3ae7d4714bcc1d86b846b3331995.zip |
libxl: react correctly to bootloader pty master POLLHUP
Receive POLLHUP on the bootloader master pty is not an error.
Hopefully it means that the bootloader has exited and therefore the
pty slave side has no process group any more. (At least NetBSD
indicates POLLHUP on the master in this case.)
So send the bootloader SIGTERM; if it has already exited then this has
no effect (except that on some versions of NetBSD it erroneously
returns ESRCH and we print a harmless warning) and we will then
collect the bootloader's exit status and be satisfied.
However, we remember that we have done this so that if we got POLLHUP
for some other reason than that the bootloader exited we report
something resembling a useful message.
In order to implement this we need to provide a way for users of
datacopier to handle POLLHUP rather than treating it as fatal.
We rename bootloader_abort to bootloader_stop since it now no longer
only applies to error situations.
Signed-off-by: Roger Pau Monne <roger.pau@citrix.com>
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Committed-by: Ian Campbell <ian.campbell@citrix.com>
Diffstat (limited to 'tools/libxl/libxl_internal.h')
-rw-r--r-- | tools/libxl/libxl_internal.h | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 58004b334a..2d6c71a815 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -2076,7 +2076,9 @@ typedef struct libxl__datacopier_buf libxl__datacopier_buf; * errnoval==0 means we got eof and all data was written * errnoval!=0 means we had a read error, logged * onwrite==-1 means some other internal failure, errnoval not valid, logged - * in all cases copier is killed before calling this callback */ + * If we get POLLHUP, we call callback_pollhup(..., onwrite, -1); + * or if callback_pollhup==0 this is an internal failure, as above. + * In all cases copier is killed before calling this callback */ typedef void libxl__datacopier_callback(libxl__egc *egc, libxl__datacopier_state *dc, int onwrite, int errnoval); @@ -2095,6 +2097,7 @@ struct libxl__datacopier_state { const char *copywhat, *readwhat, *writewhat; /* for error msgs */ FILE *log; /* gets a copy of everything */ libxl__datacopier_callback *callback; + libxl__datacopier_callback *callback_pollhup; /* remaining fields are private to datacopier */ libxl__ev_fd toread, towrite; ssize_t used; @@ -2279,7 +2282,7 @@ struct libxl__bootloader_state { int nargs, argsspace; const char **args; libxl__datacopier_state keystrokes, display; - int rc; + int rc, got_pollhup; }; _hidden void libxl__bootloader_init(libxl__bootloader_state *bl); |