From: Stefan Berger Date: Thu, 25 Jul 2019 18:22:08 +0000 (-0400) Subject: utils: Mark inpipe as non-blocking X-Git-Tag: v5.6.0-rc1~50 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f940d74972485d23d8d0bc04a72e5b689076a8f;p=thirdparty%2Flibvirt.git utils: Mark inpipe as non-blocking Mark a virCommand's inpipe (write-end of pipe) as non-blocking so that it will never block when we were to try to write too many bytes to it while it doesn't have the capacity to hold them. Signed-off-by: Stefan Berger Reviewed-by: Daniel P. Berrangé --- diff --git a/src/util/vircommand.c b/src/util/vircommand.c index 94b2ebc8aa..a3a5780d29 100644 --- a/src/util/vircommand.c +++ b/src/util/vircommand.c @@ -2538,6 +2538,19 @@ virCommandRunAsync(virCommandPtr cmd, pid_t *pid) } cmd->infd = infd[0]; cmd->inpipe = infd[1]; +#if defined (F_SETFL) + if (fcntl(cmd->inpipe, F_SETFL, O_NONBLOCK) < 0) { + virReportSystemError(errno, "%s", + _("fcntl failed to set O_NONBLOCK")); + cmd->has_error = -1; + ret = -1; + goto cleanup; + } +#else /* !defined(F_SETFL) */ + cmd->has_error = ENOTSUP; + ret = -1; + goto cleanup; +#endif } else if ((cmd->inbuf && cmd->infd == -1) || (cmd->outbuf && cmd->outfdptr != &cmd->outfd) || (cmd->errbuf && cmd->errfdptr != &cmd->errfd)) {