diff options
-rw-r--r-- | lib/parsedate.c | 48 | ||||
-rw-r--r-- | lib/parsedate.h | 18 |
2 files changed, 57 insertions, 9 deletions
diff --git a/lib/parsedate.c b/lib/parsedate.c index 843368cf7..badf71114 100644 --- a/lib/parsedate.c +++ b/lib/parsedate.c @@ -270,7 +270,18 @@ static time_t my_timegm(struct my_tm *tm) + tm->tm_hour) * 60 + tm->tm_min) * 60 + tm->tm_sec; } -static time_t parsedate(const char *date) +/* + * Curl_parsedate() + * + * Returns: + * + * PARSEDATE_OK - a fine conversion + * PARSEDATE_FAIL - failed to convert + * PARSEDATE_LATER - time overflow at the far end of time_t + * PARSEDATE_SOONER - time underflow at the low end of time_t + */ + +int Curl_parsedate(const char *date, time_t *output) { time_t t = 0; int wdaynum=-1; /* day of the week number, 0-6 (mon-sun) */ @@ -318,7 +329,7 @@ static time_t parsedate(const char *date) } if(!found) - return -1; /* bad string */ + return PARSEDATE_FAIL; /* bad string */ date += len; } @@ -389,7 +400,7 @@ static time_t parsedate(const char *date) } if(!found) - return -1; + return PARSEDATE_FAIL; date = end; } @@ -405,14 +416,21 @@ static time_t parsedate(const char *date) (-1 == monnum) || (-1 == yearnum)) /* lacks vital info, fail */ - return -1; + return PARSEDATE_FAIL; #if SIZEOF_TIME_T < 5 /* 32 bit time_t can only hold dates to the beginning of 2038 */ - if(yearnum > 2037) - return 0x7fffffff; + if(yearnum > 2037) { + *output = 0x7fffffff; + return PARSEDATE_LATER; + } #endif + if(yearnum < 1970) { + *output = 0; + return PARSEDATE_SOONER; + } + tm.tm_sec = secnum; tm.tm_min = minnum; tm.tm_hour = hournum; @@ -441,11 +459,23 @@ static time_t parsedate(const char *date) t += delta; } - return t; + *output = t; + + return PARSEDATE_OK; } time_t curl_getdate(const char *p, const time_t *now) { - (void)now; - return parsedate(p); + time_t parsed; + int rc = Curl_parsedate(p, &parsed); + (void)now; /* legacy argument from the past that we ignore */ + + switch(rc) { + case PARSEDATE_OK: + case PARSEDATE_LATER: + case PARSEDATE_SOONER: + return parsed; + } + /* everything else is fail */ + return -1; } diff --git a/lib/parsedate.h b/lib/parsedate.h index 3e502b9bc..af59bae7f 100644 --- a/lib/parsedate.h +++ b/lib/parsedate.h @@ -26,4 +26,22 @@ extern const char * const Curl_wkday[7]; extern const char * const Curl_month[12]; +/* + * Curl_parsedate() + * + * Returns: + * + * PARSEDATE_OK - a fine conversion + * PARSEDATE_FAIL - failed to convert + * PARSEDATE_LATER - time overflow at the far end of time_t + * PARSEDATE_SOONER - time underflow at the low end of time_t + */ + +int Curl_parsedate(const char *date, time_t *output); + +#define PARSEDATE_OK 0 +#define PARSEDATE_FAIL -1 +#define PARSEDATE_LATER 1 +#define PARSEDATE_SOONER 2 + #endif |