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
---
src/libvirt_private.syms | 1 +
src/util/util.c | 13 ++++++++++---
src/util/util.h | 1 +
3 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 09eb03a..c88d934 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 f41e117..e573f4a 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 5f6473c..31c3a33 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;
--
1.7.4