[master] d4ad4ecd8 Have -C always remove the workdir.

Poul-Henning Kamp phk at FreeBSD.org
Mon May 25 08:17:07 UTC 2020


commit d4ad4ecd87e4fc6c1cd6e7fa375907a835620178
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon May 25 08:15:47 2020 +0000

    Have -C always remove the workdir.
    
    Previously it only did so if no -n argument was given.
    
    Fixes #3307

diff --git a/bin/varnishd/mgt/mgt_main.c b/bin/varnishd/mgt/mgt_main.c
index 79335bda4..e2fa37ba4 100644
--- a/bin/varnishd/mgt/mgt_main.c
+++ b/bin/varnishd/mgt/mgt_main.c
@@ -71,7 +71,7 @@ int			exit_status = 0;
 struct vsb		*vident;
 struct VSC_mgt		*VSC_C_mgt;
 static int		I_fd = -1;
-static char		*Cn_arg;
+static char		*workdir;
 
 static struct vpf_fh *pfh1 = NULL;
 static struct vpf_fh *pfh2 = NULL;
@@ -250,9 +250,9 @@ mgt_Cflag_atexit(void)
 	/* Only master process */
 	if (getpid() != heritage.mgt_pid)
 		return;
-	(void)rmdir("vmod_cache");
-	(void)unlink("_.pid");
-	(void)rmdir(Cn_arg);
+	VJ_rmdir("vmod_cache");
+	VJ_unlink("_.pid");
+	VJ_rmdir(workdir);
 }
 
 /*--------------------------------------------------------------------*/
@@ -480,7 +480,6 @@ main(int argc, char * const *argv)
 	const char *T_arg = "localhost:0";
 	char *p;
 	struct cli cli[1];
-	char *dirname;
 	char **av;
 	unsigned u;
 	struct sigaction sac;
@@ -747,13 +746,11 @@ main(int argc, char * const *argv)
 				VSB_cat(vsb, "/tmp");
 			VSB_cat(vsb, "/varnishd_C_XXXXXXX");
 			AZ(VSB_finish(vsb));
-			Cn_arg = strdup(VSB_data(vsb));
-			AN(Cn_arg);
+			p = strdup(VSB_data(vsb));
+			AN(p);
 			VSB_destroy(&vsb);
-			AN(mkdtemp(Cn_arg));
-			AZ(chmod(Cn_arg, 0755));
-			AZ(atexit(mgt_Cflag_atexit));
-			n_arg = Cn_arg;
+			AN(mkdtemp(p));
+			n_arg = p;
 		}
 	}
 
@@ -770,7 +767,7 @@ main(int argc, char * const *argv)
 		VJ_master(JAIL_MASTER_LOW);
 	}
 
-	if (VIN_n_Arg(n_arg, &dirname) != 0)
+	if (VIN_n_Arg(n_arg, &workdir) != 0)
 		ARGV_ERR("Invalid instance (-n) name: %s\n", vstrerror(errno));
 
 	if (i_arg == NULL || *i_arg == '\0')
@@ -781,17 +778,20 @@ main(int argc, char * const *argv)
 
 	openlog("varnishd", LOG_PID, LOG_LOCAL0);
 
-	if (VJ_make_workdir(dirname))
+	if (VJ_make_workdir(workdir))
 		ARGV_ERR("Cannot create working directory (%s): %s\n",
-		    dirname, vstrerror(errno));
+		    workdir, vstrerror(errno));
 
 	if (VJ_make_subdir("vmod_cache", "VMOD cache", NULL)) {
 		ARGV_ERR(
 		    "Cannot create vmod directory (%s/vmod_cache): %s\n",
-		    dirname, vstrerror(errno));
+		    workdir, vstrerror(errno));
 	}
 
-	pfh1 = create_pid_file(&pid, "%s/_.pid", dirname);
+	if (C_flag)
+		AZ(atexit(mgt_Cflag_atexit));
+
+	pfh1 = create_pid_file(&pid, "%s/_.pid", workdir);
 
 	if (P_arg)
 		pfh2 = create_pid_file(&pid, "%s", P_arg);
@@ -805,31 +805,29 @@ main(int argc, char * const *argv)
 
 	mgt_vcl_init();
 
-	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);
+	u = 0;
+	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, C_flag);
+		if (C_flag) {
+			if (cli->result != CLIS_OK &&
+			    cli->result != CLIS_TRUNCATED)
+				u = 2;
 			AZ(VSB_finish(cli->sb));
 			fprintf(stderr, "%s\n", VSB_data(cli->sb));
 			VSB_clear(cli->sb);
-		}
-		if (cli->result == CLIS_OK || cli->result == CLIS_TRUNCATED)
-			exit(0);
-		exit(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);
+		} else {
 			cli_check(cli);
-			free(fa->farg);
-			free(fa->src);
-			FREE_OBJ(fa);
 		}
+		free(fa->farg);
+		free(fa->src);
+		FREE_OBJ(fa);
 	}
+	if (C_flag)
+		exit(u);
 
 	if (VTAILQ_EMPTY(&heritage.socks))
 		MAC_Arg(":80\0");	// XXX: extra NUL for FlexeLint
@@ -853,7 +851,7 @@ main(int argc, char * const *argv)
 	AZ(VSB_finish(vident));
 
 	if (S_arg == NULL)
-		S_arg = make_secret(dirname);
+		S_arg = make_secret(workdir);
 	AN(S_arg);
 
 	VPF_Write(pfh1);


More information about the varnish-commit mailing list