MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ndb_socket_win32.h
1 /*
2  Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; version 2 of the License.
7 
8  This program is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  GNU General Public License for more details.
12 
13  You should have received a copy of the GNU General Public License
14  along with this program; if not, write to the Free Software
15  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
16 */
17 
18 #include <winsock2.h>
19 #include <ws2tcpip.h>
20 
21 /* Link with winsock library */
22 #pragma comment(lib, "ws2_32")
23 
24 #include <ndb_global.h>
25 
26 #define MY_SOCKET_FORMAT "%p"
27 #define MY_SOCKET_FORMAT_VALUE(x) (x.s)
28 
29 typedef SOCKET ndb_native_socket_t;
30 typedef struct { SOCKET s; } ndb_socket_t;
31 
32 static inline ndb_native_socket_t
33 ndb_socket_get_native(ndb_socket_t s)
34 {
35  return s.s;
36 }
37 
38 static inline int my_socket_valid(ndb_socket_t s)
39 {
40  return (s.s != INVALID_SOCKET);
41 }
42 
43 static inline ndb_socket_t* my_socket_invalidate(ndb_socket_t *s)
44 {
45  s->s= INVALID_SOCKET;
46  return s;
47 }
48 
49 static inline ndb_socket_t my_socket_create_invalid()
50 {
51  ndb_socket_t s;
52  my_socket_invalidate(&s);
53  return s;
54 }
55 
56 static inline SOCKET my_socket_get_fd(ndb_socket_t s)
57 {
58  return s.s;
59 }
60 
61 static inline int my_socket_close(ndb_socket_t s)
62 {
63  return closesocket(s.s);
64 }
65 
66 static inline int my_socket_errno()
67 {
68  return WSAGetLastError();
69 }
70 
71 static inline void my_socket_set_errno(int error)
72 {
73  WSASetLastError(error);
74 }
75 
76 static inline ndb_socket_t my_socket_create(int domain, int type, int protocol)
77 {
78  ndb_socket_t s;
79  s.s= socket(domain, type, protocol);
80 
81  return s;
82 }
83 
84 static inline ssize_t my_recv(ndb_socket_t s, char* buf, size_t len, int flags)
85 {
86  int ret= recv(s.s, buf, (int)len, flags);
87  if (ret == SOCKET_ERROR)
88  return -1;
89  return ret;
90 }
91 
92 static inline
93 ssize_t my_send(ndb_socket_t s, const char* buf, size_t len, int flags)
94 {
95  int ret= send(s.s, buf, (int)len, flags);
96  if (ret == SOCKET_ERROR)
97  return -1;
98  return ret;
99 }
100 
101 static inline int my_socket_reuseaddr(ndb_socket_t s, int enable)
102 {
103  const int on = enable;
104  return setsockopt(s.s, SOL_SOCKET, SO_REUSEADDR,
105  (const char*)&on, sizeof(on));
106 }
107 
108 static inline int my_socket_nonblock(ndb_socket_t s, int enable)
109 {
110  unsigned long ul = enable;
111 
112  if(ioctlsocket(s.s, FIONBIO, &ul))
113  return my_socket_errno();
114 
115  return 0;
116 }
117 
118 static inline int my_bind(ndb_socket_t s, const struct sockaddr *my_addr,
119  SOCKET_SIZE_TYPE len)
120 {
121  return bind(s.s, my_addr, len);
122 }
123 
124 static inline int my_bind_inet(ndb_socket_t s, const struct sockaddr_in *my_addr)
125 {
126  return bind(s.s, (const struct sockaddr*)my_addr, sizeof(struct sockaddr_in));
127 }
128 
129 static inline int my_socket_get_port(ndb_socket_t s, unsigned short *port)
130 {
131  struct sockaddr_in servaddr;
132  SOCKET_SIZE_TYPE sock_len = sizeof(servaddr);
133  if(getsockname(s.s, (struct sockaddr*)&servaddr, &sock_len) < 0) {
134  return 1;
135  }
136 
137  *port= ntohs(servaddr.sin_port);
138  return 0;
139 }
140 
141 static inline int my_listen(ndb_socket_t s, int backlog)
142 {
143  return listen(s.s, backlog);
144 }
145 
146 static inline
147 ndb_socket_t my_accept(ndb_socket_t s, struct sockaddr *addr,
148  SOCKET_SIZE_TYPE *addrlen)
149 {
150  ndb_socket_t r;
151  r.s= accept(s.s, addr, addrlen);
152  return r;
153 }
154 
155 static inline int my_connect_inet(ndb_socket_t s, const struct sockaddr_in *addr)
156 {
157  return connect(s.s, (const struct sockaddr*) addr,
158  sizeof(struct sockaddr_in));
159 }
160 
161 static inline
162 int my_getsockopt(ndb_socket_t s, int level, int optname,
163  void *optval, SOCKET_SIZE_TYPE *optlen)
164 {
165  return getsockopt(s.s, level, optname, (char*)optval, optlen);
166 }
167 
168 static inline
169 int my_setsockopt(ndb_socket_t s, int level, int optname,
170  void *optval, SOCKET_SIZE_TYPE optlen)
171 {
172  return setsockopt(s.s, level, optname, (char*)optval, optlen);
173 }
174 
175 static inline int my_socket_connect_address(ndb_socket_t s, struct in_addr *a)
176 {
177  struct sockaddr_in addr;
178  SOCKET_SIZE_TYPE addrlen= sizeof(addr);
179  if(getpeername(s.s, (struct sockaddr*)&addr, &addrlen)==SOCKET_ERROR)
180  return my_socket_errno();
181 
182  *a= addr.sin_addr;
183  return 0;
184 }
185 
186 static inline int my_getpeername(ndb_socket_t s, struct sockaddr *a,
187  SOCKET_SIZE_TYPE *addrlen)
188 {
189  if(getpeername(s.s, a, addrlen))
190  return my_socket_errno();
191 
192  return 0;
193 }
194 
195 static inline int my_shutdown(ndb_socket_t s, int how)
196 {
197  return shutdown(s.s, how);
198 }
199 
200 static inline int my_socket_equal(ndb_socket_t s1, ndb_socket_t s2)
201 {
202  return s1.s==s2.s;
203 }
204 
205 /*
206  * NOTE: the order of len and base are *DIFFERENT* on Linux and Win32.
207  * casting our iovec to a WSABUF is fine as it's the same structure,
208  * just with different names for the members.
209  */
210 struct iovec {
211  u_long iov_len; /* 'u_long len' in WSABUF */
212  void* iov_base; /* 'char* buf' in WSABUF */
213 };
214 
215 static inline ssize_t my_socket_readv(ndb_socket_t s, const struct iovec *iov,
216  int iovcnt)
217 {
218  DWORD rv=0;
219  if (WSARecv(s.s,(LPWSABUF)iov,iovcnt,&rv,0,0,0) == SOCKET_ERROR)
220  return -1;
221  return rv;
222 }
223 
224 static inline ssize_t my_socket_writev(ndb_socket_t s, const struct iovec *iov,
225  int iovcnt)
226 {
227  DWORD rv=0;
228  if (WSASend(s.s,(LPWSABUF)iov,iovcnt,&rv,0,0,0) == SOCKET_ERROR)
229  return -1;
230  return rv;
231 }