Include OpenSSL header files earlier so macros like OPENSSL_SYS_VMS
[openssl.git] / crypto / asn1 / a_utctm.c
index e3e5c45906ed19408ee21e583b208a95ba5c80e9..39b79109720210e85e6b3e6a7167abff05727120 100644 (file)
 
 #include <stdio.h>
 #include <time.h>
-#ifdef VMS
+#include "cryptlib.h"
+#include <openssl/asn1.h>
+#ifdef OPENSSL_SYS_VMS
 #include <descrip.h>
 #include <lnmdef.h>
 #include <starlet.h>
 #endif
-#include "cryptlib.h"
-#include <openssl/asn1.h>
-
-ASN1_UTCTIME *ASN1_UTCTIME_new(void)
-{ return M_ASN1_UTCTIME_new(); }
-
-void ASN1_UTCTIME_free(ASN1_UTCTIME *x)
-{ M_ASN1_UTCTIME_free(x); }
 
+#if 0
 int i2d_ASN1_UTCTIME(ASN1_UTCTIME *a, unsigned char **pp)
        {
 #ifndef CHARSET_EBCDIC
@@ -119,6 +114,8 @@ err:
        return(NULL);
        }
 
+#endif
+
 int ASN1_UTCTIME_check(ASN1_UTCTIME *d)
        {
        static int min[8]={ 0, 1, 1, 0, 0, 0, 0, 0};
@@ -182,6 +179,7 @@ int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, char *str)
                        {
                        ASN1_STRING_set((ASN1_STRING *)s,
                                (unsigned char *)str,t.length);
+                       s->type = V_ASN1_UTCTIME;
                        }
                return(1);
                }
@@ -193,7 +191,8 @@ ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t)
        {
        char *p;
        struct tm *ts;
-#if defined(THREADS) && !defined(WIN32)
+#if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(__CYGWIN32__)
+
        struct tm data;
 #endif
 
@@ -202,13 +201,13 @@ ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t)
        if (s == NULL)
                return(NULL);
 
-#if defined(THREADS) && !defined(WIN32)
+#if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(__CYGWIN32__)
        gmtime_r(&t,&data); /* should return &data, but doesn't on some systems, so we don't even look at the return value */
        ts=&data;
 #else
        ts=gmtime(&t);
 #endif
-#ifdef VMS
+#ifdef OPENSSL_SYS_VMS
        if (ts == NULL)
                {
                static $DESCRIPTOR(tabnam,"LNM$DCL_LOGICAL");
@@ -248,10 +247,10 @@ ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t)
        p=(char *)s->data;
        if ((p == NULL) || (s->length < 14))
                {
-               p=Malloc(20);
+               p=OPENSSL_malloc(20);
                if (p == NULL) return(NULL);
                if (s->data != NULL)
-                       Free(s->data);
+                       OPENSSL_free(s->data);
                s->data=(unsigned char *)p;
                }
 
@@ -265,6 +264,50 @@ ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s, time_t t)
        return(s);
        }
 
+
+int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t)
+       {
+       struct tm *tm;
+       int offset;
+       int year;
+
+#define g2(p) (((p)[0]-'0')*10+(p)[1]-'0')
+
+       if (s->data[12] == 'Z')
+               offset=0;
+       else
+               {
+               offset = g2(s->data+13)*60+g2(s->data+15);
+               if (s->data[12] == '-')
+                       offset = -offset;
+               }
+
+       t -= offset*60; /* FIXME: may overflow in extreme cases */
+
+#if defined(OPENSSL_THREADS) && !defined(OPENSSL_SYS_WIN32) && !defined(__CYGWIN32__)
+       { struct tm data; gmtime_r(&t, &data); tm = &data; }
+#else
+       tm = gmtime(&t);
+#endif
+       
+#define return_cmp(a,b) if ((a)<(b)) return -1; else if ((a)>(b)) return 1
+       year = g2(s->data);
+       if (year < 50)
+               year += 100;
+       return_cmp(year,              tm->tm_year);
+       return_cmp(g2(s->data+2) - 1, tm->tm_mon);
+       return_cmp(g2(s->data+4),     tm->tm_mday);
+       return_cmp(g2(s->data+6),     tm->tm_hour);
+       return_cmp(g2(s->data+8),     tm->tm_min);
+       return_cmp(g2(s->data+10),    tm->tm_sec);
+#undef g2
+#undef return_cmp
+
+       return 0;
+       }
+
+
+#if 0
 time_t ASN1_UTCTIME_get(const ASN1_UTCTIME *s)
        {
        struct tm tm;
@@ -300,3 +343,4 @@ time_t ASN1_UTCTIME_get(const ASN1_UTCTIME *s)
                                       * Also time_t is inappropriate for general
                                       * UTC times because it may a 32 bit type. */
        }
+#endif