[master] a82df92 Move some auxillary stuff out of mgt_main and clean up namespace a bit.

Poul-Henning Kamp phk at FreeBSD.org
Fri Jan 13 13:29:05 CET 2017


commit a82df925b61a5c6c5e7e41f75d4229647fa0577b
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Fri Jan 13 12:27:33 2017 +0000

    Move some auxillary stuff out of mgt_main and clean up namespace a bit.

diff --git a/bin/varnishd/Makefile.am b/bin/varnishd/Makefile.am
index 9203a50..b812cc7 100644
--- a/bin/varnishd/Makefile.am
+++ b/bin/varnishd/Makefile.am
@@ -86,6 +86,7 @@ varnishd_SOURCES = \
 	mgt/mgt_param_tweak.c \
 	mgt/mgt_pool.c \
 	mgt/mgt_shmem.c \
+	mgt/mgt_util.c \
 	mgt/mgt_vcc.c \
 	mgt/mgt_vcl.c \
 	proxy/cache_proxy_proto.c \
diff --git a/bin/varnishd/hash/mgt_hash.c b/bin/varnishd/hash/mgt_hash.c
index a8cc352..6e772b2 100644
--- a/bin/varnishd/hash/mgt_hash.c
+++ b/bin/varnishd/hash/mgt_hash.c
@@ -71,7 +71,7 @@ HSH_config(const char *h_arg)
 	for (ac = 0; av[ac + 2] != NULL; ac++)
 		continue;
 
-	hp = pick(hsh_choice, av[1], "hash");
+	hp = MGT_Pick(hsh_choice, av[1], "hash");
 	CHECK_OBJ_NOTNULL(hp, SLINGER_MAGIC);
 	VSB_printf(vident, ",-h%s", av[1]);
 	heritage.hash = hp;
diff --git a/bin/varnishd/mgt/mgt.h b/bin/varnishd/mgt/mgt.h
index 7f7f17f..dc69bc0 100644
--- a/bin/varnishd/mgt/mgt.h
+++ b/bin/varnishd/mgt/mgt.h
@@ -126,14 +126,12 @@ struct choice {
 	const char      *name;
 	const void	*ptr;
 };
-const void *pick(const struct choice *cp, const char *which, const char *kind);
 
 extern const char C_ERR[];	// Things are not as they should be
 extern const char C_INFO[];	// Normal stuff, keep a record for later
 extern const char C_DEBUG[];	// More detail than you'd normally want
 extern const char C_SECURITY[];	// Security issues
 extern const char C_CLI[];	// CLI traffic between master and child
-void MGT_complain(const char *loud, const char *, ...) __v_printflike(2, 3);
 
 /* mgt_param.c */
 void MCF_InitParams(struct cli *);
@@ -152,9 +150,6 @@ void MCF_DumpRstParam(void);
 void MCF_AddParams(struct parspec *ps);
 extern struct params mgt_param;
 
