2010-05-12 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Wed, 12 May 2010 18:20:36 +0000 (18:20 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Wed, 12 May 2010 18:20:36 +0000 (18:20 +0000)
* conversion.c (_gpgme_timegm) [HAVE_W32_SYSTEM]: New static
function.
(_gpgme_parse_timestamp) [HAVE_W32_SYSTEM]: Use it.

src/ChangeLog
src/conversion.c

index 14b168b..e55ab96 100644 (file)
@@ -1,5 +1,9 @@
 2010-05-12  Marcus Brinkmann  <marcus@g10code.de>
 
+       * conversion.c (_gpgme_timegm) [HAVE_W32_SYSTEM]: New static
+       function.
+       (_gpgme_parse_timestamp) [HAVE_W32_SYSTEM]: Use it.
+
        * gpgme-tool.c (main): Protect call to setlocale with
        HAVE_SETLOCALE.
 
index f70172b..9d8f403 100644 (file)
@@ -315,6 +315,39 @@ _gpgme_encode_percent_string (const char *src, char **destp, size_t len)
 }
 
 
+#ifdef HAVE_W32_SYSTEM
+static time_t
+_gpgme_timegm (struct tm *tm)
+{
+  /* This one is thread safe.  */
+  SYSTEMTIME st;
+  FILETIME ft;
+  unsigned long long cnsecs;
+  
+  st.wYear   = tm->tm_year + 1900;
+  st.wMonth  = tm->tm_mon  + 1;
+  st.wDay    = tm->tm_mday;
+  st.wHour   = tm->tm_hour;
+  st.wMinute = tm->tm_min;
+  st.wSecond = tm->tm_sec;
+  st.wMilliseconds = 0; /* Not available.  */
+  st.wDayOfWeek = 0;    /* Ignored.  */
+
+  /* System time is UTC thus the conversion is pretty easy.  */
+  if (!SystemTimeToFileTime (&st, &ft))
+    {
+      gpg_err_set_errno (EINVAL);
+      return (time_t)(-1);
+    }
+  
+  cnsecs = (((unsigned long long)ft.dwHighDateTime << 32)
+           | ft.dwLowDateTime);
+  cnsecs -= 116444736000000000ULL; /* The filetime epoch is 1601-01-01.  */
+  return (time_t)(cnsecs / 10000000ULL);
+}
+#endif
+
+
 /* Parse the string TIMESTAMP into a time_t.  The string may either be
    seconds since Epoch or in the ISO 8601 format like
    "20390815T143012".  Returns 0 for an empty string or seconds since
@@ -354,6 +387,9 @@ _gpgme_parse_timestamp (const char *timestamp, char **endp)
 
       if (endp)
         *endp = (char*)(timestamp + 15);
+#ifdef HAVE_W32_SYSTEM
+      return _gpgme_timegm (&buf);
+#else
 #ifdef HAVE_TIMEGM
       return timegm (&buf);
 #else
@@ -368,6 +404,7 @@ _gpgme_parse_timestamp (const char *timestamp, char **endp)
         return tim;
       }
 #endif /* !HAVE_TIMEGM */
+#endif /* !HAVE_W32_SYSTEM */
     }
   else
     return (time_t)strtoul (timestamp, endp, 10);