[5.2] 8cedf8d Remove the global VUT symbol

PÃ¥l Hermunn Johansen hermunn at varnish-software.com
Fri Sep 15 11:17:27 UTC 2017


commit 8cedf8d0686da3bbe4aa7ac188d8fd8091e659c4
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date:   Tue Sep 5 11:26:09 2017 +0200

    Remove the global VUT symbol

diff --git a/bin/varnishhist/varnishhist.c b/bin/varnishhist/varnishhist.c
index fe2df7a..7054b6d 100644
--- a/bin/varnishhist/varnishhist.c
+++ b/bin/varnishhist/varnishhist.c
@@ -57,6 +57,8 @@
 #define HIST_N 2000		/* how far back we remember */
 #define HIST_RES 100		/* bucket resolution */
 
+static struct VUT *vut;
+
 static int hist_low;
 static int hist_high;
 static int hist_range;
@@ -368,7 +370,7 @@ accumulate(struct VSL_data *vsl, struct VSL_transaction * const pt[],
 static int __match_proto__(VUT_cb_f)
 sighup(struct VUT *v)
 {
-	assert(v == &VUT);
+	assert(v == vut);
 	quit = 1;
 	return (1);
 }
@@ -470,7 +472,7 @@ usage(int status)
 {
 	const char **opt;
 
-	fprintf(stderr, "Usage: %s <options>\n\n", VUT.progname);
+	fprintf(stderr, "Usage: %s <options>\n\n", vut->progname);
 	fprintf(stderr, "Options:\n");
 	for (opt = vopt_spec.vopt_usage; *opt != NULL; opt += 2)
 		fprintf(stderr, " %-25s %s\n", *opt, *(opt + 1));
@@ -488,7 +490,7 @@ profile_error(const char *s)
 static void
 vut_sighandler(int sig)
 {
-	VUT_Signaled(&VUT, sig);
+	VUT_Signaled(vut, sig);
 }
 
 int
@@ -502,7 +504,8 @@ main(int argc, char **argv)
 	struct profile cli_p = {0};
 	cli_p.name = 0;
 
-	VUT_InitProg(argc, argv, &vopt_spec);
+	vut = VUT_InitProg(argc, argv, &vopt_spec);
+	AN(vut);
 	AZ(pthread_cond_init(&timebend_cv, NULL));
 
 	while ((i = getopt(argc, argv, vopt_spec.vopt_optstring)) != -1) {
@@ -565,7 +568,7 @@ main(int argc, char **argv)
 				    " (invalid factor '%s')", optarg);
 			break;
 		default:
-			if (!VUT_Arg(i, optarg))
+			if (!VUT_Arg(vut, i, optarg))
 				usage(1);
 		}
 	}
@@ -574,11 +577,11 @@ main(int argc, char **argv)
 		usage(1);
 
 	/* Check for valid grouping mode */
