Commit 3c11cfd2 authored by Dridi Boukelmoune's avatar Dridi Boukelmoune Committed by Lasse Karstensen

Make named ACLs available to VMODs

parent c4c50274
......@@ -115,7 +115,10 @@ language representation. Here is a description of them.
All but the PRIV and STRING_LIST types have typedefs: VCL_INT, VCL_REAL,
etc.
.. TODO document ACL if patchwork #314 is merged
ACL
C-type: ``const struct vrt_acl *``
A type for named ACLs declared in VCL.
BACKEND
C-type: ``const struct director *``
......
......@@ -474,7 +474,7 @@ void
vcc_ParseAcl(struct vcc *tl)
{
struct token *an;
int i;
struct symbol *sym;
char acln[1024];
vcc_NextToken(tl);
......@@ -490,13 +490,20 @@ vcc_ParseAcl(struct vcc *tl)
an = tl->t;
vcc_NextToken(tl);
i = vcc_AddDef(tl, an, SYM_ACL);
if (i > 1) {
bprintf(acln, "%.*s", PF(an));
sym = VCC_GetSymbolTok(tl, an, SYM_ACL);
AN(sym);
if (sym->ndef > 0) {
VSB_printf(tl->sb, "ACL %.*s redefined\n", PF(an));
vcc_ErrWhere(tl, an);
return;
}
bprintf(acln, "%.*s", PF(an));
sym->fmt = ACL;
sym->eval = vcc_Eval_Acl;
sym->eval_priv = TlDup(tl, acln);
sym->ndef++;
ERRCHK(tl);
SkipToken(tl, '{');
......
......@@ -288,6 +288,7 @@ sym_expr_t vcc_Eval_Var;
sym_expr_t vcc_Eval_SymFunc;
void vcc_Eval_Func(struct vcc *tl, const char *cfunc, const char *extra,
const char *name, const char *args);
sym_expr_t vcc_Eval_Acl;
sym_expr_t vcc_Eval_Backend;
sym_expr_t vcc_Eval_Probe;
......
......@@ -490,6 +490,24 @@ vcc_Eval_BoolConst(struct vcc *tl, struct expr **e, const struct symbol *sym)
(*e)->constant = EXPR_CONST;
}
/*--------------------------------------------------------------------
*/
void
vcc_Eval_Acl(struct vcc *tl, struct expr **e, const struct symbol *sym)
{
assert(sym->kind == SYM_ACL);
AN(sym->eval_priv);
vcc_ExpectCid(tl);
vcc_AddRef(tl, tl->t, SYM_ACL);
*e = vcc_mk_expr(ACL, "&vrt_acl_named_%s",
(const char *)sym->eval_priv);
(*e)->constant = EXPR_VAR; /* XXX ? */
vcc_NextToken(tl);
}
/*--------------------------------------------------------------------
*/
......@@ -498,6 +516,7 @@ vcc_Eval_Backend(struct vcc *tl, struct expr **e, const struct symbol *sym)
{
assert(sym->kind == SYM_BACKEND);
AN(sym->eval_priv);
vcc_ExpectCid(tl);
vcc_AddRef(tl, tl->t, SYM_BACKEND);
......@@ -800,6 +819,7 @@ vcc_expr4(struct vcc *tl, struct expr **e, enum var_type fmt)
struct expr *e1, *e2;
const char *ip;
const struct symbol *sym;
enum symkind kind;
double d;
int i;
......@@ -819,10 +839,14 @@ vcc_expr4(struct vcc *tl, struct expr **e, enum var_type fmt)
* XXX: look for SYM_VAR first for consistency ?
*/
sym = NULL;
if (fmt == BACKEND)
sym = VCC_FindSymbol(tl, tl->t, SYM_BACKEND);
if (fmt == PROBE)
sym = VCC_FindSymbol(tl, tl->t, SYM_PROBE);
switch (fmt) {
case ACL: kind = SYM_ACL; break;
case BACKEND: kind = SYM_BACKEND; break;
case PROBE: kind = SYM_PROBE; break;
default: kind = SYM_NONE; break;
}
if (kind != SYM_NONE)
sym = VCC_FindSymbol(tl, tl->t, kind);
if (sym == NULL)
sym = VCC_FindSymbol(tl, tl->t, SYM_VAR);
if (sym == NULL)
......@@ -841,6 +865,7 @@ vcc_expr4(struct vcc *tl, struct expr **e, enum var_type fmt)
switch(sym->kind) {
case SYM_VAR:
case SYM_FUNC:
case SYM_ACL:
case SYM_BACKEND:
case SYM_PROBE:
AN(sym->eval);
......
......@@ -46,6 +46,7 @@ from os.path import dirname, realpath, exists
from pprint import pprint, pformat
ctypes = {
'ACL': "VCL_ACL",
'BACKEND': "VCL_BACKEND",
'BLOB': "VCL_BLOB",
'BOOL': "VCL_BOOL",
......
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