Commit | Line | Data |
8990e307 |
1 | #include <dlfcn.h> |
2 | |
3 | #include "EXTERN.h" |
4 | #include "perl.h" |
5 | #include "XSUB.h" |
6 | |
7 | static int |
2304df62 |
8 | XS_DynamicLoader_bootstrap(ix, ax, items) |
8990e307 |
9 | register int ix; |
2304df62 |
10 | register int ax; |
8990e307 |
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 | } |
2304df62 |
42 | return ax; |
8990e307 |
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 | } |