[3.0] 2f57b83 A bit of spit and polish inspired by DocWilcos varnishtest patch.

Tollef Fog Heen tfheen at varnish-cache.org
Thu Sep 22 14:01:46 CEST 2011


commit 2f57b83a1bc4de75768d9dd17cbf8eec2c49f3b4
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Sep 1 15:19:33 2011 +0000

    A bit of spit and polish inspired by DocWilcos varnishtest patch.

diff --git a/bin/varnishlog/flint.lnt b/bin/varnishlog/flint.lnt
index 149eec1..3a0395c 100644
--- a/bin/varnishlog/flint.lnt
+++ b/bin/varnishlog/flint.lnt
@@ -1,4 +1,5 @@
-
+-efile(451, "../../include/vsc_all.h")
+-e835   // A zero has been given as ___ argument to operator '___'  (<<)
 -e712	// 14      Info    712     Loss of precision (___) (___ to ___)
 -e747	// 16      Info    747     Significant prototype coercion (___) ___ to ___
 
@@ -17,3 +18,4 @@
 -e788	// enum constant '___' not used within defaulted switch
 -e641	// Converting enum '___' to '___'
 
+-esym(785,VSL_tags);	// Sparse array
diff --git a/bin/varnishlog/flint.sh b/bin/varnishlog/flint.sh
index a94710d..dc9e9ba 100755
--- a/bin/varnishlog/flint.sh
+++ b/bin/varnishlog/flint.sh
@@ -1,11 +1,28 @@
 #!/bin/sh
 
+if [ "x$1" = "x-ok" -a -f _.fl ] ; then
+	echo "Saved as reference"
+	mv _.fl _.fl.old
+	exit 0
+fi
+
 flexelint \
-	-I/usr/include \
+	../flint.lnt \
+	flint.lnt \
 	-I. \
 	-I../../include \
 	-I../.. \
-	../flint.lnt \
-	flint.lnt \
+	-I/usr/local/include \
+	-DVARNISH_STATE_DIR=\"foo\" \
 	*.c \
-	../../lib/libvarnishapi/*.c
+	../../lib/libvarnishapi/*.c \
+	2>&1 | tee _.fl
+
+if [ -f _.fl.old ] ; then
+	diff -u _.fl.old _.fl
+fi
+
+if [ "x$1" = "x-ok" ] ; then
+	echo "Saved as reference"
+	mv _.fl _.fl.old
+fi
diff --git a/bin/varnishlog/varnishlog.c b/bin/varnishlog/varnishlog.c
index ed29865..c7749cb 100644
--- a/bin/varnishlog/varnishlog.c
+++ b/bin/varnishlog/varnishlog.c
@@ -46,7 +46,6 @@
 
 #include "libvarnish.h"
 #include "vsl.h"
-#include "vre.h"
 #include "varnishapi.h"
 
 static int	b_flag, c_flag;
@@ -60,7 +59,7 @@ static uint64_t       bitmap[65536];
 #define F_INVCL		(1 << 0)
 
 static void
-h_order_finish(int fd, struct VSM_data *vd)
+h_order_finish(int fd, const struct VSM_data *vd)
 {
 
 	AZ(VSB_finish(ob[fd]));
@@ -72,7 +71,7 @@ h_order_finish(int fd, struct VSM_data *vd)
 }
 
 static void
-clean_order(struct VSM_data *vd)
+clean_order(const struct VSM_data *vd)
 {
 	unsigned u;
 
@@ -321,7 +320,8 @@ main(int argc, char * const *argv)
 			w_arg = optarg;
 			break;
 		case 'm':
-			m_flag = 1; /* fall through */
+			m_flag = 1;
+			/* FALLTHROUGH */
 		default:
 			if (VSL_Arg(vd, c, optarg) > 0)
 				break;
diff --git a/include/varnishapi.h b/include/varnishapi.h
index 0e97755..dcdd74f 100644
--- a/include/varnishapi.h
+++ b/include/varnishapi.h
@@ -109,7 +109,7 @@ int VSM_ReOpen(struct VSM_data *vd, int diag);
 	 *	-1 failure to reopen.
 	 */
 
-unsigned VSM_Seq(struct VSM_data *vd);
+unsigned VSM_Seq(const struct VSM_data *vd);
 	/*
 	 * Return the allocation sequence number
 	 */
@@ -260,6 +260,7 @@ void VSL_NonBlocking(const struct VSM_data *vd, int nb);
 int VSL_Dispatch(struct VSM_data *vd, VSL_handler_f *func, void *priv);
 int VSL_NextLog(const struct VSM_data *lh, uint32_t **pp, uint64_t *bitmap);
 int VSL_Matched(const struct VSM_data *vd, uint64_t bitmap);
