/*
- * Copyright 2016 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
namespace folly {
namespace portability {
namespace fcntl {
-int creat(char const* fn, int pm) { return _creat(fn, pm); }
+int creat(char const* fn, int pm) {
+ return _creat(fn, pm);
+}
int fcntl(int fd, int cmd, ...) {
va_list args;
if (h != INVALID_HANDLE_VALUE) {
DWORD flags;
if (GetHandleInformation(h, &flags)) {
- res = flags & HANDLE_FLAG_INHERIT;
+ res = int(flags & HANDLE_FLAG_INHERIT);
}
}
break;
}
case F_SETFL: {
int flags = va_arg(args, int);
- if (flags & O_NONBLOCK) {
- // If it's not a socket, it's probably a pipe, and
- // those are non-blocking by default with Windows.
- if (folly::portability::sockets::is_fh_socket(fd)) {
- SOCKET s = (SOCKET)_get_osfhandle(fd);
- if (s != INVALID_SOCKET) {
- u_long nonBlockingEnabled = 1;
- res = ioctlsocket(s, FIONBIO, &nonBlockingEnabled);
+ // If it's not a socket, it's probably a pipe.
+ if (folly::portability::sockets::is_fh_socket(fd)) {
+ SOCKET s = (SOCKET)_get_osfhandle(fd);
+ if (s != INVALID_SOCKET) {
+ u_long nonBlockingEnabled = (flags & O_NONBLOCK) ? 1 : 0;
+ res = ioctlsocket(s, FIONBIO, &nonBlockingEnabled);
+ }
+ } else {
+ HANDLE p = (HANDLE)_get_osfhandle(fd);
+ if (GetFileType(p) == FILE_TYPE_PIPE) {
+ DWORD newMode = PIPE_READMODE_BYTE;
+ newMode |= (flags & O_NONBLOCK) ? PIPE_NOWAIT : PIPE_WAIT;
+ if (SetNamedPipeHandleState(p, &newMode, nullptr, nullptr)) {
+ res = 0;
}
- } else {
- res = 0;
}
}
break;
// none are.
return -1;
}
+ if (!strcmp(fn, "/dev/null")) {
+ // Windows doesn't have a /dev/null, but it does have
+ // NUL, which achieves the same result.
+ fn = "NUL";
+ }
errno_t res = _sopen_s(&fh, fn, of, _SH_DENYNO, realMode);
return res ? -1 : fh;
}