From e014144f985904e73efc26328be32eaa75f463f2 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Tue, 28 Sep 2004 12:23:37 +0000 Subject: [PATCH] Move time parsers from ppolicy.c to liblutil; preserve greater precision --- servers/slapd/overlays/ppolicy.c | 114 ++----------------------------- 1 file changed, 5 insertions(+), 109 deletions(-) diff --git a/servers/slapd/overlays/ppolicy.c b/servers/slapd/overlays/ppolicy.c index e46cd1dcad..958da9ee6b 100644 --- a/servers/slapd/overlays/ppolicy.c +++ b/servers/slapd/overlays/ppolicy.c @@ -199,120 +199,16 @@ static struct schema_info pwd_UsSchema[] = { static ldap_pvt_thread_mutex_t chk_syntax_mutex; -static time_t -ppolicy_timegm( struct tm *t ) -{ - static int moffset[12] = { - 0, 31, 59, 90, 120, - 151, 181, 212, 243, - 273, 304, 334 }; - time_t ret; - - /* t->tm_year is years since 1900 */ - /* calculate days from years since 1970 (epoch) */ - ret = t->tm_year - 70; - ret *= 365L; - - /* count leap days in preceding years */ - ret += ((t->tm_year -69) >> 2); - - /* calculate days from months */ - ret += moffset[t->tm_mon]; - - /* add in this year's leap day, if any */ - if (((t->tm_year & 3) == 0) && (t->tm_mon > 1)) { - ret ++; - } - - /* add in days in this month */ - ret += (t->tm_mday - 1); - - /* convert to hours */ - ret *= 24L; - ret += t->tm_hour; - - /* convert to minutes */ - ret *= 60L; - ret += t->tm_min; - - /* convert to seconds */ - ret *= 60L; - ret += t->tm_sec; - - /* return the result */ - return ret; -} - static time_t parse_time( char *atm ) { - struct tm tm; - char *ptr = atm; + struct lutil_tm tm; + struct lutil_timet tt; time_t ret = (time_t)-1; - int i = 0; - - while (atm) { - - /* Is the stamp reasonbly long? */ - for (i=0; isdigit(atm[i]); i++); - if (i < sizeof("00000101000000")-1) - break; - - /* - * parse the time and return it's time_t value. - */ - /* 4 digit year to year - 1900 */ - tm.tm_year = *ptr++ - '0'; - tm.tm_year *= 10; tm.tm_year += *ptr++ - '0'; - tm.tm_year *= 10; tm.tm_year += *ptr++ - '0'; - tm.tm_year *= 10; tm.tm_year += *ptr++ - '0'; - tm.tm_year -= 1900; - /* month 01-12 to 0-11 */ - tm.tm_mon = *ptr++ - '0'; - tm.tm_mon *=10; tm.tm_mon += *ptr++ - '0'; - if (tm.tm_mon < 1 || tm.tm_mon > 12) break; - tm.tm_mon--; - - /* day of month 01-31 */ - tm.tm_mday = *ptr++ - '0'; - tm.tm_mday *=10; tm.tm_mday += *ptr++ - '0'; - if (tm.tm_mday < 1 || tm.tm_mday > 31) break; - - /* Hour 00-23 */ - tm.tm_hour = *ptr++ - '0'; - tm.tm_hour *=10; tm.tm_hour += *ptr++ - '0'; - if (tm.tm_hour < 0 || tm.tm_hour > 23) break; - - /* Minute 00-59 */ - tm.tm_min = *ptr++ - '0'; - tm.tm_min *=10; tm.tm_min += *ptr++ - '0'; - if (tm.tm_min < 0 || tm.tm_min > 59) break; - - /* Second 00-61 */ - tm.tm_sec = *ptr++ - '0'; - tm.tm_sec *=10; tm.tm_sec += *ptr++ - '0'; - if (tm.tm_sec < 0 || tm.tm_sec > 61) break; - - /* Fractions of seconds */ - for (i = 0;isdigit(*ptr);) { - i*=10; i+= *ptr++ - '0'; - } - - /* - * special case - if the lowest allowable GeneralizedTime is here, return - * this as zero time. Note: this might also be the case if the value stored - * is equivalent to the start of the epoch (ie, Jan 1, 1970 at midnight. - */ - if (strncmp(atm, "00000101000000", sizeof("00000101000000")-1) == 0 && - i == 0 ) break; - - /* Must be UTC */ - if (*ptr != 'Z') break; - - /* FIXME: we don't check precision smaller than seconds. */ - ret = ppolicy_timegm( &tm ); - break; + if ( lutil_parsetime( atm, &tm ) == 0) { + lutil_tm2time( &tm, &tt ); + ret = tt.tt_sec; } return ret; } -- 2.39.5