summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>2007-03-25 21:33:06 +0000
committerths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>2007-03-25 21:33:06 +0000
commitaa26bb2dacdc32bac84e7c72c501b4691721679e (patch)
treeaf09769389f3799984d680ab126002fad7a8cdbe
parent209afb9e0dc4f4ed21ed696047d4c72f8a942810 (diff)
downloadhqemu-aa26bb2dacdc32bac84e7c72c501b4691721679e.zip
hqemu-aa26bb2dacdc32bac84e7c72c501b4691721679e.tar.gz
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
-rw-r--r--osdep.c48
-rw-r--r--osdep.h2
-rw-r--r--vl.c25
3 files changed, 51 insertions, 24 deletions
diff --git a/osdep.c b/osdep.c
index d1eff8d..ccc1d70 100644
--- a/osdep.c
+++ b/osdep.c
@@ -27,6 +27,7 @@
#include <string.h>
#include <errno.h>
#include <unistd.h>
+#include <fcntl.h>
#ifdef HOST_SOLARIS
#include <sys/types.h>
#include <sys/statvfs.h>
@@ -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;
+}
diff --git a/osdep.h b/osdep.h
index 325baf1..68d29d7 100644
--- a/osdep.h
+++ b/osdep.h
@@ -15,4 +15,6 @@ void qemu_vfree(void *ptr);
void *get_mmap_addr(unsigned long size);
+int qemu_create_pidfile(const char *filename);
+
#endif
diff --git a/vl.c b/vl.c
index eb5d707..af8558b 100644
--- a/vl.c
+++ b/vl.c
@@ -4403,29 +4403,6 @@ void usb_info(void)
}
}
-static int create_pidfile(const char *filename)
-{
- int fd;
- char buffer[128];
- int len;
-
- fd = open(filename, O_RDWR | O_CREAT, 0600);
- if (fd == -1)
- return -1;
-
- /* XXX: No locking for Win32 implemented */
-#ifndef _WIN32
- if (lockf(fd, F_TLOCK, 0) == -1)
- return -1;
-#endif
-
- len = snprintf(buffer, sizeof(buffer), "%ld\n", (long)getpid());
- if (write(fd, buffer, len) != len)
- return -1;
-
- return 0;
-}
-
/***********************************************************/
/* dumb display */
@@ -7405,7 +7382,7 @@ int main(int argc, char **argv)
}
#endif
- if (pid_file && create_pidfile(pid_file) != 0) {
+ if (pid_file && qemu_create_pidfile(pid_file) != 0) {
if (daemonize) {
uint8_t status = 1;
write(fds[1], &status, 1);
OpenPOWER on IntegriCloud