+int VSL_Name2Tag(const char *name, int l);
 extern const char *VSL_tags[256];
 
 #endif
diff --git a/lib/libvarnishapi/vsc.c b/lib/libvarnishapi/vsc.c
index d9624b9..fc18cb3 100644
--- a/lib/libvarnishapi/vsc.c
+++ b/lib/libvarnishapi/vsc.c
@@ -330,7 +330,7 @@ VSC_Iter(struct VSM_data *vd, VSC_iter_f *func, void *priv)
 		CHECK_OBJ_NOTNULL(sha, VSM_CHUNK_MAGIC);
 		if (strcmp(sha->class, VSC_CLASS))
 			continue;
-
+		/*lint -save -e525 -e539 */
 #define VSC_F(a,b,c,d,e)
 #define VSC_DONE(a,b,c)
 #define VSC_DO(U,l,t)						\
@@ -343,6 +343,7 @@ VSC_Iter(struct VSM_data *vd, VSC_iter_f *func, void *priv)
 #undef VSC_F
 #undef VSC_DO
 #undef VSC_DONE
+		/*lint -restore */
 		break;
 	}
 	return (i);
diff --git a/lib/libvarnishapi/vsl.c b/lib/libvarnishapi/vsl.c
index f4e633b..6791888 100644
--- a/lib/libvarnishapi/vsl.c
+++ b/lib/libvarnishapi/vsl.c
@@ -206,7 +206,7 @@ vsl_nextlog(struct vsl *vsl, uint32_t **pp)
 }
 
 int
-VSL_NextLog(const struct VSM_data *vd, uint32_t **pp, uint64_t *mb)
+VSL_NextLog(const struct VSM_data *vd, uint32_t **pp, uint64_t *bits)
 {
 	struct vsl *vsl;
 	uint32_t *p;
@@ -268,7 +268,7 @@ VSL_NextLog(const struct VSM_data *vd, uint32_t **pp, uint64_t *mb)
 			if (i != VRE_ERROR_NOMATCH)
 				continue;
 		}
