From: Daniel P. Berrange Date: Tue, 8 Mar 2011 18:04:06 +0000 (+0000) Subject: Add virSetBlocking() to allow O_NONBLOCK to be toggle on or off X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=2737b6c20bb18906aa72ecb1eeb10303943b72fc;p=libvirt.git Add virSetBlocking() to allow O_NONBLOCK to be toggle on or off The virSetNonBlock() API only allows enabling non-blocking operations. It doesn't allow turning blocking back on. Add a new API to allow arbitrary toggling. * src/libvirt_private.syms, src/util/util.h src/util/util.c: Add virSetBlocking --- diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 09eb03a356..c88d9346e0 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -910,6 +910,7 @@ virRandom; virRandomInitialize; virRun; virRunWithHook; +virSetBlocking; virSetCloseExec; virSetNonBlock; virSetUIDGID; diff --git a/src/util/util.c b/src/util/util.c index f41e117d39..e573f4adf9 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -244,16 +244,19 @@ virArgvToString(const char *const *argv) return ret; } -int virSetNonBlock(int fd) { +int virSetBlocking(int fd, bool blocking) { #ifndef WIN32 int flags; if ((flags = fcntl(fd, F_GETFL)) < 0) return -1; - flags |= O_NONBLOCK; + if (blocking) + flags &= ~O_NONBLOCK; + else + flags |= O_NONBLOCK; if ((fcntl(fd, F_SETFL, flags)) < 0) return -1; #else - unsigned long flag = 1; + unsigned long flag = blocking ? 0 : 1; /* This is actually Gnulib's replacement rpl_ioctl function. * We can't call ioctlsocket directly in any case. @@ -264,6 +267,10 @@ int virSetNonBlock(int fd) { return 0; } +int virSetNonBlock(int fd) { + return virSetBlocking(fd, false); +} + #ifndef WIN32 diff --git a/src/util/util.h b/src/util/util.h index 5f6473c70c..31c3a33619 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -49,6 +49,7 @@ enum { VIR_EXEC_CLEAR_CAPS = (1 << 2), }; +int virSetBlocking(int fd, bool blocking) ATTRIBUTE_RETURN_CHECK; int virSetNonBlock(int fd) ATTRIBUTE_RETURN_CHECK; int virSetCloseExec(int fd) ATTRIBUTE_RETURN_CHECK;