-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathDL.xs
83 lines (78 loc) · 1.49 KB
/
DL.xs
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
MODULE = FFI::Platypus PACKAGE = FFI::Platypus::DL
BOOT:
{
HV *stash;
stash = gv_stashpv("FFI::Platypus::DL", TRUE);
#ifdef RTLD_LAZY
newCONSTSUB(stash, "RTLD_PLATYPUS_DEFAULT", newSViv(RTLD_LAZY));
newCONSTSUB(stash, "RTLD_LAZY", newSViv(RTLD_LAZY));
#else
newCONSTSUB(stash, "RTLD_PLATYPUS_DEFAULT", newSViv(0));
#endif
#ifdef RTLD_NOW
newCONSTSUB(stash, "RTLD_NOW", newSViv(RTLD_NOW));
#endif
#ifdef RTLD_GLOBAL
newCONSTSUB(stash, "RTLD_GLOBAL", newSViv(RTLD_GLOBAL));
#endif
#ifdef RTLD_LOCAL
newCONSTSUB(stash, "RTLD_LOCAL", newSViv(RTLD_LOCAL));
#endif
#ifdef RTLD_NODELETE
newCONSTSUB(stash, "RTLD_NODELETE", newSViv(RTLD_NODELETE));
#endif
#ifdef RTLD_NOLOAD
newCONSTSUB(stash, "RTLD_NOLOAD", newSViv(RTLD_NOLOAD));
#endif
#ifdef RTLD_DEEPBIND
newCONSTSUB(stash, "RTLD_DEEPBIND", newSViv(RTLD_DEEPBIND));
#endif
}
void *
dlopen(filename, flags);
ffi_pl_string filename
int flags
INIT:
void *ptr;
CODE:
ptr = dlopen(filename, flags);
if(ptr == NULL)
{
XSRETURN_EMPTY;
}
else
{
RETVAL = ptr;
}
OUTPUT:
RETVAL
const char *
dlerror();
void *
dlsym(handle, symbol);
void *handle
const char *symbol
INIT:
void *ptr;
CODE:
ptr = dlsym(handle, symbol);
if(ptr == NULL)
{
XSRETURN_EMPTY;
}
else
{
RETVAL = ptr;
}
OUTPUT:
RETVAL
int
dlclose(handle);
void *handle
CODE:
if(!PL_dirty)
RETVAL = dlclose(handle);
else
RETVAL = 0;
OUTPUT:
RETVAL