-		if (mb != NULL) {
+		if (bits != NULL) {
 			struct vsl_re_match *vrm;
 			int j = 0;
 			VTAILQ_FOREACH(vrm, &vsl->matchers, next) {
@@ -276,7 +276,7 @@ VSL_NextLog(const struct VSM_data *vd, uint32_t **pp, uint64_t *mb)
 					i = VRE_exec(vrm->re, VSL_DATA(p),
 						     VSL_LEN(p), 0, 0, NULL, 0);
 					if (i >= 0)
-						*mb |= 1 << j;
+						*bits |= (uintmax_t)1 << j;
 				}
 				j++;
 			}
diff --git a/lib/libvarnishapi/vsl_arg.c b/lib/libvarnishapi/vsl_arg.c
index 49930c8..21cd8e9 100644
--- a/lib/libvarnishapi/vsl_arg.c
+++ b/lib/libvarnishapi/vsl_arg.c
@@ -41,7 +41,6 @@
 #include <unistd.h>
 
 #include "vas.h"
-#include "vin.h"
 #include "vre.h"
 #include "vbm.h"
 #include "miniobj.h"
@@ -50,6 +49,34 @@
 #include "vsm_api.h"
 #include "vsl_api.h"
 
+/*--------------------------------------------------------------------
+ * Look up a tag
+ *   0..255	tag number
+ *   -1		no tag matches
+ *   -2		multiple tags match
+ */
+
+int
+VSL_Name2Tag(const char *name, int l)
+{
+	int i, n;
+
+	if (l == -1)
+		l = strlen(name);
+	n = -1;
+	for (i = 0; i < 256; i++) {
+		if (VSL_tags[i] != NULL &&
+		    !strncasecmp(name, VSL_tags[i], l)) {
+			if (n == -1)
+				n = i;
+			else
+				n = -2;
+		}
+	}
+	return (n);
+}
+
+
 /*--------------------------------------------------------------------*/
 
 static int
@@ -99,8 +126,8 @@ vsl_IX_arg(const struct VSM_data *vd, const char *opt, int arg)
 static int
 vsl_ix_arg(const struct VSM_data *vd, const char *opt, int arg)
 {
-	int i, j, l;
-	const char *b, *e, *p, *q;
+	int i, l;
+	const char *b, *e;
 
 	CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
 	/* If first option is 'i', set all bits for supression */
@@ -120,24 +147,17 @@ vsl_ix_arg(const struct VSM_data *vd, const char *opt, int arg)
 			e++;
 		while (isspace(b[l - 1]))
 			l--;
-		for (i = 0; i < 256; i++) {
-			if (VSL_tags[i] == NULL)
-				continue;
-			p = VSL_tags[i];
-			q = b;
-			for (j = 0; j < l; j++)
-				if (tolower(*q++) != tolower(*p++))
-					break;
-			if (j != l || *p != '\0')
-				continue;
-
+		i = VSL_Name2Tag(b, l);
+		if (i >= 0) {
 			if (arg == 'x')
 				vbit_set(vd->vsl->vbm_supress, i);
 			else
 				vbit_clr(vd->vsl->vbm_supress, i);
-			break;
-		}
-		if (i == 256) {
+		} else if (i == -2) {
+			fprintf(stderr,
+			    "\"%*.*s\" matches multiple tags\n", l, l, b);
+			return (-1);
+		} else {
 			fprintf(stderr,
 			    "Could not match \"%*.*s\" to any tag\n", l, l, b);
 			return (-1);
@@ -148,19 +168,6 @@ vsl_ix_arg(const struct VSM_data *vd, const char *opt, int arg)
 
 /*--------------------------------------------------------------------*/
 
-static int
-name2tag(const char *n)
-{
-	int i;
-
-	for (i = 0; i < 256; i++) {
-		if (VSL_tags[i] == NULL)
-			continue;
-		if (!strcasecmp(n, VSL_tags[i]))
-			return (i);
-	}
-	return (-1);
-}
 
 static int
 vsl_m_arg(const struct VSM_data *vd, const char *opt)
@@ -171,8 +178,6 @@ vsl_m_arg(const struct VSM_data *vd, const char *opt)
 	int erroroffset;
 
 	CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
-	ALLOC_OBJ(m, VSL_RE_MATCH_MAGIC);
-	AN(m);
 
 	if (!strchr(opt, ':')) {
 		fprintf(stderr, "No : found in -o option %s\n", opt);
@@ -185,10 +190,13 @@ vsl_m_arg(const struct VSM_data *vd, const char *opt)
 	*regex = '\0';
 	regex++;
 
-	m->tag = name2tag(o);
-	if (m->tag == -1) {
+	ALLOC_OBJ(m, VSL_RE_MATCH_MAGIC);
+	AN(m);
+	m->tag = VSL_Name2Tag(o, -1);
+	if (m->tag < 0) {
 		fprintf(stderr, "Illegal tag %s specified\n", o);
 		free(o);
+		FREE_OBJ(m);
 		return (-1);
 	}
 	/* Get tag, regex */
@@ -196,6 +204,7 @@ vsl_m_arg(const struct VSM_data *vd, const char *opt)
 	if (m->re == NULL) {
 		fprintf(stderr, "Illegal regex: %s\n", error);
 		free(o);
+		FREE_OBJ(m);
 		return (-1);
 	}
 	vd->vsl->num_matchers++;
diff --git a/lib/libvarnishapi/vsm.c b/lib/libvarnishapi/vsm.c
index efb7592..888a0d7 100644
--- a/lib/libvarnishapi/vsm.c
+++ b/lib/libvarnishapi/vsm.c
@@ -224,7 +224,7 @@ VSM_Open(struct VSM_data *vd, int diag)
 	CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
 	AZ(vd->VSM_head);
 	if (!vd->n_opt)
-		VSM_n_Arg(vd, "");
+		(void)VSM_n_Arg(vd, "");
 	return (vsm_open(vd, diag));
 }
 
@@ -331,7 +331,7 @@ VSM_iter0(struct VSM_data *vd)
 	CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
 	vd->alloc_seq = vd->VSM_head->alloc_seq;
 	while (vd->alloc_seq == 0) {
-		usleep(50000);
+		(void)usleep(50000);
 		vd->alloc_seq = vd->VSM_head->alloc_seq;
 	}
 	CHECK_OBJ_NOTNULL(&vd->VSM_head->head, VSM_CHUNK_MAGIC);
@@ -358,7 +358,7 @@ VSM_itern(const struct VSM_data *vd, struct VSM_chunk **pp)
 
 /*--------------------------------------------------------------------*/
 unsigned
-VSM_Seq(struct VSM_data *vd)
+VSM_Seq(const struct VSM_data *vd)
 {
 
 	CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);



More information about the varnish-commit mailing list