]>
git.proxmox.com Git - mirror_qemu.git/blob - slirp/src/util.c
60bb2008013f6b53089883025505556722263e49
1 /* SPDX-License-Identifier: MIT */
3 * util.c (mostly based on QEMU os-win32.c)
5 * Copyright (c) 2003-2008 Fabrice Bellard
6 * Copyright (c) 2010-2016 Red Hat, Inc.
8 * QEMU library functions for win32 which are shared between QEMU and
11 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this software and associated documentation files (the "Software"), to deal
13 * in the Software without restriction, including without limitation the rights
14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 * copies of the Software, and to permit persons to whom the Software is
16 * furnished to do so, subject to the following conditions:
18 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
36 int slirp_inet_aton(const char *cp
, struct in_addr
*ia
)
38 uint32_t addr
= inet_addr(cp
);
39 if (addr
== 0xffffffff) {
47 void slirp_set_nonblock(int fd
)
51 f
= fcntl(fd
, F_GETFL
);
53 f
= fcntl(fd
, F_SETFL
, f
| O_NONBLOCK
);
56 unsigned long opt
= 1;
57 ioctlsocket(fd
, FIONBIO
, &opt
);
61 static void slirp_set_cloexec(int fd
)
65 f
= fcntl(fd
, F_GETFD
);
67 f
= fcntl(fd
, F_SETFD
, f
| FD_CLOEXEC
);
73 * Opens a socket with FD_CLOEXEC set
75 int slirp_socket(int domain
, int type
, int protocol
)
80 ret
= socket(domain
, type
| SOCK_CLOEXEC
, protocol
);
81 if (ret
!= -1 || errno
!= EINVAL
) {
85 ret
= socket(domain
, type
, protocol
);
87 slirp_set_cloexec(ret
);
94 static int socket_error(void)
96 switch (WSAGetLastError()) {
103 case WSA_INVALID_HANDLE
:
105 case WSA_NOT_ENOUGH_MEMORY
:
107 case WSA_INVALID_PARAMETER
:
109 case WSAENAMETOOLONG
:
114 /* not using EWOULDBLOCK as we don't want code to have
115 * to check both EWOULDBLOCK and EAGAIN */
123 case WSAEDESTADDRREQ
:
131 case WSAEPROTONOSUPPORT
:
132 return EPROTONOSUPPORT
;
135 case WSAEAFNOSUPPORT
:
139 case WSAEADDRNOTAVAIL
:
140 return EADDRNOTAVAIL
;
147 case WSAECONNABORTED
:
159 case WSAECONNREFUSED
:
163 case WSAEHOSTUNREACH
:
171 int slirp_ioctlsocket_wrap(int fd
, int req
, void *val
)
174 ret
= ioctlsocket(fd
, req
, val
);
176 errno
= socket_error();
182 int slirp_closesocket_wrap(int fd
)
185 ret
= closesocket(fd
);
187 errno
= socket_error();
193 int slirp_connect_wrap(int sockfd
, const struct sockaddr
*addr
, int addrlen
)
196 ret
= connect(sockfd
, addr
, addrlen
);
198 errno
= socket_error();
204 int slirp_listen_wrap(int sockfd
, int backlog
)
207 ret
= listen(sockfd
, backlog
);
209 errno
= socket_error();
215 int slirp_bind_wrap(int sockfd
, const struct sockaddr
*addr
, int addrlen
)
218 ret
= bind(sockfd
, addr
, addrlen
);
220 errno
= socket_error();
226 int slirp_socket_wrap(int domain
, int type
, int protocol
)
229 ret
= socket(domain
, type
, protocol
);
231 errno
= socket_error();
237 int slirp_accept_wrap(int sockfd
, struct sockaddr
*addr
, int *addrlen
)
240 ret
= accept(sockfd
, addr
, addrlen
);
242 errno
= socket_error();
248 int slirp_shutdown_wrap(int sockfd
, int how
)
251 ret
= shutdown(sockfd
, how
);
253 errno
= socket_error();
259 int slirp_getsockopt_wrap(int sockfd
, int level
, int optname
,
260 void *optval
, int *optlen
)
263 ret
= getsockopt(sockfd
, level
, optname
, optval
, optlen
);
265 errno
= socket_error();
271 int slirp_setsockopt_wrap(int sockfd
, int level
, int optname
,
272 const void *optval
, int optlen
)
275 ret
= setsockopt(sockfd
, level
, optname
, optval
, optlen
);
277 errno
= socket_error();
283 int slirp_getpeername_wrap(int sockfd
, struct sockaddr
*addr
,
287 ret
= getpeername(sockfd
, addr
, addrlen
);
289 errno
= socket_error();
295 int slirp_getsockname_wrap(int sockfd
, struct sockaddr
*addr
,
299 ret
= getsockname(sockfd
, addr
, addrlen
);
301 errno
= socket_error();
307 ssize_t
slirp_send_wrap(int sockfd
, const void *buf
, size_t len
, int flags
)
310 ret
= send(sockfd
, buf
, len
, flags
);
312 errno
= socket_error();
318 ssize_t
slirp_sendto_wrap(int sockfd
, const void *buf
, size_t len
, int flags
,
319 const struct sockaddr
*addr
, int addrlen
)
322 ret
= sendto(sockfd
, buf
, len
, flags
, addr
, addrlen
);
324 errno
= socket_error();
330 ssize_t
slirp_recv_wrap(int sockfd
, void *buf
, size_t len
, int flags
)
333 ret
= recv(sockfd
, buf
, len
, flags
);
335 errno
= socket_error();
341 ssize_t
slirp_recvfrom_wrap(int sockfd
, void *buf
, size_t len
, int flags
,
342 struct sockaddr
*addr
, int *addrlen
)
345 ret
= recvfrom(sockfd
, buf
, len
, flags
, addr
, addrlen
);
347 errno
= socket_error();
353 void slirp_pstrcpy(char *buf
, int buf_size
, const char *str
)
363 if (c
== 0 || q
>= buf
+ buf_size
- 1)