1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
/* dl_next.c
Author: tom@smart.bo.open.de (Thomas Neumann).
Based on dl_sunos.c
*/
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include <mach-o/rld.h>
#include <streams/streams.h>
static int
XS_DynamicLoader_bootstrap(ix, ax, items)
register int ix;
register int ax;
register int items;
{
if (items < 1 || items > 1) {
croak("Usage: DynamicLoader::bootstrap(package)");
}
{
char* package = SvPV(ST(1),na);
int rld_success;
NXStream *nxerr = NXOpenFile(fileno(stderr), NX_READONLY);
int (*bootproc)();
char tmpbuf[1024];
char tmpbuf2[128];
AV *av = GvAVn(incgv);
I32 i;
for (i = 0; i <= AvFILL(av); i++) {
char *p[2];
p[0] = tmpbuf;
p[1] = 0;
sprintf(tmpbuf, "%s/auto/%s/%s.so",
SvPVx(*av_fetch(av, i, TRUE), na), package, package);
if (rld_success = rld_load(nxerr, (struct mach_header **)0, p,
(const char *)0))
{
break;
}
}
if (!rld_success) {
NXClose(nxerr);
croak("Can't find loadable object for package %s in @INC", package);
}
sprintf(tmpbuf2, "_boot_%s", package);
if (!rld_lookup(nxerr, tmpbuf2, (unsigned long *)&bootproc)) {
NXClose(nxerr);
croak("Shared object %s contains no %s function", tmpbuf, tmpbuf2);
}
NXClose(nxerr);
(*bootproc)();
ST(0) = sv_mortalcopy(&sv_yes);
}
return ax;
}
int
boot_DynamicLoader(ix,sp,items)
int ix;
int sp;
int items;
{
char* file = __FILE__;
newXSUB("DynamicLoader::bootstrap", 0, XS_DynamicLoader_bootstrap, file);
}
|