Blame 0228-w32-Add-implementation-of-gmtime_r-localtime_r.patch

5544c1
From 27ca56812d2140c774f9d2b67a2919ef47c69758 Mon Sep 17 00:00:00 2001
5544c1
From: Stefan Weil <sw@weilnetz.de>
5544c1
Date: Sat, 22 Sep 2012 22:26:19 +0200
5544c1
Subject: [PATCH] w32: Add implementation of gmtime_r, localtime_r
5544c1
5544c1
Those functions are missing in MinGW.
5544c1
5544c1
Some versions of MinGW-w64 include defines for gmtime_r and localtime_r.
5544c1
Older versions of these macros are buggy (they return a pointer to a
5544c1
static variable), therefore we don't want them. Newer versions are
5544c1
similar to the code used here, but without the memset.
5544c1
5544c1
The implementation which is used here is not strictly reentrant,
5544c1
but sufficiently good for QEMU on w32 or w64.
5544c1
5544c1
Signed-off-by: Stefan Weil <sw@weilnetz.de>
5544c1
[blauwirbel@gmail.com: added comment about locking]
5544c1
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
5544c1
(cherry picked from commit d3e8f95753114a827f9cd8e819b1d5cc8333f76b)
5544c1
5544c1
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
5544c1
---
5544c1
 oslib-win32.c   | 24 ++++++++++++++++++++++++
5544c1
 qemu-os-win32.h |  6 ++++++
5544c1
 2 files changed, 30 insertions(+)
5544c1
5544c1
diff --git a/oslib-win32.c b/oslib-win32.c
5544c1
index ffbc6d0..51b33e8 100644
5544c1
--- a/oslib-win32.c
5544c1
+++ b/oslib-win32.c
5544c1
@@ -74,6 +74,30 @@ void qemu_vfree(void *ptr)
5544c1
     VirtualFree(ptr, 0, MEM_RELEASE);
5544c1
 }
5544c1
 
5544c1
+/* FIXME: add proper locking */
5544c1
+struct tm *gmtime_r(const time_t *timep, struct tm *result)
5544c1
+{
5544c1
+    struct tm *p = gmtime(timep);
5544c1
+    memset(result, 0, sizeof(*result));
5544c1
+    if (p) {
5544c1
+        *result = *p;
5544c1
+        p = result;
5544c1
+    }
5544c1
+    return p;
5544c1
+}
5544c1
+
5544c1
+/* FIXME: add proper locking */
5544c1
+struct tm *localtime_r(const time_t *timep, struct tm *result)
5544c1
+{
5544c1
+    struct tm *p = localtime(timep);
5544c1
+    memset(result, 0, sizeof(*result));
5544c1
+    if (p) {
5544c1
+        *result = *p;
5544c1
+        p = result;
5544c1
+    }
5544c1
+    return p;
5544c1
+}
5544c1
+
5544c1
 void socket_set_block(int fd)
5544c1
 {
5544c1
     unsigned long opt = 0;
5544c1
diff --git a/qemu-os-win32.h b/qemu-os-win32.h
5544c1
index b3e451b..8ba466d 100644
5544c1
--- a/qemu-os-win32.h
5544c1
+++ b/qemu-os-win32.h
5544c1
@@ -68,6 +68,12 @@
5544c1
 /* Declaration of ffs() is missing in MinGW's strings.h. */
5544c1
 int ffs(int i);
5544c1
 
5544c1
+/* Missing POSIX functions. Don't use MinGW-w64 macros. */
5544c1
+#undef gmtime_r
5544c1
+struct tm *gmtime_r(const time_t *timep, struct tm *result);
5544c1
+#undef localtime_r
5544c1
+struct tm *localtime_r(const time_t *timep, struct tm *result);
5544c1
+
5544c1
 static inline void os_setup_signal_handling(void) {}
5544c1
 static inline void os_daemonize(void) {}
5544c1
 static inline void os_setup_post(void) {}
5544c1
-- 
5544c1
1.7.12.1
5544c1