source: lib/libvcl/vcc_compile.h @ 3ecacd

Revision 3ecacd, 7.0 KB checked in by Poul-Henning Kamp <phk@…>, 4 years ago (diff)

If there is a backend or director named "default", make that the default,
otherwise use the first backend or director we find as default.

git-svn-id:  http://www.varnish-cache.org/svn/trunk/varnish-cache@4982 d4fa192b-c00b-0410-8231-f00ffab90ce4

  • Property mode set to 100644
Line 
1/*-
2 * Copyright (c) 2006 Verdens Gang AS
3 * Copyright (c) 2006-2009 Linpro AS
4 * All rights reserved.
5 *
6 * Author: Poul-Henning Kamp <phk@phk.freebsd.dk>
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * $Id$
30 */
31
32#include "vqueue.h"
33
34#include "vcl.h"
35
36#define INDENT          2
37
38struct acl_e;
39
40struct membit {
41        VTAILQ_ENTRY(membit)    list;
42        void                    *ptr;
43};
44
45struct source {
46        VTAILQ_ENTRY(source)    list;
47        char                    *name;
48        const char              *b;
49        const char              *e;
50        unsigned                idx;
51        char                    *freeit;
52};
53
54struct token {
55        unsigned                tok;
56        const char              *b;
57        const char              *e;
58        struct source           *src;
59        VTAILQ_ENTRY(token)     list;
60        unsigned                cnt;
61        char                    *dec;
62};
63
64VTAILQ_HEAD(tokenhead, token);
65
66struct tokenlist {
67        struct tokenhead        tokens;
68        VTAILQ_HEAD(, source)   sources;
69        VTAILQ_HEAD(, membit)   membits;
70        VTAILQ_HEAD(, host)     hosts;
71        unsigned                nsources;
72        struct source           *src;
73        struct token            *t;
74        int                     indent;
75        int                     hindent;
76        int                     iindent;
77        int                     findent;
78        unsigned                cnt;
79        struct vsb              *fc, *fh, *fi, *ff, *fb;
80        struct vsb              *fm[VCL_MET_MAX];
81        VTAILQ_HEAD(, ref)      refs;
82        struct vsb              *sb;
83        int                     err;
84        int                     ndirector;
85        VTAILQ_HEAD(, proc)     procs;
86        struct proc             *curproc;
87        struct proc             *mprocs[VCL_MET_MAX];
88
89        VTAILQ_HEAD(, acl_e)    acl;
90
91        int                     defaultdir;
92        struct token            *t_defaultdir;
93        struct token            *t_dir;
94        struct token            *t_policy;
95
96        unsigned                recnt;
97        unsigned                nsockaddr;
98};
99
100enum var_type {
101        BACKEND,
102        BOOL,
103        INT,
104        FLOAT,
105        SIZE,
106        TIME,
107        RTIME,
108        STRING,
109        IP,
110        HASH,
111        HEADER
112};
113
114enum ref_type {
115        R_FUNC,
116        R_ACL,
117        R_BACKEND
118};
119
120struct ref {
121        enum ref_type           type;
122        struct token            *name;
123        unsigned                defcnt;
124        unsigned                refcnt;
125        VTAILQ_ENTRY(ref)       list;
126};
127
128struct var {
129        const char              *name;
130        enum var_type           fmt;
131        unsigned                len;
132        const char              *rname;
133        unsigned                r_methods;
134        const char              *lname;
135        unsigned                l_methods;
136        const char              *hdr;
137};
138
139struct method {
140        const char              *name;
141        unsigned                ret_bitmap;
142        unsigned                bitval;
143};
144
145/*--------------------------------------------------------------------*/
146
147/* vcc_acl.c */
148
149void vcc_Acl(struct tokenlist *tl);
150void vcc_Cond_Ip(const struct var *vp, struct tokenlist *tl);
151
152/* vcc_action.c */
153int vcc_ParseAction(struct tokenlist *tl);
154
155/* vcc_backend.c */
156struct fld_spec;
157typedef void parsedirector_f(struct tokenlist *tl);
158
159void vcc_ParseDirector(struct tokenlist *tl);
160void vcc_ParseBackendHost(struct tokenlist *tl, int serial, char **nm);
161struct fld_spec * vcc_FldSpec(struct tokenlist *tl, const char *first, ...);
162void vcc_ResetFldSpec(struct fld_spec *f);
163void vcc_IsField(struct tokenlist *tl, struct token **t, struct fld_spec *fs);
164void vcc_FieldsOk(struct tokenlist *tl, const struct fld_spec *fs);
165
166/* vcc_compile.c */
167extern struct method method_tab[];
168/*
169 * H -> Header, before the C code
170 * C -> C-code
171 * B -> Body of function, ends up in C once function is completed
172 * I -> Initializer function
173 * F -> Finish function
174 */
175void Fh(const struct tokenlist *tl, int indent, const char *fmt, ...);
176void Fc(const struct tokenlist *tl, int indent, const char *fmt, ...);
177void Fb(const struct tokenlist *tl, int indent, const char *fmt, ...);
178void Fi(const struct tokenlist *tl, int indent, const char *fmt, ...);
179void Ff(const struct tokenlist *tl, int indent, const char *fmt, ...);
180void EncToken(struct vsb *sb, const struct token *t);
181int IsMethod(const struct token *t);
182void *TlAlloc(struct tokenlist *tl, unsigned len);
183
184/* vcc_dir_random.c */
185parsedirector_f vcc_ParseRandomDirector;
186
187/* vcc_dir_round_robin.c */
188parsedirector_f vcc_ParseRoundRobinDirector;
189
190/* vcc_obj.c */
191extern struct var vcc_vars[];
192
193/* vcc_parse.c */
194void vcc_Parse(struct tokenlist *tl);
195void vcc_RTimeVal(struct tokenlist *tl, double *);
196void vcc_TimeVal(struct tokenlist *tl, double *);
197void vcc_SizeVal(struct tokenlist *tl, double *);
198unsigned vcc_UintVal(struct tokenlist *tl);
199double vcc_DoubleVal(struct tokenlist *tl);
200
201/* vcc_string.c */
202char *vcc_regexp(struct tokenlist *tl);
203int vcc_StringVal(struct tokenlist *tl);
204void vcc_ExpectedStringval(struct tokenlist *tl);
205
206/* vcc_token.c */
207void vcc_Coord(const struct tokenlist *tl, struct vsb *vsb,
208    const struct token *t);
209void vcc_ErrToken(const struct tokenlist *tl, const struct token *t);
210void vcc_ErrWhere(struct tokenlist *tl, const struct token *t);
211void vcc__Expect(struct tokenlist *tl, unsigned tok, int line);
212int vcc_Teq(const struct token *t1, const struct token *t2);
213int vcc_IdIs(const struct token *t, const char *p);
214void vcc_ExpectCid(struct tokenlist *tl);
215void vcc_Lexer(struct tokenlist *tl, struct source *sp);
216void vcc_NextToken(struct tokenlist *tl);
217void vcc__ErrInternal(struct tokenlist *tl, const char *func,
218    unsigned line);
219void vcc_AddToken(struct tokenlist *tl, unsigned tok, const char *b,
220    const char *e);
221
222/* vcc_var.c */
223struct var *vcc_FindVar(struct tokenlist *tl, const struct token *t,
224    struct var *vl, int wr_access, const char *use);
225void vcc_VarVal(struct tokenlist *tl, const struct var *vp,
226    const struct token *vt);
227
228/* vcc_xref.c */
229void vcc_AddDef(struct tokenlist *tl, struct token *t, enum ref_type type);
230void vcc_AddRef(struct tokenlist *tl, struct token *t, enum ref_type type);
231int vcc_CheckReferences(struct tokenlist *tl);
232
233void vcc_AddCall(struct tokenlist *tl, struct token *t);
234struct proc *vcc_AddProc(struct tokenlist *tl, struct token *t);
235void vcc_ProcAction(struct proc *p, unsigned action, struct token *t);
236int vcc_CheckAction(struct tokenlist *tl);
237void vcc_AddUses(struct tokenlist *tl, const struct token *t, unsigned mask,
238    const char *use);
239int vcc_CheckUses(struct tokenlist *tl);
240
241#define ERRCHK(tl)      do { if ((tl)->err) return; } while (0)
242#define ErrInternal(tl) vcc__ErrInternal(tl, __func__, __LINE__)
243#define Expect(a, b) vcc__Expect(a, b, __LINE__)
244#define ExpectErr(a, b) \
245    do { vcc__Expect(a, b, __LINE__); ERRCHK(a);} while (0)
246#define SkipToken(a, b) \
247    do { vcc__Expect(a, b, __LINE__); ERRCHK(a); vcc_NextToken(a); } while (0)
Note: See TracBrowser for help on using the repository browser.