ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev_win32.c
(Generate patch)

Comparing libev/ev_win32.c (file contents):
Revision 1.5 by root, Fri May 23 16:37:38 2008 UTC vs.
Revision 1.9 by root, Sun Feb 15 01:44:40 2009 UTC

37 * either the BSD or the GPL. 37 * either the BSD or the GPL.
38 */ 38 */
39 39
40#ifdef _WIN32 40#ifdef _WIN32
41 41
42/* timeb.h is actually xsi legacy functionality */
42#include <sys/timeb.h> 43#include <sys/timeb.h>
43 44
44/* note: the comment below could not be substantiated, but what would I care */ 45/* note: the comment below could not be substantiated, but what would I care */
45/* MSDN says this is required to handle SIGFPE */ 46/* MSDN says this is required to handle SIGFPE */
47/* my wild guess would be that using something floating-pointy is required */
48/* for the crt to do something about it */
46volatile double SIGFPE_REQ = 0.0f; 49volatile double SIGFPE_REQ = 0.0f;
47 50
48/* oh, the humanity! */ 51/* oh, the humanity! */
49static int 52static int
50ev_pipe (int filedes [2]) 53ev_pipe (int filedes [2])
51{ 54{
52 struct sockaddr_in addr = { 0 }; 55 struct sockaddr_in addr = { 0 };
53 int addr_size = sizeof (addr); 56 int addr_size = sizeof (addr);
57 struct sockaddr_in adr2;
58 int adr2_size = sizeof (adr2);
54 SOCKET listener; 59 SOCKET listener;
55 SOCKET sock [2] = { -1, -1 }; 60 SOCKET sock [2] = { -1, -1 };
56 61
57 if ((listener = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 62 if ((listener = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
58 return -1; 63 return -1;
62 addr.sin_port = 0; 67 addr.sin_port = 0;
63 68
64 if (bind (listener, (struct sockaddr *)&addr, addr_size)) 69 if (bind (listener, (struct sockaddr *)&addr, addr_size))
65 goto fail; 70 goto fail;
66 71
67 if (getsockname(listener, (struct sockaddr *)&addr, &addr_size)) 72 if (getsockname (listener, (struct sockaddr *)&addr, &addr_size))
68 goto fail; 73 goto fail;
69 74
70 if (listen (listener, 1)) 75 if (listen (listener, 1))
71 goto fail; 76 goto fail;
72 77
73 if ((sock [0] = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 78 if ((sock [0] = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
74 goto fail; 79 goto fail;
75 80
76 if (connect (sock[0], (struct sockaddr *)&addr, addr_size)) 81 if (connect (sock [0], (struct sockaddr *)&addr, addr_size))
77 goto fail; 82 goto fail;
78 83
79 if ((sock[1] = accept (listener, 0, 0)) < 0) 84 if ((sock [1] = accept (listener, 0, 0)) < 0)
85 goto fail;
86
87 /* windows vista returns fantasy port numbers for sockets:
88 * example for two interconnected tcp sockets:
89 *
90 * (Socket::unpack_sockaddr_in getsockname $sock0)[0] == 53364
91 * (Socket::unpack_sockaddr_in getpeername $sock0)[0] == 53363
92 * (Socket::unpack_sockaddr_in getsockname $sock1)[0] == 53363
93 * (Socket::unpack_sockaddr_in getpeername $sock1)[0] == 53365
94 *
95 * wow! tridirectional sockets!
96 *
97 * this way of checking ports seems to work:
98 */
99 if (getpeername (sock [0], (struct sockaddr *)&addr, &addr_size))
100 goto fail;
101
102 if (getsockname (sock [1], (struct sockaddr *)&adr2, &adr2_size))
103 goto fail;
104
105 errno = WSAEINVAL;
106 if (addr_size != adr2_size
107 || addr.sin_addr.s_addr != adr2.sin_addr.s_addr /* just to be sure, I mean, it's windows */
108 || addr.sin_port != adr2.sin_port)
80 goto fail; 109 goto fail;
81 110
82 closesocket (listener); 111 closesocket (listener);
83 112
84#if EV_SELECT_IS_WINSOCKET 113#if EV_SELECT_IS_WINSOCKET

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines