Commit aa26bb2dacdc32bac84e7c72c501b4691721679e
1 parent
209afb9e
qemu_create_pidfile implementation for Win32, based on a patch by
Carlos O'Donell. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2540 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
51 additions
and
24 deletions
osdep.c
... | ... | @@ -27,6 +27,7 @@ |
27 | 27 | #include <string.h> |
28 | 28 | #include <errno.h> |
29 | 29 | #include <unistd.h> |
30 | +#include <fcntl.h> | |
30 | 31 | #ifdef HOST_SOLARIS |
31 | 32 | #include <sys/types.h> |
32 | 33 | #include <sys/statvfs.h> |
... | ... | @@ -216,3 +217,50 @@ char *qemu_strdup(const char *str) |
216 | 217 | strcpy(ptr, str); |
217 | 218 | return ptr; |
218 | 219 | } |
220 | + | |
221 | +int qemu_create_pidfile(const char *filename) | |
222 | +{ | |
223 | + char buffer[128]; | |
224 | + int len; | |
225 | +#ifndef _WIN32 | |
226 | + int fd; | |
227 | + | |
228 | + fd = open(filename, O_RDWR | O_CREAT, 0600); | |
229 | + if (fd == -1) | |
230 | + return -1; | |
231 | + | |
232 | + if (lockf(fd, F_TLOCK, 0) == -1) | |
233 | + return -1; | |
234 | + | |
235 | + len = snprintf(buffer, sizeof(buffer), "%ld\n", (long)getpid()); | |
236 | + if (write(fd, buffer, len) != len) | |
237 | + return -1; | |
238 | +#else | |
239 | + HANDLE file; | |
240 | + DWORD flags; | |
241 | + OVERLAPPED overlap; | |
242 | + BOOL ret; | |
243 | + | |
244 | + /* Open for writing with no sharing. */ | |
245 | + file = CreateFile(filename, GENERIC_WRITE, 0, NULL, | |
246 | + OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); | |
247 | + | |
248 | + if (file == INVALID_HANDLE_VALUE) | |
249 | + return -1; | |
250 | + | |
251 | + flags = LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY; | |
252 | + overlap.hEvent = 0; | |
253 | + /* Lock 1 byte. */ | |
254 | + ret = LockFileEx(file, flags, 0, 0, 1, &overlap); | |
255 | + if (ret == 0) | |
256 | + return -1; | |
257 | + | |
258 | + /* Write PID to file. */ | |
259 | + len = snprintf(buffer, sizeof(buffer), "%ld\n", (long)getpid()); | |
260 | + ret = WriteFileEx(file, (LPCVOID)buffer, (DWORD)len, | |
261 | + &overlap, NULL); | |
262 | + if (ret == 0) | |
263 | + return -1; | |
264 | +#endif | |
265 | + return 0; | |
266 | +} | ... | ... |
osdep.h
vl.c
... | ... | @@ -4403,29 +4403,6 @@ void usb_info(void) |
4403 | 4403 | } |
4404 | 4404 | } |
4405 | 4405 | |
4406 | -static int create_pidfile(const char *filename) | |
4407 | -{ | |
4408 | - int fd; | |
4409 | - char buffer[128]; | |
4410 | - int len; | |
4411 | - | |
4412 | - fd = open(filename, O_RDWR | O_CREAT, 0600); | |
4413 | - if (fd == -1) | |
4414 | - return -1; | |
4415 | - | |
4416 | - /* XXX: No locking for Win32 implemented */ | |
4417 | -#ifndef _WIN32 | |
4418 | - if (lockf(fd, F_TLOCK, 0) == -1) | |
4419 | - return -1; | |
4420 | -#endif | |
4421 | - | |
4422 | - len = snprintf(buffer, sizeof(buffer), "%ld\n", (long)getpid()); | |
4423 | - if (write(fd, buffer, len) != len) | |
4424 | - return -1; | |
4425 | - | |
4426 | - return 0; | |
4427 | -} | |
4428 | - | |
4429 | 4406 | /***********************************************************/ |
4430 | 4407 | /* dumb display */ |
4431 | 4408 | |
... | ... | @@ -7405,7 +7382,7 @@ int main(int argc, char **argv) |
7405 | 7382 | } |
7406 | 7383 | #endif |
7407 | 7384 | |
7408 | - if (pid_file && create_pidfile(pid_file) != 0) { | |
7385 | + if (pid_file && qemu_create_pidfile(pid_file) != 0) { | |
7409 | 7386 | if (daemonize) { |
7410 | 7387 | uint8_t status = 1; |
7411 | 7388 | write(fds[1], &status, 1); | ... | ... |