Since version 7.0, The C RTL in VMS handles time in terms of UTC
[openssl.git] / crypto / o_time.c
index 1bc0297b36590850c2bb09d49e30518632756a63..e29091d6504c1fab544be3da4ac2fbcf4f74e741 100644 (file)
@@ -73,13 +73,16 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result)
        {
        struct tm *ts = NULL;
 
-#if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_SYS_OS2) && !defined(__CYGWIN32__) && (!defined(OPENSSL_SYS_VMS) || defined(gmtime_r)) && !defined(OPENSSL_SYS_MACOSX)
+#if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_SYS_OS2) && !defined(__CYGWIN32__) && (!defined(OPENSSL_SYS_VMS) || defined(gmtime_r)) && !defined(OPENSSL_SYS_MACOSX) && !defined(OPENSSL_SYS_SUNOS)
        /* should return &data, but doesn't on some systems,
           so we don't even look at the return value */
        gmtime_r(timer,result);
        ts = result;
 #elif !defined(OPENSSL_SYS_VMS)
        ts = gmtime(timer);
+       if (ts == NULL)
+               return NULL;
+
        memcpy(result, ts, sizeof(struct tm));
        ts = result;
 #endif
@@ -111,16 +114,28 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result)
                        return NULL;
                logvalue[reslen] = '\0';
 
+               t = *timer;
+
+/* The following is extracted from the DEC C header time.h */
+/*
+**  Beginning in OpenVMS Version 7.0 mktime, time, ctime, strftime
+**  have two implementations.  One implementation is provided
+**  for compatibility and deals with time in terms of local time,
+**  the other __utc_* deals with time in terms of UTC.
+*/
+/* We use the same conditions as in said time.h to check if we should
+   assume that t contains local time (and should therefore be adjusted)
+   or UTC (and should therefore be left untouched). */
+#if __CRTL_VER < 70000000 || defined _VMS_V6_SOURCE
                /* Get the numerical value of the equivalence string */
                status = atoi(logvalue);
 
                /* and use it to move time to GMT */
-               t = *timer - status;
+               t -= status;
+#endif
 
                /* then convert the result to the time structure */
-#ifndef OPENSSL_THREADS
-               ts=(struct tm *)localtime(&t);
-#else
+
                /* Since there was no gmtime_r() to do this stuff for us,
                   we have to do it the hard way. */
                {
@@ -195,7 +210,6 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result)
                result->tm_isdst = 0; /* There's no way to know... */
 
                ts = result;
-#endif
                }
                }
 #endif