perl 5.0 alpha 6
[perl.git] / dl.c
1 #include <dlfcn.h>
2
3 #include "EXTERN.h"
4 #include "perl.h"
5 #include "XSUB.h"
6
7 static int
8 XS_DynamicLoader_bootstrap(ix, sp, items)
9 register int ix;
10 register int sp;
11 register int items;
12 {
13     if (items < 1 || items > 1) {
14         croak("Usage: DynamicLoader::bootstrap(package)");
15     }
16     {
17         char*   package = SvPV(ST(1),na);
18         void* obj = 0;
19         int (*bootproc)();
20         char tmpbuf[1024];
21         char tmpbuf2[128];
22         AV *av = GvAVn(incgv);
23         I32 i;
24
25         for (i = 0; i <= AvFILL(av); i++) {
26             (void)sprintf(tmpbuf, "%s/auto/%s/%s.so",
27                 SvPVx(*av_fetch(av, i, TRUE), na), package, package);
28             if (obj = dlopen(tmpbuf,1))
29                 break;
30         }
31         if (!obj)
32             croak("Can't find loadable object for package %s in @INC", package);
33
34         sprintf(tmpbuf2, "boot_%s", package);
35         bootproc = (int (*)())dlsym(obj, tmpbuf2);
36         if (!bootproc)
37             croak("Shared object %s contains no %s function", tmpbuf, tmpbuf2);
38         bootproc();
39
40         ST(0) = sv_mortalcopy(&sv_yes);
41     }
42     return sp;
43 }
44
45 int
46 boot_DynamicLoader(ix,sp,items)
47 int ix;
48 int sp;
49 int items;
50 {
51     char* file = __FILE__;
52
53     newXSUB("DynamicLoader::bootstrap", 0, XS_DynamicLoader_bootstrap, file);
54 }