diff --git a/osdep.c b/osdep.c index d1eff8deb..ccc1d70bb 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; +} diff --git a/osdep.h b/osdep.h index 325baf14e..68d29d74e 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 eb5d70750..af8558b79 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);