*/
#include <openssl/e_os2.h>
+#include <string.h>
#include "o_time.h"
#ifdef OPENSSL_SYS_VMS
{
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))
+#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
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. */
{
result->tm_isdst = 0; /* There's no way to know... */
ts = result;
-#endif
}
}
#endif