aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--io/channel-command.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/io/channel-command.c b/io/channel-command.c
index 319c5ed50c..3e7eb17eff 100644
--- a/io/channel-command.c
+++ b/io/channel-command.c
@@ -301,6 +301,9 @@ static int qio_channel_command_close(QIOChannel *ioc,
{
QIOChannelCommand *cioc = QIO_CHANNEL_COMMAND(ioc);
int rv = 0;
+#ifndef WIN32
+ pid_t wp;
+#endif
/* We close FDs before killing, because that
* gives a better chance of clean shutdown
@@ -315,11 +318,18 @@ static int qio_channel_command_close(QIOChannel *ioc,
rv = -1;
}
cioc->writefd = cioc->readfd = -1;
+
#ifndef WIN32
- if (qio_channel_command_abort(cioc, errp) < 0) {
+ do {
+ wp = waitpid(cioc->pid, NULL, 0);
+ } while (wp == (pid_t)-1 && errno == EINTR);
+ if (wp == (pid_t)-1) {
+ error_setg_errno(errp, errno, "Failed to wait for pid %llu",
+ (unsigned long long)cioc->pid);
return -1;
}
#endif
+
if (rv < 0) {
error_setg_errno(errp, errno, "%s",
"Unable to close command");