-/* mgt_param_tcp.c */
-void MCF_TcpParams(void);
-
 /* mgt_shmem.c */
 void mgt_SHM_Init(void);
 void mgt_SHM_static_alloc(const void *, ssize_t size,
@@ -164,6 +159,15 @@ int mgt_SHM_Commit(void);
 void mgt_SHM_Destroy(int keep);
 void mgt_SHM_Size_Adjust(void);
 
+/* mgt_param_tcp.c */
+void MCF_TcpParams(void);
+
+/* mgt_util.c */
+void mgt_DumpRstVsl(void);
+struct vsb *mgt_BuildVident(void);
+void MGT_Complain(const char *, const char *, ...) __v_printflike(2, 3);
+const void *MGT_Pick(const struct choice *, const char *, const char *);
+void mgt_SymbolHack(const char *);
 
 /* stevedore_mgt.c */
 void STV_Config(const char *spec);
diff --git a/bin/varnishd/mgt/mgt_acceptor.c b/bin/varnishd/mgt/mgt_acceptor.c
index 14ce0e6..ae82607 100644
--- a/bin/varnishd/mgt/mgt_acceptor.c
+++ b/bin/varnishd/mgt/mgt_acceptor.c
@@ -89,7 +89,7 @@ MAC_reopen_sockets(struct cli *cli)
 		if (fail == 0)
 			continue;
 		if (cli == NULL)
-			MGT_complain(C_ERR,
+			MGT_Complain(C_ERR,
 			    "Could not reopen listen socket %s: %s",
 			    ls->name, strerror(fail));
 		else
diff --git a/bin/varnishd/mgt/mgt_child.c b/bin/varnishd/mgt/mgt_child.c
index 988643a..d1c4f2f 100644
--- a/bin/varnishd/mgt/mgt_child.c
+++ b/bin/varnishd/mgt/mgt_child.c
@@ -119,7 +119,7 @@ mgt_panic_record(pid_t r)
 	    strnlen(heritage.panic_str, heritage.panic_str_len),
 	    VSB_QUOTE_NONL);
 	AZ(VSB_finish(child_panic));
-	MGT_complain(C_ERR, "Child (%jd) %s",
+	MGT_Complain(C_ERR, "Child (%jd) %s",
 	    (intmax_t)r, VSB_data(child_panic));
 }
 
@@ -222,7 +222,7 @@ child_line(void *priv, const char *p)
 {
 	(void)priv;
 
-	MGT_complain(C_INFO, "Child (%jd) said %s", (intmax_t)child_pid, p);
+	MGT_Complain(C_INFO, "Child (%jd) said %s", (intmax_t)child_pid, p);
 	return (0);
 }
 
@@ -260,7 +260,7 @@ child_poker(const struct vev *e, int what)
 	if (child_pid < 0)
 		return (0);
 	if (mgt_cli_askchild(&status, &r, "ping\n") || strncmp("PONG ", r, 5)) {
-		MGT_complain(C_ERR, "Unexpected reply from ping: %u %s",
+		MGT_Complain(C_ERR, "Unexpected reply from ping: %u %s",
 		    status, r);
 		if (status != CLIS_COMMS)
 			MGT_Child_Cli_Fail();
@@ -391,7 +391,7 @@ mgt_launch_child(struct cli *cli)
 		exit(0);
 	}
 	assert(pid > 1);
-	MGT_complain(C_DEBUG, "Child (%jd) Started", (intmax_t)pid);
+	MGT_Complain(C_DEBUG, "Child (%jd) Started", (intmax_t)pid);
 	VSC_C_mgt->child_start = ++static_VSC_C_mgt.child_start;
 
 	/* Close stuff the child got */
@@ -430,7 +430,7 @@ mgt_launch_child(struct cli *cli)
 	child_pid = pid;
 	if (mgt_push_vcls_and_start(cli, &u, &p)) {
 		VCLI_SetResult(cli, u);
-		MGT_complain(C_ERR, "Child (%jd) Pushing vcls failed:\n%s",
+		MGT_Complain(C_ERR, "Child (%jd) Pushing vcls failed:\n%s",
 		    (intmax_t)child_pid, p);
 		free(p);
 		child_state = CH_RUNNING;
@@ -540,7 +540,7 @@ mgt_reap_child(void)
 	}
 #endif
 	AZ(VSB_finish(vsb));
-	MGT_complain(status ? C_ERR : C_INFO, "%s", VSB_data(vsb));
+	MGT_Complain(status ? C_ERR : C_INFO, "%s", VSB_data(vsb));
 	VSB_destroy(&vsb);
 
 	/* Dispose of shared memory but evacuate panic messages first */
@@ -564,7 +564,7 @@ mgt_reap_child(void)
 
 	child_pid = -1;
 
-	MGT_complain(C_DEBUG, "Child cleanup complete");
+	MGT_Complain(C_DEBUG, "Child cleanup complete");
 
 	if (child_state == CH_DIED && mgt_param.auto_restart)
 		mgt_launch_child(NULL);
@@ -593,10 +593,10 @@ MGT_Child_Cli_Fail(void)
 	if (child_pid < 0)
 		return;
 	if (kill_child() == 0)
-		MGT_complain(C_ERR, "Child (%jd) not responding to CLI,"
+		MGT_Complain(C_ERR, "Child (%jd) not responding to CLI,"
 		    " killed it.", (intmax_t)child_pid);
 	else
-		MGT_complain(C_ERR, "Failed to kill child with PID %jd: %s",
+		MGT_Complain(C_ERR, "Failed to kill child with PID %jd: %s",
 		    (intmax_t)child_pid, strerror(errno));
 }
 
@@ -615,7 +615,7 @@ mgt_stop_child(void)
 
 	child_state = CH_STOPPING;
 
-	MGT_complain(C_DEBUG, "Stopping Child");
+	MGT_Complain(C_DEBUG, "Stopping Child");
 
 	mgt_reap_child();
 }
@@ -675,7 +675,7 @@ mgt_sigint(const struct vev *e, int what)
 
 	(void)e;
 	(void)what;
-	MGT_complain(C_ERR, "Manager got SIGINT");
+	MGT_Complain(C_ERR, "Manager got SIGINT");
 	(void)fflush(stdout);
 	if (child_pid >= 0)
 		mgt_stop_child();
@@ -758,7 +758,7 @@ MGT_Run(void)
 	AZ(sigaction(SIGHUP, &sac, NULL));
 
 	if (!d_flag && !mgt_has_vcl())
-		MGT_complain(C_ERR, "No VCL loaded yet");
+		MGT_Complain(C_ERR, "No VCL loaded yet");
 	else if (!d_flag) {
 		mgt_launch_child(NULL);
 		if (child_state != CH_RUNNING)
@@ -767,7 +767,7 @@ MGT_Run(void)
 
 	i = mgt_SHM_Commit();
 	if (i != 0) {
-		MGT_complain(C_ERR, "Could not commit SHM file");
+		MGT_Complain(C_ERR, "Could not commit SHM file");
 		return (2);
 	}
 
diff --git a/bin/varnishd/mgt/mgt_cli.c b/bin/varnishd/mgt/mgt_cli.c
index 79f4b90..6e6cc9a 100644
--- a/bin/varnishd/mgt/mgt_cli.c
+++ b/bin/varnishd/mgt/mgt_cli.c
@@ -285,7 +285,7 @@ mcf_auth(struct cli *cli, const char *const *av, void *priv)
 	VCLI_AuthResponse(fd, cli->challenge, buf);
 	AZ(close(fd));
 	if (strcasecmp(buf, av[2])) {
-		MGT_complain(C_SECURITY,
+		MGT_Complain(C_SECURITY,
 		    "CLI Authentication failure from %s", cli->ident);
 		VCLI_SetResult(cli, CLIS_CLOSE);
 		return;
@@ -330,14 +330,14 @@ static void
 mgt_cli_cb_before(const struct cli *cli)
 {
 
-	MGT_complain(C_CLI, "CLI %s Rd %s", cli->ident, cli->cmd);
+	MGT_Complain(C_CLI, "CLI %s Rd %s", cli->ident, cli->cmd);
 }
 
 static void
 mgt_cli_cb_after(const struct cli *cli)
 {
 
-	MGT_complain(C_CLI, "CLI %s Wr %03u %s",
+	MGT_Complain(C_CLI, "CLI %s Wr %03u %s",
 	    cli->ident, cli->result, VSB_data(cli->sb));
 }
 
@@ -610,7 +610,7 @@ Marg_connect(const struct vev *e, int what)
 
 	M_fd = VTCP_connected(M_fd);
 	if (M_fd < 0) {
-		MGT_complain(C_INFO, "Could not connect to CLI-master: %m");
+		MGT_Complain(C_INFO, "Could not connect to CLI-master: %m");
 		ma = VTAILQ_FIRST(&m_addr_list);
 		AN(ma);
 		VTAILQ_REMOVE(&m_addr_list, ma, list);
diff --git a/bin/varnishd/mgt/mgt_jail.c b/bin/varnishd/mgt/mgt_jail.c
index b0cd91d..a88a499 100644
--- a/bin/varnishd/mgt/mgt_jail.c
+++ b/bin/varnishd/mgt/mgt_jail.c
@@ -100,7 +100,7 @@ VJ_Init(const char *j_arg)
 			ARGV_ERR("-j argument: %s\n", av[0]);
 		if (av[1] == NULL)
 			ARGV_ERR("-j argument is emtpy\n");
-		vjt = pick(vj_choice, av[1], "jail");
+		vjt = MGT_Pick(vj_choice, av[1], "jail");
 		CHECK_OBJ_NOTNULL(vjt, JAIL_TECH_MAGIC);
 		(void)vjt->init(av + 2);
 		VAV_Free(av);
@@ -173,7 +173,7 @@ VJ_make_vcldir(const char *dname)
 		return (vjt->make_vcldir(dname));
 
 	if (mkdir(dname, 0755) < 0 && errno != EEXIST) {
-		MGT_complain(C_ERR, "Cannot create VCL directory '%s': %s",
+		MGT_Complain(C_ERR, "Cannot create VCL directory '%s': %s",
 		    dname, strerror(errno));
 		return (1);
 	}
diff --git a/bin/varnishd/mgt/mgt_jail_solaris.c b/bin/varnishd/mgt/mgt_jail_solaris.c
index a9a624e..1ab519e 100644
--- a/bin/varnishd/mgt/mgt_jail_solaris.c
+++ b/bin/varnishd/mgt/mgt_jail_solaris.c
@@ -392,7 +392,7 @@ vjs_setup(enum jail_gen_e jge)
 	priv_set_t *priv_all;
 
 	if (! (priv_all = priv_allocset())) {
-		MGT_complain(C_SECURITY,
+		MGT_Complain(C_SECURITY,
 		    "Solaris Jail warning: "
 		    " vjs_setup - priv_allocset failed: errno=%d (%s)",
 		    errno, strerror(errno));
@@ -425,7 +425,7 @@ vjs_privsep(enum jail_gen_e jge)
 		if (getuid() != mgt_param.uid)
 			XXXAZ(setuid(mgt_param.uid));
 	} else {
-		MGT_complain(C_SECURITY,
+		MGT_Complain(C_SECURITY,
 		    "Privilege %s missing, will not change uid/gid",
 		    PRIV_PROC_SETID);
 	}
@@ -456,7 +456,7 @@ vjs_waive(enum jail_gen_e jge)
 	    !(inheritable = priv_allocset()) ||
 	    !(permitted = priv_allocset()) ||
 	    !(limited = priv_allocset())) {
-		MGT_complain(C_SECURITY,
+		MGT_Complain(C_SECURITY,
 		    "Solaris Jail warning: "
 		    " vjs_waive - priv_allocset failed: errno=%d (%s)",
 		    errno, strerror(errno));
diff --git a/bin/varnishd/mgt/mgt_jail_unix.c b/bin/varnishd/mgt/mgt_jail_unix.c
index a28cdc8..838b977 100644
--- a/bin/varnishd/mgt/mgt_jail_unix.c
+++ b/bin/varnishd/mgt/mgt_jail_unix.c
@@ -230,7 +230,7 @@ vju_subproc(enum jail_subproc_e jse)
 	 * reenable them again.
 	 */
 	if (prctl(PR_SET_DUMPABLE, 1) != 0) {
-		MGT_complain(C_INFO,
+		MGT_Complain(C_INFO,
 		    "Could not set dumpable bit.  Core dumps turned off");
 	}
 #endif
@@ -242,7 +242,7 @@ vju_make_vcldir(const char *dname)
 	AZ(seteuid(0));
 
 	if (mkdir(dname, 0755) < 0 && errno != EEXIST) {
-		MGT_complain(C_ERR, "Cannot create VCL directory '%s': %s",
+		MGT_Complain(C_ERR, "Cannot create VCL directory '%s': %s",
 		    dname, strerror(errno));
 		return (1);
 	}
diff --git a/bin/varnishd/mgt/mgt_main.c b/bin/varnishd/mgt/mgt_main.c
index dce1dba..ea884d8 100644
--- a/bin/varnishd/mgt/mgt_main.c
+++ b/bin/varnishd/mgt/mgt_main.c
@@ -76,117 +76,6 @@ int optreset;	// Some has it, some doesn't.  Cheaper than auto*
 /*--------------------------------------------------------------------*/
 
 static void
-mgt_sltm(const char *tag, const char *sdesc, const char *ldesc)
-{
-	int i;
-
-	assert(sdesc != NULL && ldesc != NULL);
-	assert(*sdesc != '\0' || *ldesc != '\0');
-	printf("\n%s\n", tag);
-	i = strlen(tag);
-	printf("%*.*s\n\n", i, i, "------------------------------------");
-	if (*ldesc != '\0')
-		printf("%s\n", ldesc);
-	else if (*sdesc != '\0')
-		printf("%s\n", sdesc);
-}
-
-/*lint -e{506} constant value boolean */
-static void
-mgt_DumpRstVsl(void)
-{
-
-	printf(
-	    "\n.. The following is autogenerated output from "
-	    "varnishd -x dumprstvsl\n\n");
-
-#define SLTM(tag, flags, sdesc, ldesc) mgt_sltm(#tag, sdesc, ldesc);
-#include "tbl/vsl_tags.h"
-}
-
-/*--------------------------------------------------------------------*/
-
-static void
-build_vident(void)
-{
-	struct utsname uts;
-
-	vident = VSB_new_auto();
-	AN(vident);
-	if (!uname(&uts)) {
-		VSB_printf(vident, ",%s", uts.sysname);
-		VSB_printf(vident, ",%s", uts.release);
-		VSB_printf(vident, ",%s", uts.machine);
-	}
-}
-
-/*--------------------------------------------------------------------
- * 'Ello, I wish to register a complaint...
- */
-
-#ifndef LOG_AUTHPRIV
-#  define LOG_AUTHPRIV 0
-#endif
-
-const char C_ERR[] = "Error:";
-const char C_INFO[] = "Info:";
-const char C_DEBUG[] = "Debug:";
-const char C_SECURITY[] = "Security:";
-const char C_CLI[] = "Cli:";
-
-void
-MGT_complain(const char *loud, const char *fmt, ...)
-{
-	va_list ap;
-	struct vsb *vsb;
-	int sf;
-
-	if (loud == C_CLI && !mgt_param.syslog_cli_traffic)
-		return;
-	vsb = VSB_new_auto();
-	AN(vsb);
-	va_start(ap, fmt);
-	VSB_vprintf(vsb, fmt, ap);
-	va_end(ap);
-	AZ(VSB_finish(vsb));
-
-	if (loud == C_ERR)
-		sf = LOG_ERR;
-	else if (loud == C_INFO)
-		sf = LOG_INFO;
-	else if (loud == C_DEBUG)
-		sf = LOG_DEBUG;
-	else if (loud == C_SECURITY)
-		sf = LOG_WARNING | LOG_AUTHPRIV;
-	else if (loud == C_CLI)
-		sf = LOG_INFO;
-	else
-		WRONG("Wrong complaint loudness");
-
-	if (loud != C_CLI)
-		fprintf(stderr, "%s %s\n", loud, VSB_data(vsb));
-
-	if (!MGT_DO_DEBUG(DBG_VTC_MODE))
-		syslog(sf, "%s", VSB_data(vsb));
-	VSB_destroy(&vsb);
-}
-
-/*--------------------------------------------------------------------*/
-
-const void *
-pick(const struct choice *cp, const char *which, const char *kind)
-{
-
-	for(; cp->name != NULL; cp++) {
-		if (!strcmp(cp->name, which))
-			return (cp->ptr);
-	}
-	ARGV_ERR("Unknown %s method \"%s\"\n", kind, which);
-}
-
-/*--------------------------------------------------------------------*/
-
-static void
 usage(void)
 {
 #define FMT "    %-28s # %s\n"
@@ -275,83 +164,11 @@ cli_check(const struct cli *cli)
 }
 
 /*--------------------------------------------------------------------
- * All praise POSIX!  Thanks to our glorious standards there are no
- * standard way to get a back-trace of the stack, and even if we hack
- * that together from spit and pieces of string, there is no way no
- * standard way to translate a pointer to a symbol, which returns anything
- * usable.  (See for instance FreeBSD PR-134391).
- *
- * Attempt to run nm(1) on our binary during startup, hoping it will
- * give us a usable list of symbols.
- */
-
-struct symbols {
-	uintptr_t		a;
-	uintptr_t		l;
-	char			*n;
-	VTAILQ_ENTRY(symbols)	list;
-};
-
-static VTAILQ_HEAD(,symbols) symbols = VTAILQ_HEAD_INITIALIZER(symbols);
-
-int
-Symbol_Lookup(struct vsb *vsb, void *ptr)
-{
-	struct symbols *s, *s0;
-	uintptr_t pp;
-
-	pp = (uintptr_t)ptr;
-	s0 = NULL;
-	VTAILQ_FOREACH(s, &symbols, list) {
-		if (s->a > pp || s->a + s->l <= pp)
-			continue;
-		if (s0 == NULL || s->l < s0->l)
-			s0 = s;
-	}
-	if (s0 == NULL)
-		return (-1);
-	VSB_printf(vsb, "%p: %s", ptr, s0->n);
-	if ((uintmax_t)pp != s0->a)
-		VSB_printf(vsb, "+0x%jx", (uintmax_t)pp - s0->a);
-	return (0);
-}
-
-static void
-Symbol_hack(const char *a0)
-{
-	char buf[BUFSIZ];
-	FILE *fi;
-	struct symbols *s;
-	uintmax_t aa, ll;
-	char type[10];
-	char name[100];
-	int i;
-
-	bprintf(buf, "nm -t x -n -P %s 2>/dev/null", a0);
-	fi = popen(buf, "r");
-	if (fi == NULL)
-		return;
-	while (fgets(buf, sizeof buf, fi)) {
-		i = sscanf(buf, "%99s\t%9s\t%jx\t%jx\n", name, type, &aa, &ll);
-		if (i != 4)
-			continue;
-		s = malloc(sizeof *s + strlen(name) + 1);
-		AN(s);
-		s->a = aa;
-		s->l = ll;
-		s->n = (void*)(s + 1);
-		strcpy(s->n, name);
-		VTAILQ_INSERT_TAIL(&symbols, s, list);
-	}
-	(void)pclose(fi);
-}
-
-/*--------------------------------------------------------------------
  * This function is called when the CLI on stdin is closed.
  */
 
 static void
-cli_stdin_close(void *priv)
+mgt_stdin_close(void *priv)
 {
 
 	(void)priv;
@@ -698,9 +515,9 @@ main(int argc, char * const *argv)
 
 	VRND_SeedAll();
 
-	build_vident();
+	vident = mgt_BuildVident();
 
-	Symbol_hack(argv[0]);
+	mgt_SymbolHack(argv[0]);
 
 	/* Various initializations */
 	VTAILQ_INIT(&heritage.socks);
@@ -909,10 +726,10 @@ main(int argc, char * const *argv)
 
 	assert(pfh == NULL || !VPF_Write(pfh));
 
-	MGT_complain(C_DEBUG, "Platform: %s", VSB_data(vident) + 1);
+	MGT_Complain(C_DEBUG, "Platform: %s", VSB_data(vident) + 1);
 
 	if (d_flag)
-		mgt_cli_setup(0, 1, 1, "debug", cli_stdin_close, NULL);
+		mgt_cli_setup(0, 1, 1, "debug", mgt_stdin_close, NULL);
 
 	if (strcmp(S_arg, "none"))
 		mgt_cli_secret(S_arg);
@@ -935,9 +752,9 @@ main(int argc, char * const *argv)
 
 	o = vev_schedule(mgt_evb);
 	if (o != 0)
-		MGT_complain(C_ERR, "vev_schedule() = %d", o);
+		MGT_Complain(C_ERR, "vev_schedule() = %d", o);
 
-	MGT_complain(C_INFO, "manager dies");
+	MGT_Complain(C_INFO, "manager dies");
 	if (pfh != NULL)
 		(void)VPF_Remove(pfh);
 	exit(exit_status);
diff --git a/bin/varnishd/mgt/mgt_shmem.c b/bin/varnishd/mgt/mgt_shmem.c
index a131533..49a8753 100644
--- a/bin/varnishd/mgt/mgt_shmem.c
+++ b/bin/varnishd/mgt/mgt_shmem.c
@@ -151,7 +151,7 @@ vsm_zerofile(const char *fn, ssize_t size)
 
 	fd = VFL_Open(fn, O_RDWR | O_CREAT | O_EXCL | O_NONBLOCK, 0640);
 	if (fd < 0) {
-		MGT_complain(C_ERR, "Could not create %s: %s",
+		MGT_Complain(C_ERR, "Could not create %s: %s",
 		    fn, strerror(errno));
 		return (-1);
 	}
@@ -161,7 +161,7 @@ vsm_zerofile(const char *fn, ssize_t size)
 	flags &= ~O_NONBLOCK;
 	AZ(fcntl(fd, F_SETFL, flags));
 	if (VFIL_allocate(fd, (off_t)size, 1)) {
-		MGT_complain(C_ERR, "File allocation error %s: %s",
+		MGT_Complain(C_ERR, "File allocation error %s: %s",
 		    fn, strerror(errno));
 		return (-1);
 	}
@@ -223,7 +223,7 @@ mgt_SHM_Create(void)
 	AZ(close(vsm_fd));
 
 	if (p == MAP_FAILED) {
-		MGT_complain(C_ERR, "Mmap error %s: %s",
+		MGT_Complain(C_ERR, "Mmap error %s: %s",
 		    fnbuf, strerror(errno));
 		mgt_shm_cleanup();
 		exit(1);
@@ -274,7 +274,7 @@ mgt_SHM_Commit(void)
 	bprintf(fnbuf, "%s.%jd", VSM_FILENAME, (intmax_t)getpid());
 	VJ_master(JAIL_MASTER_FILE);
 	if (rename(fnbuf, VSM_FILENAME)) {
-		MGT_complain(C_ERR, "Rename failed %s -> %s: %s",
+		MGT_Complain(C_ERR, "Rename failed %s -> %s: %s",
 		    fnbuf, VSM_FILENAME, strerror(errno));
 		(void)unlink(fnbuf);
 		retval = -1;
diff --git a/bin/varnishd/mgt/mgt_util.c b/bin/varnishd/mgt/mgt_util.c
new file mode 100644
index 0000000..8d2b0ee
--- /dev/null
+++ b/bin/varnishd/mgt/mgt_util.c
@@ -0,0 +1,233 @@
+/*-
+ * Copyright (c) 2006 Verdens Gang AS
+ * Copyright (c) 2006-2011 Varnish Software AS
+ * All rights reserved.
+ *
+ * Author: Poul-Henning Kamp <phk at phk.freebsd.dk>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The management process and CLI handling
+ */
+
+#include "config.h"
+
+#include <sys/utsname.h>
+
+#include <stdarg.h>
+#include <time.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
+#include <unistd.h>
+
+#include "mgt/mgt.h"
+
+
+/*--------------------------------------------------------------------*/
+
+static void
+mgt_sltm(const char *tag, const char *sdesc, const char *ldesc)
+{
+	int i;
+
+	assert(sdesc != NULL && ldesc != NULL);
+	assert(*sdesc != '\0' || *ldesc != '\0');
+	printf("\n%s\n", tag);
+	i = strlen(tag);
+	printf("%*.*s\n\n", i, i, "------------------------------------");
+	if (*ldesc != '\0')
+		printf("%s\n", ldesc);
+	else if (*sdesc != '\0')
+		printf("%s\n", sdesc);
+}
+
+/*lint -e{506} constant value boolean */
+void
+mgt_DumpRstVsl(void)
+{
+
+	printf(
+	    "\n.. The following is autogenerated output from "
+	    "varnishd -x dumprstvsl\n\n");
+
+#define SLTM(tag, flags, sdesc, ldesc) mgt_sltm(#tag, sdesc, ldesc);
+#include "tbl/vsl_tags.h"
+}
+
+/*--------------------------------------------------------------------*/
+
+struct vsb *
+mgt_BuildVident(void)
+{
+	struct utsname uts;
+	struct vsb *vsb;
+
+	vsb = VSB_new_auto();
+	AN(vsb);
+	if (!uname(&uts)) {
+		VSB_printf(vsb, ",%s", uts.sysname);
+		VSB_printf(vsb, ",%s", uts.release);
+		VSB_printf(vsb, ",%s", uts.machine);
+	}
+	return (vsb);
+}
+
+/*--------------------------------------------------------------------
+ * 'Ello, I wish to register a complaint...
+ */
+
+#ifndef LOG_AUTHPRIV
+#  define LOG_AUTHPRIV 0
+#endif
+
+const char C_ERR[] = "Error:";
+const char C_INFO[] = "Info:";
+const char C_DEBUG[] = "Debug:";
+const char C_SECURITY[] = "Security:";
+const char C_CLI[] = "Cli:";
+
+void
+MGT_Complain(const char *loud, const char *fmt, ...)
+{
+	va_list ap;
+	struct vsb *vsb;
+	int sf;
+
+	if (loud == C_CLI && !mgt_param.syslog_cli_traffic)
+		return;
+	vsb = VSB_new_auto();
+	AN(vsb);
+	va_start(ap, fmt);
+	VSB_vprintf(vsb, fmt, ap);
+	va_end(ap);
+	AZ(VSB_finish(vsb));
+
+	if (loud == C_ERR)
+		sf = LOG_ERR;
+	else if (loud == C_INFO)
+		sf = LOG_INFO;
+	else if (loud == C_DEBUG)
+		sf = LOG_DEBUG;
+	else if (loud == C_SECURITY)
+		sf = LOG_WARNING | LOG_AUTHPRIV;
+	else if (loud == C_CLI)
+		sf = LOG_INFO;
+	else
+		WRONG("Wrong complaint loudness");
+
+	if (loud != C_CLI)
+		fprintf(stderr, "%s %s\n", loud, VSB_data(vsb));
+
+	if (!MGT_DO_DEBUG(DBG_VTC_MODE))
+		syslog(sf, "%s", VSB_data(vsb));
+	VSB_destroy(&vsb);
+}
+
+/*--------------------------------------------------------------------*/
+
+const void *
+MGT_Pick(const struct choice *cp, const char *which, const char *kind)
+{
+
+	for(; cp->name != NULL; cp++) {
+		if (!strcmp(cp->name, which))
+			return (cp->ptr);
+	}
+	ARGV_ERR("Unknown %s method \"%s\"\n", kind, which);
+}
+
+/*--------------------------------------------------------------------
+ * All praise POSIX!  Thanks to our glorious standards there are no
+ * standard way to get a back-trace of the stack, and even if we hack
+ * that together from spit and pieces of string, there is no way no
+ * standard way to translate a pointer to a symbol, which returns anything
+ * usable.  (See for instance FreeBSD PR-134391).
+ *
+ * Attempt to run nm(1) on our binary during startup, hoping it will
+ * give us a usable list of symbols.
+ */
+
+struct symbols {
+	uintptr_t		a;
+	uintptr_t		l;
+	char			*n;
+	VTAILQ_ENTRY(symbols)	list;
+};
+
+static VTAILQ_HEAD(,symbols) symbols = VTAILQ_HEAD_INITIALIZER(symbols);
+
+int
+Symbol_Lookup(struct vsb *vsb, void *ptr)
+{
+	struct symbols *s, *s0;
+	uintptr_t pp;
+
+	pp = (uintptr_t)ptr;
+	s0 = NULL;
+	VTAILQ_FOREACH(s, &symbols, list) {
+		if (s->a > pp || s->a + s->l <= pp)
+			continue;
+		if (s0 == NULL || s->l < s0->l)
+			s0 = s;
+	}
+	if (s0 == NULL)
+		return (-1);
+	VSB_printf(vsb, "%p: %s", ptr, s0->n);
+	if ((uintmax_t)pp != s0->a)
+		VSB_printf(vsb, "+0x%jx", (uintmax_t)pp - s0->a);
+	return (0);
+}
+
+void
+mgt_SymbolHack(const char *a0)
+{
+	char buf[BUFSIZ];
+	FILE *fi;
+	struct symbols *s;
+	uintmax_t aa, ll;
+	char type[10];
+	char name[100];
+	int i;
+
+	bprintf(buf, "nm -t x -n -P %s 2>/dev/null", a0);
+	fi = popen(buf, "r");
+	if (fi == NULL)
+		return;
+	while (fgets(buf, sizeof buf, fi)) {
+		i = sscanf(buf, "%99s\t%9s\t%jx\t%jx\n", name, type, &aa, &ll);
+		if (i != 4)
+			continue;
+		s = malloc(sizeof *s + strlen(name) + 1);
+		AN(s);
+		s->a = aa;
+		s->l = ll;
+		s->n = (void*)(s + 1);
+		strcpy(s->n, name);
+		VTAILQ_INSERT_TAIL(&symbols, s, list);
+	}
+	(void)pclose(fi);
+}
diff --git a/bin/varnishd/storage/mgt_stevedore.c b/bin/varnishd/storage/mgt_stevedore.c
index e41933e..c0cb743 100644
--- a/bin/varnishd/storage/mgt_stevedore.c
+++ b/bin/varnishd/storage/mgt_stevedore.c
@@ -162,7 +162,7 @@ STV_Config(const char *spec)
 	for (ac = 0; av[ac + 2] != NULL; ac++)
 		continue;
 
-	stv2 = pick(STV_choice, av[1], "storage");
+	stv2 = MGT_Pick(STV_choice, av[1], "storage");
 	AN(stv2);
 
 	/* Append strategy to ident string */
diff --git a/bin/varnishd/waiter/mgt_waiter.c b/bin/varnishd/waiter/mgt_waiter.c
index 58d4307..7b8530f 100644
--- a/bin/varnishd/waiter/mgt_waiter.c
+++ b/bin/varnishd/waiter/mgt_waiter.c
@@ -59,7 +59,7 @@ Wait_config(const char *arg)
 	ASSERT_MGT();
 
 	if (arg != NULL)
-		waiter = pick(waiter_choice, arg, "waiter");
+		waiter = MGT_Pick(waiter_choice, arg, "waiter");
 	else
 		waiter = waiter_choice[0].ptr;
 }



More information about the varnish-commit mailing list