cache_pipe.c \
cache_shmlog.c \
cache_vcl.c \
+ cache_vrt.c \
cli_event.c \
hash_simple_list.c \
mgt_child.c \
/*--------------------------------------------------------------------*/
-void
-VCL_error(VCL_FARGS, unsigned err, const char *str)
-{
-
- VSL(SLT_Debug, 0, "VCL_error(%u, %s)", err, str);
-}
-
-void
-VCL_count(struct sess *sp, unsigned u)
-{
-
- VSL(SLT_VCL, 0, "%u %d.%d", u,
- sp->vcl->ref[u].line,
- sp->vcl->ref[u].pos);
-}
-
-/*--------------------------------------------------------------------*/
-
static const char *
HandlingName(unsigned u)
{
VCL_method(miss, HND_Error|HND_Pass|HND_Pipe|HND_Fetch)
VCL_method(hit, HND_Error|HND_Pass|HND_Pipe|HND_Deliver)
VCL_method(fetch, HND_Error|HND_Pass|HND_Pipe|HND_Insert)
-
-/*--------------------------------------------------------------------*/
-
-char *
-VCL_GetHdr(VCL_FARGS, const char *n)
-{
- char *p;
-
- assert(sess != NULL);
- assert(sess->http != NULL);
- if (!http_GetHdr(sess->http, n, &p))
- return (NULL);
- return (p);
-}
-
-char *
-VCL_GetReq(VCL_FARGS)
-{
- char *p;
-
- assert(sess != NULL);
- assert(sess->http != NULL);
- assert(http_GetReq(sess->http, &p));
- return (p);
-}
--- /dev/null
+/*
+ * $Id$
+ *
+ * Runtime support for compiled VCL programs
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <dlfcn.h>
+#include <sys/queue.h>
+
+#include "cli.h"
+#include "cli_priv.h"
+#include "shmlog.h"
+#include "vcl_lang.h"
+#include "vrt.h"
+#include "libvarnish.h"
+#include "cache.h"
+
+/*--------------------------------------------------------------------*/
+
+void
+VRT_error(VCL_FARGS, unsigned err, const char *str)
+{
+
+ VSL(SLT_Debug, 0, "VCL_error(%u, %s)", err, str);
+}
+
+/*--------------------------------------------------------------------*/
+
+void
+VRT_count(struct sess *sp, unsigned u)
+{
+
+ VSL(SLT_VCL, 0, "%u %d.%d", u,
+ sp->vcl->ref[u].line,
+ sp->vcl->ref[u].pos);
+}
+
+/*--------------------------------------------------------------------*/
+
+char *
+VRT_GetHdr(VCL_FARGS, const char *n)
+{
+ char *p;
+
+ assert(sess != NULL);
+ assert(sess->http != NULL);
+ if (!http_GetHdr(sess->http, n, &p))
+ return (NULL);
+ return (p);
+}
+
+/*--------------------------------------------------------------------*/
+
+char *
+VRT_GetReq(VCL_FARGS)
+{
+ char *p;
+
+ assert(sess != NULL);
+ assert(sess->http != NULL);
+ assert(http_GetReq(sess->http, &p));
+ return (p);
+}
struct sess;
typedef void sesscb_f(struct sess *sp);
-struct vcl_ref {
- unsigned line;
- unsigned pos;
- unsigned count;
- const char *token;
-};
-
-struct vcl_acl {
- unsigned ip;
- unsigned mask;
-};
-
#define VCA_ADDRBUFSIZE 32
struct object {
#define VCL_FARGS struct sess *sess
#define VCL_PASS_ARGS sess
-void VCL_count(struct sess *, unsigned);
-void VCL_no_cache(VCL_FARGS);
-void VCL_no_new_cache(VCL_FARGS);
+#if 0
int ip_match(unsigned, struct vcl_acl *);
int string_match(const char *, const char *);
-int VCL_rewrite(const char *, const char *);
-void VCL_error(VCL_FARGS, unsigned, const char *);
-int VCL_switch_config(const char *);
-
-char *VCL_GetHdr(VCL_FARGS, const char *);
-char *VCL_GetReq(VCL_FARGS);
+#endif
typedef void vcl_init_f(void);
typedef void vcl_func_f(VCL_FARGS);
vcl_func_f *miss_func;
vcl_func_f *fetch_func;
struct backend *default_backend;
- struct vcl_ref *ref;
+ struct vrt_ref *ref;
unsigned nref;
unsigned busy;
};
-
-#define VCL_done(sess, hand) \
- do { \
- sess->handling = hand; \
- sess->done = 1; \
- return; \
- } while (0)
--- /dev/null
+/* $Id$ */
+/*
+ * Runtime support for compiled VCL programs.
+ *
+ * XXX: When this file is changed, lib/libvcl/vcl_gen_fixed_token.tcl
+ * XXX: *MUST* be rerun.
+ */
+
+struct vrt_ref {
+ unsigned line;
+ unsigned pos;
+ unsigned count;
+ const char *token;
+};
+
+struct vrt_acl {
+ unsigned ip;
+ unsigned mask;
+};
+
+void VRT_count(struct sess *, unsigned);
+void VRT_no_cache(VCL_FARGS);
+void VRT_no_new_cache(VCL_FARGS);
+#if 0
+int ip_match(unsigned, struct vcl_acl *);
+int string_match(const char *, const char *);
+#endif
+int VRT_rewrite(const char *, const char *);
+void VRT_error(VCL_FARGS, unsigned, const char *);
+int VRT_switch_config(const char *);
+
+char *VRT_GetHdr(VCL_FARGS, const char *);
+char *VRT_GetReq(VCL_FARGS);
+
+#define VRT_done(sess, hand) \
+ do { \
+ sess->handling = hand; \
+ sess->done = 1; \
+ return; \
+ } while (0)
static struct var vars[] = {
- { "req.request", STRING, 0, "VCL_GetReq(VCL_PASS_ARGS)" },
+ { "req.request", STRING, 0, "VRT_GetReq(VCL_PASS_ARGS)" },
{ "obj.valid", BOOL, 0, "sess->obj->valid" },
{ "obj.cacheable", BOOL, 0, "sess->obj->cacheable" },
{ "req.http.", HEADER, 0, NULL },
#define C(tl, sep) do { \
I(tl); \
- sbuf_printf(tl->fc, "VCL_count(sess, %u)%s\n", ++tl->cnt, sep); \
+ sbuf_printf(tl->fc, "VRT_count(sess, %u)%s\n", ++tl->cnt, sep); \
tl->t->cnt = tl->cnt; \
} while (0)
p[i] = '\0';
v->name = p;
v->fmt = STRING;
- asprintf(&p, "VCL_GetHdr(VCL_PASS_ARGS, \"%s\")", v->name + vh->len);
+ asprintf(&p, "VRT_GetHdr(VCL_PASS_ARGS, \"%s\")", v->name + vh->len);
assert(p != NULL);
v->cname = p;
return (v);
sbuf_printf(tl->fc, "VCL_no_cache(VCL_PASS_ARGS);\n");
return;
case T_DELIVER:
- I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Deliver);\n");
+ I(tl); sbuf_printf(tl->fc, "VRT_done(sess, HND_Deliver);\n");
return;
case T_LOOKUP:
- I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Lookup);\n");
+ I(tl); sbuf_printf(tl->fc, "VRT_done(sess, HND_Lookup);\n");
return;
case T_PASS:
- I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Pass);\n");
+ I(tl); sbuf_printf(tl->fc, "VRT_done(sess, HND_Pass);\n");
return;
case T_FETCH:
- I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Fetch);\n");
+ I(tl); sbuf_printf(tl->fc, "VRT_done(sess, HND_Fetch);\n");
return;
case T_INSERT:
- I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Insert);\n");
+ I(tl); sbuf_printf(tl->fc, "VRT_done(sess, HND_Insert);\n");
return;
case T_ERROR:
if (tl->t->tok == CNUM)
else
a = 0;
I(tl);
- sbuf_printf(tl->fc, "VCL_error(VCL_PASS_ARGS, %u, ", a);
+ sbuf_printf(tl->fc, "VRT_error(VCL_PASS_ARGS, %u, ", a);
if (tl->t->tok == CSTR) {
sbuf_printf(tl->fc, "%*.*s);\n",
tl->t->e - tl->t->b,
NextToken(tl);
} else
sbuf_printf(tl->fc, "(const char *)0);\n");
- I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Error);\n");
+ I(tl); sbuf_printf(tl->fc, "VRT_done(sess, HND_Error);\n");
return;
case T_SWITCH_CONFIG:
ExpectErr(tl, ID);
const char *p;
sbuf_printf(tl->fh,
- "#define VCL_NREFS %u\n", tl->cnt + 1);
+ "#define VGC_NREFS %u\n", tl->cnt + 1);
sbuf_printf(tl->fh,
- "static struct vcl_ref VCL_ref[VCL_NREFS];\n");
+ "static struct vrt_ref VGC_ref[VGC_NREFS];\n");
sbuf_printf(tl->fc,
- "static struct vcl_ref VCL_ref[VCL_NREFS] = {\n");
+ "static struct vrt_ref VGC_ref[VGC_NREFS] = {\n");
lin = 1;
pos = 0;
p = tl->b;
sbuf_printf(tl->fc,
"\t.default_backend = &VCL_backend_default,\n");
sbuf_printf(tl->fc,
- "\t.ref = VCL_ref,\n");
+ "\t.ref = VGC_ref,\n");
sbuf_printf(tl->fc,
- "\t.nref = VCL_NREFS,\n");
+ "\t.nref = VGC_NREFS,\n");
sbuf_printf(tl->fc, "};\n");
}
fputs("struct sess;\n", f);
fputs("typedef void sesscb_f(struct sess *sp);\n", f);
fputs("\n", f);
- fputs("struct vcl_ref {\n", f);
- fputs(" unsigned line;\n", f);
- fputs(" unsigned pos;\n", f);
- fputs(" unsigned count;\n", f);
- fputs(" const char *token;\n", f);
- fputs("};\n", f);
- fputs("\n", f);
- fputs("struct vcl_acl {\n", f);
- fputs(" unsigned ip;\n", f);
- fputs(" unsigned mask;\n", f);
- fputs("};\n", f);
- fputs("\n", f);
fputs("#define VCA_ADDRBUFSIZE 32\n", f);
fputs("\n", f);
fputs("struct object { \n", f);
fputs("#define VCL_FARGS struct sess *sess\n", f);
fputs("#define VCL_PASS_ARGS sess\n", f);
fputs("\n", f);
- fputs("void VCL_count(struct sess *, unsigned);\n", f);
- fputs("void VCL_no_cache(VCL_FARGS);\n", f);
- fputs("void VCL_no_new_cache(VCL_FARGS);\n", f);
+ fputs("#if 0\n", f);
fputs("int ip_match(unsigned, struct vcl_acl *);\n", f);
fputs("int string_match(const char *, const char *);\n", f);
- fputs("int VCL_rewrite(const char *, const char *);\n", f);
- fputs("void VCL_error(VCL_FARGS, unsigned, const char *);\n", f);
- fputs("int VCL_switch_config(const char *);\n", f);
- fputs("\n", f);
- fputs("char *VCL_GetHdr(VCL_FARGS, const char *);\n", f);
- fputs("char *VCL_GetReq(VCL_FARGS);\n", f);
+ fputs("#endif\n", f);
fputs("\n", f);
fputs("typedef void vcl_init_f(void);\n", f);
fputs("typedef void vcl_func_f(VCL_FARGS);\n", f);
fputs(" vcl_func_f *miss_func;\n", f);
fputs(" vcl_func_f *fetch_func;\n", f);
fputs(" struct backend *default_backend;\n", f);
- fputs(" struct vcl_ref *ref;\n", f);
+ fputs(" struct vrt_ref *ref;\n", f);
fputs(" unsigned nref;\n", f);
fputs(" unsigned busy;\n", f);
fputs("};\n", f);
+ fputs("/* $Id$ */\n", f);
+ fputs("/*\n", f);
+ fputs(" * Runtime support for compiled VCL programs.\n", f);
+ fputs(" *\n", f);
+ fputs(" * XXX: When this file is changed, lib/libvcl/vcl_gen_fixed_token.tcl\n", f);
+ fputs(" * XXX: *MUST* be rerun.\n", f);
+ fputs(" */\n", f);
+ fputs("\n", f);
+ fputs("struct vrt_ref {\n", f);
+ fputs(" unsigned line;\n", f);
+ fputs(" unsigned pos;\n", f);
+ fputs(" unsigned count;\n", f);
+ fputs(" const char *token;\n", f);
+ fputs("};\n", f);
+ fputs("\n", f);
+ fputs("struct vrt_acl {\n", f);
+ fputs(" unsigned ip;\n", f);
+ fputs(" unsigned mask;\n", f);
+ fputs("};\n", f);
+ fputs("\n", f);
+ fputs("void VRT_count(struct sess *, unsigned);\n", f);
+ fputs("void VRT_no_cache(VCL_FARGS);\n", f);
+ fputs("void VRT_no_new_cache(VCL_FARGS);\n", f);
+ fputs("#if 0\n", f);
+ fputs("int ip_match(unsigned, struct vcl_acl *);\n", f);
+ fputs("int string_match(const char *, const char *);\n", f);
+ fputs("#endif\n", f);
+ fputs("int VRT_rewrite(const char *, const char *);\n", f);
+ fputs("void VRT_error(VCL_FARGS, unsigned, const char *);\n", f);
+ fputs("int VRT_switch_config(const char *);\n", f);
+ fputs("\n", f);
+ fputs("char *VRT_GetHdr(VCL_FARGS, const char *);\n", f);
+ fputs("char *VRT_GetReq(VCL_FARGS);\n", f);
fputs("\n", f);
- fputs("#define VCL_done(sess, hand) \\\n", f);
+ fputs("#define VRT_done(sess, hand) \\\n", f);
fputs(" do { \\\n", f);
fputs(" sess->handling = hand; \\\n", f);
fputs(" sess->done = 1; \\\n", f);
}
puts $fo "}"
-set fi [open "../../include/vcl_lang.h"]
+
+
+proc copy_include {n} {
+ global fo
+
+ set fi [open $n]
+ while {[gets $fi a] >= 0} {
+ if {"$a" == "#include <http_headers.h>"} {
+ puts "FOO $a"
+ set fx [open "../../include/http_headers.h"]
+ while {[gets $fx b] >= 0} {
+ regsub -all {"} $b {\"} b
+ puts $fo "\tfputs(\"$b\\n\", f);"
+ }
+ close $fx
+ continue
+ }
+ regsub -all {\\} $a {\\\\} a
+ puts $fo "\tfputs(\"$a\\n\", f);"
+ }
+ close $fi
+}
puts $fo ""
puts $fo "void"
puts $fo "vcl_output_lang_h(FILE *f)"
puts $fo "{"
-while {[gets $fi a] >= 0} {
- if {"$a" == "#include <http_headers.h>"} {
- puts "FOO $a"
- set fx [open "../../include/http_headers.h"]
- while {[gets $fx b] >= 0} {
- regsub -all {"} $b {\"} b
- puts $fo "\tfputs(\"$b\\n\", f);"
- }
- close $fx
- continue
- }
- regsub -all {\\} $a {\\\\} a
- puts $fo "\tfputs(\"$a\\n\", f);"
-}
+copy_include ../../include/vcl_lang.h
+copy_include ../../include/vrt.h
+
puts $fo "}"
-close $fi
close $foh
close $fo