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
This commit is contained in:
Daniel P. Berrange 2011-03-08 18:04:06 +00:00
parent 30a50fc3b0
commit 2737b6c20b
3 changed files with 12 additions and 3 deletions

View File

@ -910,6 +910,7 @@ virRandom;
virRandomInitialize;
virRun;
virRunWithHook;
virSetBlocking;
virSetCloseExec;
virSetNonBlock;
virSetUIDGID;

View 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;
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

View 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;