/** * Convert time in string format into seconds. * */ static time_t timeshift2time(const char *time) { /* convert a string in format YYMMDDHHMMSS to time_t */ struct tm tm; time_t timeshift = 0; /* try to scan the time */ if (strptime(time, "%Y%m%d%H%M%S", &tm)) { timeshift = mktime_from_utc(&tm); } return timeshift; }
uint16_t * zparser_conv_time(region_type *region, const char *time) { /* convert a time YYHM to wireformat */ uint16_t *r = NULL; struct tm tm; /* Try to scan the time... */ if (!strptime(time, "%Y%m%d%H%M%S", &tm)) { zc_error_prev_line("date and time is expected"); } else { uint32_t l = htonl(mktime_from_utc(&tm)); r = alloc_rdata_init(region, &l, sizeof(l)); } return r; }
void header_last_modified(const char *s) { double diff; time_t time0, time1; struct tm tm; time0 = time(0); if (!parse_date(s, &tm)) return; time1 = mktime_from_utc(&tm); diff = difftime(time1, time0); if (10 < diff) lookup("futurelastmod"); else lookup("ok"); }
void header_date(const char *s) { double diff; time_t time0, time1; struct tm tm; time0 = time(0); if (!parse_date(s, &tm)) return; time1 = mktime_from_utc(&tm); diff = difftime(time0, time1); if (10 < fabs(diff)) lookup("wrongdate"); else lookup("ok"); }
time_t parse_time(char *time_str, int use_american_date_formats) { struct tm tm; char **date_formats; memset(&tm, 0, sizeof (tm)); tm.tm_isdst = -1; for (date_formats = (use_american_date_formats ? american_date_formats : european_date_formats); *date_formats; date_formats++) { if (check_end((const char *)strptime(time_str, *date_formats, &tm))) return mktime_from_utc(&tm); } return -1; }
/* http://wp.netscape.com/newsref/std/cookie_spec.html */ void header_set_cookie(const char *s) { bool ok = true; int r; const char *semi = strchr(s, ';'); const char *s2; struct tm tm; double diff; time_t time0, time1; regmatch_t pmatch[20]; if (semi) s2 = strndup(s, semi - s); else s2 = s; r = regexec(&re_cookie_nameval, s2, 0, 0, 0); if (r) { lookup("cookiebadnameval"); ok = false; } if (!semi) return; s = skip_lws(semi + 1); while (*s) { semi = strchr(s, ';'); if (semi) s2 = strndup(s, semi - s); else s2 = s; if (strncasecmp(s2, "expires=", 8) == 0) { s2 += 8; r = regexec(&re_cookie_expires, s2, 20, pmatch, 0); if (r == 0) { tm.tm_mday = atoi(s2 + pmatch[2].rm_so); tm.tm_mon = month(s2 + pmatch[3].rm_so); tm.tm_year = atoi(s2 + pmatch[4].rm_so) - 1900; tm.tm_hour = atoi(s2 + pmatch[5].rm_so); tm.tm_min = atoi(s2 + pmatch[6].rm_so); tm.tm_sec = atoi(s2 + pmatch[7].rm_so); time0 = time(0); time1 = mktime_from_utc(&tm); diff = difftime(time0, time1); if (10 < diff) { lookup("cookiepastdate"); ok = false; } } else { lookup("cookiebaddate"); ok = false; } } else if (strncasecmp(s2, "domain=", 7) == 0) { } else if (strncasecmp(s2, "path=", 5) == 0) { if (s2[5] != '/') { lookup("cookiebadpath"); ok = false; } } else if (strcasecmp(s, "secure") == 0) { } else { if (html) printf("<li class='warning'>"); printf(" Set-Cookie field '%s':\n", s2); if (html) printf("</li>\n"); lookup("cookieunknownfield"); ok = false; } if (semi) s = skip_lws(semi + 1); else break; } if (ok) lookup("ok"); }
/* Convert TIME_STRING time to time_t. TIME_STRING can be in any of the three formats RFC2068 allows the HTTP servers to emit -- RFC1123-date, RFC850-date or asctime-date. Timezones are ignored, and should be GMT. We use strptime() to recognize various dates, which makes it a little bit slacker than the RFC1123/RFC850/asctime (e.g. it always allows shortened dates and months, one-digit days, etc.). It also allows more than one space anywhere where the specs require one SP. The routine should probably be even more forgiving (as recommended by RFC2068), but I do not have the time to write one. Return the computed time_t representation, or -1 if all the schemes fail. Needless to say, what we *really* need here is something like Marcus Hennecke's atotm(), which is forgiving, fast, to-the-point, and does not use strptime(). atotm() is to be found in the sources of `phttpd', a little-known HTTP server written by Peter Erikson. */ gboolean mate_vfs_atotm (const gchar *time_string, time_t *value_return) { #ifndef G_OS_WIN32 struct tm t; /* Roger Beeman says: "This function dynamically allocates struct tm t, but does no initialization. The only field that actually needs initialization is tm_isdst, since the others will be set by strptime. Since strptime does not set tm_isdst, it will return the data structure with whatever data was in tm_isdst to begin with. For those of us in timezones where DST can occur, there can be a one hour shift depending on the previous contents of the data area where the data structure is allocated." */ t.tm_isdst = -1; /* Note that under foreign locales Solaris strptime() fails to recognize English dates, which renders this function useless. I assume that other non-GNU strptime's are plagued by the same disease. We solve this by setting only LC_MESSAGES in i18n_initialize(), instead of LC_ALL. Another solution could be to temporarily set locale to C, invoke strptime(), and restore it back. This is slow and dirty, however, and locale support other than LC_MESSAGES can mess other things, so I rather chose to stick with just setting LC_MESSAGES. Also note that none of this is necessary under GNU strptime(), because it recognizes both international and local dates. */ /* NOTE: We don't use `%n' for white space, as OSF's strptime uses it to eat all white space up to (and including) a newline, and the function fails if there is no newline (!). Let's hope all strptime() implementations use ` ' to skip *all* whitespace instead of just one (it works that way on all the systems I've tested it on). */ /* RFC1123: Thu, 29 Jan 1998 22:12:57 */ if (check_end (strptime (time_string, "%a, %d %b %Y %T", &t))) { *value_return = mktime_from_utc (&t); return TRUE; } /* RFC850: Thu, 29-Jan-98 22:12:57 */ if (check_end (strptime (time_string, "%a, %d-%b-%y %T", &t))) { *value_return = mktime_from_utc (&t); return TRUE; } /* asctime: Thu Jan 29 22:12:57 1998 */ if (check_end (strptime (time_string, "%a %b %d %T %Y", &t))) { *value_return = mktime_from_utc (&t); return TRUE; } /* Failure. */ return FALSE; #else g_error ("Not yet implemented: mate_vfs_atotm()"); return FALSE; #endif /* G_OS_WIN32 */ }