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)