--- BDB/BDB.xs 2009/01/09 22:32:12 1.67 +++ BDB/BDB.xs 2009/07/14 19:29:23 1.68 @@ -8,6 +8,8 @@ #include "perl.h" #include "XSUB.h" +#include "schmorp.h" + // perl stupidly defines these as macros, breaking // lots and lots of code. #undef open @@ -458,101 +460,6 @@ Safefree (req); } -#ifdef USE_SOCKETS_AS_HANDLES -# define TO_SOCKET(x) (win32_get_osfhandle (x)) -#else -# define EV_SELECT_IS_WINSOCKET 1 -# define TO_SOCKET(x) (x) -#endif - -#ifdef _WIN32 -/* taken verbatim from libev's ev_win32.c */ -/* oh, the humanity! */ -static int -ev_pipe (int filedes [2]) -{ - struct sockaddr_in addr = { 0 }; - int addr_size = sizeof (addr); - struct sockaddr_in adr2; - int adr2_size; - SOCKET listener; - SOCKET sock [2] = { -1, -1 }; - - if ((listener = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) - return -1; - - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); - addr.sin_port = 0; - - if (bind (listener, (struct sockaddr *)&addr, addr_size)) - goto fail; - - if (getsockname (listener, (struct sockaddr *)&addr, &addr_size)) - goto fail; - - if (listen (listener, 1)) - goto fail; - - if ((sock [0] = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) - goto fail; - - if (connect (sock [0], (struct sockaddr *)&addr, addr_size)) - goto fail; - - if ((sock [1] = accept (listener, 0, 0)) < 0) - goto fail; - - /* windows vista returns fantasy port numbers for getpeername. - * example for two interconnected tcp sockets: - * - * (Socket::unpack_sockaddr_in getsockname $sock0)[0] == 53364 - * (Socket::unpack_sockaddr_in getpeername $sock0)[0] == 53363 - * (Socket::unpack_sockaddr_in getsockname $sock1)[0] == 53363 - * (Socket::unpack_sockaddr_in getpeername $sock1)[0] == 53365 - * - * wow! tridirectional sockets! - * - * this way of checking ports seems to work: - */ - if (getpeername (sock [0], (struct sockaddr *)&addr, &addr_size)) - goto fail; - - if (getsockname (sock [1], (struct sockaddr *)&adr2, &adr2_size)) - goto fail; - - errno = WSAEINVAL; - if (addr_size != adr2_size - || addr.sin_addr.s_addr != adr2.sin_addr.s_addr /* just to be sure, I mean, it's windows */ - || addr.sin_port != adr2.sin_port) - goto fail; - - closesocket (listener); - -#if EV_SELECT_IS_WINSOCKET - filedes [0] = _open_osfhandle (sock [0], 0); - filedes [1] = _open_osfhandle (sock [1], 0); -#else - /* when select isn't winsocket, we also expect socket, connect, accept etc. - * to work on fds */ - filedes [0] = sock [0]; - filedes [1] = sock [1]; -#endif - - return 0; - -fail: - closesocket (listener); - - if (sock [0] != INVALID_SOCKET) closesocket (sock [0]); - if (sock [1] != INVALID_SOCKET) closesocket (sock [1]); - - return -1; -} - -#define pipe(filedes) ev_pipe(filedes) -#endif - static void create_respipe (void) { @@ -562,14 +469,14 @@ int old_readfd = respipe [0]; if (respipe [1] >= 0) - respipe_close (TO_SOCKET (respipe [1])); + respipe_close (S_TO_SOCKET (respipe [1])); - if (pipe (respipe)) + if (s_pipe (respipe)) croak ("unable to initialize result pipe"); if (old_readfd >= 0) { - if (dup2 (TO_SOCKET (respipe [0]), TO_SOCKET (old_readfd)) < 0) + if (dup2 (S_TO_SOCKET (respipe [0]), S_TO_SOCKET (old_readfd)) < 0) croak ("unable to initialize result pipe(2)"); respipe_close (respipe [0]); @@ -578,16 +485,16 @@ #ifdef _WIN32 arg = 1; - if (ioctlsocket (TO_SOCKET (respipe [0]), FIONBIO, &arg) - || ioctlsocket (TO_SOCKET (respipe [1]), FIONBIO, &arg)) + if (ioctlsocket (S_TO_SOCKET (respipe [0]), FIONBIO, &arg) + || ioctlsocket (S_TO_SOCKET (respipe [1]), FIONBIO, &arg)) #else if (fcntl (respipe [0], F_SETFL, O_NONBLOCK) || fcntl (respipe [1], F_SETFL, O_NONBLOCK)) #endif croak ("unable to initialize result pipe(3)"); - respipe_osf [0] = TO_SOCKET (respipe [0]); - respipe_osf [1] = TO_SOCKET (respipe [1]); + respipe_osf [0] = S_TO_SOCKET (respipe [0]); + respipe_osf [1] = S_TO_SOCKET (respipe [1]); } static void bdb_request (bdb_req req);