[master] 05d2f56 Make named ACLs available to VMODs
Dridi Boukelmoune
dridi.boukelmoune at gmail.com
Wed Feb 24 15:27:04 CET 2016
commit 05d2f561c61b90dc5d19b476fe03e9950380a0e7
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date: Tue Feb 23 17:55:13 2016 +0100
Make named ACLs available to VMODs
diff --git a/doc/sphinx/reference/vmod.rst b/doc/sphinx/reference/vmod.rst
index 40b7bf7..3020b5d 100644
--- a/doc/sphinx/reference/vmod.rst
+++ b/doc/sphinx/reference/vmod.rst
@@ -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 *``
diff --git a/lib/libvcc/vcc_acl.c b/lib/libvcc/vcc_acl.c
index 98f24d8..2fc5fa4 100644
--- a/lib/libvcc/vcc_acl.c
+++ b/lib/libvcc/vcc_acl.c
@@ -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, '{');
diff --git a/lib/libvcc/vcc_compile.h b/lib/libvcc/vcc_compile.h
index 7816a3e..20bc18c 100644
--- a/lib/libvcc/vcc_compile.h
+++ b/lib/libvcc/vcc_compile.h
@@ -286,6 +286,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;
diff --git a/lib/libvcc/vcc_expr.c b/lib/libvcc/vcc_expr.c
index af3b3e7..574ca53 100644
--- a/lib/libvcc/vcc_expr.c
+++ b/lib/libvcc/vcc_expr.c
@@ -494,10 +494,29 @@ vcc_Eval_BoolConst(struct vcc *tl, struct expr **e, const struct symbol *sym)
*/
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);
+}
+
+/*--------------------------------------------------------------------
+ */
+
+void
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);
diff --git a/lib/libvcc/vmodtool.py b/lib/libvcc/vmodtool.py
index bb29bd4..024d78a 100755
--- a/lib/libvcc/vmodtool.py
+++ b/lib/libvcc/vmodtool.py
@@ -46,6 +46,7 @@ from os.path import dirname, exists, join, realpath
from pprint import pprint, pformat
ctypes = {
+ 'ACL': "VCL_ACL",
'BACKEND': "VCL_BACKEND",
'BLOB': "VCL_BLOB",
'BOOL': "VCL_BOOL",
More information about the varnish-commit
mailing list