Line | Branch | Exec | Source |
---|---|---|---|
1 | /* GATE PROJECT LICENSE: | ||
2 | +----------------------------------------------------------------------------+ | ||
3 | | Copyright(c) 2018-2025, Stefan Meislinger <sm@opengate.at> | | ||
4 | | All rights reserved. | | ||
5 | | | | ||
6 | | Redistribution and use in source and binary forms, with or without | | ||
7 | | modification, are permitted provided that the following conditions are met:| | ||
8 | | | | ||
9 | | 1. Redistributions of source code must retain the above copyright notice, | | ||
10 | | this list of conditions and the following disclaimer. | | ||
11 | | 2. Redistributions in binary form must reproduce the above copyright | | ||
12 | | notice, this list of conditions and the following disclaimer in the | | ||
13 | | documentation and/or other materials provided with the distribution. | | ||
14 | | | | ||
15 | | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"| | ||
16 | | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | | ||
17 | | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | | ||
18 | | ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | | ||
19 | | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | | ||
20 | | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | | ||
21 | | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | | ||
22 | | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | | ||
23 | | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | | ||
24 | | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF | | ||
25 | | THE POSSIBILITY OF SUCH DAMAGE. | | ||
26 | +----------------------------------------------------------------------------+ | ||
27 | */ | ||
28 | |||
29 | #include "gate/net/sockets.h" | ||
30 | #include "gate/results.h" | ||
31 | #include "gate/debugging.h" | ||
32 | |||
33 | #if defined(GATE_SYS_EFI) | ||
34 | # define GATE_NET_SOCKETS_EFI 1 | ||
35 | #elif defined(GATE_SYS_WIN) || defined(GATE_SYS_POSIX) | ||
36 | # define GATE_NET_SOCKETS_BSDIMPL 1 | ||
37 | #else | ||
38 | # define GATE_NET_SOCKETS_NOIMPL 1 | ||
39 | #endif | ||
40 | |||
41 | |||
42 | /* GENERIC Implementations: */ | ||
43 | |||
44 | 25 | int gate_compare_socket(void const* item1, void const* item2) | |
45 | { | ||
46 | 25 | gate_socket_t const* sock1 = (gate_socket_t const*)item1; | |
47 | 25 | gate_socket_t const* sock2 = (gate_socket_t const*)item2; | |
48 |
2/2✓ Branch 0 taken 12 times.
✓ Branch 1 taken 13 times.
|
25 | if (*sock1 == *sock2) |
49 | { | ||
50 | 12 | return 0; | |
51 | } | ||
52 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
|
13 | else if (*sock1 < *sock2) |
53 | { | ||
54 | ✗ | return -1; | |
55 | } | ||
56 | else | ||
57 | { | ||
58 | 13 | return +1; | |
59 | } | ||
60 | } | ||
61 | |||
62 | |||
63 | |||
64 | |||
65 | #if defined(GATE_NET_SOCKETS_BSDIMPL) | ||
66 | |||
67 | #include "gate/net/platform/socket_api.h" | ||
68 | |||
69 | static gate_net_platform_socket_api_t api; | ||
70 | |||
71 | #if defined(GATE_SYS_WIN) | ||
72 | |||
73 | #if defined(GATE_WIN32_ANSI) | ||
74 | # define GATE_NET_SOCKET_NO_IPV6 1 | ||
75 | # define GATE_NET_SOCKET_NO_UNIX 1 | ||
76 | #else | ||
77 | # if !defined(GATE_COMPILER_MSVC2017) | ||
78 | # define GATE_NET_SOCKET_NO_UNIX 1 | ||
79 | # endif | ||
80 | #endif | ||
81 | |||
82 | # if !defined(GATE_NET_SOCKET_NO_UNIX) | ||
83 | # include <afunix.h> | ||
84 | # endif | ||
85 | |||
86 | |||
87 | # ifndef SD_RECEIVE | ||
88 | # define SD_RECEIVE 0x00 | ||
89 | # endif | ||
90 | # ifndef SD_SEND | ||
91 | # define SD_SEND 0x01 | ||
92 | # endif | ||
93 | # ifndef SD_BOTH | ||
94 | # define SD_BOTH 0x02 | ||
95 | # endif | ||
96 | |||
97 | |||
98 | static gate_result_t gate_socket_set_blocking(gate_socket_t sock, gate_bool_t blocking) | ||
99 | { | ||
100 | gate_result_t ret; | ||
101 | sock_fd_t s = (sock_fd_t)sock; | ||
102 | u_long ctl = blocking ? 0 : 1; | ||
103 | if (-1 == api.sock_ioctl(s, FIONBIO, &ctl)) | ||
104 | { | ||
105 | ret = GATE_RESULT_FAILED; | ||
106 | } | ||
107 | else | ||
108 | { | ||
109 | ret = GATE_RESULT_OK; | ||
110 | } | ||
111 | return ret; | ||
112 | } | ||
113 | |||
114 | gate_bool_t gate_socket_ipv6_support(); | ||
115 | |||
116 | |||
117 | #endif /* defined(GATE_SYS_WIN) */ | ||
118 | |||
119 | #if defined(GATE_SYS_POSIX) | ||
120 | |||
121 | # define GATE_NET_SOCKET_NO_UNIX | ||
122 | |||
123 | typedef struct timeval TIMEVAL; | ||
124 | |||
125 | # define SOCKET_ERROR_WOULDBLOCK ((int)EINPROGRESS) | ||
126 | # if !defined(INVALID_SOCKET) | ||
127 | # define INVALID_SOCKET ((int)-1) | ||
128 | # endif | ||
129 | # if !defined(SOCKET_ERROR) | ||
130 | # define SOCKET_ERROR (-1) | ||
131 | # endif | ||
132 | # if !defined(SD_RECEIVE) | ||
133 | # define SD_RECEIVE SHUT_RD | ||
134 | # endif | ||
135 | # if !defined(SD_SEND) | ||
136 | # define SD_SEND SHUT_WR | ||
137 | # endif | ||
138 | # if !defined(SD_BOTH) | ||
139 | # define SD_BOTH SHUT_RDWR | ||
140 | # endif | ||
141 | |||
142 | 5 | static gate_result_t gate_socket_set_blocking(gate_socket_t sock, gate_bool_t blocking) | |
143 | { | ||
144 | gate_result_t ret; | ||
145 | 5 | sock_fd_t s = (sock_fd_t)sock; | |
146 | 5 | long flags = fcntl(s, F_GETFL, NULL); | |
147 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
5 | if (-1 == flags) |
148 | { | ||
149 | ✗ | ret = GATE_RESULT_FAILED; | |
150 | } | ||
151 | else | ||
152 | { | ||
153 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2 times.
|
5 | if (blocking) |
154 | { | ||
155 | 3 | flags &= ~(long)O_NONBLOCK; | |
156 | } | ||
157 | else | ||
158 | { | ||
159 | 2 | flags |= O_NONBLOCK; | |
160 | } | ||
161 | |||
162 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
|
5 | if (-1 == fcntl(s, F_SETFL, flags)) |
163 | { | ||
164 | ✗ | ret = GATE_RESULT_FAILED; | |
165 | } | ||
166 | else | ||
167 | { | ||
168 | 5 | ret = GATE_RESULT_OK; | |
169 | } | ||
170 | } | ||
171 | 5 | return ret; | |
172 | } | ||
173 | ✗ | static int gate_socket_last_error() | |
174 | { | ||
175 | ✗ | return errno; | |
176 | } | ||
177 | |||
178 | #endif /*defined(GATE_SYS_POSIX)*/ | ||
179 | |||
180 | |||
181 | typedef union gate_socket_addr_storage | ||
182 | { | ||
183 | struct sockaddr addr; | ||
184 | struct sockaddr_in addr4; | ||
185 | #if !defined(GATE_NET_SOCKET_NO_IPV6) | ||
186 | struct sockaddr_in6 addr6; | ||
187 | #endif | ||
188 | #if !defined(GATE_NET_SOCKET_NO_UNIX) | ||
189 | struct sockaddr_un unix; | ||
190 | #endif | ||
191 | } gate_socket_addr_storage_t; | ||
192 | |||
193 | static gate_atomic_int_t sockets_created = 0; | ||
194 | static gate_atomic_int_t sockets_released = 0; | ||
195 | |||
196 | 21 | gate_result_t gate_socket_init() | |
197 | { | ||
198 | 21 | gate_result_t ret = gate_socket_api_load(&api); | |
199 | 21 | return ret; | |
200 | } | ||
201 | |||
202 | 2 | gate_bool_t gate_socket_support(gate_int16_t family) | |
203 | { | ||
204 |
1/3✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | switch (family) |
205 | { | ||
206 | |||
207 | #if !defined(GATE_NET_SOCKET_NO_UNIX) | ||
208 | case GATE_SOCKET_FAMILY_UNIX: return true; | ||
209 | #endif | ||
210 | |||
211 | ✗ | case GATE_SOCKET_FAMILY_INET4: return true; | |
212 | |||
213 | #if !defined(GATE_NET_SOCKET_NO_IPV6) | ||
214 | 2 | case GATE_SOCKET_FAMILY_INET6: return true; | |
215 | #endif | ||
216 | } | ||
217 | ✗ | return false; | |
218 | } | ||
219 | |||
220 | |||
221 | 6 | gate_result_t gate_socket_create(gate_int16_t type, gate_socket_t* sock) | |
222 | { | ||
223 | gate_result_t ret; | ||
224 |
4/7✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
|
6 | switch (type) |
225 | { | ||
226 | 3 | case GATE_SOCKET_TYPE_TCP4: | |
227 | { | ||
228 | 3 | ret = gate_socket_create_ex(GATE_SOCKET_FAMILY_INET4, GATE_SOCKET_MSGTYPE_STREAM, GATE_SOCKET_PROTOCOL_TCP, sock); | |
229 | 3 | break; | |
230 | } | ||
231 | 1 | case GATE_SOCKET_TYPE_UDP4: | |
232 | { | ||
233 | 1 | ret = gate_socket_create_ex(GATE_SOCKET_FAMILY_INET4, GATE_SOCKET_MSGTYPE_DATAGRAM, GATE_SOCKET_PROTOCOL_UDP, sock); | |
234 | 1 | break; | |
235 | } | ||
236 | ✗ | case GATE_SOCKET_TYPE_ICMP4: | |
237 | { | ||
238 | ✗ | ret = gate_socket_create_ex(GATE_SOCKET_FAMILY_INET4, GATE_SOCKET_MSGTYPE_RAW, GATE_SOCKET_PROTOCOL_ICMP, sock); | |
239 | ✗ | break; | |
240 | } | ||
241 | 1 | case GATE_SOCKET_TYPE_TCP6: | |
242 | { | ||
243 | 1 | ret = gate_socket_create_ex(GATE_SOCKET_FAMILY_INET6, GATE_SOCKET_MSGTYPE_STREAM, GATE_SOCKET_PROTOCOL_TCP, sock); | |
244 | 1 | break; | |
245 | } | ||
246 | 1 | case GATE_SOCKET_TYPE_UDP6: | |
247 | { | ||
248 | 1 | ret = gate_socket_create_ex(GATE_SOCKET_FAMILY_INET6, GATE_SOCKET_MSGTYPE_DATAGRAM, GATE_SOCKET_PROTOCOL_UDP, sock); | |
249 | 1 | break; | |
250 | } | ||
251 | ✗ | case GATE_SOCKET_TYPE_ICMP6: | |
252 | { | ||
253 | ✗ | ret = gate_socket_create_ex(GATE_SOCKET_FAMILY_INET6, GATE_SOCKET_MSGTYPE_RAW, GATE_SOCKET_PROTOCOL_ICMP6, sock); | |
254 | ✗ | break; | |
255 | } | ||
256 | ✗ | default: | |
257 | { | ||
258 | ✗ | ret = GATE_RESULT_NOTSUPPORTED; | |
259 | } | ||
260 | } | ||
261 | 6 | return ret; | |
262 | } | ||
263 | |||
264 | #ifndef AF_BTH | ||
265 | # define AF_BTH 32 | ||
266 | #endif | ||
267 | |||
268 | 14 | gate_result_t gate_socket_create_ex(gate_int16_t family, gate_int16_t msgtype, gate_int16_t protocol, gate_socket_t* sock) | |
269 | { | ||
270 | int af; | ||
271 | int type; | ||
272 | int proto; | ||
273 | int tmp; | ||
274 | 14 | sock_fd_t s = INVALID_SOCKET; | |
275 | gate_result_t ret; | ||
276 | |||
277 | 14 | ret = gate_socket_init(); | |
278 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
|
14 | if (GATE_FAILED(ret)) |
279 | { | ||
280 | ✗ | return ret; | |
281 | } | ||
282 | 14 | ret = gate_socket_session_init(); | |
283 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
|
14 | if (GATE_FAILED(ret)) |
284 | { | ||
285 | ✗ | return ret; | |
286 | } | ||
287 | |||
288 | |||
289 | do | ||
290 | { | ||
291 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
14 | switch (family) |
292 | { | ||
293 | ✗ | case GATE_SOCKET_FAMILY_UNIX: af = AF_UNIX; break; | |
294 | 10 | case GATE_SOCKET_FAMILY_INET4: af = AF_INET; break; | |
295 | ✗ | case GATE_SOCKET_FAMILY_IPX: af = AF_IPX; break; | |
296 | ✗ | case GATE_SOCKET_FAMILY_APPLETALK: af = AF_APPLETALK; break; | |
297 | #if defined(AF_NETBIOS) | ||
298 | case GATE_SOCKET_FAMILY_NETBIOS: af = AF_NETBIOS; break; | ||
299 | #endif | ||
300 | #if defined(AF_ATM) | ||
301 | case GATE_SOCKET_FAMILY_ATM: af = AF_ATM; break; | ||
302 | #endif | ||
303 | #if defined(AF_INET6) | ||
304 | 4 | case GATE_SOCKET_FAMILY_INET6: af = AF_INET6; break; | |
305 | #endif | ||
306 | #if defined(AF_IRDA) | ||
307 | ✗ | case GATE_SOCKET_FAMILY_IRDA: af = AF_IRDA; break; | |
308 | #endif | ||
309 | ✗ | case GATE_SOCKET_FAMILY_BTH: af = AF_BTH; break; | |
310 | ✗ | default: af = -1; break; | |
311 | } | ||
312 | |||
313 |
2/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
14 | switch (msgtype) |
314 | { | ||
315 | 10 | case GATE_SOCKET_MSGTYPE_STREAM: type = SOCK_STREAM; break; | |
316 | 4 | case GATE_SOCKET_MSGTYPE_DATAGRAM: type = SOCK_DGRAM; break; | |
317 | ✗ | case GATE_SOCKET_MSGTYPE_RAW: type = SOCK_RAW; break; | |
318 | ✗ | default: type = -1; break; | |
319 | } | ||
320 | |||
321 |
3/8✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
14 | switch (protocol) |
322 | { | ||
323 | 1 | case GATE_SOCKET_PROTOCOL_IP: proto = IPPROTO_IP; break; | |
324 | ✗ | case GATE_SOCKET_PROTOCOL_ICMP: proto = IPPROTO_ICMP; break; | |
325 | #if defined(IPPROTO_IGMP) | ||
326 | ✗ | case GATE_SOCKET_PROTOCOL_IGMP: proto = IPPROTO_IGMP; break; | |
327 | #endif | ||
328 | 9 | case GATE_SOCKET_PROTOCOL_TCP: proto = IPPROTO_TCP; break; | |
329 | 4 | case GATE_SOCKET_PROTOCOL_UDP: proto = IPPROTO_UDP; break; | |
330 | #if defined(IPPROTO_IPV6) | ||
331 | ✗ | case GATE_SOCKET_PROTOCOL_IP6: proto = IPPROTO_IPV6; break; | |
332 | #endif | ||
333 | ✗ | case GATE_SOCKET_PROTOCOL_ICMP6: proto = IPPROTO_ICMP; break; | |
334 | ✗ | default: proto = -1; break; | |
335 | } | ||
336 | |||
337 |
3/6✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 14 times.
|
14 | if ((af == -1) || (type == -1) || (proto == -1)) |
338 | { | ||
339 | ✗ | ret = GATE_RESULT_NOTSUPPORTED; | |
340 | ✗ | break; | |
341 | } | ||
342 | |||
343 | 14 | s = api.sock_socket(af, type, proto); | |
344 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
|
14 | if (s == INVALID_SOCKET) |
345 | { | ||
346 | ✗ | GATE_DEBUG_TRACE("socket() failed"); | |
347 | ✗ | gate_socket_session_uninit(); | |
348 | ✗ | ret = GATE_RESULT_NOTSUPPORTED; | |
349 | } | ||
350 | else | ||
351 | { | ||
352 | 14 | *sock = (gate_socket_t)s; | |
353 | |||
354 | #if defined(GATE_SYS_WIN) && !defined(GATE_SYS_WINCE) && !defined(GATE_SYS_WINSTORE) && !defined(GATE_SYS_WIN16) | ||
355 | /* disable socket inheritage to child processes */ | ||
356 | SetHandleInformation((HANDLE)s, HANDLE_FLAG_INHERIT, 0); | ||
357 | #endif | ||
358 | |||
359 | #if defined(SO_EXCLUSIVEADDRUSE) | ||
360 | /* Windows: disable SO_REUSEADDR on this socket */ | ||
361 | tmp = 1; | ||
362 | api.sock_setsockopt(s, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, (char*)&tmp, sizeof(tmp)); | ||
363 | #endif | ||
364 | |||
365 | #if defined(IPV6_V6ONLY) && defined(IPPROTO_IPV6) | ||
366 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 10 times.
|
14 | if (family == GATE_SOCKET_FAMILY_INET6) |
367 | { | ||
368 | /* disable automatic binding to IPv4 address, if IPv6 was specified */ | ||
369 | 4 | tmp = 1; | |
370 | 4 | api.sock_setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&tmp, sizeof(tmp)); | |
371 | } | ||
372 | #endif | ||
373 | } | ||
374 | |||
375 | } while (0); | ||
376 | |||
377 | #if defined(GATE_DEBUG_MODE) | ||
378 |
1/2✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
|
14 | if (GATE_SUCCEEDED(ret)) |
379 | { | ||
380 | 14 | gate_int32_t sockets_created_counter = gate_atomic_int_inc(&sockets_created); | |
381 | 14 | GATE_DEBUG_TRACE_VALUE(sockets_created_counter); | |
382 | } | ||
383 | #endif | ||
384 | 14 | return ret; | |
385 | } | ||
386 | |||
387 | 10 | static gate_size_t gate_socket_build_addr_ip4(gate_socket_ip4endpoint_t const* src, struct sockaddr_in* dst) | |
388 | { | ||
389 | 20 | gate_uint32_t ip = ((gate_uint32_t)(src->address.item[0]) << 24) | |
390 | 10 | | ((gate_uint32_t)(src->address.item[1]) << 16) | |
391 | 10 | | ((gate_uint32_t)(src->address.item[2]) << 8) | |
392 | 10 | | ((gate_uint32_t)(src->address.item[3])) | |
393 | ; | ||
394 | 10 | gate_mem_clear(dst, sizeof(struct sockaddr_in)); | |
395 | 10 | dst->sin_family = AF_INET; | |
396 | 10 | dst->sin_port = api.sock_htons(src->port); | |
397 | 10 | dst->sin_addr.s_addr = api.sock_htonl(ip); | |
398 | 10 | return sizeof(struct sockaddr_in); | |
399 | } | ||
400 | |||
401 | 9 | static void gate_socket_build_ip4address(struct sockaddr_in const* src, gate_socket_ip4endpoint_t* dst) | |
402 | { | ||
403 | 9 | gate_uint32_t ip = api.sock_ntohl(src->sin_addr.s_addr); | |
404 | 9 | dst->family = GATE_SOCKET_FAMILY_INET4; | |
405 | 9 | dst->port = api.sock_ntohs(src->sin_port); | |
406 | 9 | dst->address.item[0] = (gate_uint8_t)((ip >> 24) & 0x0ff); | |
407 | 9 | dst->address.item[1] = (gate_uint8_t)((ip >> 16) & 0x0ff); | |
408 | 9 | dst->address.item[2] = (gate_uint8_t)((ip >> 8) & 0x0ff); | |
409 | 9 | dst->address.item[3] = (gate_uint8_t)((ip) & 0x0ff); | |
410 | 9 | } | |
411 | |||
412 | #if !defined(GATE_NET_SOCKET_NO_IPV6) | ||
413 | 5 | static gate_size_t gate_socket_build_addr_ip6(gate_socket_ip6endpoint_t const* src, struct sockaddr_in6* dst) | |
414 | { | ||
415 | 5 | gate_mem_clear(dst, sizeof(struct sockaddr_in6)); | |
416 | 5 | dst->sin6_family = AF_INET6; | |
417 | 5 | dst->sin6_port = api.sock_htons(src->port); | |
418 | #if !defined(GATE_COMPILER_MSVC98) | ||
419 | 5 | dst->sin6_scope_id = src->scope; | |
420 | #endif | ||
421 | 5 | dst->sin6_flowinfo = 0; | |
422 | 5 | dst->sin6_addr.s6_addr[0] = (gate_uint8_t)((src->address.item[0] >> 8) & 0x0ff); | |
423 | 5 | dst->sin6_addr.s6_addr[1] = (gate_uint8_t)((src->address.item[0]) & 0x0ff); | |
424 | 5 | dst->sin6_addr.s6_addr[2] = (gate_uint8_t)((src->address.item[1] >> 8) & 0x0ff); | |
425 | 5 | dst->sin6_addr.s6_addr[3] = (gate_uint8_t)((src->address.item[1]) & 0x0ff); | |
426 | 5 | dst->sin6_addr.s6_addr[4] = (gate_uint8_t)((src->address.item[2] >> 8) & 0x0ff); | |
427 | 5 | dst->sin6_addr.s6_addr[5] = (gate_uint8_t)((src->address.item[2]) & 0x0ff); | |
428 | 5 | dst->sin6_addr.s6_addr[6] = (gate_uint8_t)((src->address.item[3] >> 8) & 0x0ff); | |
429 | 5 | dst->sin6_addr.s6_addr[7] = (gate_uint8_t)((src->address.item[3]) & 0x0ff); | |
430 | 5 | dst->sin6_addr.s6_addr[8] = (gate_uint8_t)((src->address.item[4] >> 8) & 0x0ff); | |
431 | 5 | dst->sin6_addr.s6_addr[9] = (gate_uint8_t)((src->address.item[4]) & 0x0ff); | |
432 | 5 | dst->sin6_addr.s6_addr[10] = (gate_uint8_t)((src->address.item[5] >> 8) & 0x0ff); | |
433 | 5 | dst->sin6_addr.s6_addr[11] = (gate_uint8_t)((src->address.item[5]) & 0x0ff); | |
434 | 5 | dst->sin6_addr.s6_addr[12] = (gate_uint8_t)((src->address.item[6] >> 8) & 0x0ff); | |
435 | 5 | dst->sin6_addr.s6_addr[13] = (gate_uint8_t)((src->address.item[6]) & 0x0ff); | |
436 | 5 | dst->sin6_addr.s6_addr[14] = (gate_uint8_t)((src->address.item[7] >> 8) & 0x0ff); | |
437 | 5 | dst->sin6_addr.s6_addr[15] = (gate_uint8_t)((src->address.item[7]) & 0x0ff); | |
438 | 5 | return sizeof(struct sockaddr_in6); | |
439 | } | ||
440 | 3 | static void gate_socket_build_ip6address(struct sockaddr_in6 const* src, gate_socket_ip6endpoint_t* dst) | |
441 | { | ||
442 | 3 | dst->family = GATE_SOCKET_FAMILY_INET6; | |
443 | 3 | dst->port = api.sock_ntohs(src->sin6_port); | |
444 | #if !defined(GATE_COMPILER_MSVC98) | ||
445 | 3 | dst->scope = src->sin6_scope_id; | |
446 | #endif | ||
447 | 3 | dst->address.item[0] = (((gate_uint16_t)src->sin6_addr.s6_addr[0]) << 8) | ((gate_uint16_t)src->sin6_addr.s6_addr[1]); | |
448 | 3 | dst->address.item[1] = (((gate_uint16_t)src->sin6_addr.s6_addr[2]) << 8) | ((gate_uint16_t)src->sin6_addr.s6_addr[3]); | |
449 | 3 | dst->address.item[2] = (((gate_uint16_t)src->sin6_addr.s6_addr[4]) << 8) | ((gate_uint16_t)src->sin6_addr.s6_addr[5]); | |
450 | 3 | dst->address.item[3] = (((gate_uint16_t)src->sin6_addr.s6_addr[6]) << 8) | ((gate_uint16_t)src->sin6_addr.s6_addr[7]); | |
451 | 3 | dst->address.item[4] = (((gate_uint16_t)src->sin6_addr.s6_addr[8]) << 8) | ((gate_uint16_t)src->sin6_addr.s6_addr[9]); | |
452 | 3 | dst->address.item[5] = (((gate_uint16_t)src->sin6_addr.s6_addr[10]) << 8) | ((gate_uint16_t)src->sin6_addr.s6_addr[11]); | |
453 | 3 | dst->address.item[6] = (((gate_uint16_t)src->sin6_addr.s6_addr[12]) << 8) | ((gate_uint16_t)src->sin6_addr.s6_addr[13]); | |
454 | 3 | dst->address.item[7] = (((gate_uint16_t)src->sin6_addr.s6_addr[14]) << 8) | ((gate_uint16_t)src->sin6_addr.s6_addr[15]); | |
455 | 3 | } | |
456 | #endif | ||
457 | |||
458 | |||
459 | 5 | gate_result_t gate_socket_connect(gate_socket_t sock, gate_socket_endpoint_t const* ep) | |
460 | { | ||
461 | 5 | gate_result_t ret = GATE_RESULT_FAILED; | |
462 | 5 | sock_fd_t s = (sock_fd_t)sock; | |
463 | gate_socket_addr_storage_t addr; | ||
464 | do | ||
465 | { | ||
466 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
5 | if (ep == NULL) |
467 | { | ||
468 | ✗ | ret = GATE_RESULT_INVALIDARG; | |
469 | ✗ | break; | |
470 | } | ||
471 |
2/3✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
5 | switch (ep->family) |
472 | { | ||
473 | 4 | case GATE_SOCKET_FAMILY_INET4: | |
474 | { | ||
475 | 4 | const sock_socklen_t addrlen = (sock_socklen_t)gate_socket_build_addr_ip4(&ep->ip4, &addr.addr4); | |
476 | |||
477 |
2/2✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
|
4 | if (0 == api.sock_connect(s, (struct sockaddr const*)&addr.addr4, addrlen)) |
478 | { | ||
479 | 3 | ret = GATE_RESULT_OK; | |
480 | } | ||
481 | else | ||
482 | { | ||
483 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | if (SOCKET_ERROR_WOULDBLOCK == api.sock_errno()) |
484 | { | ||
485 | 1 | ret = GATE_RESULT_OK; | |
486 | } | ||
487 | else | ||
488 | { | ||
489 | ✗ | GATE_DEBUG_TRACE("connect() failed"); | |
490 | } | ||
491 | } | ||
492 | 4 | break; | |
493 | } | ||
494 | 1 | case GATE_SOCKET_FAMILY_INET6: | |
495 | { | ||
496 | #if defined(GATE_NET_SOCKET_NO_IPV6) | ||
497 | ret = GATE_RESULT_NOTSUPPORTED; | ||
498 | #else | ||
499 | 1 | const sock_socklen_t addrlen = (sock_socklen_t)gate_socket_build_addr_ip6(&ep->ip6, &addr.addr6); | |
500 | |||
501 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
|
1 | if (0 == api.sock_connect(s, (struct sockaddr const*)&addr.addr6, addrlen)) |
502 | { | ||
503 | ✗ | ret = GATE_RESULT_OK; | |
504 | } | ||
505 | else | ||
506 | { | ||
507 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | if (SOCKET_ERROR_WOULDBLOCK == api.sock_errno()) |
508 | { | ||
509 | 1 | ret = GATE_RESULT_OK; | |
510 | } | ||
511 | else | ||
512 | { | ||
513 | ✗ | GATE_DEBUG_TRACE("connect() failed"); | |
514 | } | ||
515 | } | ||
516 | #endif | ||
517 | 1 | break; | |
518 | } | ||
519 | ✗ | default: | |
520 | { | ||
521 | ✗ | GATE_DEBUG_TRACE("Unsupported socket family"); | |
522 | ✗ | ret = GATE_RESULT_NOTSUPPORTED; | |
523 | ✗ | break; | |
524 | } | ||
525 | } | ||
526 | |||
527 | } while (0); | ||
528 | |||
529 | 5 | return ret; | |
530 | } | ||
531 | |||
532 | 2 | gate_result_t gate_socket_connect_address(gate_socket_t sock, gate_string_t const* address) | |
533 | { | ||
534 | 2 | gate_socket_endpoint_t ep = GATE_INIT_EMPTY; | |
535 | 2 | gate_result_t ret = gate_socket_parse_endpoint(address, &ep); | |
536 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2 | if (GATE_SUCCEEDED(ret)) |
537 | { | ||
538 | 2 | ret = gate_socket_connect(sock, &ep); | |
539 | } | ||
540 | 2 | return ret; | |
541 | } | ||
542 | |||
543 | 8 | gate_result_t gate_socket_bind(gate_socket_t sock, gate_socket_endpoint_t const* ep) | |
544 | { | ||
545 | gate_result_t ret; | ||
546 | gate_socket_addr_storage_t addr; | ||
547 |
2/3✓ Branch 0 taken 5 times.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
8 | switch (ep->family) |
548 | { | ||
549 | 5 | case GATE_SOCKET_FAMILY_INET4: | |
550 | { | ||
551 | 5 | const sock_socklen_t addrlen = (sock_socklen_t)gate_socket_build_addr_ip4(&ep->ip4, &addr.addr4); | |
552 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
|
5 | if (0 != api.sock_bind((sock_fd_t)sock, (struct sockaddr const*)&addr.addr4, addrlen)) |
553 | { | ||
554 | ✗ | GATE_DEBUG_TRACE_PLATFORM_ERROR("sock_bind(IPv4) failed"); | |
555 | ✗ | ret = GATE_RESULT_FAILED; | |
556 | } | ||
557 | else | ||
558 | { | ||
559 | 5 | ret = GATE_RESULT_OK; | |
560 | } | ||
561 | 5 | break; | |
562 | } | ||
563 | 3 | case GATE_SOCKET_FAMILY_INET6: | |
564 | { | ||
565 | #if defined(GATE_NET_SOCKET_NO_IPV6) | ||
566 | ret = GATE_RESULT_NOTSUPPORTED; | ||
567 | #else | ||
568 | 3 | const sock_socklen_t addrlen = (sock_socklen_t)gate_socket_build_addr_ip6(&ep->ip6, &addr.addr6); | |
569 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
|
3 | if (0 != api.sock_bind((sock_fd_t)sock, (struct sockaddr const*)&addr.addr6, addrlen)) |
570 | { | ||
571 | ✗ | GATE_DEBUG_TRACE_PLATFORM_ERROR("sock_bind(IPv6) failed"); | |
572 | ✗ | ret = GATE_RESULT_FAILED; | |
573 | } | ||
574 | else | ||
575 | { | ||
576 | 3 | ret = GATE_RESULT_OK; | |
577 | } | ||
578 | #endif | ||
579 | 3 | break; | |
580 | } | ||
581 | ✗ | default: | |
582 | { | ||
583 | ✗ | ret = GATE_RESULT_NOTSUPPORTED; | |
584 | ✗ | break; | |
585 | } | ||
586 | } | ||
587 | 8 | return ret; | |
588 | } | ||
589 | |||
590 | 4 | gate_result_t gate_socket_bind_address(gate_socket_t sock, gate_string_t const* address) | |
591 | { | ||
592 | gate_socket_endpoint_t ep; | ||
593 | 4 | gate_result_t ret = gate_socket_parse_endpoint(address, &ep); | |
594 |
1/2✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
|
4 | if (GATE_SUCCEEDED(ret)) |
595 | { | ||
596 | 4 | ret = gate_socket_bind(sock, &ep); | |
597 | } | ||
598 | 4 | return ret; | |
599 | } | ||
600 | |||
601 | 3 | gate_result_t gate_socket_listen(gate_socket_t sock, gate_int32_t backlog) | |
602 | { | ||
603 | gate_result_t ret; | ||
604 | |||
605 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
|
3 | if (backlog == GATE_SOCKET_BACKLOG_DEFAULT) |
606 | { | ||
607 | ✗ | backlog = SOMAXCONN; | |
608 | } | ||
609 | |||
610 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
|
3 | if (0 != api.sock_listen((sock_fd_t)sock, (int)backlog)) |
611 | { | ||
612 | ✗ | const int error_code = api.sock_errno(); | |
613 | ✗ | GATE_DEBUG_TRACE_PLATFORM_ERROR("sock_listen() failed"); | |
614 | ✗ | ret = GATE_RESULT_FAILED; | |
615 | } | ||
616 | else | ||
617 | { | ||
618 | 3 | ret = GATE_RESULT_OK; | |
619 | } | ||
620 | 3 | return ret; | |
621 | } | ||
622 | 4 | gate_result_t gate_socket_accept(gate_socket_t sock, gate_socket_t* newsock) | |
623 | { | ||
624 | gate_result_t ret; | ||
625 | 4 | sock_fd_t sockaccepted = api.sock_accept((sock_fd_t)sock, NULL, 0); | |
626 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
4 | if (sockaccepted == -1) |
627 | { | ||
628 | ✗ | GATE_DEBUG_TRACE_PLATFORM_ERROR("sock_accept() failed"); | |
629 | ✗ | ret = GATE_RESULT_FAILED; | |
630 | } | ||
631 | else | ||
632 | { | ||
633 | 4 | ret = GATE_RESULT_OK; | |
634 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
4 | if (newsock == NULL) |
635 | { | ||
636 | ✗ | api.sock_close(sockaccepted); | |
637 | } | ||
638 | else | ||
639 | { | ||
640 | 4 | *newsock = (gate_socket_t)sockaccepted; | |
641 | #if defined(GATE_DEBUG_MODE) | ||
642 |
1/2✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
|
4 | if (GATE_SUCCEEDED(ret)) |
643 | { | ||
644 | 4 | gate_int32_t sockets_created_counter = gate_atomic_int_inc(&sockets_created); | |
645 | 4 | GATE_DEBUG_TRACE_VALUE(sockets_created_counter); | |
646 | } | ||
647 | #endif | ||
648 | } | ||
649 | #if defined(GATE_SYS_WIN) && !defined(GATE_SYS_WINCE) && !defined(GATE_SYS_WINSTORE) && !defined(GATE_SYS_WIN16) | ||
650 | SetHandleInformation((HANDLE)sockaccepted, HANDLE_FLAG_INHERIT, 0); | ||
651 | #endif | ||
652 | } | ||
653 | 4 | return ret; | |
654 | } | ||
655 | 85 | gate_result_t gate_socket_receive(gate_socket_t sock, char* buffer, gate_size_t bufferlen, gate_size_t* bufferused) | |
656 | { | ||
657 | gate_result_t ret; | ||
658 | |||
659 | 85 | int received = api.sock_recv((sock_fd_t)sock, buffer, (socklen_t)bufferlen, 0); | |
660 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 85 times.
|
85 | if (received == -1) |
661 | { | ||
662 | ✗ | GATE_DEBUG_TRACE_PLATFORM_ERROR("sock_recv() failed"); | |
663 | ✗ | ret = GATE_RESULT_FAILED; | |
664 | #if defined(GATE_SYS_WIN) | ||
665 | /* Windows may return errors in case of closed connections */ | ||
666 | switch (api.sock_errno()) | ||
667 | { | ||
668 | case WSAECONNRESET: | ||
669 | case WSAECONNABORTED: | ||
670 | case WSAESHUTDOWN: | ||
671 | { | ||
672 | /* equals End-Of-Stream, which is not an error */ | ||
673 | if (bufferused != NULL) | ||
674 | { | ||
675 | *bufferused = 0; | ||
676 | } | ||
677 | ret = GATE_RESULT_OK; | ||
678 | } | ||
679 | } | ||
680 | #endif | ||
681 | } | ||
682 | else | ||
683 | { | ||
684 | 85 | ret = GATE_RESULT_OK; | |
685 |
1/2✓ Branch 0 taken 85 times.
✗ Branch 1 not taken.
|
85 | if (bufferused != NULL) |
686 | { | ||
687 | 85 | *bufferused = (gate_size_t)received; | |
688 | } | ||
689 | } | ||
690 | 85 | return ret; | |
691 | } | ||
692 | 2 | gate_result_t gate_socket_receive_from(gate_socket_t sock, gate_socket_endpoint_t* ep, char* buffer, gate_size_t bufferlen, gate_size_t* bufferused, gate_uint16_t flags) | |
693 | { | ||
694 | gate_result_t ret; | ||
695 | gate_socket_addr_storage_t addr; | ||
696 | 2 | socklen_t addrlen = sizeof(addr); | |
697 | 2 | int fl = 0; | |
698 | int received; | ||
699 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | if (GATE_FLAG_ENABLED(flags, GATE_SOCKET_FLAG_PEEK)) fl |= MSG_PEEK; |
700 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | if (GATE_FLAG_ENABLED(flags, GATE_SOCKET_FLAG_OOB)) fl |= MSG_OOB; |
701 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | if (GATE_FLAG_ENABLED(flags, GATE_SOCKET_FLAG_DONTROUTE)) fl |= MSG_DONTROUTE; |
702 | #if defined(MSG_WAITALL) | ||
703 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | if (GATE_FLAG_ENABLED(flags, GATE_SOCKET_FLAG_WAITALL)) fl |= MSG_WAITALL; |
704 | #endif | ||
705 | #if defined(MSG_EOR) | ||
706 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | if (GATE_FLAG_ENABLED(flags, GATE_SOCKET_FLAG_WAITALL)) fl |= MSG_EOR; |
707 | #endif | ||
708 | 2 | gate_mem_clear(&addr, sizeof(addr)); | |
709 | 2 | received = api.sock_recvfrom((sock_fd_t)sock, buffer, (socklen_t)bufferlen, fl, (struct sockaddr*)&addr, &addrlen); | |
710 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | if (received == -1) |
711 | { | ||
712 | ✗ | ret = GATE_RESULT_FAILED; | |
713 | #if defined(GATE_SYS_WIN) | ||
714 | /* Windows may return errors in case of closed connections */ | ||
715 | switch (api.sock_errno()) | ||
716 | { | ||
717 | case WSAECONNRESET: | ||
718 | case WSAECONNABORTED: | ||
719 | case WSAESHUTDOWN: | ||
720 | { | ||
721 | /* equals End-Of-Stream, which is not an error */ | ||
722 | if (bufferused != NULL) | ||
723 | { | ||
724 | *bufferused = 0; | ||
725 | } | ||
726 | ret = GATE_RESULT_OK; | ||
727 | } | ||
728 | } | ||
729 | #endif | ||
730 | ✗ | GATE_DEBUG_TRACE_PLATFORM_ERROR("sock_recvfrom() failed"); | |
731 | } | ||
732 | else | ||
733 | { | ||
734 | 2 | ret = GATE_RESULT_OK; | |
735 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2 | if (bufferused != NULL) |
736 | { | ||
737 | 2 | *bufferused = (gate_size_t)received; | |
738 | } | ||
739 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2 | if (ep != NULL) |
740 | { | ||
741 | 2 | gate_socket_load_endpoint(&addr.addr, ep); | |
742 | } | ||
743 | } | ||
744 | |||
745 | 2 | return ret; | |
746 | } | ||
747 | 9 | gate_result_t gate_socket_send(gate_socket_t sock, char const* buffer, gate_size_t bufferlen, gate_size_t* bufferprocessed) | |
748 | { | ||
749 | gate_result_t ret; | ||
750 | int sentbytes; | ||
751 | |||
752 | #if defined(GATE_SYS_POSIX) | ||
753 | 9 | gate_posix_sigblocker_t blocker = gate_posix_block_signals(SIGPIPE, 0); | |
754 | #endif | ||
755 | |||
756 | 9 | sentbytes = api.sock_send((sock_fd_t)sock, buffer, (socklen_t)bufferlen, 0); | |
757 | |||
758 | #if defined(GATE_SYS_POSIX) | ||
759 | 9 | gate_posix_unblock_signals(blocker); | |
760 | #endif | ||
761 | |||
762 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
|
9 | if (sentbytes == -1) |
763 | { | ||
764 | ✗ | sentbytes = api.sock_errno(); | |
765 | ✗ | GATE_DEBUG_TRACE_PLATFORM_ERROR("sock_send() failed"); | |
766 | ✗ | ret = GATE_RESULT_FAILED; | |
767 | } | ||
768 | else | ||
769 | { | ||
770 | 9 | ret = GATE_RESULT_OK; | |
771 |
1/2✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
|
9 | if (bufferprocessed != NULL) |
772 | { | ||
773 | 9 | *bufferprocessed = (gate_size_t)sentbytes; | |
774 | } | ||
775 | } | ||
776 | |||
777 | 9 | return ret; | |
778 | } | ||
779 | ✗ | gate_result_t gate_socket_send_block(gate_socket_t sock, char const* buffer, gate_size_t bufferlen, gate_size_t* bufferprocessed) | |
780 | { | ||
781 | ✗ | gate_result_t ret = GATE_RESULT_OK; | |
782 | ✗ | gate_size_t pos = 0; | |
783 | gate_size_t bytes_sent; | ||
784 | ✗ | while (pos < bufferlen) | |
785 | { | ||
786 | ✗ | ret = gate_socket_send(sock, &buffer[pos], bufferlen - pos, &bytes_sent); | |
787 | ✗ | GATE_BREAK_IF_FAILED(ret); | |
788 | |||
789 | ✗ | pos += bytes_sent; | |
790 | } | ||
791 | ✗ | if (bufferprocessed != NULL) | |
792 | { | ||
793 | ✗ | *bufferprocessed = pos; | |
794 | } | ||
795 | ✗ | return ret; | |
796 | } | ||
797 | |||
798 | 2 | gate_result_t gate_socket_send_to(gate_socket_t sock, gate_socket_endpoint_t const* to, char const* buffer, gate_size_t bufferlen, gate_size_t* bufferprocessed, gate_uint16_t flags) | |
799 | { | ||
800 | 2 | gate_result_t ret = GATE_RESULT_FAILED; | |
801 | int sentbytes; | ||
802 | 2 | int fl = 0; | |
803 | gate_socket_addr_storage_t addr; | ||
804 | 2 | gate_size_t addrlen = 0; | |
805 | |||
806 | #if defined(GATE_SYS_POSIX) | ||
807 | 2 | gate_posix_sigblocker_t blocker = gate_posix_block_signals(SIGPIPE, 0); | |
808 | #endif | ||
809 | |||
810 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | if (GATE_FLAG_ENABLED(flags, GATE_SOCKET_FLAG_DONTROUTE)) fl |= MSG_DONTROUTE; |
811 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | if (GATE_FLAG_ENABLED(flags, GATE_SOCKET_FLAG_OOB)) fl |= MSG_OOB; |
812 | |||
813 | do | ||
814 | { | ||
815 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | if (to == NULL) |
816 | { | ||
817 | ✗ | ret = GATE_RESULT_INVALIDARG; | |
818 | ✗ | break; | |
819 | } | ||
820 | |||
821 | 2 | ret = gate_socket_save_endpoint(to, &addr.addr, &addrlen); | |
822 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | GATE_BREAK_IF_FAILED(ret); |
823 | |||
824 | 2 | sentbytes = api.sock_sendto((sock_fd_t)sock, buffer, (socklen_t)bufferlen, fl, | |
825 | &addr.addr, (sock_socklen_t)addrlen); | ||
826 | |||
827 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | if (sentbytes == -1) |
828 | { | ||
829 | ✗ | GATE_DEBUG_TRACE_PLATFORM_ERROR("sock_sendto() failed"); | |
830 | ✗ | ret = GATE_RESULT_FAILED; | |
831 | } | ||
832 | else | ||
833 | { | ||
834 | 2 | ret = GATE_RESULT_OK; | |
835 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2 | if (bufferprocessed != NULL) |
836 | { | ||
837 | 2 | *bufferprocessed = (gate_size_t)sentbytes; | |
838 | } | ||
839 | } | ||
840 | } while (0); | ||
841 | |||
842 | #if defined(GATE_SYS_POSIX) | ||
843 | 2 | gate_posix_unblock_signals(blocker); | |
844 | #endif | ||
845 | |||
846 | 2 | return ret; | |
847 | } | ||
848 | 17 | static int gate_socket_get_nfds(sock_fd_t highest_socket_id) | |
849 | { | ||
850 | #if defined(GATE_SYS_WIN) | ||
851 | GATE_UNUSED_ARG(highest_socket_id); | ||
852 | return 0; | ||
853 | #else | ||
854 | 17 | return (int)(highest_socket_id + 1); | |
855 | #endif | ||
856 | } | ||
857 | 17 | gate_result_t gate_socket_select(gate_socket_t const* socks, gate_size_t sockcount, gate_uint8_t* statusflags, gate_uint32_t timeout) | |
858 | { | ||
859 | gate_result_t ret; | ||
860 | TIMEVAL to; | ||
861 | gate_size_t ndx; | ||
862 | fd_set fds_read; | ||
863 | fd_set fds_write; | ||
864 | fd_set fds_except; | ||
865 | 17 | sock_fd_t highestsocket = 0; | |
866 | gate_uint8_t tmp; | ||
867 | |||
868 | #if defined(GATE_SYS_POSIX) | ||
869 | 17 | gate_posix_sigblocker_t blocker = gate_posix_block_signals(SIGPIPE, 0); | |
870 | #endif | ||
871 | |||
872 | 17 | FD_ZERO(&fds_read); | |
873 | 17 | FD_ZERO(&fds_write); | |
874 | 17 | FD_ZERO(&fds_except); | |
875 | |||
876 | 17 | to.tv_sec = timeout / 1000; | |
877 | 17 | to.tv_usec = (timeout % 1000) * 1000; | |
878 | |||
879 |
2/2✓ Branch 0 taken 37 times.
✓ Branch 1 taken 17 times.
|
54 | for (ndx = 0; ndx < sockcount; ++ndx) |
880 | { | ||
881 |
2/2✓ Branch 0 taken 19 times.
✓ Branch 1 taken 18 times.
|
37 | if (highestsocket < (sock_fd_t)socks[ndx]) |
882 | { | ||
883 | 19 | highestsocket = (sock_fd_t)socks[ndx]; | |
884 | } | ||
885 |
2/2✓ Branch 0 taken 33 times.
✓ Branch 1 taken 4 times.
|
37 | if (GATE_FLAG_ENABLED(statusflags[ndx], GATE_SOCKET_SELECT_FLAG_RECEIVE)) |
886 | { | ||
887 | 33 | FD_SET((sock_fd_t)socks[ndx], &fds_read); | |
888 | } | ||
889 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 29 times.
|
37 | if (GATE_FLAG_ENABLED(statusflags[ndx], GATE_SOCKET_SELECT_FLAG_SEND)) |
890 | { | ||
891 | 8 | FD_SET((sock_fd_t)socks[ndx], &fds_write); | |
892 | } | ||
893 |
1/2✓ Branch 0 taken 37 times.
✗ Branch 1 not taken.
|
37 | if (GATE_FLAG_ENABLED(statusflags[ndx], GATE_SOCKET_SELECT_FLAG_ERROR)) |
894 | { | ||
895 | 37 | FD_SET((sock_fd_t)socks[ndx], &fds_except); | |
896 | } | ||
897 | } | ||
898 | |||
899 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 17 times.
|
17 | if (-1 == api.sock_select(gate_socket_get_nfds(highestsocket), &fds_read, &fds_write, &fds_except, &to)) |
900 | { | ||
901 | ✗ | GATE_DEBUG_TRACE_PLATFORM_ERROR("sock_select() failed"); | |
902 | ✗ | ret = GATE_RESULT_FAILED; | |
903 | } | ||
904 | else | ||
905 | { | ||
906 | 17 | ret = GATE_RESULT_OK; | |
907 |
2/2✓ Branch 0 taken 37 times.
✓ Branch 1 taken 17 times.
|
54 | for (ndx = 0; ndx < sockcount; ++ndx) |
908 | { | ||
909 | 37 | tmp = 0; | |
910 |
2/2✓ Branch 1 taken 17 times.
✓ Branch 2 taken 20 times.
|
37 | if (api.sock_isset((sock_fd_t)socks[ndx], &fds_read)) |
911 | { | ||
912 | 17 | tmp |= GATE_SOCKET_SELECT_FLAG_RECEIVE; | |
913 | } | ||
914 |
2/2✓ Branch 1 taken 6 times.
✓ Branch 2 taken 31 times.
|
37 | if (api.sock_isset((sock_fd_t)socks[ndx], &fds_write)) |
915 | { | ||
916 | 6 | tmp |= GATE_SOCKET_SELECT_FLAG_SEND; | |
917 | } | ||
918 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 37 times.
|
37 | if (api.sock_isset((sock_fd_t)socks[ndx], &fds_except)) |
919 | { | ||
920 | ✗ | tmp |= GATE_SOCKET_SELECT_FLAG_ERROR; | |
921 | } | ||
922 | 37 | statusflags[ndx] = tmp; | |
923 | } | ||
924 | } | ||
925 | |||
926 | #if defined(GATE_SYS_POSIX) | ||
927 | 17 | gate_posix_unblock_signals(blocker); | |
928 | #endif | ||
929 | |||
930 | 17 | return ret; | |
931 | } | ||
932 | |||
933 | 6 | gate_result_t gate_socket_shutdown(gate_socket_t sock, gate_bool_t shutdownreceive, gate_bool_t shutdownsend) | |
934 | { | ||
935 | gate_result_t ret; | ||
936 | 6 | int sh = 0; | |
937 | |||
938 | do | ||
939 | { | ||
940 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
6 | if (shutdownreceive && shutdownsend) |
941 | { | ||
942 | ✗ | sh = SD_BOTH; | |
943 | } | ||
944 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
|
6 | else if (shutdownreceive) |
945 | { | ||
946 | ✗ | sh = SD_RECEIVE; | |
947 | } | ||
948 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
6 | else if (shutdownsend) |
949 | { | ||
950 | 6 | sh = SD_SEND; | |
951 | } | ||
952 | else | ||
953 | { | ||
954 | ✗ | ret = GATE_RESULT_INVALIDARG; | |
955 | ✗ | break; | |
956 | } | ||
957 | |||
958 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
|
6 | if (0 != api.sock_shutdown((sock_fd_t)sock, sh)) |
959 | { | ||
960 | ✗ | GATE_DEBUG_TRACE_PLATFORM_ERROR("sock_shutdown() failed"); | |
961 | ✗ | ret = GATE_RESULT_FAILED; | |
962 | } | ||
963 | else | ||
964 | { | ||
965 | 6 | ret = GATE_RESULT_OK; | |
966 | } | ||
967 | |||
968 | } while (0); | ||
969 | |||
970 | 6 | return ret; | |
971 | } | ||
972 | 18 | gate_result_t gate_socket_close(gate_socket_t sock) | |
973 | { | ||
974 | 18 | gate_result_t ret = GATE_RESULT_INVALIDARG; | |
975 |
1/2✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
|
18 | if (sock != GATE_SOCKET_INVALID) |
976 | { | ||
977 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
|
18 | if (-1 == api.sock_close((sock_fd_t)sock)) |
978 | { | ||
979 | ✗ | GATE_DEBUG_TRACE_PLATFORM_ERROR("sock_close() failed"); | |
980 | ✗ | ret = GATE_RESULT_FAILED; | |
981 | } | ||
982 | else | ||
983 | { | ||
984 | 18 | ret = GATE_RESULT_OK; | |
985 | #if defined(GATE_DEBUG_MODE) | ||
986 |
1/2✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
|
18 | if (GATE_SUCCEEDED(ret)) |
987 | { | ||
988 | 18 | gate_int32_t sockets_released_counter = gate_atomic_int_inc(&sockets_released); | |
989 | 18 | GATE_DEBUG_TRACE_VALUE(sockets_released_counter); | |
990 | } | ||
991 | #endif | ||
992 | } | ||
993 | } | ||
994 | 18 | return ret; | |
995 | } | ||
996 | ✗ | gate_result_t gate_socket_get_option(gate_socket_t sock, gate_int32_t level, gate_int32_t option, void* buffer, gate_size_t* bufferlen) | |
997 | { | ||
998 | gate_result_t ret; | ||
999 | socklen_t len; | ||
1000 | do | ||
1001 | { | ||
1002 | ✗ | if (bufferlen == NULL) | |
1003 | { | ||
1004 | ✗ | len = 0; | |
1005 | } | ||
1006 | else | ||
1007 | { | ||
1008 | ✗ | len = (socklen_t)*bufferlen; | |
1009 | } | ||
1010 | ✗ | if (-1 == api.sock_getsockopt((sock_fd_t)sock, (int)level, (int)option, (char*)buffer, &len)) | |
1011 | { | ||
1012 | ✗ | GATE_DEBUG_TRACE_PLATFORM_ERROR("sock_getsockopt() failed"); | |
1013 | ✗ | ret = GATE_RESULT_FAILED; | |
1014 | } | ||
1015 | else | ||
1016 | { | ||
1017 | ✗ | ret = GATE_RESULT_OK; | |
1018 | } | ||
1019 | ✗ | if (bufferlen != NULL) | |
1020 | { | ||
1021 | ✗ | *bufferlen = (gate_size_t)len; | |
1022 | } | ||
1023 | } while (0); | ||
1024 | ✗ | return ret; | |
1025 | } | ||
1026 | 8 | gate_result_t gate_socket_set_option(gate_socket_t sock, gate_int32_t level, gate_int32_t option, void const* buffer, gate_size_t bufferlen) | |
1027 | { | ||
1028 | gate_result_t ret; | ||
1029 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
|
8 | if (0 != api.sock_setsockopt((sock_fd_t)sock, (int)level, (int)option, (char const*)buffer, (socklen_t)bufferlen)) |
1030 | { | ||
1031 | ✗ | GATE_DEBUG_TRACE_PLATFORM_ERROR("sock_setsockopt()"); | |
1032 | ✗ | ret = GATE_RESULT_FAILED; | |
1033 | } | ||
1034 | else | ||
1035 | { | ||
1036 | 8 | ret = GATE_RESULT_OK; | |
1037 | } | ||
1038 | 8 | return ret; | |
1039 | } | ||
1040 | 13 | gate_result_t gate_socket_set(gate_socket_t sock, GATE_SOCKET_OPTION option, gate_int32_t value) | |
1041 | { | ||
1042 | gate_int32_t level; | ||
1043 | gate_int32_t opt; | ||
1044 | 13 | void* ptr = NULL; | |
1045 | 13 | gate_size_t len = 0; | |
1046 | 13 | int opt_val = 0; | |
1047 | #if !defined(GATE_SYS_WIN) | ||
1048 | TIMEVAL opt_tv; | ||
1049 | #endif | ||
1050 | |||
1051 |
3/7✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
|
13 | switch (option) |
1052 | { | ||
1053 | 5 | case GATE_SOCKET_OPTION_BLOCKING: | |
1054 | { | ||
1055 | 5 | return gate_socket_set_blocking(sock, value ? true : false); | |
1056 | } | ||
1057 | ✗ | case GATE_SOCKET_OPTION_TCPNODELAY: | |
1058 | { | ||
1059 | ✗ | level = IPPROTO_TCP; | |
1060 | ✗ | opt = TCP_NODELAY; | |
1061 | ✗ | opt_val = value ? 1 : 0; | |
1062 | ✗ | ptr = &opt_val; | |
1063 | ✗ | len = sizeof(opt_val); | |
1064 | ✗ | break; | |
1065 | } | ||
1066 | ✗ | case GATE_SOCKET_OPTION_KEEPALIVE: | |
1067 | { | ||
1068 | ✗ | level = SOL_SOCKET; | |
1069 | ✗ | opt = SO_KEEPALIVE; | |
1070 | ✗ | opt_val = value ? 1 : 0; | |
1071 | ✗ | ptr = &opt_val; | |
1072 | ✗ | len = sizeof(opt_val); | |
1073 | ✗ | break; | |
1074 | } | ||
1075 | ✗ | case GATE_SOCKET_OPTION_BROADCAST: | |
1076 | { | ||
1077 | ✗ | level = SOL_SOCKET; | |
1078 | ✗ | opt = SO_BROADCAST; | |
1079 | ✗ | opt_val = value ? 1 : 0; | |
1080 | ✗ | ptr = &opt_val; | |
1081 | ✗ | len = sizeof(opt_val); | |
1082 | ✗ | break; | |
1083 | } | ||
1084 | 5 | case GATE_SOCKET_OPTION_RECEIVETIMEOUT: | |
1085 | { | ||
1086 | 5 | level = SOL_SOCKET; | |
1087 | 5 | opt = SO_RCVTIMEO; | |
1088 | #if defined(GATE_SYS_WIN) | ||
1089 | opt_val = value; | ||
1090 | ptr = &opt_val; | ||
1091 | len = sizeof(opt_val); | ||
1092 | #else | ||
1093 | 5 | opt_tv.tv_usec = (value % 1000) * 1000; | |
1094 | 5 | opt_tv.tv_sec = value / 1000; | |
1095 | 5 | ptr = &opt_tv; | |
1096 | 5 | len = sizeof(opt_tv); | |
1097 | #endif | ||
1098 | 5 | break; | |
1099 | } | ||
1100 | 3 | case GATE_SOCKET_OPTION_SENDTIMEOUT: | |
1101 | { | ||
1102 | 3 | level = SOL_SOCKET; | |
1103 | 3 | opt = SO_SNDTIMEO; | |
1104 | #if defined(GATE_SYS_WIN) | ||
1105 | opt_val = value; | ||
1106 | ptr = &opt_val; | ||
1107 | len = sizeof(opt_val); | ||
1108 | #else | ||
1109 | 3 | opt_tv.tv_usec = (value % 1000) * 1000; | |
1110 | 3 | opt_tv.tv_sec = value / 1000; | |
1111 | 3 | ptr = &opt_tv; | |
1112 | 3 | len = sizeof(opt_tv); | |
1113 | #endif | ||
1114 | 3 | break; | |
1115 | } | ||
1116 | ✗ | default: | |
1117 | { | ||
1118 | ✗ | return GATE_RESULT_NOTSUPPORTED; | |
1119 | } | ||
1120 | } | ||
1121 | |||
1122 | 8 | return gate_socket_set_option(sock, level, opt, ptr, len); | |
1123 | } | ||
1124 | |||
1125 | 2 | gate_result_t gate_socket_get_local_endpoint(gate_socket_t sock, gate_socket_endpoint_t* ep) | |
1126 | { | ||
1127 | gate_result_t ret; | ||
1128 | gate_socket_addr_storage_t addr; | ||
1129 | 2 | socklen_t addrlen = sizeof(addr); | |
1130 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | if (ep == NULL) |
1131 | { | ||
1132 | ✗ | ret = GATE_RESULT_INVALIDARG; | |
1133 | } | ||
1134 | else | ||
1135 | { | ||
1136 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
|
2 | if (0 != api.sock_getsockname((sock_fd_t)sock, &addr.addr, &addrlen)) |
1137 | { | ||
1138 | ✗ | GATE_DEBUG_TRACE_PLATFORM_ERROR("sock_getsockname() failed"); | |
1139 | ✗ | ret = GATE_RESULT_FAILED; | |
1140 | } | ||
1141 | else | ||
1142 | { | ||
1143 | 2 | ret = gate_socket_load_endpoint(&addr.addr, ep); | |
1144 | } | ||
1145 | } | ||
1146 | 2 | return ret; | |
1147 | } | ||
1148 | 2 | gate_result_t gate_socket_get_local_address(gate_socket_t sock, gate_string_t* address) | |
1149 | { | ||
1150 | gate_result_t ret; | ||
1151 | gate_socket_endpoint_t ep; | ||
1152 | 2 | ret = gate_socket_get_local_endpoint(sock, &ep); | |
1153 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2 | if (GATE_SUCCEEDED(ret)) |
1154 | { | ||
1155 | 2 | ret = gate_socket_print_endpoint(&ep, address); | |
1156 | } | ||
1157 | 2 | return ret; | |
1158 | } | ||
1159 | 2 | gate_result_t gate_socket_get_remote_endpoint(gate_socket_t sock, gate_socket_endpoint_t* ep) | |
1160 | { | ||
1161 | gate_result_t ret; | ||
1162 | gate_socket_addr_storage_t addr; | ||
1163 | 2 | socklen_t addrlen = sizeof(addr); | |
1164 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 | if (ep == NULL) |
1165 | { | ||
1166 | ✗ | ret = GATE_RESULT_INVALIDARG; | |
1167 | } | ||
1168 | else | ||
1169 | { | ||
1170 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
|
2 | if (0 != api.sock_getpeername((sock_fd_t)sock, &addr.addr, &addrlen)) |
1171 | { | ||
1172 | ✗ | GATE_DEBUG_TRACE_PLATFORM_ERROR("sock_getpeername() failed"); | |
1173 | ✗ | ret = GATE_RESULT_FAILED; | |
1174 | } | ||
1175 | else | ||
1176 | { | ||
1177 | 2 | ret = gate_socket_load_endpoint(&addr.addr, ep); | |
1178 | } | ||
1179 | } | ||
1180 | 2 | return ret; | |
1181 | } | ||
1182 | 2 | gate_result_t gate_socket_get_remote_address(gate_socket_t sock, gate_string_t* address) | |
1183 | { | ||
1184 | gate_result_t ret; | ||
1185 | gate_socket_endpoint_t ep; | ||
1186 | 2 | ret = gate_socket_get_remote_endpoint(sock, &ep); | |
1187 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2 | if (GATE_SUCCEEDED(ret)) |
1188 | { | ||
1189 | 2 | ret = gate_socket_print_endpoint(&ep, address); | |
1190 | } | ||
1191 | 2 | return ret; | |
1192 | } | ||
1193 | |||
1194 | static gate_string_t const ipv6_begin = GATE_STRING_INIT_STATIC("["); | ||
1195 | static gate_string_t const ipv6_end = GATE_STRING_INIT_STATIC("]"); | ||
1196 | static gate_string_t const ip_any = GATE_STRING_INIT_STATIC("*"); | ||
1197 | static gate_string_t const ip6_any = GATE_STRING_INIT_STATIC("::"); | ||
1198 | static gate_string_t const ip_port_separator = GATE_STRING_INIT_STATIC(":"); | ||
1199 | |||
1200 | 8 | gate_result_t gate_socket_parse_ip4(gate_string_t const* ip4text, gate_socket_ip4address_t* ip4address) | |
1201 | { | ||
1202 | 8 | gate_result_t ret = GATE_RESULT_FAILED; | |
1203 | gate_size_t start, ndx, pos; | ||
1204 | gate_uint64_t num; | ||
1205 | |||
1206 | do | ||
1207 | { | ||
1208 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
|
8 | if (gate_string_equals(ip4text, &ip_any) || gate_string_is_empty(ip4text)) |
1209 | { | ||
1210 | /* ANY-IP -> "0.0.0.0", already set by gate_mem_clear() */ | ||
1211 | ✗ | ret = GATE_RESULT_OK; | |
1212 | ✗ | break; | |
1213 | } | ||
1214 | |||
1215 | 8 | start = 0; | |
1216 |
2/2✓ Branch 0 taken 24 times.
✓ Branch 1 taken 8 times.
|
32 | for (ndx = 0; ndx != 3; ++ndx) |
1217 | { | ||
1218 | 24 | pos = gate_string_char_pos(ip4text, '.', start); | |
1219 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
|
24 | if (pos == GATE_STR_NPOS) |
1220 | { | ||
1221 | ✗ | break; | |
1222 | } | ||
1223 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 24 times.
|
24 | if (0 == gate_str_parse_uint64(ip4text->str + start, ip4text->length - pos, &num)) |
1224 | { | ||
1225 | /* failed to parse number */ | ||
1226 | ✗ | ret = GATE_RESULT_INVALIDINPUT; | |
1227 | ✗ | pos = GATE_STR_NPOS; | |
1228 | ✗ | break; | |
1229 | } | ||
1230 | 24 | ip4address->item[ndx] = (gate_uint8_t)num; | |
1231 | 24 | start = pos + 1; | |
1232 | } | ||
1233 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
8 | if (pos == GATE_STR_NPOS) break; |
1234 | |||
1235 | 8 | gate_str_parse_uint64(ip4text->str + start, ip4text->length - start, &num); | |
1236 | 8 | ip4address->item[ndx] = (gate_uint8_t)num; | |
1237 | |||
1238 | 8 | ret = GATE_RESULT_OK; | |
1239 | } while (0); | ||
1240 | |||
1241 | 8 | return ret; | |
1242 | } | ||
1243 | |||
1244 | 6 | gate_result_t gate_socket_parse_ip6(gate_string_t const* ip6text, gate_socket_ip6address_t* ip6address) | |
1245 | { | ||
1246 | 6 | gate_result_t ret = GATE_RESULT_FAILED; | |
1247 | 6 | gate_string_t ip = GATE_STRING_INIT_EMPTY; | |
1248 | gate_size_t ndx; | ||
1249 | gate_size_t pos, start; | ||
1250 | gate_uint64_t num; | ||
1251 | |||
1252 | do | ||
1253 | { | ||
1254 | 6 | gate_mem_clear(ip6address, sizeof(gate_socket_ip6address_t)); | |
1255 | |||
1256 |
1/4✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
6 | if (gate_string_starts_with(ip6text, &ipv6_begin) && gate_string_ends_with(ip6text, &ipv6_end)) |
1257 | { | ||
1258 | ✗ | gate_string_substr(&ip, ip6text, 1, ip6text->length - 2); | |
1259 | } | ||
1260 | else | ||
1261 | { | ||
1262 | 6 | gate_string_duplicate(&ip, ip6text); | |
1263 | } | ||
1264 | |||
1265 |
3/6✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 6 times.
|
6 | if (gate_string_equals(&ip, &ip_any) || gate_string_equals(&ip, &ip6_any) || gate_string_is_empty(&ip)) |
1266 | { | ||
1267 | /* ANY-IP -> "[::]", already set by gate_mem_clear() */ | ||
1268 | ✗ | ret = GATE_RESULT_OK; | |
1269 | ✗ | break; | |
1270 | } | ||
1271 | 6 | start = 0; | |
1272 |
2/2✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1 times.
|
13 | for (ndx = 0; ndx != 7; ++ndx) |
1273 | { | ||
1274 | 12 | pos = gate_string_char_pos(&ip, ':', start); | |
1275 |
4/4✓ Branch 0 taken 11 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 4 times.
|
12 | if ((pos == GATE_STR_NPOS) || (pos == start)) |
1276 | { | ||
1277 | break; | ||
1278 | } | ||
1279 | 7 | gate_str_parse_hex_int(ip.str + start, ip.length - pos, &num); | |
1280 | 7 | ip6address->item[ndx] = (gate_uint16_t)num; | |
1281 | 7 | start = pos + 1; | |
1282 | } | ||
1283 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
|
6 | if (pos == GATE_STR_NPOS) |
1284 | { | ||
1285 | 1 | GATE_DEBUG_TRACE("Invalid IPv6 address"); | |
1286 | 1 | break; | |
1287 | } | ||
1288 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
|
5 | if (pos == start) |
1289 | { | ||
1290 | /* double-colon detected */ | ||
1291 |
1/2✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
|
8 | for (ndx = 0; ndx != 7; ++ndx) |
1292 | { | ||
1293 | 8 | pos = gate_string_char_pos_last(&ip, ':'); | |
1294 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
8 | if (pos == GATE_STR_NPOS) break; |
1295 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
|
8 | if (pos == ip.length - 1) break; /* double-colon reached */ |
1296 | 4 | gate_str_parse_hex_int(ip.str + pos + 1, ip.length - pos - 1, &num); | |
1297 | 4 | ip6address->item[7 - ndx] = (gate_uint16_t)num; | |
1298 | /* r-trim extracted data from ip-address string: */ | ||
1299 | 4 | gate_string_substr(&ip, &ip, 0, pos); | |
1300 | } | ||
1301 | } | ||
1302 | else | ||
1303 | { | ||
1304 | /* extract last ip number */ | ||
1305 | 1 | gate_str_parse_uint64(ip.str + start, ip.length - start, &num); | |
1306 | 1 | ip6address->item[ndx] = (gate_uint16_t)num; | |
1307 | } | ||
1308 | 5 | ret = GATE_RESULT_OK; | |
1309 | |||
1310 | } while (0); | ||
1311 | |||
1312 | 6 | gate_string_release(&ip); | |
1313 | |||
1314 | 6 | return ret; | |
1315 | } | ||
1316 | |||
1317 | |||
1318 | |||
1319 | 1 | gate_result_t gate_socket_parse_address(gate_string_t const* address, gate_string_t* host, gate_uint16_t* port, gate_int16_t* family) | |
1320 | { | ||
1321 | 1 | gate_result_t ret = GATE_RESULT_INVALIDDATA; | |
1322 | gate_size_t pos; | ||
1323 | 1 | gate_string_t address_ip = GATE_STRING_INIT_EMPTY; | |
1324 | 1 | gate_string_t tail = GATE_STRING_INIT_EMPTY; | |
1325 | 1 | gate_uint64_t address_port = 0; | |
1326 | gate_size_t len; | ||
1327 | |||
1328 | do | ||
1329 | { | ||
1330 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
|
1 | if (gate_string_starts_with(address, &ipv6_begin)) |
1331 | { | ||
1332 | /* IP v6 */ | ||
1333 | ✗ | pos = gate_string_pos(address, &ipv6_end, 1); | |
1334 | ✗ | if (GATE_STR_NPOS == pos) | |
1335 | { | ||
1336 | ✗ | break; | |
1337 | } | ||
1338 | ✗ | gate_string_substr(&address_ip, address, 0, pos + 1); | |
1339 | ✗ | gate_string_substr(&tail, address, pos + 1, GATE_STR_NPOS); | |
1340 | ✗ | if (family) | |
1341 | { | ||
1342 | ✗ | *family = GATE_SOCKET_FAMILY_INET6; | |
1343 | } | ||
1344 | } | ||
1345 | else | ||
1346 | { | ||
1347 | /* IP v4 */ | ||
1348 | 1 | pos = gate_string_find_last_of(address, &ip_port_separator); | |
1349 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if (pos == GATE_STR_NPOS) |
1350 | { | ||
1351 | 1 | gate_string_duplicate(&address_ip, address); | |
1352 | } | ||
1353 | else | ||
1354 | { | ||
1355 | ✗ | gate_string_substr(&address_ip, address, 0, pos); | |
1356 | ✗ | gate_string_substr(&tail, address, pos, GATE_STR_NPOS); | |
1357 | } | ||
1358 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if (family) |
1359 | { | ||
1360 | 1 | *family = GATE_SOCKET_FAMILY_INET4; | |
1361 | } | ||
1362 | } | ||
1363 | |||
1364 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | if (gate_string_is_empty(&tail)) |
1365 | { | ||
1366 | 1 | address_port = 0; | |
1367 | } | ||
1368 | else | ||
1369 | { | ||
1370 | ✗ | if (!gate_string_starts_with(&tail, &ip_port_separator)) | |
1371 | { | ||
1372 | ✗ | break; | |
1373 | } | ||
1374 | else | ||
1375 | { | ||
1376 | ✗ | gate_string_substr(&tail, &tail, 1, GATE_STR_NPOS); | |
1377 | ✗ | len = gate_string_parse_uint(&tail, &address_port); | |
1378 | ✗ | if (len != gate_string_length(&tail)) | |
1379 | { | ||
1380 | ✗ | break; | |
1381 | } | ||
1382 | } | ||
1383 | } | ||
1384 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if (host) |
1385 | { | ||
1386 | 1 | gate_string_duplicate(host, &address_ip); | |
1387 | } | ||
1388 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if (port) |
1389 | { | ||
1390 | 1 | *port = (gate_uint16_t)address_port; | |
1391 | } | ||
1392 | 1 | ret = GATE_RESULT_OK; | |
1393 | } while (0); | ||
1394 | |||
1395 | 1 | gate_string_release(&tail); | |
1396 | 1 | gate_string_release(&address_ip); | |
1397 | 1 | return ret; | |
1398 | } | ||
1399 | |||
1400 | |||
1401 | 12 | gate_result_t gate_socket_parse_endpoint(gate_string_t const* address, gate_socket_endpoint_t* endpoint) | |
1402 | { | ||
1403 | 12 | gate_result_t ret = GATE_RESULT_INVALIDDATA; | |
1404 | gate_size_t pos, len; | ||
1405 | 12 | gate_uint64_t num = 0; | |
1406 | 12 | gate_string_t ip = GATE_STRING_INIT_EMPTY; | |
1407 | do | ||
1408 | { | ||
1409 | /* address format is "IP:PORT", | ||
1410 | * eg. "1.2.3.4:8080" or "[1:2:a:b:c:d:e:f]:8080" | ||
1411 | */ | ||
1412 | 12 | gate_mem_clear(endpoint, sizeof(gate_socket_endpoint_t)); | |
1413 | |||
1414 | 12 | pos = gate_str_char_pos_last(address->str, address->length, ':'); | |
1415 |
2/4✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
|
12 | if ((pos == GATE_STR_NPOS) || (pos == address->length - 1)) |
1416 | { | ||
1417 | ✗ | GATE_DEBUG_TRACE("Invalid endpoint: No port suffix"); | |
1418 | ✗ | break; | |
1419 | } | ||
1420 | |||
1421 | 12 | len = address->length - pos - 1; | |
1422 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
|
12 | if (len != gate_str_parse_uint64(address->str + pos + 1, len, &num)) |
1423 | { | ||
1424 | ✗ | GATE_DEBUG_TRACE("Invalid endpoint: Invalid port format"); | |
1425 | ✗ | break; | |
1426 | } | ||
1427 | |||
1428 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
|
12 | if (NULL == gate_string_substr(&ip, address, 0, pos)) |
1429 | { | ||
1430 | ✗ | ret = GATE_RESULT_OUTOFMEMORY; | |
1431 | ✗ | break; | |
1432 | } | ||
1433 | |||
1434 |
3/4✓ Branch 1 taken 5 times.
✓ Branch 2 taken 7 times.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
12 | if (gate_string_starts_with(&ip, &ipv6_begin) && gate_string_ends_with(&ip, &ipv6_end)) |
1435 | { | ||
1436 | /* ip v6 address */ | ||
1437 | 5 | endpoint->ip6.family = GATE_SOCKET_FAMILY_INET6; | |
1438 | 5 | endpoint->ip6.port = (gate_uint16_t)num; | |
1439 | 5 | endpoint->ip6.scope = 0; | |
1440 | 5 | gate_string_substr(&ip, &ip, 1, ip.length - 2); | |
1441 | |||
1442 | 5 | ret = gate_socket_parse_ip6(&ip, &endpoint->ip6.address); | |
1443 | } | ||
1444 | else | ||
1445 | { | ||
1446 | /* ip v4 address */ | ||
1447 | 7 | endpoint->ip4.family = GATE_SOCKET_FAMILY_INET4; | |
1448 | 7 | endpoint->ip4.port = (gate_uint16_t)num; | |
1449 | 7 | ret = gate_socket_parse_ip4(&ip, &endpoint->ip4.address); | |
1450 | } | ||
1451 | |||
1452 | } while (0); | ||
1453 | |||
1454 | 12 | gate_string_release(&ip); | |
1455 | |||
1456 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
|
12 | GATE_DEBUG_TRACE_FAILED(ret, "gate_socket_parse_endpoint() failed"); |
1457 | |||
1458 | 12 | return ret; | |
1459 | } | ||
1460 | |||
1461 | 7 | gate_result_t gate_socket_print_endpoint(gate_socket_endpoint_t const* endpoint, gate_string_t* address) | |
1462 | { | ||
1463 | gate_result_t ret; | ||
1464 | 7 | gate_strbuilder8_t builder = GATE_INIT_EMPTY; | |
1465 | gate_char8_t hexbuffer[8]; | ||
1466 | gate_size_t hexbufferused; | ||
1467 |
2/3✓ Branch 0 taken 4 times.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
7 | switch (endpoint->family) |
1468 | { | ||
1469 | 4 | case GATE_SOCKET_FAMILY_INET4: | |
1470 | { | ||
1471 | 4 | gate_strbuilder_create(&builder, 16); | |
1472 | 4 | gate_strbuilder_append_uint16(&builder, endpoint->ip4.address.item[0]); | |
1473 | 4 | gate_strbuilder_append_text(&builder, ".", 1); | |
1474 | 4 | gate_strbuilder_append_uint16(&builder, endpoint->ip4.address.item[1]); | |
1475 | 4 | gate_strbuilder_append_text(&builder, ".", 1); | |
1476 | 4 | gate_strbuilder_append_uint16(&builder, endpoint->ip4.address.item[2]); | |
1477 | 4 | gate_strbuilder_append_text(&builder, ".", 1); | |
1478 | 4 | gate_strbuilder_append_uint16(&builder, endpoint->ip4.address.item[3]); | |
1479 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
|
4 | if (endpoint->ip4.port) |
1480 | { | ||
1481 | 3 | gate_strbuilder_append_text(&builder, ":", 1); | |
1482 | 3 | gate_strbuilder_append_uint16(&builder, endpoint->ip4.port); | |
1483 | } | ||
1484 | 4 | ret = GATE_RESULT_OK; | |
1485 | 4 | break; | |
1486 | } | ||
1487 | 3 | case GATE_SOCKET_FAMILY_INET6: | |
1488 | { | ||
1489 | 3 | gate_strbuilder_create(&builder, 50); | |
1490 | 3 | gate_strbuilder_append_text(&builder, "[", 1); | |
1491 | |||
1492 | 3 | hexbufferused = gate_str_print_hex_uint16(hexbuffer, sizeof(hexbuffer), endpoint->ip6.address.item[0], false); | |
1493 | 3 | gate_strbuilder_append_text(&builder, hexbuffer, hexbufferused); gate_strbuilder_append_text(&builder, ":", 1); | |
1494 | |||
1495 | 3 | hexbufferused = gate_str_print_hex_uint16(hexbuffer, sizeof(hexbuffer), endpoint->ip6.address.item[1], false); | |
1496 | 3 | gate_strbuilder_append_text(&builder, hexbuffer, hexbufferused); gate_strbuilder_append_text(&builder, ":", 1); | |
1497 | |||
1498 | 3 | hexbufferused = gate_str_print_hex_uint16(hexbuffer, sizeof(hexbuffer), endpoint->ip6.address.item[2], false); | |
1499 | 3 | gate_strbuilder_append_text(&builder, hexbuffer, hexbufferused); gate_strbuilder_append_text(&builder, ":", 1); | |
1500 | |||
1501 | 3 | hexbufferused = gate_str_print_hex_uint16(hexbuffer, sizeof(hexbuffer), endpoint->ip6.address.item[3], false); | |
1502 | 3 | gate_strbuilder_append_text(&builder, hexbuffer, hexbufferused); gate_strbuilder_append_text(&builder, ":", 1); | |
1503 | |||
1504 | 3 | hexbufferused = gate_str_print_hex_uint16(hexbuffer, sizeof(hexbuffer), endpoint->ip6.address.item[4], false); | |
1505 | 3 | gate_strbuilder_append_text(&builder, hexbuffer, hexbufferused); gate_strbuilder_append_text(&builder, ":", 1); | |
1506 | |||
1507 | 3 | hexbufferused = gate_str_print_hex_uint16(hexbuffer, sizeof(hexbuffer), endpoint->ip6.address.item[5], false); | |
1508 | 3 | gate_strbuilder_append_text(&builder, hexbuffer, hexbufferused); gate_strbuilder_append_text(&builder, ":", 1); | |
1509 | |||
1510 | 3 | hexbufferused = gate_str_print_hex_uint16(hexbuffer, sizeof(hexbuffer), endpoint->ip6.address.item[6], false); | |
1511 | 3 | gate_strbuilder_append_text(&builder, hexbuffer, hexbufferused); gate_strbuilder_append_text(&builder, ":", 1); | |
1512 | |||
1513 | 3 | hexbufferused = gate_str_print_hex_uint16(hexbuffer, sizeof(hexbuffer), endpoint->ip6.address.item[7], false); | |
1514 | 3 | gate_strbuilder_append_text(&builder, hexbuffer, hexbufferused); | |
1515 | |||
1516 | |||
1517 | 3 | gate_strbuilder_append_text(&builder, "]", 1); | |
1518 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | if (endpoint->ip6.port) |
1519 | { | ||
1520 | 3 | gate_strbuilder_append_text(&builder, ":", 1); | |
1521 | 3 | gate_strbuilder_append_uint16(&builder, endpoint->ip6.port); | |
1522 | } | ||
1523 | |||
1524 | 3 | ret = GATE_RESULT_OK; | |
1525 | 3 | break; | |
1526 | } | ||
1527 | ✗ | default: | |
1528 | { | ||
1529 | ✗ | ret = GATE_RESULT_NOTSUPPORTED; | |
1530 | ✗ | break; | |
1531 | } | ||
1532 | } | ||
1533 | |||
1534 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
|
7 | if (NULL == gate_strbuilder_to_string(&builder, address)) |
1535 | { | ||
1536 | ✗ | ret = GATE_RESULT_OUTOFMEMORY; | |
1537 | } | ||
1538 | |||
1539 | 7 | gate_strbuilder_release(&builder); | |
1540 | |||
1541 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
|
7 | GATE_DEBUG_TRACE_FAILED(ret, "gate_socket_print_endpoint() failed"); |
1542 | |||
1543 | 7 | return ret; | |
1544 | } | ||
1545 | |||
1546 | 12 | gate_result_t gate_socket_load_endpoint(void const* ptr_in_native_sock_addr, gate_socket_endpoint_t* ptr_out_endpoint) | |
1547 | { | ||
1548 | 12 | gate_socket_addr_storage_t const* ptr_addr_storage = (gate_socket_addr_storage_t const*)ptr_in_native_sock_addr; | |
1549 | |||
1550 |
2/3✓ Branch 0 taken 9 times.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
12 | switch (ptr_addr_storage->addr.sa_family) |
1551 | { | ||
1552 | 9 | case AF_INET: | |
1553 | { | ||
1554 | 9 | ptr_out_endpoint->family = GATE_SOCKET_FAMILY_INET4; | |
1555 | 9 | gate_socket_build_ip4address(&ptr_addr_storage->addr4, &ptr_out_endpoint->ip4); | |
1556 | 9 | return GATE_RESULT_OK; | |
1557 | } | ||
1558 | 3 | case AF_INET6: | |
1559 | { | ||
1560 | #if defined(GATE_NET_SOCKET_NO_IPV6) | ||
1561 | return GATE_RESULT_NOTSUPPORTED; | ||
1562 | #else | ||
1563 | 3 | ptr_out_endpoint->family = GATE_SOCKET_FAMILY_INET6; | |
1564 | 3 | gate_socket_build_ip6address(&ptr_addr_storage->addr6, &ptr_out_endpoint->ip6); | |
1565 | 3 | return GATE_RESULT_OK; | |
1566 | #endif | ||
1567 | } | ||
1568 | #if !defined(GATE_NET_SOCKET_NO_UNIX) | ||
1569 | case AF_UNIX: | ||
1570 | { | ||
1571 | gate_size_t len = gate_str_length_max(ptr_addr_storage->unix.sun_path, sizeof(ptr_addr_storage->unix.sun_path)); | ||
1572 | ptr_out_endpoint->family = GATE_SOCKET_FAMILY_UNIX; | ||
1573 | gate_str_print_text(ptr_out_endpoint->unix_domain.path, sizeof(ptr_out_endpoint->unix_domain.path), | ||
1574 | ptr_addr_storage->unix.sun_path, len); | ||
1575 | return GATE_RESULT_OK; | ||
1576 | } | ||
1577 | #endif | ||
1578 | ✗ | default: | |
1579 | { | ||
1580 | ✗ | ptr_out_endpoint->family = GATE_SOCKET_FAMILY_NONE; | |
1581 | ✗ | return GATE_RESULT_NOTSUPPORTED; | |
1582 | } | ||
1583 | } | ||
1584 | |||
1585 | } | ||
1586 | |||
1587 | 2 | gate_result_t gate_socket_save_endpoint(gate_socket_endpoint_t const* ptr_src_endpoint, void* ptr_out_native_sock_addr, gate_size_t* ptr_out_native_sock_addr_len) | |
1588 | { | ||
1589 | 2 | gate_socket_addr_storage_t* ptr_addr_storage = (gate_socket_addr_storage_t*)ptr_out_native_sock_addr; | |
1590 | |||
1591 |
2/3✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | switch (ptr_src_endpoint->family) |
1592 | { | ||
1593 | 1 | case GATE_SOCKET_FAMILY_INET4: | |
1594 | { | ||
1595 | 1 | const gate_size_t addrlen = gate_socket_build_addr_ip4(&ptr_src_endpoint->ip4, &ptr_addr_storage->addr4); | |
1596 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if (ptr_out_native_sock_addr_len) |
1597 | { | ||
1598 | 1 | *ptr_out_native_sock_addr_len = addrlen; | |
1599 | } | ||
1600 | 1 | return GATE_RESULT_OK; | |
1601 | } | ||
1602 | 1 | case GATE_SOCKET_FAMILY_INET6: | |
1603 | { | ||
1604 | #if defined(GATE_NET_SOCKET_NO_IPV6) | ||
1605 | return GATE_RESULT_NOTSUPPORTED; | ||
1606 | #else | ||
1607 | 1 | const gate_size_t addrlen = gate_socket_build_addr_ip6(&ptr_src_endpoint->ip6, &ptr_addr_storage->addr6); | |
1608 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if (ptr_out_native_sock_addr_len) |
1609 | { | ||
1610 | 1 | *ptr_out_native_sock_addr_len = addrlen; | |
1611 | } | ||
1612 | 1 | return GATE_RESULT_OK; | |
1613 | #endif | ||
1614 | } | ||
1615 | #if !defined(GATE_NET_SOCKET_NO_UNIX) | ||
1616 | case GATE_SOCKET_FAMILY_UNIX: | ||
1617 | { | ||
1618 | gate_size_t len = gate_str_length_max(ptr_src_endpoint->unix_domain.path, sizeof(ptr_src_endpoint->unix_domain.path)); | ||
1619 | ptr_addr_storage->unix.sun_family = AF_UNIX; | ||
1620 | gate_str_print_text(ptr_addr_storage->unix.sun_path, sizeof(ptr_addr_storage->unix.sun_path), | ||
1621 | ptr_src_endpoint->unix_domain.path, len); | ||
1622 | if (ptr_out_native_sock_addr_len) | ||
1623 | { | ||
1624 | *ptr_out_native_sock_addr_len = sizeof(sockaddr_un); | ||
1625 | } | ||
1626 | return GATE_RESULT_OK; | ||
1627 | } | ||
1628 | #endif | ||
1629 | ✗ | default: | |
1630 | { | ||
1631 | ✗ | return GATE_RESULT_NOTSUPPORTED; | |
1632 | } | ||
1633 | } | ||
1634 | } | ||
1635 | |||
1636 | #endif /* GATE_NET_SOCKETS_BSDIMPL */ | ||
1637 | |||
1638 | |||
1639 | |||
1640 | #if defined(GATE_NET_SOCKETS_EFI) | ||
1641 | |||
1642 | gate_result_t gate_socket_init() | ||
1643 | { | ||
1644 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1645 | } | ||
1646 | |||
1647 | gate_bool_t gate_socket_support(gate_int16_t family) | ||
1648 | { | ||
1649 | GATE_UNUSED_ARG(family); | ||
1650 | return false; | ||
1651 | } | ||
1652 | |||
1653 | gate_result_t gate_socket_create(gate_int16_t type, gate_socket_t* sock) | ||
1654 | { | ||
1655 | GATE_UNUSED_ARG(type); | ||
1656 | GATE_UNUSED_ARG(sock); | ||
1657 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1658 | } | ||
1659 | gate_result_t gate_socket_create_ex(gate_int16_t family, gate_int16_t msgtype, gate_int16_t protocol, gate_socket_t* sock) | ||
1660 | { | ||
1661 | GATE_UNUSED_ARG(family); | ||
1662 | GATE_UNUSED_ARG(msgtype); | ||
1663 | GATE_UNUSED_ARG(protocol); | ||
1664 | GATE_UNUSED_ARG(sock); | ||
1665 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1666 | } | ||
1667 | gate_result_t gate_socket_connect(gate_socket_t sock, gate_socket_endpoint_t const* ep) | ||
1668 | { | ||
1669 | GATE_UNUSED_ARG(sock); | ||
1670 | GATE_UNUSED_ARG(ep); | ||
1671 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1672 | } | ||
1673 | gate_result_t gate_socket_connect_address(gate_socket_t sock, gate_string_t const* address) | ||
1674 | { | ||
1675 | GATE_UNUSED_ARG(sock); | ||
1676 | GATE_UNUSED_ARG(address); | ||
1677 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1678 | } | ||
1679 | gate_result_t gate_socket_bind(gate_socket_t sock, gate_socket_endpoint_t const* ep) | ||
1680 | { | ||
1681 | GATE_UNUSED_ARG(sock); | ||
1682 | GATE_UNUSED_ARG(ep); | ||
1683 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1684 | } | ||
1685 | gate_result_t gate_socket_bind_address(gate_socket_t sock, gate_string_t const* address) | ||
1686 | { | ||
1687 | GATE_UNUSED_ARG(sock); | ||
1688 | GATE_UNUSED_ARG(address); | ||
1689 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1690 | } | ||
1691 | gate_result_t gate_socket_listen(gate_socket_t sock, gate_int32_t backlog) | ||
1692 | { | ||
1693 | GATE_UNUSED_ARG(sock); | ||
1694 | GATE_UNUSED_ARG(backlog); | ||
1695 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1696 | } | ||
1697 | gate_result_t gate_socket_accept(gate_socket_t sock, gate_socket_t* newsock) | ||
1698 | { | ||
1699 | GATE_UNUSED_ARG(sock); | ||
1700 | GATE_UNUSED_ARG(newsock); | ||
1701 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1702 | } | ||
1703 | gate_result_t gate_socket_receive(gate_socket_t sock, char* buffer, gate_size_t bufferlen, gate_size_t* bufferused) | ||
1704 | { | ||
1705 | GATE_UNUSED_ARG(sock); | ||
1706 | GATE_UNUSED_ARG(buffer); | ||
1707 | GATE_UNUSED_ARG(bufferlen); | ||
1708 | GATE_UNUSED_ARG(bufferused); | ||
1709 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1710 | } | ||
1711 | gate_result_t gate_socket_receive_from(gate_socket_t sock, gate_socket_endpoint_t* ep, char* buffer, | ||
1712 | gate_size_t bufferlen, gate_size_t* bufferused, gate_uint16_t flags) | ||
1713 | { | ||
1714 | GATE_UNUSED_ARG(sock); | ||
1715 | GATE_UNUSED_ARG(ep); | ||
1716 | GATE_UNUSED_ARG(buffer); | ||
1717 | GATE_UNUSED_ARG(bufferlen); | ||
1718 | GATE_UNUSED_ARG(bufferused); | ||
1719 | GATE_UNUSED_ARG(flags); | ||
1720 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1721 | } | ||
1722 | gate_result_t gate_socket_send(gate_socket_t sock, char const* buffer, gate_size_t bufferlen, gate_size_t* bufferprocessed) | ||
1723 | { | ||
1724 | GATE_UNUSED_ARG(sock); | ||
1725 | GATE_UNUSED_ARG(buffer); | ||
1726 | GATE_UNUSED_ARG(bufferlen); | ||
1727 | GATE_UNUSED_ARG(bufferprocessed); | ||
1728 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1729 | } | ||
1730 | gate_result_t gate_socket_send_block(gate_socket_t sock, char const* buffer, gate_size_t bufferlen, gate_size_t* bufferprocessed) | ||
1731 | { | ||
1732 | GATE_UNUSED_ARG(sock); | ||
1733 | GATE_UNUSED_ARG(buffer); | ||
1734 | GATE_UNUSED_ARG(bufferlen); | ||
1735 | GATE_UNUSED_ARG(bufferprocessed); | ||
1736 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1737 | } | ||
1738 | gate_result_t gate_socket_send_to(gate_socket_t sock, gate_socket_endpoint_t const* to, char const* buffer, | ||
1739 | gate_size_t bufferlen, gate_size_t* bufferprocessed, gate_uint16_t flags) | ||
1740 | { | ||
1741 | GATE_UNUSED_ARG(sock); | ||
1742 | GATE_UNUSED_ARG(to); | ||
1743 | GATE_UNUSED_ARG(buffer); | ||
1744 | GATE_UNUSED_ARG(bufferlen); | ||
1745 | GATE_UNUSED_ARG(bufferprocessed); | ||
1746 | GATE_UNUSED_ARG(flags); | ||
1747 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1748 | } | ||
1749 | gate_result_t gate_socket_select(gate_socket_t const* socks, gate_size_t sockcount, gate_uint8_t* statusflags, gate_uint32_t timeout) | ||
1750 | { | ||
1751 | GATE_UNUSED_ARG(socks); | ||
1752 | GATE_UNUSED_ARG(sockcount); | ||
1753 | GATE_UNUSED_ARG(statusflags); | ||
1754 | GATE_UNUSED_ARG(timeout); | ||
1755 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1756 | } | ||
1757 | gate_result_t gate_socket_shutdown(gate_socket_t sock, gate_bool_t shutdownreceive, gate_bool_t shutdownsend) | ||
1758 | { | ||
1759 | GATE_UNUSED_ARG(sock); | ||
1760 | GATE_UNUSED_ARG(shutdownreceive); | ||
1761 | GATE_UNUSED_ARG(shutdownsend); | ||
1762 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1763 | } | ||
1764 | gate_result_t gate_socket_close(gate_socket_t sock) | ||
1765 | { | ||
1766 | GATE_UNUSED_ARG(sock); | ||
1767 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1768 | } | ||
1769 | gate_result_t gate_socket_get_option(gate_socket_t sock, gate_int32_t level, gate_int32_t option, void* buffer, gate_size_t* bufferlen) | ||
1770 | { | ||
1771 | GATE_UNUSED_ARG(sock); | ||
1772 | GATE_UNUSED_ARG(level); | ||
1773 | GATE_UNUSED_ARG(option); | ||
1774 | GATE_UNUSED_ARG(buffer); | ||
1775 | GATE_UNUSED_ARG(bufferlen); | ||
1776 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1777 | } | ||
1778 | gate_result_t gate_socket_set_option(gate_socket_t sock, gate_int32_t level, gate_int32_t option, void const* buffer, gate_size_t bufferlen) | ||
1779 | { | ||
1780 | GATE_UNUSED_ARG(sock); | ||
1781 | GATE_UNUSED_ARG(level); | ||
1782 | GATE_UNUSED_ARG(option); | ||
1783 | GATE_UNUSED_ARG(buffer); | ||
1784 | GATE_UNUSED_ARG(bufferlen); | ||
1785 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1786 | } | ||
1787 | gate_result_t gate_socket_get_local_endpoint(gate_socket_t sock, gate_socket_endpoint_t* ep) | ||
1788 | { | ||
1789 | GATE_UNUSED_ARG(sock); | ||
1790 | GATE_UNUSED_ARG(ep); | ||
1791 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1792 | } | ||
1793 | gate_result_t gate_socket_get_local_address(gate_socket_t sock, gate_string_t* address) | ||
1794 | { | ||
1795 | GATE_UNUSED_ARG(sock); | ||
1796 | GATE_UNUSED_ARG(address); | ||
1797 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1798 | } | ||
1799 | gate_result_t gate_socket_get_remote_endpoint(gate_socket_t sock, gate_socket_endpoint_t* ep) | ||
1800 | { | ||
1801 | GATE_UNUSED_ARG(sock); | ||
1802 | GATE_UNUSED_ARG(ep); | ||
1803 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1804 | } | ||
1805 | gate_result_t gate_socket_get_remote_address(gate_socket_t sock, gate_string_t* address) | ||
1806 | { | ||
1807 | GATE_UNUSED_ARG(sock); | ||
1808 | GATE_UNUSED_ARG(address); | ||
1809 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1810 | } | ||
1811 | gate_result_t gate_socket_parse_address(gate_string_t const* address, gate_string_t* host, gate_uint16_t* port, gate_int16_t* family) | ||
1812 | { | ||
1813 | GATE_UNUSED_ARG(address); | ||
1814 | GATE_UNUSED_ARG(host); | ||
1815 | GATE_UNUSED_ARG(port); | ||
1816 | GATE_UNUSED_ARG(family); | ||
1817 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1818 | } | ||
1819 | gate_result_t gate_socket_parse_endpoint(gate_string_t const* address, gate_socket_endpoint_t* endpoint) | ||
1820 | { | ||
1821 | GATE_UNUSED_ARG(address); | ||
1822 | GATE_UNUSED_ARG(endpoint); | ||
1823 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1824 | } | ||
1825 | gate_result_t gate_socket_print_endpoint(gate_socket_endpoint_t const* endpoint, gate_string_t* address) | ||
1826 | { | ||
1827 | GATE_UNUSED_ARG(endpoint); | ||
1828 | GATE_UNUSED_ARG(address); | ||
1829 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1830 | } | ||
1831 | |||
1832 | gate_result_t gate_socket_set(gate_socket_t sock, GATE_SOCKET_OPTION option, gate_int32_t value) | ||
1833 | { | ||
1834 | GATE_UNUSED_ARG(sock); | ||
1835 | GATE_UNUSED_ARG(option); | ||
1836 | GATE_UNUSED_ARG(value); | ||
1837 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1838 | } | ||
1839 | |||
1840 | gate_result_t gate_socket_parse_ip4(gate_string_t const* ip4text, gate_socket_ip4address_t* ip4address) | ||
1841 | { | ||
1842 | GATE_UNUSED_ARG(ip4text); | ||
1843 | GATE_UNUSED_ARG(ip4address); | ||
1844 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1845 | } | ||
1846 | |||
1847 | gate_result_t gate_socket_parse_ip6(gate_string_t const* ip6text, gate_socket_ip6address_t* ip6address) | ||
1848 | { | ||
1849 | GATE_UNUSED_ARG(ip6text); | ||
1850 | GATE_UNUSED_ARG(ip6address); | ||
1851 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1852 | } | ||
1853 | |||
1854 | gate_result_t gate_socket_load_endpoint(void const* ptr_in_native_sock_addr, gate_socket_endpoint_t* ptr_out_endpoint) | ||
1855 | { | ||
1856 | GATE_UNUSED_ARG(ptr_in_native_sock_addr); | ||
1857 | GATE_UNUSED_ARG(ptr_out_endpoint); | ||
1858 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1859 | } | ||
1860 | gate_result_t gate_socket_save_endpoint(gate_socket_endpoint_t const* ptr_src_endpoint, void* ptr_out_native_sock_addr, gate_size_t* ptr_out_native_sock_addr_len) | ||
1861 | { | ||
1862 | GATE_UNUSED_ARG(ptr_src_endpoint); | ||
1863 | GATE_UNUSED_ARG(ptr_out_native_sock_addr); | ||
1864 | GATE_UNUSED_ARG(ptr_out_native_sock_addr_len); | ||
1865 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1866 | } | ||
1867 | |||
1868 | #endif /* GATE_NET_SOCKETS_EFI */ | ||
1869 | |||
1870 | |||
1871 | |||
1872 | #if defined(GATE_NET_SOCKETS_NOIMPL) | ||
1873 | |||
1874 | gate_result_t gate_socket_init() | ||
1875 | { | ||
1876 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1877 | } | ||
1878 | |||
1879 | gate_bool_t gate_socket_support(gate_int16_t family) | ||
1880 | { | ||
1881 | GATE_UNUSED_ARG(family); | ||
1882 | return false; | ||
1883 | } | ||
1884 | |||
1885 | gate_result_t gate_socket_create(gate_int16_t type, gate_socket_t* sock) | ||
1886 | { | ||
1887 | GATE_UNUSED_ARG(type); | ||
1888 | GATE_UNUSED_ARG(sock); | ||
1889 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1890 | } | ||
1891 | gate_result_t gate_socket_create_ex(gate_int16_t family, gate_int16_t msgtype, gate_int16_t protocol, gate_socket_t* sock) | ||
1892 | { | ||
1893 | GATE_UNUSED_ARG(family); | ||
1894 | GATE_UNUSED_ARG(msgtype); | ||
1895 | GATE_UNUSED_ARG(protocol); | ||
1896 | GATE_UNUSED_ARG(sock); | ||
1897 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1898 | } | ||
1899 | gate_result_t gate_socket_connect(gate_socket_t sock, gate_socket_endpoint_t const* ep) | ||
1900 | { | ||
1901 | GATE_UNUSED_ARG(sock); | ||
1902 | GATE_UNUSED_ARG(ep); | ||
1903 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1904 | } | ||
1905 | gate_result_t gate_socket_connect_address(gate_socket_t sock, gate_string_t const* address) | ||
1906 | { | ||
1907 | GATE_UNUSED_ARG(sock); | ||
1908 | GATE_UNUSED_ARG(address); | ||
1909 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1910 | } | ||
1911 | gate_result_t gate_socket_bind(gate_socket_t sock, gate_socket_endpoint_t const* ep) | ||
1912 | { | ||
1913 | GATE_UNUSED_ARG(sock); | ||
1914 | GATE_UNUSED_ARG(ep); | ||
1915 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1916 | } | ||
1917 | gate_result_t gate_socket_bind_address(gate_socket_t sock, gate_string_t const* address) | ||
1918 | { | ||
1919 | GATE_UNUSED_ARG(sock); | ||
1920 | GATE_UNUSED_ARG(address); | ||
1921 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1922 | } | ||
1923 | gate_result_t gate_socket_listen(gate_socket_t sock, gate_int32_t backlog) | ||
1924 | { | ||
1925 | GATE_UNUSED_ARG(sock); | ||
1926 | GATE_UNUSED_ARG(backlog); | ||
1927 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1928 | } | ||
1929 | gate_result_t gate_socket_accept(gate_socket_t sock, gate_socket_t* newsock) | ||
1930 | { | ||
1931 | GATE_UNUSED_ARG(sock); | ||
1932 | GATE_UNUSED_ARG(newsock); | ||
1933 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1934 | } | ||
1935 | gate_result_t gate_socket_receive(gate_socket_t sock, char* buffer, gate_size_t bufferlen, gate_size_t* bufferused) | ||
1936 | { | ||
1937 | GATE_UNUSED_ARG(sock); | ||
1938 | GATE_UNUSED_ARG(buffer); | ||
1939 | GATE_UNUSED_ARG(bufferlen); | ||
1940 | GATE_UNUSED_ARG(bufferused); | ||
1941 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1942 | } | ||
1943 | gate_result_t gate_socket_receive_from(gate_socket_t sock, gate_socket_endpoint_t* ep, char* buffer, | ||
1944 | gate_size_t bufferlen, gate_size_t* bufferused, gate_uint16_t flags) | ||
1945 | { | ||
1946 | GATE_UNUSED_ARG(sock); | ||
1947 | GATE_UNUSED_ARG(ep); | ||
1948 | GATE_UNUSED_ARG(buffer); | ||
1949 | GATE_UNUSED_ARG(bufferlen); | ||
1950 | GATE_UNUSED_ARG(bufferused); | ||
1951 | GATE_UNUSED_ARG(flags); | ||
1952 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1953 | } | ||
1954 | gate_result_t gate_socket_send(gate_socket_t sock, char const* buffer, gate_size_t bufferlen, gate_size_t* bufferprocessed) | ||
1955 | { | ||
1956 | GATE_UNUSED_ARG(sock); | ||
1957 | GATE_UNUSED_ARG(buffer); | ||
1958 | GATE_UNUSED_ARG(bufferlen); | ||
1959 | GATE_UNUSED_ARG(bufferprocessed); | ||
1960 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1961 | } | ||
1962 | gate_result_t gate_socket_send_block(gate_socket_t sock, char const* buffer, gate_size_t bufferlen, gate_size_t* bufferprocessed) | ||
1963 | { | ||
1964 | GATE_UNUSED_ARG(sock); | ||
1965 | GATE_UNUSED_ARG(buffer); | ||
1966 | GATE_UNUSED_ARG(bufferlen); | ||
1967 | GATE_UNUSED_ARG(bufferprocessed); | ||
1968 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1969 | } | ||
1970 | gate_result_t gate_socket_send_to(gate_socket_t sock, gate_socket_endpoint_t const* to, char const* buffer, | ||
1971 | gate_size_t bufferlen, gate_size_t* bufferprocessed, gate_uint16_t flags) | ||
1972 | { | ||
1973 | GATE_UNUSED_ARG(sock); | ||
1974 | GATE_UNUSED_ARG(to); | ||
1975 | GATE_UNUSED_ARG(buffer); | ||
1976 | GATE_UNUSED_ARG(bufferlen); | ||
1977 | GATE_UNUSED_ARG(bufferprocessed); | ||
1978 | GATE_UNUSED_ARG(flags); | ||
1979 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1980 | } | ||
1981 | gate_result_t gate_socket_select(gate_socket_t const* socks, gate_size_t sockcount, gate_uint8_t* statusflags, gate_uint32_t timeout) | ||
1982 | { | ||
1983 | GATE_UNUSED_ARG(socks); | ||
1984 | GATE_UNUSED_ARG(sockcount); | ||
1985 | GATE_UNUSED_ARG(statusflags); | ||
1986 | GATE_UNUSED_ARG(timeout); | ||
1987 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1988 | } | ||
1989 | gate_result_t gate_socket_shutdown(gate_socket_t sock, gate_bool_t shutdownreceive, gate_bool_t shutdownsend) | ||
1990 | { | ||
1991 | GATE_UNUSED_ARG(sock); | ||
1992 | GATE_UNUSED_ARG(shutdownreceive); | ||
1993 | GATE_UNUSED_ARG(shutdownsend); | ||
1994 | return GATE_RESULT_NOTIMPLEMENTED; | ||
1995 | } | ||
1996 | gate_result_t gate_socket_close(gate_socket_t sock) | ||
1997 | { | ||
1998 | GATE_UNUSED_ARG(sock); | ||
1999 | return GATE_RESULT_NOTIMPLEMENTED; | ||
2000 | } | ||
2001 | gate_result_t gate_socket_get_option(gate_socket_t sock, gate_int32_t level, gate_int32_t option, void* buffer, gate_size_t* bufferlen) | ||
2002 | { | ||
2003 | GATE_UNUSED_ARG(sock); | ||
2004 | GATE_UNUSED_ARG(level); | ||
2005 | GATE_UNUSED_ARG(option); | ||
2006 | GATE_UNUSED_ARG(buffer); | ||
2007 | GATE_UNUSED_ARG(bufferlen); | ||
2008 | return GATE_RESULT_NOTIMPLEMENTED; | ||
2009 | } | ||
2010 | gate_result_t gate_socket_set_option(gate_socket_t sock, gate_int32_t level, gate_int32_t option, void const* buffer, gate_size_t bufferlen) | ||
2011 | { | ||
2012 | GATE_UNUSED_ARG(sock); | ||
2013 | GATE_UNUSED_ARG(level); | ||
2014 | GATE_UNUSED_ARG(option); | ||
2015 | GATE_UNUSED_ARG(buffer); | ||
2016 | GATE_UNUSED_ARG(bufferlen); | ||
2017 | return GATE_RESULT_NOTIMPLEMENTED; | ||
2018 | } | ||
2019 | gate_result_t gate_socket_get_local_endpoint(gate_socket_t sock, gate_socket_endpoint_t* ep) | ||
2020 | { | ||
2021 | GATE_UNUSED_ARG(sock); | ||
2022 | GATE_UNUSED_ARG(ep); | ||
2023 | return GATE_RESULT_NOTIMPLEMENTED; | ||
2024 | } | ||
2025 | gate_result_t gate_socket_get_local_address(gate_socket_t sock, gate_string_t* address) | ||
2026 | { | ||
2027 | GATE_UNUSED_ARG(sock); | ||
2028 | GATE_UNUSED_ARG(address); | ||
2029 | return GATE_RESULT_NOTIMPLEMENTED; | ||
2030 | } | ||
2031 | gate_result_t gate_socket_get_remote_endpoint(gate_socket_t sock, gate_socket_endpoint_t* ep) | ||
2032 | { | ||
2033 | GATE_UNUSED_ARG(sock); | ||
2034 | GATE_UNUSED_ARG(ep); | ||
2035 | return GATE_RESULT_NOTIMPLEMENTED; | ||
2036 | } | ||
2037 | gate_result_t gate_socket_get_remote_address(gate_socket_t sock, gate_string_t* address) | ||
2038 | { | ||
2039 | GATE_UNUSED_ARG(sock); | ||
2040 | GATE_UNUSED_ARG(address); | ||
2041 | return GATE_RESULT_NOTIMPLEMENTED; | ||
2042 | } | ||
2043 | gate_result_t gate_socket_parse_address(gate_string_t const* address, gate_string_t* host, gate_uint16_t* port, gate_int16_t* family) | ||
2044 | { | ||
2045 | GATE_UNUSED_ARG(address); | ||
2046 | GATE_UNUSED_ARG(host); | ||
2047 | GATE_UNUSED_ARG(port); | ||
2048 | GATE_UNUSED_ARG(family); | ||
2049 | return GATE_RESULT_NOTIMPLEMENTED; | ||
2050 | } | ||
2051 | gate_result_t gate_socket_parse_endpoint(gate_string_t const* address, gate_socket_endpoint_t* endpoint) | ||
2052 | { | ||
2053 | GATE_UNUSED_ARG(address); | ||
2054 | GATE_UNUSED_ARG(endpoint); | ||
2055 | return GATE_RESULT_NOTIMPLEMENTED; | ||
2056 | } | ||
2057 | gate_result_t gate_socket_print_endpoint(gate_socket_endpoint_t const* endpoint, gate_string_t* address) | ||
2058 | { | ||
2059 | GATE_UNUSED_ARG(endpoint); | ||
2060 | GATE_UNUSED_ARG(address); | ||
2061 | return GATE_RESULT_NOTIMPLEMENTED; | ||
2062 | } | ||
2063 | |||
2064 | gate_result_t gate_socket_set(gate_socket_t sock, GATE_SOCKET_OPTION option, gate_int32_t value) | ||
2065 | { | ||
2066 | GATE_UNUSED_ARG(sock); | ||
2067 | GATE_UNUSED_ARG(option); | ||
2068 | GATE_UNUSED_ARG(value); | ||
2069 | return GATE_RESULT_NOTIMPLEMENTED; | ||
2070 | } | ||
2071 | |||
2072 | gate_result_t gate_socket_parse_ip4(gate_string_t const* ip4text, gate_socket_ip4address_t* ip4address) | ||
2073 | { | ||
2074 | GATE_UNUSED_ARG(ip4text); | ||
2075 | GATE_UNUSED_ARG(ip4address); | ||
2076 | return GATE_RESULT_NOTIMPLEMENTED; | ||
2077 | } | ||
2078 | |||
2079 | gate_result_t gate_socket_parse_ip6(gate_string_t const* ip6text, gate_socket_ip6address_t* ip6address) | ||
2080 | { | ||
2081 | GATE_UNUSED_ARG(ip6text); | ||
2082 | GATE_UNUSED_ARG(ip6address); | ||
2083 | return GATE_RESULT_NOTIMPLEMENTED; | ||
2084 | } | ||
2085 | |||
2086 | gate_result_t gate_socket_load_endpoint(void const* ptr_in_native_sock_addr, gate_socket_endpoint_t* ptr_out_endpoint) | ||
2087 | { | ||
2088 | GATE_UNUSED_ARG(ptr_in_native_sock_addr); | ||
2089 | GATE_UNUSED_ARG(ptr_out_endpoint); | ||
2090 | return GATE_RESULT_NOTIMPLEMENTED; | ||
2091 | } | ||
2092 | gate_result_t gate_socket_save_endpoint(gate_socket_endpoint_t const* ptr_src_endpoint, void* ptr_out_native_sock_addr, gate_size_t* ptr_out_native_sock_addr_len) | ||
2093 | { | ||
2094 | GATE_UNUSED_ARG(ptr_src_endpoint); | ||
2095 | GATE_UNUSED_ARG(ptr_out_native_sock_addr); | ||
2096 | GATE_UNUSED_ARG(ptr_out_native_sock_addr_len); | ||
2097 | return GATE_RESULT_NOTIMPLEMENTED; | ||
2098 | } | ||
2099 | |||
2100 | #endif /* GATE_NET_SOCKETS_NOIMPL */ | ||
2101 | |||
2102 |