--- varnishncsa.c.orig	2011/05/10 10:33:15	1.1
+++ varnishncsa.c	2011/05/10 10:45:54
@@ -96,12 +96,16 @@
 	char *df_s;			/* %s, Status */
 	struct tm df_t;			/* %t, Date and time */
 	char *df_u;			/* %u, Remote user */
+	long df_age;			/* age of this object */
+	long df_hits;			/* number of hits for this object */
+	float df_el;			/* ??, request/response time in seconds */
 	int active;			/* Is log line in an active trans */
 	int complete;			/* Is log line complete */
 } **ll;
 
 static size_t nll;
 static int prefer_x_forwarded_for = 0;
+static int extended_format = 0;
 
 static int
 isprefix(const char *str, const char *prefix, const char *end,
@@ -308,6 +312,7 @@
 {
 	const char *end, *next;
 	long l;
+	float el;
 	time_t t;
 
 	assert(spec & VSL_S_CLIENT);
@@ -379,6 +384,15 @@
 			lp->df_Host = trimline(next, end);
 		break;
 
+	case SLT_TxHeader:
+		if(!lp->active)
+			break;
+		if (isprefix(ptr, "x-hits:", end, &next))
+			lp->df_hits = strtol(trimline(next, end), (char **)NULL, 10);
+		else if (isprefix(ptr, "age:", end, &next))
+			lp->df_age = strtol(trimline(next, end), (char **)NULL, 10);
+		break;
+
 	case SLT_Length:
 		if(!lp->active)
 			break;
@@ -402,12 +416,13 @@
 	case SLT_ReqEnd:
 		if(!lp->active)
 			break;
-		if (sscanf(ptr, "%*u %*u.%*u %ld.", &l) != 1) {
+		if (sscanf(ptr, "%*u %*u.%*u %ld.%*u %*f %f %*f", &l, &el) != 2) {
 			clean_logline(lp);
 			break;
 		}
 		t = l;
 		localtime_r(&t, &lp->df_t);
+		lp->df_el = el;
 		/* got it all */
 		lp->complete = 1;
 		break;
@@ -527,9 +542,21 @@
 		lp->df_Referer ? lp->df_Referer : "-");
 
 	/* %{User-agent}i */
-	fprintf(fo, "\"%s\"\n",
+	fprintf(fo, "\"%s\"",
 	    lp->df_User_agent ? lp->df_User_agent : "-");
 
+	if (extended_format) {
+		/* Age */
+		fprintf(fo, " %ld ", lp->df_age);
+
+		/* %{X-Hits}i */
+		fprintf(fo, "%ld ", lp->df_hits);
+
+		/* elapsed */
+		fprintf(fo, "%.9f", lp->df_el);
+	}
+	fprintf(fo, "\n");
+
 	/* flush the stream */
 	fflush(fo);
 
@@ -568,7 +595,7 @@
 {
 
 	fprintf(stderr,
-	    "usage: varnishncsa %s [-aDV] [-n varnish_name] "
+	    "usage: varnishncsa %s [-aeDV] [-n varnish_name] "
 	    "[-P file] [-w file]\n", VSL_USAGE);
 	exit(1);
 }
@@ -587,11 +614,14 @@
 
 	vd = VSL_New();
 
-	while ((c = getopt(argc, argv, VSL_ARGS "aDn:P:Vw:f")) != -1) {
+	while ((c = getopt(argc, argv, VSL_ARGS "aeDn:P:Vw:f")) != -1) {
 		switch (c) {
 		case 'a':
 			a_flag = 1;
 			break;
+		case 'e':
+			extended_format = 1;
+			break;
 		case 'f':
 			prefer_x_forwarded_for = 1;
 			break;