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(const char *argv0)
88{
89 char *p;
90 char buf[MAX_PATH];
91 DWORD len;
92
93 len = GetModuleFileName(NULL, buf, sizeof(buf) - 1);
94 if (len == 0) {
95 return NULL;
96 }
97
98 buf[len] = 0;
99 p = buf + len - 1;
100 while (p != buf && *p != '\\')
101 p--;
102 *p = 0;
103 if (access(buf, R_OK) == 0) {
104 return g_strdup(buf);
105 }
106 return NULL;
107}
108
109void os_set_line_buffering(void)
110{
111 setbuf(stdout, NULL);
112 setbuf(stderr, NULL);
113}
114
115
116
117
118
119void os_parse_cmd_args(int index, const char *optarg)
120{
121 return;
122}
123
124void os_pidfile_error(void)
125{
126 fprintf(stderr, "Could not acquire pid file: %s\n", strerror(errno));
127}
128
129int qemu_create_pidfile(const char *filename)
130{
131 char buffer[128];
132 int len;
133 HANDLE file;
134 OVERLAPPED overlap;
135 BOOL ret;
136 memset(&overlap, 0, sizeof(overlap));
137
138 file = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ, NULL,
139 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
140
141 if (file == INVALID_HANDLE_VALUE) {
142 return -1;
143 }
144 len = snprintf(buffer, sizeof(buffer), "%d\n", getpid());
145 ret = WriteFile(file, (LPCVOID)buffer, (DWORD)len,
146 NULL, &overlap);
147 CloseHandle(file);
148 if (ret == 0) {
149 return -1;
150 }
151 return 0;
152}
153