-	assert(VUT.g_arg < VSL_g__MAX);
-	if (VUT.g_arg != VSL_g_vxid && VUT.g_arg != VSL_g_request)
+	assert(vut->g_arg < VSL_g__MAX);
+	if (vut->g_arg != VSL_g_vxid && vut->g_arg != VSL_g_request)
 		VUT_Error(1, "Invalid grouping mode: %s"
 		    " (only vxid and request are supported)",
-		    VSLQ_grouping[VUT.g_arg]);
+		    VSLQ_grouping[vut->g_arg]);
 
 	if (profile) {
 		for (active_profile = profiles; active_profile->name;
@@ -593,7 +596,7 @@ main(int argc, char **argv)
 
 	assert(active_profile->VSL_arg == 'b' ||
 	    active_profile->VSL_arg == 'c');
-	assert(VUT_Arg(active_profile->VSL_arg, NULL));
+	assert(VUT_Arg(vut, active_profile->VSL_arg, NULL));
 	match_tag = active_profile->tag;
 	fnum = active_profile->field;
 	hist_low = active_profile->hist_low;
@@ -616,16 +619,16 @@ main(int argc, char **argv)
 	log_ten = log(10.0);
 
 	VUT_Signal(vut_sighandler);
-	VUT_Setup();
-	ident = VSM_Dup(VUT.vsm, "Arg", "-i");
+	VUT_Setup(vut);
+	ident = VSM_Dup(vut->vsm, "Arg", "-i");
 	if (pthread_create(&thr, NULL, do_curses, NULL) != 0)
 		VUT_Error(1, "pthread_create(): %s", strerror(errno));
-	VUT.dispatch_f = accumulate;
-	VUT.dispatch_priv = NULL;
-	VUT.sighup_f = sighup;
-	VUT_Main();
+	vut->dispatch_f = accumulate;
+	vut->dispatch_priv = NULL;
+	vut->sighup_f = sighup;
+	VUT_Main(vut);
 	end_of_file = 1;
 	AZ(pthread_join(thr, NULL));
-	VUT_Fini();
+	VUT_Fini(&vut);
 	exit(0);
 }
diff --git a/bin/varnishlog/varnishlog.c b/bin/varnishlog/varnishlog.c
index edabf63..6f6772b 100644
--- a/bin/varnishlog/varnishlog.c
+++ b/bin/varnishlog/varnishlog.c
@@ -50,6 +50,8 @@
 #include "vut.h"
 #include "miniobj.h"
 
+static struct VUT *vut;
+
 static struct log {
 	/* Options */
 	int		a_opt;
@@ -64,7 +66,7 @@ static void __attribute__((__noreturn__))
 usage(int status)
 {
 	const char **opt;
-	fprintf(stderr, "Usage: %s <options>\n\n", VUT.progname);
+	fprintf(stderr, "Usage: %s <options>\n\n", vut->progname);
 	fprintf(stderr, "Options:\n");
 	for (opt = vopt_spec.vopt_usage; *opt != NULL; opt += 2)
 		fprintf(stderr, " %-25s %s\n", *opt, *(opt + 1));
@@ -79,18 +81,18 @@ openout(int append)
 	if (LOG.A_opt)
 		LOG.fo = fopen(LOG.w_arg, append ? "a" : "w");
 	else
-		LOG.fo = VSL_WriteOpen(VUT.vsl, LOG.w_arg, append, 0);
+		LOG.fo = VSL_WriteOpen(vut->vsl, LOG.w_arg, append, 0);
 	if (LOG.fo == NULL)
 		VUT_Error(2, "Cannot open output file (%s)",
-		    LOG.A_opt ? strerror(errno) : VSL_Error(VUT.vsl));
-	VUT.dispatch_priv = LOG.fo;
+		    LOG.A_opt ? strerror(errno) : VSL_Error(vut->vsl));
+	vut->dispatch_priv = LOG.fo;
 }
 
 static int __match_proto__(VUT_cb_f)
 rotateout(struct VUT *v)
 {
 
-	assert(v == &VUT);
+	assert(v == vut);
 	AN(LOG.w_arg);
 	AN(LOG.fo);
 	fclose(LOG.fo);
@@ -103,8 +105,7 @@ static int __match_proto__(VUT_cb_f)
 flushout(struct VUT *v)
 {
 
-	if (v != NULL)
-		assert(v == &VUT);
+	assert(v == vut);
 	AN(LOG.fo);
 	if (fflush(LOG.fo))
 		return (-5);
@@ -114,14 +115,15 @@ flushout(struct VUT *v)
 static int __match_proto__(VUT_cb_f)
 sighup(struct VUT *v)
 {
-	assert(v == &VUT);
+	assert(v == vut);
 	return (1);
 }
 
 static void
 vut_sighandler(int sig)
 {
-	VUT_Signaled(&VUT, sig);
+	AN(vut);
+	VUT_Signaled(vut, sig);
 }
 
 int
@@ -129,7 +131,8 @@ main(int argc, char * const *argv)
 {
 	int opt;
 
-	VUT_InitProg(argc, argv, &vopt_spec);
+	vut = VUT_InitProg(argc, argv, &vopt_spec);
+	AN(vut);
 	memset(&LOG, 0, sizeof LOG);
 
 	while ((opt = getopt(argc, argv, vopt_spec.vopt_optstring)) != -1) {
@@ -150,7 +153,7 @@ main(int argc, char * const *argv)
 			REPLACE(LOG.w_arg, optarg);
 			break;
 		default:
-			if (!VUT_Arg(opt, optarg))
+			if (!VUT_Arg(vut, opt, optarg))
 				usage(1);
 		}
 	}
@@ -158,28 +161,28 @@ main(int argc, char * const *argv)
 	if (optind != argc)
 		usage(1);
 
-	if (VUT.D_opt && !LOG.w_arg)
+	if (vut->D_opt && !LOG.w_arg)
 		VUT_Error(1, "Missing -w option");
 
 	/* Setup output */
 	if (LOG.A_opt || !LOG.w_arg)
-		VUT.dispatch_f = VSL_PrintTransactions;
+		vut->dispatch_f = VSL_PrintTransactions;
 	else
-		VUT.dispatch_f = VSL_WriteTransactions;
-	VUT.sighup_f = sighup;
+		vut->dispatch_f = VSL_WriteTransactions;
+	vut->sighup_f = sighup;
 	if (LOG.w_arg) {
 		openout(LOG.a_opt);
 		AN(LOG.fo);
-		if (VUT.D_opt)
-			VUT.sighup_f = rotateout;
+		if (vut->D_opt)
+			vut->sighup_f = rotateout;
 	} else
 		LOG.fo = stdout;
-	VUT.idle_f = flushout;
+	vut->idle_f = flushout;
 
 	VUT_Signal(vut_sighandler);
-	VUT_Setup();
-	VUT_Main();
-	VUT_Fini();
+	VUT_Setup(vut);
+	VUT_Main(vut);
+	VUT_Fini(&vut);
 
 	(void)flushout(NULL);
 
diff --git a/bin/varnishncsa/varnishncsa.c b/bin/varnishncsa/varnishncsa.c
index 415691e..22391d1 100644
--- a/bin/varnishncsa/varnishncsa.c
+++ b/bin/varnishncsa/varnishncsa.c
@@ -70,6 +70,8 @@
 #define TIME_FMT "[%d/%b/%Y:%T %z]"
 #define FORMAT "%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\""
 
+static struct VUT *vut;
+
 struct format;
 
 enum e_frag {
@@ -164,7 +166,7 @@ usage(int status)
 {
 	const char **opt;
 
-	fprintf(stderr, "Usage: %s <options>\n\n", VUT.progname);
+	fprintf(stderr, "Usage: %s <options>\n\n", vut->progname);
 	fprintf(stderr, "Options:\n");
 	for (opt = vopt_spec.vopt_usage; *opt != NULL; opt += 2)
 		fprintf(stderr, " %-25s %s\n", *opt, *(opt + 1));
@@ -186,7 +188,7 @@ static int __match_proto__(VUT_cb_f)
 rotateout(struct VUT *v)
 {
 
-	assert(v == &VUT);
+	assert(v == vut);
 	AN(CTX.w_arg);
 	AN(CTX.fo);
 	fclose(CTX.fo);
@@ -199,7 +201,7 @@ static int __match_proto__(VUT_cb_f)
 flushout(struct VUT *v)
 {
 
-	assert(v == &VUT);
+	assert(v == vut);
 	AN(CTX.fo);
 	if (fflush(CTX.fo))
 		return (-5);
@@ -1108,14 +1110,15 @@ dispatch_f(struct VSL_data *vsl, struct VSL_transaction * const pt[],
 static int __match_proto__(VUT_cb_f)
 sighup(struct VUT *v)
 {
-	assert(v == &VUT);
+	assert(v == vut);
 	return (1);
 }
 
 static void
 vut_sighandler(int sig)
 {
-	VUT_Signaled(&VUT, sig);
+	AN(vut);
+	VUT_Signaled(vut, sig);
 }
 
 static char *
@@ -1152,7 +1155,8 @@ main(int argc, char * const *argv)
 	signed char opt;
 	char *format = NULL;
 
-	VUT_InitProg(argc, argv, &vopt_spec);
+	vut = VUT_InitProg(argc, argv, &vopt_spec);
+	AN(vut);
 	memset(&CTX, 0, sizeof CTX);
 	VTAILQ_INIT(&CTX.format);
 	VTAILQ_INIT(&CTX.watch_vcl_log);
@@ -1200,7 +1204,7 @@ main(int argc, char * const *argv)
 			REPLACE(CTX.w_arg, optarg);
 			break;
 		default:
-			if (!VUT_Arg(opt, optarg))
+			if (!VUT_Arg(vut, opt, optarg))
 				usage(1);
 		}
 	}
@@ -1211,14 +1215,14 @@ main(int argc, char * const *argv)
 	if (optind != argc)
 		usage(1);
 
-	if (VUT.D_opt && !CTX.w_arg)
+	if (vut->D_opt && !CTX.w_arg)
 		VUT_Error(1, "Missing -w option");
 
 	/* Check for valid grouping mode */
-	assert(VUT.g_arg < VSL_g__MAX);
-	if (VUT.g_arg != VSL_g_vxid && VUT.g_arg != VSL_g_request)
+	assert(vut->g_arg < VSL_g__MAX);
+	if (vut->g_arg != VSL_g_vxid && vut->g_arg != VSL_g_request)
 		VUT_Error(1, "Invalid grouping mode: %s",
-		    VSLQ_grouping[VUT.g_arg]);
+		    VSLQ_grouping[vut->g_arg]);
 
 	/* Prepare output format */
 	parse_format(format);
@@ -1226,22 +1230,22 @@ main(int argc, char * const *argv)
 	format = NULL;
 
 	/* Setup output */
-	VUT.dispatch_f = dispatch_f;
-	VUT.dispatch_priv = NULL;
-	VUT.sighup_f = sighup;
+	vut->dispatch_f = dispatch_f;
+	vut->dispatch_priv = NULL;
+	vut->sighup_f = sighup;
 	if (CTX.w_arg) {
 		openout(CTX.a_opt);
 		AN(CTX.fo);
-		if (VUT.D_opt)
-			VUT.sighup_f = rotateout;
+		if (vut->D_opt)
+			vut->sighup_f = rotateout;
 	} else
 		CTX.fo = stdout;
-	VUT.idle_f = flushout;
+	vut->idle_f = flushout;
 
 	VUT_Signal(vut_sighandler);
-	VUT_Setup();
-	VUT_Main();
-	VUT_Fini();
+	VUT_Setup(vut);
+	VUT_Main(vut);
+	VUT_Fini(&vut);
 
 	exit(0);
 }
diff --git a/bin/varnishstat/varnishstat.c b/bin/varnishstat/varnishstat.c
index a13ce61..7d02906 100644
--- a/bin/varnishstat/varnishstat.c
+++ b/bin/varnishstat/varnishstat.c
@@ -50,6 +50,8 @@
 
 #include "varnishstat.h"
 
+static struct VUT *vut;
+
 /*--------------------------------------------------------------------*/
 
 static int __match_proto__(VSC_iter_f)
@@ -242,7 +244,7 @@ usage(int status)
 {
 	const char **opt;
 
-	fprintf(stderr, "Usage: %s <options>\n\n", VUT.progname);
+	fprintf(stderr, "Usage: %s <options>\n\n", vut->progname);
 	fprintf(stderr, "Options:\n");
 	for (opt = vopt_spec.vopt_usage; *opt != NULL; opt +=2)
 		fprintf(stderr, " %-25s %s\n", *opt, *(opt + 1));
@@ -258,7 +260,8 @@ main(int argc, char * const *argv)
 	int i;
 	struct vsc *vsc;
 
-	VUT_InitProg(argc, argv, &vopt_spec);
+	vut = VUT_InitProg(argc, argv, &vopt_spec);
+	AN(vut);
 	vd = VSM_New();
 	AN(vd);
 	vsc = VSC_New();
@@ -285,7 +288,7 @@ main(int argc, char * const *argv)
 			AN(VSC_Arg(vsc, opt, optarg));
 			break;
 		case 'V':
-			AN(VUT_Arg(opt, optarg));
+			AN(VUT_Arg(vut, opt, optarg));
 			break;
 		default:
 			i = VSM_Arg(vd, opt, optarg);
diff --git a/bin/varnishtop/varnishtop.c b/bin/varnishtop/varnishtop.c
index 85d8dab..09d939f 100644
--- a/bin/varnishtop/varnishtop.c
+++ b/bin/varnishtop/varnishtop.c
@@ -60,6 +60,8 @@
 #define AC(x) x
 #endif
 
+static struct VUT *vut;
+
 struct top {
 	uint8_t			tag;
 	const char		*rec_data;
@@ -180,7 +182,7 @@ accumulate(struct VSL_data *vsl, struct VSL_transaction * const pt[],
 static int __match_proto__(VUT_cb_f)
 sighup(struct VUT *v)
 {
-	assert(v == &VUT);
+	assert(v == vut);
 	quit = 1;
 	return (1);
 }
@@ -188,7 +190,8 @@ sighup(struct VUT *v)
 static void
 vut_sighandler(int sig)
 {
-	VUT_Signaled(&VUT, sig);
+	AN(vut);
+	VUT_Signaled(vut, sig);
 }
 
 static void
@@ -324,7 +327,7 @@ usage(int status)
 {
 	const char **opt;
 
-	fprintf(stderr, "Usage: %s <options>\n\n", VUT.progname);
+	fprintf(stderr, "Usage: %s <options>\n\n", vut->progname);
 	fprintf(stderr, "Options:\n");
 	for (opt = vopt_spec.vopt_usage; *opt != NULL; opt +=2)
 		fprintf(stderr, " %-25s %s\n", *opt, *(opt + 1));
@@ -337,12 +340,13 @@ main(int argc, char **argv)
 	int o, once = 0;
 	pthread_t thr;
 
-	VUT_InitProg(argc, argv, &vopt_spec);
+	vut = VUT_InitProg(argc, argv, &vopt_spec);
+	AN(vut);
 
 	while ((o = getopt(argc, argv, vopt_spec.vopt_optstring)) != -1) {
 		switch (o) {
 		case '1':
-			AN(VUT_Arg('d', NULL));
+			AN(VUT_Arg(vut, 'd', NULL));
 			once = 1;
 			break;
 		case 'f':
@@ -361,7 +365,7 @@ main(int argc, char **argv)
 			}
 			break;
 		default:
-			if (!VUT_Arg(o, optarg))
+			if (!VUT_Arg(vut, o, optarg))
 				usage(1);
 		}
 	}
@@ -370,8 +374,8 @@ main(int argc, char **argv)
 		usage(1);
 
 	VUT_Signal(vut_sighandler);
-	VUT_Setup();
-	ident = VSM_Dup(VUT.vsm, "Arg", "-i");
+	VUT_Setup(vut);
+	ident = VSM_Dup(vut->vsm, "Arg", "-i");
 	if (!once) {
 		if (pthread_create(&thr, NULL, do_curses, NULL) != 0) {
 			fprintf(stderr, "pthread_create(): %s\n",
@@ -379,15 +383,15 @@ main(int argc, char **argv)
 			exit(1);
 		}
 	}
-	VUT.dispatch_f = accumulate;
-	VUT.dispatch_priv = NULL;
-	VUT.sighup_f = sighup;
-	VUT_Main();
+	vut->dispatch_f = accumulate;
+	vut->dispatch_priv = NULL;
+	vut->sighup_f = sighup;
+	VUT_Main(vut);
 	end_of_file = 1;
 	if (once)
 		dump();
 	else
 		pthread_join(thr, NULL);
-	VUT_Fini();
+	VUT_Fini(&vut);
 	exit(0);
 }
diff --git a/include/vut.h b/include/vut.h
index 1fbe755..2e3a3c7 100644
--- a/include/vut.h
+++ b/include/vut.h
@@ -64,22 +64,20 @@ struct VUT {
 	void		*dispatch_priv;
 };
 
-extern struct VUT VUT;
-
 //lint -sem(VUT_Error, r_no)
 void VUT_Error(int status, const char *fmt, ...)
 	__v_printflike(2, 3) __attribute__((__noreturn__));
 
-int VUT_Arg(int opt, const char *arg);
+int VUT_Arg(struct VUT *, int opt, const char *arg);
 
 #define VUT_InitProg(argc, argv, spec) VUT_Init(argv[0], argc, argv, spec)
 
-void VUT_Init(const char *progname, int argc, char * const *argv,
+struct VUT * VUT_Init(const char *progname, int argc, char * const *argv,
     const struct vopt_spec *);
 
 void VUT_Signal(VUT_sighandler_f);
 void VUT_Signaled(struct VUT *, int);
 
-void VUT_Setup(void);
-int  VUT_Main(void);
-void VUT_Fini(void);
+void VUT_Setup(struct VUT *);
+int  VUT_Main(struct VUT *);
+void VUT_Fini(struct VUT **);
diff --git a/lib/libvarnishapi/libvarnishapi.map b/lib/libvarnishapi/libvarnishapi.map
index 4f23dc5..7454f4f 100644
--- a/lib/libvarnishapi/libvarnishapi.map
+++ b/lib/libvarnishapi/libvarnishapi.map
@@ -127,7 +127,6 @@ LIBVARNISHAPI_2.0 {
 		VTIM_timeval;
 
 	# vut.c
-		VUT;
 		VUT_Arg;
 		VUT_Error;
 		VUT_Fini;
diff --git a/lib/libvarnishapi/vut.c b/lib/libvarnishapi/vut.c
index 5bd24d4..6103e9c 100644
--- a/lib/libvarnishapi/vut.c
+++ b/lib/libvarnishapi/vut.c
@@ -56,8 +56,6 @@
 
 #include "vapi/voptget.h"
 
-struct VUT VUT;
-
 static int vut_synopsis(const struct vopt_spec *);
 static int vut_options(const struct vopt_spec *);
 
@@ -86,16 +84,18 @@ static int __match_proto__(VSLQ_dispatch_f)
 vut_dispatch(struct VSL_data *vsl, struct VSL_transaction * const trans[],
     void *priv)
 {
+	struct VUT *vut;
 	int i;
 
-	(void)priv;
-	if (VUT.k_arg == 0)
+	vut = priv;
+	AN(vut);
+	if (vut->k_arg == 0)
 		return (-1);	/* End of file */
-	AN(VUT.dispatch_f);
-	i = VUT.dispatch_f(vsl, trans, VUT.dispatch_priv);
-	if (VUT.k_arg > 0)
-		VUT.k_arg--;
-	if (i >= 0 && VUT.k_arg == 0)
+	AN(vut->dispatch_f);
+	i = vut->dispatch_f(vsl, trans, vut->dispatch_priv);
+	if (vut->k_arg > 0)
+		vut->k_arg--;
+	if (i >= 0 && vut->k_arg == 0)
 		return (-1);	/* End of file */
 	return (i);
 }
@@ -116,7 +116,7 @@ VUT_Error(int status, const char *fmt, ...)
 }
 
 int
-VUT_Arg(int opt, const char *arg)
+VUT_Arg(struct VUT *vut, int opt, const char *arg)
 {
 	int i;
 	char *p;
@@ -124,86 +124,90 @@ VUT_Arg(int opt, const char *arg)
 	switch (opt) {
 	case 'd':
 		/* Head */
-		VUT.d_opt = 1;
+		vut->d_opt = 1;
 		return (1);
 	case 'D':
 		/* Daemon mode */
-		VUT.D_opt = 1;
+		vut->D_opt = 1;
 		return (1);
 	case 'g':
 		/* Grouping */
 		AN(arg);
-		VUT.g_arg = VSLQ_Name2Grouping(arg, -1);
-		if (VUT.g_arg == -2)
+		vut->g_arg = VSLQ_Name2Grouping(arg, -1);
+		if (vut->g_arg == -2)
 			VUT_Error(1, "Ambiguous grouping type: %s", arg);
-		else if (VUT.g_arg < 0)
+		else if (vut->g_arg < 0)
 			VUT_Error(1, "Unknown grouping type: %s", arg);
 		return (1);
 	case 'k':
 		/* Log transaction limit */
 		AN(arg);
-		VUT.k_arg = (int)strtol(arg, &p, 10);
-		if (*p != '\0' || VUT.k_arg <= 0)
+		vut->k_arg = (int)strtol(arg, &p, 10);
+		if (*p != '\0' || vut->k_arg <= 0)
 			VUT_Error(1, "-k: Invalid number '%s'", arg);
 		return (1);
 	case 'n':
 		/* Varnish instance name */
 		AN(arg);
-		REPLACE(VUT.n_arg, arg);
+		REPLACE(vut->n_arg, arg);
 		return (1);
 	case 'P':
 		/* PID file */
 		AN(arg);
-		REPLACE(VUT.P_arg, arg);
+		REPLACE(vut->P_arg, arg);
 		return (1);
 	case 'q':
 		/* Query to use */
 		AN(arg);
-		REPLACE(VUT.q_arg, arg);
+		REPLACE(vut->q_arg, arg);
 		return (1);
 	case 'r':
 		/* Binary file input */
 		AN(arg);
-		REPLACE(VUT.r_arg, arg);
+		REPLACE(vut->r_arg, arg);
 		return (1);
 	case 't':
 		/* VSM connect timeout */
-		REPLACE(VUT.t_arg, arg);
+		REPLACE(vut->t_arg, arg);
 		return (1);
 	case 'V':
 		/* Print version number and exit */
-		VCS_Message(VUT.progname);
+		VCS_Message(vut->progname);
 		exit(0);
 	default:
-		AN(VUT.vsl);
-		i = VSL_Arg(VUT.vsl, opt, arg);
+		AN(vut->vsl);
+		i = VSL_Arg(vut->vsl, opt, arg);
 		if (i < 0)
-			VUT_Error(1, "%s", VSL_Error(VUT.vsl));
+			VUT_Error(1, "%s", VSL_Error(vut->vsl));
 		return (i);
 	}
 }
 
-void
+struct VUT *
 VUT_Init(const char *progname, int argc, char * const *argv,
     const struct vopt_spec *voc)
 {
+	struct VUT *vut;
 
 	AN(progname);
 	AN(argv);
 	AN(voc);
-	AZ(VUT.progname);
+
+	vut = calloc(1, sizeof *vut);
+	AN(vut);
 
 	if (argc == 2 && !strcmp(argv[1], "--synopsis"))
 		exit(vut_synopsis(voc));
 	if (argc == 2 && !strcmp(argv[1], "--options"))
 		exit(vut_options(voc));
 
-	VUT.progname = progname;
-	VUT.g_arg = VSL_g_vxid;
-	AZ(VUT.vsl);
-	VUT.vsl = VSL_New();
-	AN(VUT.vsl);
-	VUT.k_arg = -1;
+	vut->progname = progname;
+	vut->g_arg = VSL_g_vxid;
+	AZ(vut->vsl);
+	vut->vsl = VSL_New();
+	AN(vut->vsl);
+	vut->k_arg = -1;
+	return (vut);
 }
 
 void
@@ -228,59 +232,60 @@ VUT_Signaled(struct VUT *vut, int sig)
 }
 
 void
-VUT_Setup(void)
+VUT_Setup(struct VUT *vut)
 {
 	struct VSL_cursor *c;
 
-	AN(VUT.vsl);
-	AZ(VUT.vsm);
-	AZ(VUT.vslq);
+	AN(vut);
+	AN(vut->vsl);
+	AZ(vut->vsm);
+	AZ(vut->vslq);
 
 	/* Check input arguments (2 used for bug in FlexeLint) */
-	if ((VUT.n_arg == NULL ? 0 : 2) +
-	    (VUT.r_arg == NULL ? 0 : 2) > 2)
+	if ((vut->n_arg == NULL ? 0 : 2) +
+	    (vut->r_arg == NULL ? 0 : 2) > 2)
 		VUT_Error(1, "Only one of -n and -r options may be used");
 
 	/* Create and validate the query expression */
-	VUT.vslq = VSLQ_New(VUT.vsl, NULL, VUT.g_arg, VUT.q_arg);
-	if (VUT.vslq == NULL)
+	vut->vslq = VSLQ_New(vut->vsl, NULL, vut->g_arg, vut->q_arg);
+	if (vut->vslq == NULL)
 		VUT_Error(1, "Query expression error:\n%s",
-		    VSL_Error(VUT.vsl));
+		    VSL_Error(vut->vsl));
 
 	/* Setup input */
-	if (VUT.r_arg) {
-		c = VSL_CursorFile(VUT.vsl, VUT.r_arg, 0);
+	if (vut->r_arg) {
+		c = VSL_CursorFile(vut->vsl, vut->r_arg, 0);
 		if (c == NULL)
-			VUT_Error(1, "%s", VSL_Error(VUT.vsl));
-		VSLQ_SetCursor(VUT.vslq, &c);
+			VUT_Error(1, "%s", VSL_Error(vut->vsl));
+		VSLQ_SetCursor(vut->vslq, &c);
 		AZ(c);
 	} else {
-		VUT.vsm = VSM_New();
-		AN(VUT.vsm);
-		if (VUT.n_arg && VSM_Arg(VUT.vsm, 'n', VUT.n_arg) <= 0)
-			VUT_Error(1, "%s", VSM_Error(VUT.vsm));
-		if (VUT.t_arg && VSM_Arg(VUT.vsm, 't', VUT.t_arg) <= 0)
-			VUT_Error(1, "%s", VSM_Error(VUT.vsm));
-		if (VSM_Attach(VUT.vsm, STDERR_FILENO))
-			VUT_Error(1, "VSM: %s", VSM_Error(VUT.vsm));
+		vut->vsm = VSM_New();
+		AN(vut->vsm);
+		if (vut->n_arg && VSM_Arg(vut->vsm, 'n', vut->n_arg) <= 0)
+			VUT_Error(1, "%s", VSM_Error(vut->vsm));
+		if (vut->t_arg && VSM_Arg(vut->vsm, 't', vut->t_arg) <= 0)
+			VUT_Error(1, "%s", VSM_Error(vut->vsm));
+		if (VSM_Attach(vut->vsm, STDERR_FILENO))
+			VUT_Error(1, "VSM: %s", VSM_Error(vut->vsm));
 		// Cursor is handled in VUT_Main()
 	}
 
 	/* Open PID file */
-	if (VUT.P_arg) {
+	if (vut->P_arg) {
 		if (pfh != NULL)
 			VUT_Error(1, "PID file already created");
-		pfh = VPF_Open(VUT.P_arg, 0644, NULL);
+		pfh = VPF_Open(vut->P_arg, 0644, NULL);
 		if (pfh == NULL)
-			VUT_Error(1, "%s: %s", VUT.P_arg, strerror(errno));
+			VUT_Error(1, "%s: %s", vut->P_arg, strerror(errno));
 	}
 
 	/* Daemon mode */
-	if (VUT.D_opt && vut_daemon() == -1)
+	if (vut->D_opt && vut_daemon() == -1)
 		VUT_Error(1, "Daemon mode: %s", strerror(errno));
 
 	/* Write PID and setup exit handler */
-	if (VUT.P_arg) {
+	if (vut->P_arg) {
 		AN(pfh);
 		AZ(VPF_Write(pfh));
 		AZ(atexit(vut_vpf_remove));
@@ -288,89 +293,98 @@ VUT_Setup(void)
 }
 
 void
-VUT_Fini(void)
+VUT_Fini(struct VUT **vutp)
 {
-	AN(VUT.progname);
+	struct VUT *vut;
+
+	AN(vutp);
+	vut = *vutp;
+	*vutp = NULL;
 
-	free(VUT.n_arg);
-	free(VUT.P_arg);
-	free(VUT.q_arg);
-	free(VUT.r_arg);
-	free(VUT.t_arg);
+	AN(vut);
+	AN(vut->progname);
+
+	free(vut->n_arg);
+	free(vut->P_arg);
+	free(vut->q_arg);
+	free(vut->r_arg);
+	free(vut->t_arg);
 
 	vut_vpf_remove();
 	AZ(pfh);
 
-	if (VUT.vslq)
-		VSLQ_Delete(&VUT.vslq);
-	if (VUT.vsl)
-		VSL_Delete(VUT.vsl);
-	if (VUT.vsm)
-		VSM_Destroy(&VUT.vsm);
+	if (vut->vslq)
+		VSLQ_Delete(&vut->vslq);
+	if (vut->vsl)
+		VSL_Delete(vut->vsl);
+	if (vut->vsm)
+		VSM_Destroy(&vut->vsm);
 
-	memset(&VUT, 0, sizeof VUT);
+	memset(vut, 0, sizeof *vut);
+	free(vut);
 }
 
 int
-VUT_Main(void)
+VUT_Main(struct VUT *vut)
 {
 	struct VSL_cursor *c;
 	int i = -1;
 	int hascursor = -1;
 
-	AN(VUT.vslq);
+	AN(vut);
+	AN(vut->vslq);
 
-	while (!VUT.sigint) {
-		if (VUT.sighup && VUT.sighup_f) {
+	while (!vut->sigint) {
+		if (vut->sighup && vut->sighup_f) {
 			/* sighup callback */
-			VUT.sighup = 0;
-			i = VUT.sighup_f(&VUT);
+			vut->sighup = 0;
+			i = vut->sighup_f(vut);
 			if (i)
 				break;
 		}
 
-		if (VUT.sigusr1) {
+		if (vut->sigusr1) {
 			/* Flush and report any incomplete records */
-			VUT.sigusr1 = 0;
-			(void)VSLQ_Flush(VUT.vslq, vut_dispatch, NULL);
+			vut->sigusr1 = 0;
+			(void)VSLQ_Flush(vut->vslq, vut_dispatch, vut);
 		}
 
 		// We must repeatedly call VSM_Status() when !hascursor
 		// to make VSM discover our segment.
-		if (VUT.vsm != NULL &&
-		    (VSM_Status(VUT.vsm) & VSM_WRK_RESTARTED)) {
+		if (vut->vsm != NULL &&
+		    (VSM_Status(vut->vsm) & VSM_WRK_RESTARTED)) {
 			if (hascursor < 1) {
 				fprintf(stderr, "Log abandonned\n");
-				VSLQ_SetCursor(VUT.vslq, NULL);
+				VSLQ_SetCursor(vut->vslq, NULL);
 				hascursor = 0;
 			}
 		}
-		if (VUT.vsm != NULL && hascursor < 1) {
+		if (vut->vsm != NULL && hascursor < 1) {
 			/* Reconnect VSM */
-			AZ(VUT.r_arg);
+			AZ(vut->r_arg);
 			VTIM_sleep(0.1);
-			c = VSL_CursorVSM(VUT.vsl, VUT.vsm,
-			    (VUT.d_opt ? VSL_COPT_TAILSTOP : VSL_COPT_TAIL)
+			c = VSL_CursorVSM(vut->vsl, vut->vsm,
+			    (vut->d_opt ? VSL_COPT_TAILSTOP : VSL_COPT_TAIL)
 			    | VSL_COPT_BATCH);
 			if (c == NULL) {
-				VSL_ResetError(VUT.vsl);
+				VSL_ResetError(vut->vsl);
 				continue;
 			}
 			if (hascursor >= 0)
 				fprintf(stderr, "Log reacquired\n");
 			hascursor = 1;
-			VSLQ_SetCursor(VUT.vslq, &c);
+			VSLQ_SetCursor(vut->vslq, &c);
 			AZ(c);
 		}
 
-		i = VSLQ_Dispatch(VUT.vslq, vut_dispatch, NULL);
+		i = VSLQ_Dispatch(vut->vslq, vut_dispatch, vut);
 		if (i == 1)
 			/* Call again */
 			continue;
 		else if (i == 0) {
 			/* Nothing to do but wait */
-			if (VUT.idle_f) {
-				i = VUT.idle_f(&VUT);
+			if (vut->idle_f) {
+				i = vut->idle_f(vut);
 				if (i)
 					break;
 			}
@@ -381,17 +395,17 @@ VUT_Main(void)
 			break;
 		}
 
-		if (VUT.vsm == NULL)
+		if (vut->vsm == NULL)
 			break;
 
 		/* XXX: Make continuation optional */
 
-		(void)VSLQ_Flush(VUT.vslq, vut_dispatch, NULL);
+		(void)VSLQ_Flush(vut->vslq, vut_dispatch, vut);
 
 		if (i == -2) {
 			/* Abandoned */
 			fprintf(stderr, "Log abandoned\n");
-			VSLQ_SetCursor(VUT.vslq, NULL);
+			VSLQ_SetCursor(vut->vslq, NULL);
 			hascursor = 0;
 		} else if (i < -2)
 			/* Overrun */


More information about the varnish-commit mailing list