diff --git a/configure b/configure index 29009ee6d885e8fd09922e34e9fcd069d1295da4..f14454e691b361d41e6a86eb1d662b6309386690 100755 --- a/configure +++ b/configure @@ -1736,6 +1736,37 @@ else l2tpv3=no fi +########################################## +# MinGW / Mingw-w64 localtime_r/gmtime_r check + +if test "$mingw32" = "yes"; then + # Some versions of MinGW / Mingw-w64 lack localtime_r + # and gmtime_r entirely. + # + # Some versions of Mingw-w64 define a macro for + # localtime_r/gmtime_r. + # + # Some versions of Mingw-w64 will define functions + # for localtime_r/gmtime_r, but only if you have + # _POSIX_THREAD_SAFE_FUNCTIONS defined. For fun + # though, unistd.h and pthread.h both define + # that for you. + # + # So this #undef localtime_r and #include + # are not in fact redundant. +cat > $TMPC << EOF +#include +#include +#undef localtime_r +int main(void) { localtime_r(NULL, NULL); return 0; } +EOF + if compile_prog "" "" ; then + localtime_r="yes" + else + localtime_r="no" + fi +fi + ########################################## # pkg-config probe @@ -5034,6 +5065,9 @@ fi if test "$zero_malloc" = "yes" ; then echo "CONFIG_ZERO_MALLOC=y" >> $config_host_mak fi +if test "$localtime_r" = "yes" ; then + echo "CONFIG_LOCALTIME_R=y" >> $config_host_mak +fi if test "$qom_cast_debug" = "yes" ; then echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak fi diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h index ab3c8766b463744ea0584c71081bddb808843477..ef21efb6832a7674163733f3c8ef4cf0d742deae 100644 --- a/include/qemu/osdep.h +++ b/include/qemu/osdep.h @@ -38,10 +38,12 @@ #include #include #include +/* Put unistd.h before time.h as that triggers localtime_r/gmtime_r + * function availability on recentish Mingw-w64 platforms. */ +#include #include #include #include -#include #include #include #include diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.h index 706d85a98e24f48aa763e9c448ac128ec9f1ee76..13dcef6b4c99a5cc2834830dae9756293d29dcb8 100644 --- a/include/sysemu/os-win32.h +++ b/include/sysemu/os-win32.h @@ -73,10 +73,12 @@ #define siglongjmp(env, val) longjmp(env, val) /* Missing POSIX functions. Don't use MinGW-w64 macros. */ +#ifndef CONFIG_LOCALTIME_R #undef gmtime_r struct tm *gmtime_r(const time_t *timep, struct tm *result); #undef localtime_r struct tm *localtime_r(const time_t *timep, struct tm *result); +#endif /* CONFIG_LOCALTIME_R */ static inline void os_setup_signal_handling(void) {} diff --git a/util/oslib-win32.c b/util/oslib-win32.c index 730a6707a09de6a1cb9e0d95d3cb74218e61ed10..08f5a9cda2bb6e58f683d2afeac6bc115060f2d4 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -95,6 +95,7 @@ void qemu_anon_ram_free(void *ptr, size_t size) } } +#ifndef CONFIG_LOCALTIME_R /* FIXME: add proper locking */ struct tm *gmtime_r(const time_t *timep, struct tm *result) { @@ -118,6 +119,7 @@ struct tm *localtime_r(const time_t *timep, struct tm *result) } return p; } +#endif /* CONFIG_LOCALTIME_R */ void qemu_set_block(int fd) {