Patchwork [2/7] fix pidfile option to work in WIN32

login
register
mail settings
Submitter riku.voipio@nokia.com
Date Dec. 3, 2009, 1:56 p.m.
Message ID <0f1be4f3b16009de424be7eb7f3d6d39acacc860.1259836046.git.riku.voipio@nokia.com>
Download mbox | patch
Permalink /patch/40264/
State New
Headers show

Comments

riku.voipio@nokia.com - Dec. 3, 2009, 1:56 p.m.
From: Juha Riihimäki <juha.riihimaki@nokia.com>

Excplicit read/write locking pidfile under WIN32 is bit extreme
nobody get the chance to read the pidfile. Convert to a write-only lock.

Also, creating pidfile was disabled along with daemonize under
WIN32. Enable it, but do not enable daemon support which doesn't
exist under WIN32 atm.

From: Juha Riihimäki <juha.riihimaki@nokia.com>
Signed-off-by: Juha Riihimäki <juha.riihimaki@nokia.com>
Signed-off-by: Riku Voipio <riku.voipio@nokia.com>
---
 osdep.c |   13 ++-----------
 vl.c    |    4 +++-
 2 files changed, 5 insertions(+), 12 deletions(-)

Patch

diff --git a/osdep.c b/osdep.c
index fd8bbd7..2ecffab 100644
--- a/osdep.c
+++ b/osdep.c
@@ -133,25 +133,16 @@  int qemu_create_pidfile(const char *filename)
         return -1;
 #else
     HANDLE file;
-    DWORD flags;
     OVERLAPPED overlap;
     BOOL ret;
+    memset(&overlap, 0, sizeof(overlap));
 
-    /* Open for writing with no sharing. */
-    file = CreateFile(filename, GENERIC_WRITE, 0, NULL,
+    file = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ, 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);
diff --git a/vl.c b/vl.c
index 44763af..11f6ad0 100644
--- a/vl.c
+++ b/vl.c
@@ -5471,16 +5471,18 @@  int main(int argc, char **argv, char **envp)
         signal(SIGTTOU, SIG_IGN);
         signal(SIGTTIN, SIG_IGN);
     }
+#endif
 
     if (pid_file && qemu_create_pidfile(pid_file) != 0) {
+#ifndef _WIN32
         if (daemonize) {
             uint8_t status = 1;
             write(fds[1], &status, 1);
         } else
+#endif
             fprintf(stderr, "Could not acquire pid file: %s\n", strerror(errno));
         exit(1);
     }
-#endif
 
     if (kvm_enabled()) {
         int ret;