[master] c3b5133 Add a VSLQ_Name2Grouping function to parse -g arguments
Martin Blix Grydeland
martin at varnish-cache.org
Thu Jun 13 12:41:23 CEST 2013
commit c3b513398f7a9d324dde667be986bf4a5198c8c7
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date: Thu May 16 13:03:13 2013 +0200
Add a VSLQ_Name2Grouping function to parse -g arguments
diff --git a/bin/varnishlog/varnishlog.c b/bin/varnishlog/varnishlog.c
index f08407c..ee4b2bc 100644
--- a/bin/varnishlog/varnishlog.c
+++ b/bin/varnishlog/varnishlog.c
@@ -80,13 +80,12 @@ main(int argc, char * const *argv)
{
char optchar;
int d_opt = 0;
- char *g_arg = NULL;
struct VSL_data *vsl;
struct VSM_data *vsm;
struct VSL_cursor *c;
struct VSLQ *q;
- enum VSL_grouping_e grouping = VSL_g_vxid;
+ int grouping = VSL_g_vxid;
int i;
vsl = VSL_New();
@@ -101,7 +100,11 @@ main(int argc, char * const *argv)
break;
case 'g':
/* Grouping mode */
- g_arg = optarg;
+ grouping = VSLQ_Name2Grouping(optarg, -1);
+ if (grouping == -2)
+ error(1, "Ambiguous grouping type: %s", optarg);
+ else if (grouping < 0)
+ error(1, "Unknown grouping type: %s", optarg);
break;
case 'n':
/* Instance name */
@@ -112,19 +115,7 @@ main(int argc, char * const *argv)
usage();
}
}
-
- if (g_arg) {
- if (!strcmp(g_arg, "raw"))
- grouping = VSL_g_raw;
- else if (!strcmp(g_arg, "vxid"))
- grouping = VSL_g_vxid;
- else if (!strcmp(g_arg, "request"))
- grouping = VSL_g_request;
- else if (!strcmp(g_arg, "session"))
- grouping = VSL_g_session;
- else
- error(1, "Wrong -g argument: %s", g_arg);
- }
+ assert(grouping >= 0 && grouping <= VSL_g_session);
/* Create cursor */
if (VSM_Open(vsm))
diff --git a/include/vapi/vsl.h b/include/vapi/vsl.h
index 2da4684..62cb69b 100644
--- a/include/vapi/vsl.h
+++ b/include/vapi/vsl.h
@@ -99,6 +99,17 @@ int VSL_Name2Tag(const char *name, int l);
* -2: Multiple tags match substring
*/
+int VSLQ_Name2Grouping(const char *name, int l);
+ /*
+ * Convert string to grouping (= enum VSL_grouping_e)
+ *
+ * Return values:
+ * >=0: Grouping value
+ * -1: No grouping type matches
+ * -2: Multiple grouping types match substring
+ */
+
+
struct VSL_data *VSL_New(void);
int VSL_Arg(struct VSL_data *vsl, int opt, const char *arg);
/*
diff --git a/lib/libvarnishapi/libvarnishapi.map b/lib/libvarnishapi/libvarnishapi.map
index df2e644..1e8c513 100644
--- a/lib/libvarnishapi/libvarnishapi.map
+++ b/lib/libvarnishapi/libvarnishapi.map
@@ -110,5 +110,6 @@ LIBVARNISHAPI_1.3 {
VSLQ_Delete;
VSLQ_Dispatch;
VSLQ_Flush;
+ VSLQ_Name2Grouping;
# Variables:
} LIBVARNISHAPI_1.0;
diff --git a/lib/libvarnishapi/vsl_arg.c b/lib/libvarnishapi/vsl_arg.c
index fcbc528..c0c964a 100644
--- a/lib/libvarnishapi/vsl_arg.c
+++ b/lib/libvarnishapi/vsl_arg.c
@@ -83,6 +83,36 @@ VSL_Name2Tag(const char *name, int l)
return (n);
}
+static const char *vsl_grouping[] = {
+ [VSL_g_raw] = "raw",
+ [VSL_g_vxid] = "vxid",
+ [VSL_g_request] = "request",
+ [VSL_g_session] = "session",
+};
+
+int
+VSLQ_Name2Grouping(const char *name, int l)
+{
+ int i, n;
+
+ if (l == -1)
+ l = strlen(name);
+ n = -1;
+ for (i = 0; i < sizeof vsl_grouping / sizeof vsl_grouping[0]; i++) {
+ if (!strncasecmp(name, vsl_grouping[i], l)) {
+ if (strlen(vsl_grouping[i]) == l) {
+ /* Exact match */
+ return (i);
+ }
+ if (n == -1)
+ n = i;
+ else
+ n = -2;
+ }
+ }
+ return (n);
+}
+
static int
vsl_ix_arg(struct VSL_data *vsl, int opt, const char *arg)
{
More information about the varnish-commit
mailing list