From aa26bb2dacdc32bac84e7c72c501b4691721679e Mon Sep 17 00:00:00 2001 From: ths Date: Sun, 25 Mar 2007 21:33:06 +0000 Subject: 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 --- osdep.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'osdep.c') diff --git a/osdep.c b/osdep.c index d1eff8d..ccc1d70 100644 --- a/osdep.c +++ b/osdep.c @@ -27,6 +27,7 @@ #include #include #include +#include #ifdef HOST_SOLARIS #include #include @@ -216,3 +217,50 @@ char *qemu_strdup(const char *str) strcpy(ptr, str); return ptr; } + +int qemu_create_pidfile(const char *filename) +{ + char buffer[128]; + int len; +#ifndef _WIN32 + int fd; + + fd = open(filename, O_RDWR | O_CREAT, 0600); + if (fd == -1) + return -1; + + if (lockf(fd, F_TLOCK, 0) == -1) + return -1; + + len = snprintf(buffer, sizeof(buffer), "%ld\n", (long)getpid()); + if (write(fd, buffer, len) != len) + return -1; +#else + HANDLE file; + DWORD flags; + OVERLAPPED overlap; + BOOL ret; + + /* Open for writing with no sharing. */ + file = CreateFile(filename, GENERIC_WRITE, 0, NULL, + OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + + if (file == INVALID_HANDLE_VALUE) + return -1; + + flags = LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY; + overlap.hEvent = 0; + /* Lock 1 byte. */ + ret = LockFileEx(file, flags, 0, 0, 1, &overlap); + if (ret == 0) + return -1; + + /* Write PID to file. */ + len = snprintf(buffer, sizeof(buffer), "%ld\n", (long)getpid()); + ret = WriteFileEx(file, (LPCVOID)buffer, (DWORD)len, + &overlap, NULL); + if (ret == 0) + return -1; +#endif + return 0; +} -- cgit v1.1