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.13 by root, Wed Aug 19 23:44:51 2009 UTC

1/* 1/*
2 * libev win32 compatibility cruft (_not_ a backend) 2 * libev win32 compatibility cruft (_not_ a backend)
3 * 3 *
4 * Copyright (c) 2007,2008 Marc Alexander Lehmann <libev@schmorp.de> 4 * Copyright (c) 2007,2008,2009 Marc Alexander Lehmann <libev@schmorp.de>
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without modifica- 7 * Redistribution and use in source and binary forms, with or without modifica-
8 * tion, are permitted provided that the following conditions are met: 8 * tion, are permitted provided that the following conditions are met:
9 * 9 *
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 = sizeof (adr2);
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 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)
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
88 filedes [0] = _open_osfhandle (sock [0], 0); 114 filedes [0] = EV_WIN32_HANDLE_TO_FD (sock [0]);
89 filedes [1] = _open_osfhandle (sock [1], 0); 115 filedes [1] = EV_WIN32_HANDLE_TO_FD (sock [1]);
90#else 116#else
91 /* when select isn't winsocket, we also expect socket, connect, accept etc. 117 /* when select isn't winsocket, we also expect socket, connect, accept etc.
92 * to work on fds */ 118 * to work on fds */
93 filedes [0] = sock [0]; 119 filedes [0] = sock [0];
94 filedes [1] = sock [1]; 120 filedes [1] = sock [1];
105 return -1; 131 return -1;
106} 132}
107 133
108#undef pipe 134#undef pipe
109#define pipe(filedes) ev_pipe (filedes) 135#define pipe(filedes) ev_pipe (filedes)
136
137#define EV_HAVE_EV_TIME 1
138ev_tstamp
139ev_time (void)
140{
141 FILETIME ft;
142 ULARGE_INTEGER ui;
110 143
111static int 144 GetSystemTimeAsFileTime (&ft);
112ev_gettimeofday (struct timeval *tv, struct timezone *tz) 145 ui.u.LowPart = ft.dwLowDateTime;
113{ 146 ui.u.HighPart = ft.dwHighDateTime;
114 struct _timeb tb;
115 147
116 _ftime (&tb); 148 /* msvc cannot convert ulonglong to double... yes, it is that sucky */
117 149 return (LONGLONG)(ui.QuadPart - 116444736000000000) * 1e-7;
118 tv->tv_sec = (long)tb.time;
119 tv->tv_usec = ((long)tb.millitm) * 1000;
120
121 return 0;
122} 150}
123
124#undef gettimeofday
125#define gettimeofday(tv,tz) ev_gettimeofday (tv, tz)
126 151
127#endif 152#endif
128 153

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines