[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