aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/parsedate.c48
-rw-r--r--lib/parsedate.h18
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