1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#include <windows.h>
26#include <mmsystem.h>
27#include <unistd.h>
28#include <fcntl.h>
29#include <signal.h>
30#include <time.h>
31#include <errno.h>
32#include <sys/time.h>
33#include "config-host.h"
34#include "sysemu/sysemu.h"
35#include "qemu-options.h"
36
37
38
39
40int setenv(const char *name, const char *value, int overwrite)
41{
42 int result = 0;
43 if (overwrite || !getenv(name)) {
44 size_t length = strlen(name) + strlen(value) + 2;
45 char *string = g_malloc(length);
46 snprintf(string, length, "%s=%s", name, value);
47 result = putenv(string);
48
49
50
51
52
53
54 g_free(string);
55 }
56 return result;
57}
58
59static BOOL WINAPI qemu_ctrl_handler(DWORD type)
60{
61 qemu_system_shutdown_request();
62
63
64
65
66 Sleep(10000);
67
68 return TRUE;
69}
70
71static TIMECAPS mm_tc;
72
73static void os_undo_timer_resolution(void)
74{
75 timeEndPeriod(mm_tc.wPeriodMin);
76}
77
78void os_setup_early_signal_handling(void)
79{
80 SetConsoleCtrlHandler(qemu_ctrl_handler, TRUE);
81 timeGetDevCaps(&mm_tc, sizeof(mm_tc));
82 timeBeginPeriod(mm_tc.wPeriodMin);
83 atexit(os_undo_timer_resolution);
84}
85
86
87char *os_find_datadir(void)
88{
89 return qemu_get_exec_dir();
90}
91
92void os_set_line_buffering(void)
93{
94 setbuf(stdout, NULL);
95 setbuf(stderr, NULL);
96}
97
98
99
100
101
102void os_parse_cmd_args(int index, const char *optarg)
103{
104 return;
105}
106
107int qemu_create_pidfile(const char *filename)
108{
109 char buffer[128];
110 int len;
111 HANDLE file;
112 OVERLAPPED overlap;
113 BOOL ret;
114 memset(&overlap, 0, sizeof(overlap));
115
116 file = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ, NULL,
117 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
118
119 if (file == INVALID_HANDLE_VALUE) {
120 return -1;
121 }
122 len = snprintf(buffer, sizeof(buffer), "%d\n", getpid());
123 ret = WriteFile(file, (LPCVOID)buffer, (DWORD)len,
124 NULL, &overlap);
125 CloseHandle(file);
126 if (ret == 0) {
127 return -1;
128 }
129 return 0;
130}
131