Commit 0cba6f82 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Convert the parameter array to a list of parameters.

parent 71dfce88
...@@ -46,9 +46,16 @@ ...@@ -46,9 +46,16 @@
#include "mgt_cli.h" #include "mgt_cli.h"
struct plist {
unsigned magic;
#define PLIST_MAGIC 0xbfc3ea16
VTAILQ_ENTRY(plist) list;
struct parspec *spec;
};
static VTAILQ_HEAD(, plist) phead = VTAILQ_HEAD_INITIALIZER(phead);
struct params mgt_param; struct params mgt_param;
static int nparspec;
static struct parspec ** parspecs;
static const int margin1 = 8; static const int margin1 = 8;
static int margin2 = 0; static int margin2 = 0;
static const int wrap_at = 72; static const int wrap_at = 72;
...@@ -94,21 +101,42 @@ static const char ONLY_ROOT_TEXT[] = ...@@ -94,21 +101,42 @@ static const char ONLY_ROOT_TEXT[] =
"\n\n" "\n\n"
"NB: This parameter only works if varnishd is run as root."; "NB: This parameter only works if varnishd is run as root.";
/*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
static struct parspec * static struct parspec *
mcf_findpar(const char *name) mcf_findpar(const char *name)
{ {
int i; struct plist *pl;
AN(name); AN(name);
for (i = 0; i < nparspec; i++) VTAILQ_FOREACH(pl, &phead, list)
if (!strcmp(parspecs[i]->name, name)) if (!strcmp(pl->spec->name, name))
return (parspecs[i]); return (pl->spec);
return (NULL); return (NULL);
} }
static void
mcf_addpar(struct parspec *ps)
{
struct plist *pl, *pl2;
int i;
ALLOC_OBJ(pl, PLIST_MAGIC);
AN(pl);
pl->spec = ps;
VTAILQ_FOREACH(pl2, &phead, list) {
i = strcmp(pl2->spec->name, pl->spec->name);
if (i == 0) {
fprintf(stderr, "Duplicate param: %s\n", ps->name);
exit(4);
} else if (i > 0) {
VTAILQ_INSERT_BEFORE(pl2, pl, list);
return;
}
}
VTAILQ_INSERT_TAIL(&phead, pl, list);
}
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
* Wrap the text nicely. * Wrap the text nicely.
* Lines are allowed to contain to TABS and we render that as a table * Lines are allowed to contain to TABS and we render that as a table
...@@ -205,7 +233,8 @@ mcf_wrap(struct cli *cli, const char *text) ...@@ -205,7 +233,8 @@ mcf_wrap(struct cli *cli, const char *text)
void void
mcf_param_show(struct cli *cli, const char * const *av, void *priv) mcf_param_show(struct cli *cli, const char * const *av, void *priv)
{ {
int i, n; int n;
struct plist *pl;
const struct parspec *pp; const struct parspec *pp;
int lfmt = 0, chg = 0; int lfmt = 0, chg = 0;
struct vsb *vsb; struct vsb *vsb;
...@@ -219,8 +248,8 @@ mcf_param_show(struct cli *cli, const char * const *av, void *priv) ...@@ -219,8 +248,8 @@ mcf_param_show(struct cli *cli, const char * const *av, void *priv)
lfmt = 1; lfmt = 1;
n = 0; n = 0;
for (i = 0; i < nparspec; i++) { VTAILQ_FOREACH(pl, &phead, list) {
pp = parspecs[i]; pp = pl->spec;
if (lfmt && strcmp(pp->name, av[2]) && strcmp("-l", av[2])) if (lfmt && strcmp(pp->name, av[2]) && strcmp("-l", av[2]))
continue; continue;
n++; n++;
...@@ -364,22 +393,12 @@ mcf_param_set(struct cli *cli, const char * const *av, void *priv) ...@@ -364,22 +393,12 @@ mcf_param_set(struct cli *cli, const char * const *av, void *priv)
* Add a group of parameters to the global set and sort by name. * Add a group of parameters to the global set and sort by name.
*/ */
static int
mcf_parspec_cmp(const void *a, const void *b)
{
struct parspec * const * pa = a;
struct parspec * const * pb = b;
return (strcmp((*pa)->name, (*pb)->name));
}
void void
MCF_AddParams(struct parspec *ps) MCF_AddParams(struct parspec *ps)
{ {
struct parspec *pp; struct parspec *pp;
const char *s; const char *s;
int n;
n = 0;
for (pp = ps; pp->name != NULL; pp++) { for (pp = ps; pp->name != NULL; pp++) {
AN(pp->func); AN(pp->func);
s = strchr(pp->descr, '\0'); s = strchr(pp->descr, '\0');
...@@ -388,23 +407,12 @@ MCF_AddParams(struct parspec *ps) ...@@ -388,23 +407,12 @@ MCF_AddParams(struct parspec *ps)
"Param->descr has trailing space: %s\n", pp->name); "Param->descr has trailing space: %s\n", pp->name);
exit(4); exit(4);
} }
if (mcf_findpar(pp->name) != NULL) { mcf_addpar(pp);
fprintf(stderr, "Duplicate param: %s\n", pp->name);
exit(4);
}
if (strlen(pp->name) + 1 > margin2) if (strlen(pp->name) + 1 > margin2)
margin2 = strlen(pp->name) + 1; margin2 = strlen(pp->name) + 1;
n++;
} }
parspecs = realloc(parspecs, (1L + nparspec + n) * sizeof *parspecs);
XXXAN(parspecs);
for (pp = ps; pp->name != NULL; pp++)
parspecs[nparspec++] = pp;
parspecs[nparspec] = NULL;
qsort (parspecs, nparspec, sizeof parspecs[0], mcf_parspec_cmp);
} }
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
* Wash a min/max/default value * Wash a min/max/default value
*/ */
...@@ -443,14 +451,14 @@ mcf_wash_param(struct cli *cli, const struct parspec *pp, const char **val, ...@@ -443,14 +451,14 @@ mcf_wash_param(struct cli *cli, const struct parspec *pp, const char **val,
void void
MCF_InitParams(struct cli *cli) MCF_InitParams(struct cli *cli)
{ {
struct plist *pl;
struct parspec *pp; struct parspec *pp;
int i;
struct vsb *vsb; struct vsb *vsb;
vsb = VSB_new_auto(); vsb = VSB_new_auto();
AN(vsb); AN(vsb);
for (i = 0; i < nparspec; i++) { VTAILQ_FOREACH(pl, &phead, list) {
pp = parspecs[i]; pp = pl->spec;
if (pp->min != NULL) if (pp->min != NULL)
mcf_wash_param(cli, pp, &pp->min, "minimum", vsb); mcf_wash_param(cli, pp, &pp->min, "minimum", vsb);
...@@ -515,14 +523,15 @@ MCF_SetMaximum(const char *param, const char *new_max) ...@@ -515,14 +523,15 @@ MCF_SetMaximum(const char *param, const char *new_max)
void void
MCF_DumpRstParam(void) MCF_DumpRstParam(void)
{ {
struct plist *pl;
const struct parspec *pp; const struct parspec *pp;
const char *p, *q, *t1, *t2; const char *p, *q, *t1, *t2;
int i, j; int j;
printf("\n.. The following is the autogenerated " printf("\n.. The following is the autogenerated "
"output from varnishd -x dumprstparam\n\n"); "output from varnishd -x dumprstparam\n\n");
for (i = 0; i < nparspec; i++) { VTAILQ_FOREACH(pl, &phead, list) {
pp = parspecs[i]; pp = pl->spec;
printf(".. _ref_param_%s:\n\n", pp->name); printf(".. _ref_param_%s:\n\n", pp->name);
printf("%s\n", pp->name); printf("%s\n", pp->name);
for (j = 0; j < strlen(pp->name); j++) for (j = 0; j < strlen(pp->name); j++)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment