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.6 by root, Fri Jun 20 23:31:19 2008 UTC vs.
Revision 1.7 by root, Fri Jan 2 22:39:31 2009 UTC

52static int 52static int
53ev_pipe (int filedes [2]) 53ev_pipe (int filedes [2])
54{ 54{
55 struct sockaddr_in addr = { 0 }; 55 struct sockaddr_in addr = { 0 };
56 int addr_size = sizeof (addr); 56 int addr_size = sizeof (addr);
57 struct sockaddr_in adr2;
58 int adr2_size;
57 SOCKET listener; 59 SOCKET listener;
58 SOCKET sock [2] = { -1, -1 }; 60 SOCKET sock [2] = { -1, -1 };
59 61
60 if ((listener = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 62 if ((listener = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
61 return -1; 63 return -1;
65 addr.sin_port = 0; 67 addr.sin_port = 0;
66 68
67 if (bind (listener, (struct sockaddr *)&addr, addr_size)) 69 if (bind (listener, (struct sockaddr *)&addr, addr_size))
68 goto fail; 70 goto fail;
69 71
70 if (getsockname(listener, (struct sockaddr *)&addr, &addr_size)) 72 if (getsockname (listener, (struct sockaddr *)&addr, &addr_size))
71 goto fail; 73 goto fail;
72 74
73 if (listen (listener, 1)) 75 if (listen (listener, 1))
74 goto fail; 76 goto fail;
75 77
76 if ((sock [0] = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 78 if ((sock [0] = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
77 goto fail; 79 goto fail;
78 80
79 if (connect (sock[0], (struct sockaddr *)&addr, addr_size)) 81 if (connect (sock [0], (struct sockaddr *)&addr, addr_size))
80 goto fail; 82 goto fail;
81 83
82 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 getpeername.
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)
83 goto fail; 109 goto fail;
84 110
85 closesocket (listener); 111 closesocket (listener);
86 112
87#if EV_SELECT_IS_WINSOCKET 113#if EV_SELECT_IS_WINSOCKET

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines