xref: /qemu/util/oslib-win32.c (revision a81df1b6)
1 /*
2  * os-win32.c
3  *
4  * Copyright (c) 2003-2008 Fabrice Bellard
5  * Copyright (c) 2010-2016 Red Hat, Inc.
6  *
7  * QEMU library functions for win32 which are shared between QEMU and
8  * the QEMU tools.
9  *
10  * Permission is hereby granted, free of charge, to any person obtaining a copy
11  * of this software and associated documentation files (the "Software"), to deal
12  * in the Software without restriction, including without limitation the rights
13  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14  * copies of the Software, and to permit persons to whom the Software is
15  * furnished to do so, subject to the following conditions:
16  *
17  * The above copyright notice and this permission notice shall be included in
18  * all copies or substantial portions of the Software.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26  * THE SOFTWARE.
27  *
28  * The implementation of g_poll (functions poll_rest, g_poll) at the end of
29  * this file are based on code from GNOME glib-2 and use a different license,
30  * see the license comment there.
31  */
32 
33 #include "qemu/osdep.h"
34 #include <windows.h>
35 #include "qemu-common.h"
36 #include "qapi/error.h"
37 #include "sysemu/sysemu.h"
38 #include "qemu/main-loop.h"
39 #include "trace.h"
40 #include "qemu/sockets.h"
41 #include "qemu/cutils.h"
42 
43 /* this must come after including "trace.h" */
44 #include <shlobj.h>
45 
46 void *qemu_oom_check(void *ptr)
47 {
48     if (ptr == NULL) {
49         fprintf(stderr, "Failed to allocate memory: %lu\n", GetLastError());
50         abort();
51     }
52     return ptr;
53 }
54 
55 void *qemu_try_memalign(size_t alignment, size_t size)
56 {
57     void *ptr;
58 
59     if (!size) {
60         abort();
61     }
62     ptr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
63     trace_qemu_memalign(alignment, size, ptr);
64     return ptr;
65 }
66 
67 void *qemu_memalign(size_t alignment, size_t size)
68 {
69     return qemu_oom_check(qemu_try_memalign(alignment, size));
70 }
71 
72 static int get_allocation_granularity(void)
73 {
74     SYSTEM_INFO system_info;
75 
76     GetSystemInfo(&system_info);
77     return system_info.dwAllocationGranularity;
78 }
79 
80 void *qemu_anon_ram_alloc(size_t size, uint64_t *align, bool shared)
81 {
82     void *ptr;
83 
84     ptr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
85     trace_qemu_anon_ram_alloc(size, ptr);
86 
87     if (ptr && align) {
88         *align = MAX(get_allocation_granularity(), getpagesize());
89     }
90     return ptr;
91 }
92 
93 void qemu_vfree(void *ptr)
94 {
95     trace_qemu_vfree(ptr);
96     if (ptr) {
97         VirtualFree(ptr, 0, MEM_RELEASE);
98     }
99 }
100 
101 void qemu_anon_ram_free(void *ptr, size_t size)
102 {
103     trace_qemu_anon_ram_free(ptr, size);
104     if (ptr) {
105         VirtualFree(ptr, 0, MEM_RELEASE);
106     }
107 }
108 
109 #ifndef CONFIG_LOCALTIME_R
110 /* FIXME: add proper locking */
111 struct tm *gmtime_r(const time_t *timep, struct tm *result)
112 {
113     struct tm *p = gmtime(timep);
114     memset(result, 0, sizeof(*result));
115     if (p) {
116         *result = *p;
117         p = result;
118     }
119     return p;
120 }
121 
122 /* FIXME: add proper locking */
123 struct tm *localtime_r(const time_t *timep, struct tm *result)
124 {
125     struct tm *p = localtime(timep);
126     memset(result, 0, sizeof(*result));
127     if (p) {
128         *result = *p;
129         p = result;
130     }
131     return p;
132 }
133 #endif /* CONFIG_LOCALTIME_R */
134 
135 static int socket_error(void)
136 {
137     switch (WSAGetLastError()) {
138     case 0:
139         return 0;
140     case WSAEINTR:
141         return EINTR;
142     case WSAEINVAL:
143         return EINVAL;
144     case WSA_INVALID_HANDLE:
145         return EBADF;
146     case WSA_NOT_ENOUGH_MEMORY:
147         return ENOMEM;
148     case WSA_INVALID_PARAMETER:
149         return EINVAL;
150     case WSAENAMETOOLONG:
151         return ENAMETOOLONG;
152     case WSAENOTEMPTY:
153         return ENOTEMPTY;
154     case WSAEWOULDBLOCK:
155          /* not using EWOULDBLOCK as we don't want code to have
156           * to check both EWOULDBLOCK and EAGAIN */
157         return EAGAIN;
158     case WSAEINPROGRESS:
159         return EINPROGRESS;
160     case WSAEALREADY:
161         return EALREADY;
162     case WSAENOTSOCK:
163         return ENOTSOCK;
164     case WSAEDESTADDRREQ:
165         return EDESTADDRREQ;
166     case WSAEMSGSIZE:
167         return EMSGSIZE;
168     case WSAEPROTOTYPE:
169         return EPROTOTYPE;
170     case WSAENOPROTOOPT:
171         return ENOPROTOOPT;
172     case WSAEPROTONOSUPPORT:
173         return EPROTONOSUPPORT;
174     case WSAEOPNOTSUPP:
175         return EOPNOTSUPP;
176     case WSAEAFNOSUPPORT:
177         return EAFNOSUPPORT;
178     case WSAEADDRINUSE:
179         return EADDRINUSE;
180     case WSAEADDRNOTAVAIL:
181         return EADDRNOTAVAIL;
182     case WSAENETDOWN:
183         return ENETDOWN;
184     case WSAENETUNREACH:
185         return ENETUNREACH;
186     case WSAENETRESET:
187         return ENETRESET;
188     case WSAECONNABORTED:
189         return ECONNABORTED;
190     case WSAECONNRESET:
191         return ECONNRESET;
192     case WSAENOBUFS:
193         return ENOBUFS;
194     case WSAEISCONN:
195         return EISCONN;
196     case WSAENOTCONN:
197         return ENOTCONN;
198     case WSAETIMEDOUT:
199         return ETIMEDOUT;
200     case WSAECONNREFUSED:
201         return ECONNREFUSED;
202     case WSAELOOP:
203         return ELOOP;
204     case WSAEHOSTUNREACH:
205         return EHOSTUNREACH;
206     default:
207         return EIO;
208     }
209 }
210 
211 void qemu_set_block(int fd)
212 {
213     unsigned long opt = 0;
214     WSAEventSelect(fd, NULL, 0);
215     ioctlsocket(fd, FIONBIO, &opt);
216 }
217 
218 int qemu_try_set_nonblock(int fd)
219 {
220     unsigned long opt = 1;
221     if (ioctlsocket(fd, FIONBIO, &opt) != NO_ERROR) {
222         return -socket_error();
223     }
224     qemu_fd_register(fd);
225     return 0;
226 }
227 
228 void qemu_set_nonblock(int fd)
229 {
230     (void)qemu_try_set_nonblock(fd);
231 }
232 
233 int socket_set_fast_reuse(int fd)
234 {
235     /* Enabling the reuse of an endpoint that was used by a socket still in
236      * TIME_WAIT state is usually performed by setting SO_REUSEADDR. On Windows
237      * fast reuse is the default and SO_REUSEADDR does strange things. So we
238      * don't have to do anything here. More info can be found at:
239      * http://msdn.microsoft.com/en-us/library/windows/desktop/ms740621.aspx */
240     return 0;
241 }
242 
243 int inet_aton(const char *cp, struct in_addr *ia)
244 {
245     uint32_t addr = inet_addr(cp);
246     if (addr == 0xffffffff) {
247         return 0;
248     }
249     ia->s_addr = addr;
250     return 1;
251 }
252 
253 void qemu_set_cloexec(int fd)
254 {
255 }
256 
257 /* Offset between 1/1/1601 and 1/1/1970 in 100 nanosec units */
258 #define _W32_FT_OFFSET (116444736000000000ULL)
259 
260 int qemu_gettimeofday(qemu_timeval *tp)
261 {
262   union {
263     unsigned long long ns100; /*time since 1 Jan 1601 in 100ns units */
264     FILETIME ft;
265   }  _now;
266 
267   if(tp) {
268       GetSystemTimeAsFileTime (&_now.ft);
269       tp->tv_usec=(long)((_now.ns100 / 10ULL) % 1000000ULL );
270       tp->tv_sec= (long)((_now.ns100 - _W32_FT_OFFSET) / 10000000ULL);
271   }
272   /* Always return 0 as per Open Group Base Specifications Issue 6.
273      Do not set errno on error.  */
274   return 0;
275 }
276 
277 int qemu_get_thread_id(void)
278 {
279     return GetCurrentThreadId();
280 }
281 
282 char *
283 qemu_get_local_state_pathname(const char *relative_pathname)
284 {
285     HRESULT result;
286     char base_path[MAX_PATH+1] = "";
287 
288     result = SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL,
289                              /* SHGFP_TYPE_CURRENT */ 0, base_path);
290     if (result != S_OK) {
291         /* misconfigured environment */
292         g_critical("CSIDL_COMMON_APPDATA unavailable: %ld", (long)result);
293         abort();
294     }
295     return g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", base_path,
296                            relative_pathname);
297 }
298 
299 void qemu_set_tty_echo(int fd, bool echo)
300 {
301     HANDLE handle = (HANDLE)_get_osfhandle(fd);
302     DWORD dwMode = 0;
303 
304     if (handle == INVALID_HANDLE_VALUE) {
305         return;
306     }
307 
308     GetConsoleMode(handle, &dwMode);
309 
310     if (echo) {
311         SetConsoleMode(handle, dwMode | ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT);
312     } else {
313         SetConsoleMode(handle,
314                        dwMode & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT));
315     }
316 }
317 
318 static char exec_dir[PATH_MAX];
319 
320 void qemu_init_exec_dir(const char *argv0)
321 {
322 
323     char *p;
324     char buf[MAX_PATH];
325     DWORD len;
326 
327     len = GetModuleFileName(NULL, buf, sizeof(buf) - 1);
328     if (len == 0) {
329         return;
330     }
331 
332     buf[len] = 0;
333     p = buf + len - 1;
334     while (p != buf && *p != '\\') {
335         p--;
336     }
337     *p = 0;
338     if (access(buf, R_OK) == 0) {
339         pstrcpy(exec_dir, sizeof(exec_dir), buf);
340     }
341 }
342 
343 char *qemu_get_exec_dir(void)
344 {
345     return g_strdup(exec_dir);
346 }
347 
348 #if !GLIB_CHECK_VERSION(2, 50, 0)
349 /*
350  * The original implementation of g_poll from glib has a problem on Windows
351  * when using timeouts < 10 ms.
352  *
353  * Whenever g_poll is called with timeout < 10 ms, it does a quick poll instead
354  * of wait. This causes significant performance degradation of QEMU.
355  *
356  * The following code is a copy of the original code from glib/gpoll.c
357  * (glib commit 20f4d1820b8d4d0fc4447188e33efffd6d4a88d8 from 2014-02-19).
358  * Some debug code was removed and the code was reformatted.
359  * All other code modifications are marked with 'QEMU'.
360  */
361 
362 /*
363  * gpoll.c: poll(2) abstraction
364  * Copyright 1998 Owen Taylor
365  * Copyright 2008 Red Hat, Inc.
366  *
367  * This library is free software; you can redistribute it and/or
368  * modify it under the terms of the GNU Lesser General Public
369  * License as published by the Free Software Foundation; either
370  * version 2 of the License, or (at your option) any later version.
371  *
372  * This library is distributed in the hope that it will be useful,
373  * but WITHOUT ANY WARRANTY; without even the implied warranty of
374  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
375  * Lesser General Public License for more details.
376  *
377  * You should have received a copy of the GNU Lesser General Public
378  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
379  */
380 
381 static int poll_rest(gboolean poll_msgs, HANDLE *handles, gint nhandles,
382                      GPollFD *fds, guint nfds, gint timeout)
383 {
384     DWORD ready;
385     GPollFD *f;
386     int recursed_result;
387 
388     if (poll_msgs) {
389         /* Wait for either messages or handles
390          * -> Use MsgWaitForMultipleObjectsEx
391          */
392         ready = MsgWaitForMultipleObjectsEx(nhandles, handles, timeout,
393                                             QS_ALLINPUT, MWMO_ALERTABLE);
394 
395         if (ready == WAIT_FAILED) {
396             gchar *emsg = g_win32_error_message(GetLastError());
397             g_warning("MsgWaitForMultipleObjectsEx failed: %s", emsg);
398             g_free(emsg);
399         }
400     } else if (nhandles == 0) {
401         /* No handles to wait for, just the timeout */
402         if (timeout == INFINITE) {
403             ready = WAIT_FAILED;
404         } else {
405             SleepEx(timeout, TRUE);
406             ready = WAIT_TIMEOUT;
407         }
408     } else {
409         /* Wait for just handles
410          * -> Use WaitForMultipleObjectsEx
411          */
412         ready =
413             WaitForMultipleObjectsEx(nhandles, handles, FALSE, timeout, TRUE);
414         if (ready == WAIT_FAILED) {
415             gchar *emsg = g_win32_error_message(GetLastError());
416             g_warning("WaitForMultipleObjectsEx failed: %s", emsg);
417             g_free(emsg);
418         }
419     }
420 
421     if (ready == WAIT_FAILED) {
422         return -1;
423     } else if (ready == WAIT_TIMEOUT || ready == WAIT_IO_COMPLETION) {
424         return 0;
425     } else if (poll_msgs && ready == WAIT_OBJECT_0 + nhandles) {
426         for (f = fds; f < &fds[nfds]; ++f) {
427             if (f->fd == G_WIN32_MSG_HANDLE && f->events & G_IO_IN) {
428                 f->revents |= G_IO_IN;
429             }
430         }
431 
432         /* If we have a timeout, or no handles to poll, be satisfied
433          * with just noticing we have messages waiting.
434          */
435         if (timeout != 0 || nhandles == 0) {
436             return 1;
437         }
438 
439         /* If no timeout and handles to poll, recurse to poll them,
440          * too.
441          */
442         recursed_result = poll_rest(FALSE, handles, nhandles, fds, nfds, 0);
443         return (recursed_result == -1) ? -1 : 1 + recursed_result;
444     } else if (/* QEMU: removed the following unneeded statement which causes
445                 * a compiler warning: ready >= WAIT_OBJECT_0 && */
446                ready < WAIT_OBJECT_0 + nhandles) {
447         for (f = fds; f < &fds[nfds]; ++f) {
448             if ((HANDLE) f->fd == handles[ready - WAIT_OBJECT_0]) {
449                 f->revents = f->events;
450             }
451         }
452 
453         /* If no timeout and polling several handles, recurse to poll
454          * the rest of them.
455          */
456         if (timeout == 0 && nhandles > 1) {
457             /* Remove the handle that fired */
458             int i;
459             for (i = ready - WAIT_OBJECT_0 + 1; i < nhandles; i++) {
460                 handles[i-1] = handles[i];
461             }
462             nhandles--;
463             recursed_result = poll_rest(FALSE, handles, nhandles, fds, nfds, 0);
464             return (recursed_result == -1) ? -1 : 1 + recursed_result;
465         }
466         return 1;
467     }
468 
469     return 0;
470 }
471 
472 gint g_poll(GPollFD *fds, guint nfds, gint timeout)
473 {
474     HANDLE handles[MAXIMUM_WAIT_OBJECTS];
475     gboolean poll_msgs = FALSE;
476     GPollFD *f;
477     gint nhandles = 0;
478     int retval;
479 
480     for (f = fds; f < &fds[nfds]; ++f) {
481         if (f->fd == G_WIN32_MSG_HANDLE && (f->events & G_IO_IN)) {
482             poll_msgs = TRUE;
483         } else if (f->fd > 0) {
484             /* Don't add the same handle several times into the array, as
485              * docs say that is not allowed, even if it actually does seem
486              * to work.
487              */
488             gint i;
489 
490             for (i = 0; i < nhandles; i++) {
491                 if (handles[i] == (HANDLE) f->fd) {
492                     break;
493                 }
494             }
495 
496             if (i == nhandles) {
497                 if (nhandles == MAXIMUM_WAIT_OBJECTS) {
498                     g_warning("Too many handles to wait for!\n");
499                     break;
500                 } else {
501                     handles[nhandles++] = (HANDLE) f->fd;
502                 }
503             }
504         }
505     }
506 
507     for (f = fds; f < &fds[nfds]; ++f) {
508         f->revents = 0;
509     }
510 
511     if (timeout == -1) {
512         timeout = INFINITE;
513     }
514 
515     /* Polling for several things? */
516     if (nhandles > 1 || (nhandles > 0 && poll_msgs)) {
517         /* First check if one or several of them are immediately
518          * available
519          */
520         retval = poll_rest(poll_msgs, handles, nhandles, fds, nfds, 0);
521 
522         /* If not, and we have a significant timeout, poll again with
523          * timeout then. Note that this will return indication for only
524          * one event, or only for messages. We ignore timeouts less than
525          * ten milliseconds as they are mostly pointless on Windows, the
526          * MsgWaitForMultipleObjectsEx() call will timeout right away
527          * anyway.
528          *
529          * Modification for QEMU: replaced timeout >= 10 by timeout > 0.
530          */
531         if (retval == 0 && (timeout == INFINITE || timeout > 0)) {
532             retval = poll_rest(poll_msgs, handles, nhandles,
533                                fds, nfds, timeout);
534         }
535     } else {
536         /* Just polling for one thing, so no need to check first if
537          * available immediately
538          */
539         retval = poll_rest(poll_msgs, handles, nhandles, fds, nfds, timeout);
540     }
541 
542     if (retval == -1) {
543         for (f = fds; f < &fds[nfds]; ++f) {
544             f->revents = 0;
545         }
546     }
547 
548     return retval;
549 }
550 #endif
551 
552 int getpagesize(void)
553 {
554     SYSTEM_INFO system_info;
555 
556     GetSystemInfo(&system_info);
557     return system_info.dwPageSize;
558 }
559 
560 void os_mem_prealloc(int fd, char *area, size_t memory, int smp_cpus,
561                      Error **errp)
562 {
563     int i;
564     size_t pagesize = qemu_real_host_page_size;
565 
566     memory = (memory + pagesize - 1) & -pagesize;
567     for (i = 0; i < memory / pagesize; i++) {
568         memset(area + pagesize * i, 0, 1);
569     }
570 }
571 
572 char *qemu_get_pid_name(pid_t pid)
573 {
574     /* XXX Implement me */
575     abort();
576 }
577 
578 
579 pid_t qemu_fork(Error **errp)
580 {
581     errno = ENOSYS;
582     error_setg_errno(errp, errno,
583                      "cannot fork child process");
584     return -1;
585 }
586 
587 
588 #undef connect
589 int qemu_connect_wrap(int sockfd, const struct sockaddr *addr,
590                       socklen_t addrlen)
591 {
592     int ret;
593     ret = connect(sockfd, addr, addrlen);
594     if (ret < 0) {
595         if (WSAGetLastError() == WSAEWOULDBLOCK) {
596             errno = EINPROGRESS;
597         } else {
598             errno = socket_error();
599         }
600     }
601     return ret;
602 }
603 
604 
605 #undef listen
606 int qemu_listen_wrap(int sockfd, int backlog)
607 {
608     int ret;
609     ret = listen(sockfd, backlog);
610     if (ret < 0) {
611         errno = socket_error();
612     }
613     return ret;
614 }
615 
616 
617 #undef bind
618 int qemu_bind_wrap(int sockfd, const struct sockaddr *addr,
619                    socklen_t addrlen)
620 {
621     int ret;
622     ret = bind(sockfd, addr, addrlen);
623     if (ret < 0) {
624         errno = socket_error();
625     }
626     return ret;
627 }
628 
629 
630 #undef socket
631 int qemu_socket_wrap(int domain, int type, int protocol)
632 {
633     int ret;
634     ret = socket(domain, type, protocol);
635     if (ret < 0) {
636         errno = socket_error();
637     }
638     return ret;
639 }
640 
641 
642 #undef accept
643 int qemu_accept_wrap(int sockfd, struct sockaddr *addr,
644                      socklen_t *addrlen)
645 {
646     int ret;
647     ret = accept(sockfd, addr, addrlen);
648     if (ret < 0) {
649         errno = socket_error();
650     }
651     return ret;
652 }
653 
654 
655 #undef shutdown
656 int qemu_shutdown_wrap(int sockfd, int how)
657 {
658     int ret;
659     ret = shutdown(sockfd, how);
660     if (ret < 0) {
661         errno = socket_error();
662     }
663     return ret;
664 }
665 
666 
667 #undef ioctlsocket
668 int qemu_ioctlsocket_wrap(int fd, int req, void *val)
669 {
670     int ret;
671     ret = ioctlsocket(fd, req, val);
672     if (ret < 0) {
673         errno = socket_error();
674     }
675     return ret;
676 }
677 
678 
679 #undef closesocket
680 int qemu_closesocket_wrap(int fd)
681 {
682     int ret;
683     ret = closesocket(fd);
684     if (ret < 0) {
685         errno = socket_error();
686     }
687     return ret;
688 }
689 
690 
691 #undef getsockopt
692 int qemu_getsockopt_wrap(int sockfd, int level, int optname,
693                          void *optval, socklen_t *optlen)
694 {
695     int ret;
696     ret = getsockopt(sockfd, level, optname, optval, optlen);
697     if (ret < 0) {
698         errno = socket_error();
699     }
700     return ret;
701 }
702 
703 
704 #undef setsockopt
705 int qemu_setsockopt_wrap(int sockfd, int level, int optname,
706                          const void *optval, socklen_t optlen)
707 {
708     int ret;
709     ret = setsockopt(sockfd, level, optname, optval, optlen);
710     if (ret < 0) {
711         errno = socket_error();
712     }
713     return ret;
714 }
715 
716 
717 #undef getpeername
718 int qemu_getpeername_wrap(int sockfd, struct sockaddr *addr,
719                           socklen_t *addrlen)
720 {
721     int ret;
722     ret = getpeername(sockfd, addr, addrlen);
723     if (ret < 0) {
724         errno = socket_error();
725     }
726     return ret;
727 }
728 
729 
730 #undef getsockname
731 int qemu_getsockname_wrap(int sockfd, struct sockaddr *addr,
732                           socklen_t *addrlen)
733 {
734     int ret;
735     ret = getsockname(sockfd, addr, addrlen);
736     if (ret < 0) {
737         errno = socket_error();
738     }
739     return ret;
740 }
741 
742 
743 #undef send
744 ssize_t qemu_send_wrap(int sockfd, const void *buf, size_t len, int flags)
745 {
746     int ret;
747     ret = send(sockfd, buf, len, flags);
748     if (ret < 0) {
749         errno = socket_error();
750     }
751     return ret;
752 }
753 
754 
755 #undef sendto
756 ssize_t qemu_sendto_wrap(int sockfd, const void *buf, size_t len, int flags,
757                          const struct sockaddr *addr, socklen_t addrlen)
758 {
759     int ret;
760     ret = sendto(sockfd, buf, len, flags, addr, addrlen);
761     if (ret < 0) {
762         errno = socket_error();
763     }
764     return ret;
765 }
766 
767 
768 #undef recv
769 ssize_t qemu_recv_wrap(int sockfd, void *buf, size_t len, int flags)
770 {
771     int ret;
772     ret = recv(sockfd, buf, len, flags);
773     if (ret < 0) {
774         errno = socket_error();
775     }
776     return ret;
777 }
778 
779 
780 #undef recvfrom
781 ssize_t qemu_recvfrom_wrap(int sockfd, void *buf, size_t len, int flags,
782                            struct sockaddr *addr, socklen_t *addrlen)
783 {
784     int ret;
785     ret = recvfrom(sockfd, buf, len, flags, addr, addrlen);
786     if (ret < 0) {
787         errno = socket_error();
788     }
789     return ret;
790 }
791 
792 bool qemu_write_pidfile(const char *filename, Error **errp)
793 {
794     char buffer[128];
795     int len;
796     HANDLE file;
797     OVERLAPPED overlap;
798     BOOL ret;
799     memset(&overlap, 0, sizeof(overlap));
800 
801     file = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ, NULL,
802                       OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
803 
804     if (file == INVALID_HANDLE_VALUE) {
805         error_setg(errp, "Failed to create PID file");
806         return false;
807     }
808     len = snprintf(buffer, sizeof(buffer), FMT_pid "\n", (pid_t)getpid());
809     ret = WriteFile(file, (LPCVOID)buffer, (DWORD)len,
810                     NULL, &overlap);
811     CloseHandle(file);
812     if (ret == 0) {
813         error_setg(errp, "Failed to write PID file");
814         return false;
815     }
816     return true;
817 }
818 
819 char *qemu_get_host_name(Error **errp)
820 {
821     wchar_t tmp[MAX_COMPUTERNAME_LENGTH + 1];
822     DWORD size = G_N_ELEMENTS(tmp);
823 
824     if (GetComputerNameW(tmp, &size) == 0) {
825         error_setg_win32(errp, GetLastError(), "failed close handle");
826         return NULL;
827     }
828 
829     return g_utf16_to_utf8(tmp, size, NULL, NULL, NULL);
830 }
831 
832 size_t qemu_get_host_physmem(void)
833 {
834     MEMORYSTATUSEX statex;
835     statex.dwLength = sizeof(statex);
836 
837     if (GlobalMemoryStatusEx(&statex)) {
838         return statex.ullTotalPhys;
839     }
840     return 0;
841 }
842