diff options
author | Lev Walkin <vlm@lionet.info> | 2006-07-13 13:20:19 +0000 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2006-07-13 13:20:19 +0000 |
commit | c8c2cb54d55fcb258089c4a48c6a7fd5e089ca4e (patch) | |
tree | d00af0c4bd0fca8a6119823823088414f5c25a1e | |
parent | 97c5cfc8c56da86c3482523136c183819e08370d (diff) |
time functions: removed support for Solaris
-rw-r--r-- | skeletons/GeneralizedTime.c | 62 | ||||
-rw-r--r-- | skeletons/tests/check-GeneralizedTime.c | 66 |
2 files changed, 82 insertions, 46 deletions
diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c index 015fc6a1..6236d2af 100644 --- a/skeletons/GeneralizedTime.c +++ b/skeletons/GeneralizedTime.c @@ -16,7 +16,7 @@ #pragma message( " ") #pragma message( " You must fix the code by inserting appropriate locking") #pragma message( " if you want to use asn_GT2time() or asn_UT2time().") -#pragma message( "PLEASE STOP AND READ! ") +#pragma message( "PLEASE STOP AND READ!") static struct tm *localtime_r(const time_t *tloc, struct tm *result) { struct tm *tm; @@ -38,7 +38,7 @@ static struct tm *gmtime_r(const time_t *tloc, struct tm *result) { #endif /* WIN32 */ -#if defined(sun) +#if defined(sun) || defined(_sun_) || defined(__solaris__) #define _EMULATE_TIMEGM #endif @@ -62,6 +62,15 @@ static struct tm *gmtime_r(const time_t *tloc, struct tm *result) { #define GMTOFF(tm) (-timezone) #endif /* HAVE_TM_GMTOFF */ +#if (defined(_EMULATE_TIMEGM) || !defined(HAVE_TM_GMTOFF)) +#warning "PLEASE STOP AND READ!" +#warning " timegm() is implemented via getenv(\"TZ\")/setenv(\"TZ\"), which may be not thread-safe." +#warning " " +#warning " You must fix the code by inserting appropriate locking" +#warning " if you want to use asn_GT2time() or asn_UT2time()." +#warning "PLEASE STOP AND READ!" +#endif /* _EMULATE_TIMEGM */ + /* * Override our GMTOFF decision for other known platforms. */ @@ -84,25 +93,40 @@ static long GMTOFF(struct tm a){ #endif /* __CYGWIN__ */ +#define ATZVARS do { \ + char tzoldbuf[64]; \ + char *tzold +#define ATZSAVETZ do { \ + tzold = getenv("TZ"); \ + if(tzold) { \ + size_t tzlen = strlen(tzold); \ + if(tzlen < sizeof(tzoldbuf)) \ + tzold = memcpy(tzoldbuf, tzold, tzlen + 1); \ + else \ + tzold = strdup(tzold); /* Ignore error */ \ + setenv("TZ", "UTC", 1); \ + } \ + tzset(); \ +} while(0) +#define ATZOLDTZ do { \ + if (tzold) { \ + setenv("TZ", tzold, 1); \ + *tzoldbuf = 0; \ + if(tzold != tzoldbuf) \ + free(tzold); \ + } else { \ + unsetenv("TZ"); \ + } \ + tzset(); \ +} while(0); } while(0); + #ifdef _EMULATE_TIMEGM static time_t timegm(struct tm *tm) { time_t tloc; - char *tz; - char *buf; - - tz = getenv("TZ"); - putenv("TZ=UTC"); - tzset(); + ATZVARS; + ATZSAVETZ; tloc = mktime(tm); - if (tz) { - int bufsize = strlen(tz) + 4; - buf = alloca(bufsize); - snprintf(buf, bufsize, "TZ=%s", tz); - } else { - buf = "TZ="; - } - putenv(buf); - tzset(); + ATZOLDTZ; return tloc; } #endif /* _EMULATE_TIMEGM */ @@ -567,8 +591,8 @@ asn_time2GT_frac(GeneralizedTime_t *opt_gt, const struct tm *tm, int frac_value, tm = &tm_s; #ifdef HAVE_TM_GMTOFF assert(!GMTOFF(tm_s)); /* Will fix itself */ -#else - gmtoff = 0; /* Intervention required */ +#else /* !HAVE_TM_GMTOFF */ + gmtoff = 0; #endif } diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c index 9eabb69f..b56fa0b9 100644 --- a/skeletons/tests/check-GeneralizedTime.c +++ b/skeletons/tests/check-GeneralizedTime.c @@ -59,13 +59,15 @@ encode(time_t tloc, const char *expect, int force_gmt) { } } +#define RECODE(foo, bar) recode(__LINE__, foo, bar) static void -recode(char *time_str, const char *expect) { +recode(int lineno, char *time_str, const char *expect) { int frac_value, frac_digits; GeneralizedTime_t gt; struct tm tm; time_t tloc; + char *tz; gt.buf = (uint8_t *)time_str; gt.size = strlen(time_str); @@ -77,8 +79,11 @@ recode(char *time_str, const char *expect) { asn_time2GT_frac(>, &tm, frac_value, frac_digits, 1); assert(gt.buf); - printf("[%s] => [%s] == [%s] (%d, %d)\n", - time_str, gt.buf, expect, frac_value, frac_digits); + tz = getenv("TZ"); + printf("%d: [%s] (%ld) => [%s] == [%s] (%d, %d) (TZ=%s)\n", + lineno, time_str, (long)tloc, gt.buf, + expect, frac_value, frac_digits, + tz ? tz : ""); assert(strcmp((char *)gt.buf, expect) == 0); FREEMEM(gt.buf); @@ -182,9 +187,12 @@ check_fractions() { int main(int ac, char **av) { + char *tz = getenv("TZ"); (void)av; + printf("TZ = [%s]\n", tz ? tz : ""); + check_fractions(); recognize("200401250", -1, 0); @@ -222,32 +230,36 @@ main(int ac, char **av) { recognize("20040125093000,1234", 1075051800, 0); encode(1075023007, "20040125013007-0800", 0); - recode("20050702123312", "20050702193312Z"); + RECODE("20050702123312", "20050702193312Z"); } - recode("20050702123312Z", "20050702123312Z"); - recode("20050702123312+01", "20050702113312Z"); - recode("20050702123312,0+01", "20050702113312Z"); - recode("20050702123312,1+01", "20050702113312.1Z"); - recode("20050702123312.01+01", "20050702113312.01Z"); - recode("20050702123312.00+01", "20050702113312Z"); - recode("20050702123312.30+01", "20050702113312.3Z"); - recode("20050702123312,30000+01", "20050702113312.3Z"); - recode("20050702123312,300000000+01", "20050702113312.3Z"); - recode("20050702123312.123456+01", "20050702113312.123456Z"); - recode("20050702123312.1234567+01", "20050702113312.123456Z"); - recode("20050702123312.12345678+01", "20050702113312.123456Z"); - recode("20050702123312.123456789+01", "20050702113312.123456Z"); - recode("20050702123312.2000000000+01", "20050702113312.2Z"); - recode("20050702123312.3000000000+01", "20050702113312.3Z"); - recode("20050702123312.4000000000+01", "20050702113312.4Z"); - recode("20050702123312.5000000000+01", "20050702113312.5Z"); - recode("20050702123312.5000000001+01", "20050702113312.5Z"); - recode("20050702123312.5000010001+01", "20050702113312.500001Z"); - recode("20050702123312.5000001001+01", "20050702113312.5Z"); - recode("20050702123312.000001+01", "20050702113312.000001Z"); - recode("20050702123312.0000001Z", "20050702123312Z"); - recode("20050702123312.0080010+1056", "20050702013712.008001Z"); +#if defined(sun) || defined(__sun) || defined(_sun_) || defined(__solaris__) + printf("Solaris does not have a decent timegm() function.\n"); +#else /* !solaris */ + RECODE("20050702123312Z", "20050702123312Z"); + RECODE("20050702123312+01", "20050702113312Z"); + RECODE("20050702123312,0+01", "20050702113312Z"); + RECODE("20050702123312,1+01", "20050702113312.1Z"); + RECODE("20050702123312.01+01", "20050702113312.01Z"); + RECODE("20050702123312.00+01", "20050702113312Z"); + RECODE("20050702123312.30+01", "20050702113312.3Z"); + RECODE("20050702123312,30000+01", "20050702113312.3Z"); + RECODE("20050702123312,300000000+01", "20050702113312.3Z"); + RECODE("20050702123312.123456+01", "20050702113312.123456Z"); + RECODE("20050702123312.1234567+01", "20050702113312.123456Z"); + RECODE("20050702123312.12345678+01", "20050702113312.123456Z"); + RECODE("20050702123312.123456789+01", "20050702113312.123456Z"); + RECODE("20050702123312.2000000000+01", "20050702113312.2Z"); + RECODE("20050702123312.3000000000+01", "20050702113312.3Z"); + RECODE("20050702123312.4000000000+01", "20050702113312.4Z"); + RECODE("20050702123312.5000000000+01", "20050702113312.5Z"); + RECODE("20050702123312.5000000001+01", "20050702113312.5Z"); + RECODE("20050702123312.5000010001+01", "20050702113312.500001Z"); + RECODE("20050702123312.5000001001+01", "20050702113312.5Z"); + RECODE("20050702123312.000001+01", "20050702113312.000001Z"); + RECODE("20050702123312.0000001Z", "20050702123312Z"); + RECODE("20050702123312.0080010+1056", "20050702013712.008001Z"); +#endif return 0; } |