@@ -43,6 +43,8 @@ redis_WSASend WSASend = NULL;
4343redis_WSARecv WSARecv = NULL ;
4444redis_WSACleanup WSACleanup = NULL ;
4545redis_WSAGetOverlappedResult WSAGetOverlappedResult = NULL ;
46+ redis_WSADuplicateSocket WSADuplicateSocket = NULL ;
47+ redis_WSASocket WSASocket = NULL ;
4648
4749// other API forwards
4850redis_fwrite fdapi_fwrite = NULL ;
@@ -53,8 +55,10 @@ redis_isatty isatty = NULL;
5355redis_access access = NULL ;
5456redis_lseek64 lseek64 = NULL ;
5557redis_get_osfhandle fdapi_get_osfhandle = NULL ;
58+ redis_open_osfhandle fdapi_open_osfhandle = NULL ;
5659
5760// Unix compatible FD based routines
61+ redis_pipe pipe = NULL ;
5862redis_socket socket = NULL ;
5963redis_close fdapi_close = NULL ;
6064redis_open open = NULL ;
@@ -290,6 +294,21 @@ int redis_socket_impl(int af,int type,int protocol) {
290294 return rfd;
291295}
292296
297+ int redis_pipe_impl (int *pfds) {
298+ int err = -1 ;
299+ try {
300+ // Not passing _O_NOINHERIT, the underlying handles are inheritable by default
301+ err = crt_pipe (pfds, 8192 , _O_BINARY);
302+ if (err == 0 ) {
303+ pfds[0 ] = RFDMap::getInstance ().addPosixFD (pfds[0 ]);
304+ pfds[1 ] = RFDMap::getInstance ().addPosixFD (pfds[1 ]);
305+ }
306+ } CATCH_AND_REPORT ()
307+
308+ return err;
309+ }
310+
311+
293312// In unix a fd is a fd. All are closed with close().
294313auto f_closesocket = dllfunctor_stdcall<int , SOCKET>(" ws2_32.dll" , " closesocket" );
295314int redis_close_impl (RFD rfd) {
@@ -795,6 +814,40 @@ BOOL redis_WSAGetOverlappedResult_impl(int rfd, LPWSAOVERLAPPED lpOverlapped, LP
795814 return SOCKET_ERROR;
796815}
797816
817+ auto f_WSADuplicateSocket = dllfunctor_stdcall<int , SOCKET, DWORD, LPWSAPROTOCOL_INFO>(" ws2_32.dll" , " WSADuplicateSocketW" );
818+ int redis_WSADuplicateSocket_impl (int rfd, DWORD dwProcessId, LPWSAPROTOCOL_INFO lpProtocolInfo) {
819+ try {
820+ SOCKET s = RFDMap::getInstance ().lookupSocket ( rfd );
821+ if ( s != INVALID_SOCKET ) {
822+ return f_WSADuplicateSocket (s, dwProcessId, lpProtocolInfo);
823+ } else {
824+ errno = EBADF;
825+ return SOCKET_ERROR;
826+ }
827+ } CATCH_AND_REPORT ();
828+
829+ return SOCKET_ERROR;
830+ }
831+
832+ auto f_WSASocket = dllfunctor_stdcall<SOCKET, int , int , int , LPWSAPROTOCOL_INFO, GROUP, DWORD>(" ws2_32.dll" , " WSASocketW" );
833+ int redis_WSASocket_impl (int af, int type, int protocol, LPWSAPROTOCOL_INFO lpProtocolInfo, GROUP g, DWORD dwFlags) {
834+ RFD rfd = RFDMap::invalidRFD;
835+ try {
836+ SOCKET socket = f_WSASocket (af,
837+ type,
838+ protocol,
839+ lpProtocolInfo,
840+ g,
841+ dwFlags);
842+
843+ if (socket != INVALID_SOCKET) {
844+ rfd = RFDMap::getInstance ().addSocket (socket);
845+ }
846+ } CATCH_AND_REPORT ()
847+
848+ return rfd;
849+ }
850+
798851int redis_WSAIoctl_impl (RFD rfd,DWORD dwIoControlCode,LPVOID lpvInBuffer,DWORD cbInBuffer,LPVOID lpvOutBuffer,DWORD cbOutBuffer,LPDWORD lpcbBytesReturned,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) {
799852 try {
800853 SOCKET s = RFDMap::getInstance ().lookupSocket ( rfd );
@@ -1012,6 +1065,18 @@ intptr_t redis_get_osfhandle_impl(int fd) {
10121065 return -1 ;
10131066}
10141067
1068+ int redis_open_osfhandle_impl (intptr_t osfhandle, int flags) {
1069+ RFD rfd = RFDMap::invalidRFD;
1070+ try {
1071+ int posixFD = crt_open_osfhandle (osfhandle, flags);
1072+ if (posixFD != -1 ) {
1073+ rfd = RFDMap::getInstance ().addPosixFD (posixFD);
1074+ }
1075+ } CATCH_AND_REPORT ()
1076+
1077+ return rfd;
1078+ }
1079+
10151080auto f_freeaddrinfo = dllfunctor_stdcall<void , addrinfo*>(" ws2_32.dll" , " freeaddrinfo" );
10161081void redis_freeaddrinfo_impl (struct addrinfo *ai) {
10171082 f_freeaddrinfo (ai);
@@ -1089,6 +1154,7 @@ class Win32_FDSockMap {
10891154 Win32_FDSockMap () {
10901155 InitWinsock ();
10911156
1157+ pipe = redis_pipe_impl;
10921158 socket = redis_socket_impl;
10931159 fdapi_close = redis_close_impl;
10941160 open = redis_open_impl;
@@ -1123,12 +1189,15 @@ class Win32_FDSockMap {
11231189 WSARecv = redis_WSARecv_impl;
11241190 WSACleanup = redis_WSACleanup_impl;
11251191 WSAGetOverlappedResult = redis_WSAGetOverlappedResult_impl;
1192+ WSADuplicateSocket = redis_WSADuplicateSocket_impl;
1193+ WSASocket = redis_WSASocket_impl;
11261194 select = redis_select_impl;
11271195 ntohl = redis_ntohl_impl;
11281196 isatty = redis_isatty_impl;
11291197 access = redis_access_impl;
11301198 lseek64 = redis_lseek64_impl;
11311199 fdapi_get_osfhandle = redis_get_osfhandle_impl;
1200+ fdapi_open_osfhandle = redis_open_osfhandle_impl;
11321201 freeaddrinfo = redis_freeaddrinfo_impl;
11331202 getaddrinfo = redis_getaddrinfo_impl;
11341203 inet_ntop = redis_inet_ntop_impl;
0 commit comments