Commit a198e715 authored by Christopher Dykes's avatar Christopher Dykes Committed by Facebook Github Bot

Support marking a file-descriptor as blocking via fcntl

Summary: Previously, only marking it as non-blocking was supported.

Reviewed By: simpkins

Differential Revision: D5307769

fbshipit-source-id: 03ed7c35632dbc9551552b21c401ea709bd6eaaa
parent 70918928
...@@ -61,24 +61,23 @@ int fcntl(int fd, int cmd, ...) { ...@@ -61,24 +61,23 @@ int fcntl(int fd, int cmd, ...) {
} }
case F_SETFL: { case F_SETFL: {
int flags = va_arg(args, int); int flags = va_arg(args, int);
if (flags & O_NONBLOCK) {
// If it's not a socket, it's probably a pipe. // If it's not a socket, it's probably a pipe.
if (folly::portability::sockets::is_fh_socket(fd)) { if (folly::portability::sockets::is_fh_socket(fd)) {
SOCKET s = (SOCKET)_get_osfhandle(fd); SOCKET s = (SOCKET)_get_osfhandle(fd);
if (s != INVALID_SOCKET) { if (s != INVALID_SOCKET) {
u_long nonBlockingEnabled = 1; u_long nonBlockingEnabled = (flags & O_NONBLOCK) ? 1 : 0;
res = ioctlsocket(s, FIONBIO, &nonBlockingEnabled); res = ioctlsocket(s, FIONBIO, &nonBlockingEnabled);
} }
} else { } else {
HANDLE p = (HANDLE)_get_osfhandle(fd); HANDLE p = (HANDLE)_get_osfhandle(fd);
if (GetFileType(p) == FILE_TYPE_PIPE) { if (GetFileType(p) == FILE_TYPE_PIPE) {
DWORD newMode = PIPE_READMODE_BYTE | PIPE_NOWAIT; DWORD newMode = PIPE_READMODE_BYTE;
newMode |= (flags & O_NONBLOCK) ? PIPE_NOWAIT : PIPE_WAIT;
if (SetNamedPipeHandleState(p, &newMode, nullptr, nullptr)) { if (SetNamedPipeHandleState(p, &newMode, nullptr, nullptr)) {
res = 0; res = 0;
} }
} }
} }
}
break; break;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment