source: lib/libvcl/vcc_vmod.c @ c5c9e33

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

Eliminate a redundant include file

  • Property mode set to 100644
Line 
1/*-
2 * Copyright (c) 2010-2011 Varnish Software AS
3 * All rights reserved.
4 *
5 * Author: Poul-Henning Kamp <phk@phk.freebsd.dk>
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#include "config.h"
30
31#include <stdio.h>
32#include <dlfcn.h>
33#include <string.h>
34
35#include "vcc_compile.h"
36#include "vmod_abi.h"
37
38void
39vcc_ParseImport(struct vcc *tl)
40{
41        void *hdl;
42        char fn[1024];
43        struct token *mod, *t1;
44        const char *modname;
45        const char *proto;
46        const char *abi;
47        const char **spec;
48        struct symbol *sym;
49        const struct symbol *osym;
50        const char *p;
51        // int *modlen;
52
53        t1 = tl->t;
54        SkipToken(tl, ID);              /* "import" */
55
56        ExpectErr(tl, ID);
57        mod = tl->t;
58
59        vcc_NextToken(tl);
60
61        osym = VCC_FindSymbol(tl, mod, SYM_NONE);
62        if (osym != NULL && osym->kind != SYM_VMOD) {
63                VSB_printf(tl->sb, "Module %.*s conflics with other symbol.\n",
64                    PF(mod));
65                vcc_ErrWhere2(tl, t1, tl->t);
66                return;
67        }
68        if (osym != NULL) {
69                VSB_printf(tl->sb, "Module %.*s already imported.\n",
70                    PF(mod));
71                vcc_ErrWhere2(tl, t1, tl->t);
72                VSB_printf(tl->sb, "Previous import was here:\n");
73                vcc_ErrWhere2(tl, osym->def_b, osym->def_e);
74                return;
75        }
76
77        bprintf(fn, "%.*s", PF(mod));
78        sym = VCC_AddSymbolStr(tl, fn, SYM_VMOD);
79        ERRCHK(tl);
80        AN(sym);
81        sym->def_b = t1;
82        sym->def_e = tl->t;
83
84        if (tl->t->tok == ID) {
85                if (!vcc_IdIs(tl->t, "from")) {
86                        VSB_printf(tl->sb, "Expected 'from path...' at ");
87                        vcc_ErrToken(tl, tl->t);
88                        vcc_ErrWhere(tl, tl->t);
89                        return;
90                }
91                vcc_NextToken(tl);
92                ExpectErr(tl, CSTR);
93                bprintf(fn, "%s", tl->t->dec);
94                vcc_NextToken(tl);
95        } else {
96                bprintf(fn, "%s/libvmod_%.*s.so", tl->vmod_dir, PF(mod));
97        }
98
99        Fh(tl, 0, "static void *VGC_vmod_%.*s;\n", PF(mod));
100
101        Fi(tl, 0, "\tif (VRT_Vmod_Init(&VGC_vmod_%.*s,\n", PF(mod));
102        Fi(tl, 0, "\t    &Vmod_Func_%.*s,\n", PF(mod));
103        Fi(tl, 0, "\t    sizeof(Vmod_Func_%.*s),\n", PF(mod));
104        Fi(tl, 0, "\t    \"%.*s\",\n", PF(mod));
105        Fi(tl, 0, "\t    ");
106        EncString(tl->fi, fn, NULL, 0);
107        Fi(tl, 0, ",\n\t    ");
108        Fi(tl, 0, "cli))\n");
109        Fi(tl, 0, "\t\treturn(1);\n");
110
111        SkipToken(tl, ';');
112
113        hdl = dlopen(fn, RTLD_NOW | RTLD_LOCAL);
114        if (hdl == NULL) {
115                VSB_printf(tl->sb, "Could not load module %.*s\n\t%s\n\t%s\n",
116                    PF(mod), fn, dlerror());
117                vcc_ErrWhere(tl, mod);
118                return;
119        }
120
121        modname = dlsym(hdl, "Vmod_Name");
122        if (modname == NULL) {
123                VSB_printf(tl->sb, "Could not load module %.*s\n\t%s\n\t%s\n",
124                    PF(mod), fn, "Symbol Vmod_Name not found");
125                vcc_ErrWhere(tl, mod);
126                return;
127        }
128        if (!vcc_IdIs(mod, modname)) {
129                VSB_printf(tl->sb, "Could not load module %.*s\n\t%s\n",
130                    PF(mod), fn);
131                VSB_printf(tl->sb, "\tModule has wrong name: <%s>\n", modname);
132                vcc_ErrWhere(tl, mod);
133                return;
134        }
135
136        abi = dlsym(hdl, "Vmod_Varnish_ABI");
137        if (abi == NULL || strcmp(abi, VMOD_ABI_Version) != 0) {
138                VSB_printf(tl->sb, "Could not load module %.*s\n\t%s\n",
139                    PF(mod), fn);
140                VSB_printf(tl->sb, "\tABI mismatch, expected <%s>, got <%s>\n",
141                           VMOD_ABI_Version, abi);
142                vcc_ErrWhere(tl, mod);
143                return;
144        }
145
146        proto = dlsym(hdl, "Vmod_Proto");
147        if (proto == NULL) {
148                VSB_printf(tl->sb, "Could not load module %.*s\n\t%s\n\t%s\n",
149                    PF(mod), fn, "Symbol Vmod_Proto not found");
150                vcc_ErrWhere(tl, mod);
151                return;
152        }
153        spec = dlsym(hdl, "Vmod_Spec");
154        if (spec == NULL) {
155                VSB_printf(tl->sb, "Could not load module %.*s\n\t%s\n\t%s\n",
156                    PF(mod), fn, "Symbol Vmod_Spec not found");
157                vcc_ErrWhere(tl, mod);
158                return;
159        }
160        Fh(tl, 0, "static struct vmod_priv vmod_priv_%.*s;\n", PF(mod));
161        for (; *spec != NULL; spec++) {
162                p = *spec;
163                if (!strcmp(p, "INIT")) {
164                        p += strlen(p) + 1;
165                        Fi(tl, 0, "\t%s(&vmod_priv_%.*s, &VCL_conf);\n", p, PF(mod));
166                } else {
167                        sym = VCC_AddSymbolStr(tl, p, SYM_FUNC);
168                        ERRCHK(tl);
169                        AN(sym);
170                        sym->eval = vcc_Eval_Func;
171                        p += strlen(p) + 1;
172                        sym->cfunc = p;
173                        p += strlen(p) + 1;
174                        sym->args = p;
175
176                        /* Functions which return VOID are procedures */
177                        if (!memcmp(p, "VOID\0", 5))
178                                sym->kind = SYM_PROC;
179                }
180        }
181        Fh(tl, 0, "\n%s\n", proto);
182
183        /* XXX: zero the function pointer structure ?*/
184        Ff(tl, 0, "\tvmod_priv_fini(&vmod_priv_%.*s);\n", PF(mod));
185        Ff(tl, 0, "\tVRT_Vmod_Fini(&VGC_vmod_%.*s);\n", PF(mod));
186}
Note: See TracBrowser for help on using the repository browser.