]> xenbits.xensource.com Git - libvirt.git/commitdiff
Add virSetBlocking() to allow O_NONBLOCK to be toggle on or off
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 8 Mar 2011 18:04:06 +0000 (18:04 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 15 Mar 2011 15:26:35 +0000 (15:26 +0000)
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
src/util/util.c
src/util/util.h

index 09eb03a356a21a9de06f49e97935f8c6274a33d4..c88d9346e0202075593d3c1ff1db352a35f176c3 100644 (file)
@@ -910,6 +910,7 @@ virRandom;
 virRandomInitialize;
 virRun;
 virRunWithHook;
+virSetBlocking;
 virSetCloseExec;
 virSetNonBlock;
 virSetUIDGID;
index f41e117d3980b0eabe841f6225b3facdfb9001cb..e573f4adf9cec1a3f83620157e354cfc7f97051f 100644 (file)
@@ -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
 
index 5f6473c70c436f6165f6639341beb01e226f3be1..31c3a336199fecee982ebf26b432472d0f6e500b 100644 (file)
@@ -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;