Commit 5dd668e3 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Make the test and real opens of compiled VCL's use the same code.

Move the meat of the 'test-load' to cache_vcl.c, so that vcl.h can
become a worker-only include file.
parent 74fba61a
......@@ -154,6 +154,79 @@ VCL_Rel(struct VCL_conf **vcc)
/*--------------------------------------------------------------------*/
static struct vcls *
VCL_Open(const char *fn, struct vsb *msg)
{
struct vcls *vcl;
void *dlh;
struct VCL_conf const *cnf;
AN(fn);
AN(msg);
dlh = dlopen(fn, RTLD_NOW | RTLD_LOCAL);
if (dlh == NULL) {
VSB_printf(msg, "Could not load compiled VCL.\n");
VSB_printf(msg, "\tdlopen(%s) = %s\n", fn, dlerror());
return (NULL);
}
cnf = dlsym(dlh, "VCL_conf");
if (cnf == NULL) {
VSB_printf(msg, "Compiled VCL lacks metadata.\n");
(void)dlclose(dlh);
return (NULL);
}
if (cnf->magic != VCL_CONF_MAGIC) {
VSB_printf(msg, "Compiled VCL has mangled metadata.\n");
(void)dlclose(dlh);
return (NULL);
}
ALLOC_OBJ(vcl, VVCLS_MAGIC);
AN(vcl);
vcl->dlh = dlh;
memcpy(vcl->conf, cnf, sizeof *cnf);
return (vcl);
}
static void
VCL_Close(struct vcls **vclp)
{
struct vcls *vcl;
CHECK_OBJ_NOTNULL(*vclp, VVCLS_MAGIC);
vcl = *vclp;
*vclp = NULL;
AZ(dlclose(vcl->dlh));
FREE_OBJ(vcl);
}
/*--------------------------------------------------------------------
* NB: This function is called from the test-load subprocess.
*/
int
VCL_TestLoad(const char *fn)
{
struct vsb *vsb;
struct vcls *vcl;
int retval = 0;
AN(fn);
vsb = VSB_new_auto();
AN(vsb);
vcl = VCL_Open(fn, vsb);
if (vcl == NULL) {
AZ(VSB_finish(vsb));
fprintf(stderr, "%s", VSB_data(vsb));
retval = -1;
} else
VCL_Close(&vcl);
VSB_delete(vsb);
return (retval);
}
/*--------------------------------------------------------------------*/
static struct vcls *
vcl_find(const char *name)
{
......@@ -194,7 +267,6 @@ static int
VCL_Load(struct cli *cli, const char *name, const char *fn, const char *state)
{
struct vcls *vcl;
struct VCL_conf const *cnf;
struct vrt_ctx ctx;
unsigned hand = 0;
struct vsb *vsb;
......@@ -208,41 +280,26 @@ VCL_Load(struct cli *cli, const char *name, const char *fn, const char *state)
return (1);
}
ALLOC_OBJ(vcl, VVCLS_MAGIC);
AN(vcl);
vcl->dlh = dlopen(fn, RTLD_NOW | RTLD_LOCAL);
vsb = VSB_new_auto();
AN(vsb);
if (vcl->dlh == NULL) {
VCLI_Out(cli, "dlopen(%s): %s\n", fn, dlerror());
FREE_OBJ(vcl);
return (1);
}
cnf = dlsym(vcl->dlh, "VCL_conf");
if (cnf == NULL) {
VCLI_Out(cli, "Internal error: No VCL_conf symbol\n");
(void)dlclose(vcl->dlh);
FREE_OBJ(vcl);
vcl = VCL_Open(fn, vsb);
if (vcl == NULL) {
AZ(VSB_finish(vsb));
VCLI_Out(cli, "%s", VSB_data(vsb));
VSB_delete(vsb);
return (1);
}
memcpy(vcl->conf, cnf, sizeof *cnf);
vcl->conf->loaded_name = strdup(name);
XXXAN(vcl->conf->loaded_name);
if (vcl->conf->magic != VCL_CONF_MAGIC) {
VCLI_Out(cli, "Wrong VCL_CONF_MAGIC\n");
(void)dlclose(vcl->dlh);
FREE_OBJ(vcl);
return (1);
}
INIT_OBJ(&ctx, VRT_CTX_MAGIC);
ctx.method = VCL_MET_INIT;
ctx.handling = &hand;
ctx.vcl = vcl->conf;
vsb = VSB_new_auto();
AN(vsb);
VSB_clear(vsb);
ctx.msg = vsb;
i = vcl->conf->event_vcl(&ctx, VCL_EVENT_LOAD);
AZ(VSB_finish(vsb));
......@@ -251,8 +308,7 @@ VCL_Load(struct cli *cli, const char *name, const char *fn, const char *state)
if (VSB_len(vsb))
VCLI_Out(cli, "\nMessage:\n\t%s", VSB_data(vsb));
AZ(vcl->conf->event_vcl(&ctx, VCL_EVENT_DISCARD));
(void)dlclose(vcl->dlh);
FREE_OBJ(vcl);
VCL_Close(&vcl);
VSB_delete(vsb);
return (1);
}
......@@ -292,8 +348,7 @@ VCL_Nuke(struct vcls *vcl)
ctx.vcl = vcl->conf;
AZ(vcl->conf->event_vcl(&ctx, VCL_EVENT_DISCARD));
free(vcl->conf->loaded_name);
(void)dlclose(vcl->dlh);
FREE_OBJ(vcl);
VCL_Close(&vcl);
VSC_C_main->n_vcl--;
VSC_C_main->n_vcl_discard--;
}
......
......@@ -105,6 +105,8 @@ void mgt_child_inherit(int fd, const char *what);
#define NEEDLESS_RETURN(foo) return (foo)
/* cache/cache_vcl.c */
int VCL_TestLoad(const char *);
/* vsm.c */
struct vsm_sc;
......
......@@ -44,7 +44,6 @@
#include "mgt/mgt.h"
#include "libvcc.h"
#include "vcl.h"
#include "vcli.h"
#include "vcli_priv.h"
#include "vfil.h"
......@@ -184,37 +183,12 @@ run_cc(void *priv)
static void __match_proto__(vsub_func_f)
run_dlopen(void *priv)
{
void *dlh;
struct VCL_conf const *cnf;
struct vcc_priv *vp;
VJ_subproc(JAIL_SUBPROC_VCLLOAD);
CAST_OBJ_NOTNULL(vp, priv, VCC_PRIV_MAGIC);
/* Try to load the object into this sub-process */
if ((dlh = dlopen(vp->libfile, RTLD_NOW | RTLD_LOCAL)) == NULL) {
fprintf(stderr, "Compiled VCL program failed to load:\n %s\n",
dlerror());
exit(1);
}
cnf = dlsym(dlh, "VCL_conf");
if (cnf == NULL) {
fprintf(stderr, "Compiled VCL program, metadata not found\n");
if (VCL_TestLoad(vp->libfile))
exit(1);
}
if (cnf->magic != VCL_CONF_MAGIC) {
fprintf(stderr, "Compiled VCL program, mangled metadata\n");
exit(1);
}
if (dlclose(dlh)) {
fprintf(stderr,
"Compiled VCL program failed to unload:\n %s\n",
dlerror());
exit(1);
}
exit(0);
}
......
......@@ -41,7 +41,6 @@
#include "mgt/mgt.h"
#include "common/params.h"
#include "vcl.h"
#include "vcli.h"
#include "vcli_priv.h"
#include "vev.h"
......
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