common: Add new function gnupg_gmtime.
authorWerner Koch <wk@gnupg.org>
Fri, 10 Apr 2015 10:24:43 +0000 (12:24 +0200)
committerWerner Koch <wk@gnupg.org>
Fri, 10 Apr 2015 11:09:39 +0000 (13:09 +0200)
* common/gettime.c (gnupg_gmtime): New.
(gnupg_get_isotime): Use it.  Also take care of an gmtime_t returning
an error.
--

The fix in gnupg_get_isotime is only to cover up a theoretical broken
time (e.g. a value of (time_t)(-2) which is not mapped beyond 2038 on
32 bit systems).

Signed-off-by: Werner Koch <wk@gnupg.org>
common/gettime.c
common/gettime.h

index 5a7a745..115f725 100644 (file)
@@ -71,6 +71,29 @@ gnupg_get_time ()
 }
 
 
+/* Wrapper around gmtime_r.
+
+   On systems without gmtime_r this implementation works within gnupg
+   because we use only one thread a time.  FIXME: An independent
+   library may use gmtime in one of its own thread (or via
+   npth_enter/npth_leave) - in this case we run into a problem.  The
+   solution would be to use a mutex here.  */
+struct tm *
+gnupg_gmtime (const time_t *timep, struct tm *result)
+{
+#ifdef HAVE_GMTIME_R
+  return gmtime_r (timep, result);
+#else
+  struct tm *tp;
+
+  tp = gmtime (timep);
+  if (tp)
+    memcpy (result, tp, sizeof *result);
+  return tp;
+#endif
+}
+
+
 /* Return the current time (possibly faked) in ISO format. */
 void
 gnupg_get_isotime (gnupg_isotime_t timebuf)
@@ -82,16 +105,15 @@ gnupg_get_isotime (gnupg_isotime_t timebuf)
   else
     {
       struct tm *tp;
-#ifdef HAVE_GMTIME_R
       struct tm tmbuf;
 
-      tp = gmtime_r (&atime, &tmbuf);
-#else
-      tp = gmtime (&atime);
-#endif
-      snprintf (timebuf, 16, "%04d%02d%02dT%02d%02d%02d",
-                1900 + tp->tm_year, tp->tm_mon+1, tp->tm_mday,
-                tp->tm_hour, tp->tm_min, tp->tm_sec);
+      tp = gnupg_gmtime (&atime, &tmbuf);
+      if (!tp)
+        *timebuf = 0;
+      else
+        snprintf (timebuf, 16, "%04d%02d%02dT%02d%02d%02d",
+                  1900 + tp->tm_year, tp->tm_mon+1, tp->tm_mday,
+                  tp->tm_hour, tp->tm_min, tp->tm_sec);
     }
 }
 
index 25886d2..ec68faa 100644 (file)
@@ -29,6 +29,7 @@
 typedef char gnupg_isotime_t[16];
 
 time_t gnupg_get_time (void);
+struct tm *gnupg_gmtime (const time_t *timep, struct tm *result);
 void   gnupg_get_isotime (gnupg_isotime_t timebuf);
 void   gnupg_set_time (time_t newtime, int freeze);
 int    gnupg_faked_time_p (void);