perl 5.0 alpha 8
[p5sagit/p5-mst-13.2.git] / dl.c
CommitLineData
8990e307 1#include <dlfcn.h>
2
3#include "EXTERN.h"
4#include "perl.h"
5#include "XSUB.h"
6
7static int
2304df62 8XS_DynamicLoader_bootstrap(ix, ax, items)
8990e307 9register int ix;
2304df62 10register int ax;
8990e307 11register 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
45int
46boot_DynamicLoader(ix,sp,items)
47int ix;
48int sp;
49int items;
50{
51 char* file = __FILE__;
52
53 newXSUB("DynamicLoader::bootstrap", 0, XS_DynamicLoader_bootstrap, file);
54}