source: lib/libvcl/vcc_vmod.c @ 8aa1d8

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

Eliminate nested <*.h> includes from include/*

Sort #includes according to rules which are for me to know and you
to guess.

  • 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 <dlfcn.h>
32#include <stdio.h>
33#include <string.h>
34
35#include "vcc_compile.h"
36
37#include "vmod_abi.h"
38
39void
40vcc_ParseImport(struct vcc *tl)
41{
42        void *hdl;
43        char fn[1024];
44        struct token *mod, *t1;
45        const char *modname;
46        const char *proto;
47        const char *abi;
48        const char **spec;
49        struct symbol *sym;
50        const struct symbol *osym;
51        const char *p;
52        // int *modlen;
53
54        t1 = tl->t;
55        SkipToken(tl, ID);              /* "import" */
56
57        ExpectErr(tl, ID);
58        mod = tl->t;
59
60        vcc_NextToken(tl);
61
62        osym = VCC_FindSymbol(tl, mod, SYM_NONE);
63        if (osym != NULL && osym->kind != SYM_VMOD) {
64                VSB_printf(tl->sb, "Module %.*s conflics with other symbol.\n",
65                    PF(mod));
66                vcc_ErrWhere2(tl, t1, tl->t);
67                return;
68        }
69        if (osym != NULL) {
70                VSB_printf(tl->sb, "Module %.*s already imported.\n",
71                    PF(mod));
72                vcc_ErrWhere2(tl, t1, tl->t);
73                VSB_printf(tl->sb, "Previous import was here:\n");
74                vcc_ErrWhere2(tl, osym->def_b, osym->def_e);
75                return;
76        }
77
78        bprintf(fn, "%.*s", PF(mod));
79        sym = VCC_AddSymbolStr(tl, fn, SYM_VMOD);
80        ERRCHK(tl);
81        AN(sym);
82        sym->def_b = t1;
83        sym->def_e = tl->t;
84
85        if (tl->t->tok == ID) {
86                if (!vcc_IdIs(tl->t, "from")) {
87                        VSB_printf(tl->sb, "Expected 'from path...' at ");
88                        vcc_ErrToken(tl, tl->t);
89                        vcc_ErrWhere(tl, tl->t);
90                        return;
91                }
92                vcc_NextToken(tl);
93                ExpectErr(tl, CSTR);
94                bprintf(fn, "%s", tl->t->dec);
95                vcc_NextToken(tl);
96        } else {
97                bprintf(fn, "%s/libvmod_%.*s.so", tl->vmod_dir, PF(mod));
98        }
99
100        Fh(tl, 0, "static void *VGC_vmod_%.*s;\n", PF(mod));
101
102        Fi(tl, 0, "\tif (VRT_Vmod_Init(&VGC_vmod_%.*s,\n", PF(mod));
103        Fi(tl, 0, "\t    &Vmod_Func_%.*s,\n", PF(mod));
104        Fi(tl, 0, "\t    sizeof(Vmod_Func_%.*s),\n", PF(mod));
105        Fi(tl, 0, "\t    \"%.*s\",\n", PF(mod));
106        Fi(tl, 0, "\t    ");
107        EncString(tl->fi, fn, NULL, 0);
108        Fi(tl, 0, ",\n\t    ");
109        Fi(tl, 0, "cli))\n");
110        Fi(tl, 0, "\t\treturn(1);\n");
111
112        SkipToken(tl, ';');
113
114        hdl = dlopen(fn, RTLD_NOW | RTLD_LOCAL);
115        if (hdl == NULL) {
116                VSB_printf(tl->sb, "Could not load module %.*s\n\t%s\n\t%s\n",
117                    PF(mod), fn, dlerror());
118                vcc_ErrWhere(tl, mod);
119                return;
120        }
121
122        modname = dlsym(hdl, "Vmod_Name");
123        if (modname == NULL) {
124                VSB_printf(tl->sb, "Could not load module %.*s\n\t%s\n\t%s\n",
125                    PF(mod), fn, "Symbol Vmod_Name not found");
126                vcc_ErrWhere(tl, mod);
127                return;
128        }
129        if (!vcc_IdIs(mod, modname)) {
130                VSB_printf(tl->sb, "Could not load module %.*s\n\t%s\n",
131                    PF(mod), fn);
132                VSB_printf(tl->sb, "\tModule has wrong name: <%s>\n", modname);
133                vcc_ErrWhere(tl, mod);
134                return;
135        }
136
137        abi = dlsym(hdl, "Vmod_Varnish_ABI");
138        if (abi == NULL || strcmp(abi, VMOD_ABI_Version) != 0) {
139                VSB_printf(tl->sb, "Could not load module %.*s\n\t%s\n",
140                    PF(mod), fn);
141                VSB_printf(tl->sb, "\tABI mismatch, expected <%s>, got <%s>\n",
142                           VMOD_ABI_Version, abi);
143                vcc_ErrWhere(tl, mod);
144                return;
145        }
146
147        proto = dlsym(hdl, "Vmod_Proto");
148        if (proto == NULL) {
149                VSB_printf(tl->sb, "Could not load module %.*s\n\t%s\n\t%s\n",
150                    PF(mod), fn, "Symbol Vmod_Proto not found");
151                vcc_ErrWhere(tl, mod);
152                return;
153        }
154        spec = dlsym(hdl, "Vmod_Spec");
155        if (spec == NULL) {
156                VSB_printf(tl->sb, "Could not load module %.*s\n\t%s\n\t%s\n",
157                    PF(mod), fn, "Symbol Vmod_Spec not found");
158                vcc_ErrWhere(tl, mod);
159                return;
160        }
161        Fh(tl, 0, "static struct vmod_priv vmod_priv_%.*s;\n", PF(mod));
162        for (; *spec != NULL; spec++) {
163                p = *spec;
164                if (!strcmp(p, "INIT")) {
165                        p += strlen(p) + 1;
166                        Fi(tl, 0, "\t%s(&vmod_priv_%.*s, &VCL_conf);\n", p, PF(mod));
167                } else {
168                        sym = VCC_AddSymbolStr(tl, p, SYM_FUNC);
169                        ERRCHK(tl);
170                        AN(sym);
171                        sym->eval = vcc_Eval_Func;
172                        p += strlen(p) + 1;
173                        sym->cfunc = p;
174                        p += strlen(p) + 1;
175                        sym->args = p;
176
177                        /* Functions which return VOID are procedures */
178                        if (!memcmp(p, "VOID\0", 5))
179                                sym->kind = SYM_PROC;
180                }
181        }
182        Fh(tl, 0, "\n%s\n", proto);
183
184        /* XXX: zero the function pointer structure ?*/
185        Ff(tl, 0, "\tvmod_priv_fini(&vmod_priv_%.*s);\n", PF(mod));
186        Ff(tl, 0, "\tVRT_Vmod_Fini(&VGC_vmod_%.*s);\n", PF(mod));
187}
Note: See TracBrowser for help on using the repository browser.