]> err.no Git - varnish/commitdiff
Add time parse/format functions to libvarnish
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 16 Jun 2006 10:16:00 +0000 (10:16 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 16 Jun 2006 10:16:00 +0000 (10:16 +0000)
git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@189 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/include/libvarnish.h
varnish-cache/lib/libvarnish/Makefile.am
varnish-cache/lib/libvarnish/time.c [new file with mode: 0644]

index 963d4350755dcca503ff9cc07b209537ca291e97..616290ecf6beed53d133a08467778d47875970a0 100644 (file)
@@ -6,6 +6,11 @@
 void FreeArgv(char **argv);
 char **ParseArgv(const char *s, int comment);
 
+#ifdef CLOCK_MONOTONIC
+/* from libvarnish/time.c */
+void TIM_format(time_t t, char *p);
+time_t TIM_parse(const char *p);
+#endif
 
 /* Assert zero return value */
 #define AZ(foo)        do { assert((foo) == 0); } while (0)
index 476f683eebb0e575660d92b0bc2711467dd86786..9e2c7a713d6a3ff8bc47d79159a1e4b2c4d0beaa 100644 (file)
@@ -6,4 +6,5 @@ lib_LTLIBRARIES = libvarnish.la
 
 libvarnish_la_SOURCES = \
        argv.c \
-       cli.c
+       cli.c \
+       time.c
diff --git a/varnish-cache/lib/libvarnish/time.c b/varnish-cache/lib/libvarnish/time.c
new file mode 100644 (file)
index 0000000..9551922
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * $Id$
+ *
+ * Semi-trivial functions to handle HTTP header timestamps according to
+ * RFC 2616 section 3.3.
+ *
+ * In the highly unlikely event of performance trouble, handbuilt versions
+ * would likely be faster than relying on the OS time functions.
+ *
+ * We must parse three different formats:
+ *       000000000011111111112222222222
+ *       012345678901234567890123456789
+ *       ------------------------------
+ *     "Sun, 06 Nov 1994 08:49:37 GMT"         RFC822 & RFC1123
+ *     "Sunday, 06-Nov-94 08:49:37 GMT"        RFC850
+ *     "Sun Nov  6 08:49:37 1994"              ANSI-C asctime()
+ *
+ * And always output the RFC1123 format.
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+
+void
+TIM_format(time_t t, char *p)
+{
+       struct tm tm;
+
+       gmtime_r(&t, &tm);
+       strftime(p, 30, "%a, %d %b %Y %T GMT", &tm);
+}
+
+/* XXX: add statistics ? */
+static const char *fmts[] = {
+       "%a, %d %b %Y %T GMT",  /* RFC 822 & RFC1123 */
+       "%A, %d-%b-%y %T GMT",  /* RFC850 */
+       "%a %b %d %T %Y",       /* ANSI-C asctime() */
+       NULL
+};
+
+time_t
+TIM_parse(const char *p)
+{
+       struct tm tm;
+       const char **r;
+
+       for (r = fmts; *r != NULL; r++) {
+               memset(&tm, 0, sizeof tm);
+               if (strptime(p, *r, &tm) != NULL)
+                       return(timegm(&tm));
+       }
+       return (0);
+}
+
+#ifdef TEST_DRIVER
+int
+main(int argc, char **argv)
+{
+       time_t t;
+       char buf[BUFSIZ];
+
+       time(&t);
+       memset(buf, 0x55, sizeof buf);
+       TIM_format(t, buf);
+       printf("scan = %d <%s>\n", TIM_parse(buf), buf);
+
+       /* Examples from RFC2616 section 3.3.1 */
+       printf("scan = %d\n", TIM_parse("Sun, 06 Nov 1994 08:49:37 GMT"));
+       printf("scan = %d\n", TIM_parse("Sunday, 06-Nov-94 08:49:37 GMT"));
+       printf("scan = %d\n", TIM_parse("Sun Nov  6 08:49:37 1994"));
+
+       return (0);
+}
+#endif