r1576 - in trunk/varnish-cache: bin/varnishd include lib/libvcl
phk at projects.linpro.no
phk at projects.linpro.no
Tue Jun 26 12:01:49 CEST 2007
Author: phk
Date: 2007-06-26 12:01:49 +0200 (Tue, 26 Jun 2007)
New Revision: 1576
Modified:
trunk/varnish-cache/bin/varnishd/cache_vrt.c
trunk/varnish-cache/include/vrt_obj.h
trunk/varnish-cache/lib/libvcl/vcc_action.c
trunk/varnish-cache/lib/libvcl/vcc_compile.h
trunk/varnish-cache/lib/libvcl/vcc_gen_obj.tcl
trunk/varnish-cache/lib/libvcl/vcc_obj.c
trunk/varnish-cache/lib/libvcl/vcc_var.c
Log:
Markup all VCL variables as RO, WO or RW and generate and check code
accordingly.
Modified: trunk/varnish-cache/bin/varnishd/cache_vrt.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_vrt.c 2007-06-26 09:37:18 UTC (rev 1575)
+++ trunk/varnish-cache/bin/varnishd/cache_vrt.c 2007-06-26 10:01:49 UTC (rev 1576)
@@ -152,13 +152,6 @@
CHECK_OBJ_NOTNULL(be, BACKEND_MAGIC); \
be->field = a; \
} \
- \
-type \
-VRT_r_backend_##onm(struct backend *be) \
-{ \
- CHECK_OBJ_NOTNULL(be, BACKEND_MAGIC); \
- return (be->field); \
-}
VBACKEND(const char *, host, hostname)
VBACKEND(const char *, port, portname)
Modified: trunk/varnish-cache/include/vrt_obj.h
===================================================================
--- trunk/varnish-cache/include/vrt_obj.h 2007-06-26 09:37:18 UTC (rev 1575)
+++ trunk/varnish-cache/include/vrt_obj.h 2007-06-26 10:01:49 UTC (rev 1576)
@@ -6,29 +6,17 @@
* Edit vcc_gen_obj.tcl instead
*/
-const char * VRT_r_backend_host(struct backend *);
void VRT_l_backend_host(struct backend *, const char *);
-const char * VRT_r_backend_port(struct backend *);
void VRT_l_backend_port(struct backend *, const char *);
-double VRT_r_backend_dnsttl(struct backend *);
void VRT_l_backend_dnsttl(struct backend *, double);
struct sockaddr * VRT_r_client_ip(struct sess *);
-void VRT_l_client_ip(struct sess *, struct sockaddr *);
struct sockaddr * VRT_r_server_ip(struct sess *);
-void VRT_l_server_ip(struct sess *, struct sockaddr *);
const char * VRT_r_req_request(struct sess *);
-void VRT_l_req_request(struct sess *, const char *);
-const char * VRT_r_req_host(struct sess *);
-void VRT_l_req_host(struct sess *, const char *);
const char * VRT_r_req_url(struct sess *);
-void VRT_l_req_url(struct sess *, const char *);
const char * VRT_r_req_proto(struct sess *);
-void VRT_l_req_proto(struct sess *, const char *);
struct backend * VRT_r_req_backend(struct sess *);
void VRT_l_req_backend(struct sess *, struct backend *);
const char * VRT_r_req_http_(struct sess *);
-void VRT_l_req_http_(struct sess *, const char *);
-const char * VRT_r_req_hash(struct sess *);
void VRT_l_req_hash(struct sess *, const char *);
unsigned VRT_r_obj_valid(struct sess *);
void VRT_l_obj_valid(struct sess *, unsigned);
@@ -37,10 +25,6 @@
double VRT_r_obj_ttl(struct sess *);
void VRT_l_obj_ttl(struct sess *, double);
const char * VRT_r_resp_proto(struct sess *);
-void VRT_l_resp_proto(struct sess *, const char *);
int VRT_r_resp_status(struct sess *);
-void VRT_l_resp_status(struct sess *, int);
const char * VRT_r_resp_response(struct sess *);
-void VRT_l_resp_response(struct sess *, const char *);
const char * VRT_r_resp_http_(struct sess *);
-void VRT_l_resp_http_(struct sess *, const char *);
Modified: trunk/varnish-cache/lib/libvcl/vcc_action.c
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcc_action.c 2007-06-26 09:37:18 UTC (rev 1575)
+++ trunk/varnish-cache/lib/libvcl/vcc_action.c 2007-06-26 10:01:49 UTC (rev 1576)
@@ -105,6 +105,12 @@
vp = vcc_FindVar(tl, tl->t, vcc_vars);
ERRCHK(tl);
assert(vp != NULL);
+ if (vp->access != V_RW && vp->access != V_WO) {
+ vsb_printf(tl->sb, "Variable %.*s cannot be written.\n",
+ PF(vt));
+ vcc_ErrWhere(tl, vt);
+ return;
+ }
Fb(tl, 1, "%s", vp->lname);
vcc_NextToken(tl);
switch (vp->fmt) {
Modified: trunk/varnish-cache/lib/libvcl/vcc_compile.h
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcc_compile.h 2007-06-26 09:37:18 UTC (rev 1575)
+++ trunk/varnish-cache/lib/libvcl/vcc_compile.h 2007-06-26 10:01:49 UTC (rev 1576)
@@ -120,6 +120,7 @@
unsigned len;
const char *rname;
const char *lname;
+ enum {V_RO, V_RW, V_WO} access;
unsigned methods;
};
Modified: trunk/varnish-cache/lib/libvcl/vcc_gen_obj.tcl
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcc_gen_obj.tcl 2007-06-26 09:37:18 UTC (rev 1575)
+++ trunk/varnish-cache/lib/libvcl/vcc_gen_obj.tcl 2007-06-26 10:01:49 UTC (rev 1576)
@@ -32,30 +32,74 @@
# Objects which operate on backends
set beobj {
- { backend.host HOSTNAME }
- { backend.port PORTNAME }
- { backend.dnsttl TIME }
+ { backend.host WO HOSTNAME }
+ { backend.port WO PORTNAME }
+ { backend.dnsttl WO TIME }
}
# Objects which operate on sessions
set spobj {
- { client.ip IP {recv pipe pass hash miss hit fetch } }
- { server.ip IP {recv pipe pass hash miss hit fetch } }
- { req.request STRING {recv pipe pass hash miss hit fetch } }
- { req.host STRING {recv pipe pass hash miss hit fetch } }
- { req.url STRING {recv pipe pass hash miss hit fetch } }
- { req.proto STRING {recv pipe pass hash miss hit fetch } }
- { req.backend BACKEND {recv pipe pass hash miss hit fetch } }
- { req.http. HEADER {recv pipe pass hash miss hit fetch } }
- { req.hash HASH { hash } }
- { obj.valid BOOL { hit fetch discard timeout} }
- { obj.cacheable BOOL { hit fetch discard timeout} }
- { obj.ttl TIME { hit fetch discard timeout} }
- { resp.proto STRING { fetch } }
- { resp.status INT { fetch } }
- { resp.response STRING { fetch } }
- { resp.http. HEADER { fetch } }
+ { client.ip
+ RO IP
+ {recv pipe pass hash miss hit fetch }
+ }
+ { server.ip
+ RO IP
+ {recv pipe pass hash miss hit fetch }
+ }
+ { req.request
+ RO STRING
+ {recv pipe pass hash miss hit fetch }
+ }
+ { req.url
+ RO STRING
+ {recv pipe pass hash miss hit fetch }
+ }
+ { req.proto
+ RO STRING
+ {recv pipe pass hash miss hit fetch }
+ }
+ { req.backend
+ RW BACKEND
+ {recv pipe pass hash miss hit fetch }
+ }
+ { req.http.
+ RO HEADER
+ {recv pipe pass hash miss hit fetch }
+ }
+ { req.hash
+ WO HASH
+ { hash }
+ }
+ { obj.valid
+ RW BOOL
+ { hit fetch discard timeout}
+ }
+ { obj.cacheable
+ RW BOOL
+ { hit fetch discard timeout}
+ }
+ { obj.ttl
+ RW TIME
+ { hit fetch discard timeout}
+ }
+ { resp.proto
+ RO STRING
+ { fetch }
+ }
+ { resp.status
+ RO INT
+ { fetch }
+ }
+ { resp.response
+ RO STRING
+ { fetch }
+ }
+ { resp.http.
+ RO HEADER
+ { fetch }
+ }
}
set tt(IP) "struct sockaddr *"
@@ -105,15 +149,25 @@
foreach v $v {
set n [lindex $v 0]
regsub -all {[.]} $n "_" m
- set t [lindex $v 1]
+ set a [lindex $v 1]
+ set t [lindex $v 2]
puts $fo "\t\{ \"$n\", $t, [string length $n],"
- puts $fo "\t \"VRT_r_${m}($pa)\","
- puts $fo "\t \"VRT_l_${m}($pa, \","
- puts $fo "\t [method_map [lindex $v 2]]"
+ if {$a == "RO" || $a == "RW"} {
+ puts $fo "\t \"VRT_r_${m}($pa)\","
+ puts $fp "$tt($t) VRT_r_${m}($ty);"
+ } else {
+ puts $fo "\t NULL,"
+ }
+ if {$a == "WO" || $a == "RW"} {
+ puts $fo "\t \"VRT_l_${m}($pa, \","
+ puts $fp "void VRT_l_${m}($ty, $tt($t));"
+ } else {
+ puts $fo "\t NULL,"
+ }
+ puts $fo "\t V_$a,"
+ puts $fo "\t [method_map [lindex $v 3]]"
puts $fo "\t\},"
- puts $fp "$tt($t) VRT_r_${m}($ty);"
- puts $fp "void VRT_l_${m}($ty, $tt($t));"
}
puts $fo "\t{ NULL }"
}
Modified: trunk/varnish-cache/lib/libvcl/vcc_obj.c
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcc_obj.c 2007-06-26 09:37:18 UTC (rev 1575)
+++ trunk/varnish-cache/lib/libvcl/vcc_obj.c 2007-06-26 10:01:49 UTC (rev 1576)
@@ -11,18 +11,21 @@
struct var vcc_be_vars[] = {
{ "backend.host", HOSTNAME, 12,
- "VRT_r_backend_host(backend)",
+ NULL,
"VRT_l_backend_host(backend, ",
+ V_WO,
},
{ "backend.port", PORTNAME, 12,
- "VRT_r_backend_port(backend)",
+ NULL,
"VRT_l_backend_port(backend, ",
+ V_WO,
},
{ "backend.dnsttl", TIME, 14,
- "VRT_r_backend_dnsttl(backend)",
+ NULL,
"VRT_l_backend_dnsttl(backend, ",
+ V_WO,
},
{ NULL }
@@ -31,82 +34,92 @@
struct var vcc_vars[] = {
{ "client.ip", IP, 9,
"VRT_r_client_ip(sp)",
- "VRT_l_client_ip(sp, ",
+ NULL,
+ V_RO,
VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH
},
{ "server.ip", IP, 9,
"VRT_r_server_ip(sp)",
- "VRT_l_server_ip(sp, ",
+ NULL,
+ V_RO,
VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH
},
{ "req.request", STRING, 11,
"VRT_r_req_request(sp)",
- "VRT_l_req_request(sp, ",
+ NULL,
+ V_RO,
VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH
},
- { "req.host", STRING, 8,
- "VRT_r_req_host(sp)",
- "VRT_l_req_host(sp, ",
- VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH
- },
{ "req.url", STRING, 7,
"VRT_r_req_url(sp)",
- "VRT_l_req_url(sp, ",
+ NULL,
+ V_RO,
VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH
},
{ "req.proto", STRING, 9,
"VRT_r_req_proto(sp)",
- "VRT_l_req_proto(sp, ",
+ NULL,
+ V_RO,
VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH
},
{ "req.backend", BACKEND, 11,
"VRT_r_req_backend(sp)",
"VRT_l_req_backend(sp, ",
+ V_RW,
VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH
},
{ "req.http.", HEADER, 9,
"VRT_r_req_http_(sp)",
- "VRT_l_req_http_(sp, ",
+ NULL,
+ V_RO,
VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH
},
{ "req.hash", HASH, 8,
- "VRT_r_req_hash(sp)",
+ NULL,
"VRT_l_req_hash(sp, ",
+ V_WO,
VCL_MET_HASH
},
{ "obj.valid", BOOL, 9,
"VRT_r_obj_valid(sp)",
"VRT_l_obj_valid(sp, ",
+ V_RW,
VCL_MET_HIT | VCL_MET_FETCH | VCL_MET_DISCARD | VCL_MET_TIMEOUT
},
{ "obj.cacheable", BOOL, 13,
"VRT_r_obj_cacheable(sp)",
"VRT_l_obj_cacheable(sp, ",
+ V_RW,
VCL_MET_HIT | VCL_MET_FETCH | VCL_MET_DISCARD | VCL_MET_TIMEOUT
},
{ "obj.ttl", TIME, 7,
"VRT_r_obj_ttl(sp)",
"VRT_l_obj_ttl(sp, ",
+ V_RW,
VCL_MET_HIT | VCL_MET_FETCH | VCL_MET_DISCARD | VCL_MET_TIMEOUT
},
{ "resp.proto", STRING, 10,
"VRT_r_resp_proto(sp)",
- "VRT_l_resp_proto(sp, ",
+ NULL,
+ V_RO,
VCL_MET_FETCH
},
{ "resp.status", INT, 11,
"VRT_r_resp_status(sp)",
- "VRT_l_resp_status(sp, ",
+ NULL,
+ V_RO,
VCL_MET_FETCH
},
{ "resp.response", STRING, 13,
"VRT_r_resp_response(sp)",
- "VRT_l_resp_response(sp, ",
+ NULL,
+ V_RO,
VCL_MET_FETCH
},
{ "resp.http.", HEADER, 10,
"VRT_r_resp_http_(sp)",
- "VRT_l_resp_http_(sp, ",
+ NULL,
+ V_RO,
VCL_MET_FETCH
},
{ NULL }
Modified: trunk/varnish-cache/lib/libvcl/vcc_var.c
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcc_var.c 2007-06-26 09:37:18 UTC (rev 1575)
+++ trunk/varnish-cache/lib/libvcl/vcc_var.c 2007-06-26 10:01:49 UTC (rev 1576)
@@ -44,7 +44,6 @@
vcc_StringVal(struct tokenlist *tl)
{
struct var *vp;
- struct token *vt;
if (tl->t->tok == CSTR) {
EncToken(tl->fb, tl->t);
@@ -53,7 +52,6 @@
}
ExpectErr(tl, VAR);
ERRCHK(tl);
- vt = tl->t;
vp = vcc_FindVar(tl, tl->t, vcc_vars);
ERRCHK(tl);
switch (vp->fmt) {
More information about the varnish-commit
mailing list