Commit d306f91c authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Rework the -f/-b logic so we can take multiple -f arguments.

If you give multiple -f arguments, the resulting VCL's will be
"boot0", "boot1", ... "boot668", "boot"

And the last one will be the active one.

The plan is to also allow both specification of an (optional) label and
which VCL is to be the active one, but I want to think about if we should
shoehorn that into -f or use a different option letter.
parent 96910554
......@@ -182,8 +182,8 @@ char *mgt_VccCompile(struct cli *, struct vclprog *, const char *vclname,
const char *vclsrc, const char *vclsrcfile, int C_flag);
void mgt_vcl_init(void);
void mgt_vcl_startup(struct cli *, const char *b_arg, const char *f_arg,
const char *vclsrc, int Cflag);
void mgt_vcl_startup(struct cli *, const char *vclsrc, const char *origin,
const char *vclname, int Cflag);
int mgt_push_vcls_and_start(struct cli *, unsigned *status, char **p);
void mgt_vcl_export_labels(struct vcc *);
int mgt_has_vcl(void);
......
......@@ -52,6 +52,7 @@
#include "vin.h"
#include "vpf.h"
#include "vrnd.h"
#include "vsb.h"
#include "vsha256.h"
#include "vsub.h"
#include "vtim.h"
......@@ -430,15 +431,23 @@ mgt_uptime(const struct vev *e, int what)
/*--------------------------------------------------------------------*/
struct f_arg {
unsigned magic;
#define F_ARG_MAGIC 0x840649a8
char *farg;
char *src;
VTAILQ_ENTRY(f_arg) list;
};
int
main(int argc, char * const *argv)
{
int o, eric_fd = -1;
unsigned C_flag = 0;
unsigned f_flag = 0;
unsigned F_flag = 0;
unsigned V_flag = 0;
const char *b_arg = NULL;
const char *f_arg = NULL;
const char *i_arg = NULL;
const char *j_arg = NULL;
const char *h_arg = "critbit";
......@@ -451,7 +460,7 @@ main(int argc, char * const *argv)
const char *x_arg = NULL;
int s_arg_given = 0;
const char *T_arg = "localhost:0";
char *p, *vcl = NULL;
char *p;
struct cli cli[1];
char *dirname;
char **av;
......@@ -460,6 +469,9 @@ main(int argc, char * const *argv)
unsigned u;
struct sigaction sac;
struct vev *e;
struct f_arg *fa;
struct vsb *vsb;
VTAILQ_HEAD(,f_arg) f_args = VTAILQ_HEAD_INITIALIZER(f_args);
setbuf(stdout, NULL);
setbuf(stderr, NULL);
......@@ -486,7 +498,7 @@ main(int argc, char * const *argv)
d_flag++;
break;
case 'f':
f_arg = optarg;
f_flag = 1;
break;
case 'F':
F_flag = 1;
......@@ -521,13 +533,13 @@ main(int argc, char * const *argv)
exit(0);
}
if (b_arg != NULL && f_arg != NULL)
if (b_arg != NULL && f_flag)
ARGV_ERR("Only one of -b or -f can be specified\n");
if (d_flag && F_flag)
ARGV_ERR("Only one of -d or -F can be specified\n");
if (C_flag && b_arg == NULL && (f_arg == NULL || *f_arg == '\0'))
if (C_flag && b_arg == NULL && !f_flag)
ARGV_ERR("-C needs either -b <backend> or -f <vcl_file>\n");
if (d_flag && C_flag)
......@@ -536,12 +548,9 @@ main(int argc, char * const *argv)
if (F_flag && C_flag)
ARGV_ERR("-F makes no sense with -C\n");
if (!d_flag && b_arg == NULL && f_arg == NULL)
if (!d_flag && b_arg == NULL && !f_flag)
ARGV_ERR("Neither -b nor -f given. (use -f '' to override)\n");
if (f_arg != NULL && *f_arg == '\0')
f_arg = NULL;
/*
* Start out by closing all unwanted file descriptors we might
* have inherited from sloppy process control daemons.
......@@ -582,10 +591,8 @@ main(int argc, char * const *argv)
optreset = 1;
while ((o = getopt(argc, argv, opt_spec)) != -1) {
switch (o) {
case 'b':
case 'C':
case 'd':
case 'f':
case 'F':
case 'j':
case 'V':
......@@ -595,6 +602,34 @@ main(int argc, char * const *argv)
case 'a':
MAC_Arg(optarg);
break;
case 'b':
ALLOC_OBJ(fa, F_ARG_MAGIC);
AN(fa);
REPLACE(fa->farg, "<-b argument>");
vsb = VSB_new_auto();
AN(vsb);
VSB_printf(vsb, "vcl 4.0;\n");
VSB_printf(vsb, "backend default {\n");
VSB_printf(vsb, " .host = \"%s\";\n", optarg);
VSB_printf(vsb, "}\n");
AZ(VSB_finish(vsb));
fa->src = strdup(VSB_data(vsb));
AN(fa->src);
VSB_destroy(&vsb);
VTAILQ_INSERT_TAIL(&f_args, fa, list);
break;
case 'f':
if (*optarg == '\0')
break;
ALLOC_OBJ(fa, F_ARG_MAGIC);
AN(fa);
REPLACE(fa->farg, optarg);
fa->src = VFIL_readfile(NULL, fa->farg, NULL);
if (fa->src == NULL)
ARGV_ERR("Cannot read -f file (%s): %s\n",
fa->farg, strerror(errno));
VTAILQ_INSERT_TAIL(&f_args, fa, list);
break;
case 'h':
h_arg = optarg;
break;
......@@ -679,7 +714,6 @@ main(int argc, char * const *argv)
}
assert(d_flag == 0 || F_flag == 0);
assert(b_arg == NULL || f_arg == NULL);
if (S_arg != NULL && !strcmp(S_arg, "none")) {
fprintf(stderr,
......@@ -694,13 +728,6 @@ main(int argc, char * const *argv)
VJ_master(JAIL_MASTER_LOW);
}
if (f_arg != NULL) {
vcl = VFIL_readfile(NULL, f_arg, NULL);
if (vcl == NULL)
ARGV_ERR("Cannot read -f file (%s): %s\n",
f_arg, strerror(errno));
}
if (VIN_N_Arg(n_arg, &heritage.name, &dirname, NULL) != 0)
ARGV_ERR("Invalid instance (-n) name: %s\n", strerror(errno));
......@@ -729,19 +756,29 @@ main(int argc, char * const *argv)
mgt_vcl_init();
if (b_arg != NULL || f_arg != NULL) {
mgt_vcl_startup(cli, b_arg, f_arg, vcl, C_flag);
if (C_flag) {
if (Cn_arg == n_arg)
(void)rmdir(Cn_arg);
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);
AZ(VSB_finish(cli->sb));
fprintf(stderr, "%s\n", VSB_data(cli->sb));
exit(cli->result == CLIS_OK ? 0 : 2);
VSB_clear(cli->sb);
}
(void)rmdir(Cn_arg);
exit(cli->result == CLIS_OK ? 0 : 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);
cli_check(cli);
free(fa->src);
FREE_OBJ(fa);
}
cli_check(cli);
free(vcl);
}
AZ(C_flag);
if (VTAILQ_EMPTY(&heritage.socks))
MAC_Arg(":80");
......
......@@ -369,25 +369,20 @@ mgt_new_vcl(struct cli *cli, const char *vclname, const char *vclsrc,
/*--------------------------------------------------------------------*/
void
mgt_vcl_startup(struct cli *cli, const char *b_arg, const char *f_arg,
const char *vclsrc, int C_flag)
mgt_vcl_startup(struct cli *cli, const char *vclsrc, const char *vclname,
const char *origin, int C_flag)
{
char buf[BUFSIZ];
char buf[20];
static int n = 0;
if (b_arg == NULL) {
AN(vclsrc);
AN(f_arg);
mgt_new_vcl(cli, "boot", vclsrc, f_arg, NULL, C_flag);
return;
AN(vclsrc);
AN(origin);
if (vclname == NULL) {
bprintf(buf, "boot%d", n++);
vclname = buf;
}
AZ(vclsrc);
bprintf(buf,
"vcl 4.0;\n"
"backend default {\n"
" .host = \"%s\";\n"
"}\n", b_arg);
mgt_new_vcl(cli, "boot", buf, "<-b argument>", NULL, C_flag);
mgt_new_vcl(cli, vclname, vclsrc, origin, NULL, C_flag);
active_vcl = mcf_vcl_byname(vclname);
}
/*--------------------------------------------------------------------*/
......
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