[master] d306f91 Rework the -f/-b logic so we can take multiple -f arguments.

Poul-Henning Kamp phk at FreeBSD.org
Sat Jan 14 22:24:05 CET 2017


commit d306f91ca2128361f64b14c7c4a7de6f08a1f9b9
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Sat Jan 14 21:20:13 2017 +0000

    Rework the -f/-b logic so we can take multiple -f arguments.
    
    If you give multiple -f arguments, the resulting VCL's will be
    "boot0", "boot1", ... "boot668", "boot"
    
    And the last one will be the active one.
    
    The plan is to also allow both specification of an (optional) label and
    which VCL is to be the active one, but I want to think about if we should
    shoehorn that into -f or use a different option letter.

diff --git a/bin/varnishd/mgt/mgt.h b/bin/varnishd/mgt/mgt.h
index d5a1381..2c88cb4 100644
--- a/bin/varnishd/mgt/mgt.h
+++ b/bin/varnishd/mgt/mgt.h
@@ -182,8 +182,8 @@ char *mgt_VccCompile(struct cli *, struct vclprog *, const char *vclname,
     const char *vclsrc, const char *vclsrcfile, int C_flag);
 
 void mgt_vcl_init(void);
-void mgt_vcl_startup(struct cli *, const char *b_arg, const char *f_arg,
-    const char *vclsrc, int Cflag);
+void mgt_vcl_startup(struct cli *, const char *vclsrc, const char *origin,
+    const char *vclname, int Cflag);
 int mgt_push_vcls_and_start(struct cli *, unsigned *status, char **p);
 void mgt_vcl_export_labels(struct vcc *);
 int mgt_has_vcl(void);
diff --git a/bin/varnishd/mgt/mgt_main.c b/bin/varnishd/mgt/mgt_main.c
index e0997ce..2d1f6c9 100644
--- a/bin/varnishd/mgt/mgt_main.c
+++ b/bin/varnishd/mgt/mgt_main.c
@@ -52,6 +52,7 @@
 #include "vin.h"
 #include "vpf.h"
 #include "vrnd.h"
+#include "vsb.h"
 #include "vsha256.h"
 #include "vsub.h"
 #include "vtim.h"
@@ -430,15 +431,23 @@ mgt_uptime(const struct vev *e, int what)
 
 /*--------------------------------------------------------------------*/
 
+struct f_arg {
+	unsigned		magic;
+#define F_ARG_MAGIC		0x840649a8
+	char			*farg;
+	char			*src;
+	VTAILQ_ENTRY(f_arg)	list;
+};
+
 int
 main(int argc, char * const *argv)
 {
 	int o, eric_fd = -1;
 	unsigned C_flag = 0;
+	unsigned f_flag = 0;
 	unsigned F_flag = 0;
 	unsigned V_flag = 0;
 	const char *b_arg = NULL;
-	const char *f_arg = NULL;
 	const char *i_arg = NULL;
 	const char *j_arg = NULL;
 	const char *h_arg = "critbit";
@@ -451,7 +460,7 @@ main(int argc, char * const *argv)
 	const char *x_arg = NULL;
 	int s_arg_given = 0;
 	const char *T_arg = "localhost:0";
-	char *p, *vcl = NULL;
+	char *p;
 	struct cli cli[1];
 	char *dirname;
 	char **av;
@@ -460,6 +469,9 @@ main(int argc, char * const *argv)
 	unsigned u;
 	struct sigaction sac;
 	struct vev *e;
+	struct f_arg *fa;
+	struct vsb *vsb;
+	VTAILQ_HEAD(,f_arg) f_args = VTAILQ_HEAD_INITIALIZER(f_args);
 
 	setbuf(stdout, NULL);
 	setbuf(stderr, NULL);
@@ -486,7 +498,7 @@ main(int argc, char * const *argv)
 			d_flag++;
 			break;
 		case 'f':
-			f_arg = optarg;
+			f_flag = 1;
 			break;
 		case 'F':
 			F_flag = 1;
@@ -521,13 +533,13 @@ main(int argc, char * const *argv)
 		exit(0);
 	}
 
-	if (b_arg != NULL && f_arg != NULL)
+	if (b_arg != NULL && f_flag)
 		ARGV_ERR("Only one of -b or -f can be specified\n");
 
 	if (d_flag && F_flag)
 		ARGV_ERR("Only one of -d or -F can be specified\n");
 
-	if (C_flag && b_arg == NULL && (f_arg == NULL || *f_arg == '\0'))
+	if (C_flag && b_arg == NULL && !f_flag)
 		ARGV_ERR("-C needs either -b <backend> or -f <vcl_file>\n");
 
 	if (d_flag && C_flag)
@@ -536,12 +548,9 @@ main(int argc, char * const *argv)
 	if (F_flag && C_flag)
 		ARGV_ERR("-F makes no sense with -C\n");
 
-	if (!d_flag && b_arg == NULL && f_arg == NULL)
+	if (!d_flag && b_arg == NULL && !f_flag)
 		ARGV_ERR("Neither -b nor -f given. (use -f '' to override)\n");
 
-	if (f_arg != NULL && *f_arg == '\0')
-		f_arg = NULL;
-
 	/*
 	 * Start out by closing all unwanted file descriptors we might
 	 * have inherited from sloppy process control daemons.
@@ -582,10 +591,8 @@ main(int argc, char * const *argv)
 	optreset = 1;
 	while ((o = getopt(argc, argv, opt_spec)) != -1) {
 		switch (o) {
-		case 'b':
 		case 'C':
 		case 'd':
-		case 'f':
 		case 'F':
 		case 'j':
 		case 'V':
@@ -595,6 +602,34 @@ main(int argc, char * const *argv)
 		case 'a':
 			MAC_Arg(optarg);
 			break;
+		case 'b':
+			ALLOC_OBJ(fa, F_ARG_MAGIC);
+			AN(fa);
+			REPLACE(fa->farg, "<-b argument>");
+			vsb = VSB_new_auto();
+			AN(vsb);
+			VSB_printf(vsb, "vcl 4.0;\n");
+			VSB_printf(vsb, "backend default {\n");
+			VSB_printf(vsb, "    .host = \"%s\";\n", optarg);
+			VSB_printf(vsb, "}\n");
+			AZ(VSB_finish(vsb));
+			fa->src = strdup(VSB_data(vsb));
+			AN(fa->src);
+			VSB_destroy(&vsb);
+			VTAILQ_INSERT_TAIL(&f_args, fa, list);
+			break;
+		case 'f':
+			if (*optarg == '\0')
+				break;
+			ALLOC_OBJ(fa, F_ARG_MAGIC);
+			AN(fa);
+			REPLACE(fa->farg, optarg);
+			fa->src = VFIL_readfile(NULL, fa->farg, NULL);
+			if (fa->src == NULL)
+				ARGV_ERR("Cannot read -f file (%s): %s\n",
+				    fa->farg, strerror(errno));
+			VTAILQ_INSERT_TAIL(&f_args, fa, list);
+			break;
 		case 'h':
 			h_arg = optarg;
 			break;
@@ -679,7 +714,6 @@ main(int argc, char * const *argv)
 	}
 
 	assert(d_flag == 0 || F_flag == 0);
-	assert(b_arg == NULL || f_arg == NULL);
 
 	if (S_arg != NULL && !strcmp(S_arg, "none")) {
 		fprintf(stderr,
@@ -694,13 +728,6 @@ main(int argc, char * const *argv)
 		VJ_master(JAIL_MASTER_LOW);
 	}
 
-	if (f_arg != NULL) {
-		vcl = VFIL_readfile(NULL, f_arg, NULL);
-		if (vcl == NULL)
-			ARGV_ERR("Cannot read -f file (%s): %s\n",
-			    f_arg, strerror(errno));
-	}
-
 	if (VIN_N_Arg(n_arg, &heritage.name, &dirname, NULL) != 0)
 		ARGV_ERR("Invalid instance (-n) name: %s\n", strerror(errno));
 
@@ -729,19 +756,29 @@ main(int argc, char * const *argv)
 
 	mgt_vcl_init();
 
-	if (b_arg != NULL || f_arg != NULL) {
-		mgt_vcl_startup(cli, b_arg, f_arg, vcl, C_flag);
-		if (C_flag) {
-			if (Cn_arg == n_arg)
-				(void)rmdir(Cn_arg);
+	if (C_flag) {
+		VTAILQ_FOREACH(fa, &f_args, list) {
+			mgt_vcl_startup(cli, fa->src,
+			    VTAILQ_NEXT(fa, list) == NULL ? "boot" : NULL,
+			    fa->farg, 1);
 			AZ(VSB_finish(cli->sb));
 			fprintf(stderr, "%s\n", VSB_data(cli->sb));
-			exit(cli->result == CLIS_OK ? 0 : 2);
+			VSB_clear(cli->sb);
+		}
+		(void)rmdir(Cn_arg);
+		exit(cli->result == CLIS_OK ? 0 : 2);
+	} else {
+		while(!VTAILQ_EMPTY(&f_args)) {
+			fa = VTAILQ_FIRST(&f_args);
+			VTAILQ_REMOVE(&f_args, fa, list);
+			mgt_vcl_startup(cli, fa->src,
+			    VTAILQ_EMPTY(&f_args) ? "boot" : NULL,
+			    fa->farg, 0);
+			cli_check(cli);
+			free(fa->src);
+			FREE_OBJ(fa);
 		}
-		cli_check(cli);
-		free(vcl);
 	}
-	AZ(C_flag);
 
 	if (VTAILQ_EMPTY(&heritage.socks))
 		MAC_Arg(":80");
diff --git a/bin/varnishd/mgt/mgt_vcl.c b/bin/varnishd/mgt/mgt_vcl.c
index c70c05d..9d22352 100644
--- a/bin/varnishd/mgt/mgt_vcl.c
+++ b/bin/varnishd/mgt/mgt_vcl.c
@@ -369,25 +369,20 @@ mgt_new_vcl(struct cli *cli, const char *vclname, const char *vclsrc,
 /*--------------------------------------------------------------------*/
 
 void
-mgt_vcl_startup(struct cli *cli, const char *b_arg, const char *f_arg,
-    const char *vclsrc, int C_flag)
+mgt_vcl_startup(struct cli *cli, const char *vclsrc, const char *vclname,
+    const char *origin, int C_flag)
 {
-	char buf[BUFSIZ];
+	char buf[20];
+	static int n = 0;
 
-	if (b_arg == NULL) {
-		AN(vclsrc);
-		AN(f_arg);
-		mgt_new_vcl(cli, "boot", vclsrc, f_arg, NULL, C_flag);
-		return;
+	AN(vclsrc);
+	AN(origin);
+	if (vclname == NULL) {
+		bprintf(buf, "boot%d", n++);
+		vclname = buf;
 	}
-
-	AZ(vclsrc);
-	bprintf(buf,
-	    "vcl 4.0;\n"
-	    "backend default {\n"
-	    "    .host = \"%s\";\n"
-	    "}\n", b_arg);
-	mgt_new_vcl(cli, "boot", buf, "<-b argument>", NULL, C_flag);
+	mgt_new_vcl(cli, vclname, vclsrc, origin, NULL, C_flag);
+	active_vcl = mcf_vcl_byname(vclname);
 }
 
 /*--------------------------------------------------------------------*/



More information about the varnish-commit mailing list