[master] 4607e60 Give ParseArgv() and "int *argc" argument and a ARGV_NOESC flag

Poul-Henning Kamp phk at varnish-cache.org
Wed May 18 10:26:01 CEST 2011


commit 4607e6046ee3f1c429fc14820269a6627c3be48c
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed May 18 08:25:29 2011 +0000

    Give ParseArgv() and "int *argc" argument and a ARGV_NOESC flag

diff --git a/bin/varnishd/cache_hash.c b/bin/varnishd/cache_hash.c
index c25d0ab..14e3841 100644
--- a/bin/varnishd/cache_hash.c
+++ b/bin/varnishd/cache_hash.c
@@ -738,7 +738,7 @@ HSH_config(const char *h_arg)
 	const struct hash_slinger *hp;
 
 	ASSERT_MGT();
-	av = ParseArgv(h_arg, ARGV_COMMA);
+	av = ParseArgv(h_arg, NULL, ARGV_COMMA);
 	AN(av);
 
 	if (av[0] != NULL)
diff --git a/bin/varnishd/cache_vrt.c b/bin/varnishd/cache_vrt.c
index 4cb9e9c..c20e243 100644
--- a/bin/varnishd/cache_vrt.c
+++ b/bin/varnishd/cache_vrt.c
@@ -467,7 +467,7 @@ VRT_ban_string(struct sess *sp, const char *str)
 	int i;
 
 	(void)sp;
-	av = ParseArgv(str, 0);
+	av = ParseArgv(str, NULL, 0);
 	if (av[0] != NULL) {
 		/* XXX: report error how ? */
 		FreeArgv(av);
diff --git a/bin/varnishd/mgt_param.c b/bin/varnishd/mgt_param.c
index 72e5939..7c2ccb1 100644
--- a/bin/varnishd/mgt_param.c
+++ b/bin/varnishd/mgt_param.c
@@ -354,7 +354,7 @@ tweak_listen_address(struct cli *cli, const struct parspec *par,
 		return;
 	}
 
-	av = ParseArgv(arg, ARGV_COMMA);
+	av = ParseArgv(arg, NULL, ARGV_COMMA);
 	if (av == NULL) {
 		cli_out(cli, "Parse error: out of memory");
 		cli_result(cli, CLIS_PARAM);
diff --git a/bin/varnishd/mgt_shmem.c b/bin/varnishd/mgt_shmem.c
index e0a371d..81e5a4e 100644
--- a/bin/varnishd/mgt_shmem.c
+++ b/bin/varnishd/mgt_shmem.c
@@ -206,7 +206,7 @@ mgt_SHM_Init(const char *l_arg)
 	if (l_arg == NULL)
 		l_arg = "";
 
-	av = ParseArgv(l_arg, ARGV_COMMA);
+	av = ParseArgv(l_arg, NULL, ARGV_COMMA);
 	AN(av);
 	if (av[0] != NULL)
 		ARGV_ERR("\t-l ...: %s", av[0]);
diff --git a/bin/varnishd/stevedore.c b/bin/varnishd/stevedore.c
index 4feb189..1a6cab1 100644
--- a/bin/varnishd/stevedore.c
+++ b/bin/varnishd/stevedore.c
@@ -438,9 +438,9 @@ STV_Config(const char *spec)
 	p = strchr(spec, '=');
 	q = strchr(spec, ',');
 	if (p != NULL && (q == NULL || q > p)) {
-		av = ParseArgv(p + 1, ARGV_COMMA);
+		av = ParseArgv(p + 1, NULL, ARGV_COMMA);
 	} else {
-		av = ParseArgv(spec, ARGV_COMMA);
+		av = ParseArgv(spec, NULL, ARGV_COMMA);
 		p = NULL;
 	}
 	AN(av);
diff --git a/bin/varnishd/varnishd.c b/bin/varnishd/varnishd.c
index 32d97e8..5bcea1a 100644
--- a/bin/varnishd/varnishd.c
+++ b/bin/varnishd/varnishd.c
@@ -185,7 +185,7 @@ tackle_warg(const char *argv)
 	char **av;
 	unsigned int u;
 
-	av = ParseArgv(argv, ARGV_COMMA);
+	av = ParseArgv(argv, NULL, ARGV_COMMA);
 	AN(av);
 
 	if (av[0] != NULL)
diff --git a/include/argv.h b/include/argv.h
index d2ece25..0aa7cef 100644
--- a/include/argv.h
+++ b/include/argv.h
@@ -29,8 +29,9 @@
  */
 
 void FreeArgv(char **argv);
-char **ParseArgv(const char *s, int flag);
+char **ParseArgv(const char *s, int *argc, int flag);
 char *BackSlashDecode(const char *s, const char *e);
 int BackSlash(const char *s, char *res);
 #define ARGV_COMMENT	(1 << 0)
 #define ARGV_COMMA	(1 << 1)
+#define ARGV_NOESC	(1 << 2)
diff --git a/lib/libvarnish/argv.c b/lib/libvarnish/argv.c
index b2f4243..d8fefa2 100644
--- a/lib/libvarnish/argv.c
+++ b/lib/libvarnish/argv.c
@@ -131,7 +131,7 @@ static char err_invalid_backslash[] = "Invalid backslash sequence";
 static char err_missing_quote[] = "Missing '\"'";
 
 char **
-ParseArgv(const char *s, int flag)
+ParseArgv(const char *s, int *argc, int flag)
 {
 	char **argv;
 	const char *p;
@@ -162,7 +162,7 @@ ParseArgv(const char *s, int flag)
 			quote = 0;
 		}
 		while (1) {
-			if (*s == '\\') {
+			if (*s == '\\' && !(flag & ARGV_NOESC)) {
 				i = BackSlash(s, NULL);
 				if (i == 0) {
 					argv[0] = err_invalid_backslash;
@@ -195,7 +195,9 @@ ParseArgv(const char *s, int flag)
 		if (*s != '\0')
 			s++;
 	}
-	argv[nargv++] = NULL;
+	argv[nargv] = NULL;
+	if (argc != NULL)
+		*argc = nargv;
 	return (argv);
 }
 
diff --git a/lib/libvarnish/cli_serve.c b/lib/libvarnish/cli_serve.c
index a666654..6306dff 100644
--- a/lib/libvarnish/cli_serve.c
+++ b/lib/libvarnish/cli_serve.c
@@ -323,7 +323,7 @@ cls_vlu(void *priv, const char *p)
 			return (0);
 		REPLACE(cli->cmd, p);
 
-		av = ParseArgv(p, 0);
+		av = ParseArgv(p, NULL, 0);
 		AN(av);
 		if (av[0] != NULL) {
 			i = cls_vlu2(priv, av);
diff --git a/lib/libvarnishapi/vsc.c b/lib/libvarnishapi/vsc.c
index 5b870d5..d47584f 100644
--- a/lib/libvarnishapi/vsc.c
+++ b/lib/libvarnishapi/vsc.c
@@ -123,7 +123,7 @@ vsc_sf_arg(const struct VSM_data *vd, const char *opt)
 			vsc->sf_init = 1;
 	}
 
-	av = ParseArgv(opt, ARGV_COMMA);
+	av = ParseArgv(opt, NULL, ARGV_COMMA);
 	AN(av);
 	if (av[0] != NULL) {
 		vd->diag(vd->priv, "Parse error: %s", av[0]);



More information about the varnish-commit mailing list