static struct tm * parse_date3(const char *str) { /* Wed Jun 9 01:29:59 1993 GMT */ static struct tm tm; char *s; static char buf[128]; while (*str && *str == ' ') str++; xstrncpy(buf, str, 128); if (NULL == (s = strtok(buf, w_space))) return NULL; if (NULL == (s = strtok(NULL, w_space))) return NULL; tm.tm_mon = make_month(s); if (NULL == (s = strtok(NULL, w_space))) return NULL; tm.tm_mday = atoi(s); if (NULL == (s = strtok(NULL, ":"))) return NULL; tm.tm_hour = atoi(s); if (NULL == (s = strtok(NULL, ":"))) return NULL; tm.tm_min = atoi(s); if (NULL == (s = strtok(NULL, w_space))) return NULL; tm.tm_sec = atoi(s); if (NULL == (s = strtok(NULL, w_space))) return NULL; /* Y2K fix, [email protected] */ tm.tm_year = atoi(s) - 1900; return tmSaneValues(&tm) ? &tm : NULL; }
static struct tm * parse_date_elements(const char *day, const char *month, const char *year, const char *time, const char *zone) { static struct tm tm; char *t; memset(&tm, 0, sizeof(tm)); if (!day || !month || !year || !time) return NULL; tm.tm_mday = atoi(day); tm.tm_mon = make_month(month); if (tm.tm_mon < 0) return NULL; tm.tm_year = atoi(year); if (strlen(year) == 4) tm.tm_year -= 1900; else if (tm.tm_year < 70) tm.tm_year += 100; else if (tm.tm_year > 19000) tm.tm_year -= 19000; tm.tm_hour = make_num(time); t = strchr(time, ':'); if (!t) return NULL; t++; tm.tm_min = atoi(t); t = strchr(t, ':'); if (t) tm.tm_sec = atoi(t + 1); return tmSaneValues(&tm) ? &tm : NULL; }
static struct tm * parse_date2(const char *str) { /* Thu, 10 Jan 1993 01:29:59 GMT */ const char *s; static struct tm tm; assert(NULL != str); memset(&tm, '\0', sizeof(struct tm)); s = strchr(str, ','); if (NULL == s) return NULL; s++; while (*s == ' ') s++; /* backup if month is only one digit */ if (xisdigit(*s) && !xisdigit(*(s + 1))) s--; if (strchr(s, '-')) return NULL; if ((int) strlen(s) < 20) return NULL; memset(&tm, '\0', sizeof(tm)); tm.tm_mday = make_num(s); tm.tm_mon = make_month(s + 3); tm.tm_year = (100 * make_num(s + 7) - 1900) + make_num(s + 9); tm.tm_hour = make_num(s + 12); tm.tm_min = make_num(s + 15); tm.tm_sec = make_num(s + 18); return tmSaneValues(&tm) ? &tm : NULL; }
static struct tm * parse_date1(const char *str) { /* Thursday, 10-Jun-93 01:29:59 GMT */ const char *s; static struct tm tm; assert(NULL != str); memset(&tm, '\0', sizeof(struct tm)); s = strchr(str, ','); if (NULL == s) return NULL; s++; while (*s == ' ') s++; /* backup if month is only one digit */ if (xisdigit(*s) && !xisdigit(*(s + 1))) s--; if (!strchr(s, '-')) return NULL; if ((int) strlen(s) < 18) return NULL; memset(&tm, '\0', sizeof(tm)); tm.tm_mday = make_num(s); tm.tm_mon = make_month(s + 3); tm.tm_year = make_num(s + 7); /* * Y2K: Arjan de Vet <*****@*****.**> * if tm.tm_year < 70, assume it's after the year 2000. */ if (tm.tm_year < 70) tm.tm_year += 100; tm.tm_hour = make_num(s + 10); tm.tm_min = make_num(s + 13); tm.tm_sec = make_num(s + 16); return tmSaneValues(&tm) ? &tm : NULL; }
time_t parse_time(const char *str, const int str_len) { int hour; int min; int sec; int mday; int mon; int year; if (str[3] == ',') { /* Thu, 09 Jan 1993 01:29:59 GMT */ if (str_len < 29) return -1; mday = make_num(str+5); mon = make_month(str + 8); year = 100 * make_num(str + 12) + make_num(str + 14); hour = make_num(str + 17); min = make_num(str + 20); sec = make_num(str + 23); } else { const char *s; s = strchr(str, ','); if (!s || (str_len - (s - str) < 24)) { /* Wed Jun 9 01:29:59 1993 */ if (str_len < 24) return -1; mon = make_month(str+4); mday = make_num(str+8); hour = make_num(str+11); min = make_num(str+14); sec = make_num(str+17); year = make_num(str+20)*100 + make_num(str+22); } else { /* Thursday, 10-Jun-93 01:29:59 GMT */ mday = make_num(s + 2); mon = make_month(s + 5); year = make_num(s + 9) + 1900; if (year < 1970) year += 100; hour = make_num(s + 12); min = make_num(s + 15); sec = make_num(s + 18); } } if (sec < 0 || sec > 59) return -1; if (min < 0 || min > 59) return -1; if (hour < 0 || hour > 23) return -1; if (mday < 1 || mday > 31) return -1; if (mon < 1 || mon > 12) return -1; if (year < 1970 || year > 2020) return -1; return mktime(year, mon, mday, hour, min, sec); }
PUBLIC time_t parse_http_time ARGS1(char *, str) { char * s; struct tm tm; time_t t; #ifdef ISC3 /* Lauren */ struct tm * gorl; /* GMT or localtime */ long z = 0L; #endif if (!str) return 0; if ((s = strchr(str, ','))) { /* Thursday, 10-Jun-93 01:29:59 GMT */ s++; /* or: Thu, 10 Jan 1993 01:29:59 GMT */ while (*s && *s==' ') s++; if (strchr(s,'-')) { /* First format */ CTRACE(stderr, "Format...... Weekday, 00-Mon-00 00:00:00 GMT\n"); if ((int)strlen(s) < 18) { CTRACE(stderr, "ERROR....... Not a valid time format \"%s\"\n", s); return 0; } tm.tm_mday = make_num(s); tm.tm_mon = make_month(s+3); tm.tm_year = make_num(s+7); tm.tm_hour = make_num(s+10); tm.tm_min = make_num(s+13); tm.tm_sec = make_num(s+16); } else { /* Second format */ CTRACE(stderr, "Format...... Wkd, 00 Mon 0000 00:00:00 GMT\n"); if ((int)strlen(s) < 20) { CTRACE(stderr, "ERROR....... Not a valid time format \"%s\"\n", s); return 0; } tm.tm_mday = make_num(s); tm.tm_mon = make_month(s+3); tm.tm_year = (100*make_num(s+7) - 1900) + make_num(s+9); tm.tm_hour = make_num(s+12); tm.tm_min = make_num(s+15); tm.tm_sec = make_num(s+18); } } else { /* Try the other format: Wed Jun 9 01:29:59 1993 GMT */ CTRACE(stderr, "Format...... Wkd Mon 00 00:00:00 0000 GMT\n"); s = str; while (*s && *s==' ') s++; CTRACE(stderr, "Trying...... The Wrong time format: %s\n", s); if ((int)strlen(s) < 24) { CTRACE(stderr, "ERROR....... Not a valid time format \"%s\"\n", s); return 0; } tm.tm_mday = make_num(s+8); tm.tm_mon = make_month(s+4); tm.tm_year = make_num(s+22); tm.tm_hour = make_num(s+11); tm.tm_min = make_num(s+14); tm.tm_sec = make_num(s+17); } if (tm.tm_sec < 0 || tm.tm_sec > 59 || tm.tm_min < 0 || tm.tm_min > 59 || tm.tm_hour < 0 || tm.tm_hour > 23 || tm.tm_mday < 1 || tm.tm_mday > 31 || tm.tm_mon < 0 || tm.tm_mon > 11 || tm.tm_year <70 || tm.tm_year >120) { CTRACE(stderr, "ERROR....... Parsed illegal time: %02d.%02d.%02d %02d:%02d:%02d\n", tm.tm_mday, tm.tm_mon+1, tm.tm_year, tm.tm_hour, tm.tm_min, tm.tm_sec); return 0; } tm.tm_isdst = -1; /* * What a pain it is to get the timezone correctly. */ #if defined(sun) && !defined(__svr4__) t = timegm(&tm); #else /* not sun, except svr4 */ t = mktime(&tm); /* BSD, have tm_gmtoff */ #if defined(SIGTSTP) && !defined(AIX) && !defined(__sgi) && !defined(_AUX) && !defined(__svr4__) { time_t cur_t = time(NULL); struct tm * local = localtime(&cur_t); t += local->tm_gmtoff; CTRACE(stderr,"TimeZone.... %02d hours from GMT\n", (int)local->tm_gmtoff / 3600); } #else /* SysV or VMS */ { #ifdef VMS CTRACE(stderr,"TimeZone.... undefined\n"); #else /* SysV */ #ifdef ISC3 /* Lauren */ time_t cur_t = time(NULL); gorl = localtime(&cur_t); if (daylight && gorl->tm_isdst) /* daylight time? */ z = altzone; /* yes */ else z = timezone; /* no */ z /= 60; /* convert to minutes */ z = -z; /* ISC 3.0 has it vice versa */ t += z * 60; CTRACE(stderr,"TimeZone.... %02d hours from GMT\n", z / 60); #else int dst = 0; /* * The following assumes a fixed DST offset of 1 hour, * which is probably wrong. */ if (tm.tm_isdst > 0) dst = -3600; t -= (timezone + dst); CTRACE(stderr,"TimeZone.... %02d hours from GMT\n", (timezone + dst) / 3600); #endif #endif /* SysV */ } #endif /* SysV or VMS */ #endif /* not sun, except svr4 */ CTRACE(stderr, "Time string. %s", str); CTRACE(stderr, "Parsed...... to %ld seconds, %s", (long)t, ctime(&t)); return t; }
/* ** Parse a str in GMT format to a local time time_t representation ** Four formats are accepted: ** ** Wkd, 00 Mon 0000 00:00:00 GMT (rfc1123) ** Weekday, 00-Mon-00 00:00:00 GMT (rfc850) ** Wkd Mon 00 00:00:00 0000 GMT (ctime) ** 1*DIGIT (delta-seconds) */ PUBLIC time_t HTParseTime (const char * str, HTUserProfile * up, BOOL expand) { char * s; struct tm tm; time_t t; if (!str) return 0; if ((s = strchr(str, ','))) { /* Thursday, 10-Jun-93 01:29:59 GMT */ s++; /* or: Thu, 10 Jan 1993 01:29:59 GMT */ while (*s && *s==' ') s++; if (strchr(s,'-')) { /* First format */ HTTRACE(CORE_TRACE, "Format...... Weekday, 00-Mon-00 00:00:00 GMT\n"); if ((int)strlen(s) < 18) { HTTRACE(CORE_TRACE, "ERROR....... Not a valid time format \"%s\"\n" _ s); return 0; } tm.tm_mday = strtol(s, &s, 10); tm.tm_mon = make_month(s, &s); tm.tm_year = strtol(++s, &s, 10); tm.tm_hour = strtol(s, &s, 10); tm.tm_min = strtol(++s, &s, 10); tm.tm_sec = strtol(++s, &s, 10); } else { /* Second format */ HTTRACE(CORE_TRACE, "Format...... Wkd, 00 Mon 0000 00:00:00 GMT\n"); if ((int)strlen(s) < 20) { HTTRACE(CORE_TRACE, "ERROR....... Not a valid time format \"%s\"\n" _ s); return 0; } tm.tm_mday = strtol(s, &s, 10); tm.tm_mon = make_month(s, &s); tm.tm_year = strtol(s, &s, 10) - 1900; tm.tm_hour = strtol(s, &s, 10); tm.tm_min = strtol(++s, &s, 10); tm.tm_sec = strtol(++s, &s, 10); } } else if (isdigit((int) *str)) { if (strchr(str, 'T')) { /* ISO (limited format) date string */ HTTRACE(CORE_TRACE, "Format...... YYYY.MM.DDThh:mmStzWkd\n"); s = (char *) str; while (*s && *s==' ') s++; if ((int)strlen(s) < 21) { HTTRACE(CORE_TRACE, "ERROR....... Not a valid time format `%s\'\n" _ s); return 0; } tm.tm_year = strtol(s, &s, 10) - 1900; tm.tm_mon = strtol(++s, &s, 10); tm.tm_mday = strtol(++s, &s, 10); tm.tm_hour = strtol(++s, &s, 10); tm.tm_min = strtol(++s, &s, 10); tm.tm_sec = strtol(++s, &s, 10); } else { /* delta seconds */ t = expand ? time(NULL) + atol(str) : atol(str); #ifdef HTDEBUG if (CORE_TRACE) { if (expand) { #if defined (HAVE_CTIME_R_2) char buffer[CTIME_MAX]; HTTRACE(CORE_TRACE, "Time string. Delta-time %s parsed to %ld seconds, or in local time: %s" _ str _ (long) t _ (char *) ctime_r(&t, buffer)); #elif defined(HAVE_CTIME_R_3) char buffer[CTIME_MAX]; HTTRACE(CORE_TRACE, "Time string. Delta-time %s parsed to %ld seconds, or in local time: %s" _ str _ (long) t _ (char *) ctime_r(&t, buffer, CTIME_MAX)); #else HTTRACE(CORE_TRACE, "Time string. Delta-time %s parsed to %ld seconds, or in local time: %s" _ str _ (long) t _ ctime(&t)); #endif /* HT_REENTRANT */ } else { HTTRACE(CORE_TRACE, "Time string. Delta-time %s parsed to %ld seconds\n" _ str _ (long) t); } } #endif /* HT_DEBUG */ return t; } } else { /* Try the other format: Wed Jun 9 01:29:59 1993 GMT */ HTTRACE(CORE_TRACE, "Format...... Wkd Mon 00 00:00:00 0000 GMT\n"); s = (char *) str; while (*s && *s==' ') s++; HTTRACE(CORE_TRACE, "Trying...... The Wrong time format: %s\n" _ s); if ((int)strlen(s) < 24) { HTTRACE(CORE_TRACE, "ERROR....... Not a valid time format \"%s\"\n" _ s); return 0; } tm.tm_mon = make_month(s, &s); tm.tm_mday = strtol(s, &s, 10); tm.tm_hour = strtol(s, &s, 10); tm.tm_min = strtol(++s, &s, 10); tm.tm_sec = strtol(++s, &s, 10); tm.tm_year = strtol(s, &s, 10) - 1900; } if (tm.tm_sec < 0 || tm.tm_sec > 59 || tm.tm_min < 0 || tm.tm_min > 59 || tm.tm_hour < 0 || tm.tm_hour > 23 || tm.tm_mday < 1 || tm.tm_mday > 31 || tm.tm_mon < 0 || tm.tm_mon > 11 || tm.tm_year <70 || tm.tm_year >120) { HTTRACE(CORE_TRACE, "ERROR....... Parsed illegal time: %02d.%02d.%02d %02d:%02d:%02d\n" _ tm.tm_mday _ tm.tm_mon+1 _ tm.tm_year _ tm.tm_hour _ tm.tm_min _ tm.tm_sec); return 0; } #if 0 #if defined(HAVE_TIMEZONE) && defined(HAVE_ALTZONE) tm.tm_isdst = daylight; /* Already taken into account */ HTTRACE(CORE_TRACE, "Time string. Daylight is %s\n" _ daylight>0 ? "on" : daylight==0 ? "off" : "unknown"); #endif #else /* Let mktime decide whether we have DST or not */ tm.tm_isdst = -1; #endif #ifdef HAVE_MKTIME t = mktime(&tm); t += (up ? HTUserProfile_timezone(up) : HTGetTimeZoneOffset()); #else #ifdef HAVE_TIMEGM t = timegm(&tm); #else #error "Neither mktime nor timegm defined" #endif /* HAVE_TIMEGM */ #endif /* HAVE_MKTIME */ HTTRACE(CORE_TRACE, "Time string. %s parsed to %ld calendar time or `%s' in local time\n" _ str _ (long) t _ ctime(&t)); return t; }